init next.js app

This commit is contained in:
Musa 2026-01-30 17:35:45 -08:00
parent d8b4c800e6
commit c0877e312c
10 changed files with 339 additions and 0 deletions

41
apps/katanemo-www/.gitignore vendored Normal file
View file

@ -0,0 +1,41 @@
# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
# dependencies
/node_modules
/.pnp
.pnp.*
.yarn/*
!.yarn/patches
!.yarn/plugins
!.yarn/releases
!.yarn/versions
# testing
/coverage
# next.js
/.next/
/out/
# production
/build
# misc
.DS_Store
*.pem
# debug
npm-debug.log*
yarn-debug.log*
yarn-error.log*
.pnpm-debug.log*
# env files (can opt-in for committing if needed)
.env*
# vercel
.vercel
# typescript
*.tsbuildinfo
next-env.d.ts

View file

@ -0,0 +1,37 @@
{
"$schema": "https://biomejs.dev/schemas/2.2.0/schema.json",
"vcs": {
"enabled": true,
"clientKind": "git",
"useIgnoreFile": true
},
"files": {
"ignoreUnknown": true,
"includes": ["**", "!node_modules", "!.next", "!dist", "!build"]
},
"formatter": {
"enabled": true,
"indentStyle": "space",
"indentWidth": 2
},
"linter": {
"enabled": true,
"rules": {
"recommended": true,
"suspicious": {
"noUnknownAtRules": "off"
}
},
"domains": {
"next": "recommended",
"react": "recommended"
}
},
"assist": {
"actions": {
"source": {
"organizeImports": "on"
}
}
}
}

View file

@ -0,0 +1,33 @@
import type { NextConfig } from "next";
const nextConfig: NextConfig = {
transpilePackages: [
"@katanemo/ui",
"@katanemo/shared-styles",
"@katanemo/tailwind-config",
"@katanemo/tsconfig",
],
experimental: {
externalDir: true,
},
webpack: (config, { isServer }) => {
config.resolve.modules = [
...(config.resolve.modules || []),
"node_modules",
"../../node_modules",
];
if (!isServer) {
config.resolve.fallback = {
...config.resolve.fallback,
fs: false,
};
}
return config;
},
turbopack: {
resolveAlias: {},
},
};
export default nextConfig;

View file

@ -0,0 +1,33 @@
{
"name": "@katanemo/katanemo-www",
"version": "0.1.0",
"private": true,
"scripts": {
"dev": "next dev",
"build": "next build",
"start": "next start",
"lint": "biome check",
"format": "biome format --write",
"typecheck": "tsc --noEmit",
"clean": "rm -rf .next"
},
"dependencies": {
"@katanemo/shared-styles": "*",
"@katanemo/ui": "*",
"next": "^16.1.6",
"react": "19.2.0",
"react-dom": "19.2.0"
},
"devDependencies": {
"@biomejs/biome": "2.2.0",
"@katanemo/tailwind-config": "*",
"@katanemo/tsconfig": "*",
"@tailwindcss/postcss": "^4",
"@types/node": "^20",
"@types/react": "^19",
"@types/react-dom": "^19",
"tailwindcss": "^4",
"tw-animate-css": "^1.4.0",
"typescript": "^5"
}
}

View file

@ -0,0 +1,7 @@
const config = {
plugins: {
"@tailwindcss/postcss": {},
},
};
export default config;

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 343 KiB

View file

@ -0,0 +1,19 @@
:root {
--katanemo-bg-start: #04171a;
--katanemo-bg-end: #0a292e;
--font-sans: var(--font-ibm-plex-sans);
}
html,
body {
background: linear-gradient(
to bottom,
var(--katanemo-bg-start),
var(--katanemo-bg-end)
);
min-height: 100%;
}
body {
font-family: var(--font-ibm-plex-sans, var(--font-sans));
}

View file

@ -0,0 +1,58 @@
import type { Metadata } from "next";
import Script from "next/script";
import localFont from "next/font/local";
import "@katanemo/shared-styles/globals.css";
import "./globals.css";
const ibmPlexSans = localFont({
src: [
{
path: "../../../www/public/fonts/IBMPlexSans-VariableFont_wdth,wght.ttf",
weight: "100 700",
style: "normal",
},
{
path: "../../../www/public/fonts/IBMPlexSans-Italic-VariableFont_wdth,wght.ttf",
weight: "100 700",
style: "italic",
},
],
display: "swap",
variable: "--font-ibm-plex-sans",
});
export const metadata: Metadata = {
title: "Katanemo Labs",
description:
"Forward-deployed AI infrastructure engineers delivering industry-leading research and open-source technologies,",
icons: {
icon: "/KatanemoLogo.svg",
},
};
export default function RootLayout({
children,
}: Readonly<{
children: React.ReactNode;
}>) {
return (
<html lang="en">
<body className={`${ibmPlexSans.variable} antialiased text-white`}>
{/* Google tag (gtag.js) */}
<Script
src="https://www.googletagmanager.com/gtag/js?id=G-RLD5BDNW5N"
strategy="afterInteractive"
/>
<Script strategy="afterInteractive">
{`
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
gtag('js', new Date());
gtag('config', 'G-RLD5BDNW5N');
`}
</Script>
<div className="min-h-screen">{children}</div>
</body>
</html>
);
}

