Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
2 changes: 0 additions & 2 deletions .prettierrc.js
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,6 @@ const config = {
importOrder: [
'^@/components(.*)$',
'',
'^@/UI(.*)$',
'',
'^@/services(.*)$',
'',
'^@/libs(.*)$',
Expand Down
7 changes: 3 additions & 4 deletions CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -62,18 +62,17 @@ All blog, portfolio, and research entries are MDX files on disk — there's no C
`tsconfig.json` baseUrl is `./src`. Use:

- `@/*` → `src/*`
- `@/UI` and `@/UI/*` → `src/components/legacy-ui` and `src/components/legacy-ui/*` (transitional alias for the bespoke site components — see "Component Layout" below)

Imports are auto-sorted by `@ianvs/prettier-plugin-sort-imports` (order defined in `.prettierrc.js`): `@/components` → `@/UI` → `@/services` → `@/libs` → `@/...` → relative → third-party → `@/styles/*`. Empty strings in `importOrder` produce blank-line separators between groups. Don't reshuffle by hand; let Prettier do it.
Imports are auto-sorted by `@ianvs/prettier-plugin-sort-imports` (order defined in `.prettierrc.js`): `@/components` → `@/services` → `@/libs` → `@/...` → relative → third-party → `@/styles/*`. Empty strings in `importOrder` produce blank-line separators between groups. Don't reshuffle by hand; let Prettier do it.

## Component Layout

Two roots under `src/components/`:

- **`ui/`** — shadcn/ui primitives. Every file here is generated by `npx shadcn@latest add <name>` and follows shadcn's data-slot, variant, and class conventions. Don't edit by hand unless intentionally extending; instead use `npx shadcn@latest add <name> --diff` to merge upstream changes. Built on `radix-ui` (configured in `components.json` as `style: radix-nova`); `radix-ui` is **not** a competing UI system — it's shadcn's primitive layer.
- **`legacy-ui/`** — bespoke composition components specific to this site (Header, Footer, Nav, AppLayoutPage, Hero, Searchbar, BackToTop, EmptyResult, MobileNav, ThemeMenu, links, image wrappers). They compose `ui/` primitives + project state. The folder is named "legacy-ui" because it predates shadcn; the contents now use shadcn primitives internally and the rename is a future-PR concern.
- **`site/`** — bespoke composition components specific to this site (Header, Footer, Nav, AppLayoutPage, Hero, Searchbar, BackToTop, EmptyResult, MobileNav, ThemeMenu, links, image wrappers). They compose `ui/` primitives + project state.

When you need a new primitive, **search shadcn first** (`npx shadcn@latest search`). Only fall back to a bespoke component in `legacy-ui/` (or a feature folder) if no primitive fits.
When you need a new primitive, **search shadcn first** (`npx shadcn@latest search`). Only fall back to a bespoke component in `site/` (or a feature folder) if no primitive fits.

## Theme System

Expand Down
3 changes: 1 addition & 2 deletions src/app/blog/[slug]/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,7 @@ import { BlogPostClient } from '@/components/blog/BlogPostClient'
import { AdjacentPosts } from '@/components/content/blog/AdjacentPosts'
import { RelatedPosts } from '@/components/content/blog/RelatedPosts'
import { MDXComponents } from '@/components/content/mdx'

import { Footer } from '@/UI/common'
import { Footer } from '@/components/site/common'

import { getContentBySlug, getContentHeaders } from '@/services/content'

Expand Down
2 changes: 1 addition & 1 deletion src/app/blog/page.tsx
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { BlogPageClient } from '@/components/blog/BlogPageClient'
import { AppLayoutPage } from '@/components/legacy-ui/templates/AppLayoutPage'
import { AppLayoutPage } from '@/components/site/templates/AppLayoutPage'

import { getContents } from '@/services'

Expand Down
4 changes: 2 additions & 2 deletions src/app/blog/topics/[topic]/page.tsx
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { BlogList } from '@/components/content/blog/BlogList'
import { AppLayoutPage } from '@/components/legacy-ui/templates/AppLayoutPage'
import { Hero } from '@/components/legacy-ui/templates/Hero'
import { Breadcrumbs } from '@/components/SEO/Breadcrumbs'
import { AppLayoutPage } from '@/components/site/templates/AppLayoutPage'
import { Hero } from '@/components/site/templates/Hero'

import { getContents } from '@/services'

Expand Down
7 changes: 3 additions & 4 deletions src/app/blog/topics/page.tsx
Original file line number Diff line number Diff line change
@@ -1,8 +1,7 @@
import { AppLayoutPage } from '@/components/legacy-ui/templates/AppLayoutPage'
import { Hero } from '@/components/legacy-ui/templates/Hero'
import { Breadcrumbs } from '@/components/SEO/Breadcrumbs'

import { UnstyledLink } from '@/UI/links'
import { UnstyledLink } from '@/components/site/links'
import { AppLayoutPage } from '@/components/site/templates/AppLayoutPage'
import { Hero } from '@/components/site/templates/Hero'

import { getContents } from '@/services'

Expand Down
2 changes: 1 addition & 1 deletion src/app/layout.tsx
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { Header } from '@/components/legacy-ui/common'
import { Header } from '@/components/site/common'
import { Toaster } from '@/components/ui/sonner'

import { PERSON_ID, SITE_DESCRIPTION, SITE_NAME, SITE_URL } from '@/libs/constants/site'
Expand Down
6 changes: 3 additions & 3 deletions src/app/not-found.tsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { Footer } from '@/UI/common'
import { WrappedImage } from '@/UI/images'
import { UnderlineLink } from '@/UI/links'
import { Footer } from '@/components/site/common'
import { WrappedImage } from '@/components/site/images'
import { UnderlineLink } from '@/components/site/links'

import type { Metadata } from 'next'

Expand Down
2 changes: 1 addition & 1 deletion src/app/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import { ContentImage } from '@/components/content'
import { BlogItem } from '@/components/content/blog/BlogItem'
import { PortfolioList } from '@/components/content/portfolio/PortfolioList'
import { ResearchItem } from '@/components/content/research/ResearchItem'
import { Footer, SocialHome } from '@/components/legacy-ui/common'
import { Footer, SocialHome } from '@/components/site/common'

import { getContents } from '@/services'
import { getContentHeaders } from '@/services/content'
Expand Down
7 changes: 3 additions & 4 deletions src/app/portfolio/[slug]/page.tsx
Original file line number Diff line number Diff line change
@@ -1,8 +1,7 @@
import { HeadingPortfolio, IconStack, MDXComponents, PRButton } from '@/components/content'
import { WrappedImage } from '@/components/legacy-ui/images'
import { AppLayoutPage } from '@/components/legacy-ui/templates/AppLayoutPage'

import { BackToTop } from '@/UI/buttons'
import { BackToTop } from '@/components/site/buttons'
import { WrappedImage } from '@/components/site/images'
import { AppLayoutPage } from '@/components/site/templates/AppLayoutPage'

import { getContentBySlug, getContents } from '@/services'

Expand Down
2 changes: 1 addition & 1 deletion src/app/portfolio/page.tsx
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { AppLayoutPage } from '@/components/legacy-ui/templates/AppLayoutPage'
import { PortfolioPageClient } from '@/components/portfolio/PortfolioPageClient'
import { AppLayoutPage } from '@/components/site/templates/AppLayoutPage'

import { getContents } from '@/services'

Expand Down
5 changes: 2 additions & 3 deletions src/app/research/[slug]/page.tsx
Original file line number Diff line number Diff line change
@@ -1,9 +1,8 @@
import { MDXComponents } from '@/components/content/mdx'
import { PRButton } from '@/components/content/PRButton'
import { HeadingResearch, ResearchAbstract, ResearchBibTeX, ResearchTeaser } from '@/components/content/research'
import { AppLayoutPage } from '@/components/legacy-ui/templates/AppLayoutPage'

import { BackToTop } from '@/UI/buttons'
import { BackToTop } from '@/components/site/buttons'
import { AppLayoutPage } from '@/components/site/templates/AppLayoutPage'

import { getContentBySlug, getContentHeaders } from '@/services/content'

Expand Down
2 changes: 1 addition & 1 deletion src/app/research/page.tsx
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { ResearchAreas, ResearchNews, ResearchOverview, ResearchSections } from '@/components/content/research'
import { AppLayoutPage } from '@/components/legacy-ui/templates/AppLayoutPage'
import { AppLayoutPage } from '@/components/site/templates/AppLayoutPage'

import { getContentHeaders } from '@/services/content'

Expand Down
7 changes: 3 additions & 4 deletions src/components/blog/BlogPageClient.tsx
Original file line number Diff line number Diff line change
@@ -1,10 +1,9 @@
'use client'

import { BlogList } from '@/components/content'

import { EmptyResult } from '@/UI/common'
import { Searchbar } from '@/UI/inputs'
import { Hero } from '@/UI/templates'
import { EmptyResult } from '@/components/site/common'
import { Searchbar } from '@/components/site/inputs'
import { Hero } from '@/components/site/templates'

import { useSearchBlog } from '@/hooks'

Expand Down
2 changes: 1 addition & 1 deletion src/components/content/PRButton.tsx
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
// PULL Request Button in case there is a typo on some post, other people can help you
import { UnstyledLink } from '@/UI/links'
import { UnstyledLink } from '@/components/site/links'

import { HiExternalLink } from 'react-icons/hi'

Expand Down
2 changes: 1 addition & 1 deletion src/components/content/blog/AdjacentPosts.tsx
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { UnstyledLink } from '@/UI/links'
import { UnstyledLink } from '@/components/site/links'

import type { AdjacentPosts as AdjacentPostsData } from '@/libs/sorters/getAdjacentPosts'

Expand Down
4 changes: 2 additions & 2 deletions src/components/content/blog/AuthorSection.tsx
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { WrappedImage } from '@/UI/images'
import { UnderlineLink } from '@/UI/links'
import { WrappedImage } from '@/components/site/images'
import { UnderlineLink } from '@/components/site/links'

import { useMemo } from 'react'

Expand Down
2 changes: 1 addition & 1 deletion src/components/content/blog/BlogItem.tsx
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { UnstyledLink } from '@/UI/links'
import { UnstyledLink } from '@/components/site/links'

import { generateOgImage } from '@/libs/metapage'

Expand Down
4 changes: 2 additions & 2 deletions src/components/content/blog/HeadingContent.tsx
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
'use client'

import { WrappedImage } from '@/UI/images'
import { UnderlineLink } from '@/UI/links'
import { WrappedImage } from '@/components/site/images'
import { UnderlineLink } from '@/components/site/links'

import { twclsx } from '@/libs'
import { dateFormat, dateStringToISO } from '@/libs/intl'
Expand Down
2 changes: 1 addition & 1 deletion src/components/content/blog/RelatedPosts.tsx
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { UnstyledLink } from '@/UI/links'
import { UnstyledLink } from '@/components/site/links'

import { getContentBySlug } from '@/services'

Expand Down
2 changes: 1 addition & 1 deletion src/components/content/mdx/ContentImage.tsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
'use client'

import { WrappedImage } from '@/UI/images'
import { WrappedImage } from '@/components/site/images'

import { twclsx } from '@/libs/twclsx'

Expand Down
2 changes: 1 addition & 1 deletion src/components/content/mdx/Headings.tsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
'use client'

import { UnstyledLink } from '@/UI/links'
import { UnstyledLink } from '@/components/site/links'

import { twclsx } from '@/libs'

Expand Down
2 changes: 1 addition & 1 deletion src/components/content/mdx/MDXLink.tsx
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { UnstyledLink, UnstyledLinkProps } from '@/UI/links'
import { UnstyledLink, UnstyledLinkProps } from '@/components/site/links'

import { twclsx } from '@/libs/twclsx'

Expand Down
2 changes: 1 addition & 1 deletion src/components/content/portfolio/HeadingPortfolio.tsx
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { CategoryLabel } from '@/components/content/portfolio/CategoryLabel'
import { UnstyledLink } from '@/components/legacy-ui/links'
import { UnstyledLink } from '@/components/site/links'

import { twclsx } from '@/libs'

Expand Down
5 changes: 2 additions & 3 deletions src/components/content/portfolio/PortfolioItem.tsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
import { WrappedImage } from '@/components/legacy-ui/images'

import { UnstyledLink } from '@/UI/links'
import { WrappedImage } from '@/components/site/images'
import { UnstyledLink } from '@/components/site/links'

import { createUrl, twclsx } from '@/libs'

Expand Down
2 changes: 1 addition & 1 deletion src/components/content/portfolio/PortfolioList.tsx
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { UnderlineLink } from '@/UI/links'
import { UnderlineLink } from '@/components/site/links'

import htmr from '@/libs/htmr-replacement'

Expand Down
2 changes: 1 addition & 1 deletion src/components/content/research/HeadingResearch.tsx
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { UnstyledLink } from '@/components/legacy-ui/links'
import { UnstyledLink } from '@/components/site/links'

import { SITE_AUTHOR } from '@/libs/constants/site'
import { twclsx } from '@/libs/twclsx'
Expand Down
2 changes: 1 addition & 1 deletion src/components/content/research/ResearchItem.tsx
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { UnstyledLink } from '@/UI/links'
import { UnstyledLink } from '@/components/site/links'

import { SITE_AUTHOR } from '@/libs/constants/site'
import { generateOgImage } from '@/libs/metapage'
Expand Down
2 changes: 1 addition & 1 deletion src/components/content/research/ResearchNews.tsx
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { UnstyledLink } from '@/UI/links'
import { UnstyledLink } from '@/components/site/links'

type NewsItem = {
date: string
Expand Down
2 changes: 1 addition & 1 deletion src/components/content/research/ResearchTeaser.tsx
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { WrappedImage } from '@/components/legacy-ui/images'
import { WrappedImage } from '@/components/site/images'

import { twclsx } from '@/libs/twclsx'

Expand Down
2 changes: 1 addition & 1 deletion src/components/content/snippet/SnippetItem.tsx
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { UnstyledLink } from '@/components/legacy-ui/links'
import { UnstyledLink } from '@/components/site/links'

import { IconStack } from '../portfolio'

Expand Down
7 changes: 3 additions & 4 deletions src/components/portfolio/PortfolioPageClient.tsx
Original file line number Diff line number Diff line change
@@ -1,10 +1,9 @@
'use client'

import { PortfolioList } from '@/components/content/portfolio/PortfolioList'

import { EmptyResult } from '@/UI/common'
import { Searchbar } from '@/UI/inputs'
import { Hero } from '@/UI/templates'
import { EmptyResult } from '@/components/site/common'
import { Searchbar } from '@/components/site/inputs'
import { Hero } from '@/components/site/templates'

import { twclsx } from '@/libs/twclsx'

Expand Down
3 changes: 1 addition & 2 deletions src/components/resume/ResumePageClient.tsx
Original file line number Diff line number Diff line change
@@ -1,10 +1,9 @@
'use client'

import { HowToPrintDialog } from '@/components/dialog'
import { UnderlineLink } from '@/components/site/links'
import { Button } from '@/components/ui/button'

import { UnderlineLink } from '@/UI/links'

import {
CERTIFICATIONS,
EDUCATION,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
import { WrappedImage } from '@/components/site/images'
import { Empty, EmptyDescription, EmptyHeader, EmptyMedia } from '@/components/ui/empty'

import { WrappedImage } from '@/UI/images'

export const EmptyResult: React.FunctionComponent = () => {
return (
<Empty className='py-8 md:py-16'>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
'use client'

import { FooterSocialHome } from '@/UI/common/FooterSocialHome'
import { UnstyledLink } from '@/UI/links'
import { FooterSocialHome } from '@/components/site/common/FooterSocialHome'
import { UnstyledLink } from '@/components/site/links'

import APP_ROUTE from '@/libs/constants/route'
import { twclsx } from '@/libs/twclsx'
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { UnstyledLink } from '@/UI/links'
import { UnstyledLink } from '@/components/site/links'

import { twclsx } from '@/libs'
import SOCIAL from '@/libs/constants/social'
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
'use client'

import { UnstyledLink } from '@/UI/links'
import { UnstyledLink } from '@/components/site/links'

import APP_ROUTE from '@/libs/constants/route'
import { twclsx } from '@/libs/twclsx'
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { UnstyledLink } from '@/UI/links'
import { UnstyledLink } from '@/components/site/links'

import { twclsx } from '@/libs'
import SOCIAL from '@/libs/constants/social'
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { Footer } from '@/UI/common'
import { Footer } from '@/components/site/common'

import { twclsx } from '@/libs/twclsx'

Expand Down
7 changes: 3 additions & 4 deletions src/components/snippet/SnippetPageClient.tsx
Original file line number Diff line number Diff line change
@@ -1,10 +1,9 @@
'use client'

import { SnippetList } from '@/components/content/snippet'

import { EmptyResult } from '@/UI/common'
import { Searchbar } from '@/UI/inputs'
import { Hero } from '@/UI/templates'
import { EmptyResult } from '@/components/site/common'
import { Searchbar } from '@/components/site/inputs'
import { Hero } from '@/components/site/templates'

import { useSearchSnippet } from '@/hooks'

Expand Down
4 changes: 1 addition & 3 deletions tsconfig.json
Original file line number Diff line number Diff line change
Expand Up @@ -17,9 +17,7 @@
"incremental": true,
"baseUrl": "./src",
"paths": {
"@/*": ["*"],
"@/UI": ["components/legacy-ui/"],
"@/UI/*": ["components/legacy-ui/*"]
"@/*": ["*"]
},
"plugins": [
{
Expand Down
Loading