Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
25 commits
Select commit Hold shift + click to select a range
1f5c8dc
hygiene
Atharane Jan 30, 2025
d51c0bc
partial branding
Atharane Jan 30, 2025
caa26a1
some more hygiene
Atharane Jan 30, 2025
c157b17
refactor: improve wordpress API client code style and type safety
Atharane Feb 1, 2025
c7efba0
feat: add yoast seo and schema graph types to wordpress typeScript de…
Atharane Feb 1, 2025
20a13c0
feat: enhance post page with yoast seo metadata and schema support
Atharane Feb 1, 2025
6c00e65
refactor: clean up page and posts components, improve code style
Atharane Feb 1, 2025
a2212e7
refactor: simplify homepage and move previous content to registery page
Atharane Feb 3, 2025
454822a
feat: primer redesign homepage
Atharane Feb 3, 2025
36c7cb0
feat: improve theme toggle with hotkey support and enhanced ui
Atharane Feb 3, 2025
c808ed5
feat: update layout with new logo, font, and background gradient
Atharane Feb 3, 2025
8955eb0
feat: add new branding images for avatar and dark mode logo
Atharane Feb 3, 2025
94f7163
fix: improve responsive design and typo in site description
Atharane Feb 3, 2025
d31db3d
feat: add slack integration for waitlist signups
Atharane Feb 3, 2025
445ebc9
chore: update opengraph image to png format
Atharane Feb 3, 2025
2a3f869
tf?
Atharane Feb 3, 2025
6e02170
feat: relocate theme toggle to main layout
Atharane Feb 3, 2025
29f840c
chore: update site domain and sitemap import type
Atharane Feb 3, 2025
9e5189a
feat: enhance homepage with radial gradient background and minor form…
Atharane Feb 3, 2025
be3481e
chore: remove radial gradient background and clean up formatting
Atharane Feb 3, 2025
3952f57
chore: add biome configuration and biome compliance
Atharane Feb 3, 2025
bc17c87
feat: improve submit button with enhanced loading state and styling
Atharane Feb 3, 2025
ebd2c7d
replace twitter image
Atharane Feb 3, 2025
ce375b2
feat: integrate posthog analytics with custom pageview tracking
Atharane Feb 3, 2025
5a43d5f
feat: add theme provider for next-themes
Atharane Feb 3, 2025
File filter

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 0 additions & 2 deletions .env.example

This file was deleted.

34 changes: 34 additions & 0 deletions app/actions.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
"use server"

import { SLACK_CHANNELS } from "@/lib/constants"
import { botwise } from "@/services/botwise"

export const sendSlackMessage = async (message: string, channel: string) => {
try {
await botwise.chat.postMessage({
channel,
text: message,
})
} catch (error) {
console.error(`ERROR/SEND_SLACK_MESSAGE: ${error}`)
}
}

export async function subscribeToWaitlist(formData: FormData) {
const email = formData.get("email")

// validation
if (!email || typeof email !== "string") {
return { error: "ERROR/INVALID_EMAIL" }
}

try {
sendSlackMessage(
`\n\n------\n🎉 new waitlist signup!\n\n${email} just expressed interest in goodfit\n\n`,
SLACK_CHANNELS["goodfit-alerts"]
)
return { success: true, message: "Thanks for joining our waitlist!" }
} catch (error) {
return { error: `ERROR/SUBSCRIBE_TO_WAITLIST/${error}` }
}
}
81 changes: 50 additions & 31 deletions app/layout.tsx
Original file line number Diff line number Diff line change
@@ -1,32 +1,33 @@
import "./globals.css";

import type { Metadata } from "next";
import { Inter as FontSans } from "next/font/google";
import { ThemeProvider } from "@/components/theme/theme-provider";
import { Plus_Jakarta_Sans } from "next/font/google";
import Image from "next/image";
import Link from "next/link";
import Balancer from "react-wrap-balancer";
import { Analytics } from "@vercel/analytics/react";

