diff --git a/apps/web/src/routes/_view/app/-account-access.tsx b/apps/web/src/routes/_view/app/-account-access.tsx
new file mode 100644
index 0000000000..86a4ea1658
--- /dev/null
+++ b/apps/web/src/routes/_view/app/-account-access.tsx
@@ -0,0 +1,143 @@
+import { useMutation } from "@tanstack/react-query";
+import { useNavigate } from "@tanstack/react-router";
+import { useState } from "react";
+
+import {
+ Accordion,
+ AccordionContent,
+ AccordionItem,
+ AccordionTrigger,
+} from "@hypr/ui/components/ui/accordion";
+
+import { signOutFn } from "@/functions/auth";
+import { deleteAccount } from "@/functions/billing";
+
+export function AccountAccessSection() {
+ const navigate = useNavigate();
+ const [showDeleteConfirm, setShowDeleteConfirm] = useState(false);
+
+ const signOut = useMutation({
+ mutationFn: async () => {
+ const res = await signOutFn();
+ if (res.success) {
+ return true;
+ }
+
+ throw new Error(res.message);
+ },
+ onSuccess: () => {
+ navigate({ to: "/" });
+ },
+ onError: (error) => {
+ console.error(error);
+ navigate({ to: "/" });
+ },
+ });
+
+ const deleteAccountMutation = useMutation({
+ mutationFn: () => deleteAccount(),
+ onSuccess: () => {
+ navigate({ to: "/" });
+ },
+ });
+
+ return (
+
+
+
Access
+
+ Session controls and destructive account actions
+
+
+
+
+
+
Sign out
+
+ End your current session on this device
+
+
+
+
signOut.mutate()}
+ disabled={signOut.isPending}
+ className="flex h-8 cursor-pointer items-center justify-center rounded-full border border-neutral-300 bg-linear-to-b from-white to-stone-50 px-4 text-sm text-neutral-700 shadow-xs transition-all hover:scale-[102%] hover:shadow-md active:scale-[98%] disabled:opacity-50 disabled:hover:scale-100"
+ >
+ {signOut.isPending ? "Signing out..." : "Sign out"}
+
+
+
+
+
{
+ if (!value) {
+ setShowDeleteConfirm(false);
+ deleteAccountMutation.reset();
+ }
+ }}
+ >
+
+
+ Delete account
+
+
+
+
+ Char is a local-first app. Your notes, transcripts, and
+ meeting data stay on your device. Deleting your account only
+ removes cloud-stored data.
+
+
+ {showDeleteConfirm ? (
+
+
+ This permanently deletes your account and cloud data.
+
+
+ {deleteAccountMutation.isError && (
+
+ {deleteAccountMutation.error?.message ||
+ "Failed to delete account"}
+
+ )}
+
+
+ deleteAccountMutation.mutate()}
+ disabled={deleteAccountMutation.isPending}
+ className="flex h-8 items-center rounded-full bg-red-600 px-4 text-sm text-white shadow-md transition-all hover:scale-[102%] hover:shadow-lg active:scale-[98%] disabled:opacity-50 disabled:hover:scale-100"
+ >
+ {deleteAccountMutation.isPending
+ ? "Deleting..."
+ : "Yes, delete my account"}
+
+ {
+ setShowDeleteConfirm(false);
+ deleteAccountMutation.reset();
+ }}
+ disabled={deleteAccountMutation.isPending}
+ className="flex h-8 items-center rounded-full border border-red-200 bg-white px-4 text-sm text-red-700 transition-all hover:border-red-300 hover:text-red-800 disabled:opacity-50"
+ >
+ Cancel
+
+
+
+ ) : (
+
setShowDeleteConfirm(true)}
+ className="mt-4 flex h-8 cursor-pointer items-center rounded-full border border-red-200 bg-white px-4 text-sm text-red-700 transition-all hover:border-red-300 hover:text-red-800"
+ >
+ Continue
+
+ )}
+
+
+
+
+
+
+ );
+}
diff --git a/apps/web/src/routes/_view/app/-account-delete.tsx b/apps/web/src/routes/_view/app/-account-delete.tsx
deleted file mode 100644
index e886dd2244..0000000000
--- a/apps/web/src/routes/_view/app/-account-delete.tsx
+++ /dev/null
@@ -1,74 +0,0 @@
-import { useMutation } from "@tanstack/react-query";
-import { useNavigate } from "@tanstack/react-router";
-import { useState } from "react";
-
-import { deleteAccount } from "@/functions/billing";
-
-export function DeleteAccountSection() {
- const navigate = useNavigate();
- const [showConfirm, setShowConfirm] = useState(false);
-
- const deleteAccountMutation = useMutation({
- mutationFn: () => deleteAccount(),
- onSuccess: () => {
- navigate({ to: "/" });
- },
- });
-
- return (
-
-
-
- Delete Account
-
-
- Char is a local-first app — your notes, transcripts, and meeting data
- are stored locally on your device and will not be affected by account
- deletion. Deleting your account only removes your cloud-stored data.
-
-
-
-
- {showConfirm ? (
-
-
- Are you sure? This will permanently delete your account and all
- cloud-stored data. Your local data will not be affected.
-
- {deleteAccountMutation.isError && (
-
- {deleteAccountMutation.error?.message ||
- "Failed to delete account"}
-
- )}
-
- deleteAccountMutation.mutate()}
- disabled={deleteAccountMutation.isPending}
- className="flex h-8 items-center rounded-full bg-red-600 px-4 text-sm text-white shadow-md transition-all hover:scale-[102%] hover:shadow-lg active:scale-[98%] disabled:opacity-50 disabled:hover:scale-100"
- >
- {deleteAccountMutation.isPending
- ? "Deleting..."
- : "Yes, Delete My Account"}
-
- setShowConfirm(false)}
- disabled={deleteAccountMutation.isPending}
- className="flex h-8 items-center rounded-full border border-neutral-300 bg-linear-to-b from-white to-stone-50 px-4 text-sm text-neutral-700 shadow-xs transition-all hover:scale-[102%] hover:shadow-md active:scale-[98%] disabled:opacity-50"
- >
- Cancel
-
-
-
- ) : (
-
setShowConfirm(true)}
- className="flex h-8 cursor-pointer items-center rounded-full border border-red-200 px-4 text-sm text-red-600 transition-all hover:border-red-300 hover:text-red-700"
- >
- Delete Account
-
- )}
-
-
- );
-}
diff --git a/apps/web/src/routes/_view/app/-account-sign-out.tsx b/apps/web/src/routes/_view/app/-account-sign-out.tsx
deleted file mode 100644
index 860445b7e1..0000000000
--- a/apps/web/src/routes/_view/app/-account-sign-out.tsx
+++ /dev/null
@@ -1,45 +0,0 @@
-import { useMutation } from "@tanstack/react-query";
-import { useNavigate } from "@tanstack/react-router";
-
-import { signOutFn } from "@/functions/auth";
-
-export function SignOutSection() {
- const navigate = useNavigate();
-
- const signOut = useMutation({
- mutationFn: async () => {
- const res = await signOutFn();
- if (res.success) {
- return true;
- }
-
- throw new Error(res.message);
- },
- onSuccess: () => {
- navigate({ to: "/" });
- },
- onError: (error) => {
- console.error(error);
- navigate({ to: "/" });
- },
- });
-
- return (
-
-
-
Sign Out
-
End your current session
-
-
-
- signOut.mutate()}
- disabled={signOut.isPending}
- className="flex h-8 cursor-pointer items-center rounded-full border border-red-200 px-4 text-sm text-red-600 transition-all hover:border-red-300 hover:text-red-700 disabled:opacity-50 disabled:hover:border-red-200"
- >
- {signOut.isPending ? "Signing out..." : "Sign out"}
-
-
-
- );
-}
diff --git a/apps/web/src/routes/_view/app/account.tsx b/apps/web/src/routes/_view/app/account.tsx
index e1ddeab466..f6dba122f9 100644
--- a/apps/web/src/routes/_view/app/account.tsx
+++ b/apps/web/src/routes/_view/app/account.tsx
@@ -4,11 +4,10 @@ import { z } from "zod";
import { desktopSchemeSchema } from "@/functions/desktop-flow";
-import { DeleteAccountSection } from "./-account-delete";
+import { AccountAccessSection } from "./-account-access";
import { IntegrationsSettingsCard } from "./-account-integrations";
import { ProfileInfoSection } from "./-account-profile-info";
import { AccountSettingsCard } from "./-account-settings";
-import { SignOutSection } from "./-account-sign-out";
const validateSearch = z
.object({
@@ -43,16 +42,48 @@ function Component() {
-
-
+
+
+
+
+ Account
+
+
+
+ Profile, billing, and connected services
+
+
+ Update the essentials without burying routine settings behind
+ destructive actions.
+
+
+
-
+
+
-
+
+
+
+ Access
+
+
+
+ Session controls
+
+
+ Sign out quickly, while keeping account deletion tucked behind
+ an extra deliberate step.
+
+
+
-
-
-
+
+