Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
27 commits
Select commit Hold shift + click to select a range
2ca7aed
Starting a new documentation from scratch
Studio384 Apr 8, 2026
6798c67
Make menu dynamic, add in error page
Studio384 Apr 9, 2026
1c1c0d7
Adding all documentation pages
Studio384 Apr 9, 2026
63195c7
Merge branch '1-alpha' into 1-neo
Studio384 Apr 9, 2026
9a2af20
Implement documentation navigation
Studio384 Apr 9, 2026
ae131cc
Minor adjustments and enhancements
Studio384 Apr 9, 2026
fe8e9fc
Shouldn't be a H2 tag, slightly larger text
Studio384 Apr 9, 2026
076abe0
Import the Playground and ApiTable into Neo
Studio384 Apr 9, 2026
a6e5a84
Reimplementing releases
Studio384 Apr 9, 2026
4c24d7b
Make pagination better fit in
Studio384 Apr 9, 2026
3566d97
Merge branch '1-alpha' into 1-neo
Studio384 Apr 10, 2026
535d891
Merge branch '1-alpha' into 1-neo
Studio384 Apr 11, 2026
9f4648d
Add date-fns
Studio384 Apr 12, 2026
0e176b3
Moving release notes to markdown
Studio384 Apr 12, 2026
0f660ab
Unify Releases index and pages, minor cleanups
Studio384 Apr 12, 2026
15ae1d2
Sort by version too for releases launched on the same day
Studio384 Apr 12, 2026
bf65f02
Unify docs and release notes design
Studio384 Apr 13, 2026
35e42ac
Minor consistency fixes
Studio384 Apr 13, 2026
9818569
Fix release index page
Studio384 Apr 13, 2026
70aa190
Sticky page headers
Studio384 Apr 14, 2026
1f2b4be
Improve menu scroll
Studio384 Apr 14, 2026
2a70a0e
Add small menu item size
Studio384 Apr 14, 2026
8b06153
Add social links
Studio384 Apr 15, 2026
1c37c1a
Add branding, move socials
Studio384 Apr 15, 2026
3204128
Move PageHeader to its own component
Studio384 Apr 15, 2026
d272727
Unify and simplify page structure
Studio384 Apr 15, 2026
c96aa31
Minor menu cleanup
Studio384 Apr 15, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions docs/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
"@tanstack/react-pacer": "^0.21.1",
"clsx": "^2.1.1",
"cva": "1.0.0-beta.4",
"date-fns": "^4.1.0",
"react": "^19.2.5",
"react-dom": "^19.2.5",
"react-router": "^7.14.0",
Expand Down
8 changes: 8 additions & 0 deletions docs/pnpm-lock.yaml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

47 changes: 47 additions & 0 deletions docs/src/Router.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,20 @@ import Icon from "./app/Icon";
import Icons from "./app/Icons";
import Releases from "./app/Releases";
import Layout from "./design/layout/Layout";
import NeoPageAbout from "./neo/app/docs/About.mdx";
import NeoPageBeat from "./neo/app/docs/Beat.mdx";
import NeoPageBounce from "./neo/app/docs/Bounce.mdx";
import NeoPageFade from "./neo/app/docs/Fade.mdx";
import NeoPageFlip from "./neo/app/docs/Flip.mdx";
import NeoPageInstallation from "./neo/app/docs/Installation.mdx";
import NeoPageRotate from "./neo/app/docs/Rotate.mdx";
import NeoPageSpin from "./neo/app/docs/Spin.mdx";
import NeoDocumentation from "./neo/app/Documentation";
import NeoError from "./neo/app/Error";
import NeoIcons from "./neo/app/Icons";
import NeoReleasePage from "./neo/app/Release";
import NeoReleases from "./neo/app/Releases";
import NeoLayout from "./neo/design/layouts/Layout";