import { ThemeProvider } from "@/providers/theme-provider";
import { PostHogProvider } from "@/providers/posthog";
import { Button } from "@/components/ui/button";
import { MobileNav } from "@/components/nav/mobile-nav";
import { ThemeToggle } from "@/components/theme/theme-toggle";
import { mainMenu, contentMenu } from "@/menu.config";
import { Section, Container } from "@/components/craft";
import { Analytics } from "@vercel/analytics/react";
import { Label } from "@/components/ui/label";
import { cn } from "@/lib/utils";
import { mainMenu, contentMenu } from "@/menu.config";
import { siteConfig } from "@/site.config";

import Balancer from "react-wrap-balancer";
import Logo from "@/public/logo.svg";
import Image from "next/image";
import Link from "next/link";

import { cn } from "@/lib/utils";

const font = FontSans({
const plusJakartaSans = Plus_Jakarta_Sans({
subsets: ["latin"],
variable: "--font-sans",
});

export const metadata: Metadata = {
title: "WordPress & Next.js Starter by 9d8",
title: "Goodfit | No Ghosting. Just Instant AI Interviews.",
description:
"A starter template for Next.js with WordPress as a headless CMS.",
"The hiring process is broken. Get real AI interviews and instant results—no waiting, no gatekeeping.",
metadataBase: new URL(siteConfig.site_domain),
alternates: {
canonical: "/",
Expand All @@ -41,16 +42,24 @@ export default function RootLayout({
return (
<html lang="en" suppressHydrationWarning>
<head />
<body className={cn("min-h-screen font-sans antialiased", font.variable)}>
<body
className={cn(
"min-h-screen font-sans antialiased",
plusJakartaSans.className,
)}
>
<ThemeProvider
attribute="class"
defaultTheme="system"
enableSystem
disableTransitionOnChange
>
<Nav />
{children}
<Footer />
<PostHogProvider>
<Nav />
{children}
{/* <Footer /> */}
</PostHogProvider>
<ThemeToggle />
</ThemeProvider>
<Analytics />
</body>
Expand All @@ -66,21 +75,28 @@ const Nav = ({ className, children, id }: NavProps) => {
>
<div
id="nav-container"
className="max-w-5xl mx-auto py-4 px-6 sm:px-8 flex justify-between items-center"
className="mx-auto py-4 px-6 sm:px-8 flex justify-between items-center"
>
<Link
className="hover:opacity-75 transition-all flex gap-4 items-center"
href="/"
>
<Image
src={Logo}
src="/images/goodfit.png"
alt="Logo"
loading="eager"
className="dark:invert"
width={42}
className="block dark:hidden"
width={96}
height={26.44}
></Image>
<h2 className="text-sm">{siteConfig.site_name}</h2>
/>
<Image
src="/images/goodfit-dark.png"
alt="Logo"
loading="eager"
className="hidden dark:block"
width={96}
height={26.44}
/>
</Link>
{children}
<div className="flex items-center gap-2">
Expand All @@ -93,9 +109,13 @@ const Nav = ({ className, children, id }: NavProps) => {
</Button>
))}
</div>
<Button asChild className="hidden sm:flex">
<Link href="https://github.com/9d8dev/next-wp">Get Started</Link>
</Button>
{/* sneaky trick to focus on the input element without javascript */}
<Label
className="hidden md:flex justify-center items-center h-10 px-4 py-2 rounded-full bg-violet-500 text-white hover:bg-violet-600 transition-all"
htmlFor="email"
>
Request Early Access
</Label>
<MobileNav />
</div>
</div>
Expand All @@ -117,7 +137,7 @@ const Footer = () => {
className="dark:invert"
width={42}
height={26.44}
></Image>
/>
</Link>
<p>
<Balancer>{siteConfig.site_description}</Balancer>
Expand Down Expand Up @@ -148,11 +168,10 @@ const Footer = () => {
))}
</div>
</Container>
<Container className="border-t not-prose flex flex-col md:flex-row md:gap-2 gap-6 justify-between md:items-center">
<ThemeToggle />
<Container className="border-t not-prose flex flex-col md:flex-row md:gap-2 gap-6 justify-between md:items-center text-xs">
<p className="text-muted-foreground">
&copy; <a href="https://9d8.dev">9d8</a>. All rights reserved.
2025-present.
&copy; <a href="https://goodfit.so">Goodfit</a>. All rights
reserved. 2025-present.
</p>
</Container>
</Section>
Expand Down
Binary file modified app/opengraph-image.jpeg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added app/opengraph-image.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading