From 5b7ccf0b671e2999b62befc729a3e517a0433728 Mon Sep 17 00:00:00 2001 From: Bertrand Yuan Date: Mon, 15 Dec 2025 23:48:10 +0800 Subject: initial commit -- the front-end prototype The initial code is base on Anirudh's work. More to see at: https://github.com/techwithanirudh/shadcn-blog Therefore, the code in this commit is under MIT license. --- src/components/active-link.tsx | 44 +++++ src/components/analytics.tsx | 20 +++ src/components/auth/user-avatar.tsx | 56 +++++++ src/components/auth/user-button.tsx | 127 +++++++++++++++ src/components/blur-image.tsx | 43 +++++ src/components/docs.tsx | 64 ++++++++ src/components/icons/animated/check.tsx | 111 +++++++++++++ src/components/icons/animated/upload.tsx | 102 ++++++++++++ src/components/icons/icons.tsx | 131 +++++++++++++++ src/components/inline-link.tsx | 28 ++++ src/components/json-ld.tsx | 114 +++++++++++++ src/components/mdx-layout.tsx | 51 ++++++ src/components/newsletter-form.tsx | 96 +++++++++++ src/components/numbered-pagination.tsx | 131 +++++++++++++++ src/components/posts/post-card.tsx | 76 +++++++++ src/components/section.tsx | 44 +++++ src/components/sections/footer.tsx | 112 +++++++++++++ src/components/sections/header/index.tsx | 174 ++++++++++++++++++++ src/components/sections/header/menu.tsx | 120 ++++++++++++++ src/components/sections/header/navbar.tsx | 55 +++++++ src/components/separator.tsx | 10 ++ src/components/tags/tag-card.tsx | 35 ++++ src/components/tailwind-indicator.tsx | 14 ++ src/components/theme-provider.tsx | 11 ++ src/components/theme-toggle.tsx | 126 +++++++++++++++ src/components/ui/accordion.tsx | 66 ++++++++ src/components/ui/alert.tsx | 66 ++++++++ src/components/ui/avatar.tsx | 53 ++++++ src/components/ui/button.tsx | 59 +++++++ src/components/ui/card.tsx | 92 +++++++++++ src/components/ui/dropdown-menu.tsx | 257 ++++++++++++++++++++++++++++++ src/components/ui/form.tsx | 168 +++++++++++++++++++ src/components/ui/input.tsx | 21 +++ src/components/ui/label.tsx | 24 +++ src/components/ui/pagination.tsx | 126 +++++++++++++++ src/components/ui/skeleton.tsx | 13 ++ src/components/ui/sonner.tsx | 25 +++ 37 files changed, 2865 insertions(+) create mode 100644 src/components/active-link.tsx create mode 100644 src/components/analytics.tsx create mode 100644 src/components/auth/user-avatar.tsx create mode 100644 src/components/auth/user-button.tsx create mode 100644 src/components/blur-image.tsx create mode 100644 src/components/docs.tsx create mode 100644 src/components/icons/animated/check.tsx create mode 100644 src/components/icons/animated/upload.tsx create mode 100644 src/components/icons/icons.tsx create mode 100644 src/components/inline-link.tsx create mode 100644 src/components/json-ld.tsx create mode 100644 src/components/mdx-layout.tsx create mode 100644 src/components/newsletter-form.tsx create mode 100644 src/components/numbered-pagination.tsx create mode 100644 src/components/posts/post-card.tsx create mode 100644 src/components/section.tsx create mode 100644 src/components/sections/footer.tsx create mode 100644 src/components/sections/header/index.tsx create mode 100644 src/components/sections/header/menu.tsx create mode 100644 src/components/sections/header/navbar.tsx create mode 100644 src/components/separator.tsx create mode 100644 src/components/tags/tag-card.tsx create mode 100644 src/components/tailwind-indicator.tsx create mode 100644 src/components/theme-provider.tsx create mode 100644 src/components/theme-toggle.tsx create mode 100644 src/components/ui/accordion.tsx create mode 100644 src/components/ui/alert.tsx create mode 100644 src/components/ui/avatar.tsx create mode 100644 src/components/ui/button.tsx create mode 100644 src/components/ui/card.tsx create mode 100644 src/components/ui/dropdown-menu.tsx create mode 100644 src/components/ui/form.tsx create mode 100644 src/components/ui/input.tsx create mode 100644 src/components/ui/label.tsx create mode 100644 src/components/ui/pagination.tsx create mode 100644 src/components/ui/skeleton.tsx create mode 100644 src/components/ui/sonner.tsx (limited to 'src/components') diff --git a/src/components/active-link.tsx b/src/components/active-link.tsx new file mode 100644 index 0000000..bab9670 --- /dev/null +++ b/src/components/active-link.tsx @@ -0,0 +1,44 @@ +'use client'; + +import { isActive } from '@/lib/is-active'; +import { cn } from '@/lib/utils'; +import Link, { type LinkProps } from 'next/link'; +import { usePathname } from 'next/navigation'; +import type { ReactNode } from 'react'; + +type ActiveLinkProps = LinkProps & { + children: ReactNode; + href: string; + target?: string; + rel?: string; + className?: string; + nested?: boolean; +}; + +export const ActiveLink = ({ + href, + children, + className, + nested = false, + ...props +}: ActiveLinkProps) => { + const pathname = usePathname(); + const active = isActive(href, pathname, nested); + + return ( + + {children} + + ); +}; diff --git a/src/components/analytics.tsx b/src/components/analytics.tsx new file mode 100644 index 0000000..c3e296c --- /dev/null +++ b/src/components/analytics.tsx @@ -0,0 +1,20 @@ +import { env } from '@/env'; +import Script from 'next/script'; + +import { isProduction } from '@/lib/constants'; + +const Analytics = () => { + if (!isProduction) return null; + if (!env.NEXT_PUBLIC_UMAMI_URL) return null; + if (!env.NEXT_PUBLIC_UMAMI_WEBSITE_ID) return null; + + return ( +