export const router = createHashRouter([
{
Expand Down Expand Up @@ -62,4 +76,37 @@ export const router = createHashRouter([
},
],
},
{
path: "/neo",
Component: NeoLayout,
children: [
{ index: true, Component: NeoIcons },
{ path: "icons", Component: NeoIcons },
{
path: "releases",
errorElement: <NeoError />,
children: [
{ index: true, Component: NeoReleases },
{ path: ":slug", Component: NeoReleasePage },
],
},
{
path: "documentation",
Component: NeoDocumentation,
errorElement: <NeoError />,
children: [
{ index: true, element: <Navigate to="installation" replace /> },
{ path: "about", Component: NeoPageAbout },
{ path: "installation", Component: NeoPageInstallation },
{ path: "spin", Component: NeoPageSpin },
{ path: "bounce", Component: NeoPageBounce },
{ path: "rotate", Component: NeoPageRotate },
{ path: "flip", Component: NeoPageFlip },
{ path: "beat", Component: NeoPageBeat },
{ path: "fade", Component: NeoPageFade },
],
},
{ path: "*", Component: NeoError },
],
},
]);
88 changes: 88 additions & 0 deletions docs/src/neo/app/Documentation.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
import { Outlet, Link, useLocation } from "react-router";

import { Separator } from "@base-ui/react";
import Amicon, { aiBook, aiArrowLeft, aiArrowRight } from "@studio384/amicons";

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

import PageHeader from "../design/blocks/PageHeader";
import { DOC_PAGES } from "./docs/navigation";

export default function NeoDocumentation() {
const location = useLocation();
const currentPage = DOC_PAGES.find((page) => page.path === location.pathname);
const currentIndex = DOC_PAGES.findIndex((page) => page.path === location.pathname);

if (currentIndex === -1) return null;

const prev = currentIndex > 0 ? DOC_PAGES[currentIndex - 1] : null;
const next = currentIndex < DOC_PAGES.length - 1 ? DOC_PAGES[currentIndex + 1] : null;

return (
<>
<PageHeader
icon={currentPage?.icon ?? aiBook}
title={currentPage?.title ?? "Documentation"}
subtitle={currentPage?.sectionTitle ?? "Documentation"}
/>

<div className="flex flex-col gap-4 p-4">
<article className="neo-docs neo-doc-page container mx-auto max-w-4xl">
<Outlet />
</article>

<Separator
orientation="horizontal"
className="container max-w-4xl mx-auto h-px bg-zinc-950/5 dark:bg-zinc-950/10"
/>

<div className="container mx-auto max-w-4xl">
<nav className="grid grid-cols-1 grid-rows-2 gap-1 @md/main:grid-cols-2 @md/main:grid-rows-1 @xl2/main:grid-cols-3">
{prev && (
<Link
to={prev.path}
className={cn(
"group grid grid-cols-[min-content_auto] flex-col gap-2 rounded-sm px-3 py-2 transition-all duration-150",
"col-start-1 hover:bg-violet-600 hover:text-white hover:shadow-sm",
)}
>
<Amicon
icon={aiArrowLeft}
className="mt-1 text-sm text-zinc-500 duration-150! group-hover:text-white/75"
/>
<div className="flex flex-col">
<span className="text-sm text-zinc-500 duration-150 group-hover:text-white/75">
{prev.sectionTitle}
</span>
<span className="font-display my-1 text-xl/5 font-medium">{prev.title}</span>
</div>
</Link>
)}
{next && (
<Link
to={next.path}
className={cn(
"group grid grid-cols-[auto_min-content] flex-col gap-2 rounded-sm px-3 py-2 transition-all duration-150",
"hover:bg-violet-600 hover:text-white hover:shadow-sm @md/main:col-start-2 @xl2/main:col-start-3",
)}
>
<div className="flex flex-col items-end">
<span className="text-sm text-zinc-500 duration-150 group-hover:text-white/75">
{next.sectionTitle}
</span>
<span className="font-display my-1 text-xl/5 font-medium text-end">
{next.title}
</span>
</div>
<Amicon
icon={aiArrowRight}
className="mt-1 text-sm text-zinc-500 duration-150! group-hover:text-white/75"
/>
</Link>
)}
</nav>
</div>
</div>
</>
);
}
13 changes: 13 additions & 0 deletions docs/src/neo/app/Error.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
import Amicon from "@studio384/amicons";

