Skip to content

Commit 755feb2

Browse files
samejrclaude
andauthored
Improve the Vercel & Slack integration settings pages (#4848)
## What Updated layout for the **Vercel** and **Slack** organization integration settings pages to match the rest of the settings UI. Layout & UI only — no loader/action/logic changes. ### Blank states (no integration) - Added the app title bar (it was missing on the Vercel page) - Centered logo + heading + copy, with the two pages mirroring each other - A **project picker CTA** that deep-links to where each integration is configured for the chosen project — Vercel → the project's integrations page; Slack → the Errors page alerts sheet (`?alerts=true`) — styled like the side-menu project switcher ### Connected states - Rebuilt on `SettingsContainer` / `SettingsSection` / `SettingsHeader` / `SettingsRow` - An **Overview** section with detail rows + a **Remove integration** row (confirmation dialog kept) - A connected **projects / alert channels** table that fits the settings column - **Vercel:** copyable Team/Installation IDs (`CopyableText`), a sticky **Configure** cog action per row - **Slack:** mirrors the same layout (Workspace / Installed / Remove + alert channels table) <img width="752" height="708" alt="CleanShot 2026-08-31 at 10 47 37" src="https://github.com/user-attachments/assets/21170e53-cda9-42ee-836d-1850f857dbfe" /> <img width="3446" height="2300" alt="CleanShot 2026-09-01 at 19 40 18@2x" src="https://github.com/user-attachments/assets/7874f71c-9219-4b28-9081-8f442e587b70" /> <img width="3438" height="2302" alt="CleanShot 2026-09-01 at 19 40 28@2x" src="https://github.com/user-attachments/assets/117335e0-b201-45d3-825b-22f3c434366f" /> 🤖 Generated with [Claude Code](https://claude.com/claude-code) <!-- conductor-workspace-link --> --- [Open workspace in Conductor](https://app.conductor.build/workspace/6267255e-d21c-4106-8b5f-90b06d2c7fd6) --------- Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
1 parent 22d8f1c commit 755feb2

4 files changed

Lines changed: 378 additions & 279 deletions

File tree

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
import { useNavigation } from "@remix-run/react";
2+
import { useEffect, useState } from "react";
3+
import { ChevronExtraSmallDown } from "~/assets/icons/ChevronExtraSmallDown";
4+
import { DropdownIcon } from "~/assets/icons/DropdownIcon";
5+
import { FolderClosedIcon } from "~/assets/icons/FolderClosedIcon";
6+
import {
7+
Popover,
8+
PopoverContent,
9+
PopoverMenuItem,
10+
PopoverTrigger,
11+
} from "~/components/primitives/Popover";
12+
13+
type ConnectableProject = { id: string; slug: string; name: string };
14+
15+
const MENU_LABEL = "text-[0.90625rem] font-medium tracking-[-0.01em]";
16+
17+
export function ProjectConnectSelect({
18+
projects,
19+
configurePathFor,
20+
}: {
21+
projects: ConnectableProject[];
22+
configurePathFor: (project: ConnectableProject) => string;
23+
}) {
24+
const [isOpen, setIsOpen] = useState(false);
25+
const navigation = useNavigation();
26+
27+
useEffect(() => {
28+
// oxlint-disable-next-line react/set-state-in-effect -- sync menu state after navigation.
29+
setIsOpen(false);
30+
}, [navigation.location?.pathname]);
31+
32+
if (projects.length === 0) {
33+
return null;
34+
}
35+
36+
return (
37+
<Popover open={isOpen} onOpenChange={setIsOpen}>
38+
<PopoverTrigger className="group mt-2 flex h-8 w-fit cursor-pointer items-center gap-2 rounded border border-grid-bright pl-2.5 pr-2 hover:bg-background-hover focus-custom">
39+
<span className={`${MENU_LABEL} text-text-bright`}>Select project to configure</span>
40+
<DropdownIcon className="size-4 min-w-4 text-text-dimmed group-hover:text-text-bright" />
41+
</PopoverTrigger>
42+
<PopoverContent
43+
className="min-w-56 overflow-y-auto p-0 scrollbar-thin scrollbar-track-transparent scrollbar-thumb-surface-control"
44+
align="center"
45+
sideOffset={4}
46+
>
47+
<div className="flex flex-col gap-1 p-1">
48+
{projects.map((project) => (
49+
<PopoverMenuItem
50+
key={project.id}
51+
to={configurePathFor(project)}
52+
title={
53+
<span className="flex w-full items-center justify-between gap-2 text-text-bright">
54+
<span className="min-w-0 grow truncate text-left">{project.name}</span>
55+
<ChevronExtraSmallDown className="size-3.5 shrink-0 -rotate-90 text-text-dimmed opacity-0 transition-opacity group-hover/button:opacity-100" />
56+
</span>
57+
}
58+
icon={FolderClosedIcon}
59+
leadingIconClassName="h-5 w-5 text-indigo-500"
60+
className={MENU_LABEL}
61+
/>
62+
))}
63+
</div>
64+
</PopoverContent>
65+
</Popover>
66+
);
67+
}

apps/webapp/app/components/primitives/DateTime.tsx

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,7 @@ export const DateTime = ({
112112
}
113113
side="right"
114114
asChild={true}
115+
delayDuration={500}
115116
/>
116117
);
117118
};
@@ -291,6 +292,7 @@ const DateTimeAccurateInner = ({
291292
content={tooltipContent}
292293
side="right"
293294
asChild={true}
295+
delayDuration={500}
294296
/>
295297
);
296298
};
@@ -389,6 +391,7 @@ export const RelativeDateTime = ({ date, timeZone, capitalize = true }: Relative
389391
}
390392
side="right"
391393
asChild={true}
394+
delayDuration={500}
392395
/>
393396
);
394397
};

0 commit comments

Comments
 (0)