diff --git a/apps/sim/app/(home)/components/collaboration/collaboration.tsx b/apps/sim/app/(home)/components/collaboration/collaboration.tsx
index 302bcc05904..02bee46ab15 100644
--- a/apps/sim/app/(home)/components/collaboration/collaboration.tsx
+++ b/apps/sim/app/(home)/components/collaboration/collaboration.tsx
@@ -288,7 +288,6 @@ export default function Collaboration() {
width={876}
height={480}
className='h-full w-auto object-left md:min-w-[100vw]'
- priority
/>
diff --git a/apps/sim/app/(home)/components/enterprise/components/access-control-panel.tsx b/apps/sim/app/(home)/components/enterprise/components/access-control-panel.tsx
index 652b2b98ed3..e8c79862acd 100644
--- a/apps/sim/app/(home)/components/enterprise/components/access-control-panel.tsx
+++ b/apps/sim/app/(home)/components/enterprise/components/access-control-panel.tsx
@@ -81,6 +81,56 @@ function ProviderPreviewIcon({ providerId }: { providerId?: string }) {
)
}
+interface FeatureToggleItemProps {
+ feature: PermissionFeature
+ enabled: boolean
+ color: string
+ isInView: boolean
+ delay: number
+ textClassName: string
+ transition: Record
+ onToggle: () => void
+}
+
+function FeatureToggleItem({
+ feature,
+ enabled,
+ color,
+ isInView,
+ delay,
+ textClassName,
+ transition,
+ onToggle,
+}: FeatureToggleItemProps) {
+ return (
+ {
+ if (e.key === 'Enter' || e.key === ' ') {
+ e.preventDefault()
+ onToggle()
+ }
+ }}
+ whileTap={{ scale: 0.98 }}
+ >
+
+
+
+ {feature.name}
+
+
+ )
+}
+
export function AccessControlPanel() {
const ref = useRef(null)
const isInView = useInView(ref, { once: true, margin: '-40px' })
@@ -97,39 +147,25 @@ export function AccessControlPanel() {
return (
0 ? 'mt-4' : ''}>
-
+
{category.label}
- {category.features.map((feature, featIdx) => {
- const enabled = accessState[feature.key]
-
- return (
-
- setAccessState((prev) => ({ ...prev, [feature.key]: !prev[feature.key] }))
- }
- whileTap={{ scale: 0.98 }}
- >
-
-
-
- {feature.name}
-
-
- )
- })}
+ {category.features.map((feature, featIdx) => (
+
+ setAccessState((prev) => ({ ...prev, [feature.key]: !prev[feature.key] }))
+ }
+ />
+ ))}
)
@@ -140,12 +176,11 @@ export function AccessControlPanel() {
{PERMISSION_CATEGORIES.map((category, catIdx) => (
0 ? 'mt-4' : ''}>
-
+
{category.label}
{category.features.map((feature, featIdx) => {
- const enabled = accessState[feature.key]
const currentIndex =
PERMISSION_CATEGORIES.slice(0, catIdx).reduce(
(sum, c) => sum + c.features.length,
@@ -153,30 +188,19 @@ export function AccessControlPanel() {
) + featIdx
return (
-
+ feature={feature}
+ enabled={accessState[feature.key]}
+ color={category.color}
+ isInView={isInView}
+ delay={0.1 + currentIndex * 0.04}
+ textClassName='truncate font-[430] font-season text-[11px] leading-none tracking-[0.02em] transition-opacity duration-200'
+ transition={{ duration: 0.3, ease: [0.25, 0.46, 0.45, 0.94] }}
+ onToggle={() =>
setAccessState((prev) => ({ ...prev, [feature.key]: !prev[feature.key] }))
}
- whileTap={{ scale: 0.98 }}
- >
-
-
-
- {feature.name}
-
-
+ />
)
})}
diff --git a/apps/sim/app/(home)/components/enterprise/components/audit-log-preview.tsx b/apps/sim/app/(home)/components/enterprise/components/audit-log-preview.tsx
index 53c938af1f5..89ad672e678 100644
--- a/apps/sim/app/(home)/components/enterprise/components/audit-log-preview.tsx
+++ b/apps/sim/app/(home)/components/enterprise/components/audit-log-preview.tsx
@@ -146,14 +146,14 @@ function AuditRow({ entry, index }: AuditRowProps) {
{/* Time */}
-
+
{timeAgo}
{entry.actor}
- ·
+ ·
{entry.description}
diff --git a/apps/sim/app/(home)/components/enterprise/enterprise.tsx b/apps/sim/app/(home)/components/enterprise/enterprise.tsx
index 52da8845d49..da8a88461c6 100644
--- a/apps/sim/app/(home)/components/enterprise/enterprise.tsx
+++ b/apps/sim/app/(home)/components/enterprise/enterprise.tsx
@@ -85,7 +85,7 @@ function TrustStrip() {
SOC 2 & HIPAA
-
+
Type II · PHI protected →
@@ -105,7 +105,7 @@ function TrustStrip() {
Open Source
-
+
View on GitHub →
@@ -120,7 +120,7 @@ function TrustStrip() {
SSO & SCIM
-
+
Okta, Azure AD, Google
@@ -165,7 +165,7 @@ export default function Enterprise() {
Audit Trail
-
+
Every action is captured with full actor attribution.
@@ -179,7 +179,7 @@ export default function Enterprise() {
Access Control
-
+
Restrict providers, surfaces, and tools per group.
@@ -211,7 +211,7 @@ export default function Enterprise() {
(tag, i) => (
{tag}
@@ -221,7 +221,7 @@ export default function Enterprise() {
-
+
Ready for growth?
diff --git a/apps/sim/app/(home)/components/features/features.tsx b/apps/sim/app/(home)/components/features/features.tsx
index d402803ac91..1b5d9b8c9a8 100644
--- a/apps/sim/app/(home)/components/features/features.tsx
+++ b/apps/sim/app/(home)/components/features/features.tsx
@@ -190,7 +190,6 @@ export default function Features() {
width={1440}
height={366}
className='h-auto w-full'
- priority
/>
diff --git a/apps/sim/app/(home)/components/footer/footer-cta.tsx b/apps/sim/app/(home)/components/footer/footer-cta.tsx
index b67ae3b3f84..984252f270a 100644
--- a/apps/sim/app/(home)/components/footer/footer-cta.tsx
+++ b/apps/sim/app/(home)/components/footer/footer-cta.tsx
@@ -67,6 +67,7 @@ export function FooterCTA() {
type='button'
onClick={handleSubmit}
disabled={isEmpty}
+ aria-label='Submit message'
className='flex h-[28px] w-[28px] items-center justify-center rounded-full border-0 p-0 transition-colors'
style={{
background: isEmpty ? '#C0C0C0' : '#1C1C1C',
diff --git a/apps/sim/app/layout.tsx b/apps/sim/app/layout.tsx
index a58f0c25cbf..05fd18a7c0b 100644
--- a/apps/sim/app/layout.tsx
+++ b/apps/sim/app/layout.tsx
@@ -218,6 +218,7 @@ export default function RootLayout({ children }: { children: React.ReactNode })
{/* OneDollarStats Analytics */}
+
diff --git a/apps/sim/app/page.tsx b/apps/sim/app/page.tsx
index f20d55d623b..a873661326e 100644
--- a/apps/sim/app/page.tsx
+++ b/apps/sim/app/page.tsx
@@ -2,7 +2,7 @@ import type { Metadata } from 'next'
import { getBaseUrl } from '@/lib/core/utils/urls'
import Landing from '@/app/(home)/landing'
-export const dynamic = 'force-dynamic'
+export const revalidate = 3600
const baseUrl = getBaseUrl()