export default function NeoError() {
return (
<div className="flex h-full w-full flex-col items-center justify-center">
<div className="max-w-120">
<Amicon className="pb-4 text-8xl text-violet-600" />
<h1 className="font-display text-lg font-medium tracking-tight text-zinc-500">Error 404</h1>
<p className="text-4xl font-semibold">And we still haven't found what you're looking for...</p>
</div>
</div>
);
}
3 changes: 3 additions & 0 deletions docs/src/neo/app/Icons.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
export default function NeoIcons() {
return <div>Content page</div>;
}
113 changes: 113 additions & 0 deletions docs/src/neo/app/Release.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,113 @@
import { Link, Navigate, useParams } from "react-router";

import { Separator } from "@base-ui/react";
import Amicon, { aiAmicons, aiArrowLeft, aiArrowRight } from "@studio384/amicons";
import { format, parse } from "date-fns";

import ReleaseCard from "@/neo/design/blocks/ReleaseCard";
import { cn } from "@/utils/cn";

import PageHeader from "../design/blocks/PageHeader";
import { getReleaseBySlug, releases } from "./releases/releaseEntries";

export default function Release() {
const { slug } = useParams();
const release = getReleaseBySlug(slug);

if (!release) {
return <Navigate to="/neo/releases" replace />;
}

const ReleaseComponent = release.Component;
const releaseIndex = releases.findIndex((entry) => entry.slug === release.slug);
const nextRelease = releaseIndex > 0 ? releases[releaseIndex - 1] : undefined;
const previousRelease =
releaseIndex < releases.length - 1 ? releases[releaseIndex + 1] : undefined;

return (
<>
<PageHeader
icon={aiAmicons}
title={release.name}
subtitle={format(parse(release.publishDate, "yyyy-MM-dd", new Date()), "d MMMM yyyy")}
>
<Link
to="/neo/releases"
className="font-display inline-flex items-center gap-1 text-violet-700 transition-colors hover:text-violet-900"
>
<Amicon icon={aiArrowLeft} /> All releases
</Link>
</PageHeader>

<div className="flex flex-col gap-4 p-4">
<article className="container mx-auto max-w-4xl">
<ReleaseCard
excerpt={release.excerpt}
newIcons={release.newIcons}
updatedIcons={release.updatedIcons}
renamedIcons={release.renamedIcons}
removedIcons={release.removedIcons}
>
<ReleaseComponent />
</ReleaseCard>
</article>

<Separator
orientation="horizontal"
className="container max-w-4xl mx-auto h-px bg-zinc-950/5 dark:bg-zinc-950/10"
/>

{(nextRelease || previousRelease) && (
<div className="container mx-auto max-w-4xl">
<nav className="grid grid-cols-1 grid-rows-2 gap-1 @md/main:grid-cols-2 @md/main:grid-rows-1 @xl2/main:grid-cols-3">
{nextRelease && (
<Link
to={`/neo/releases/${nextRelease.slug}`}
className={cn(
"group grid grid-cols-[min-content_auto] flex-col gap-2 rounded-sm px-3 py-2 transition-all duration-150",
"col-start-1 hover:bg-violet-600 hover:text-white hover:shadow-sm",
)}
>
<Amicon
icon={aiArrowLeft}
className="mt-1 text-sm text-zinc-500 duration-150! group-hover:text-white/75"
/>
<div className="flex flex-col">
<span className="text-sm text-zinc-500 duration-150 group-hover:text-white/75">
Next release
</span>
<span className="font-display my-1 text-xl/5 font-medium">
{nextRelease.name}
</span>
</div>
</Link>
)}
{previousRelease && (
<Link
to={`/neo/releases/${previousRelease.slug}`}
className={cn(
"group grid grid-cols-[auto_min-content] flex-col gap-2 rounded-sm px-3 py-2 transition-all duration-150",
"hover:bg-violet-600 hover:text-white hover:shadow-sm @md/main:col-start-2 @xl2/main:col-start-3",
)}
>
<div className="flex flex-col items-end">
<span className="text-sm text-zinc-500 duration-150 group-hover:text-white/75">
Previous release
</span>
<span className="font-display my-1 text-xl/5 font-medium text-end">
{previousRelease.name}
</span>
</div>
<Amicon
icon={aiArrowRight}
className="mt-1 text-sm text-zinc-500 duration-150! group-hover:text-white/75"
/>
</Link>
)}
</nav>
</div>
)}
</div>
</>
);
}
Loading