From ef050b5e55abb397adc3cdc280d1cdc70ed0df1f Mon Sep 17 00:00:00 2001 From: BennyKok Date: Sat, 16 Dec 2023 17:14:04 +0800 Subject: [PATCH] feat: add landing page --- web/.env.example | 3 +- web/bun.lockb | Bin 334056 -> 336123 bytes web/next-gen/next-gen.config.json | 23 + web/package.json | 2 + web/src/app/layout.tsx | 35 +- web/src/app/page.tsx | 78 +-- .../[workflow_id]/page.tsx | 0 web/src/app/workflows/page.tsx | 77 +++ web/src/components/CopyButton.tsx | 2 +- web/src/components/Main.tsx | 100 ++++ web/src/components/NavbarRight.tsx | 7 +- web/src/components/Section.tsx | 540 ++++++++++++++++++ web/src/components/WorkflowList.tsx | 2 +- web/src/components/ui/accordion.tsx | 58 ++ web/src/middleware.ts | 2 +- web/tailwind.config.ts | 9 + web/tsconfig.json | 3 +- 17 files changed, 851 insertions(+), 90 deletions(-) create mode 100644 web/next-gen/next-gen.config.json rename web/src/app/{workflow => workflows}/[workflow_id]/page.tsx (100%) create mode 100644 web/src/app/workflows/page.tsx create mode 100644 web/src/components/Main.tsx create mode 100644 web/src/components/Section.tsx create mode 100644 web/src/components/ui/accordion.tsx diff --git a/web/.env.example b/web/.env.example index a398c8f..ba4c9f5 100644 --- a/web/.env.example +++ b/web/.env.example @@ -17,4 +17,5 @@ SPACES_BUCKET="comfyui-deploy" SPACES_KEY="xyz" SPACES_SECRET="aaa" -JWT_SECRET="openssl rand -hex 32" \ No newline at end of file +JWT_SECRET="openssl rand -hex 32" +PLAUSIBLE_DOMAIN= \ No newline at end of file diff --git a/web/bun.lockb b/web/bun.lockb index f32eacf6ce98dcadfaeb941412d669eb2068f371..892e2b93da54b41be71a380ba1e3438f13d1f74e 100755 GIT binary patch delta 65498 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 Kj|Qk;W&JOPeZIv2 delta 64163 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 + + {process.env.PLAUSIBLE_DOMAIN && ( + + )} + -
+
@@ -38,14 +56,17 @@ export default function RootLayout({ variant={"outline"} className="rounded-full aspect-square p-2" > - +
{/*
*/} -
+
{children}
diff --git a/web/src/app/page.tsx b/web/src/app/page.tsx index 24e5ca7..cb25c09 100644 --- a/web/src/app/page.tsx +++ b/web/src/app/page.tsx @@ -1,77 +1,5 @@ -import { WorkflowList } from "@/components/WorkflowList"; -import { db } from "@/db/db"; -import { usersTable, workflowTable, workflowVersionTable } from "@/db/schema"; -import { auth, clerkClient } from "@clerk/nextjs"; -import { desc, eq } from "drizzle-orm"; +import Main from '@/components/Main'; export default function Home() { - return ; -} - -async function WorkflowServer() { - const { userId } = await auth(); - - if (!userId) { - return
No auth
; - } - - const user = await db.query.usersTable.findFirst({ - where: eq(usersTable.id, userId), - }); - - if (!user) { - await setInitialUserData(userId); - } - - const workflow = await db.query.workflowTable.findMany({ - // extras: { - // count: sql`(select count(*) from ${workflowVersionTable})`.as( - // "count", - // ), - // }, - with: { - versions: { - limit: 1, - orderBy: desc(workflowVersionTable.version), - }, - }, - orderBy: desc(workflowTable.updated_at), - where: eq(workflowTable.user_id, userId), - }); - - return ( - { - return { - id: x.id, - email: x.name, - amount: x.versions[0]?.version ?? 0, - date: x.updated_at, - }; - })} - /> - ); -} - -async function setInitialUserData(userId: string) { - const user = await clerkClient.users.getUser(userId); - - // incase we dont have username such as google login, fallback to first name + last name - const usernameFallback = - user.username ?? (user.firstName ?? "") + (user.lastName ?? ""); - - // For the display name, if it for some reason is empty, fallback to username - let nameFallback = (user.firstName ?? "") + (user.lastName ?? ""); - if (nameFallback === "") { - nameFallback = usernameFallback; - } - - const result = await db.insert(usersTable).values({ - id: userId, - // this is used for path, make sure this is unique - username: usernameFallback, - - // this is for display name, maybe different from username - name: nameFallback, - }); -} + return
; +} \ No newline at end of file diff --git a/web/src/app/workflow/[workflow_id]/page.tsx b/web/src/app/workflows/[workflow_id]/page.tsx similarity index 100% rename from web/src/app/workflow/[workflow_id]/page.tsx rename to web/src/app/workflows/[workflow_id]/page.tsx diff --git a/web/src/app/workflows/page.tsx b/web/src/app/workflows/page.tsx new file mode 100644 index 0000000..24e5ca7 --- /dev/null +++ b/web/src/app/workflows/page.tsx @@ -0,0 +1,77 @@ +import { WorkflowList } from "@/components/WorkflowList"; +import { db } from "@/db/db"; +import { usersTable, workflowTable, workflowVersionTable } from "@/db/schema"; +import { auth, clerkClient } from "@clerk/nextjs"; +import { desc, eq } from "drizzle-orm"; + +export default function Home() { + return ; +} + +async function WorkflowServer() { + const { userId } = await auth(); + + if (!userId) { + return
No auth
; + } + + const user = await db.query.usersTable.findFirst({ + where: eq(usersTable.id, userId), + }); + + if (!user) { + await setInitialUserData(userId); + } + + const workflow = await db.query.workflowTable.findMany({ + // extras: { + // count: sql`(select count(*) from ${workflowVersionTable})`.as( + // "count", + // ), + // }, + with: { + versions: { + limit: 1, + orderBy: desc(workflowVersionTable.version), + }, + }, + orderBy: desc(workflowTable.updated_at), + where: eq(workflowTable.user_id, userId), + }); + + return ( + { + return { + id: x.id, + email: x.name, + amount: x.versions[0]?.version ?? 0, + date: x.updated_at, + }; + })} + /> + ); +} + +async function setInitialUserData(userId: string) { + const user = await clerkClient.users.getUser(userId); + + // incase we dont have username such as google login, fallback to first name + last name + const usernameFallback = + user.username ?? (user.firstName ?? "") + (user.lastName ?? ""); + + // For the display name, if it for some reason is empty, fallback to username + let nameFallback = (user.firstName ?? "") + (user.lastName ?? ""); + if (nameFallback === "") { + nameFallback = usernameFallback; + } + + const result = await db.insert(usersTable).values({ + id: userId, + // this is used for path, make sure this is unique + username: usernameFallback, + + // this is for display name, maybe different from username + name: nameFallback, + }); +} diff --git a/web/src/components/CopyButton.tsx b/web/src/components/CopyButton.tsx index ca0ea8c..a720583 100644 --- a/web/src/components/CopyButton.tsx +++ b/web/src/components/CopyButton.tsx @@ -21,4 +21,4 @@ export function CopyButton({ ); -} +} \ No newline at end of file diff --git a/web/src/components/Main.tsx b/web/src/components/Main.tsx new file mode 100644 index 0000000..4bde7c8 --- /dev/null +++ b/web/src/components/Main.tsx @@ -0,0 +1,100 @@ +"use client"; + +import { Badge } from "./ui/badge"; +import macBookMainImage from "@/assets/images/macbook-main.png"; +import { Section } from "@/components/Section"; +import { cn } from "@/lib/utils"; +import Image from "next/image"; +import { Fragment } from "react"; +import meta from 'next-gen/config'; + +function isDevelopment() { + return process.env.NODE_ENV === "development"; +} + +function FeatureCard(props: { + className?: String; + title: React.ReactNode; + description: String; +}) { + return ( +
+ {/*
*/} +
+
+ +
+
{props.title}
+
+
{props.description}
+
+
+ ); +} + +export default function Main() { + return ( +
+
+ {/* Hero Section */} + +
+
+ + ✨ Open Source on Github + + + + + {meta.tagline} + + + + + {meta.description} + + + + Get Started + +
+ +
+ {/* Find My Ports on MacBook Pro 14 */} +
+
+ +
+ +
+ {/*
*/} +
{meta.name}
+
© {meta.author} 2023 . All rights reserved.
+ {/*
*/} +
+
+ ); +} diff --git a/web/src/components/NavbarRight.tsx b/web/src/components/NavbarRight.tsx index f64a853..a879c94 100644 --- a/web/src/components/NavbarRight.tsx +++ b/web/src/components/NavbarRight.tsx @@ -15,7 +15,8 @@ export function NavbarRight() { ? "machines" : pathname.startsWith("/api-keys") ? "api-keys" - : "workflow" + : pathname.startsWith("/workflows") + ? "workflows" : "" } className="w-[300px]" onValueChange={(value) => { @@ -24,12 +25,12 @@ export function NavbarRight() { } else if (value === "api-keys") { router.push("/api-keys"); } else { - router.push("/"); + router.push("/workflows"); } }} > - Workflow + Workflows Machines API Keys diff --git a/web/src/components/Section.tsx b/web/src/components/Section.tsx new file mode 100644 index 0000000..7ac27c9 --- /dev/null +++ b/web/src/components/Section.tsx @@ -0,0 +1,540 @@ +import { Button, buttonVariants } from '@/components/ui/button'; +type ButtonProps = React.ComponentProps; +type LinkProps = React.ComponentProps; +import { Card as BaseCard } from '@/components/ui/card'; +type CardProps = React.ComponentProps; +import { Tabs, TabsTrigger as Tab, TabsList } from '@/components/ui/tabs'; +type TabsProps = React.ComponentProps; +import { + Accordion, + AccordionItem, + AccordionContent, + AccordionTrigger, +} from '@/components/ui/accordion'; +type AccordionProps = React.ComponentProps; +import { Badge as Chip } from '@/components/ui/badge'; +type ChipProps = React.ComponentProps; + +import Link from 'next/link'; +import type { + HTMLAttributeAnchorTarget, + HTMLAttributes, + ReactNode, +} from 'react'; +import { twMerge } from 'tailwind-merge'; +import { ChevronRight as MdChevronRight} from 'lucide-react' +// import { MdChevronRight } from 'react-icons/md'; +import React from 'react'; +import { CheckCircle as PiCheckCircleDuotone } from 'lucide-react' +// import { PiCheckCircleDuotone } from 'react-icons/pi'; +import { cn } from '@/lib/utils'; + +function Section({ + className, + children, + ...props +}: HTMLAttributes) { + // extract the primary action and secondary action from the children + const primaryAction = getChildComponent(children, PrimaryAction); + const secondaryAction = getChildComponent(children, SecondaryAction); + + return ( +
+ {removeFromChildren(children, [PrimaryAction, SecondaryAction])} +
+ {primaryAction} + {secondaryAction} +
+
+ ); +} + +function Title({ + children, + className, + ...props +}: HTMLAttributes) { + return ( +

+ {children} +

+ ); +} + +function Subtitle({ + children, + className, + ...props +}: HTMLAttributes) { + return ( +

+ {children} +

+ ); +} + +function Announcement({ + className, + children, + href, + target = '_blank', + ...props +}: ChipProps & { + href?: string; //string | UrlObject; + target?: HTMLAttributeAnchorTarget | undefined; +}) { + return ( + + // } + style={{ + // @ts-ignore + textWrap: 'balance', + }} + {...props} + > + + {children} + {' '} + + + ); +} + +type ActionProps = ButtonProps & { + be: 'button'; + hideArrow?: boolean; +}; + +type ActionLinkProps = LinkProps & { + be?: 'a'; + hideArrow?: boolean; + variant?: ButtonProps['variant']; +}; + +function PrimaryAction({ + className, + variant, + children, + hideArrow, + ...props +}: ActionLinkProps | ActionProps) { + if (props.be === 'button') { + return ( + + ); + } + + return ( + + {children} + {!hideArrow && ( + + )} + + ); +} + +function SecondaryAction({ + className, + variant, + children, + hideArrow, + ...props +}: ActionLinkProps | ActionProps) { + if (props.be === 'button') { + return ( + + ); + } + + return ( + + {children} + {!hideArrow && ( + + )} + + ); +} +function PricingCard({ + className, + children, + ...props +}: Omit & { + children: + | ReactNode + | ReactNode[] + | ((pricingType: PricingType) => ReactNode | ReactNode[]); +}) { + // const { pricingType } = usePricingContext(); + if (typeof children === 'function') + children = (children('month') as React.ReactElement).props.children as + | ReactNode + | ReactNode[]; + + // extract the title and subtitle from the children + // const cardTitleStyles = + const title = getChildComponent(children, Title, { + className: 'text-2xl md:text-2xl text-start font-bold', + }); + const subTitle = getChildComponent(children, Subtitle, { + className: 'text-md text-start text-foreground-500 mt-4', + }); + const priceTags = getChildComponents(children, PriceTag, { + className: 'text-4xl font-bold', + }); + const primaryAction = getChildComponent(children, PrimaryAction, { + className: 'w-full', + }); + + return ( + +
+ {title} + {priceTags} + {subTitle} +
+
+ {removeFromChildren(children, [ + Title, + Subtitle, + ImageArea, + PriceTag, + PrimaryAction, + ]).map((item, i) => { + return ( +
+ + {item} +
+ ); + })} +
+
{primaryAction}
+
+ ); +} + +// create a Pricing Context that store the monthly and pricing state +// const PricingContext = createContext<{ +// pricingType: PricingType; +// setPricingType: (pricingType: PricingType) => void; +// }>({ +// pricingType: 'month', +// setPricingType: (pricingType: PricingType) => {}, +// }); + +const PricingTypeValue = ['month', 'year'] as const; +export type PricingType = (typeof PricingTypeValue)[number]; + +// // an helper function to useContext +// export function usePricingContext() { +// return React.useContext(PricingContext); +// } + +function Pricing({ children, ...props }: HTMLAttributes) { + // const [pricingType, setPricingType] = useState('month'); + + // const context = useMemo(() => { + // return { + // pricingType, + // setPricingType, + // }; + // }, [pricingType]); + + return ( + // +
{children}
+ //
+ ); +} + +function PricingOption({ className, ...props }: TabsProps) { + // const { setPricingType } = usePricingContext(); + + return ( + { + // setPricingType(key as PricingType); + }} + // onSelectionChange={(key: any) => { + // setPricingType(key as PricingType); + // }} + > + + {PricingTypeValue.map((pricingType) => { + return ( + + {pricingType} + + ); + })} + + + ); +} + +function PriceTag({ + children, + pricingType, + ...props +}: HTMLAttributes & { + pricingType?: 'month' | 'year' | string; +}) { + // const { pricingType: currentPricingType } = usePricingContext(); + let currentPricingType = 'month'; + + if (pricingType != undefined && currentPricingType !== pricingType) + return <>; + + return

{children}

; +} + +function Card({ className, children, ...props }: CardProps) { + // extract the title and subtitle from the children + // const cardTitleStyles = + const title = getChildComponent(children, Title, { + className: 'text-2xl md:text-2xl font-normal text-center', + }); + const subTitle = getChildComponent(children, Subtitle, { + className: 'text-md text-center', + }); + const image = getChildComponent(children, ImageArea); + + return ( + + {image} + {title} + {subTitle} + {removeFromChildren(children, [Title, Subtitle, ImageArea])} + + ); +} + +function ImageArea({ + className, + children, + ...props +}: HTMLAttributes) { + return ( +
+ {children} +
+ ); +} + +// create a helper to get and remove the title and subtitle from the children +function getChildComponent React.JSX.Element>( + children: React.ReactNode | React.ReactNode[], + type: T, + propsOverride?: Partial[0]>, +) { + const childrenArr = React.Children.toArray(children); + let child = childrenArr.find( + (child) => React.isValidElement(child) && child.type === type, + ) as React.ReactElement< + Parameters[0], + string | React.JSXElementConstructor + >; + + if (child && propsOverride) { + const { className, ...rest } = child.props; + child = React.cloneElement(child, { + className: twMerge(className, propsOverride.className), + ...rest, + }); + } + + return child; +} + +function getChildComponents React.JSX.Element>( + children: React.ReactNode | React.ReactNode[], + type: T, + propsOverride?: Partial[0]>, +) { + const childrenArr = React.Children.toArray(children); + let child = ( + childrenArr.filter( + (child) => React.isValidElement(child) && child.type === type, + ) as React.ReactElement< + Parameters[0], + string | React.JSXElementConstructor + >[] + ).map((child) => { + if (child && propsOverride) { + const { className, ...rest } = child.props; + child = React.cloneElement(child, { + className: twMerge(className, propsOverride.className), + ...rest, + }); + } + return child; + }); + + return child; +} + +function removeFromChildren( + children: React.ReactNode | React.ReactNode[], + types: any[], +): React.ReactNode[] { + return React.Children.toArray(children).filter( + (child) => React.isValidElement(child) && !types.includes(child.type), + ); +} + +function FAQ({ children, ...props }: AccordionProps) { + return {children}; +} + +function FAQItem({ + children, + ...props +}: { + children: React.ReactNode | React.ReactNode[]; + 'aria-label': string; + title: string; +}): JSX.Element { + return ( + + {props.title} + {children} + + ); +} + +// const FAQItem = AccordionItem; + +const pkg = Object.assign(Section, { + Pricing, + PricingOption, + Title, + Subtitle, + Announcement, + PrimaryAction, + SecondaryAction, + ImageArea, + Card, + FAQItem, + FAQ, + PricingCard, + PriceTag, +}); + +export { pkg as Section }; diff --git a/web/src/components/WorkflowList.tsx b/web/src/components/WorkflowList.tsx index 39798e5..e1abe9d 100644 --- a/web/src/components/WorkflowList.tsx +++ b/web/src/components/WorkflowList.tsx @@ -84,7 +84,7 @@ export const columns: ColumnDef[] = [ }, cell: ({ row }) => { return ( - + {row.getValue("email")} ); diff --git a/web/src/components/ui/accordion.tsx b/web/src/components/ui/accordion.tsx new file mode 100644 index 0000000..24c788c --- /dev/null +++ b/web/src/components/ui/accordion.tsx @@ -0,0 +1,58 @@ +"use client" + +import * as React from "react" +import * as AccordionPrimitive from "@radix-ui/react-accordion" +import { ChevronDown } from "lucide-react" + +import { cn } from "@/lib/utils" + +const Accordion = AccordionPrimitive.Root + +const AccordionItem = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +AccordionItem.displayName = "AccordionItem" + +const AccordionTrigger = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, children, ...props }, ref) => ( + + svg]:rotate-180", + className + )} + {...props} + > + {children} + + + +)) +AccordionTrigger.displayName = AccordionPrimitive.Trigger.displayName + +const AccordionContent = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, children, ...props }, ref) => ( + +
{children}
+
+)) + +AccordionContent.displayName = AccordionPrimitive.Content.displayName + +export { Accordion, AccordionItem, AccordionTrigger, AccordionContent } diff --git a/web/src/middleware.ts b/web/src/middleware.ts index f7375b8..612e677 100644 --- a/web/src/middleware.ts +++ b/web/src/middleware.ts @@ -5,7 +5,7 @@ import { authMiddleware, redirectToSignIn } from "@clerk/nextjs"; // See https://clerk.com/docs/references/nextjs/auth-middleware for more information about configuring your Middleware export default authMiddleware({ // debug: true, - publicRoutes: ["/api/(.*)"], + publicRoutes: ['/',"/api/(.*)"], // publicRoutes: ["/", "/(.*)"], async afterAuth(auth, req, evt) { // redirect them to organization selection page diff --git a/web/tailwind.config.ts b/web/tailwind.config.ts index 52a11bf..18b63cf 100644 --- a/web/tailwind.config.ts +++ b/web/tailwind.config.ts @@ -66,10 +66,19 @@ const config: Config = { from: { height: "var(--radix-accordion-content-height)" }, to: { height: "0" }, }, + 'background-shine': { + from: { + backgroundPosition: '0 0', + }, + to: { + backgroundPosition: '-200% 0', + }, + }, }, animation: { "accordion-down": "accordion-down 0.2s ease-out", "accordion-up": "accordion-up 0.2s ease-out", + 'background-shine': 'background-shine 2s linear infinite', }, }, }, diff --git a/web/tsconfig.json b/web/tsconfig.json index af05591..9640de0 100644 --- a/web/tsconfig.json +++ b/web/tsconfig.json @@ -19,7 +19,8 @@ } ], "paths": { - "@/*": ["./src/*"] + "@/*": ["./src/*"], + "next-gen/config": ["./next-gen/next-gen.config.json"], } }, "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"],