From d15dd26ebf566ea682d73a4e20ee8a673ef13dcd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc-Andr=C3=A9=20Bombeck?= Date: Sun, 28 Jun 2026 20:29:10 +0200 Subject: [PATCH 1/3] Drop the Coach-hero medical disclaimer The new-chat hero carried a standing self-description line. Remove that instance; the greeting and composer stay. The MedicalDisclaimer component and its insights/labs/medications placements are unchanged. --- src/components/insights/coach-panel/coach-hero.tsx | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/src/components/insights/coach-panel/coach-hero.tsx b/src/components/insights/coach-panel/coach-hero.tsx index 5cc06c4c9..cd67c0d54 100644 --- a/src/components/insights/coach-panel/coach-hero.tsx +++ b/src/components/insights/coach-panel/coach-hero.tsx @@ -2,7 +2,6 @@ import { Sparkles } from "lucide-react"; -import { MedicalDisclaimer } from "@/components/common/medical-disclaimer"; import { cn } from "@/lib/utils"; import { useTranslations } from "@/lib/i18n/context"; @@ -122,15 +121,6 @@ export function CoachHero({ composer, scopeHint }: CoachHeroProps) { {scopeHint} ) : null} - - {/* v1.25 — the Coach standing self-description: works from your own - data, not a doctor, not medical advice. Sits once on the calm - new-chat surface so it frames the conversation without nagging - every reply. */} - ); From cab0e50fff8c1a0cefb380aa0dc1fbcd5e79f6c2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc-Andr=C3=A9=20Bombeck?= Date: Sun, 28 Jun 2026 20:29:15 +0200 Subject: [PATCH 2/3] Collapse the active-sessions and security-activity lists by default Both account-security lists now render behind a disclosure control and open only on click. The trigger carries aria-expanded and aria-controls and is keyboard-operable; the region is gated with hidden. State is UI-only and not persisted. --- .../settings/security-activity-card.tsx | 41 ++++++++++++++---- .../settings/security-sessions-card.tsx | 43 +++++++++++++++---- 2 files changed, 67 insertions(+), 17 deletions(-) diff --git a/src/components/settings/security-activity-card.tsx b/src/components/settings/security-activity-card.tsx index 7f7426984..bc3450dbb 100644 --- a/src/components/settings/security-activity-card.tsx +++ b/src/components/settings/security-activity-card.tsx @@ -8,14 +8,15 @@ * shared `GET /api/auth/me/security-activity` endpoint. Each row shows a * readable action label, the resolved location, the masked IP, and the time. */ +import { useId, useState } from "react"; import { useQuery } from "@tanstack/react-query"; -import { Loader2, ShieldCheck } from "lucide-react"; +import { ChevronDown, Loader2, ShieldCheck } from "lucide-react"; import { SettingsCard } from "@/components/settings/settings-card"; -import { SettingsCardHeader } from "@/components/settings/_card-header"; import { useTranslations } from "@/lib/i18n/context"; import { queryKeys } from "@/lib/query-keys"; import { apiGet } from "@/lib/api/api-fetch"; +import { cn } from "@/lib/utils"; interface ActivityRow { action: string; @@ -53,6 +54,10 @@ export function SecurityActivityCard({ isAuthenticated: boolean; }) { const { t } = useTranslations(); + // Collapsed by default — the feed opens only on demand, keeping the security + // surface skimmable. UI-only state; nothing is persisted across reloads. + const [open, setOpen] = useState(false); + const regionId = useId(); const { data, isLoading, isError } = useQuery({ queryKey: queryKeys.securityActivity(), @@ -65,12 +70,32 @@ export function SecurityActivityCard({ return ( - -
+ +