beta/src/pages/blog/all.tsx (54 lines of code) (raw):
import blogIndex from 'blogIndex.json';
import blogIndexRecentRouteTree from 'blogIndexRecent.json';
import {ExternalLink} from 'components/ExternalLink';
import {IconRss} from 'components/Icon/IconRss';
import {Page} from 'components/Layout/Page';
import format from 'date-fns/format';
import parseISO from 'date-fns/parseISO';
import Link from 'next/link';
import * as React from 'react';
import {getAuthor} from 'utils/getAuthor';
import {removeFromLast} from 'utils/removeFromLast';
import toCommaSeparatedList from 'utils/toCommaSeparatedList';
export default function Archive() {
return (
<div className="mx-auto max-w-5xl container px-4 sm:px-6 lg:px-8 pt-16">
<header className="py-16 ">
<div className="flex items-center justify-between">
<h1 className="text-5xl font-bold">Blog Archive</h1>
<a
href="/feed.xml"
className="p-2 betterhover:hover:bg-gray-20 transition duration-150 ease-in-out rounded-lg inline-flex items-center">
<IconRss className="w-5 h-5 mr-2" />
RSS
</a>
</div>
<p className="text-gray-70 text-2xl">
Historical archive of React news, announcements, and release notes.
</p>
</header>
<div className="grid grid-cols-1 md:grid-cols-2 gap-8 pb-40">
{blogIndex.routes.map((post) => (
<div key={post.path}>
<h3 className="font-bold text-xl ">
<Link href={removeFromLast(post.path, '.')}>
<a>{post.title}</a>
</Link>
</h3>
<div className="flex items-center">
<div>
<p className="text-sm leading-5 text-gray-80">
By{' '}
{toCommaSeparatedList(post.author, (author) => (
<ExternalLink
href={getAuthor(author).url}
className="font-bold betterhover:hover:underline">
<span>{getAuthor(author).name}</span>
</ExternalLink>
))}
</p>
<div className="flex text-sm leading-5 text-gray-50">
<time dateTime={post.date}>
{format(parseISO(post.date), 'MMMM dd, yyyy')}
</time>
<span className="mx-1">·</span>
<span>{post.readingTime}</span>
</div>
</div>
</div>
</div>
))}
</div>
</div>
);
}
Archive.displayName = 'Index';
Archive.appShell = function AppShell(props: {children: React.ReactNode}) {
return <Page routeTree={blogIndexRecentRouteTree} {...props} />;
};