@@ -5,21 +5,22 @@ import {
55 GitBranch ,
66 GraduationCap ,
77 Link2 ,
8- LucideIcon ,
98 MessageSquare ,
109 Settings ,
1110 Shield ,
1211 Slack ,
1312 Users ,
1413 Zap ,
1514} from "lucide-react"
15+ import type { LucideIcon } from "lucide-react"
1616import type { Metadata } from "next"
1717
18- import { Button } from "@/components/ui"
1918import { AnimatedBackground } from "@/components/homepage"
19+ import { SlackThreadDemo } from "@/components/slack/slack-thread-demo"
20+ import { Button } from "@/components/ui"
21+ import { EXTERNAL_LINKS } from "@/lib/constants"
2022import { SEO } from "@/lib/seo"
2123import { ogImageUrl } from "@/lib/og"
22- import { EXTERNAL_LINKS } from "@/lib/constants"
2324
2425const TITLE = "Roo Code for Slack"
2526const DESCRIPTION =
@@ -69,7 +70,7 @@ export const metadata: Metadata = {
6970// Invalidate cache when a request comes in, at most once every hour.
7071export const revalidate = 3600
7172
72- interface ValueProp {
73+ type ValueProp = {
7374 icon : LucideIcon
7475 title : string
7576 description : string
@@ -112,19 +113,17 @@ const VALUE_PROPS: ValueProp[] = [
112113 } ,
113114]
114115
115- interface WorkflowStep {
116+ type WorkflowStep = {
116117 step : number
117118 title : string
118119 description : string
119- code ?: string
120120}
121121
122122const WORKFLOW_STEPS : WorkflowStep [ ] = [
123123 {
124124 step : 1 ,
125125 title : "Turn the discussion into a plan" ,
126126 description : "Your team discusses a feature. When it gets complex, summon the Planner agent." ,
127- code : "@Roomote plan out a dark mode feature based on our discussion. Include the toggle, persistence, and system preference detection." ,
128127 } ,
129128 {
130129 step : 2 ,
@@ -136,7 +135,6 @@ const WORKFLOW_STEPS: WorkflowStep[] = [
136135 step : 3 ,
137136 title : "Build the plan" ,
138137 description : "Once the plan looks good, hand it off to the Coder agent to implement." ,
139- code : "@Roomote implement this plan in the frontend-web repo." ,
140138 } ,
141139 {
142140 step : 4 ,
@@ -145,7 +143,7 @@ const WORKFLOW_STEPS: WorkflowStep[] = [
145143 } ,
146144]
147145
148- interface OnboardingStep {
146+ type OnboardingStep = {
149147 icon : LucideIcon
150148 title : string
151149 description : string
@@ -182,48 +180,54 @@ const ONBOARDING_STEPS: OnboardingStep[] = [
182180 } ,
183181]
184182
185- export default function SlackPage ( ) {
183+ export default function SlackPage ( ) : JSX . Element {
186184 return (
187185 < >
188186 { /* Hero Section */ }
189187 < section className = "relative flex pt-32 pb-20 items-center overflow-hidden" >
190188 < AnimatedBackground />
191189 < div className = "container relative flex flex-col items-center h-full z-10 mx-auto px-4 sm:px-6 lg:px-8" >
192- < div className = "text-center max-w-4xl mx-auto mb-12" >
193- < div className = "inline-flex items-center gap-2 px-4 py-2 rounded-full bg-violet-100 dark:bg-violet-900/30 text-violet-700 dark:text-violet-300 text-sm font-medium mb-6" >
194- < Slack className = "size-4" />
195- Powered by Roo Code Cloud
190+ < div className = "grid w-full max-w-6xl grid-cols-1 items-center gap-10 lg:grid-cols-2 lg:gap-12" >
191+ < div className = "text-center lg:text-left" >
192+ < div className = "inline-flex items-center gap-2 px-4 py-2 rounded-full bg-violet-100 dark:bg-violet-900/30 text-violet-700 dark:text-violet-300 text-sm font-medium mb-6" >
193+ < Slack className = "size-4" />
194+ Powered by Roo Code Cloud
195+ </ div >
196+ < h1 className = "text-4xl font-bold tracking-tight mb-6 md:text-5xl lg:text-6xl" >
197+ < span className = "text-violet-500" > @Roomote:</ span > Your AI Team in Slack
198+ </ h1 >
199+ < p className = "text-xl text-muted-foreground mb-8 max-w-2xl mx-auto lg:mx-0" >
200+ Mention @Roomote in any channel to explain code, plan features, or ship a PR, all
201+ without leaving the conversation.
202+ </ p >
203+ < div className = "flex flex-col sm:flex-row gap-4 justify-center lg:justify-start" >
204+ < Button
205+ size = "xl"
206+ className = "bg-violet-600 hover:bg-violet-700 text-white transition-all duration-300 shadow-lg hover:shadow-violet-500/25"
207+ asChild >
208+ < a
209+ href = { EXTERNAL_LINKS . CLOUD_APP_SIGNUP }
210+ target = "_blank"
211+ rel = "noopener noreferrer"
212+ className = "flex items-center justify-center" >
213+ Get Started
214+ < ArrowRight className = "ml-2 size-5" />
215+ </ a >
216+ </ Button >
217+ < Button variant = "outline" size = "xl" className = "backdrop-blur-sm" asChild >
218+ < a
219+ href = { EXTERNAL_LINKS . SLACK_DOCS }
220+ target = "_blank"
221+ rel = "noopener noreferrer"
222+ className = "flex items-center justify-center" >
223+ Read the Docs
224+ </ a >
225+ </ Button >
226+ </ div >
196227 </ div >
197- < h1 className = "text-4xl font-bold tracking-tight mb-6 md:text-5xl lg:text-6xl" >
198- < span className = "text-violet-500" > @Roomote:</ span > Your AI Team in Slack
199- </ h1 >
200- < p className = "text-xl text-muted-foreground mb-8 max-w-2xl mx-auto" >
201- Mention @Roomote in any channel to explain code, plan features, or ship a PR, all without
202- leaving the conversation.
203- </ p >
204- < div className = "flex flex-col sm:flex-row gap-4 justify-center" >
205- < Button
206- size = "xl"
207- className = "bg-violet-600 hover:bg-violet-700 text-white transition-all duration-300 shadow-lg hover:shadow-violet-500/25"
208- asChild >
209- < a
210- href = { EXTERNAL_LINKS . CLOUD_APP_SIGNUP }
211- target = "_blank"
212- rel = "noopener noreferrer"
213- className = "flex items-center justify-center" >
214- Get Started
215- < ArrowRight className = "ml-2 size-5" />
216- </ a >
217- </ Button >
218- < Button variant = "outline" size = "xl" className = "backdrop-blur-sm" asChild >
219- < a
220- href = { EXTERNAL_LINKS . SLACK_DOCS }
221- target = "_blank"
222- rel = "noopener noreferrer"
223- className = "flex items-center justify-center" >
224- Read the Docs
225- </ a >
226- </ Button >
228+
229+ < div className = "flex justify-center lg:justify-end" >
230+ < SlackThreadDemo />
227231 </ div >
228232 </ div >
229233 </ div >
@@ -264,13 +268,13 @@ export default function SlackPage() {
264268 </ section >
265269
266270 { /* Featured Workflow Section */ }
267- < section className = "relative overflow-hidden border-t border-border py-32" >
271+ < section className = "relative overflow-hidden border-t border-border py-24 lg:py- 32" >
268272 < div className = "container relative z-10 mx-auto px-4 sm:px-6 lg:px-8" >
269273 < div className = "absolute inset-y-0 left-1/2 h-full w-full max-w-[1200px] -translate-x-1/2 z-1" >
270274 < div className = "absolute left-1/2 top-1/2 h-[400px] w-full -translate-x-1/2 -translate-y-1/2 rounded-full bg-blue-500/10 dark:bg-blue-700/20 blur-[140px]" />
271275 </ div >
272276
273- < div className = "mx-auto mb-12 md:mb-24 max-w-5xl text-center" >
277+ < div className = "mx-auto mb-12 max-w-5xl text-center" >
274278 < div className = "inline-flex items-center gap-2 px-4 py-2 rounded-full bg-blue-100 dark:bg-blue-900/30 text-blue-700 dark:text-blue-300 text-sm font-medium mb-6" >
275279 < Zap className = "size-4" />
276280 Featured Workflow
@@ -283,29 +287,42 @@ export default function SlackPage() {
283287 </ p >
284288 </ div >
285289
286- < div className = "relative mx-auto md:max-w-[1000px]" >
287- { /* Workflow Steps */ }
288- < div className = "grid grid-cols-1 md:grid-cols-2 gap-6 lg:gap-8" >
289- { WORKFLOW_STEPS . map ( ( step ) => (
290- < div
291- key = { step . step }
292- className = "relative border border-border rounded-2xl bg-background p-8 transition-all duration-300 hover:shadow-lg" >
293- < div className = "flex items-center gap-3 mb-4" >
294- < div className = "bg-blue-100 dark:bg-blue-900/30 w-10 h-10 rounded-full flex items-center justify-center text-blue-700 dark:text-blue-300 font-bold" >
295- { step . step }
290+ < div className = "relative mx-auto max-w-6xl" >
291+ < div className = "grid grid-cols-1 lg:grid-cols-5 gap-8 lg:gap-10 items-center" >
292+ { /* YouTube Video Embed */ }
293+ < div className = "lg:col-span-3 overflow-hidden rounded-2xl border border-border bg-background shadow-lg" >
294+ < iframe
295+ className = "aspect-video w-full"
296+ src = "https://www.youtube-nocookie.com/embed/dJM_8HHGe1E?rel=0"
297+ title = "Roo Code Slack Integration Demo"
298+ allow = "accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share"
299+ referrerPolicy = "strict-origin-when-cross-origin"
300+ allowFullScreen
301+ />
302+ </ div >
303+
304+ { /* Workflow Steps */ }
305+ < div className = "lg:col-span-2 space-y-3" >
306+ { WORKFLOW_STEPS . map ( ( step ) => (
307+ < div
308+ key = { step . step }
309+ className = "relative border border-border rounded-xl bg-background p-4 transition-all duration-300 hover:shadow-md hover:border-blue-500/30" >
310+ < div className = "flex items-start gap-3" >
311+ < div className = "bg-blue-100 dark:bg-blue-900/30 w-7 h-7 rounded-full flex items-center justify-center text-blue-700 dark:text-blue-300 font-bold text-xs shrink-0 mt-0.5" >
312+ { step . step }
313+ </ div >
314+ < div className = "min-w-0" >
315+ < h3 className = "text-base font-semibold text-foreground mb-0.5" >
316+ { step . title }
317+ </ h3 >
318+ < p className = "text-sm leading-snug text-muted-foreground" >
319+ { step . description }
320+ </ p >
321+ </ div >
296322 </ div >
297- < h3 className = "text-xl font-semibold text-foreground" > { step . title } </ h3 >
298323 </ div >
299- < p className = "leading-relaxed font-light text-muted-foreground mb-4" >
300- { step . description }
301- </ p >
302- { step . code && (
303- < div className = "bg-muted/50 rounded-lg p-4 font-mono text-sm text-foreground/80 border border-border/50" >
304- { step . code }
305- </ div >
306- ) }
307- </ div >
308- ) ) }
324+ ) ) }
325+ </ div >
309326 </ div >
310327 </ div >
311328 </ div >
0 commit comments