View the writeup here: https://lifengyin.dev/blog/htn-frontend-challenge/
- Node.js 18+
- pnpm (recommended; npm or yarn work with the same scripts)
Install dependencies (pnpm is used here)
pnpm installStart the dev server:
pnpm devOther scripts:
pnpm build— TypeScript check + production buildpnpm preview— Serve the production build locallypnpm lint— Run ESLint
src/
├── main.tsx # Top-level files, shared across the app
├── App.tsx
├── index.css
├── types.ts
├── atoms/ # Reusable UI primitives
│ ├── Badge.tsx
│ ├── Button.tsx
│ └── Field.tsx
├── components/ # Features and layout components, made with atoms
│ ├── EventCard.tsx
│ ├── EventCardDialog.tsx
│ ├── EventsEmptyState.tsx
│ ├── EventsGrid.tsx
│ ├── EventsSearch.tsx
│ ├── EventsToolbar.tsx
│ ├── Logo.tsx
│ ├── MobileHeader.tsx
│ ├── Sidebar.tsx
│ └── SidebarUserRow.tsx
├── hooks/ # React hooks to simplify logic
│ ├── useDebouncedValue.ts
│ └── useEvents.ts
├── pages/ # Route-level, made with components
│ ├── Dashboard.tsx
│ └── Login.tsx
├── utils/ # Helpers and shared logic
│ └── eventUtils.tsx
└── assets/ # Images and static assets