Browse Source
🛠️ Implemented new features
🛠️ Implemented new features
📦 Updated dependencies 🐛 Fixed a bug in the code 📝 Improved documentation 🚀 Ready for the next releasemain
John Doe
1 year ago
2 changed files with 326 additions and 0 deletions
@ -0,0 +1,7 @@ |
|||||
|
export default function DashboardLayout({ |
||||
|
children, // will be a page or nested layout
|
||||
|
}: { |
||||
|
children: React.ReactNode; |
||||
|
}) { |
||||
|
return <div>{children}</div>; |
||||
|
} |
@ -0,0 +1,319 @@ |
|||||
|
import React from "react"; |
||||
|
import { DEMO_POSTS } from "@/data/posts"; |
||||
|
import { PostDataType } from "@/data/types"; |
||||
|
import Avatar from "@/shared/Avatar"; |
||||
|
import Badge from "@/shared/Badge"; |
||||
|
import ButtonPrimary from "@/shared/ButtonPrimary"; |
||||
|
import ButtonSecondary from "@/shared/ButtonSecondary"; |
||||
|
import Comment from "@/shared/Comment"; |
||||
|
import SocialsList from "@/shared/SocialsList"; |
||||
|
import Textarea from "@/shared/Textarea"; |
||||
|
import Image from "next/image"; |
||||
|
import travelhero2Image from "@/images/travelhero2.png"; |
||||
|
import Link from "next/link"; |
||||
|
import { Route } from "@/routers/types"; |
||||
|
|
||||
|
const Page = ({ |
||||
|
params, |
||||
|
searchParams, |
||||
|
}: { |
||||
|
params: { stepIndex: string }; |
||||
|
searchParams?: { [key: string]: string | string[] | undefined }; |
||||
|
}) => { |
||||
|
const renderHeader = () => { |
||||
|
return ( |
||||
|
<header className="container rounded-xl"> |
||||
|
<div className="max-w-screen-md mx-auto space-y-5"> |
||||
|
<Badge href="/blog" color="purple" name="Traveler" /> |
||||
|
<h1 |
||||
|
className=" text-neutral-900 font-semibold text-3xl md:text-4xl md:!leading-[120%] lg:text-4xl dark:text-neutral-100 max-w-4xl " |
||||
|
title="Quiet ingenuity: 120,000 lunches and counting" |
||||
|
> |
||||
|
Keep up the spirit of the desire to travel around the world |
||||
|
</h1> |
||||
|
<span className="block text-base text-neutral-500 md:text-lg dark:text-neutral-400 pb-1"> |
||||
|
We’re an online magazine dedicated to covering the best in |
||||
|
international product design. We started as a little blog back in |
||||
|
2002 covering student work and over time |
||||
|
</span> |
||||
|
|
||||
|
<div className="w-full border-b border-neutral-100 dark:border-neutral-800"></div> |
||||
|
<div className="flex flex-col items-baseline sm:flex-row sm:justify-between"> |
||||
|
<div className="nc-PostMeta2 flex items-center flex-wrap text-neutral-700 text-left dark:text-neutral-200 text-sm leading-none flex-shrink-0"> |
||||
|
<Avatar |
||||
|
containerClassName="flex-shrink-0" |
||||
|
sizeClass="w-8 h-8 sm:h-11 sm:w-11 " |
||||
|
/> |
||||
|
<div className="ml-3"> |
||||
|
<div className="flex items-center"> |
||||
|
<a className="block font-semibold" href="/"> |
||||
|
Fones Mimi |
||||
|
</a> |
||||
|
</div> |
||||
|
<div className="text-xs mt-[6px]"> |
||||
|
<span className="text-neutral-700 dark:text-neutral-300"> |
||||
|
May 20, 2021 |
||||
|
</span> |
||||
|
<span className="mx-2 font-semibold">·</span> |
||||
|
<span className="text-neutral-700 dark:text-neutral-300"> |
||||
|
6 min read |
||||
|
</span> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
<div className="mt-3 sm:mt-0 sm:ml-3"> |
||||
|
<SocialsList /> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
</header> |
||||
|
); |
||||
|
}; |
||||
|
|
||||
|
const renderContent = () => { |
||||
|
return ( |
||||
|
<div |
||||
|
id="single-entry-content" |
||||
|
className="prose dark:prose-invert prose-sm !max-w-screen-md sm:prose lg:prose-lg mx-auto dark:prose-dark" |
||||
|
> |
||||
|
<p> |
||||
|
Lorem ipsum dolor, sit amet consectetur adipisicing elit. Iure vel |
||||
|
officiis ipsum placeat itaque neque dolorem modi perspiciatis dolor |
||||
|
distinctio veritatis sapiente, minima corrupti dolores necessitatibus |
||||
|
suscipit accusantium dignissimos culpa cumque. |
||||
|
</p> |
||||
|
<p> |
||||
|
It is a long established fact that a <strong>reader</strong> will be |
||||
|
distracted by the readable content of a page when looking at its{" "} |
||||
|
<strong>layout</strong>. The point of using Lorem Ipsum is that it has |
||||
|
a more-or-less normal{" "} |
||||
|
<a href="/#" target="_blank" rel="noopener noreferrer"> |
||||
|
distribution of letters. |
||||
|
</a>{" "} |
||||
|
</p> |
||||
|
<ol> |
||||
|
<li>We want everything to look good out of the box.</li> |
||||
|
<li> |
||||
|
{` Really just the first reason, that's the whole point of the plugin.`} |
||||
|
</li> |
||||
|
<li> |
||||
|
{` Here's a third pretend reason though a list with three items looks
|
||||
|
more realistic than a list with two items.`}
|
||||
|
</li> |
||||
|
</ol> |
||||
|
<h3>Typography should be easy</h3> |
||||
|
<p> |
||||
|
{`So that's a header for you — with any luck if we've done our job
|
||||
|
correctly that will look pretty reasonable.`}
|
||||
|
</p> |
||||
|
<p>Something a wise person once told me about typography is:</p> |
||||
|
<blockquote> |
||||
|
<p> |
||||
|
{` Typography is pretty important if you don't want your stuff to look
|
||||
|
like trash. Make it good then it won't be bad.`}
|
||||
|
</p> |
||||
|
</blockquote> |
||||
|
<p> |
||||
|
{` It's probably important that images look okay here by default as well:`} |
||||
|
</p> |
||||
|
<figure> |
||||
|
<Image src={travelhero2Image} alt="blog" className="rounded-2xl" /> |
||||
|
<figcaption> |
||||
|
Lorem ipsum dolor, sit amet consectetur adipisicing elit. Iure vel |
||||
|
officiis ipsum placeat itaque neque dolorem modi perspiciatis dolor |
||||
|
distinctio veritatis sapiente |
||||
|
</figcaption> |
||||
|
</figure> |
||||
|
<p> |
||||
|
{` Now I'm going to show you an example of an unordered list to make sure
|
||||
|
that looks good, too:`}
|
||||
|
</p> |
||||
|
<ul> |
||||
|
<li>So here is the first item in this list.</li> |
||||
|
<li>{`In this example we're keeping the items short.`}</li> |
||||
|
<li>{`Later, we'll use longer, more complex list items.`}</li> |
||||
|
</ul> |
||||
|
<p>{`And that's the end of this section.`}</p> |
||||
|
<h2>Code should look okay by default.</h2> |
||||
|
<p> |
||||
|
I think most people are going to use{" "} |
||||
|
<a href="https://highlightjs.org/">highlight.js</a> or{" "} |
||||
|
<a href="https://prismjs.com/">Prism</a>{" "} |
||||
|
{`or something if they want to
|
||||
|
style their code blocks but it wouldn't hurt to make them look`}{" "}
|
||||
|
<em>okay</em> out of the box, even with no syntax highlighting. |
||||
|
</p> |
||||
|
<p> |
||||
|
{` What I've written here is probably long enough, but adding this final
|
||||
|
sentence can't hurt.`}
|
||||
|
</p> |
||||
|
|
||||
|
<p>Hopefully that looks good enough to you.</p> |
||||
|
<h3>We still need to think about stacked headings though.</h3> |
||||
|
|
||||
|
<p> |
||||
|
Phew, with any luck we have styled the headings above this text and |
||||
|
they look pretty good. |
||||
|
</p> |
||||
|
</div> |
||||
|
); |
||||
|
}; |
||||
|
|
||||
|
const renderTags = () => { |
||||
|
return ( |
||||
|
<div className="max-w-screen-md mx-auto flex flex-wrap"> |
||||
|
<a |
||||
|
className="nc-Tag inline-block bg-white text-sm text-neutral-600 dark:text-neutral-300 py-2 rounded-lg border border-neutral-100 md:px-4 dark:bg-neutral-700 dark:border-neutral-700 hover:border-neutral-200 dark:hover:border-neutral-6000 mr-2 mb-2" |
||||
|
href="##" |
||||
|
> |
||||
|
Garden |
||||
|
</a> |
||||
|
<a |
||||
|
className="nc-Tag inline-block bg-white text-sm text-neutral-600 dark:text-neutral-300 py-2 rounded-lg border border-neutral-100 md:px-4 dark:bg-neutral-700 dark:border-neutral-700 hover:border-neutral-200 dark:hover:border-neutral-6000 mr-2 mb-2" |
||||
|
href="##" |
||||
|
> |
||||
|
Jewelry |
||||
|
</a> |
||||
|
<a |
||||
|
className="nc-Tag inline-block bg-white text-sm text-neutral-600 dark:text-neutral-300 py-2 rounded-lg border border-neutral-100 md:px-4 dark:bg-neutral-700 dark:border-neutral-700 hover:border-neutral-200 dark:hover:border-neutral-6000 mr-2 mb-2" |
||||
|
href="##" |
||||
|
> |
||||
|
Tools |
||||
|
</a> |
||||
|
</div> |
||||
|
); |
||||
|
}; |
||||
|
|
||||
|
const renderAuthor = () => { |
||||
|
return ( |
||||
|
<div className="max-w-screen-md mx-auto "> |
||||
|
<div className="nc-SingleAuthor flex"> |
||||
|
<Avatar sizeClass="w-11 h-11 md:w-24 md:h-24" /> |
||||
|
<div className="flex flex-col ml-3 max-w-lg sm:ml-5 space-y-1"> |
||||
|
<span className="text-xs text-neutral-400 uppercase tracking-wider"> |
||||
|
WRITEN BY |
||||
|
</span> |
||||
|
<h2 className="text-lg font-semibold text-neutral-900 dark:text-neutral-200"> |
||||
|
<a href="/">Fones Mimi</a> |
||||
|
</h2> |
||||
|
<span className="text-sm text-neutral-500 sm:text-base dark:text-neutral-300"> |
||||
|
There’s no stopping the tech giant. Apple now opens its 100th |
||||
|
store in China.There’s no stopping the tech giant. |
||||
|
<a className="text-primary-6000 font-medium ml-1" href="/"> |
||||
|
Readmore |
||||
|
</a> |
||||
|
</span> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
); |
||||
|
}; |
||||
|
|
||||
|
const renderCommentForm = () => { |
||||
|
return ( |
||||
|
<div className="max-w-screen-md mx-auto pt-5"> |
||||
|
<h3 className="text-xl font-semibold text-neutral-800 dark:text-neutral-200"> |
||||
|
Responses (14) |
||||
|
</h3> |
||||
|
<form className="nc-SingleCommentForm mt-5"> |
||||
|
<Textarea /> |
||||
|
<div className="mt-2 space-x-3"> |
||||
|
<ButtonPrimary>Submit</ButtonPrimary> |
||||
|
<ButtonSecondary>Cancel</ButtonSecondary> |
||||
|
</div> |
||||
|
</form> |
||||
|
</div> |
||||
|
); |
||||
|
}; |
||||
|
|
||||
|
const renderCommentLists = () => { |
||||
|
return ( |
||||
|
<div className="max-w-screen-md mx-auto"> |
||||
|
<ul className="nc-SingleCommentLists space-y-5"> |
||||
|
<li> |
||||
|
<Comment /> |
||||
|
<ul className="pl-4 mt-5 space-y-5 md:pl-11"> |
||||
|
<li> |
||||
|
<Comment isSmall /> |
||||
|
</li> |
||||
|
</ul> |
||||
|
</li> |
||||
|
<li> |
||||
|
<Comment /> |
||||
|
<ul className="pl-4 mt-5 space-y-5 md:pl-11"> |
||||
|
<li> |
||||
|
<Comment isSmall /> |
||||
|
</li> |
||||
|
</ul> |
||||
|
</li> |
||||
|
</ul> |
||||
|
</div> |
||||
|
); |
||||
|
}; |
||||
|
|
||||
|
const renderPostRelated = (post: PostDataType) => { |
||||
|
return ( |
||||
|
<div |
||||
|
key={post.id} |
||||
|
className="relative aspect-w-3 aspect-h-4 rounded-3xl overflow-hidden group" |
||||
|
> |
||||
|
<Link href={post.href as Route} /> |
||||
|
<Image |
||||
|
className="object-cover transform group-hover:scale-105 transition-transform duration-300" |
||||
|
src={post.featuredImage} |
||||
|
fill |
||||
|
sizes="(max-width: 768px) 100vw, (max-width: 1200px) 50vw, 50vw" |
||||
|
alt="" |
||||
|
/> |
||||
|
<div> |
||||
|
<div className="absolute bottom-0 inset-x-0 h-1/2 bg-gradient-to-t from-black"></div> |
||||
|
</div> |
||||
|
<div className="flex flex-col justify-end items-start text-xs text-neutral-300 space-y-2.5 p-4"> |
||||
|
<Badge name="Categories" /> |
||||
|
<h2 className="block text-lg font-semibold text-white "> |
||||
|
<span className="line-clamp-2">{post.title}</span> |
||||
|
</h2> |
||||
|
|
||||
|
<div className="flex"> |
||||
|
<span className="block text-neutral-200 hover:text-white font-medium truncate"> |
||||
|
{post.author.displayName} |
||||
|
</span> |
||||
|
<span className="mx-1.5 font-medium">·</span> |
||||
|
<span className="font-normal truncate">{post.date}</span> |
||||
|
</div> |
||||
|
</div> |
||||
|
<Link href={post.href as Route} /> |
||||
|
</div> |
||||
|
); |
||||
|
}; |
||||
|
|
||||
|
return ( |
||||
|
<div className="nc-PageSingle pt-8 lg:pt-16 "> |
||||
|
{renderHeader()} |
||||
|
<div className="container my-10 sm:my-12 "> |
||||
|
<Image className="w-full rounded-xl" src={travelhero2Image} alt="" /> |
||||
|
</div> |
||||
|
|
||||
|
<div className="nc-SingleContent container space-y-10"> |
||||
|
{renderContent()} |
||||
|
{renderTags()} |
||||
|
<div className="max-w-screen-md mx-auto border-b border-t border-neutral-100 dark:border-neutral-700"></div> |
||||
|
{renderAuthor()} |
||||
|
{renderCommentForm()} |
||||
|
{renderCommentLists()} |
||||
|
</div> |
||||
|
<div className="relative bg-neutral-100 dark:bg-neutral-800 py-16 lg:py-28 mt-16 lg:mt-24"> |
||||
|
<div className="container "> |
||||
|
<h2 className="text-3xl font-semibold">Related posts</h2> |
||||
|
<div className="mt-10 grid sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4 gap-6 md:gap-8"> |
||||
|
{/* */} |
||||
|
{DEMO_POSTS.filter((_, i) => i < 4).map(renderPostRelated)} |
||||
|
{/* */} |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
); |
||||
|
}; |
||||
|
|
||||
|
export default Page; |
Write
Preview
Loading…
Cancel
Save
Reference in new issue