Improving interfaces landing page
This commit is contained in:
parent
c220d7cd68
commit
57dcde2a70
@ -34,6 +34,7 @@ const config = {
|
||||
|
||||
// Plugins we added
|
||||
plugins: [
|
||||
"docusaurus-plugin-sass",
|
||||
async function myPlugin(context, options) {
|
||||
return {
|
||||
name: "docusaurus-tailwindcss",
|
||||
@ -75,7 +76,7 @@ const config = {
|
||||
blog: false,
|
||||
// Will be passed to @docusaurus/theme-classic.
|
||||
theme: {
|
||||
customCss: require.resolve("./src/css/custom.css"),
|
||||
customCss: require.resolve("./src/styles/main.scss"),
|
||||
},
|
||||
// Will be passed to @docusaurus/plugin-content-pages (false to disable)
|
||||
// pages: {},
|
||||
@ -153,87 +154,13 @@ const config = {
|
||||
// label: "API",
|
||||
// to: "/api",
|
||||
// },
|
||||
{
|
||||
href: "https://github.com/janhq/jan",
|
||||
label: "GitHub",
|
||||
position: "right",
|
||||
},
|
||||
// {
|
||||
// href: "https://github.com/janhq/jan",
|
||||
// label: "GitHub",
|
||||
// position: "right",
|
||||
// },
|
||||
],
|
||||
},
|
||||
footer: {
|
||||
style: "dark",
|
||||
links: [
|
||||
{
|
||||
title: "Jan",
|
||||
items: [
|
||||
{
|
||||
label: "Home",
|
||||
to: "/",
|
||||
},
|
||||
{
|
||||
label: "Platform",
|
||||
to: "/platform",
|
||||
},
|
||||
{
|
||||
label: "Solutions",
|
||||
to: "/solutions",
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
title: "Docs",
|
||||
items: [
|
||||
{
|
||||
label: "Docs",
|
||||
to: "/docs",
|
||||
},
|
||||
{
|
||||
label: "Hardware",
|
||||
to: "/hardware",
|
||||
},
|
||||
{
|
||||
label: "API",
|
||||
to: "/api",
|
||||
},
|
||||
{
|
||||
label: "Changelog",
|
||||
to: "/changelog",
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
title: "Community",
|
||||
items: [
|
||||
{
|
||||
label: "Discord",
|
||||
href: "https://discord.gg/FTk2MvZwJH",
|
||||
},
|
||||
{
|
||||
label: "Twitter",
|
||||
href: "https://twitter.com/jan_dotai",
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
title: "Company",
|
||||
items: [
|
||||
{
|
||||
label: "About",
|
||||
to: "/about",
|
||||
},
|
||||
{
|
||||
label: "Careers",
|
||||
href: "https://janai.bamboohr.com/careers",
|
||||
},
|
||||
{
|
||||
label: "GitHub",
|
||||
href: "https://github.com/janhq/jan",
|
||||
},
|
||||
],
|
||||
},
|
||||
],
|
||||
copyright: `Copyright © ${new Date().getFullYear()} Jan AI Pte Ltd.`,
|
||||
},
|
||||
prism: {
|
||||
theme: lightCodeTheme,
|
||||
darkTheme: darkCodeTheme,
|
||||
@ -241,7 +168,7 @@ const config = {
|
||||
},
|
||||
colorMode: {
|
||||
disableSwitch: false,
|
||||
respectPrefersColorScheme: false,
|
||||
respectPrefersColorScheme: true,
|
||||
},
|
||||
}),
|
||||
};
|
||||
|
||||
@ -23,12 +23,15 @@
|
||||
"autoprefixer": "^10.4.16",
|
||||
"axios": "^1.5.1",
|
||||
"clsx": "^1.2.1",
|
||||
"docusaurus-plugin-sass": "^0.2.5",
|
||||
"js-yaml": "^4.1.0",
|
||||
"postcss": "^8.4.30",
|
||||
"prism-react-renderer": "^1.3.5",
|
||||
"react": "^17.0.2",
|
||||
"react-dom": "^17.0.2",
|
||||
"react-icons": "^4.11.0",
|
||||
"redocusaurus": "^1.6.3",
|
||||
"sass": "^1.69.3",
|
||||
"tailwindcss": "^3.3.3"
|
||||
},
|
||||
"devDependencies": {
|
||||
|
||||
78
docs/src/components/Announcement/index.js
Normal file
78
docs/src/components/Announcement/index.js
Normal file
@ -0,0 +1,78 @@
|
||||
import React from "react";
|
||||
|
||||
import { useAppStars } from "@site/src/hooks/useAppStars";
|
||||
import { useAppRelease } from "@site/src/hooks/useAppRelease";
|
||||
|
||||
import { AiOutlineGithub, AiOutlineTwitter } from "react-icons/ai";
|
||||
import { BiLogoDiscordAlt } from "react-icons/bi";
|
||||
|
||||
const socials = [
|
||||
{
|
||||
icon: <AiOutlineTwitter className="text-xl text-white" />,
|
||||
href: "https://twitter.com/jan_dotai",
|
||||
},
|
||||
{
|
||||
icon: <BiLogoDiscordAlt className="text-xl text-white" />,
|
||||
href: "https://discord.com/invite/FTk2MvZwJH",
|
||||
},
|
||||
{
|
||||
icon: <AiOutlineGithub className="text-lg text-white" />,
|
||||
href: "https://github.com/janhq/jan",
|
||||
},
|
||||
];
|
||||
|
||||
export default function AnnoncementBanner() {
|
||||
const { stargazers } = useAppStars();
|
||||
const { release } = useAppRelease();
|
||||
|
||||
return (
|
||||
<div className="h-10 w-full flex-shrink-0 bg-blue-600">
|
||||
<div className="container flex h-full items-center justify-between py-0.5">
|
||||
<div className="flex h-6 items-center shadow-sm">
|
||||
<a
|
||||
href="https://github.com/janhq/jan"
|
||||
target="_blank"
|
||||
className="flex h-full items-center gap-x-1 rounded-l-sm bg-indigo-50 px-1 py-0.5"
|
||||
>
|
||||
<AiOutlineGithub className="text-lg text-gray-800" />
|
||||
<span className="text-xs font-bold tracking-tight text-gray-800">
|
||||
Stars
|
||||
</span>
|
||||
</a>
|
||||
<a
|
||||
href="https://github.com/janhq/jan/stargazers"
|
||||
target="_blank"
|
||||
className="flex h-full items-center rounded-r-sm border-l border-gray-100 bg-white px-1 py-0.5 font-medium"
|
||||
>
|
||||
<span className="text-xs font-bold text-gray-700">
|
||||
{stargazers.count}
|
||||
</span>
|
||||
</a>
|
||||
</div>
|
||||
<a
|
||||
href="https://github.com/janhq/jan/releases"
|
||||
target="_blank"
|
||||
className="hidden items-center gap-x-2 lg:flex"
|
||||
>
|
||||
✨
|
||||
<div className="flex items-center rounded bg-white px-2">
|
||||
<span className="font-bold uppercase text-blue-600">new</span>
|
||||
</div>
|
||||
<p className="text-white">
|
||||
<span className="font-bold capitalize">{release.tagVersion}</span>
|
||||
is now live on GitHub. Check it out
|
||||
</p>
|
||||
</a>
|
||||
<div className="flex items-center gap-x-3">
|
||||
{socials.map((social, i) => {
|
||||
return (
|
||||
<a key={i} href={social.href} target="_blank">
|
||||
{social.icon}
|
||||
</a>
|
||||
);
|
||||
})}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
@ -57,21 +57,24 @@ export default function Dropdown() {
|
||||
const updateDownloadLinks = async () => {
|
||||
try {
|
||||
const releaseInfo = await getLatestReleaseInfo("janhq", "jan");
|
||||
|
||||
|
||||
// Extract appname from the first asset name
|
||||
const firstAssetName = releaseInfo.assets[0].name;
|
||||
const appname = extractAppName(firstAssetName);
|
||||
|
||||
|
||||
if (!appname) {
|
||||
console.error("Failed to extract appname from file name:", firstAssetName);
|
||||
console.error(
|
||||
"Failed to extract appname from file name:",
|
||||
firstAssetName
|
||||
);
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
// Remove 'v' at the start of the tag_name
|
||||
const tag = releaseInfo.tag_name.startsWith("v")
|
||||
? releaseInfo.tag_name.substring(1)
|
||||
: releaseInfo.tag_name;
|
||||
|
||||
|
||||
const updatedSystems = systems.map((system) => {
|
||||
const downloadUrl = system.fileFormat
|
||||
.replace("{appname}", appname)
|
||||
@ -81,21 +84,21 @@ export default function Dropdown() {
|
||||
href: `https://github.com/janhq/jan/releases/download/${releaseInfo.tag_name}/${downloadUrl}`,
|
||||
};
|
||||
});
|
||||
|
||||
|
||||
setSystems(updatedSystems);
|
||||
setDefaultSystem(updatedSystems[0]);
|
||||
} catch (error) {
|
||||
console.error("Failed to update download links:", error);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
updateDownloadLinks();
|
||||
}, []);
|
||||
|
||||
return (
|
||||
<div className="inline-flex align-items-stretch">
|
||||
<a
|
||||
className="cursor-pointer relative inline-flex items-center rounded-l-md border-0 px-3.5 py-2.5 text-base font-semibold text-white bg-blue-600 dark:bg-blue-500 hover:bg-blue-500 dark:hover:bg-blue-400 hover:text-white"
|
||||
className="cursor-pointer relative inline-flex items-center rounded-l-md border-0 px-3.5 py-2.5 text-base font-semibold text-white bg-blue-600 hover:bg-blue-500 hover:text-white"
|
||||
href={defaultSystem.href}
|
||||
>
|
||||
<img
|
||||
@ -106,9 +109,9 @@ export default function Dropdown() {
|
||||
{defaultSystem.name}
|
||||
</a>
|
||||
<Menu as="div" className="relative -ml-px block">
|
||||
<Menu.Button className="cursor-pointer relative inline-flex items-center rounded-r-md border-0 border-l border-gray-300 active:border-l active:border-white h-full text-white bg-blue-600 dark:bg-blue-500 hover:bg-blue-500 dark:hover:bg-blue-400">
|
||||
<Menu.Button className="cursor-pointer relative inline-flex items-center rounded-r-md border-l border-blue-500 h-full text-white bg-blue-600 w-8 justify-center">
|
||||
<span className="sr-only">Open OS options</span>
|
||||
<ChevronDownIcon className="h-5 w-5" aria-hidden="true" />
|
||||
<ChevronDownIcon className="h-6 w-6" aria-hidden="true" />
|
||||
</Menu.Button>
|
||||
<Transition
|
||||
as={Fragment}
|
||||
@ -119,26 +122,24 @@ export default function Dropdown() {
|
||||
leaveFrom="transform opacity-100 scale-100"
|
||||
leaveTo="transform opacity-0 scale-95"
|
||||
>
|
||||
<Menu.Items className="absolute right-0 z-10 mt-2 w-72 text-left origin-top-right rounded-md bg-blue-600 dark:bg-blue-500 shadow-lg ring-1 ring-black ring-opacity-5 focus:outline-none">
|
||||
<div className="py-1">
|
||||
<Menu.Items className="absolute right-0 z-10 mt-2 w-72 text-left origin-top-right rounded-md bg-blue-600 shadow-lg ring-1 ring-black ring-opacity-5 focus:outline-none overflow-hidden">
|
||||
<div className="overflow-hidden">
|
||||
{systems.map((system) => (
|
||||
<Menu.Item key={system.name}>
|
||||
{({ active }) => (
|
||||
<a
|
||||
href={system.href}
|
||||
className={classNames(
|
||||
active
|
||||
? "bg-blue-500 dark:hover:bg-blue-400 hover:text-white"
|
||||
: "text-white",
|
||||
"block px-4 py-2"
|
||||
active ? "bg-blue-500 hover:text-white" : "text-white",
|
||||
"flex px-4 py-3 items-center text-white hover:text-white"
|
||||
)}
|
||||
>
|
||||
<img
|
||||
src={system.logo}
|
||||
alt="Logo"
|
||||
className="w-3 mr-3 -mt-1"
|
||||
className="w-3 mr-3 -mt-1 flex-shrink-0"
|
||||
/>
|
||||
{system.name}
|
||||
<span className="text-white">{system.name}</span>
|
||||
</a>
|
||||
)}
|
||||
</Menu.Item>
|
||||
|
||||
123
docs/src/components/Footer/index.js
Normal file
123
docs/src/components/Footer/index.js
Normal file
@ -0,0 +1,123 @@
|
||||
import React from "react";
|
||||
|
||||
const menus = [
|
||||
{
|
||||
name: "Resources",
|
||||
child: [
|
||||
{
|
||||
menu: "Home",
|
||||
path: "/",
|
||||
},
|
||||
{
|
||||
menu: "Platform",
|
||||
path: "/platform",
|
||||
},
|
||||
{
|
||||
menu: "Solutions",
|
||||
path: "/solutions",
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
name: "For Developers",
|
||||
child: [
|
||||
{
|
||||
menu: "Documentations",
|
||||
path: "/docs",
|
||||
},
|
||||
{
|
||||
menu: "Hardware",
|
||||
path: "/hardware",
|
||||
},
|
||||
{
|
||||
menu: "API",
|
||||
path: "/api",
|
||||
},
|
||||
{
|
||||
menu: "Changelog",
|
||||
path: "/changelog",
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
name: "Community",
|
||||
child: [
|
||||
{
|
||||
menu: "Github",
|
||||
path: "https://github.com/janhq/jan",
|
||||
external: true,
|
||||
},
|
||||
{
|
||||
menu: "Discord",
|
||||
path: "https://discord.gg/FTk2MvZwJH",
|
||||
external: true,
|
||||
},
|
||||
{
|
||||
menu: "Twitter",
|
||||
path: "https://twitter.com/jan_dotai",
|
||||
external: true,
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
name: "Company",
|
||||
child: [
|
||||
{
|
||||
menu: "About",
|
||||
path: "/about",
|
||||
},
|
||||
{
|
||||
menu: "Careers",
|
||||
path: "https://janai.bamboohr.com/careers",
|
||||
external: true,
|
||||
},
|
||||
],
|
||||
},
|
||||
];
|
||||
|
||||
const getCurrentYear = new Date().getFullYear();
|
||||
|
||||
export default function Footer() {
|
||||
return (
|
||||
<footer className="flex-shrink-0 border-t dark:border-gray-800 border-gray-200 py-10">
|
||||
<div className="container">
|
||||
<div className="grid grid-cols-2 gap-8 md:grid-cols-2 lg:grid-cols-5">
|
||||
<div className="col-span-2 lg:col-span-1">
|
||||
<h6 className="mb-3">Jan</h6>
|
||||
<p className="dark:text-gray-400 text-gray-600">
|
||||
is a source-available, cross device, and privacy focused AI engine
|
||||
and Desktop app that runs locally on your machine.
|
||||
</p>
|
||||
</div>
|
||||
{menus.map((menu, i) => {
|
||||
return (
|
||||
<div key={i} className="lg:text-right">
|
||||
<h6 className="mb-3">{menu.name}</h6>
|
||||
<ul>
|
||||
{menu.child.map((child, i) => {
|
||||
return (
|
||||
<li key={i}>
|
||||
<a
|
||||
href={child.path}
|
||||
target={child.external ? "_blank" : "_self"}
|
||||
className="inline-block py-1 dark:text-gray-400 text-gray-600"
|
||||
>
|
||||
{child.menu}
|
||||
</a>
|
||||
</li>
|
||||
);
|
||||
})}
|
||||
</ul>
|
||||
</div>
|
||||
);
|
||||
})}
|
||||
</div>
|
||||
</div>
|
||||
<div className="container mt-8">
|
||||
<span className="dark:text-gray-300 text-gray-700">
|
||||
©{getCurrentYear} Jan AI Pte Ltd.
|
||||
</span>
|
||||
</div>
|
||||
</footer>
|
||||
);
|
||||
}
|
||||
@ -1,32 +0,0 @@
|
||||
import React from "react";
|
||||
import { XMarkIcon } from "@heroicons/react/20/solid";
|
||||
import { useColorMode } from "@docusaurus/theme-common";
|
||||
|
||||
export default function HomepageBanner() {
|
||||
const { colorMode } = useColorMode();
|
||||
const bannerText =
|
||||
"🚧 This site is under construction - expect breaking changes! 🚧";
|
||||
return colorMode === "dark" ? (
|
||||
<div className="relative isolate flex items-center justify-center overflow-hidden px-6 py-2.5 sm:px-3.5 sm:before:flex-1">
|
||||
<strong className="font-semibold text-sm text-white">{bannerText}</strong>
|
||||
</div>
|
||||
) : (
|
||||
<div className="relative isolate flex items-center justify-center overflow-hidden bg-gray-50 px-6 py-2.5 sm:px-3.5 sm:before:flex-1">
|
||||
<div
|
||||
className="absolute left-[max(-7rem,calc(50%-52rem))] top-1/2 -z-10 -translate-y-1/2 transform-gpu blur-2xl"
|
||||
aria-hidden="true"
|
||||
>
|
||||
<div
|
||||
className="aspect-[577/310] w-[36.0625rem] bg-gradient-to-r from-[#ff80b5] to-[#9089fc] opacity-30"
|
||||
style={{
|
||||
clipPath:
|
||||
"polygon(74.8% 41.9%, 97.2% 73.2%, 100% 34.9%, 92.5% 0.4%, 87.5% 0%, 75% 28.6%, 58.5% 54.6%, 50.1% 56.8%, 46.9% 44%, 48.3% 17.4%, 24.7% 53.9%, 0% 27.9%, 11.9% 74.2%, 24.9% 54.1%, 68.6% 100%, 74.8% 41.9%)",
|
||||
}}
|
||||
/>
|
||||
</div>
|
||||
<strong className="font-semibold text-sm text-gray-900">
|
||||
{bannerText}
|
||||
</strong>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
@ -1,77 +0,0 @@
|
||||
import React from "react";
|
||||
import {
|
||||
ArrowPathIcon,
|
||||
CloudArrowUpIcon,
|
||||
LockClosedIcon,
|
||||
} from "@heroicons/react/20/solid";
|
||||
|
||||
const systems = [
|
||||
{
|
||||
name: "Mac",
|
||||
description:
|
||||
"Commodo nec sagittis tortor mauris sed. Turpis tortor quis scelerisque diam id accumsan nullam tempus. Pulvinar etiam lacus volutpat eu. Phasellus praesent ligula sit faucibus.",
|
||||
href: "#",
|
||||
icon: CloudArrowUpIcon,
|
||||
},
|
||||
{
|
||||
name: "Windows",
|
||||
description:
|
||||
"Pellentesque enim a commodo malesuada turpis eleifend risus. Facilisis donec placerat sapien consequat tempor fermentum nibh.",
|
||||
href: "#",
|
||||
icon: LockClosedIcon,
|
||||
},
|
||||
{
|
||||
name: "Linux",
|
||||
description:
|
||||
"Pellentesque sit elit congue ante nec amet. Dolor aenean curabitur viverra suspendisse iaculis eget. Nec mollis placerat ultricies euismod ut condimentum.",
|
||||
href: "#",
|
||||
icon: ArrowPathIcon,
|
||||
},
|
||||
];
|
||||
|
||||
export default function HomepageDownloads() {
|
||||
return (
|
||||
<div className="bg-white dark:bg-gray-900 py-12 sm:py-16">
|
||||
<div className="mx-auto max-w-7xl px-6 lg:px-8">
|
||||
<div className="mx-auto max-w-2xl lg:text-center">
|
||||
<h2 className="text-base font-semibold leading-7 text-indigo-600 dark:text-indigo-400">
|
||||
Run AI on any OS
|
||||
</h2>
|
||||
<p className="mt-2 text-3xl font-bold tracking-tight text-gray-900 dark:text-white sm:text-4xl">
|
||||
Downloads
|
||||
</p>
|
||||
<p className="mt-6 text-lg leading-8 text-gray-600 dark:text-gray-300">
|
||||
Jan is compatible with all major operating systems. Download the
|
||||
latest stable versions here.
|
||||
</p>
|
||||
</div>
|
||||
<div className="mx-auto mt-16 max-w-2xl sm:mt-20 lg:mt-24 lg:max-w-none">
|
||||
<dl className="grid max-w-xl grid-cols-1 gap-x-8 gap-y-16 lg:max-w-none lg:grid-cols-3">
|
||||
{systems.map((system) => (
|
||||
<div key={system.name} className="flex flex-col">
|
||||
<dt className="flex items-center gap-x-3 text-base font-semibold leading-7 text-gray-900 dark: text-white">
|
||||
<system.icon
|
||||
className="h-5 w-5 flex-none text-indigo-600 dark:text-indigo-400"
|
||||
aria-hidden="true"
|
||||
/>
|
||||
{system.name}
|
||||
</dt>
|
||||
<dd className="mt-4 flex flex-auto flex-col text-base leading-7 text-gray-600 dark:text-gray-300">
|
||||
<p className="flex-auto">{system.description}</p>
|
||||
<p className="mt-6">
|
||||
<a
|
||||
href={system.href}
|
||||
className="text-sm font-semibold leading-6 text-indigo-600 dark:text-indigo-400"
|
||||
>
|
||||
Learn more <span aria-hidden="true">→</span>
|
||||
</a>
|
||||
</p>
|
||||
</dd>
|
||||
</div>
|
||||
))}
|
||||
</dl>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
@ -1,102 +0,0 @@
|
||||
import React from "react";
|
||||
import { ArrowTopRightOnSquareIcon } from "@heroicons/react/20/solid";
|
||||
import { useColorMode } from "@docusaurus/theme-common";
|
||||
import Dropdown from "@site/src/components/Elements/dropdown";
|
||||
|
||||
export default function HomepageHero() {
|
||||
const { colorMode } = useColorMode();
|
||||
|
||||
return (
|
||||
<div className="bg-white dark:bg-gray-900">
|
||||
<div className="relative isolate md:pt-14 pt-0">
|
||||
{/* Background top gradient styling */}
|
||||
{colorMode === "dark" ? (
|
||||
<div
|
||||
className="absolute inset-x-0 -top-40 -z-10 transform-gpu overflow-hidden blur-3xl sm:-top-80"
|
||||
aria-hidden="true"
|
||||
>
|
||||
<div
|
||||
className="relative left-[calc(50%-11rem)] aspect-[1155/678] w-[36.125rem] -translate-x-1/2 rotate-[30deg] bg-gradient-to-tr from-[#ff80b5] to-[#9089fc] opacity-20 sm:left-[calc(50%-30rem)] sm:w-[72.1875rem]"
|
||||
style={{
|
||||
clipPath:
|
||||
"polygon(74.1% 44.1%, 100% 61.6%, 97.5% 26.9%, 85.5% 0.1%, 80.7% 2%, 72.5% 32.5%, 60.2% 62.4%, 52.4% 68.1%, 47.5% 58.3%, 45.2% 34.5%, 27.5% 76.7%, 0.1% 64.9%, 17.9% 100%, 27.6% 76.8%, 76.1% 97.7%, 74.1% 44.1%)",
|
||||
}}
|
||||
/>
|
||||
</div>
|
||||
) : (
|
||||
<div
|
||||
className="absolute inset-x-0 -top-40 -z-10 transform-gpu overflow-hidden blur-3xl sm:-top-80"
|
||||
aria-hidden="true"
|
||||
>
|
||||
<div
|
||||
className="relative left-[calc(50%-11rem)] aspect-[1155/678] w-[36.125rem] -translate-x-1/2 rotate-[30deg] bg-gradient-to-tr from-[#ff80b5] to-[#9089fc] opacity-30 sm:left-[calc(50%-30rem)] sm:w-[72.1875rem]"
|
||||
style={{
|
||||
clipPath:
|
||||
"polygon(74.1% 44.1%, 100% 61.6%, 97.5% 26.9%, 85.5% 0.1%, 80.7% 2%, 72.5% 32.5%, 60.2% 62.4%, 52.4% 68.1%, 47.5% 58.3%, 45.2% 34.5%, 27.5% 76.7%, 0.1% 64.9%, 17.9% 100%, 27.6% 76.8%, 76.1% 97.7%, 74.1% 44.1%)",
|
||||
}}
|
||||
/>
|
||||
</div>
|
||||
)}
|
||||
|
||||
{/* Main hero block */}
|
||||
<div className="py-24 lg:pb-40 animate-in fade-in zoom-in-50 duration-1000 ">
|
||||
<div className="mx-auto max-w-7xl px-6 lg:px-8">
|
||||
{/* Hero text and buttons */}
|
||||
<div className="mx-auto max-w-2xl text-center">
|
||||
<h1 className="text-4xl font-bold tracking-tight text-gray-900 dark:text-white sm:text-6xl">
|
||||
Run your own AI
|
||||
</h1>
|
||||
<p className="mt-6 text-lg leading-8 text-gray-600 dark:text-gray-300">
|
||||
Run Large Language Models locally on Mac, Windows or Linux.
|
||||
</p>
|
||||
<div className="mt-10 flex items-center justify-center gap-x-6">
|
||||
{/* TODO: handle mobile model download app instead */}
|
||||
<Dropdown />
|
||||
<button
|
||||
type="button"
|
||||
className="cursor-pointer relative inline-flex items-center rounded px-3.5 py-2 dark:py-2.5 text-base font-semibold text-blue-600 bg-white border-blue-600 dark:border-0 hover:bg-blue-600 dark:hover:bg-blue-500 hover:text-white"
|
||||
onClick={() =>
|
||||
window.open(
|
||||
"https://github.com/janhq/jan",
|
||||
"_blank",
|
||||
"noreferrer"
|
||||
)
|
||||
}
|
||||
>
|
||||
View Github
|
||||
<ArrowTopRightOnSquareIcon className="h-5 w-5 ml-2" />
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
{/* Desktop screenshot image full width */}
|
||||
<img
|
||||
src={
|
||||
colorMode === "dark"
|
||||
? require("@site/static/img/desktop-llm-chat-dark.png")
|
||||
.default
|
||||
: require("@site/static/img/desktop-llm-chat-light.png")
|
||||
.default
|
||||
}
|
||||
alt="App screenshot"
|
||||
width={2432}
|
||||
className="mt-16 rounded-lg md:rounded-2xl lg:rounded-3xl bg-white/5 shadow-2xl ring-1 ring-white/10 sm:mt-24"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
{/* Background top gradient styling */}
|
||||
<div
|
||||
className="absolute inset-x-0 top-[calc(100%-13rem)] -z-10 transform-gpu overflow-hidden blur-3xl sm:top-[calc(100%-30rem)]"
|
||||
aria-hidden="true"
|
||||
>
|
||||
<div
|
||||
className="relative left-[calc(50%+3rem)] aspect-[1155/678] w-[36.125rem] -translate-x-1/2 bg-gradient-to-tr from-[#ff80b5] to-[#9089fc] opacity-30 sm:left-[calc(50%+36rem)] sm:w-[72.1875rem]"
|
||||
style={{
|
||||
clipPath:
|
||||
"polygon(74.1% 44.1%, 100% 61.6%, 97.5% 26.9%, 85.5% 0.1%, 80.7% 2%, 72.5% 32.5%, 60.2% 62.4%, 52.4% 68.1%, 47.5% 58.3%, 45.2% 34.5%, 27.5% 76.7%, 0.1% 64.9%, 17.9% 100%, 27.6% 76.8%, 76.1% 97.7%, 74.1% 44.1%)",
|
||||
}}
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
@ -1,6 +0,0 @@
|
||||
export { default as HomepageBanner } from "./banner";
|
||||
export { default as HomepageHero } from "./hero";
|
||||
export { default as HomepageSectionOne } from "./sectionOne";
|
||||
export { default as HomepageSectionTwo } from "./sectionTwo";
|
||||
export { default as HomepageSectionThree } from "./sectionThree";
|
||||
export { default as HomepageDownloads } from "./downloads";
|
||||
@ -1,86 +0,0 @@
|
||||
import React from "react";
|
||||
import {
|
||||
CircleStackIcon,
|
||||
CloudArrowUpIcon,
|
||||
CursorArrowRaysIcon,
|
||||
HomeIcon,
|
||||
LockClosedIcon,
|
||||
RocketLaunchIcon,
|
||||
ServerIcon,
|
||||
} from "@heroicons/react/20/solid";
|
||||
import { useColorMode } from "@docusaurus/theme-common";
|
||||
|
||||
const features = [
|
||||
{
|
||||
name: "1 Click Installs.",
|
||||
description:
|
||||
"Llama2, MPT, CodeLlama, and more. 1 click to install the latest and greatest models directly from HuggingFace. Or easily upload your own models.",
|
||||
icon: CursorArrowRaysIcon,
|
||||
},
|
||||
{
|
||||
name: "Model Management.",
|
||||
description:
|
||||
"Configure advanced settings for each model. Manage your model versions. Easily switch between models. Get visibility into hardware performance.",
|
||||
icon: HomeIcon,
|
||||
},
|
||||
{
|
||||
name: "Cloud AI Compatible. (Coming Soon)",
|
||||
description:
|
||||
"Connect to ChatGPT, Claude via an API key. Alternatively, host your own AI server on any GPU cloud and use it from the app.",
|
||||
icon: CloudArrowUpIcon,
|
||||
},
|
||||
];
|
||||
|
||||
export default function HomepageSectionOne() {
|
||||
const { colorMode } = useColorMode();
|
||||
return (
|
||||
<div className="overflow-hidden bg-white dark:bg-gray-900 py-24 sm:py-32">
|
||||
<div className="mx-auto max-w-7xl px-6 lg:px-8">
|
||||
<div className="mx-auto grid max-w-2xl grid-cols-1 gap-x-8 gap-y-16 sm:gap-y-20 lg:mx-0 lg:max-w-none lg:grid-cols-2">
|
||||
<div className="lg:ml-auto lg:pl-4 lg:pt-4">
|
||||
<div className="lg:max-w-lg">
|
||||
<h2 className="text-base font-semibold leading-7 text-indigo-600 dark:text-indigo-400">
|
||||
Jan supports
|
||||
</h2>
|
||||
<p className="mt-2 text-3xl font-bold tracking-tight text-gray-900 dark:text-white sm:text-4xl">
|
||||
Powerful Foundational Models
|
||||
</p>
|
||||
<p className="mt-6 text-lg leading-8 text-gray-600 dark:text-gray-300">
|
||||
Open source foundational models are supported.
|
||||
</p>
|
||||
<dl className="mt-10 max-w-xl space-y-8 text-base leading-7 text-gray-600 dark:text-gray-300 lg:max-w-none">
|
||||
{features.map((feature) => (
|
||||
<div key={feature.name} className="relative pl-9">
|
||||
<dt className="inline font-semibold text-gray-900 dark:text-gray-300">
|
||||
<feature.icon
|
||||
className="absolute left-1 top-1 h-5 w-5 text-indigo-600 dark:text-indigo-400"
|
||||
aria-hidden="true"
|
||||
/>
|
||||
{feature.name}
|
||||
</dt>{" "}
|
||||
<dt>{feature.description}</dt>
|
||||
</div>
|
||||
))}
|
||||
</dl>
|
||||
</div>
|
||||
</div>
|
||||
<div className="flex items-start justify-end lg:order-first">
|
||||
<img
|
||||
src={
|
||||
colorMode === "dark"
|
||||
? // TODO replace with darkmode image
|
||||
require("@site/static/img/desktop-explore-models-dark.png")
|
||||
.default
|
||||
: require("@site/static/img/desktop-explore-models-light.png")
|
||||
.default
|
||||
}
|
||||
alt="Product screenshot"
|
||||
className="w-[48rem] max-w-none rounded-xl shadow-xl ring-1 ring-gray-400/10 sm:w-[57rem]"
|
||||
width={2432}
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
@ -1,174 +0,0 @@
|
||||
import React from "react";
|
||||
import { useState } from "react";
|
||||
import { RadioGroup } from "@headlessui/react";
|
||||
import { CheckIcon } from "@heroicons/react/20/solid";
|
||||
|
||||
const frequencies = [
|
||||
{ value: "monthly", label: "Monthly", priceSuffix: "/1Mn tokens" },
|
||||
{ value: "annually", label: "Annually", priceSuffix: "/year" },
|
||||
];
|
||||
const tiers = [
|
||||
{
|
||||
name: "Pay per API call",
|
||||
id: "tier-freelancer",
|
||||
href: "#",
|
||||
price: { monthly: "$75", annually: "$144" },
|
||||
description: "The essentials to provide your best work for clients.",
|
||||
features: [
|
||||
"5 products",
|
||||
"Up to 1,000 subscribers",
|
||||
"Basic analytics",
|
||||
"48-hour support response time",
|
||||
],
|
||||
mostPopular: false,
|
||||
},
|
||||
{
|
||||
name: "Run it yourself",
|
||||
id: "tier-startup",
|
||||
href: "#",
|
||||
price: { monthly: "$0", annually: "$288" },
|
||||
description: "A plan that scales with your rapidly growing business.",
|
||||
features: [
|
||||
"25 products",
|
||||
"Up to 10,000 subscribers",
|
||||
"Advanced analytics",
|
||||
"24-hour support response time",
|
||||
"Marketing automations",
|
||||
],
|
||||
mostPopular: true,
|
||||
},
|
||||
{
|
||||
name: "Rent Cloud GPUs",
|
||||
id: "tier-enterprise",
|
||||
href: "#",
|
||||
price: { monthly: "$40", annually: "$576" },
|
||||
description: "Dedicated support and infrastructure for your company.",
|
||||
features: [
|
||||
"Unlimited products",
|
||||
"Unlimited subscribers",
|
||||
"Advanced analytics",
|
||||
"1-hour, dedicated support response time",
|
||||
"Marketing automations",
|
||||
"Custom reporting tools",
|
||||
],
|
||||
mostPopular: false,
|
||||
},
|
||||
];
|
||||
|
||||
function classNames(...classes) {
|
||||
return classes.filter(Boolean).join(" ");
|
||||
}
|
||||
|
||||
export default function Example() {
|
||||
const [frequency, setFrequency] = useState(frequencies[0]);
|
||||
|
||||
return (
|
||||
<div className="bg-white py-24 sm:py-32">
|
||||
<div className="mx-auto max-w-7xl px-6 lg:px-8">
|
||||
<div className="mx-auto max-w-4xl text-center">
|
||||
<h2 className="text-base font-semibold leading-7 text-indigo-600">
|
||||
AI on your own hardware means
|
||||
</h2>
|
||||
<p className="mt-2 text-4xl font-bold tracking-tight text-gray-900 sm:text-5xl">
|
||||
Unlimited Use
|
||||
</p>
|
||||
</div>
|
||||
<p className="mx-auto mt-6 max-w-2xl text-center text-lg leading-8 text-gray-600">
|
||||
No uncontrolled cloud spending. No hidden fees. No limits.
|
||||
</p>
|
||||
{/* <div className="mt-16 flex justify-center">
|
||||
<RadioGroup
|
||||
value={frequency}
|
||||
onChange={setFrequency}
|
||||
className="grid grid-cols-2 gap-x-1 rounded-full p-1 text-center text-xs font-semibold leading-5 ring-1 ring-inset ring-gray-200"
|
||||
>
|
||||
<RadioGroup.Label className="sr-only">
|
||||
Payment frequency
|
||||
</RadioGroup.Label>
|
||||
{frequencies.map((option) => (
|
||||
<RadioGroup.Option
|
||||
key={option.value}
|
||||
value={option}
|
||||
className={({ checked }) =>
|
||||
classNames(
|
||||
checked ? "bg-indigo-600 text-white" : "text-gray-500",
|
||||
"cursor-pointer rounded-full px-2.5 py-1"
|
||||
)
|
||||
}
|
||||
>
|
||||
<span>{option.label}</span>
|
||||
</RadioGroup.Option>
|
||||
))}
|
||||
</RadioGroup>
|
||||
</div> */}
|
||||
<div className="isolate mx-auto mt-10 grid max-w-md grid-cols-1 gap-8 lg:mx-0 lg:max-w-none lg:grid-cols-3">
|
||||
{tiers.map((tier) => (
|
||||
<div
|
||||
key={tier.id}
|
||||
className={classNames(
|
||||
tier.mostPopular
|
||||
? "ring-2 ring-indigo-600"
|
||||
: "ring-1 ring-gray-200",
|
||||
"rounded-3xl p-8 xl:p-10"
|
||||
)}
|
||||
>
|
||||
<div className="flex items-center justify-between gap-x-4">
|
||||
<h3
|
||||
id={tier.id}
|
||||
className={classNames(
|
||||
tier.mostPopular ? "text-indigo-600" : "text-gray-900",
|
||||
"text-lg font-semibold leading-8"
|
||||
)}
|
||||
>
|
||||
{tier.name}
|
||||
</h3>
|
||||
{tier.mostPopular ? (
|
||||
<p className="rounded-full bg-indigo-600/10 px-2.5 py-1 text-xs font-semibold leading-5 text-indigo-600">
|
||||
Fully private
|
||||
</p>
|
||||
) : null}
|
||||
</div>
|
||||
<p className="mt-4 text-sm leading-6 text-gray-600">
|
||||
{tier.description}
|
||||
</p>
|
||||
<p className="mt-6 flex items-baseline gap-x-1">
|
||||
<span className="text-4xl font-bold tracking-tight text-gray-900">
|
||||
{tier.price[frequency.value]}
|
||||
</span>
|
||||
<span className="text-sm font-semibold leading-6 text-gray-600">
|
||||
{frequency.priceSuffix}
|
||||
</span>
|
||||
</p>
|
||||
{/* <a
|
||||
href={tier.href}
|
||||
aria-describedby={tier.id}
|
||||
className={classNames(
|
||||
tier.mostPopular
|
||||
? "bg-indigo-600 text-white shadow-sm hover:bg-indigo-500"
|
||||
: "text-indigo-600 ring-1 ring-inset ring-indigo-200 hover:ring-indigo-300",
|
||||
"mt-6 block rounded-md py-2 px-3 text-center text-sm font-semibold leading-6 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-indigo-600"
|
||||
)}
|
||||
>
|
||||
Buy plan
|
||||
</a> */}
|
||||
<ul
|
||||
role="list"
|
||||
className="mt-8 space-y-3 text-sm leading-6 text-gray-600 xl:mt-10"
|
||||
>
|
||||
{tier.features.map((feature) => (
|
||||
<li key={feature} className="flex gap-x-3">
|
||||
<CheckIcon
|
||||
className="h-6 w-5 flex-none text-indigo-600"
|
||||
aria-hidden="true"
|
||||
/>
|
||||
{feature}
|
||||
</li>
|
||||
))}
|
||||
</ul>
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
@ -1,82 +0,0 @@
|
||||
import React from "react";
|
||||
import {
|
||||
CircleStackIcon,
|
||||
CloudArrowUpIcon,
|
||||
CursorArrowRaysIcon,
|
||||
HomeIcon,
|
||||
LockClosedIcon,
|
||||
RocketLaunchIcon,
|
||||
ServerIcon,
|
||||
} from "@heroicons/react/20/solid";
|
||||
import { useColorMode } from "@docusaurus/theme-common";
|
||||
|
||||
const features = [
|
||||
{
|
||||
name: "Data Security and Privacy.",
|
||||
description:
|
||||
"Jan runs locally on your machine. Your data never leaves your computer. You can even run Jan offline.",
|
||||
icon: CloudArrowUpIcon,
|
||||
},
|
||||
{
|
||||
name: "Cross Device Compatible.",
|
||||
description:
|
||||
"Jan runs Nitro, a C++ inference engine, that is compatible with all major operating systems (CPU and GPU).",
|
||||
icon: LockClosedIcon,
|
||||
},
|
||||
{
|
||||
name: "Audit & compliance.",
|
||||
description: "Coming soon.",
|
||||
icon: ServerIcon,
|
||||
},
|
||||
];
|
||||
|
||||
export default function sectionTwo() {
|
||||
const { colorMode } = useColorMode();
|
||||
return (
|
||||
<div className="overflow-hidden bg-white dark:bg-gray-900 py-24 sm:py-32">
|
||||
<div className="mx-auto max-w-7xl px-6 lg:px-8">
|
||||
<div className="mx-auto grid max-w-2xl grid-cols-1 gap-x-8 gap-y-16 sm:gap-y-20 lg:mx-0 lg:max-w-none lg:grid-cols-2">
|
||||
<div className="lg:pr-8 lg:pt-4">
|
||||
<div className="lg:max-w-lg">
|
||||
<h2 className="text-base font-semibold leading-7 text-indigo-600 dark:text-indigo-400">
|
||||
Jan gives you
|
||||
</h2>
|
||||
<p className="mt-2 text-3xl font-bold tracking-tight text-gray-900 dark:text-white sm:text-4xl">
|
||||
AI that you control
|
||||
</p>
|
||||
<p className="mt-6 text-lg leading-8 text-gray-600 dark:text-gray-300">
|
||||
Jan is a source-available, cross device, and privacy focused AI
|
||||
engine and Desktop app that runs locally on your machine.
|
||||
</p>
|
||||
<dl className="mt-10 max-w-xl space-y-8 text-base leading-7 text-gray-600 dark:text-gray-300 lg:max-w-none">
|
||||
{features.map((feature) => (
|
||||
<div key={feature.name} className="relative pl-9">
|
||||
<dt className="inline font-semibold text-gray-900 dark:text-white">
|
||||
<feature.icon
|
||||
className="absolute left-1 top-1 h-5 w-5 text-indigo-600 dark:text-indigo-400"
|
||||
aria-hidden="true"
|
||||
/>
|
||||
{feature.name}
|
||||
</dt>{" "}
|
||||
<dt>{feature.description}</dt>
|
||||
</div>
|
||||
))}
|
||||
</dl>
|
||||
</div>
|
||||
</div>
|
||||
<img
|
||||
src={
|
||||
colorMode === "dark"
|
||||
? // TODO replace with darkmode image
|
||||
require("@site/static/img/desktop-model-settings-dark.png").default
|
||||
: require("@site/static/img/desktop-model-settings-light.png").default
|
||||
}
|
||||
alt="Product screenshot"
|
||||
className="w-[48rem] max-w-none rounded-xl shadow-xl ring-1 ring-gray-400/10 sm:w-[57rem] md:-ml-4 lg:-ml-0"
|
||||
width={2432}
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
@ -1,11 +0,0 @@
|
||||
.features {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
padding: 2rem 0;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.featureSvg {
|
||||
height: 200px;
|
||||
width: 200px;
|
||||
}
|
||||
@ -1,46 +0,0 @@
|
||||
@tailwind base;
|
||||
@tailwind components;
|
||||
@tailwind utilities;
|
||||
|
||||
/**
|
||||
* Any CSS included here will be global. The classic template
|
||||
* bundles Infima by default. Infima is a CSS framework designed to
|
||||
* work well for content-centric websites.
|
||||
*/
|
||||
|
||||
/* You can override the default Infima variables here.
|
||||
Full list of Infima variables: https://github.com/facebook/docusaurus/issues/3955#issuecomment-1521944593
|
||||
*/
|
||||
:root {
|
||||
--ifm-color-primary: #2563EB; /* New Primary Blue */
|
||||
--ifm-color-primary-dark: #204FCF; /* Darker Blue */
|
||||
--ifm-color-primary-darker: #1B45B7; /* Even Darker Blue */
|
||||
--ifm-color-primary-darkest: #163C9D; /* Darkest Blue */
|
||||
--ifm-color-primary-light: #2974FF; /* Light Blue */
|
||||
--ifm-color-primary-lighter: #3280FF; /* Lighter Blue */
|
||||
--ifm-color-primary-lightest: #3A8BFF; /* Lightest Blue */
|
||||
--ifm-code-font-size: 95%;
|
||||
--docusaurus-highlighted-code-line-bg: rgba(0, 0, 0, 0.1);
|
||||
}
|
||||
|
||||
/* For readability concerns, you should choose a lighter palette in dark mode. */
|
||||
[data-theme="dark"] {
|
||||
--ifm-color-primary: #ffffff; /* New Primary Blue */
|
||||
--ifm-color-primary-dark: #204FCF; /* Darker Blue */
|
||||
--ifm-color-primary-darker: #1B45B7; /* Even Darker Blue */
|
||||
--ifm-color-primary-darkest: #163C9D; /* Darkest Blue */
|
||||
--ifm-color-primary-light: #2974FF; /* Light Blue */
|
||||
--ifm-color-primary-lighter: #3280FF; /* Lighter Blue */
|
||||
--ifm-color-primary-lightest: #3A8BFF; /* Lightest Blue */
|
||||
--docusaurus-highlighted-code-line-bg: rgba(0, 0, 0, 0.3);
|
||||
}
|
||||
|
||||
.footer.footer--dark {
|
||||
--ifm-footer-background-color: #1a212f;
|
||||
--ifm-footer-color: var(--ifm-footer-link-color);
|
||||
--ifm-footer-link-color: var(--ifm-color-secondary);
|
||||
--ifm-footer-title-color: var(--ifm-color-white);
|
||||
|
||||
background-color: var(--ifm-footer-background-color);
|
||||
color: var(--ifm-footer-color)
|
||||
}
|
||||
34
docs/src/hooks/useAppRelease.js
Normal file
34
docs/src/hooks/useAppRelease.js
Normal file
@ -0,0 +1,34 @@
|
||||
import React, { useEffect, useState } from "react";
|
||||
|
||||
import axios from "axios";
|
||||
|
||||
import { isAxiosError } from "axios";
|
||||
|
||||
export const useAppRelease = () => {
|
||||
const [release, setRelease] = useState({
|
||||
tagVersion: "",
|
||||
});
|
||||
|
||||
useEffect(() => {
|
||||
const updateStargazers = async () => {
|
||||
try {
|
||||
const { data } =
|
||||
(await axios.get) <
|
||||
{
|
||||
tag_name: string,
|
||||
} >
|
||||
"https://api.github.com/repos/janhq/jan/releases/latest";
|
||||
setRelease({
|
||||
tagVersion: data.tag_name,
|
||||
});
|
||||
} catch (error) {
|
||||
if (isAxiosError(error)) {
|
||||
console.error("Failed to get stargazers:", error);
|
||||
}
|
||||
}
|
||||
};
|
||||
updateStargazers();
|
||||
}, []);
|
||||
|
||||
return { release };
|
||||
};
|
||||
30
docs/src/hooks/useAppStars.js
Normal file
30
docs/src/hooks/useAppStars.js
Normal file
@ -0,0 +1,30 @@
|
||||
import React, { useEffect, useState } from "react";
|
||||
|
||||
import axios from "axios";
|
||||
import { isAxiosError } from "axios";
|
||||
|
||||
export const useAppStars = () => {
|
||||
const [stargazers, setStargazers] = useState({
|
||||
count: 0,
|
||||
});
|
||||
|
||||
useEffect(() => {
|
||||
const updateStargazers = async () => {
|
||||
try {
|
||||
const { data } = await axios.get(
|
||||
"https://api.github.com/repos/janhq/jan"
|
||||
);
|
||||
setStargazers({
|
||||
count: data.stargazers_count,
|
||||
});
|
||||
} catch (error) {
|
||||
if (isAxiosError(error)) {
|
||||
console.error("Failed to get stargazers:", error);
|
||||
}
|
||||
}
|
||||
};
|
||||
updateStargazers();
|
||||
}, []);
|
||||
|
||||
return { stargazers };
|
||||
};
|
||||
@ -1,32 +1,160 @@
|
||||
import React from "react";
|
||||
import Dropdown from "@site/src/components/Elements/dropdown";
|
||||
import useDocusaurusContext from "@docusaurus/useDocusaurusContext";
|
||||
import Layout from "@theme/Layout";
|
||||
import {
|
||||
HomepageHero,
|
||||
HomepageBanner,
|
||||
HomepageSectionOne,
|
||||
HomepageSectionTwo,
|
||||
HomepageSectionThree,
|
||||
HomepageDownloads,
|
||||
} from "@site/src/components/Homepage";
|
||||
|
||||
import styles from "./index.module.css";
|
||||
import useBaseUrl from "@docusaurus/useBaseUrl";
|
||||
import Layout from "@theme/Layout";
|
||||
import AnnoncementBanner from "@site/src/components/Announcement";
|
||||
import {
|
||||
CloudArrowUpIcon,
|
||||
CursorArrowRaysIcon,
|
||||
ShieldCheckIcon,
|
||||
CpuChipIcon,
|
||||
ClipboardDocumentIcon,
|
||||
CubeTransparentIcon,
|
||||
} from "@heroicons/react/24/outline";
|
||||
|
||||
import ThemedImage from "@theme/ThemedImage";
|
||||
|
||||
const features = [
|
||||
{
|
||||
name: "1 Click Installs.",
|
||||
desc: "Llama2, MPT, CodeLlama, and more. 1 click to install the latest and greatest models directly from HuggingFace. Or easily upload your own models.",
|
||||
icon: CursorArrowRaysIcon,
|
||||
},
|
||||
{
|
||||
name: "Model Management.",
|
||||
desc: "Configure advanced settings for each model. Manage your model versions. Easily switch between models. Get visibility into hardware performance.",
|
||||
icon: CubeTransparentIcon,
|
||||
},
|
||||
{
|
||||
name: "Cloud AI Compatible.",
|
||||
desc: "Connect to ChatGPT, Claude via an API key. Alternatively, host your own AI server on any GPU cloud and use it from the app.",
|
||||
icon: CloudArrowUpIcon,
|
||||
},
|
||||
{
|
||||
name: "Data Security and Privacy.",
|
||||
desc: "Jan runs locally on your machine. Your data never leaves your computer. You can even run Jan offline.",
|
||||
icon: ShieldCheckIcon,
|
||||
},
|
||||
{
|
||||
name: "Cross Device Compatible.",
|
||||
desc: "Jan runs Nitro, a C++ inference engine, that is compatible with all major operating systems (CPU and GPU).",
|
||||
icon: CpuChipIcon,
|
||||
},
|
||||
{
|
||||
name: "Audit & compliance.",
|
||||
desc: "Coming soon.",
|
||||
icon: ClipboardDocumentIcon,
|
||||
},
|
||||
];
|
||||
|
||||
export default function Home() {
|
||||
const { siteConfig } = useDocusaurusContext();
|
||||
return (
|
||||
<Layout
|
||||
title={`${siteConfig.tagline}`}
|
||||
description="Description will go into a meta tag in <head />"
|
||||
>
|
||||
{/* <HomepageBanner /> */}
|
||||
<main className={styles.main}>
|
||||
<HomepageHero />
|
||||
<HomepageSectionOne />
|
||||
<HomepageSectionTwo />
|
||||
{/* <HomepageSectionThree />
|
||||
<HomepageDownloads /> */}
|
||||
</main>
|
||||
</Layout>
|
||||
<>
|
||||
<AnnoncementBanner />
|
||||
<Layout
|
||||
title={`${siteConfig.tagline}`}
|
||||
description="Description will go into a meta tag in <head />"
|
||||
>
|
||||
<main className="bg-gray-50 dark:bg-gray-950/95 relative">
|
||||
<div className="relative">
|
||||
<ThemedImage
|
||||
alt="App screenshot"
|
||||
sources={{
|
||||
light: useBaseUrl("/img/bg-hero-light.svg"),
|
||||
dark: useBaseUrl("/img/bg-hero-dark.svg"),
|
||||
}}
|
||||
className="absolute w-full h-full opacity-30 dark:opacity-20 top-0 object-cover blur-3xl"
|
||||
/>
|
||||
<div className="container py-16">
|
||||
<div className="grid grid-cols-1 lg:grid-cols-2 items-center gap-4">
|
||||
<div className="relative z-10 text-center lg:text-left ">
|
||||
<div className="bg-red-50 mb-4 inline-flex items-center py-1 rounded-full px-4 gap-x-2">
|
||||
<span className="font-bold uppercase text-blue-600">
|
||||
Event
|
||||
</span>
|
||||
<a href="/events/hcmc-oct23">
|
||||
<p className="font-bold">
|
||||
Jan's AI Hacker House (Ho Chi Minh City)
|
||||
</p>
|
||||
</a>
|
||||
</div>
|
||||
|
||||
<h1 className="bg-gradient-to-r dark:from-white from-black to-gray-500 dark:to-gray-400 bg-clip-text text-4xl lg:text-6xl font-bold leading-tight text-transparent dark:text-transparent lg:leading-tight">
|
||||
Run Your Own AI
|
||||
</h1>
|
||||
<p className="text-xl leading-relaxed lg:text-2xl lg:leading-relaxed text-gray-500 dark:text-gray-400">
|
||||
Run large Language Models locally on
|
||||
<span className="dark:text-white text-black">Macbook</span>
|
||||
,
|
||||
<span className="dark:text-white text-black">Windows</span>
|
||||
or
|
||||
<span className="dark:text-white text-black">Linux</span>.
|
||||
</p>
|
||||
|
||||
<div className="my-6 flex flex-col-reverse md:flex-row items-center justify-center lg:justify-start gap-4 relative z-20">
|
||||
<button
|
||||
type="button"
|
||||
className="cursor-pointer relative hidden md:inline-flex items-center px-4 py-2.5 text-base font-semibold rounded-lg border border-gray-400 dark:border-gray-700 text-gray-600 dark:text-white"
|
||||
onClick={() =>
|
||||
window.open(
|
||||
"https://github.com/janhq/jan",
|
||||
"_blank",
|
||||
"noreferrer"
|
||||
)
|
||||
}
|
||||
>
|
||||
View Github
|
||||
</button>
|
||||
<Dropdown />
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div className="text-center relative lg:w-[120%] lg:-left-36">
|
||||
<div className="el-blur-hero absolute -left-40 w-full top-1/2 -translate-y-1/2" />
|
||||
<div className="p-3 border dark:border-gray-500 border-gray-400 inline-block rounded-lg relative z-10">
|
||||
<ThemedImage
|
||||
alt="App screenshot"
|
||||
sources={{
|
||||
light: useBaseUrl("/img/desktop-llm-chat-light.png"),
|
||||
dark: useBaseUrl("/img/desktop-llm-chat-dark.png"),
|
||||
}}
|
||||
width={1800}
|
||||
className="rounded-md mx-auto"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div className="container mt-10 mb-20 text-center">
|
||||
<h2>AI that you control</h2>
|
||||
<p className="text-base mt-2 w-full lg:w-2/5 mx-auto leading-relaxed">
|
||||
Jan is a source-available, cross device, and privacy focused AI
|
||||
engine and Desktop app that runs locally on your machine.
|
||||
</p>
|
||||
<div className="grid text-left lg:grid-cols-3 mt-16 gap-8">
|
||||
{features.map((feat, i) => {
|
||||
return (
|
||||
<div className="flex gap-x-4" key={i}>
|
||||
<feat.icon
|
||||
className="h-6 w-6 text-indigo-600 dark:text-indigo-400 flex-shrink-0"
|
||||
aria-hidden="true"
|
||||
/>
|
||||
<div>
|
||||
<h6>{feat.name}</h6>
|
||||
<p className="mt-2">{feat.desc}</p>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
})}
|
||||
</div>
|
||||
</div>
|
||||
</main>
|
||||
</Layout>
|
||||
</>
|
||||
);
|
||||
}
|
||||
|
||||
@ -1,23 +0,0 @@
|
||||
/**
|
||||
* CSS files with the .module.css suffix will be treated as CSS modules
|
||||
* and scoped locally.
|
||||
*/
|
||||
|
||||
/* .heroBanner {
|
||||
padding: 4rem 0;
|
||||
text-align: center;
|
||||
position: relative;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
@media screen and (max-width: 996px) {
|
||||
.heroBanner {
|
||||
padding: 2rem;
|
||||
}
|
||||
}
|
||||
|
||||
.buttons {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
} */
|
||||
45
docs/src/styles/base.scss
Normal file
45
docs/src/styles/base.scss
Normal file
@ -0,0 +1,45 @@
|
||||
@layer base {
|
||||
html {
|
||||
@apply scroll-smooth;
|
||||
}
|
||||
html[data-theme="light"] {
|
||||
--ifm-background-color: white;
|
||||
--ifm-color-primary: #2563eb; /* New Primary Blue */
|
||||
--ifm-color-primary-dark: #204fcf; /* Darker Blue */
|
||||
--ifm-color-primary-darker: #1b45b7; /* Even Darker Blue */
|
||||
--ifm-color-primary-darkest: #163c9d; /* Darkest Blue */
|
||||
--ifm-color-primary-light: #2974ff; /* Light Blue */
|
||||
--ifm-color-primary-lighter: #3280ff; /* Lighter Blue */
|
||||
--ifm-color-primary-lightest: #3a8bff; /* Lightest Blue */
|
||||
--ifm-code-font-size: 95%;
|
||||
--ifm-navbar-link-hover-color: inherit;
|
||||
--docusaurus-highlighted-code-line-bg: rgba(0, 0, 0, 0.1);
|
||||
}
|
||||
html[data-theme="dark"] {
|
||||
--ifm-background-color: black;
|
||||
--ifm-color-primary: #ffffff; /* New Primary Blue */
|
||||
--ifm-color-primary-dark: #204fcf; /* Darker Blue */
|
||||
--ifm-color-primary-darker: #1b45b7; /* Even Darker Blue */
|
||||
--ifm-color-primary-darkest: #163c9d; /* Darkest Blue */
|
||||
--ifm-color-primary-light: #2974ff; /* Light Blue */
|
||||
--ifm-color-primary-lighter: #3280ff; /* Lighter Blue */
|
||||
--ifm-color-primary-lightest: #3a8bff; /* Lightest Blue */
|
||||
--docusaurus-highlighted-code-line-bg: rgba(0, 0, 0, 0.3);
|
||||
}
|
||||
body {
|
||||
@apply text-sm;
|
||||
@apply antialiased;
|
||||
@apply bg-white dark:bg-black;
|
||||
@apply text-gray-700 dark:text-gray-500;
|
||||
}
|
||||
img {
|
||||
pointer-events: none;
|
||||
}
|
||||
|
||||
a {
|
||||
&:hover {
|
||||
color: inherit;
|
||||
text-decoration: none;
|
||||
}
|
||||
}
|
||||
}
|
||||
18
docs/src/styles/components.scss
Normal file
18
docs/src/styles/components.scss
Normal file
@ -0,0 +1,18 @@
|
||||
@layer components {
|
||||
.el-blur-hero {
|
||||
height: 200px;
|
||||
background: linear-gradient(
|
||||
180deg,
|
||||
hsl(296, 100%, 67%) 0%,
|
||||
hsl(253, 100%, 57%) 100%
|
||||
);
|
||||
z-index: 2;
|
||||
border-bottom-left-radius: 100%;
|
||||
border-bottom-right-radius: 100%;
|
||||
border-top-left-radius: 100%;
|
||||
border-top-right-radius: 100%;
|
||||
filter: blur(100px);
|
||||
-webkit-filter: blur(100px);
|
||||
opacity: 0.5;
|
||||
}
|
||||
}
|
||||
8
docs/src/styles/main.scss
Normal file
8
docs/src/styles/main.scss
Normal file
@ -0,0 +1,8 @@
|
||||
@import 'tailwindcss/base';
|
||||
@import 'tailwindcss/components';
|
||||
@import 'tailwindcss/utilities';
|
||||
|
||||
@import './typography.scss';
|
||||
@import './tweaks.scss';
|
||||
@import './base.scss';
|
||||
@import './components.scss';
|
||||
86
docs/src/styles/tweaks.scss
Normal file
86
docs/src/styles/tweaks.scss
Normal file
@ -0,0 +1,86 @@
|
||||
.redocusaurus {
|
||||
div[data-section-id] {
|
||||
min-height: auto;
|
||||
}
|
||||
}
|
||||
|
||||
.col.docItemCol_node_modules-\@docusaurus-theme-classic-lib-theme-DocItem-Layout-styles-module {
|
||||
@apply p-4 lg:px-16 lg:py-4;
|
||||
}
|
||||
|
||||
.breadcrumbsContainer_node_modules-\@docusaurus-theme-classic-lib-theme-DocBreadcrumbs-styles-module {
|
||||
margin-bottom: 40px !important;
|
||||
}
|
||||
|
||||
.theme-doc-footer {
|
||||
margin-top: 40px;
|
||||
margin-bottom: 20px;
|
||||
}
|
||||
|
||||
.menu.thin-scrollbar {
|
||||
padding: 32px 10px;
|
||||
}
|
||||
|
||||
.iconExternalLink_node_modules-\@docusaurus-theme-classic-lib-theme-Icon-ExternalLink-styles-module {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.navbar {
|
||||
@apply px-0 lg:h-16 border-b border-gray-200 dark:border-gray-800 bg-white/50 backdrop-blur-lg dark:bg-black/50 shadow-none;
|
||||
|
||||
.navbar__toggle {
|
||||
width: 24px;
|
||||
}
|
||||
|
||||
.navbar-sidebar__backdrop {
|
||||
height: 100dvh;
|
||||
}
|
||||
|
||||
.navbar-sidebar {
|
||||
height: 100dvh;
|
||||
.navbar-sidebar__close {
|
||||
width: 14px;
|
||||
}
|
||||
// .toggle_node_modules-\@docusaurus-theme-classic-lib-theme-ColorModeToggle-styles-module {
|
||||
// width: 24px;
|
||||
// height: 24px;
|
||||
// }
|
||||
}
|
||||
|
||||
.navbar__title {
|
||||
@apply text-lg;
|
||||
}
|
||||
.navbar__brand {
|
||||
margin-right: 24px;
|
||||
&:hover {
|
||||
color: inherit;
|
||||
}
|
||||
}
|
||||
.navbar__inner {
|
||||
@apply container;
|
||||
}
|
||||
}
|
||||
|
||||
.breadcrumbs__item {
|
||||
position: relative;
|
||||
&:first-child {
|
||||
.breadcrumbs__link {
|
||||
vertical-align: middle;
|
||||
margin-top: -2px;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.docMainContainer_node_modules-\@docusaurus-theme-classic-lib-theme-DocPage-Layout-Main-styles-module,
|
||||
.docSidebarContainer_node_modules-\@docusaurus-theme-classic-lib-theme-DocPage-Layout-Sidebar-styles-module {
|
||||
@apply bg-gray-50 dark:bg-gray-950/95;
|
||||
}
|
||||
|
||||
.navbar-sidebar {
|
||||
@apply bg-gray-50 dark:bg-gray-900;
|
||||
}
|
||||
|
||||
.docSidebarContainer_node_modules-\@docusaurus-theme-classic-lib-theme-DocPage-Layout-Sidebar-styles-module,
|
||||
.table-of-contents__left-border {
|
||||
@apply border-gray-200 dark:border-gray-800;
|
||||
}
|
||||
42
docs/src/styles/typography.scss
Normal file
42
docs/src/styles/typography.scss
Normal file
@ -0,0 +1,42 @@
|
||||
h1,
|
||||
.h1 {
|
||||
line-height: 48px;
|
||||
font-size: 40px;
|
||||
@apply font-bold text-black dark:text-white;
|
||||
}
|
||||
h2,
|
||||
.h2 {
|
||||
font-size: 32px;
|
||||
@apply font-bold text-black dark:text-white;
|
||||
line-height: 40px;
|
||||
}
|
||||
h3,
|
||||
.h3 {
|
||||
font-size: 28px;
|
||||
@apply font-bold text-black dark:text-white;
|
||||
line-height: 40px;
|
||||
}
|
||||
h4,
|
||||
.h4 {
|
||||
font-size: 24px;
|
||||
@apply font-bold text-black dark:text-white;
|
||||
line-height: 32px;
|
||||
}
|
||||
h5,
|
||||
.h5 {
|
||||
font-size: 20px;
|
||||
@apply font-bold text-black dark:text-white;
|
||||
line-height: 28px;
|
||||
}
|
||||
h6,
|
||||
.h6 {
|
||||
font-size: 16px;
|
||||
@apply font-bold text-black dark:text-white;
|
||||
line-height: 24px;
|
||||
}
|
||||
p {
|
||||
line-height: 24px;
|
||||
}
|
||||
.paragraph {
|
||||
line-height: 24px;
|
||||
}
|
||||
21
docs/src/theme/Layout/Provider/index.js
Normal file
21
docs/src/theme/Layout/Provider/index.js
Normal file
@ -0,0 +1,21 @@
|
||||
import React from "react";
|
||||
import { composeProviders } from "@docusaurus/theme-common";
|
||||
import {
|
||||
ColorModeProvider,
|
||||
AnnouncementBarProvider,
|
||||
DocsPreferredVersionContextProvider,
|
||||
ScrollControllerProvider,
|
||||
NavbarProvider,
|
||||
PluginHtmlClassNameProvider,
|
||||
} from "@docusaurus/theme-common/internal";
|
||||
const Provider = composeProviders([
|
||||
ColorModeProvider,
|
||||
AnnouncementBarProvider,
|
||||
ScrollControllerProvider,
|
||||
DocsPreferredVersionContextProvider,
|
||||
PluginHtmlClassNameProvider,
|
||||
NavbarProvider,
|
||||
]);
|
||||
export default function LayoutProvider({ children }) {
|
||||
return <Provider>{children}</Provider>;
|
||||
}
|
||||
53
docs/src/theme/Layout/index.js
Normal file
53
docs/src/theme/Layout/index.js
Normal file
@ -0,0 +1,53 @@
|
||||
import React from "react";
|
||||
import clsx from "clsx";
|
||||
import ErrorBoundary from "@docusaurus/ErrorBoundary";
|
||||
import {
|
||||
PageMetadata,
|
||||
SkipToContentFallbackId,
|
||||
ThemeClassNames,
|
||||
} from "@docusaurus/theme-common";
|
||||
import { useKeyboardNavigation } from "@docusaurus/theme-common/internal";
|
||||
import SkipToContent from "@theme/SkipToContent";
|
||||
import AnnouncementBar from "@theme/AnnouncementBar";
|
||||
import Navbar from "@theme/Navbar";
|
||||
import Footer from "@site/src/components/Footer";
|
||||
import LayoutProvider from "@theme/Layout/Provider";
|
||||
import ErrorPageContent from "@theme/ErrorPageContent";
|
||||
import styles from "./styles.module.scss";
|
||||
export default function Layout(props) {
|
||||
const {
|
||||
children,
|
||||
noFooter,
|
||||
wrapperClassName,
|
||||
// Not really layout-related, but kept for convenience/retro-compatibility
|
||||
title,
|
||||
description,
|
||||
} = props;
|
||||
useKeyboardNavigation();
|
||||
return (
|
||||
<LayoutProvider>
|
||||
<PageMetadata title={title} description={description} />
|
||||
|
||||
<SkipToContent />
|
||||
|
||||
<AnnouncementBar />
|
||||
|
||||
<Navbar />
|
||||
|
||||
<div
|
||||
id={SkipToContentFallbackId}
|
||||
className={clsx(
|
||||
ThemeClassNames.wrapper.main,
|
||||
styles.mainWrapper,
|
||||
wrapperClassName
|
||||
)}
|
||||
>
|
||||
<ErrorBoundary fallback={(params) => <ErrorPageContent {...params} />}>
|
||||
{children}
|
||||
</ErrorBoundary>
|
||||
</div>
|
||||
|
||||
{!noFooter && <Footer />}
|
||||
</LayoutProvider>
|
||||
);
|
||||
}
|
||||
21
docs/src/theme/Layout/styles.module.scss
Normal file
21
docs/src/theme/Layout/styles.module.scss
Normal file
@ -0,0 +1,21 @@
|
||||
html,
|
||||
body {
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
.mainWrapper {
|
||||
flex: 1 0 auto;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
}
|
||||
|
||||
/* Docusaurus-specific utility class */
|
||||
:global(.docusaurus-mt-lg) {
|
||||
margin-top: 3rem;
|
||||
}
|
||||
|
||||
:global(#__docusaurus) {
|
||||
min-height: 100%;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
}
|
||||
167
docs/static/img/bg-hero-dark.svg
vendored
Normal file
167
docs/static/img/bg-hero-dark.svg
vendored
Normal file
@ -0,0 +1,167 @@
|
||||
<svg width="1440" height="900" viewBox="0 0 1440 900" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<mask id="mask0_68_822" style="mask-type:alpha" maskUnits="userSpaceOnUse" x="0" y="0" width="1440" height="900">
|
||||
<rect width="1440" height="900" fill="#C4C4C4"/>
|
||||
</mask>
|
||||
<g mask="url(#mask0_68_822)">
|
||||
<rect x="-66" y="-0.478027" width="1572" height="950.938" fill="#2F307D"/>
|
||||
<g filter="url(#filter0_f_68_822)">
|
||||
<path d="M-57.8301 396.173L744.277 -13.1623L1108.87 -13.1624L1555.07 95.9939L-9.21778 706.098L-57.8301 396.173Z" fill="url(#paint0_linear_68_822)"/>
|
||||
</g>
|
||||
<g filter="url(#filter1_f_68_822)">
|
||||
<path d="M-101.107 383.634L800.122 -0.623145L1108.87 -13.1624L1555.07 95.9939L-9.21663 706.098L-101.107 383.634Z" fill="url(#paint1_linear_68_822)"/>
|
||||
</g>
|
||||
<g filter="url(#filter2_f_68_822)">
|
||||
<ellipse cx="329.847" cy="107.571" rx="329.847" ry="107.571" transform="matrix(0.914846 -0.403803 0.330497 0.943807 508.14 342.034)" fill="#E73800"/>
|
||||
</g>
|
||||
<g filter="url(#filter3_f_68_822)">
|
||||
<path d="M673.463 29.4612C498.517 54.805 280.304 103.381 65.8544 29.4612C54.5674 23.8293 45.914 29.8836 101.596 99.1566C171.198 185.748 398.816 149.844 673.463 29.4612Z" fill="#4463B1"/>
|
||||
</g>
|
||||
<g opacity="0.4" filter="url(#filter4_f_68_822)">
|
||||
<path d="M609.751 41.4427C470.997 61.5436 297.927 100.07 127.841 41.4427C118.889 36.9759 112.026 41.7777 156.188 96.72C211.392 165.398 391.922 136.922 609.751 41.4427Z" fill="#4463B1"/>
|
||||
</g>
|
||||
<path d="M683.23 327.829C1018.31 164.095 1157.2 156.298 1478.39 218.673L1584.3 429.188L35.639 906.746C7.28175 901.548 89.4594 770.301 313.426 571.481C355.643 534.003 348.151 491.563 683.23 327.829Z" fill="url(#paint2_linear_68_822)"/>
|
||||
<g opacity="0.7" filter="url(#filter5_f_68_822)">
|
||||
<path d="M898.979 256.588C1242.14 115.511 1157.2 156.298 1478.39 218.673L1584.3 429.189L47.792 902.848C19.4347 897.65 -12.9736 787.454 84.2516 629.958C205.783 433.087 499.515 420.813 898.979 256.588Z" fill="#4463B1"/>
|
||||
</g>
|
||||
<g filter="url(#filter6_f_68_822)">
|
||||
<path d="M806.495 345.372C1198.82 247.081 1179.04 156.299 1534.2 218.674L1584.3 429.189L-114.729 902.848C-146.086 897.65 -181.922 787.454 -74.4129 629.958C59.9733 433.087 510.846 419.442 806.495 345.372Z" fill="#4463B1"/>
|
||||
</g>
|
||||
<g filter="url(#filter7_f_68_822)">
|
||||
<ellipse cx="329.847" cy="107.571" rx="329.847" ry="107.571" transform="matrix(0.914846 -0.403803 0.330497 0.943807 -67.2598 503.045)" fill="#4463B1"/>
|
||||
</g>
|
||||
<g opacity="0.4" filter="url(#filter8_f_68_822)">
|
||||
<ellipse cx="329.847" cy="156.166" rx="329.847" ry="156.166" transform="matrix(0.914846 -0.403803 0.330497 0.943807 437.842 560.226)" fill="#4463B1"/>
|
||||
</g>
|
||||
<g filter="url(#filter9_f_68_822)">
|
||||
<ellipse cx="329.847" cy="107.571" rx="329.847" ry="107.571" transform="matrix(0.914846 -0.403803 0.330497 0.943807 980.781 431.732)" fill="#3A78F0"/>
|
||||
</g>
|
||||
<g filter="url(#filter10_f_68_822)">
|
||||
<ellipse cx="296.397" cy="165.703" rx="296.397" ry="165.703" transform="matrix(0.914846 -0.403803 0.330497 0.943807 -370.611 508.381)" fill="#2A4EAB"/>
|
||||
</g>
|
||||
<g filter="url(#filter11_f_68_822)">
|
||||
<path d="M-431 798.106V1422H1785V340.827L-431 798.106Z" fill="white"/>
|
||||
</g>
|
||||
<g filter="url(#filter12_f_68_822)">
|
||||
<path d="M1168.87 194.6L1651.63 -51L1531.83 244.697L1168.87 194.6Z" fill="#2A4EAB"/>
|
||||
</g>
|
||||
<g opacity="0.4" filter="url(#filter13_f_68_822)">
|
||||
<path d="M303.606 802.698L1065.95 450.301L1427.09 399.795L1877.64 402.328L376.107 978.65L303.606 802.698Z" fill="url(#paint3_linear_68_822)"/>
|
||||
</g>
|
||||
<g opacity="0.4" filter="url(#filter14_f_68_822)">
|
||||
<path d="M888 621.314L1690.16 377.877L2054.78 377.877L2501 442.793L936.615 805.63L888 621.314Z" fill="url(#paint4_linear_68_822)"/>
|
||||
</g>
|
||||
<g opacity="0.4" filter="url(#filter15_f_68_822)">
|
||||
<path d="M839.773 675.305L1706.82 339.905L2012.39 295.317L2463.11 306.023L954.084 854.616L839.773 675.305Z" fill="url(#paint5_linear_68_822)"/>
|
||||
</g>
|
||||
</g>
|
||||
<defs>
|
||||
<filter id="filter0_f_68_822" x="-64.8301" y="-20.1624" width="1626.9" height="733.26" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
|
||||
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
|
||||
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape"/>
|
||||
<feGaussianBlur stdDeviation="3.5" result="effect1_foregroundBlur_68_822"/>
|
||||
</filter>
|
||||
<filter id="filter1_f_68_822" x="-125.107" y="-37.1624" width="1704.18" height="767.26" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
|
||||
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
|
||||
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape"/>
|
||||
<feGaussianBlur stdDeviation="12" result="effect1_foregroundBlur_68_822"/>
|
||||
</filter>
|
||||
<filter id="filter2_f_68_822" x="377.575" y="-21.1177" width="935.751" height="662.969" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
|
||||
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
|
||||
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape"/>
|
||||
<feGaussianBlur stdDeviation="82" result="effect1_foregroundBlur_68_822"/>
|
||||
</filter>
|
||||
<filter id="filter3_f_68_822" x="-10.4902" y="-40.1458" width="751.953" height="255.045" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
|
||||
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
|
||||
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape"/>
|
||||
<feGaussianBlur stdDeviation="34" result="effect1_foregroundBlur_68_822"/>
|
||||
</filter>
|
||||
<filter id="filter4_f_68_822" x="85.2227" y="4.16821" width="560.528" height="166.417" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
|
||||
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
|
||||
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape"/>
|
||||
<feGaussianBlur stdDeviation="18" result="effect1_foregroundBlur_68_822"/>
|
||||
</filter>
|
||||
<filter id="filter5_f_68_822" x="7.91602" y="150.332" width="1587.38" height="763.516" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
|
||||
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
|
||||
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape"/>
|
||||
<feGaussianBlur stdDeviation="5.5" result="effect1_foregroundBlur_68_822"/>
|
||||
</filter>
|
||||
<filter id="filter6_f_68_822" x="-192.659" y="152.168" width="1822.96" height="796.68" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
|
||||
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
|
||||
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape"/>
|
||||
<feGaussianBlur stdDeviation="23" result="effect1_foregroundBlur_68_822"/>
|
||||
</filter>
|
||||
<filter id="filter7_f_68_822" x="-197.824" y="139.894" width="935.751" height="662.969" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
|
||||
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
|
||||
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape"/>
|
||||
<feGaussianBlur stdDeviation="82" result="effect1_foregroundBlur_68_822"/>
|
||||
</filter>
|
||||
<filter id="filter8_f_68_822" x="321.022" y="211.765" width="940.382" height="725.316" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
|
||||
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
|
||||
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape"/>
|
||||
<feGaussianBlur stdDeviation="82" result="effect1_foregroundBlur_68_822"/>
|
||||
</filter>
|
||||
<filter id="filter9_f_68_822" x="850.217" y="68.5803" width="935.751" height="662.969" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
|
||||
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
|
||||
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape"/>
|
||||
<feGaussianBlur stdDeviation="82" result="effect1_foregroundBlur_68_822"/>
|
||||
</filter>
|
||||
<filter id="filter10_f_68_822" x="-485.376" y="184.142" width="881.373" height="721.889" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
|
||||
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
|
||||
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape"/>
|
||||
<feGaussianBlur stdDeviation="82" result="effect1_foregroundBlur_68_822"/>
|
||||
</filter>
|
||||
<filter id="filter11_f_68_822" x="-587" y="184.827" width="2528" height="1393.17" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
|
||||
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
|
||||
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape"/>
|
||||
<feGaussianBlur stdDeviation="78" result="effect1_foregroundBlur_68_822"/>
|
||||
</filter>
|
||||
<filter id="filter12_f_68_822" x="1100.87" y="-119" width="618.759" height="431.697" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
|
||||
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
|
||||
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape"/>
|
||||
<feGaussianBlur stdDeviation="34" result="effect1_foregroundBlur_68_822"/>
|
||||
</filter>
|
||||
<filter id="filter13_f_68_822" x="296.605" y="392.795" width="1588.03" height="592.855" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
|
||||
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
|
||||
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape"/>
|
||||
<feGaussianBlur stdDeviation="3.5" result="effect1_foregroundBlur_68_822"/>
|
||||
</filter>
|
||||
<filter id="filter14_f_68_822" x="881" y="370.877" width="1627" height="441.754" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
|
||||
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
|
||||
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape"/>
|
||||
<feGaussianBlur stdDeviation="3.5" result="effect1_foregroundBlur_68_822"/>
|
||||
</filter>
|
||||
<filter id="filter15_f_68_822" x="815.773" y="271.317" width="1671.34" height="607.299" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
|
||||
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
|
||||
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape"/>
|
||||
<feGaussianBlur stdDeviation="12" result="effect1_foregroundBlur_68_822"/>
|
||||
</filter>
|
||||
<linearGradient id="paint0_linear_68_822" x1="748.618" y1="-13.1624" x2="81.6937" y2="550.866" gradientUnits="userSpaceOnUse">
|
||||
<stop stop-color="#FF7D54"/>
|
||||
<stop offset="1" stop-color="white" stop-opacity="0"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="paint1_linear_68_822" x1="501.216" y1="242.185" x2="29.7383" y2="626.281" gradientUnits="userSpaceOnUse">
|
||||
<stop offset="0.0104167" stop-color="#91B0ED"/>
|
||||
<stop offset="0.458333" stop-color="#437DD5"/>
|
||||
<stop offset="1" stop-color="#8A3AF0"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="paint2_linear_68_822" x1="1164.15" y1="269.352" x2="415.258" y2="536.803" gradientUnits="userSpaceOnUse">
|
||||
<stop stop-color="#819CFF"/>
|
||||
<stop offset="0.65537" stop-color="#E73800"/>
|
||||
<stop offset="1" stop-color="#819CFF"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="paint3_linear_68_822" x1="1070.25" y1="449.7" x2="767.856" y2="1036.35" gradientUnits="userSpaceOnUse">
|
||||
<stop stop-color="#3A4CF0"/>
|
||||
<stop offset="1" stop-color="white" stop-opacity="0"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="paint4_linear_68_822" x1="1694.5" y1="377.877" x2="1316" y2="916.154" gradientUnits="userSpaceOnUse">
|
||||
<stop stop-color="#D73AF0"/>
|
||||
<stop offset="1" stop-color="white" stop-opacity="0"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="paint5_linear_68_822" x1="1427.52" y1="519.254" x2="1201.79" y2="922.897" gradientUnits="userSpaceOnUse">
|
||||
<stop offset="0.166667" stop-color="#FF9471"/>
|
||||
<stop offset="0.541667" stop-color="#DBC0C6" stop-opacity="0.69"/>
|
||||
<stop offset="0.791667" stop-color="#C2DEFF" stop-opacity="0.62"/>
|
||||
<stop offset="1" stop-color="#9492FF" stop-opacity="0"/>
|
||||
</linearGradient>
|
||||
</defs>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 11 KiB |
136
docs/static/img/bg-hero-light.svg
vendored
Normal file
136
docs/static/img/bg-hero-light.svg
vendored
Normal file
@ -0,0 +1,136 @@
|
||||
<svg width="1440" height="900" viewBox="0 0 1440 900" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<rect x="-1.50195" y="-3.47998" width="1491.69" height="872.683" fill="#9535E1"/>
|
||||
<g filter="url(#filter0_f_2_1567)">
|
||||
<path d="M5.8584 407.846L767.131 -16.7519L1113.17 -16.752L1536.64 96.4744L51.9959 729.328L5.8584 407.846Z" fill="url(#paint0_linear_2_1567)"/>
|
||||
</g>
|
||||
<g filter="url(#filter1_f_2_1567)">
|
||||
<path d="M-35.2168 394.84L820.132 -3.7452L1113.17 -16.752L1536.64 96.4744L51.9959 729.328L-35.2168 394.84Z" fill="url(#paint1_linear_2_1567)"/>
|
||||
</g>
|
||||
<g filter="url(#filter2_f_2_1567)">
|
||||
<ellipse cx="317.98" cy="110.585" rx="317.98" ry="110.585" transform="matrix(0.900676 -0.434491 0.305122 0.952313 607.015 273.158)" fill="#9D70FF"/>
|
||||
</g>
|
||||
<g filter="url(#filter3_f_2_1567)">
|
||||
<ellipse cx="317.98" cy="110.585" rx="317.98" ry="110.585" transform="matrix(0.900676 -0.434491 0.305122 0.952313 373 356.521)" fill="#9D70FF"/>
|
||||
</g>
|
||||
<g opacity="0.4" filter="url(#filter4_f_2_1567)">
|
||||
<path d="M699.922 27.4613C533.882 53.7501 326.778 104.137 123.246 27.4613C112.534 21.6194 104.321 27.8994 157.168 99.7555C223.227 189.576 439.257 152.333 699.922 27.4613Z" fill="#FDFF89"/>
|
||||
</g>
|
||||
<g opacity="0.3" filter="url(#filter5_f_2_1567)">
|
||||
<path d="M639.454 39.8894C507.763 60.7398 343.504 100.703 182.077 39.8894C173.581 35.256 167.067 40.2369 208.981 97.2278C261.374 168.466 432.714 138.928 639.454 39.8894Z" fill="#FDFF89"/>
|
||||
</g>
|
||||
<path d="M709.192 336.955C1027.21 167.115 1159.03 159.028 1463.87 223.728L1564.39 442.093L94.5687 937.458C67.655 932.066 145.649 795.925 358.213 589.691C398.281 550.817 391.171 506.794 709.192 336.955Z" fill="url(#paint2_linear_2_1567)"/>
|
||||
<g filter="url(#filter6_f_2_1567)">
|
||||
<path d="M921.752 286.407C1258.49 184.451 1159.03 159.028 1463.87 223.729L1564.39 442.093L106.102 933.414C79.1886 928.022 48.4301 813.717 140.706 650.348C256.05 446.137 667.995 363.239 921.752 286.407Z" fill="#81F7FF"/>
|
||||
</g>
|
||||
<g filter="url(#filter7_f_2_1567)">
|
||||
<path d="M826.182 355.152C1198.54 253.196 1179.76 159.029 1516.84 223.729L1564.39 442.094L-48.144 933.414C-77.9044 928.023 -111.916 813.718 -9.88045 650.349C117.664 446.137 545.583 431.983 826.182 355.152Z" fill="#81F7FF"/>
|
||||
</g>
|
||||
<g filter="url(#filter8_f_2_1567)">
|
||||
<ellipse cx="317.98" cy="110.585" rx="317.98" ry="110.585" transform="matrix(0.900676 -0.434491 0.305122 0.952313 -3.0918 518.704)" fill="#707EFF"/>
|
||||
</g>
|
||||
<g opacity="0.8" filter="url(#filter9_f_2_1567)">
|
||||
<ellipse cx="380.177" cy="161.796" rx="380.177" ry="161.796" transform="matrix(0.933505 -0.358564 0.247194 0.968966 476.48 543.488)" fill="#8026F1"/>
|
||||
</g>
|
||||
<g filter="url(#filter10_f_2_1567)">
|
||||
<ellipse cx="317.98" cy="110.585" rx="317.98" ry="110.585" transform="matrix(0.900676 -0.434491 0.305122 0.952313 991.594 444.731)" fill="#FFBAF4"/>
|
||||
</g>
|
||||
<g filter="url(#filter11_f_2_1567)">
|
||||
<ellipse cx="285.734" cy="170.346" rx="285.734" ry="170.346" transform="matrix(0.900676 -0.434491 0.305122 0.952313 -291 524.239)" fill="url(#paint3_linear_2_1567)"/>
|
||||
</g>
|
||||
<g filter="url(#filter12_f_2_1567)">
|
||||
<path d="M-5 784.943V1160H1577V397.063L-5 784.943Z" fill="white"/>
|
||||
</g>
|
||||
<g filter="url(#filter13_f_2_1567)">
|
||||
<path d="M1170.11 198.758L1628.29 -56L1514.59 250.723L1170.11 198.758Z" fill="#9651ED"/>
|
||||
</g>
|
||||
<defs>
|
||||
<filter id="filter0_f_2_1567" x="-1.1416" y="-23.752" width="1544.79" height="760.08" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
|
||||
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
|
||||
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape"/>
|
||||
<feGaussianBlur stdDeviation="3.5" result="effect1_foregroundBlur_2_1567"/>
|
||||
</filter>
|
||||
<filter id="filter1_f_2_1567" x="-59.2168" y="-40.752" width="1619.86" height="794.08" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
|
||||
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
|
||||
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape"/>
|
||||
<feGaussianBlur stdDeviation="12" result="effect1_foregroundBlur_2_1567"/>
|
||||
</filter>
|
||||
<filter id="filter2_f_2_1567" x="474.748" y="-97.4189" width="904.811" height="675.458" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
|
||||
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
|
||||
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape"/>
|
||||
<feGaussianBlur stdDeviation="82" result="effect1_foregroundBlur_2_1567"/>
|
||||
</filter>
|
||||
<filter id="filter3_f_2_1567" x="240.733" y="-14.0562" width="904.811" height="675.458" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
|
||||
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
|
||||
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape"/>
|
||||
<feGaussianBlur stdDeviation="82" result="effect1_foregroundBlur_2_1567"/>
|
||||
</filter>
|
||||
<filter id="filter4_f_2_1567" x="47.3262" y="-42.2056" width="720.596" height="259.483" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
|
||||
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
|
||||
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape"/>
|
||||
<feGaussianBlur stdDeviation="34" result="effect1_foregroundBlur_2_1567"/>
|
||||
</filter>
|
||||
<filter id="filter5_f_2_1567" x="139.795" y="2.56738" width="535.658" height="169.938" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
|
||||
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
|
||||
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape"/>
|
||||
<feGaussianBlur stdDeviation="18" result="effect1_foregroundBlur_2_1567"/>
|
||||
</filter>
|
||||
<filter id="filter6_f_2_1567" x="64.6963" y="174.236" width="1513.69" height="773.177" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
|
||||
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
|
||||
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape"/>
|
||||
<feGaussianBlur stdDeviation="7" result="effect1_foregroundBlur_2_1567"/>
|
||||
</filter>
|
||||
<filter id="filter7_f_2_1567" x="-124.449" y="156.459" width="1734.83" height="822.956" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
|
||||
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
|
||||
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape"/>
|
||||
<feGaussianBlur stdDeviation="23" result="effect1_foregroundBlur_2_1567"/>
|
||||
</filter>
|
||||
<filter id="filter8_f_2_1567" x="-135.358" y="148.127" width="904.811" height="675.458" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
|
||||
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
|
||||
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape"/>
|
||||
<feGaussianBlur stdDeviation="82" result="effect1_foregroundBlur_2_1567"/>
|
||||
</filter>
|
||||
<filter id="filter9_f_2_1567" x="350.197" y="192.19" width="1042.35" height="743.511" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
|
||||
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
|
||||
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape"/>
|
||||
<feGaussianBlur stdDeviation="82" result="effect1_foregroundBlur_2_1567"/>
|
||||
</filter>
|
||||
<filter id="filter10_f_2_1567" x="859.328" y="74.1538" width="904.811" height="675.458" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
|
||||
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
|
||||
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape"/>
|
||||
<feGaussianBlur stdDeviation="82" result="effect1_foregroundBlur_2_1567"/>
|
||||
</filter>
|
||||
<filter id="filter11_f_2_1567" x="-408.271" y="194.025" width="853.202" height="736.576" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
|
||||
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
|
||||
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape"/>
|
||||
<feGaussianBlur stdDeviation="82" result="effect1_foregroundBlur_2_1567"/>
|
||||
</filter>
|
||||
<filter id="filter12_f_2_1567" x="-137" y="265.063" width="1846" height="1026.94" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
|
||||
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
|
||||
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape"/>
|
||||
<feGaussianBlur stdDeviation="66" result="effect1_foregroundBlur_2_1567"/>
|
||||
</filter>
|
||||
<filter id="filter13_f_2_1567" x="1102.11" y="-124" width="594.182" height="442.723" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
|
||||
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
|
||||
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape"/>
|
||||
<feGaussianBlur stdDeviation="34" result="effect1_foregroundBlur_2_1567"/>
|
||||
</filter>
|
||||
<linearGradient id="paint0_linear_2_1567" x1="771.251" y1="-16.752" x2="92.1733" y2="508.724" gradientUnits="userSpaceOnUse">
|
||||
<stop stop-color="#FED237"/>
|
||||
<stop offset="1" stop-color="#FF0000" stop-opacity="0"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="paint1_linear_2_1567" x1="803.5" y1="-0.783345" x2="870.787" y2="283.645" gradientUnits="userSpaceOnUse">
|
||||
<stop stop-color="#FFC700"/>
|
||||
<stop offset="0.53125" stop-color="#FF18BE" stop-opacity="0.484375"/>
|
||||
<stop offset="1" stop-color="#6100FF" stop-opacity="0"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="paint2_linear_2_1567" x1="1165.62" y1="276.298" x2="441.526" y2="512.908" gradientUnits="userSpaceOnUse">
|
||||
<stop stop-color="#9281FF"/>
|
||||
<stop offset="0.65537" stop-color="#81F7FF"/>
|
||||
<stop offset="1" stop-color="#81D1FF"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="paint3_linear_2_1567" x1="373.961" y1="100.557" x2="261.156" y2="328.531" gradientUnits="userSpaceOnUse">
|
||||
<stop stop-color="#9651EE"/>
|
||||
<stop offset="1" stop-color="#51C8EE"/>
|
||||
</linearGradient>
|
||||
</defs>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 9.3 KiB |
@ -1,15 +1,29 @@
|
||||
// tailwind.config.js
|
||||
/** @type {import('tailwindcss').Config} */
|
||||
module.exports = {
|
||||
corePlugins: {
|
||||
preflight: false, // disable Tailwind's reset
|
||||
},
|
||||
content: ["./src/**/*.{js,jsx,ts,tsx}"], // Only affects code in /src; can also add ./docs/**/*.mdx to use tailwind in docs
|
||||
darkMode: ["class", '[data-theme="dark"]'], // hooks into docusaurus' dark mode settings
|
||||
content: ["./src/**/*.{js,jsx,ts,tsx}"],
|
||||
darkMode: ["class", '[data-theme="dark"]'],
|
||||
theme: {
|
||||
container: {
|
||||
center: true,
|
||||
padding: "16px",
|
||||
screens: {
|
||||
"2xl": "1400px",
|
||||
},
|
||||
},
|
||||
fontFamily: {
|
||||
sans: [
|
||||
"-apple-system",
|
||||
"BlinkMacSystemFont",
|
||||
"Segoe UI",
|
||||
"Roboto",
|
||||
"Oxygen-Sans",
|
||||
"Ubuntu,Cantarell",
|
||||
"Helvetica",
|
||||
"sans-serif",
|
||||
],
|
||||
},
|
||||
extend: {},
|
||||
},
|
||||
plugins: [
|
||||
require("tailwindcss-animate"),
|
||||
],
|
||||
plugins: [require("tailwindcss-animate")],
|
||||
};
|
||||
|
||||
@ -3109,7 +3109,7 @@ cheerio@^1.0.0-rc.12:
|
||||
parse5 "^7.0.0"
|
||||
parse5-htmlparser2-tree-adapter "^7.0.0"
|
||||
|
||||
chokidar@^3.4.2, chokidar@^3.5.3:
|
||||
"chokidar@>=3.0.0 <4.0.0", chokidar@^3.4.2, chokidar@^3.5.3:
|
||||
version "3.5.3"
|
||||
resolved "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz"
|
||||
integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==
|
||||
@ -3827,6 +3827,13 @@ docusaurus-plugin-redoc@1.6.0:
|
||||
"@redocly/openapi-core" "1.0.0-beta.123"
|
||||
redoc "2.0.0"
|
||||
|
||||
docusaurus-plugin-sass@^0.2.5:
|
||||
version "0.2.5"
|
||||
resolved "https://registry.yarnpkg.com/docusaurus-plugin-sass/-/docusaurus-plugin-sass-0.2.5.tgz#6bfb8a227ac6265be685dcbc24ba1989e27b8005"
|
||||
integrity sha512-Z+D0fLFUKcFpM+bqSUmqKIU+vO+YF1xoEQh5hoFreg2eMf722+siwXDD+sqtwU8E4MvVpuvsQfaHwODNlxJAEg==
|
||||
dependencies:
|
||||
sass-loader "^10.1.1"
|
||||
|
||||
docusaurus-theme-redoc@1.6.3:
|
||||
version "1.6.3"
|
||||
resolved "https://registry.npmjs.org/docusaurus-theme-redoc/-/docusaurus-theme-redoc-1.6.3.tgz"
|
||||
@ -4900,6 +4907,11 @@ immer@^9.0.7:
|
||||
resolved "https://registry.npmjs.org/immer/-/immer-9.0.21.tgz"
|
||||
integrity sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA==
|
||||
|
||||
immutable@^4.0.0:
|
||||
version "4.3.4"
|
||||
resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.3.4.tgz#2e07b33837b4bb7662f288c244d1ced1ef65a78f"
|
||||
integrity sha512-fsXeu4J4i6WNWSikpI88v/PcVflZz+6kMhUfIwc5SY+poQRPnaf5V7qds6SUyUN3cVxEzuCab7QIoLOQ+DQ1wA==
|
||||
|
||||
import-fresh@^3.1.0, import-fresh@^3.2.1, import-fresh@^3.3.0:
|
||||
version "3.3.0"
|
||||
resolved "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz"
|
||||
@ -5326,6 +5338,11 @@ kleur@^3.0.3:
|
||||
resolved "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz"
|
||||
integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==
|
||||
|
||||
klona@^2.0.4:
|
||||
version "2.0.6"
|
||||
resolved "https://registry.yarnpkg.com/klona/-/klona-2.0.6.tgz#85bffbf819c03b2f53270412420a4555ef882e22"
|
||||
integrity sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==
|
||||
|
||||
latest-version@^5.1.0:
|
||||
version "5.1.0"
|
||||
resolved "https://registry.npmjs.org/latest-version/-/latest-version-5.1.0.tgz"
|
||||
@ -6790,6 +6807,11 @@ react-helmet-async@*, react-helmet-async@^1.3.0:
|
||||
react-fast-compare "^3.2.0"
|
||||
shallowequal "^1.1.0"
|
||||
|
||||
react-icons@^4.11.0:
|
||||
version "4.11.0"
|
||||
resolved "https://registry.yarnpkg.com/react-icons/-/react-icons-4.11.0.tgz#4b0e31c9bfc919608095cc429c4f1846f4d66c65"
|
||||
integrity sha512-V+4khzYcE5EBk/BvcuYRq6V/osf11ODUM2J8hg2FDSswRrGvqiYUYPRy4OdrWaQOBj4NcpJfmHZLNaD+VH0TyA==
|
||||
|
||||
react-is@^16.13.1, react-is@^16.6.0, react-is@^16.7.0:
|
||||
version "16.13.1"
|
||||
resolved "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz"
|
||||
@ -7274,6 +7296,26 @@ safe-buffer@5.2.1, safe-buffer@>=5.1.0, safe-buffer@^5.1.0, safe-buffer@~5.2.0:
|
||||
resolved "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz"
|
||||
integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==
|
||||
|
||||
sass-loader@^10.1.1:
|
||||
version "10.4.1"
|
||||
resolved "https://registry.yarnpkg.com/sass-loader/-/sass-loader-10.4.1.tgz#bea4e173ddf512c9d7f53e9ec686186146807cbf"
|
||||
integrity sha512-aX/iJZTTpNUNx/OSYzo2KsjIUQHqvWsAhhUijFjAPdZTEhstjZI9zTNvkTTwsx+uNUJqUwOw5gacxQMx4hJxGQ==
|
||||
dependencies:
|
||||
klona "^2.0.4"
|
||||
loader-utils "^2.0.0"
|
||||
neo-async "^2.6.2"
|
||||
schema-utils "^3.0.0"
|
||||
semver "^7.3.2"
|
||||
|
||||
sass@^1.69.3:
|
||||
version "1.69.3"
|
||||
resolved "https://registry.yarnpkg.com/sass/-/sass-1.69.3.tgz#f8a0c488697e6419519834a13335e7b65a609c11"
|
||||
integrity sha512-X99+a2iGdXkdWn1akFPs0ZmelUzyAQfvqYc2P/MPTrJRuIRoTffGzT9W9nFqG00S+c8hXzVmgxhUuHFdrwxkhQ==
|
||||
dependencies:
|
||||
chokidar ">=3.0.0 <4.0.0"
|
||||
immutable "^4.0.0"
|
||||
source-map-js ">=0.6.2 <2.0.0"
|
||||
|
||||
sax@^1.2.4:
|
||||
version "1.2.4"
|
||||
resolved "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz"
|
||||
@ -7595,7 +7637,7 @@ sort-css-media-queries@2.1.0:
|
||||
resolved "https://registry.npmjs.org/sort-css-media-queries/-/sort-css-media-queries-2.1.0.tgz"
|
||||
integrity sha512-IeWvo8NkNiY2vVYdPa27MCQiR0MN0M80johAYFVxWWXQ44KU84WNxjslwBHmc/7ZL2ccwkM7/e6S5aiKZXm7jA==
|
||||
|
||||
source-map-js@^1.0.2:
|
||||
"source-map-js@>=0.6.2 <2.0.0", source-map-js@^1.0.2:
|
||||
version "1.0.2"
|
||||
resolved "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz"
|
||||
integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user