From 71afa3a87ca50bee45b8e9fb88d12182ae552b7a Mon Sep 17 00:00:00 2001 From: waleed Date: Sun, 15 Mar 2026 05:49:30 -0700 Subject: [PATCH 01/17] fix(sidebar): show icon-sized skeletons in collapsed settings sidebar --- .../settings-sidebar/settings-sidebar.tsx | 38 +++++++++++-------- 1 file changed, 23 insertions(+), 15 deletions(-) diff --git a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/settings-sidebar/settings-sidebar.tsx b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/settings-sidebar/settings-sidebar.tsx index 73fe052757..eec0ce3d48 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/settings-sidebar/settings-sidebar.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/settings-sidebar/settings-sidebar.tsx @@ -206,29 +206,37 @@ export function SettingsSidebar({ )} > {sessionLoading || orgsLoading - ? Array.from({ length: 3 }, (_, i) => ( -
-
- + ? isCollapsed + ? Array.from({ length: 7 }, (_, i) => ( +
+
-
- {Array.from({ length: i === 0 ? 3 : 2 }, (_, j) => ( -
- -
- ))} + )) + : Array.from({ length: 3 }, (_, i) => ( +
+
+ +
+
+ {Array.from({ length: i === 0 ? 3 : 2 }, (_, j) => ( +
+ +
+ ))} +
-
- )) + )) : sectionConfig.map(({ key, title }) => { const sectionItems = navigationItems.filter((item) => item.section === key) if (sectionItems.length === 0) return null return (
-
-
{title}
-
+ {!isCollapsed && ( +
+
{title}
+
+ )}
{sectionItems.map((item) => { const Icon = item.icon From af872df5f8c5b48f97e03b5a22db67f2f7aa6148 Mon Sep 17 00:00:00 2001 From: waleed Date: Sun, 15 Mar 2026 05:50:59 -0700 Subject: [PATCH 02/17] fix(sidebar): hide expanded skeletons during pre-hydration in collapsed settings --- .../sidebar/components/settings-sidebar/settings-sidebar.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/settings-sidebar/settings-sidebar.tsx b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/settings-sidebar/settings-sidebar.tsx index eec0ce3d48..5ddab67d3e 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/settings-sidebar/settings-sidebar.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/settings-sidebar/settings-sidebar.tsx @@ -213,7 +213,7 @@ export function SettingsSidebar({
)) : Array.from({ length: 3 }, (_, i) => ( -
+
@@ -233,7 +233,7 @@ export function SettingsSidebar({ return (
{!isCollapsed && ( -
+
{title}
)} From a58de5a24ba86f1b808297b5329c7b645cb874aa Mon Sep 17 00:00:00 2001 From: waleed Date: Sun, 15 Mar 2026 05:52:59 -0700 Subject: [PATCH 03/17] fix(sidebar): align collapsed settings skeletons with actual icon positions --- .../settings-sidebar/settings-sidebar.tsx | 169 +++++++++--------- 1 file changed, 87 insertions(+), 82 deletions(-) diff --git a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/settings-sidebar/settings-sidebar.tsx b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/settings-sidebar/settings-sidebar.tsx index 5ddab67d3e..f333dfeca7 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/settings-sidebar/settings-sidebar.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/settings-sidebar/settings-sidebar.tsx @@ -205,96 +205,101 @@ export function SettingsSidebar({ !isCollapsed && 'overflow-y-auto overflow-x-hidden' )} > - {sessionLoading || orgsLoading - ? isCollapsed - ? Array.from({ length: 7 }, (_, i) => ( + {sessionLoading || orgsLoading ? ( + isCollapsed ? ( +
+ {Array.from({ length: 7 }, (_, i) => (
- )) - : Array.from({ length: 3 }, (_, i) => ( -
-
- -
-
- {Array.from({ length: i === 0 ? 3 : 2 }, (_, j) => ( -
- -
- ))} -
+ ))} +
+ ) : ( + Array.from({ length: 3 }, (_, i) => ( +
+
+
- )) - : sectionConfig.map(({ key, title }) => { - const sectionItems = navigationItems.filter((item) => item.section === key) - if (sectionItems.length === 0) return null - - return ( -
- {!isCollapsed && ( -
-
{title}
+
+ {Array.from({ length: i === 0 ? 3 : 2 }, (_, j) => ( +
+
- )} -
- {sectionItems.map((item) => { - const Icon = item.icon - const active = activeSection === item.id - const itemClassName = cn( - 'group mx-[2px] flex h-[30px] items-center gap-[8px] rounded-[8px] px-[8px] text-[14px] hover:bg-[var(--surface-active)]', - active && 'bg-[var(--surface-active)]' - ) - const content = ( - <> - - - {item.label} - - - ) - - const element = item.externalUrl ? ( - - {content} - - ) : ( - - ) + ))} +
+
+ )) + ) + ) : ( + sectionConfig.map(({ key, title }) => { + const sectionItems = navigationItems.filter((item) => item.section === key) + if (sectionItems.length === 0) return null - return ( - - {element} - {showCollapsedContent && ( - -

{item.label}

-
- )} -
- ) - })} + return ( +
+ {!isCollapsed && ( +
+
{title}
+ )} +
+ {sectionItems.map((item) => { + const Icon = item.icon + const active = activeSection === item.id + const itemClassName = cn( + 'group mx-[2px] flex h-[30px] items-center gap-[8px] rounded-[8px] px-[8px] text-[14px] hover:bg-[var(--surface-active)]', + active && 'bg-[var(--surface-active)]' + ) + const content = ( + <> + + + {item.label} + + + ) + + const element = item.externalUrl ? ( + + {content} + + ) : ( + + ) + + return ( + + {element} + {showCollapsedContent && ( + +

{item.label}

+
+ )} +
+ ) + })}
- ) - })} +
+ ) + }) + )}
) From 03739d03520e873edb1f03002fa36827db836d59 Mon Sep 17 00:00:00 2001 From: waleed Date: Sun, 15 Mar 2026 05:54:00 -0700 Subject: [PATCH 04/17] fix(sidebar): match collapsed skeleton section grouping with loaded layout --- .../settings-sidebar/settings-sidebar.tsx | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/settings-sidebar/settings-sidebar.tsx b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/settings-sidebar/settings-sidebar.tsx index f333dfeca7..84b7dfd42f 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/settings-sidebar/settings-sidebar.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/settings-sidebar/settings-sidebar.tsx @@ -207,13 +207,17 @@ export function SettingsSidebar({ > {sessionLoading || orgsLoading ? ( isCollapsed ? ( -
- {Array.from({ length: 7 }, (_, i) => ( -
- + <> + {[3, 2, 2].map((count, sectionIdx) => ( +
+ {Array.from({ length: count }, (_, i) => ( +
+ +
+ ))}
))} -
+ ) : ( Array.from({ length: 3 }, (_, i) => (
From c191f15501800c4b2a9b8e9ab223df79dcc15975 Mon Sep 17 00:00:00 2001 From: waleed Date: Sun, 15 Mar 2026 05:55:06 -0700 Subject: [PATCH 05/17] fix(sidebar): hoist skeleton section counts to module constant --- .../sidebar/components/settings-sidebar/settings-sidebar.tsx | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/settings-sidebar/settings-sidebar.tsx b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/settings-sidebar/settings-sidebar.tsx index 84b7dfd42f..349f0fb84a 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/settings-sidebar/settings-sidebar.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/settings-sidebar/settings-sidebar.tsx @@ -24,6 +24,8 @@ import { useSuperUserStatus } from '@/hooks/queries/user-profile' import { usePermissionConfig } from '@/hooks/use-permission-config' import { useSettingsNavigation } from '@/hooks/use-settings-navigation' +const SKELETON_SECTIONS = [3, 2, 2] as const + interface SettingsSidebarProps { isCollapsed?: boolean showCollapsedContent?: boolean @@ -208,7 +210,7 @@ export function SettingsSidebar({ {sessionLoading || orgsLoading ? ( isCollapsed ? ( <> - {[3, 2, 2].map((count, sectionIdx) => ( + {SKELETON_SECTIONS.map((count, sectionIdx) => (
{Array.from({ length: count }, (_, i) => (
From 0725c98afa6531f8db9753b5d332b1b505c71804 Mon Sep 17 00:00:00 2001 From: waleed Date: Sun, 15 Mar 2026 07:44:16 -0700 Subject: [PATCH 06/17] improvement(ui): align all public pages with dark landing theme and improve whitelabeling --- 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 | 54 +++--- .../components/social-login-buttons.tsx | 9 +- .../(auth)/components/sso-login-button.tsx | 4 +- .../(auth)/components/status-page-layout.tsx | 61 +------ .../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 ++++++++------ .../(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 | 24 ++- .../auth/password/password-auth.tsx | 22 ++- .../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 | 19 +-- .../sim/app/invite/components/status-card.tsx | 40 ++--- apps/sim/app/not-found.tsx | 33 ++-- .../[executionId]/resume-page-client.tsx | 14 +- apps/sim/app/unsubscribe/unsubscribe.tsx | 60 +++---- .../deploy-modal/components/chat/chat.tsx | 9 +- .../grouped-checkbox-list.tsx | 160 +++++++++--------- .../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 | 27 ++- apps/sim/ee/sso/components/sso-auth.tsx | 26 ++- apps/sim/ee/sso/components/sso-form.tsx | 55 +++--- apps/sim/ee/whitelabeling/inject-theme.ts | 1 + apps/sim/lib/blog/faq.tsx | 6 +- apps/sim/lib/blog/mdx.tsx | 27 ++- 70 files changed, 959 insertions(+), 1357 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 ( - -
-