View file

@ -0,0 +1,72 @@
import Image from "next/image";
import Link from "next/link";
export default function HomePage() {
return (
<main className="relative flex min-h-screen items-center justify-center overflow-hidden px-6 pt-12 pb-16 font-sans sm:pt-20 lg:items-start lg:justify-start lg:pt-24">
<div className="relative mx-auto w-full max-w-6xl flex flex-col items-center justify-center text-left lg:items-start lg:justify-start">
<div className="pointer-events-none mb-6 w-full self-start lg:hidden">
<Image
src="/KatanemoLogo.svg"
alt="Katanemo Logo"
width={64}
height={64}
priority
className="h-auto w-10 sm:w-20"
/>
</div>
<div className="relative z-10 max-w-xl sm:max-w-2xl lg:max-w-2xl xl:max-w-8xl lg:pr-[26vw] xl:pr-[2vw] sm:right-0 md:right-0 lg:right-0 xl:right-20 2xl:right-50 sm:mt-36 mt-0">
<h1 className="text-3xl sm:text-4xl md:text-5xl lg:text-6xl font-sans font-medium leading-tight tracking-tight text-white">
Forward-deployed AI infrastructure engineers.
</h1>
<p className="mt-4 font-light tracking-[-0.4px] max-w-2xl text-base sm:text-lg md:text-xl lg:text-2xl text-white/70">
Bringing industry-leading research and open-source technologies for
agentic AI development efforts.
</p>
<div className="mt-18 flex flex-col gap-3 text-lg sm:text-xl lg:text-3xl font-light tracking-wide sm:tracking-[-0.03em] leading-snug">
<Link
href="https://huggingface.co/katanemo"
className="flex items-center gap-2 text-[#31C887] hover:text-[#45e394] transition-colors"
>
<span>Models Research</span>
<span aria-hidden className="text-emerald-300"></span>
</Link>
<Link
href="https://github.com/katanemo/plano"
className="flex items-center gap-2 text-[#31C887] hover:text-[#45e394] transition-colors"
>
<span>Plano - Open Source Agent Infrastructure</span>
<span aria-hidden className="text-emerald-300"></span>
</Link>
</div>
<div className="mt-24">
<div className="sm:max-w-7xl max-w-72 mb-4 text-sm sm:text-base lg:text-lg text-white/70 tracking-[-0.3px] sm:tracking-[0.8px]! font-light">
Move faster and more reliably by letting Katanemo do the heavy-lifting.
</div>
<a
href="mailto:interest@katanemo.com"
className="text-sm sm:text-sm text-white/50 hover:text-white transition-colors cursor-pointer"
>
Contact Us
</a>
<div className="mt-4 h-px w-52 bg-white/10" />
<div className="mt-3 text-sm text-white/50">
© 2026 Katanemo Labs, Inc.
</div>
</div>
</div>
<div className="pointer-events-none absolute top-50 right-[-20vw] sm:right-[-10vw] md:right-[-5vw] lg:right-[-20vw] xl:right-[-7vw] 2xl:right-[-17vw] hidden lg:block">
<Image
src="/KatanemoLogo.svg"
alt="Katanemo Logo"
width={900}
height={1000}
priority
className="h-[95vh] w-auto max-w-none opacity-90"
/>
</div>
</div>
</main>
);
}

View file

@ -0,0 +1,20 @@
{
"extends": "@katanemo/tsconfig/nextjs.json",
"compilerOptions": {
"jsx": "react-jsx",
"esModuleInterop": true,
"paths": {
"@/*": ["./src/*"],
"@katanemo/ui": ["../../packages/ui/src"]
}
},
"include": [
"next-env.d.ts",
"**/*.ts",
"**/*.tsx",
".next/types/**/*.ts",
".next/dev/types/**/*.ts",
"**/*.mts"
],
"exclude": ["node_modules"]
}