Skip to content

Commit 38c8922

Browse files
authored
improvement: landing, sidebar, globals, buttons (#3590)
* improvement: landing, sidebar, globals, buttons * improvement(landing): features * improvement: features, footer, tab modals * migrations * temp: enterprise link * addressed comments
1 parent aa1f605 commit 38c8922

File tree

82 files changed

+14538
-389
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

82 files changed

+14538
-389
lines changed

apps/sim/app/(home)/components/collaboration/collaboration.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ function DotGrid({ className, cols, rows, gap = 0 }: DotGridProps) {
2525
}}
2626
>
2727
{Array.from({ length: cols * rows }, (_, i) => (
28-
<div key={i} className='h-[2px] w-[2px] rounded-full bg-[#2A2A2A]' />
28+
<div key={i} className='h-[1.5px] w-[1.5px] rounded-full bg-[#2A2A2A]' />
2929
))}
3030
</div>
3131
)
@@ -268,13 +268,13 @@ export default function Collaboration() {
268268
collaboration
269269
</h2>
270270

271-
<p className='font-[430] font-season text-[#F6F6F0]/50 text-[14px] leading-[125%] tracking-[0.02em] sm:text-[16px]'>
271+
<p className='font-[430] font-season text-[#F6F6F0]/50 text-[18px] leading-[150%] tracking-[0.02em]'>
272272
Grab your team. Build agents together <br /> in real-time inside your workspace.
273273
</p>
274274

275275
<Link
276276
href='/signup'
277-
className='group/cta mt-[12px] inline-flex h-[32px] cursor-none items-center gap-[6px] rounded-[5px] border border-[#33C482] bg-[#33C482] px-[10px] font-[430] font-season text-[14px] text-black transition-[filter] hover:brightness-110'
277+
className='group/cta mt-[12px] inline-flex h-[32px] cursor-none items-center gap-[6px] rounded-[5px] border border-[#FFFFFF] bg-[#FFFFFF] px-[10px] font-[430] font-season text-[14px] text-black transition-colors hover:border-[#E0E0E0] hover:bg-[#E0E0E0]'
278278
>
279279
Build together
280280
<span className='relative h-[10px] w-[10px] shrink-0'>
Lines changed: 113 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,113 @@
1+
'use client'
2+
3+
import { type SVGProps, useRef } from 'react'
4+
import { motion, useInView } from 'framer-motion'
5+
import { ChevronDown } from '@/components/emcn'
6+
import { Database, File, Library, Table } from '@/components/emcn/icons'
7+
import {
8+
AnthropicIcon,
9+
GeminiIcon,
10+
GmailIcon,
11+
GroqIcon,
12+
HubspotIcon,
13+
OpenAIIcon,
14+
SalesforceIcon,
15+
SlackIcon,
16+
xAIIcon,
17+
} from '@/components/icons'
18+
19+
interface IconEntry {
20+
key: string
21+
icon: React.ComponentType<SVGProps<SVGSVGElement>>
22+
label: string
23+
top: string
24+
left: string
25+
color?: string
26+
}
27+
28+
const SCATTERED_ICONS: IconEntry[] = [
29+
{ key: 'slack', icon: SlackIcon, label: 'Slack', top: '8%', left: '14%' },
30+
{ key: 'openai', icon: OpenAIIcon, label: 'OpenAI', top: '8%', left: '44%' },
31+
{ key: 'anthropic', icon: AnthropicIcon, label: 'Anthropic', top: '10%', left: '78%' },
32+
{ key: 'gmail', icon: GmailIcon, label: 'Gmail', top: '24%', left: '90%' },
33+
{ key: 'salesforce', icon: SalesforceIcon, label: 'Salesforce', top: '28%', left: '6%' },
34+
{ key: 'table', icon: Table, label: 'Tables', top: '22%', left: '30%' },
35+
{ key: 'xai', icon: xAIIcon, label: 'xAI', top: '26%', left: '66%' },
36+
{ key: 'hubspot', icon: HubspotIcon, label: 'HubSpot', top: '55%', left: '4%', color: '#FF7A59' },
37+
{ key: 'database', icon: Database, label: 'Database', top: '74%', left: '68%' },
38+
{ key: 'file', icon: File, label: 'Files', top: '70%', left: '18%' },
39+
{ key: 'gemini', icon: GeminiIcon, label: 'Gemini', top: '58%', left: '86%' },
40+
{ key: 'logs', icon: Library, label: 'Logs', top: '86%', left: '44%' },
41+
{ key: 'groq', icon: GroqIcon, label: 'Groq', top: '90%', left: '82%' },
42+
]
43+
44+
const EXPLODE_STAGGER = 0.04
45+
const EXPLODE_BASE_DELAY = 0.1
46+
47+
export function FeaturesPreview() {
48+
const containerRef = useRef<HTMLDivElement>(null)
49+
const inView = useInView(containerRef, { once: true, margin: '-80px' })
50+
51+
return (
52+
<div ref={containerRef} className='relative h-[560px] w-full overflow-hidden'>
53+
<div
54+
aria-hidden='true'
55+
className='absolute inset-0'
56+
style={{
57+
backgroundImage: 'radial-gradient(circle, #D4D4D4 0.75px, transparent 0.75px)',
58+
backgroundSize: '12px 12px',
59+
maskImage: 'radial-gradient(ellipse 70% 65% at 48% 50%, black 30%, transparent 80%)',
60+
WebkitMaskImage:
61+
'radial-gradient(ellipse 70% 65% at 48% 50%, black 30%, transparent 80%)',
62+
}}
63+
/>
64+
65+
{SCATTERED_ICONS.map(({ key, icon: Icon, label, top, left, color }, index) => {
66+
const explodeDelay = EXPLODE_BASE_DELAY + index * EXPLODE_STAGGER
67+
68+
return (
69+
<motion.div
70+
key={key}
71+
className='absolute flex items-center justify-center rounded-xl border border-[#E5E5E5] bg-white p-[10px] shadow-[0_2px_4px_0_rgba(0,0,0,0.06)]'
72+
initial={{ top: '50%', left: '50%', opacity: 0, scale: 0, x: '-50%', y: '-50%' }}
73+
animate={inView ? { top, left, opacity: 1, scale: 1, x: '-50%', y: '-50%' } : undefined}
74+
transition={{
75+
type: 'spring',
76+
stiffness: 50,
77+
damping: 12,
78+
delay: explodeDelay,
79+
}}
80+
style={{ color }}
81+
aria-label={label}
82+
>
83+
<Icon className='h-6 w-6' />
84+
</motion.div>
85+
)
86+
})}
87+
88+
<motion.div
89+
className='absolute top-1/2 left-[48%]'
90+
initial={{ opacity: 0, x: '-50%', y: '-50%' }}
91+
animate={inView ? { opacity: 1, x: '-50%', y: '-50%' } : undefined}
92+
transition={{ duration: 0.4, ease: 'easeOut', delay: 0 }}
93+
>
94+
<div className='flex h-[36px] items-center gap-[8px] rounded-[8px] border border-[#E5E5E5] bg-white px-[10px] shadow-[0_2px_6px_0_rgba(0,0,0,0.08)]'>
95+
<div className='flex h-[22px] w-[22px] flex-shrink-0 items-center justify-center rounded-[5px] bg-[#1e1e1e]'>
96+
<svg width='11' height='11' viewBox='0 0 10 10' fill='none'>
97+
<path
98+
d='M1 9C1 4.58 4.58 1 9 1'
99+
stroke='white'
100+
strokeWidth='1.8'
101+
strokeLinecap='round'
102+
/>
103+
</svg>
104+
</div>
105+
<span className='whitespace-nowrap font-medium font-season text-[#1C1C1C] text-[13px] tracking-[0.02em]'>
106+
My Workspace
107+
</span>
108+
<ChevronDown className='h-[8px] w-[10px] flex-shrink-0 text-[#999]' />
109+
</div>
110+
</motion.div>
111+
</div>
112+
)
113+
}

0 commit comments

Comments
 (0)