Skip to content

Commit 17111e4

Browse files
committed
feat: implement home and quickstart pages
1 parent cc6bf16 commit 17111e4

4 files changed

Lines changed: 235 additions & 210 deletions

File tree

src/app/page.mdx

Lines changed: 6 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { Guides } from '@/components/Guides'
2-
import { Resources } from '@/components/Resources'
2+
import { Concepts } from '@/components/Concepts'
33
import { HeroPattern } from '@/components/HeroPattern'
44

55
export const metadata = {
@@ -8,40 +8,22 @@ export const metadata = {
88
'Learn everything there is to know about Firebot, from the basics to advanced features.',
99
}
1010

11-
export const sections = [
12-
{ title: 'Guides', id: 'guides' },
13-
{ title: 'Resources', id: 'resources' },
14-
]
15-
1611
<HeroPattern />
1712

1813
<Note type="warning">
1914
Much of this web site is still a work-in-progress, and we are working hard to try and get all of the documentation migrated here. In the meantime, our [Github Wiki](https://github.com/crowbartools/Firebot/wiki) contains a vast selection of <i>historical</i> documentation.
2015
</Note>
2116

22-
# Firebot Documentation
17+
# Welcome to Firebot
18+
19+
Firebot is a powerful, all-in-one bot for Twitch streamers. Built with a modern interface and packed with features, Firebot helps you create interactive experiences for your viewers through chat commands, events, timers, channel rewards, and much more—all without requiring any programming language knowledge. {{ className: 'lead' }}
2320

24-
Firebot is a fully featured open-source bot that can help level up your streams. {{ className: 'lead' }}
21+
New to Firebot? Start here to get up and running quickly, then explore the core concepts that make Firebot powerful.
2522

2623
<div className="not-prose mb-16 mt-6 flex gap-3">
2724
<Button href="/quickstart" arrow="right">
2825
<>Quickstart</>
2926
</Button>
30-
{/* <Button href="/sdks" variant="outline">
31-
<>Explore SDKs</>
32-
</Button> */}
3327
</div>
3428

35-
{/* ## Getting started {{ anchor: false }} */}
36-
37-
{/* To get started, create a new application in your [developer settings](#), then read about how to make requests for the resources you need to access using our HTTP APIs or dedicated client SDKs. When your integration is ready to go live, publish it to our [integrations directory](#) to reach the Protocol community. {{ className: 'lead' }} */}
38-
39-
{/* <div className="not-prose">
40-
<Button href="/sdks" variant="text" arrow="right">
41-
<>Get your API key</>
42-
</Button>
43-
</div> */}
44-
45-
{/* <Guides /> */}
46-
47-
{/* <Resources /> */}
29+
<Concepts />

src/app/quickstart/page.mdx

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
export const metadata = {
2+
title: 'Quickstart',
3+
description:
4+
'This guide will get you all set up and ready to use Firebot. We\'ll cover how to download, install, and initially configure Firebot.',
5+
}
6+
7+
# Quickstart
8+
9+
This guide will get you all set up and ready to use Firebot. We'll cover how to download and install Firebot on your system and connect it to your stream. {{ className: 'lead' }}
10+
11+
## Download & Install
12+
13+
Firebot is available for Windows, macOS, and Linux. Head over to the [GitHub releases page](https://github.com/crowbartools/Firebot/releases/latest) to download the latest version for your platform.
14+
15+
### Windows
16+
17+
1. Download the `setup.exe` file
18+
2. Run the installer
19+
3. Launch Firebot from your Start menu or desktop shortcut
20+
21+
### macOS
22+
#### Apple Silicon (M1/M2/M3/Etc.)
23+
1. Download the `macos-arm64.dmg` file
24+
2. Open the `.dmg` and drag Firebot into your Applications
25+
3. Run the following command in Terminal:
26+
```bash
27+
xattr -c /Applications/Firebot.app
28+
```
29+
4. Launch Firebot from your Applications folder
30+
#### Intel Macs
31+
1. Download the `macos-x64.dmg` file
32+
2. Open the `.dmg` file and drag Firebot to your Applications folder
33+
3. Launch Firebot from your Applications folder
34+
4. If prompted about an unverified developer, go to **System Preferences > Security & Privacy** and click "Open Anyway"
35+
36+
### Linux
37+
#### DEB or RPM based distributions
38+
1. Download the `linux-x64.deb` or `linux-x64.rpm` file
39+
2. Install the file using your system package manager
40+
3. Open Firebot v5 from your system program runner
41+
#### Other distributions
42+
1. Download the `linux-x64.tar.gz` archive file
43+
2. Unpack the archive
44+
3. Change into the directory where you unpacked the archive
45+
4. Run the Firebot v5 executable
46+
47+
## Initial Setup
48+
49+
When you first launch Firebot, you'll be guided through an interactive Setup Wizard that will walk you through everything you need to get started, including signing into your Twitch account(s).
50+
51+
## What's Next?
52+
53+
Great! You're now set up with Firebot and ready to start customizing your stream. Here are the best places to start:
54+
55+
- [Learn about Chat Commands](/v5/core/commands) - Create custom commands that respond to chat messages
56+
- [Explore the Effects System](/v5/core/effects) - Discover the powerful effects (actions) system that makes Firebot so versatile
57+
- [Join the Discord Community](https://discord.gg/tTmMbrG) - Get help and share ideas with other Firebot users

src/components/Concepts.tsx

Lines changed: 172 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,172 @@
1+
'use client'
2+
3+
import Link from 'next/link'
4+
import { type MotionValue, motion, useMotionTemplate, useMotionValue } from 'framer-motion'
5+
6+
import { GridPattern } from '@/components/GridPattern'
7+
import { Heading } from '@/components/Heading'
8+
import { ChatBubbleIcon } from '@/components/icons/ChatBubbleIcon'
9+
import { CalendarIcon } from '@/components/icons/CalendarIcon'
10+
import { BoltIcon } from './icons/BoltIcon'
11+
import { TagIcon } from './icons/TagIcon'
12+
13+
interface Concept {
14+
href: string
15+
name: string
16+
description: string
17+
icon: React.ComponentType<{ className?: string }>
18+
pattern: Omit<React.ComponentPropsWithoutRef<typeof GridPattern>, 'width' | 'height' | 'x'>
19+
}
20+
21+
const concepts: Array<Concept> = [
22+
{
23+
href: '/v5/core/effects',
24+
name: 'Effects',
25+
description:
26+
'Discover the powerful actions system that makes Firebot versatile. Effects are the cool stuff that happens in response to commands, events, and more.',
27+
icon: BoltIcon,
28+
pattern: {
29+
y: 16,
30+
squares: [
31+
[0, 1],
32+
[1, 3],
33+
],
34+
},
35+
},
36+
{
37+
href: '/v5/core/commands',
38+
name: 'Commands',
39+
description:
40+
'Create custom chat commands that respond to viewer messages. Commands are a great way to engage with your audience and add interactivity.',
41+
icon: ChatBubbleIcon,
42+
pattern: {
43+
y: -6,
44+
squares: [
45+
[-1, 2],
46+
[1, 3],
47+
],
48+
},
49+
},
50+
{
51+
href: '/v5/core/events',
52+
name: 'Events',
53+
description:
54+
'Automatic triggers that run effects in response to stream activities like follows, subs, raids, and more. Make your stream dynamic and interactive.',
55+
icon: CalendarIcon,
56+
pattern: {
57+
y: 32,
58+
squares: [
59+
[0, 2],
60+
[1, 4],
61+
],
62+
},
63+
},
64+
{
65+
href: '/variables',
66+
name: 'Variables',
67+
description:
68+
'Use dynamic placeholders to insert real-time data into your effects. Variables can display user info, custom data, and much more.',
69+
icon: TagIcon,
70+
pattern: {
71+
y: 22,
72+
squares: [[0, 1]],
73+
},
74+
},
75+
]
76+
77+
function ResourceIcon({ icon: Icon }: { icon: Concept['icon'] }) {
78+
return (
79+
<div className="flex h-7 w-7 items-center justify-center rounded-full bg-zinc-900/5 ring-1 ring-zinc-900/25 backdrop-blur-[2px] transition duration-300 group-hover:bg-white/50 group-hover:ring-zinc-900/25 dark:bg-white/7.5 dark:ring-white/15 dark:group-hover:bg-amber-300/10 dark:group-hover:ring-amber-400">
80+
<Icon className="h-5 w-5 fill-zinc-700/10 stroke-zinc-700 transition-colors duration-300 group-hover:stroke-zinc-900 dark:fill-white/10 dark:stroke-zinc-400 dark:group-hover:fill-amber-300/10 dark:group-hover:stroke-amber-400" />
81+
</div>
82+
)
83+
}
84+
85+
function ResourcePattern({
86+
mouseX,
87+
mouseY,
88+
...gridProps
89+
}: Concept['pattern'] & {
90+
mouseX: MotionValue<number>
91+
mouseY: MotionValue<number>
92+
}) {
93+
let maskImage = useMotionTemplate`radial-gradient(180px at ${mouseX}px ${mouseY}px, white, transparent)`
94+
let style = { maskImage, WebkitMaskImage: maskImage }
95+
96+
return (
97+
<div className="pointer-events-none">
98+
<div className="absolute inset-0 rounded-2xl transition duration-300 [mask-image:linear-gradient(white,transparent)] group-hover:opacity-50">
99+
<GridPattern
100+
width={72}
101+
height={56}
102+
x="50%"
103+
className="absolute inset-x-0 inset-y-[-30%] h-[160%] w-full skew-y-[-18deg] fill-black/[0.02] stroke-black/5 dark:fill-white/1 dark:stroke-white/2.5"
104+
{...gridProps}
105+
/>
106+
</div>
107+
<motion.div
108+
className="absolute inset-0 rounded-2xl bg-gradient-to-r from-[#edecd7] to-[#F4FBDF] opacity-0 transition duration-300 group-hover:opacity-100 dark:from-[#2e2520] dark:to-[#343328]"
109+
style={style}
110+
/>
111+
<motion.div
112+
className="absolute inset-0 rounded-2xl opacity-0 mix-blend-overlay transition duration-300 group-hover:opacity-100"
113+
style={style}
114+
>
115+
<GridPattern
116+
width={72}
117+
height={56}
118+
x="50%"
119+
className="absolute inset-x-0 inset-y-[-30%] h-[160%] w-full skew-y-[-18deg] fill-black/50 stroke-black/70 dark:fill-white/2.5 dark:stroke-white/10"
120+
{...gridProps}
121+
/>
122+
</motion.div>
123+
</div>
124+
)
125+
}
126+
127+
function Concept({ resource }: { resource: Concept }) {
128+
let mouseX = useMotionValue(0)
129+
let mouseY = useMotionValue(0)
130+
131+
function onMouseMove({ currentTarget, clientX, clientY }: React.MouseEvent<HTMLDivElement>) {
132+
let { left, top } = currentTarget.getBoundingClientRect()
133+
mouseX.set(clientX - left)
134+
mouseY.set(clientY - top)
135+
}
136+
137+
return (
138+
<div
139+
key={resource.href}
140+
onMouseMove={onMouseMove}
141+
className="group relative flex rounded-2xl bg-zinc-50 transition-shadow hover:shadow-md hover:shadow-zinc-900/5 dark:bg-white/2.5 dark:hover:shadow-black/5"
142+
>
143+
<ResourcePattern {...resource.pattern} mouseX={mouseX} mouseY={mouseY} />
144+
<div className="absolute inset-0 rounded-2xl ring-1 ring-inset ring-zinc-900/7.5 group-hover:ring-zinc-900/10 dark:ring-white/10 dark:group-hover:ring-white/20" />
145+
<div className="relative rounded-2xl px-4 pb-4 pt-16">
146+
<ResourceIcon icon={resource.icon} />
147+
<h3 className="mt-4 text-sm font-semibold leading-7 text-zinc-900 dark:text-white">
148+
<Link href={resource.href}>
149+
<span className="absolute inset-0 rounded-2xl" />
150+
{resource.name}
151+
</Link>
152+
</h3>
153+
<p className="mt-1 text-sm text-zinc-600 dark:text-zinc-400">{resource.description}</p>
154+
</div>
155+
</div>
156+
)
157+
}
158+
159+
export function Concepts() {
160+
return (
161+
<div className="my-16 xl:max-w-none">
162+
<Heading level={2} id="concepts">
163+
Concepts
164+
</Heading>
165+
<div className="not-prose mt-4 grid grid-cols-1 gap-8 border-t border-zinc-900/5 pt-10 sm:grid-cols-2 xl:grid-cols-4 dark:border-white/5">
166+
{concepts.map((resource) => (
167+
<Concept key={resource.href} resource={resource} />
168+
))}
169+
</div>
170+
</div>
171+
)
172+
}

0 commit comments

Comments
 (0)