1
1
'use client' ;
2
2
3
- import Link from 'next/link' ;
3
+ import cn from 'mxcn' ;
4
+ import { Inter } from 'next/font/google' ;
4
5
import { useState } from 'react' ;
5
6
import '../../styles/global.css' ;
7
+ import { Anchor } from '../ui/anchor' ;
8
+ import { IconDocs } from '../ui/iconists/icon-docs' ;
6
9
import WebGLInitializer from './webgl' ;
10
+ const inter = Inter ( { subsets : [ 'latin' ] } ) ;
7
11
8
12
export default function Hero ( { } ) {
9
13
return (
@@ -18,73 +22,89 @@ export default function Hero({}) {
18
22
19
23
function Content ( ) {
20
24
return (
21
- < div className = "hero-content z-10 mt-10 flex min-h-[65vh] w-[90vw] flex-col justify-between p-6 text-white sm:mt-28 sm:min-h-[77.5vh] sm:w-[76vw]" >
22
- < div className = "helvetica flex justify-between" >
25
+ < div
26
+ className = { cn (
27
+ 'hero-content z-10 mt-10 flex min-h-[65vh] w-[90vw] flex-col justify-between p-6 text-white sm:mt-28 sm:min-h-[77.5vh] sm:w-[76vw]'
28
+ ) }
29
+ >
30
+ < div className = { cn ( ' flex justify-between' , inter . className ) } >
23
31
< div className = "flex items-center" >
24
- < div className = "mr-[1.5vw] hidden h-2.5 w-2.5 rounded-full bg-white sm:block 2xl:h-[.75vw] 2xl:w-[.75vw] " > </ div >
25
- < span className = "text-sm 2xl:text-[1vw] 2xl:leading-[1vw]" >
26
- Deploy Serverless
32
+ < div className = "mr-4 hidden size-4 rounded-full bg-muted-foreground/70 sm:block" > </ div >
33
+ < span className = "text-sm text-muted-foreground/70 2xl:text-[1vw] 2xl:leading-[1vw]" >
34
+ dev local-first
27
35
</ span >
28
36
</ div >
29
37
< div className = "flex items-center" >
30
- < span className = "text-sm 2xl:text-[1vw] 2xl:leading-[1vw]" >
31
- Develop Local-first
38
+ < span className = "text-sm text-muted-foreground/70 2xl:text-[1vw] 2xl:leading-[1vw]" >
39
+ deploy serverless
32
40
</ span >
33
- < div className = "ml-[1.5vw] hidden h-2.5 w-2.5 rounded-full bg-white sm:block 2xl:h-[.75vw] 2xl:w-[.75vw] " > </ div >
41
+ < div className = "ml-4 hidden size-4 rounded-full bg-muted-foreground/70 sm:block" > </ div >
34
42
</ div >
35
43
</ div >
36
44
37
- < div className = "flex flex-col items-center sm:items-start" >
38
- < div className = "helvetica flex w-full flex-col-reverse items-center justify-between sm:flex-row sm:items-start" >
39
- < div className = "text-left sm:max-w-[40%]" >
40
- < div className = "text-center text-sm sm:text-left 2xl:text-[1vw] 2xl:leading-[1.5vw]" >
41
- < strong > Base AI: </ strong > The Web AI Framework.
42
- < p >
43
- Built for developers who want to build
44
- AI-powered web applications. Local-first,
45
- agentic pipes, tools, and memory.
45
+ < div
46
+ className = { cn (
47
+ 'mt-[16rem] flex flex-col items-center sm:mt-[22rem] lg:mt-[28rem] lg:mt-[28rem] 2xl:mt-[42rem]'
48
+ ) }
49
+ >
50
+ < div
51
+ className = { cn (
52
+ 'flex w-full flex-col-reverse items-center justify-between lg:flex-row lg:items-start' ,
53
+ inter . className
54
+ ) }
55
+ >
56
+ < div className = "text-left lg:max-w-[60%]" >
57
+ < div className = "text-center text-sm lg:text-left 2xl:text-[1vw] 2xl:leading-[1.5vw]" >
58
+ < span className = "mr-4 hidden size-4 rounded-full bg-muted-foreground/70 lg:inline-block" />
59
+ < strong > Base AI </ strong > { ' ' }
60
+ < span className = "text-muted-foreground/90" >
61
+ The first Web AI Framework.
62
+ </ span >
63
+ < p className = "mr-4 mt-4 text-muted-foreground/90 md:max-w-[500px] lg:max-w-full" >
64
+ The easiest way to build serverless autonomous
65
+ AI agents with memory. Start building
66
+ local-first, agentic pipes, tools, and memory.
67
+ Deploy serverless with one command.
46
68
</ p >
47
69
</ div >
48
70
</ div >
49
71
< div className = "flex h-max items-center" >
50
- < span className = "mb-5 text-sm sm:mb-0 2xl:text-[1vw] 2xl:leading-[1vw]" >
51
- Agentic Pipes, Tools, Memory
72
+ < span className = "mb-5 text-sm text-muted-foreground/70 lg:mb-0 2xl:text-[1vw] 2xl:leading-[1vw]" >
73
+ agentic{ ' ' }
74
+ < span className = "text-muted-foreground/20" > (</ span > { ' ' }
75
+ pipes{ ' ' }
76
+ < span className = "text-muted-foreground/20" > |</ span > { ' ' }
77
+ tools{ ' ' }
78
+ < span className = "text-muted-foreground/20" > |</ span > { ' ' }
79
+ memory{ ' ' }
80
+ < span className = "text-muted-foreground/20" > )</ span >
52
81
</ span >
53
- < div className = "ml-[1.5vw] hidden h-2.5 w-2.5 rounded-full bg-white sm:block 2xl:h-[.75vw] 2xl:w-[.75vw] " > </ div >
82
+ < div className = "ml-4 hidden size-4 rounded-full bg-muted-foreground/70 lg:block " > </ div >
54
83
</ div >
55
84
</ div >
56
85
57
- < div className = "sm:justify-left flex space-x-4" >
58
- < Link
86
+ < div
87
+ className = { cn (
88
+ 'mx-auto mt-8 flex w-full items-center justify-center space-x-2 lg:items-start lg:justify-start'
89
+ ) }
90
+ >
91
+ < Anchor
92
+ variant = { 'default' }
59
93
href = { `/docs` }
60
- className = "flex items-center rounded-full bg-gray-200 px-4 py-2 text-xs text-black outline-1 outline-[#2A2A2A] transition-colors hover:bg-[#282828] hover:text-white hover:outline 2xl:px-[1vw] 2xl:py-[.65vw] 2xl:text-[.85vw] 2xl:leading-[1vw]"
61
- aria-label = "Visit Github"
94
+ aria-label = "Get Started"
62
95
>
63
- Get Started
64
- < svg
65
- xmlns = "http://www.w3.org/2000/svg"
66
- className = "ml-2 h-4 w-4"
67
- fill = "none"
68
- viewBox = "0 0 24 24"
69
- stroke = "currentColor"
70
- >
71
- < path
72
- strokeLinecap = "round"
73
- strokeLinejoin = "round"
74
- strokeWidth = { 2 }
75
- d = "M10 6H6a2 2 0 00-2 2v10a2 2 0 002 2h10a2 2 0 002-2v-4M14 4h6m0 0v6m0-6L10 14"
76
- />
77
- </ svg >
78
- </ Link >
79
- < Link
96
+ < IconDocs className = "size-4" />
97
+ < span className = { inter . className } > Get Started</ span >
98
+ </ Anchor >
99
+ < Anchor
100
+ variant = { 'secondary' }
80
101
href = { `/learn` }
81
- className = "hover:bg-black-200 rounded-full bg-[#0E0E0E] px-4 py-2 text-xs text-white outline outline-1 outline-[#2A2A2A] transition-colors hover:bg-[#282828] 2xl:px-[1vw] 2xl:py-[.65vw] 2xl:text-[.85vw] 2xl:leading-[1vw]"
82
- aria-label = "Learn BaseAi"
102
+ aria-label = "Learn BaseAI"
83
103
>
84
104
Learn BaseAI
85
- </ Link >
105
+ </ Anchor >
86
106
</ div >
87
- < CopyableCommand command = "npx baseai@latest" />
107
+ < CopyableCommand command = "npx baseai@latest init " />
88
108
</ div >
89
109
</ div >
90
110
) ;
@@ -109,22 +129,26 @@ function CopyableCommand({ command }: CopyableCommandProps) {
109
129
110
130
return (
111
131
< div
112
- className = "group mb-4 mt-4 flex w-max cursor-pointer items-center justify-between font-mono text-sm transition-colors"
132
+ className = "group mx-auto mb-4 mt-4 flex w-max cursor-pointer items-center justify-center font-mono text-sm transition-colors lg:mx-0 "
113
133
onClick = { copyToClipboard }
114
134
role = "button"
115
135
tabIndex = { 0 }
116
136
onKeyDown = { e => e . key === 'Enter' && copyToClipboard ( ) }
117
137
aria-label = { `Copy command: ${ command } ` }
118
138
>
119
- < div className = "flex items-center space-x-2" >
120
- < span className = "text-gray-400 sm:text-sm 2xl:text-[1vw] 2xl:leading-[1.5vw]" >
121
- ~
139
+ < div className = "group flex items-center space-x-2 transition-colors group-hover:text-indigo-400" >
140
+ < span className = "text-muted-foreground/50 group-hover:text-indigo-400 sm:text-sm 2xl:leading-[1.5vw]" >
141
+ < span className = "xtext-indigo-400" > ⌘</ span >
142
+ < span className = "group-hover:text-muted-foreground/50" >
143
+ { ' ' }
144
+ ~
145
+ </ span >
122
146
</ span >
123
- < span className = "font-mono text-gray-300 sm :text-sm 2xl :text-[1vw] 2xl:leading-[1.5vw]" >
147
+ < span className = "font-mono text-muted-foreground/50 transition-colors group-hover :text-indigo-400 sm :text-sm 2xl:leading-[1.5vw] " >
124
148
{ command }
125
149
</ span >
126
150
</ div >
127
- < div className = "ml-2 text-gray-400 transition-colors group-hover:text-gray-300 sm:text-sm 2xl:text-[1vw] 2xl:leading-[1.5vw]" >
151
+ < div className = "ml-2 text-muted-foreground/50 transition-colors group-hover:text-indigo-400 sm:text-sm 2xl:leading-[1.5vw]" >
128
152
{ copied ? (
129
153
< svg
130
154
xmlns = "http://www.w3.org/2000/svg"
0 commit comments