From 956f81fab3f969040ecbed4e27b0246d857eb37c Mon Sep 17 00:00:00 2001
From: sean-brydon <55134778+sean-brydon@users.noreply.github.com>
Date: Thu, 20 Nov 2025 10:20:38 +0000
Subject: [PATCH] chore: tidy up onboarding with new animations and
illustrations (#25124)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
## Summary by cubic
Revamps onboarding with subtle route transitions, new org/teams illustrations, and clearer invite flows with real-time previews. Adds “Skip for now” on invites and guardrails to avoid incomplete team creation.
- **New Features**
- Added email invite pages for organizations and teams with shared EmailInviteForm and RoleSelector.
- Built a live invite browser preview that renders a 3×3 grid and updates as you type; works for orgs and teams.
- Applied route-keyed framer-motion transitions to layout, cards, and browser views for smoother page changes.
- Continuation prompt now detects saved org or team and routes to the right next step; localized copy.
- Added loading state to plan selection to prevent double navigation.
- Refreshed Organizations welcome modal with a new animated ring illustration and better scrolling.
- Added “Skip for now” to org and team invite-by-email steps to proceed without invites.
- Calendar browser preview now focuses on a time window around “now” for a more realistic demo.
- Added an optional floating footer to keep actions visible on long, scrollable lists.
- **Refactors and Fixes**
- Unified invite browser and replaced the org preview on the org email step.
- Split and simplified legacy invite views; team and org routes are cleaner and easier to extend.
- Streamlined the team invite step by removing a redundant action; non-admins are redirected to the email invite page.
- Prevented creating teams with empty details by redirecting back to team details.
- Minor UI cleanup: tighter borders, padding, and mobile max-heights across onboarding screens.
- Hide team select on org invites when no teams exist.
Written for commit ae7f5277ab998560ae6e2f3f9144852a7b4959a7. Summary will update automatically on new commits.
---
.../onboarding/teams/invite/page.tsx | 4 +
.../onboarding/components/EmailInviteForm.tsx | 4 +-
.../onboarding/components/OnboardingCard.tsx | 93 +++++--
.../components/OnboardingLayout.tsx | 55 ++---
.../components/onboarding-browser-view.tsx | 137 +++++++----
.../onboarding-calendar-browser-view.tsx | 118 ++++++---
.../onboarding-continuation-prompt.tsx | 56 ++++-
.../onboarding-invite-browser-view.tsx | 201 ++++++++++++----
.../onboarding-organization-browser-view.tsx | 162 ++++++++-----
.../onboarding-teams-browser-view.tsx | 201 +++++++++-------
.../onboarding/components/plan-icon.tsx | 47 ++--
.../getting-started/onboarding-view.tsx | 35 +--
.../modules/onboarding/hooks/useCreateTeam.ts | 7 +
.../details/organization-details-view.tsx | 17 +-
.../email/organization-invite-email-view.tsx | 68 +++---
.../teams/organization-teams-view.tsx | 4 +-
.../_components/InstallableAppCard.tsx | 2 +-
.../calendar/personal-calendar-view.tsx | 124 ++++++++--
.../settings/personal-settings-view.tsx | 2 +-
.../teams/details/team-details-view.tsx | 143 +++++------
.../invite/email/team-invite-email-view.tsx | 42 +++-
.../teams/invite/team-invite-view.tsx | 14 --
apps/web/public/static/locales/en/common.json | 15 ++
.../WelcomeToOrganizationsModal.tsx | 226 +++++++++---------
.../shell/components/WelcomeToCalcomModal.tsx | 2 +-
.../form/color-picker/colorpicker.test.tsx | 8 +-
.../form/color-picker/colorpicker.tsx | 2 +-
.../ui/components/form/inputs/TextField.tsx | 23 +-
packages/ui/components/form/inputs/types.d.ts | 2 +-
29 files changed, 1142 insertions(+), 672 deletions(-)
diff --git a/apps/web/app/(use-page-wrapper)/onboarding/teams/invite/page.tsx b/apps/web/app/(use-page-wrapper)/onboarding/teams/invite/page.tsx
index bc0a42eaf2..aeba1acca1 100644
--- a/apps/web/app/(use-page-wrapper)/onboarding/teams/invite/page.tsx
+++ b/apps/web/app/(use-page-wrapper)/onboarding/teams/invite/page.tsx
@@ -26,6 +26,10 @@ const ServerPage = async () => {
return redirect("/auth/login");
}
+ if (session.user.role !== "ADMIN") {
+ return redirect("/onboarding/teams/invite/email");
+ }
+
const userEmail = session.user.email || "";
return ;
diff --git a/apps/web/modules/onboarding/components/EmailInviteForm.tsx b/apps/web/modules/onboarding/components/EmailInviteForm.tsx
index a1f3b47631..e454e2f141 100644
--- a/apps/web/modules/onboarding/components/EmailInviteForm.tsx
+++ b/apps/web/modules/onboarding/components/EmailInviteForm.tsx
@@ -47,7 +47,7 @@ export function EmailInviteForm({
const { register, watch, setValue } = useFormContext();
return (
-
+
{showTeamSelect ? (
@@ -59,7 +59,7 @@ export function EmailInviteForm({