From 680c9cddf0e7331d9ff8b3443abe59316e6c670e Mon Sep 17 00:00:00 2001 From: Waleed Date: Mon, 16 Mar 2026 14:02:05 -0700 Subject: [PATCH] improvement(ui): align all public pages with dark landing theme and improve whitelabeling (#3604) * fix(sidebar): show icon-sized skeletons in collapsed settings sidebar * fix(sidebar): hide expanded skeletons during pre-hydration in collapsed settings * fix(sidebar): align collapsed settings skeletons with actual icon positions * fix(sidebar): match collapsed skeleton section grouping with loaded layout * fix(sidebar): hoist skeleton section counts to module constant * improvement(ui): align all public pages with dark landing theme and improve whitelabeling * fix(ui): address PR review comments - restore StatusPageLayout wrapper, improve whitelabel detection * fix(ui): add missing dark class to 404 page, add relative positioning to invite layout * fix(ui): fallback to white button when whitelabeled without primary color * improvement(seo): add x-default hreflang, speakable schema to landing and blog posts * fix(ui): fix OTP/input light-mode styles and add missing header classes on standalone auth pages * undo hardcoded ff config * update old components/ui usage to emcn * fix(ui): add SupportFooter to InviteLayout, remove duplicates from unsubscribe page * fix(ui): fix invite layout flex centering, use BrandedButton on 404 page * fix(ui): fix OTP group styling, props spread order in BrandedButton, invite header shrink-0 * fix: enterprise hydration error --------- Co-authored-by: Emir Karabeg --- apps/sim/app/(auth)/auth-layout-client.tsx | 30 ++-- .../(auth)/components/auth-background-svg.tsx | 127 +++++++++----- .../app/(auth)/components/auth-background.tsx | 6 +- .../app/(auth)/components/branded-button.tsx | 56 ++++--- .../components/social-login-buttons.tsx | 9 +- .../(auth)/components/sso-login-button.tsx | 4 +- .../(auth)/components/status-page-layout.tsx | 50 +----- .../app/(auth)/components/support-footer.tsx | 19 +-- apps/sim/app/(auth)/login/login-form.tsx | 145 ++++++++-------- apps/sim/app/(auth)/oauth/consent/page.tsx | 45 ++--- .../reset-password/reset-password-content.tsx | 14 +- .../reset-password/reset-password-form.tsx | 27 +-- apps/sim/app/(auth)/signup/signup-form.tsx | 48 ++---- apps/sim/app/(auth)/verify/verify-content.tsx | 101 +++--------- .../app/(home)/components/navbar/navbar.tsx | 131 +++++++++------ .../app/(home)/components/structured-data.tsx | 4 + .../(landing)/components/footer/footer.tsx | 3 +- .../app/(landing)/components/hero/hero.tsx | 3 +- .../components/integrations/integrations.tsx | 3 +- .../landing-pricing/landing-pricing.tsx | 2 - .../components/landing-template-preview.tsx | 12 +- .../landing-templates/landing-templates.tsx | 3 +- .../app/(landing)/components/legal-layout.tsx | 33 ++-- apps/sim/app/(landing)/components/nav/nav.tsx | 3 +- .../components/testimonials/testimonials.tsx | 7 +- apps/sim/app/(landing)/privacy/page.tsx | 19 +-- .../app/(landing)/studio/[slug]/back-link.tsx | 2 +- apps/sim/app/(landing)/studio/[slug]/page.tsx | 27 ++- .../(landing)/studio/[slug]/share-button.tsx | 45 +++-- .../(landing)/studio/authors/[id]/page.tsx | 15 +- apps/sim/app/(landing)/studio/layout.tsx | 11 +- apps/sim/app/(landing)/studio/page.tsx | 15 +- apps/sim/app/(landing)/studio/post-grid.tsx | 14 +- apps/sim/app/(landing)/studio/tags/page.tsx | 9 +- apps/sim/app/(landing)/terms/page.tsx | 14 +- apps/sim/app/_styles/globals.css | 36 ---- .../app/changelog/components/branded-link.tsx | 27 --- .../components/changelog-content.tsx | 29 ++-- .../changelog/components/timeline-list.tsx | 31 ++-- apps/sim/app/changelog/layout.tsx | 14 +- .../chat/components/auth/email/email-auth.tsx | 39 ++--- .../auth/password/password-auth.tsx | 29 ++-- .../sim/app/chat/components/header/header.tsx | 7 +- .../[identifier]/components/error-state.tsx | 2 +- .../[identifier]/components/form-field.tsx | 15 +- .../[identifier]/components/password-auth.tsx | 39 ++--- .../components/powered-by-sim.tsx | 5 +- .../components/thank-you-screen.tsx | 10 +- apps/sim/app/form/[identifier]/error.tsx | 1 - apps/sim/app/form/[identifier]/form.tsx | 25 +-- apps/sim/app/invite/components/layout.tsx | 21 +-- .../sim/app/invite/components/status-card.tsx | 40 ++--- apps/sim/app/not-found.tsx | 27 ++- apps/sim/app/page.tsx | 1 + .../[executionId]/resume-page-client.tsx | 14 +- apps/sim/app/unsubscribe/unsubscribe.tsx | 71 +++----- .../deploy-modal/components/chat/chat.tsx | 9 +- .../grouped-checkbox-list.tsx | 156 +++++++++--------- .../settings-sidebar/settings-sidebar.tsx | 147 ++++++++++------- .../w/components/sidebar/sidebar.tsx | 29 +++- apps/sim/components/emails/_styles/base.ts | 56 ++++--- .../emails/components/email-footer.tsx | 149 +++++++++-------- apps/sim/components/emcn/components/index.ts | 1 + .../components/input-otp}/input-otp.tsx | 50 +++++- apps/sim/components/ui/alert.tsx | 50 ------ apps/sim/components/ui/dialog.tsx | 142 ---------------- apps/sim/components/ui/index.ts | 14 -- .../content/blog/enterprise/components.tsx | 28 ++-- apps/sim/ee/sso/components/sso-auth.tsx | 26 ++- apps/sim/ee/sso/components/sso-form.tsx | 57 +++---- apps/sim/ee/whitelabeling/branding.ts | 7 + apps/sim/ee/whitelabeling/inject-theme.ts | 2 + apps/sim/lib/blog/faq.tsx | 6 +- apps/sim/lib/blog/mdx.tsx | 27 ++- apps/sim/lib/blog/seo.ts | 4 + apps/sim/lib/branding/defaults.ts | 1 + apps/sim/lib/branding/types.ts | 2 + 77 files changed, 1070 insertions(+), 1432 deletions(-) delete mode 100644 apps/sim/app/changelog/components/branded-link.tsx rename apps/sim/components/{ui => emcn/components/input-otp}/input-otp.tsx (50%) delete mode 100644 apps/sim/components/ui/alert.tsx delete mode 100644 apps/sim/components/ui/dialog.tsx diff --git a/apps/sim/app/(auth)/auth-layout-client.tsx b/apps/sim/app/(auth)/auth-layout-client.tsx index e2b3e9489d..fe4c524eca 100644 --- a/apps/sim/app/(auth)/auth-layout-client.tsx +++ b/apps/sim/app/(auth)/auth-layout-client.tsx @@ -2,32 +2,22 @@ import { useEffect } from 'react' import AuthBackground from '@/app/(auth)/components/auth-background' -import Nav from '@/app/(landing)/components/nav/nav' - -function isColorDark(hexColor: string): boolean { - const hex = hexColor.replace('#', '') - const r = Number.parseInt(hex.substr(0, 2), 16) - const g = Number.parseInt(hex.substr(2, 2), 16) - const b = Number.parseInt(hex.substr(4, 2), 16) - const luminance = (0.299 * r + 0.587 * g + 0.114 * b) / 255 - return luminance < 0.5 -} +import Navbar from '@/app/(home)/components/navbar/navbar' export default function AuthLayoutClient({ children }: { children: React.ReactNode }) { useEffect(() => { - const rootStyle = getComputedStyle(document.documentElement) - const brandBackground = rootStyle.getPropertyValue('--brand-background-hex').trim() - - if (brandBackground && isColorDark(brandBackground)) { - document.body.classList.add('auth-dark-bg') - } else { - document.body.classList.remove('auth-dark-bg') + document.documentElement.classList.add('dark') + return () => { + document.documentElement.classList.remove('dark') } }, []) + return ( - -
-