mirror of
https://github.com/netbirdio/docs.git
synced 2026-04-18 16:36:35 +00:00
237 lines
6.8 KiB
JavaScript
237 lines
6.8 KiB
JavaScript
import Link from 'next/link'
|
|
import { motion, useMotionTemplate, useMotionValue } from 'framer-motion'
|
|
|
|
import { GridPattern } from '@/components/GridPattern'
|
|
import { Heading } from '@/components/Heading'
|
|
import { ChatBubbleIcon } from '@/components/icons/ChatBubbleIcon'
|
|
import { EnvelopeIcon } from '@/components/icons/EnvelopeIcon'
|
|
import { UserIcon } from '@/components/icons/UserIcon'
|
|
import { UsersIcon } from '@/components/icons/UsersIcon'
|
|
|
|
const resources = [
|
|
{
|
|
href: '/ipa/resources/accounts',
|
|
name: 'Accounts',
|
|
description:
|
|
'Learn how to list and update accounts.',
|
|
icon: UserIcon,
|
|
pattern: {
|
|
y: 16,
|
|
squares: [
|
|
[0, 1],
|
|
[1, 3],
|
|
],
|
|
},
|
|
},
|
|
{
|
|
href: '/ipa/resources/users',
|
|
name: 'Users',
|
|
description:
|
|
'Learn how to create, update, delete, and list users.',
|
|
icon: ChatBubbleIcon,
|
|
pattern: {
|
|
y: -6,
|
|
squares: [
|
|
[-1, 2],
|
|
[1, 3],
|
|
],
|
|
},
|
|
},
|
|
{
|
|
href: '/ipa/resources/tokens',
|
|
name: 'Tokens',
|
|
description:
|
|
'Learn how to create, retrieve, delete, and list tokens.',
|
|
icon: ChatBubbleIcon,
|
|
pattern: {
|
|
y: -6,
|
|
squares: [
|
|
[-1, 2],
|
|
[1, 3],
|
|
],
|
|
},
|
|
},
|
|
{
|
|
href: '/ipa/resources/peers',
|
|
name: 'Peers',
|
|
description:
|
|
'Learn how to retrieve, update, delete, and list peers.',
|
|
icon: EnvelopeIcon,
|
|
pattern: {
|
|
y: 32,
|
|
squares: [
|
|
[0, 2],
|
|
[1, 4],
|
|
],
|
|
},
|
|
},
|
|
{
|
|
href: '/ipa/resources/setup-keys',
|
|
name: 'Setup Keys',
|
|
description:
|
|
'Learn how to create, retrieve, update, and list setup keys.',
|
|
icon: UsersIcon,
|
|
pattern: {
|
|
y: 22,
|
|
squares: [[0, 1]],
|
|
},
|
|
},
|
|
{
|
|
href: '/ipa/resources/groups',
|
|
name: 'Groups',
|
|
description:
|
|
'Learn how to create, retrieve, update, delete, and list groups.',
|
|
icon: UsersIcon,
|
|
pattern: {
|
|
y: 22,
|
|
squares: [[0, 1]],
|
|
},
|
|
},
|
|
{
|
|
href: '/ipa/resources/rules',
|
|
name: 'Rules',
|
|
description:
|
|
'Learn how to create, retrieve, update, delete, and list rules.',
|
|
icon: UsersIcon,
|
|
pattern: {
|
|
y: 22,
|
|
squares: [[0, 1]],
|
|
},
|
|
},
|
|
{
|
|
href: '/ipa/resources/policies',
|
|
name: 'Policies',
|
|
description:
|
|
'Learn how to create, retrieve, update, delete, and list policies.',
|
|
icon: UsersIcon,
|
|
pattern: {
|
|
y: 22,
|
|
squares: [[0, 1]],
|
|
},
|
|
},
|
|
{
|
|
href: '/ipa/resources/routes',
|
|
name: 'Routes',
|
|
description:
|
|
'Learn about how to create, retrieve, update, delete, and list routes.',
|
|
icon: UsersIcon,
|
|
pattern: {
|
|
y: 22,
|
|
squares: [[0, 1]],
|
|
},
|
|
},
|
|
{
|
|
href: '/ipa/resources/dns',
|
|
name: 'DNS',
|
|
description:
|
|
'Learn about how to create, retrieve, update, delete, and list nameserver groups and update and retrieve DNS settings.',
|
|
icon: UsersIcon,
|
|
pattern: {
|
|
y: 22,
|
|
squares: [[0, 1]],
|
|
},
|
|
},
|
|
{
|
|
href: '/ipa/resources/events',
|
|
name: 'Events',
|
|
description:
|
|
'Learn about how to list events.',
|
|
icon: UsersIcon,
|
|
pattern: {
|
|
y: 22,
|
|
squares: [[0, 1]],
|
|
},
|
|
},
|
|
]
|
|
|
|
function ResourceIcon({ icon: Icon }) {
|
|
return (
|
|
<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-orange-300/10 dark:group-hover:ring-orange-400">
|
|
<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-orange-300/10 dark:group-hover:stroke-orange-400" />
|
|
</div>
|
|
)
|
|
}
|
|
|
|
function ResourcePattern({ mouseX, mouseY, ...gridProps }) {
|
|
let maskImage = useMotionTemplate`radial-gradient(180px at ${mouseX}px ${mouseY}px, white, transparent)`
|
|
let style = { maskImage, WebkitMaskImage: maskImage }
|
|
|
|
return (
|
|
<div className="pointer-events-none">
|
|
<div className="absolute inset-0 rounded-2xl transition duration-300 [mask-image:linear-gradient(white,transparent)] group-hover:opacity-50">
|
|
<GridPattern
|
|
width={72}
|
|
height={56}
|
|
x="50%"
|
|
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"
|
|
{...gridProps}
|
|
/>
|
|
</div>
|
|
<motion.div
|
|
className="absolute inset-0 rounded-2xl bg-gradient-to-r from-[#FFAC1C] to-[#F28C28] opacity-0 transition duration-300 group-hover:opacity-30 dark:group-hover:opacity-60 dark:from-[#F28C28]/30 dark:to-[#FF7518]/30"
|
|
style={style}
|
|
/>
|
|
<motion.div
|
|
className="absolute inset-0 rounded-2xl opacity-0 mix-blend-overlay transition duration-300 group-hover:opacity-100"
|
|
style={style}
|
|
>
|
|
<GridPattern
|
|
width={72}
|
|
height={56}
|
|
x="50%"
|
|
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"
|
|
{...gridProps}
|
|
/>
|
|
</motion.div>
|
|
</div>
|
|
)
|
|
}
|
|
|
|
function Resource({ resource }) {
|
|
let mouseX = useMotionValue(0)
|
|
let mouseY = useMotionValue(0)
|
|
|
|
function onMouseMove({ currentTarget, clientX, clientY }) {
|
|
let { left, top } = currentTarget.getBoundingClientRect()
|
|
mouseX.set(clientX - left)
|
|
mouseY.set(clientY - top)
|
|
}
|
|
|
|
return (
|
|
<div
|
|
key={resource.href}
|
|
onMouseMove={onMouseMove}
|
|
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"
|
|
>
|
|
<ResourcePattern {...resource.pattern} mouseX={mouseX} mouseY={mouseY} />
|
|
<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" />
|
|
<div className="relative rounded-2xl px-4 pb-4 pt-16">
|
|
<h3 className="mt-4 text-sm font-semibold leading-7 text-zinc-900 dark:text-white">
|
|
<Link href={resource.href}>
|
|
<span className="absolute inset-0 rounded-2xl" />
|
|
{resource.name}
|
|
</Link>
|
|
</h3>
|
|
<p className="mt-1 text-sm text-zinc-600 dark:text-zinc-400">
|
|
{resource.description}
|
|
</p>
|
|
</div>
|
|
</div>
|
|
)
|
|
}
|
|
|
|
export function Resources() {
|
|
return (
|
|
<div className="my-16 xl:max-w-none">
|
|
<Heading level={2} id="resources">
|
|
Resources
|
|
</Heading>
|
|
<div className="not-prose mt-4 grid grid-cols-1 gap-8 border-t border-zinc-900/5 pt-10 dark:border-white/5 sm:grid-cols-2 xl:grid-cols-4">
|
|
{resources.map((resource) => (
|
|
<Resource key={resource.href} resource={resource} />
|
|
))}
|
|
</div>
|
|
</div>
|
|
)
|
|
}
|