A modern, responsive Web3 dashboard interface focused on usability and visual clarity for blockchain and cryptocurrency contexts. It showcases a search-led homepage with KPI cards, an NFT grid, and a token table, built with a Tailwind utility system and animated microβinteractions.
Direct link: https://chainsqueeneth.github.io/web3dashboard/
- π Live Demo
- π¨ Design Highlights
- π οΈ Tech Stack
- β¨ Key Features
- π§ Project Structure (Flowchart)
- π§βπ» Development Notes
- π§ͺ Testing
- π§° Global Tailwind Utilities
- π Getting Started
- π’ Versions
- π― Design Decisions
- π₯οΈ Browser Support
- π¦ Deployment (GitHub Pages)
- Dark theme surfaces with soft gradients and depth
- Responsive layout across breakpoints
- Microβinteractions and smooth animations
- Custom UI components with consistent styling
- Framework: Next.js 15 (App Router)
- Runtime: React 19 + TypeScript 5
- Styling: Tailwind CSS 4 (global utilities in
src/styles/globals.css) - Animations: Framer Motion 12
- UI Primitives: Radix UI (Tabs, Tooltip)
- Icons: Lucide Icons
- Font: Geist (via
next/font) - State Management: React Context (lightweight)
- Search bar with glass/gradient halo and focus ring
- KPI/Stats cards with animated progress and icons
- NFT grid with images, names, collections, and prices
- Token table with symbols, prices, and change
- Tabs to switch between βTrending NFTsβ and βTop Tokensβ
- Animated butterfly decoration
- Accessible UI patterns and keyboardβfocus styles
web3dashboard/
ββ app/ # Next.js App Router entry
β ββ page.tsx # Home (dashboard)
β ββ layout.tsx # Root layout (imports styles)
β
ββ src/
β ββ styles/
β β ββ globals.css # Tailwind + global utility classes (u-*)
β ββ components/
β β ββ ui/ # Reusable UI primitives (Tabs, Input, etc.)
β ββ partials/ # Feature-oriented UI blocks
β β ββ web3/
β β ββ search-bar/
β β β ββ search-bar.tsx # SearchBar component
β β β ββ search-bar.test.tsx
β β ββ dashboard-header/
β β β ββ dashboard-header.tsx
β β ββ nft-grid/
β β β ββ nft-grid.tsx # NFT cards grid
β β β ββ nft-grid.test.tsx
β β ββ token-table/
β β β ββ token-table.tsx # Token list table
β β ββ stats-card/
β β ββ stats-card.tsx # KPI/stat cards
β ββ lib/
β β ββ assets.ts # Base-path aware asset helper
β β ββ assets.test.ts # Tests for asset() helper
β ββ ...
β
ββ public/ # Static assets (images, icons)
ββ vitest.config.ts # Vitest + jsdom config
ββ vitest.setup.ts # Testing Library setup (jest-dom)
ββ README.md
- Abstraction goal: Reduce repeated Tailwind strings and keep visuals consistent across components.
- Where utilities live:
src/styles/globals.cssdefinesu-*classes consumed by components. - When to use utilities:
- Use
u-card-soft/u-card-soft-strongfor panel surfaces (cards, lists, containers). - Use
u-glass-2xlwhen an element needs a glass surface (e.g., inputs) rather than the whole container. - Use
u-absolute-gradient-overlay+u-hover-shadow-bluefor gradient halos and stronger hover depth (e.g., SearchBar wrapper). - Use
u-focus-ring-bluefor consistent focus visuals on inputs and interactive elements. - Use
u-gradient-text-primaryfor primary headings requiring gradient text. - Use
u-blur-borderoru-blur-smto add blur with or without borders in small UI affordances.
- Use
- Do not: Nest custom utilities inside
@applyrules within other custom utilities; Tailwind disallows that. Compose them in markup. - Naming convention: Prefer
u-*for global utilities; keep files kebab-case (except Next.js reserved filenames). - Testing: Co-locate tests with components (
*.test.tsx) to validate rendering and interactions with Testing Library.
graph TD
A[app/] --> A1[layout.tsx]
A --> A2[page.tsx]
A2 --> P[partials/web3/]
P --> PH[dashboard-header/]
P --> PS[search-bar/]
P --> PN[nft-grid/]
P --> PT[token-table/]
P --> PC[stats-card/]
A2 --> UI[components/ui/]
UI --> UIT[Tabs]
UI --> UII[Input]
UI --> UITt[Tooltip]
A2 --> STY[styles/]
STY --> GS[globals.css]
A2 --> LIB[lib/]
LIB --> L1[assets.ts]
A2 --> PUB[public/]
PUB --> IMG[img/*]
T[tests] --> T1[search-bar.test.tsx]
T --> T2[nft-grid.test.tsx]
T --> T3[assets.test.ts]
Libraries:
- Vitest: test runner and assertion library
- @testing-library/react: DOM-oriented React testing
- @testing-library/user-event: realistic user interactions
- jsdom: browser-like environment for unit tests
- @testing-library/jest-dom: custom DOM matchers (configured in
vitest.setup.ts)
What is covered:
src/partials/web3/search-bar/search-bar.test.tsx- Renders placeholder
- Typing updates controlled value
- Clear button resets the field
src/partials/web3/nft-grid/nft-grid.test.tsx- Renders NFT card name, collection and image alt text
- Shows loading skeletons when
loadingis true
src/lib/assets.test.tsasset()prefixes paths withNEXT_PUBLIC_BASE_PATHwhen set- Leaves paths unchanged when base path is empty
Run tests:
pnpm test # watch mode
pnpm test:ci # run once
pnpm coverage # with coverageCommon, reusable styles are defined in src/styles/globals.css to reduce repeated utility strings and ensure consistency:
u-glass-2xlβ rounded glass surface with blur and subtle borderu-card-soft/u-card-soft-strongβ soft translucent panelsu-gradient-text-primaryβ gradient text for headingsu-absolute-gradient-overlayβ absolute gradient halo overlayu-hover-shadow-blueβ blue hover shadow effectu-focus-ring-blueβ consistent blue focus ringu-outline-gradientβ outer gradient halo/outlineu-surface-mutedβ muted translucent surfaceu-blur-borderβ blur with thin borderu-blur-smβ small blur only
-
Clone the repository
git clone https://github.com/ChainsQueenEth/web3dashboard.git
-
Install dependencies (pnpm)
pnpm install
-
Run the development server
pnpm dev- Open http://localhost:3000 in your browser
Exact versions from package.json for reproducibility:
| Package | Version |
|---|---|
| next | 15.4.1 |
| react | 19.1.0 |
| react-dom | 19.1.0 |
| typescript | ^5 |
| tailwindcss | ^4.1.11 |
| @tailwindcss/postcss | ^4 |
| framer-motion | ^12.23.9 |
| motion | ^12.23.6 |
| @radix-ui/react-slot | ^1.2.3 |
| @radix-ui/react-tabs | ^1.1.12 |
| @radix-ui/react-tooltip | ^1.2.7 |
| lucide-react | ^0.525.0 |
| tailwind-merge | ^3.3.1 |
| vitest | ^3.2.4 |
| @testing-library/react | ^16.0.1 |
| @testing-library/user-event | ^14.6.1 |
| @testing-library/jest-dom | ^6.6.3 |
| jsdom | ^26.1.0 |
- Color Scheme: Chose a dark theme with blue accents to reduce eye strain during extended use
- Typography: Used Geist font for its modern, clean aesthetic and excellent readability
- Spacing: Implemented a consistent 8px grid system for visual harmony
- Motion: Added subtle animations to guide user attention and improve perceived performance
- Chrome (latest)
- Firefox (latest)
- Safari (latest)
- Edge (latest)
This project is open source and available under the MIT License.
π‘ Note: This is a design-oriented sample. For a production application, additional security measures, data fetching, and error handling would be implemented.
This project is configured to deploy to GitHub Pages at:
- URL:
https://ChainsQueenEth.github.io/web3dashboard
Key configuration files:
next.config.jssetsoutput: 'export'and conditionally appliesbasePath/assetPrefixfor production (/web3dashboard)..github/workflows/deploy.ymlbuilds with pnpm and publishes./outto thegh-pagesbranch.package.jsondeclares"packageManager": "pnpm@10".
Deploy from local (optional):
pnpm build
# Static site will be generated in ./outCI/CD via GitHub Actions:
- Push to
mainβ workflow builds and publishes togh-pages. - In GitHub repo Settings β Pages, set Source to
gh-pagesbranch,/ (root).
Troubleshooting:
- If assets/links 404 on Pages, ensure the repo name matches
web3dashboardand that the Pages URL uses the/web3dashboardsubpath. - Confirm that
gh-pagesbranch contains the exported files and a.nojekyllfile (created by the workflow withenable_jekyll: false).

