From 67f0e12a215836be7be29b1b2e12c984052ec051 Mon Sep 17 00:00:00 2001 From: joachimhummel <47454583-joachimhummel@users.noreply.replit.com> Date: Fri, 15 May 2026 15:27:21 +0000 Subject: [PATCH] Create a professional portfolio website for Joachim Hummel Implement a React-Vite portfolio website for Joachim Hummel, featuring sections for bio, competencies, projects, and contact information. Replit-Commit-Author: Agent Replit-Commit-Session-Id: 6f3329ae-2dcc-46cc-bf2e-f58b7a5fa805 Replit-Commit-Checkpoint-Type: full_checkpoint Replit-Commit-Event-Id: 93e1822d-6468-4db0-9e37-4f1f19334ba5 Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/e678fe28-87ab-4437-945b-7a15e872a292/6f3329ae-2dcc-46cc-bf2e-f58b7a5fa805/MG2yXVH Replit-Helium-Checkpoint-Created: true --- .replit | 12 + .../.replit-artifact/artifact.toml | 31 + artifacts/joachim-portfolio/components.json | 20 + artifacts/joachim-portfolio/index.html | 24 + artifacts/joachim-portfolio/package.json | 77 ++ .../joachim-portfolio/public/favicon.svg | 3 + .../joachim-portfolio/public/opengraph.jpg | Bin 0 -> 50059 bytes artifacts/joachim-portfolio/public/robots.txt | 2 + artifacts/joachim-portfolio/src/App.tsx | 32 + .../joachim-portfolio/src/components/bio.tsx | 31 + .../src/components/competencies.tsx | 81 ++ .../src/components/contact.tsx | 42 + .../joachim-portfolio/src/components/hero.tsx | 61 ++ .../src/components/navbar.tsx | 56 ++ .../src/components/projects.tsx | 82 ++ .../src/components/strengths.tsx | 64 ++ .../src/components/ui/accordion.tsx | 55 ++ .../src/components/ui/alert-dialog.tsx | 139 ++++ .../src/components/ui/alert.tsx | 59 ++ .../src/components/ui/aspect-ratio.tsx | 5 + .../src/components/ui/avatar.tsx | 50 ++ .../src/components/ui/badge.tsx | 43 ++ .../src/components/ui/breadcrumb.tsx | 115 +++ .../src/components/ui/button-group.tsx | 83 ++ .../src/components/ui/button.tsx | 65 ++ .../src/components/ui/calendar.tsx | 213 +++++ .../src/components/ui/card.tsx | 76 ++ .../src/components/ui/carousel.tsx | 260 +++++++ .../src/components/ui/chart.tsx | 367 +++++++++ .../src/components/ui/checkbox.tsx | 28 + .../src/components/ui/collapsible.tsx | 11 + .../src/components/ui/command.tsx | 153 ++++ .../src/components/ui/context-menu.tsx | 198 +++++ .../src/components/ui/dialog.tsx | 120 +++ .../src/components/ui/drawer.tsx | 116 +++ .../src/components/ui/dropdown-menu.tsx | 201 +++++ .../src/components/ui/empty.tsx | 104 +++ .../src/components/ui/field.tsx | 244 ++++++ .../src/components/ui/form.tsx | 176 +++++ .../src/components/ui/hover-card.tsx | 27 + .../src/components/ui/input-group.tsx | 168 ++++ .../src/components/ui/input-otp.tsx | 69 ++ .../src/components/ui/input.tsx | 22 + .../src/components/ui/item.tsx | 193 +++++ .../src/components/ui/kbd.tsx | 28 + .../src/components/ui/label.tsx | 26 + .../src/components/ui/menubar.tsx | 254 ++++++ .../src/components/ui/navigation-menu.tsx | 128 +++ .../src/components/ui/pagination.tsx | 117 +++ .../src/components/ui/popover.tsx | 31 + .../src/components/ui/progress.tsx | 28 + .../src/components/ui/radio-group.tsx | 42 + .../src/components/ui/resizable.tsx | 45 ++ .../src/components/ui/scroll-area.tsx | 46 ++ .../src/components/ui/select.tsx | 159 ++++ .../src/components/ui/separator.tsx | 29 + .../src/components/ui/sheet.tsx | 140 ++++ .../src/components/ui/sidebar.tsx | 727 ++++++++++++++++++ .../src/components/ui/skeleton.tsx | 15 + .../src/components/ui/slider.tsx | 26 + .../src/components/ui/sonner.tsx | 31 + .../src/components/ui/spinner.tsx | 16 + .../src/components/ui/switch.tsx | 27 + .../src/components/ui/table.tsx | 120 +++ .../src/components/ui/tabs.tsx | 53 ++ .../src/components/ui/textarea.tsx | 22 + .../src/components/ui/toast.tsx | 127 +++ .../src/components/ui/toaster.tsx | 33 + .../src/components/ui/toggle-group.tsx | 61 ++ .../src/components/ui/toggle.tsx | 43 ++ .../src/components/ui/tooltip.tsx | 32 + .../src/hooks/use-mobile.tsx | 19 + .../joachim-portfolio/src/hooks/use-toast.ts | 191 +++++ artifacts/joachim-portfolio/src/index.css | 105 +++ artifacts/joachim-portfolio/src/lib/utils.ts | 6 + artifacts/joachim-portfolio/src/main.tsx | 5 + .../joachim-portfolio/src/pages/home.tsx | 48 ++ .../joachim-portfolio/src/pages/not-found.tsx | 21 + artifacts/joachim-portfolio/tsconfig.json | 22 + artifacts/joachim-portfolio/vite.config.ts | 75 ++ ...elles-Profil-das-deine-F_1778858617073.txt | 231 ++++++ pnpm-lock.yaml | 266 +++++++ 82 files changed, 7373 insertions(+) create mode 100644 artifacts/joachim-portfolio/.replit-artifact/artifact.toml create mode 100644 artifacts/joachim-portfolio/components.json create mode 100644 artifacts/joachim-portfolio/index.html create mode 100644 artifacts/joachim-portfolio/package.json create mode 100644 artifacts/joachim-portfolio/public/favicon.svg create mode 100644 artifacts/joachim-portfolio/public/opengraph.jpg create mode 100644 artifacts/joachim-portfolio/public/robots.txt create mode 100644 artifacts/joachim-portfolio/src/App.tsx create mode 100644 artifacts/joachim-portfolio/src/components/bio.tsx create mode 100644 artifacts/joachim-portfolio/src/components/competencies.tsx create mode 100644 artifacts/joachim-portfolio/src/components/contact.tsx create mode 100644 artifacts/joachim-portfolio/src/components/hero.tsx create mode 100644 artifacts/joachim-portfolio/src/components/navbar.tsx create mode 100644 artifacts/joachim-portfolio/src/components/projects.tsx create mode 100644 artifacts/joachim-portfolio/src/components/strengths.tsx create mode 100644 artifacts/joachim-portfolio/src/components/ui/accordion.tsx create mode 100644 artifacts/joachim-portfolio/src/components/ui/alert-dialog.tsx create mode 100644 artifacts/joachim-portfolio/src/components/ui/alert.tsx create mode 100644 artifacts/joachim-portfolio/src/components/ui/aspect-ratio.tsx create mode 100644 artifacts/joachim-portfolio/src/components/ui/avatar.tsx create mode 100644 artifacts/joachim-portfolio/src/components/ui/badge.tsx create mode 100644 artifacts/joachim-portfolio/src/components/ui/breadcrumb.tsx create mode 100644 artifacts/joachim-portfolio/src/components/ui/button-group.tsx create mode 100644 artifacts/joachim-portfolio/src/components/ui/button.tsx create mode 100644 artifacts/joachim-portfolio/src/components/ui/calendar.tsx create mode 100644 artifacts/joachim-portfolio/src/components/ui/card.tsx create mode 100644 artifacts/joachim-portfolio/src/components/ui/carousel.tsx create mode 100644 artifacts/joachim-portfolio/src/components/ui/chart.tsx create mode 100644 artifacts/joachim-portfolio/src/components/ui/checkbox.tsx create mode 100644 artifacts/joachim-portfolio/src/components/ui/collapsible.tsx create mode 100644 artifacts/joachim-portfolio/src/components/ui/command.tsx create mode 100644 artifacts/joachim-portfolio/src/components/ui/context-menu.tsx create mode 100644 artifacts/joachim-portfolio/src/components/ui/dialog.tsx create mode 100644 artifacts/joachim-portfolio/src/components/ui/drawer.tsx create mode 100644 artifacts/joachim-portfolio/src/components/ui/dropdown-menu.tsx create mode 100644 artifacts/joachim-portfolio/src/components/ui/empty.tsx create mode 100644 artifacts/joachim-portfolio/src/components/ui/field.tsx create mode 100644 artifacts/joachim-portfolio/src/components/ui/form.tsx create mode 100644 artifacts/joachim-portfolio/src/components/ui/hover-card.tsx create mode 100644 artifacts/joachim-portfolio/src/components/ui/input-group.tsx create mode 100644 artifacts/joachim-portfolio/src/components/ui/input-otp.tsx create mode 100644 artifacts/joachim-portfolio/src/components/ui/input.tsx create mode 100644 artifacts/joachim-portfolio/src/components/ui/item.tsx create mode 100644 artifacts/joachim-portfolio/src/components/ui/kbd.tsx create mode 100644 artifacts/joachim-portfolio/src/components/ui/label.tsx create mode 100644 artifacts/joachim-portfolio/src/components/ui/menubar.tsx create mode 100644 artifacts/joachim-portfolio/src/components/ui/navigation-menu.tsx create mode 100644 artifacts/joachim-portfolio/src/components/ui/pagination.tsx create mode 100644 artifacts/joachim-portfolio/src/components/ui/popover.tsx create mode 100644 artifacts/joachim-portfolio/src/components/ui/progress.tsx create mode 100644 artifacts/joachim-portfolio/src/components/ui/radio-group.tsx create mode 100644 artifacts/joachim-portfolio/src/components/ui/resizable.tsx create mode 100644 artifacts/joachim-portfolio/src/components/ui/scroll-area.tsx create mode 100644 artifacts/joachim-portfolio/src/components/ui/select.tsx create mode 100644 artifacts/joachim-portfolio/src/components/ui/separator.tsx create mode 100644 artifacts/joachim-portfolio/src/components/ui/sheet.tsx create mode 100644 artifacts/joachim-portfolio/src/components/ui/sidebar.tsx create mode 100644 artifacts/joachim-portfolio/src/components/ui/skeleton.tsx create mode 100644 artifacts/joachim-portfolio/src/components/ui/slider.tsx create mode 100644 artifacts/joachim-portfolio/src/components/ui/sonner.tsx create mode 100644 artifacts/joachim-portfolio/src/components/ui/spinner.tsx create mode 100644 artifacts/joachim-portfolio/src/components/ui/switch.tsx create mode 100644 artifacts/joachim-portfolio/src/components/ui/table.tsx create mode 100644 artifacts/joachim-portfolio/src/components/ui/tabs.tsx create mode 100644 artifacts/joachim-portfolio/src/components/ui/textarea.tsx create mode 100644 artifacts/joachim-portfolio/src/components/ui/toast.tsx create mode 100644 artifacts/joachim-portfolio/src/components/ui/toaster.tsx create mode 100644 artifacts/joachim-portfolio/src/components/ui/toggle-group.tsx create mode 100644 artifacts/joachim-portfolio/src/components/ui/toggle.tsx create mode 100644 artifacts/joachim-portfolio/src/components/ui/tooltip.tsx create mode 100644 artifacts/joachim-portfolio/src/hooks/use-mobile.tsx create mode 100644 artifacts/joachim-portfolio/src/hooks/use-toast.ts create mode 100644 artifacts/joachim-portfolio/src/index.css create mode 100644 artifacts/joachim-portfolio/src/lib/utils.ts create mode 100644 artifacts/joachim-portfolio/src/main.tsx create mode 100644 artifacts/joachim-portfolio/src/pages/home.tsx create mode 100644 artifacts/joachim-portfolio/src/pages/not-found.tsx create mode 100644 artifacts/joachim-portfolio/tsconfig.json create mode 100644 artifacts/joachim-portfolio/vite.config.ts create mode 100644 attached_assets/Pasted-Joachim-hier-ist-ein-professionelles-Profil-das-deine-F_1778858617073.txt diff --git a/.replit b/.replit index 82bac8f..d9cc22f 100644 --- a/.replit +++ b/.replit @@ -18,3 +18,15 @@ expertMode = true [postMerge] path = "scripts/post-merge.sh" timeoutMs = 20000 + +[[ports]] +localPort = 8080 +externalPort = 8080 + +[[ports]] +localPort = 8081 +externalPort = 80 + +[[ports]] +localPort = 23924 +externalPort = 3000 diff --git a/artifacts/joachim-portfolio/.replit-artifact/artifact.toml b/artifacts/joachim-portfolio/.replit-artifact/artifact.toml new file mode 100644 index 0000000..4803696 --- /dev/null +++ b/artifacts/joachim-portfolio/.replit-artifact/artifact.toml @@ -0,0 +1,31 @@ +kind = "web" +previewPath = "/" +title = "Joachim Hummel – Portfolio" +version = "1.0.0" +id = "artifacts/joachim-portfolio" +router = "path" + +[[integratedSkills]] +name = "react-vite" +version = "1.0.0" + +[[services]] +name = "web" +paths = [ "/" ] +localPort = 23924 + +[services.development] +run = "pnpm --filter @workspace/joachim-portfolio run dev" + +[services.production] +build = [ "pnpm", "--filter", "@workspace/joachim-portfolio", "run", "build" ] +publicDir = "artifacts/joachim-portfolio/dist/public" +serve = "static" + +[[services.production.rewrites]] +from = "/*" +to = "/index.html" + +[services.env] +PORT = "23924" +BASE_PATH = "/" diff --git a/artifacts/joachim-portfolio/components.json b/artifacts/joachim-portfolio/components.json new file mode 100644 index 0000000..3ff62cf --- /dev/null +++ b/artifacts/joachim-portfolio/components.json @@ -0,0 +1,20 @@ +{ + "$schema": "https://ui.shadcn.com/schema.json", + "style": "new-york", + "rsc": false, + "tsx": true, + "tailwind": { + "config": "", + "css": "src/index.css", + "baseColor": "neutral", + "cssVariables": true, + "prefix": "" + }, + "aliases": { + "components": "@/components", + "utils": "@/lib/utils", + "ui": "@/components/ui", + "lib": "@/lib", + "hooks": "@/hooks" + } +} \ No newline at end of file diff --git a/artifacts/joachim-portfolio/index.html b/artifacts/joachim-portfolio/index.html new file mode 100644 index 0000000..3968508 --- /dev/null +++ b/artifacts/joachim-portfolio/index.html @@ -0,0 +1,24 @@ + + + + + + Joachim Hummel – Portfolio + + + + + + + + + + + + + + +
+ + + diff --git a/artifacts/joachim-portfolio/package.json b/artifacts/joachim-portfolio/package.json new file mode 100644 index 0000000..5792331 --- /dev/null +++ b/artifacts/joachim-portfolio/package.json @@ -0,0 +1,77 @@ +{ + "name": "@workspace/joachim-portfolio", + "version": "0.0.0", + "private": true, + "type": "module", + "scripts": { + "dev": "vite --config vite.config.ts --host 0.0.0.0", + "build": "vite build --config vite.config.ts", + "serve": "vite preview --config vite.config.ts --host 0.0.0.0", + "typecheck": "tsc -p tsconfig.json --noEmit" + }, + "devDependencies": { + "@hookform/resolvers": "^3.10.0", + "@radix-ui/react-accordion": "^1.2.4", + "@radix-ui/react-alert-dialog": "^1.1.7", + "@radix-ui/react-aspect-ratio": "^1.1.3", + "@radix-ui/react-avatar": "^1.1.4", + "@radix-ui/react-checkbox": "^1.1.5", + "@radix-ui/react-collapsible": "^1.1.4", + "@radix-ui/react-context-menu": "^2.2.7", + "@radix-ui/react-dialog": "^1.1.7", + "@radix-ui/react-dropdown-menu": "^2.1.7", + "@radix-ui/react-hover-card": "^1.1.7", + "@radix-ui/react-label": "^2.1.3", + "@radix-ui/react-menubar": "^1.1.7", + "@radix-ui/react-navigation-menu": "^1.2.6", + "@radix-ui/react-popover": "^1.1.7", + "@radix-ui/react-progress": "^1.1.3", + "@radix-ui/react-radio-group": "^1.2.4", + "@radix-ui/react-scroll-area": "^1.2.4", + "@radix-ui/react-select": "^2.1.7", + "@radix-ui/react-separator": "^1.1.3", + "@radix-ui/react-slider": "^1.2.4", + "@radix-ui/react-slot": "^1.2.0", + "@radix-ui/react-switch": "^1.1.4", + "@radix-ui/react-tabs": "^1.1.4", + "@radix-ui/react-toast": "^1.2.7", + "@radix-ui/react-toggle": "^1.1.3", + "@radix-ui/react-toggle-group": "^1.1.3", + "@radix-ui/react-tooltip": "^1.2.0", + "@replit/vite-plugin-cartographer": "catalog:", + "@replit/vite-plugin-dev-banner": "catalog:", + "@replit/vite-plugin-runtime-error-modal": "catalog:", + "@tailwindcss/typography": "^0.5.15", + "@tailwindcss/vite": "catalog:", + "@tanstack/react-query": "catalog:", + "@types/node": "catalog:", + "@types/react": "catalog:", + "@types/react-dom": "catalog:", + "@vitejs/plugin-react": "catalog:", + "@workspace/api-client-react": "workspace:*", + "class-variance-authority": "catalog:", + "clsx": "catalog:", + "cmdk": "^1.1.1", + "date-fns": "^3.6.0", + "embla-carousel-react": "^8.6.0", + "framer-motion": "catalog:", + "input-otp": "^1.4.2", + "lucide-react": "catalog:", + "next-themes": "^0.4.6", + "react": "catalog:", + "react-day-picker": "^9.11.1", + "react-dom": "catalog:", + "react-hook-form": "^7.55.0", + "react-icons": "^5.4.0", + "react-resizable-panels": "^2.1.7", + "recharts": "^2.15.2", + "sonner": "^2.0.7", + "tailwind-merge": "catalog:", + "tailwindcss": "catalog:", + "tw-animate-css": "^1.4.0", + "vaul": "^1.1.2", + "vite": "catalog:", + "wouter": "^3.3.5", + "zod": "catalog:" + } +} diff --git a/artifacts/joachim-portfolio/public/favicon.svg b/artifacts/joachim-portfolio/public/favicon.svg new file mode 100644 index 0000000..4373d3c --- /dev/null +++ b/artifacts/joachim-portfolio/public/favicon.svg @@ -0,0 +1,3 @@ + + + diff --git a/artifacts/joachim-portfolio/public/opengraph.jpg b/artifacts/joachim-portfolio/public/opengraph.jpg new file mode 100644 index 0000000000000000000000000000000000000000..8b3611111504b8bc9f38e8d23cdb5cb6b548b212 GIT binary patch literal 50059 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