Skip to content

Commit 3335053

Browse files
committed
Update windmill ai homepage
1 parent d324bff commit 3335053

File tree

9 files changed

+521
-254
lines changed

9 files changed

+521
-254
lines changed

src/landing/AppSection.tsx

Lines changed: 89 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,7 @@ import {
99
PieChart,
1010
Puzzle,
1111
Palette,
12-
ToyBrick,
13-
Wall
12+
ToyBrick
1413
} from 'lucide-react';
1514
import { useDeveloperMode } from '../pages';
1615

@@ -30,7 +29,15 @@ const tabs = [
3029
description:
3130
'Build complex apps from atomic components. Automatically trigger apps and flows from webhooks, a schedule, watching for events, or slack.',
3231
icon: Hand,
33-
caption: <div>Simply <a href="/docs/getting_started/apps_quickstart" target="_blank">drag and drop components</a>, connect your data and deploy your app in minutes.</div>,
32+
caption: (
33+
<div>
34+
Simply{' '}
35+
<a href="/docs/getting_started/apps_quickstart" target="_blank">
36+
drag and drop components
37+
</a>
38+
, connect your data and deploy your app in minutes.
39+
</div>
40+
),
3441
video: {
3542
videoSrc: '/videos/dnd.mp4',
3643
altText: 'Drag and drop',
@@ -41,7 +48,15 @@ const tabs = [
4148
title: 'Building blocks',
4249
description: 'Quickly start building complex apps using our 50 built-in components.',
4350
icon: Puzzle,
44-
caption: <div>Quickly start building complex apps using our <a href="/docs/apps/app_configuration_settings/app_component_library" target="_blank">50 built-in components</a>.</div>,
51+
caption: (
52+
<div>
53+
Quickly start building complex apps using our{' '}
54+
<a href="/docs/apps/app_configuration_settings/app_component_library" target="_blank">
55+
50 built-in components
56+
</a>
57+
.
58+
</div>
59+
),
4560
video: {
4661
videoSrc: '/videos/components.mp4',
4762
altText: 'Building blocks',
@@ -53,7 +68,15 @@ const tabs = [
5368
description:
5469
'Run any script or flow from the app editor. In Python, Go, Bash, SQL or Typescript.',
5570
icon: Code2,
56-
caption: <div>Windmill supports Typescript, Python, Go, Bash and SQL <a href="/docs/getting_started/scripts_quickstart" target="_blank">scripts</a>.</div>,
71+
caption: (
72+
<div>
73+
Windmill supports Typescript, Python, Go, Bash and SQL{' '}
74+
<a href="/docs/getting_started/scripts_quickstart" target="_blank">
75+
scripts
76+
</a>
77+
.
78+
</div>
79+
),
5780
video: {
5881
videoSrc: '/videos/app-scripts.mp4',
5982
altText: 'Run any script and flow',
@@ -65,7 +88,15 @@ const tabs = [
6588
description:
6689
'Our reactive engine ensures your app is always super performant, even when running complex apps.',
6790
icon: FaBolt,
68-
caption: <div>Example of an <a href="/docs/apps/app_e-commerce" target="_blank">E-commerce CRM app</a>.</div>,
91+
caption: (
92+
<div>
93+
Example of an{' '}
94+
<a href="/docs/apps/app_e-commerce" target="_blank">
95+
E-commerce CRM app
96+
</a>
97+
.
98+
</div>
99+
),
69100
video: {
70101
videoSrc: '/videos/app-performance.mp4',
71102
altText: 'Build super performant apps',
@@ -83,7 +114,15 @@ const tabs = [
83114
title: 'Build complex admin panel with table, action',
84115
description: 'Build complex apps from atomic components.',
85116
icon: FormInput,
86-
caption: <div>Example of an <a href="/docs/apps/app_e-commerce" target="_blank">E-commerce CRM app</a>.</div>,
117+
caption: (
118+
<div>
119+
Example of an{' '}
120+
<a href="/docs/apps/app_e-commerce" target="_blank">
121+
E-commerce CRM app
122+
</a>
123+
.
124+
</div>
125+
),
87126
video: {
88127
videoSrc: '/videos/app-performance.mp4',
89128
altText: 'Build super performant apps',
@@ -101,7 +140,18 @@ const tabs = [
101140
title: 'Build BI dashboards with charts',
102141
description: 'Build complex apps from atomic components.',
103142
icon: BarChart,
104-
caption: <div>Windmill embeds several <a href="/docs/apps/app_configuration_settings/app_component_library#charts" target="_blank">charts components</a> with unlimited customization possibilities.</div>,
143+
caption: (
144+
<div>
145+
Windmill embeds several{' '}
146+
<a
147+
href="/docs/apps/app_configuration_settings/app_component_library#charts"
148+
target="_blank"
149+
>
150+
charts components
151+
</a>{' '}
152+
with unlimited customization possibilities.
153+
</div>
154+
),
105155
video: {
106156
videoSrc: '/videos/bi-charts.mp4',
107157
altText: 'BI charts',
@@ -117,26 +167,50 @@ const tabs = [
117167
data: [
118168
{
119169
title: 'Give style to each component',
120-
description: 'Configure the style of each component with pre-set options, CSS, or Tailwind Classes.',
170+
description:
171+
'Configure the style of each component with pre-set options, CSS, or Tailwind Classes.',
121172
icon: ToyBrick,
122-
caption: <div>Configure the <a href="/docs/apps/app_configuration_settings/app_styling#component-level" target="_blank">style of each component</a> with pre-set options, CSS, or Tailwind Classes.</div>,
173+
caption: (
174+
<div>
175+
Configure the{' '}
176+
<a
177+
href="/docs/apps/app_configuration_settings/app_styling#component-level"
178+
target="_blank"
179+
>
180+
style of each component
181+
</a>{' '}
182+
with pre-set options, CSS, or Tailwind Classes.
183+
</div>
184+
),
123185
video: {
124186
videoSrc: '/videos/styling_component.mp4',
125-
altText: 'Component styling',
187+
altText: 'Component styling'
126188
}
127189
},
128190
{
129191
title: 'Define global themes',
130-
description: 'Apply global themes to reuse across your applications based on their purposes.',
192+
description:
193+
'Apply global themes to reuse across your applications based on their purposes.',
131194
icon: LayoutDashboard,
132-
caption: <div>Apply <a href="/docs/apps/app_configuration_settings/app_styling#global-styling" target="_blank">global themes</a> to reuse across your applications based on their purposes.</div>,
195+
caption: (
196+
<div>
197+
Apply{' '}
198+
<a
199+
href="/docs/apps/app_configuration_settings/app_styling#global-styling"
200+
target="_blank"
201+
>
202+
global themes
203+
</a>{' '}
204+
to reuse across your applications based on their purposes.
205+
</div>
206+
),
133207
video: {
134208
videoSrc: '/videos/global_styling.mp4',
135-
altText: 'Global styling',
209+
altText: 'Global styling'
136210
}
137211
}
138212
]
139-
},
213+
}
140214
];
141215

142216
const examples = [

src/landing/HeroAI.jsx

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
import React from 'react';
2+
import RadialBlur from './RadialBlur';
3+
import { useColorMode } from '@docusaurus/theme-common';
4+
5+
export default function HeroAI() {
6+
const { colorMode } = useColorMode();
7+
8+
return (
9+
<div className="relative rounded-none mx-auto max-w-screen-2xl overflow-hidden 2xl:rounded-3xl pt-32">
10+
<RadialBlur />
11+
12+
<div className="grid gap-4 mx-auto max-w-7xl px-6 gap-y-8 lg:flex lg:px-8 py-16 items-center">
13+
<div className="mx-auto max-w-2xl lg:mx-0 lg:max-w-xl lg:flex-shrink-0 lg:pt-8">
14+
<div className="text-sm font-semibold leading-none border p-2 w-min whitespace-nowrap flex rounded-md">
15+
Windmill AI
16+
</div>
17+
18+
<h1 className="mt-4 !text-4xl tracking-tight sm:!text-6xl">
19+
Build internal tools with Windmill AI
20+
</h1>
21+
<h2 className="mt-6 text-lg leading-8 font-medium">
22+
Windmill is a low-code platform for building endpoints, flows, and apps from simple
23+
scripts. The presence of code at the heart of Windmill offers unlimited possibilities so
24+
as not to rely solely on pre-built integrations.
25+
</h2>
26+
<h2 className="mt-6 text-lg leading-8 font-medium">
27+
With the integration of AI models within Windmill, your willpower alone can create the
28+
internal tools you want in just a few seconds.
29+
</h2>
30+
<h2 className="mt-6 text-lg leading-8 font-medium">
31+
The AI generates code that matches Windmill's specifications, especially the interaction
32+
with external APIs.
33+
</h2>
34+
35+
<div className="mt-10 flex items-center gap-x-6">
36+
<a
37+
href="https://app.windmill.dev/user/login"
38+
onClick={() => window.plausible('try-cloud')}
39+
data-analytics='"try-cloud"'
40+
className="rounded-md transition-all bg-blue-500 px-4 py-2 text-base font-semibold leading-7 text-white hover:bg-blue-800 hover:!text-white focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-blue-600 !no-underline"
41+
rel="nofollow"
42+
>
43+
Try Windmill Cloud
44+
</a>
45+
46+
<a
47+
href="https://www.windmill.dev/docs/advanced/self_host"
48+
onClick={() => window.plausible('self-host')}
49+
className="text-base font-semibold leading-7 text-gray-900 dark:text-gray-200 text !no-underline"
50+
>
51+
Self-host yourself <span aria-hidden="true"></span>
52+
</a>
53+
</div>
54+
</div>
55+
<div className="mt-16 sm:mt-8 h-full rounded-md overflow-hidden">
56+
<video src="/videos/flow_ai.mp4" autoplay={true} loading="lazy" />
57+
</div>
58+
</div>
59+
</div>
60+
);
61+
}

src/landing/Section.tsx

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,8 @@ export default function Section({
1616
description,
1717
color,
1818
examples,
19-
kind
19+
kind,
20+
shouldShowDevModeSwitch = true
2021
}) {
2122
const { developerMode } = useDeveloperMode();
2223
const { colorMode } = useColorMode();
@@ -57,7 +58,7 @@ export default function Section({
5758
>
5859
{title}
5960
</h1>
60-
<DevModeSwitch color={color} />
61+
{shouldShowDevModeSwitch && <DevModeSwitch color={color} />}
6162
</div>
6263
<h2 className={`${colors.text} text-2xl font-semibold`}>{caption}</h2>
6364
</div>
@@ -75,7 +76,7 @@ export default function Section({
7576
) : (
7677
<>
7778
<FeatureCardTabs tabs={tabs} color={color} />
78-
<SectionExamples examples={examples} kind={kind} />
79+
{examples?.length > 0 && <SectionExamples examples={examples} kind={kind} />}
7980
</>
8081
)}
8182
</div>

src/landing/tabs/CarouselSlide.tsx

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
import { AnimatePresence, motion } from 'framer-motion';
2+
import React, { useState, useEffect } from 'react';
3+
import FeatureCard from '../FeatureCard';
4+
import { useInView } from 'react-intersection-observer';
5+
6+
export default function TabContent({ data, color }) {
7+
const { ref, inView, entry } = useInView({
8+
threshold: 0
9+
});
10+
11+
const [selectedIndex, setSelectedIndex] = useState(0);
12+
let timeout = null;
13+
useEffect(() => {
14+
timeout = setTimeout(
15+
() => {},
16+
data[selectedIndex].video ? data[selectedIndex].video.videoLength * 1000 : 20000
17+
);
18+
}, [selectedIndex]);
19+
20+
function onSelect(index: number) {
21+
clearTimeout(timeout);
22+
setSelectedIndex(index);
23+
}
24+
25+
return (
26+
<div className="grid grid-cols-1 lg:grid-cols-3 gap-8 w-full " ref={ref}>
27+
<div className="w-full h-full flex flex-col gap-4 justify-start col-span-2 lg:col-span-1 ">
28+
{data.map((item, index: number) => (
29+
<button onClick={() => onSelect(index)} key={index}>
30+
<FeatureCard
31+
title={item.title}
32+
color={color}
33+
Icon={item.icon}
34+
index={index}
35+
selected={index === selectedIndex}
36+
description={item.description}
37+
/>
38+
</button>
39+
))}
40+
</div>
41+
42+
<div className="col-span-2 relative h-full flex items-center w-full ">
43+
<AnimatePresence mode="sync">
44+
<motion.div
45+
key={selectedIndex}
46+
initial={{ opacity: 0, scale: 0.9, width: '100%' }}
47+
animate={{ opacity: 1, scale: 1 }}
48+
exit={{ opacity: 0, scale: 0.9, position: 'absolute' }}
49+
>
50+
<CarouselSlide data={data[selectedIndex]} />
51+
</motion.div>
52+
</AnimatePresence>
53+
</div>
54+
</div>
55+
);
56+
}
57+
58+
function CarouselSlide({ data }) {
59+
return <p>t</p>;
60+
}

0 commit comments

Comments
 (0)