Skip to content

EDusik/portfolio

Repository files navigation

Portfolio β€” Eduardo Dusik

Personal portfolio site focused on front-end: an IDE-like experience, themes, internationalization, and projects pulled from GitHub.

Next.js React TypeScript Yarn

Portfolio preview

Highlights

  • IDE-inspired interface
  • Light and dark theme (persisted in the browser)
  • Content in Portuguese and English
  • Repository list via the public GitHub API (user EDusik; no token required)
  • Local project fallback if the API fails or returns empty
  • 3D scene with Three.js (React Three Fiber + Drei)
  • Sass styling and design tokens under src/styles/

Tech stack

Layer Choice
Framework Next.js 15 (App Router, RSC where applicable)
Language TypeScript 5
UI React 19
Styling Sass (SCSS), variables in src/styles/tokens/
3D / WebGL Three.js, React Three Fiber, Drei
Typography next/font (Inter, JetBrains Mono)
Tooling ESLint 9, Stylelint 17, Prettier 3; Husky + lint-staged + Commitlint in the local workflow

Libraries

Runtime (dependencies)

Package Role
next Routing, build, SSR/RSC, metadata
react / react-dom UI and hydration
three Scene and WebGL rendering
@react-three/fiber React render tree over Three.js
@react-three/drei 3D helpers (pmndrs community utilities)
clsx Conditional CSS classes (used with cn() in @/lib/utils)
node-emoji :shortcode: expansion for descriptions from GitHub

Development (devDependencies)

Package Role
typescript Static typing
sass SCSS compilation
eslint, eslint-config-next, eslint-config-prettier JS/TS linting aligned with Next
@eslint/eslintrc Flat ESLint config
stylelint, stylelint-config-prettier-scss, stylelint-config-recommended-scss CSS/SCSS linting
prettier Formatting
postcss CSS pipeline (used by Next)
@types/node, @types/react, @types/react-dom, @types/three TypeScript types
husky Git hooks
lint-staged Lint staged files
@commitlint/cli, @commitlint/config-conventional Conventional commit messages

Pinned versions: see package.json and yarn.lock.

Prerequisites

  • Node.js 20+ (matches the project toolchain)

Installation and usage

yarn install
yarn dev

Open http://localhost:3000.

Production build and local server:

yarn build
yarn start

Scripts

Script Description
yarn dev Development server
yarn build Production build
yarn start Serve the production build
yarn lint ESLint + Stylelint
yarn lint:fix Auto-fix what the tools can
yarn format Prettier (write)
yarn format:check Prettier (check)
yarn type-check tsc --noEmit

The npm/yarn prepare script installs Husky hooks when a .git directory exists.

Environment variables

Variable Required Description
NEXT_PUBLIC_SITE_URL No Canonical site URL (Open Graph / metadataBase). Example: https://your-domain.com. If missing or invalid, the code falls back to http://localhost:3000 β€” set your public URL in production.

The home page (src/app/page.tsx) calls fetchRepos() in src/lib/github.ts, which uses the public API; on failure it uses the fallback list defined in the same file.

Repository layout

Root overview (excluding node_modules / .next):

.
β”œβ”€β”€ .husky/                 # Git hooks (e.g. pre-commit, commit-msg)
β”œβ”€β”€ public/
β”‚   └── static/             # favicon, PWA manifest, icons
β”œβ”€β”€ src/
β”‚   β”œβ”€β”€ app/                # App Router: layout, home page, icon.svg
β”‚   β”œβ”€β”€ components/
β”‚   β”‚   β”œβ”€β”€ AppProviders/   # Provider composition
β”‚   β”‚   β”œβ”€β”€ ContactPage/    # β€œContact” panel + terminal
β”‚   β”‚   β”œβ”€β”€ Editor/         # Main editor-like area
β”‚   β”‚   β”œβ”€β”€ Hero/           # Hero block + 3D scene (HeroScene)
β”‚   β”‚   β”œβ”€β”€ HomePage/
β”‚   β”‚   β”œβ”€β”€ Ide/            # IDE shell (home composition)
β”‚   β”‚   β”œβ”€β”€ ProjectsPage/
β”‚   β”‚   β”œβ”€β”€ Sidebar/
β”‚   β”‚   β”œβ”€β”€ SiteHead/       # Metadata (metadata/)
β”‚   β”‚   β”œβ”€β”€ Statusbar/
β”‚   β”‚   β”œβ”€β”€ Topbar/
β”‚   β”‚   └── shared/         # Reusable UI (Tabs, ProjectCard, SvgIcons, …)
β”‚   β”œβ”€β”€ contexts/           # I18nContext, TabsContext, ThemeContext
β”‚   β”œβ”€β”€ hooks/              # useMediaQuery, useScrollSpy, …
β”‚   β”œβ”€β”€ lib/
β”‚   β”‚   β”œβ”€β”€ constants/      # Sections, virtual files, language colors, …
β”‚   β”‚   β”œβ”€β”€ i18n/           # Dictionaries and types
β”‚   β”‚   β”œβ”€β”€ github.ts       # Repository fetch
β”‚   β”‚   └── utils.ts        # cn(), helpers
β”‚   └── styles/             # SCSS entry (index), globals, tokens, partials, mixins
β”œβ”€β”€ CLAUDE.md
β”œβ”€β”€ eslint.config.mjs
β”œβ”€β”€ next.config.mjs
β”œβ”€β”€ package.json
β”œβ”€β”€ stylelint.config.mjs
β”œβ”€β”€ tsconfig.json
└── yarn.lock

Code conventions, imports, and SCSS: CLAUDE.md (mirrored in .cursor/rules/claude-conventions.mdc).

Deploy

Works on Vercel or any environment that runs Node for Next.js apps. In production, set NEXT_PUBLIC_SITE_URL to your public URL for correct metadata and social sharing.