diff --git a/.claude/settings.local.json b/.claude/settings.local.json
index 6a1c932..b56bf65 100644
--- a/.claude/settings.local.json
+++ b/.claude/settings.local.json
@@ -48,7 +48,50 @@
"Bash(node \"T:/CC-Projekte/.claude/gsd-core/bin/gsd-tools.cjs\" query config-get workflow.discuss_mode)",
"Bash(node \"T:/CC-Projekte/.claude/gsd-core/bin/gsd-tools.cjs\" query phase.mvp-mode 1 --pick active)",
"Bash(node \"T:/CC-Projekte/.claude/gsd-core/bin/gsd-tools.cjs\" query state.advance-plan --phase 1 --plan \"01-04\")",
- "Bash(node \"T:/CC-Projekte/.claude/gsd-core/bin/gsd-tools.cjs\" query commit \"chore\\(01\\): phase 1 complete\" --files \".planning/STATE.md\" \".planning/ROADMAP.md\" \".planning/phases/01-foundation/01-04-SUMMARY.md\" \".planning/phases/01-foundation/SUMMARY.md\")"
+ "Bash(node \"T:/CC-Projekte/.claude/gsd-core/bin/gsd-tools.cjs\" query commit \"chore\\(01\\): phase 1 complete\" --files \".planning/STATE.md\" \".planning/ROADMAP.md\" \".planning/phases/01-foundation/01-04-SUMMARY.md\" \".planning/phases/01-foundation/SUMMARY.md\")",
+ "Bash(node \"T:/CC-Projekte/.claude/gsd-core/bin/gsd-tools.cjs\" query init.plan-phase 2)",
+ "Bash(node \"T:/CC-Projekte/.claude/gsd-core/bin/gsd-tools.cjs\" query phase.mvp-mode 2 --pick active)",
+ "Bash(node \"T:/CC-Projekte/.claude/gsd-core/bin/gsd-tools.cjs\" query config-set workflow._auto_chain_active false)",
+ "Bash(node \"T:/CC-Projekte/.claude/gsd-core/bin/gsd-tools.cjs\" query roadmap.get-phase 2 --pick section)",
+ "Bash(command -v ctx7)",
+ "WebSearch",
+ "Bash(python -c \"from slopcheck import cli; cli.main\\(\\)\" -- install react-intersection-observer --json)",
+ "Bash(python -m slopcheck.cli install react-intersection-observer --json)",
+ "Bash(python *)",
+ "Bash(npm view *)",
+ "Bash(sed -i 's/^## Open Questions$/## Open Questions \\(RESOLVED\\)/' .planning/phases/02-content-core/02-RESEARCH.md)",
+ "Bash(node \"T:/CC-Projekte/.claude/gsd-core/bin/gsd-tools.cjs\" query state.planned-phase --phase 2 --name \"Content Core\" --plans 6)",
+ "Bash(node \"T:/CC-Projekte/.claude/gsd-core/bin/gsd-tools.cjs\" query roadmap.annotate-dependencies 2)",
+ "Bash(node \"T:/CC-Projekte/.claude/gsd-core/bin/gsd-tools.cjs\" query commit \"docs\\(02\\): create phase plan \\(6 plans\\)\" --files \".planning/phases/02-content-core/02-01-PLAN.md\" \".planning/phases/02-content-core/02-02-PLAN.md\" \".planning/phases/02-content-core/02-03-PLAN.md\" \".planning/phases/02-content-core/02-04-PLAN.md\" \".planning/phases/02-content-core/02-05-PLAN.md\" \".planning/phases/02-content-core/02-06-PLAN.md\" \".planning/phases/02-content-core/02-RESEARCH.md\" \".planning/STATE.md\" \".planning/ROADMAP.md\")",
+ "Bash(node \"T:/CC-Projekte/.claude/gsd-core/bin/gsd-tools.cjs\" gap-analysis --phase-dir \".planning/phases/02-content-core\" --phase-req-ids \"PHOTO-01, PHOTO-02, PHOTO-03, PHOTO-04, STORY-01, STORY-02, STORY-03, MILE-01, MILE-02, SOCL-01, SOCL-02, SOCL-03, FEED-01, SAFE-01, SAFE-02\")",
+ "Bash(node \"T:/CC-Projekte/.claude/gsd-core/bin/gsd-tools.cjs\" query state.advance-plan --phase 2 --plan \"02-02\")",
+ "Bash(node \"T:/CC-Projekte/.claude/gsd-core/bin/gsd-tools.cjs\" query state.advance-plan --phase 2 --plan \"02-03\")",
+ "Bash(node \"T:/CC-Projekte/.claude/gsd-core/bin/gsd-tools.cjs\" query state.advance-plan --phase 2 --plan \"02-04\")",
+ "Bash(git push *)",
+ "Bash(New-Item -ItemType Directory -Force \"T:\\\\CC-Projekte\\\\OnlyPets\\\\.planning\\\\phases\\\\03-engagement-discovery\")",
+ "Bash(Out-Null)",
+ "Bash(Write-Output \"created\")",
+ "PowerShell(New-Item *)",
+ "Bash(npm run *)",
+ "Bash(ping -n 4 127.0.0.1)",
+ "Bash(npm list *)",
+ "Bash(curl -s http://localhost:3000 -o /dev/null -w \"%{http_code}\")",
+ "PowerShell(taskkill *)",
+ "PowerShell(npm run *)",
+ "Bash(findstr /i \"phase health\")",
+ "Bash(findstr /i \"cuid\" package.json)",
+ "Bash(node -e \"const { prisma } = require\\('./src/lib/prisma'\\); console.log\\('weightLog:', typeof prisma.weightLog\\); console.log\\('vetVisit:', typeof prisma.vetVisit\\); console.log\\('vaccine:', typeof prisma.vaccine\\);\")",
+ "Bash(node -e \"const { PrismaClient } = require\\('@prisma/client'\\); const p = new PrismaClient\\(\\); console.log\\('weightLog:', typeof p.weightLog\\); console.log\\('vetVisit:', typeof p.vetVisit\\); console.log\\('vaccine:', typeof p.vaccine\\); console.log\\('healthCard:', typeof p.healthCard\\);\")",
+ "Bash(npx tsx -e ' *)",
+ "Bash(git remote *)",
+ "Read(//t/cc-projekte/onlypets/**)",
+ "Bash(find src *)",
+ "Bash(grep -v \"useTranslations\\\\|t\\(\\\\|import\\\\|//\\\\|className\\\\|aria-\\\\|placeholder\\\\|type=\\\\|href=\\\\|key=\\\\|data-\")",
+ "Bash(grep -rn --include=\"*.tsx\" -E \"^\\\\s+[A-Z][a-z]|No [a-z]|yet$|No [A-Z]\" src/components src/app)",
+ "Bash(grep -v \"useTranslations\\\\|t\\(\\\\|import\\\\|//\\\\|className\\\\|interface\\\\|type\\\\|const\\\\|export\\\\|function\\\\|return\\\\|<\\\\|}\\\\|{\")",
+ "Bash(grep -v \"//\\\\|import\\\\|className\\\\|href\\\\|aria\\\\|data-\\\\|type=\\\\|value=\\\\|admin\\\\|legal\\\\|impressum\\\\|datenschutz\\\\|nutzung\\\\|health-card\\\\|join\\\\|banned\\\\|auth\\\\|p/\\\\[\")",
+ "Bash(grep -v \"^\\\\s*//\\\\|^import\")",
+ "Bash(grep -v \"//\\\\|import\\\\|className\\\\|interface\\\\|type\\\\|const\\\\|export\\\\|href\\\\|aria-\\\\|data-\\\\|key=\\\\|useTranslations\\\\|admin\\\\|auth\\\\|legal\\\\|health-card\\\\|p/\\\\[\")"
]
}
}
diff --git a/DEBUG-List.md b/DEBUG-List.md
index 3dfa728..5d40ac3 100644
--- a/DEBUG-List.md
+++ b/DEBUG-List.md
@@ -1,14 +1,30 @@
Debug:
-Health - Share Card - Downloadbar machen als PDF Ansicht, mit Profil Foto und allen Health Daten übersichtlich aufgegliedert.
+\-Die Suchen seite ist noch nicht auf Deutsch übersetzt.
-jeweils mit Farblichen Trennern oder Rahmen. So wäre es möglich bei einem Arztwechsel, gleich alle Daten mitnehmen zu können.
+\-Die Erwähnfunktion mittels @ ist impelmentiert, aber es fehlt die Benachrichtung das man Erwähnt wurde ! Zudem ist die Auswahl nach dem tippen @ schlecht designed man kann gerade so den Avatar erkennen aber nicht den namen in der aufploppenden suche, bitte um FIX !
-Oder für den Notfall ausgedruckt dabei zu haben.
+\-Messages ist noch nicht auf Deutsch übersetzt.
+
+\-Kommentar Update; wenn man einen Kommentar postet, muss dieser zwingend sofort im Kommentar-Verlauf sichtbar werden (Optische Bestätigung das der Kommentar angekommen ist für den Nutzer), es muss sich als Nutzer Live anfühlen auch wenn der Server noch am arbeiten ist.
+
+\-Benachrichtung wenn man "Paw-Back this post" nutzt für den Original-User des Posts.
+
+\-Die Mobil Ansicht ist noch nicht ausgereift, das Menü ist teilweise nicht mehr erkennbar im unteren Segemet ( Startseite, Entdecken, +, Benachrichtigungen, Profil).
+
+\-Mobilansicht - Add Story Button ist sehr linksbündig, keine Aufteilung vorhanden.
+
+\-Mobilansicht - Kein PawFeed Logo sichtbar, soll nur auf der Startseite erscheinen beim scrollen verschwinden.
+
+\-Mobilansicht - wenn man bis man hin und her scrollt soll man bei langem hochscrollen einen refresh auslösen.
+
+\-Mobilansicht - Impressum/Datenschutz in das Profil rein legen, damit man es erreichen kann.
+
+\-Mobilansicht - Nachrichten nicht aufrufbar weil kein Button vorhanden. kann gerne als Mail-Icon mitscrollend oben rechts in die ecke damit es immer erreichbar ist.
-Health - Share Card - Der Link wird nicht generiert, hier müsste ein Unique link erstellt werden, mit einem Verfallsdatum in der regel sollten 14 Tage ausreichen, aber man soll sich das selbst einstellen können, 7,13,30,60,90 Tage zur Auswahl.
+\-User Delete Funktion, für den Unwahrscheinlichen fall ein User möchte sein Konto löschen wird ein Workflow benötigt, der nach einer Bestätigung mittels Tiernamen Eingabe (Auswahl eins von möglichen) den Kompletten Account löscht, sowie alle Hochgeladen Bilder/Videos und erzeugten Posts, Rückstandslos.
diff --git a/messages/de.json b/messages/de.json
index 8236d57..9e7ab80 100644
--- a/messages/de.json
+++ b/messages/de.json
@@ -133,6 +133,7 @@
"empty": "Noch keine Kommentare — sei der Erste!",
"placeholder": "Kommentar hinzufügen…",
"post": "Senden",
+ "sending": "Wird gesendet…",
"postError": "Kommentar konnte nicht gepostet werden. Bitte versuche es erneut.",
"deleteError": "Kommentar konnte nicht gelöscht werden. Bitte versuche es erneut.",
"countSingular": "1 Kommentar",
diff --git a/messages/en.json b/messages/en.json
index c00dab8..03a3a30 100644
--- a/messages/en.json
+++ b/messages/en.json
@@ -133,6 +133,7 @@
"empty": "No comments yet — be the first!",
"placeholder": "Add a comment…",
"post": "Post",
+ "sending": "Sending…",
"postError": "Couldn't post comment. Please try again.",
"deleteError": "Couldn't delete comment. Please try again.",
"countSingular": "1 comment",
diff --git a/src/app/(app)/explore/page.tsx b/src/app/(app)/explore/page.tsx
index e87cf9c..0872bf3 100644
--- a/src/app/(app)/explore/page.tsx
+++ b/src/app/(app)/explore/page.tsx
@@ -10,8 +10,7 @@ import { useActivePet } from "@/context/ActivePetContext";
import { ExploreCard } from "@/components/explore/ExploreCard";
import { Tabs, TabsList, TabsTrigger } from "@/components/ui/tabs";
import { Badge } from "@/components/ui/badge";
-import { Dialog, DialogContent } from "@/components/ui/dialog";
-import { PostCard } from "@/components/feed/PostCard";
+import { PostDetailDialog } from "@/components/feed/PostDetailDialog";
import { getMediaUrl } from "@/lib/media-url";
import type { PostCardPost } from "@/components/feed/PostCard";
import {
@@ -184,26 +183,13 @@ export default function ExplorePage() {
>
))}
- {/* Post detail dialog */}
-
+ onClose={() => setSelectedPost(null)}
+ onDeleted={() => setSelectedPost(null)}
+ />
);
}
diff --git a/src/app/favicon.ico b/src/app/favicon.ico
index 718d6fe..7fe8ef8 100644
Binary files a/src/app/favicon.ico and b/src/app/favicon.ico differ
diff --git a/src/components/feed/PostCard.tsx b/src/components/feed/PostCard.tsx
index ebb22f4..af55f49 100644
--- a/src/components/feed/PostCard.tsx
+++ b/src/components/feed/PostCard.tsx
@@ -43,7 +43,7 @@ import { MilestoneCard } from "@/components/feed/MilestoneCard";
import { VideoCard } from "@/components/video/VideoCard";
import { PawButton } from "@/components/feed/PawButton";
import { PawBackButton } from "@/components/feed/PawBackButton";
-import { CommentSheet } from "@/components/feed/CommentSheet";
+import { PostDetailDialog } from "@/components/feed/PostDetailDialog";
import { RepostCard } from "@/components/feed/RepostCard";
import { BlockDialog } from "@/components/safety/BlockDialog";
import { ReportSheet } from "@/components/safety/ReportSheet";
@@ -160,8 +160,8 @@ export function PostCard({ post, onDeleted, variant = "feed" }: PostCardProps) {
// Block dialog state
const [showBlockDialog, setShowBlockDialog] = useState(false);
- // Comment sheet state
- const [showCommentSheet, setShowCommentSheet] = useState(false);
+ // Detail dialog (replaces comment sheet)
+ const [showDetailDialog, setShowDetailDialog] = useState(false);
// Ownership: active pet's own post vs another pet's post
const isOwnPost = activePetId === pet.id;
@@ -335,7 +335,8 @@ export function PostCard({ post, onDeleted, variant = "feed" }: PostCardProps) {
setShowDetailDialog(true)}
/>
))}
@@ -367,14 +368,13 @@ export function PostCard({ post, onDeleted, variant = "feed" }: PostCardProps) {
) : (
/* Single image */
-