Closes #8614 /claim #8614
Redesigns the Integrations page from a card/grid layout to a sidebar + detail panel layout, matching the SettingsRouter pattern used throughout the app. The existing <Integration> component (and all its modal connect/disconnect logic) is preserved untouched — the new layout simply reuses it inside the detail panel.
| File | Change |
|---|---|
| IntegrationsPage.tsx | Rewrite to sidebar + panel layout |
| IntegrationsPage.css.ts | New Vanilla Extract styles (replaces .module.css) |
| ApplicationRouter.tsx | path=“integrations” → path=“integrations/*” (1 char change) |
No other files touched.
SettingsRouter.css.ts<Integration> card below it/integrations/:key — <NavLink> + nested <Routes> handle it natively<Navigate> to first enabled (or first available) when no path param is presentconfigurationPage modal flow in Integration.tsx is completely unchangedMinimal diff, zero risk. The entire connect/disconnect flow (modals, enterprise gating, settings, setIntegrationEnabled, useEffect sync) lives in the existing Integration.tsx. Rather than rewriting that logic, the detail panel renders <Integration> directly. This means:
SlackIntegrationConfig, JiraIntegrationConfig, etc.) continue to work exactly as beforeExact design system match. IntegrationsPage.css.ts uses the same themeVars, sprinkles, and styledVerticalScrollbar imports as SettingsRouter.css.ts. Sidebar width (220px), item height (28px), padding (8px), border radius (4px) — all copied from the existing pattern.
Hook/state logic preserved verbatim. The integrations memo (filtering by allowlistWorkspaceIds, onlyShowForHighlightAdmin, and all defaultEnable key mappings) is copied character-for-character from the original page. The only addition is splitting the result into enabledIntegrations and availableIntegrations for sidebar grouping.
/integrations/<key> and highlights it active/integrations/slack selects Slack without redirect/integrations redirects to first enabled integration (or first available if none enabled)/integrations/invalid falls back gracefully (no match, no crash)EnterpriseFeatureButtonAbhyuday Pundir
@abhyuday-fr
Highlight (YC W23)
@highlight