A modern, interactive and multilingual portfolio template built with Vue 3, Vite and Vue Router.
It is designed for developers, IT professionals, designers, freelancers and other creatives who want a clean portfolio with visual highlight cards, smooth transitions and a reusable structure.
- Vue 3 + Vite
- Vue Router with animated page transitions
- Responsive layout for desktop, tablet and mobile
- Interactive highlight card deck
- Five dedicated highlight detail pages
- About page
- Projects and experience page
- Custom asset loader
- Multilingual EN / BG support
- Animated language switching
- Persistent language preference
- Clipboard contact button
- Reusable Vue components
- Custom CSS design system
- Image preloading
- No UI framework required
- MIT license included
- Vue 3
- Vite
- Vue Router
- JavaScript
- HTML5
- CSS3
The interface is built with custom Vue components and CSS without a third-party UI framework.
src/
├── components/
│ ├── HighlightCards.vue
│ └── PortfolioHighlights.vue
├── composables/
│ └── useLanguage.js
├── router/
│ └── index.js
├── views/
│ ├── AboutMeView.vue
│ ├── HighlightDetailView.vue
│ ├── HighlightsView.vue
│ └── MoreProjectsView.vue
├── App.vue
├── about.css
├── highlight-detail.css
├── main.js
├── more-projects.css
└── style.css
Requirements:
- Node.js
- npm
Clone the repository:
git clone https://github.com/Sureebi/Portfolio-template.gitEnter the project directory:
cd Portfolio-templateInstall dependencies:
npm installStart the development server:
npm run devCreate a production build:
npm run buildPreview the production build locally:
npm run preview/
├── /intro
├── /outside-work
├── /journey
├── /lab-projects
├── /next
├── /about-me
└── /more-projects
Each highlight card opens its own page. Route definitions live in src/router/index.js; card targets live in src/components/PortfolioHighlights.vue.
Most visible copy is stored in:
src/composables/useLanguage.js
Update the en and bg message objects to change the site identity, navigation labels, highlight cards, detail pages, About page, project content, focus areas and experience labels.
Highlight cards are configured in:
src/components/PortfolioHighlights.vue
The default structure is:
{
id: '01',
title: t('highlights.about.title'),
description: t('highlights.about.description'),
to: '/intro'
}The template uses abstract placeholder visuals by default. To add project or profile imagery:
- Put the image file in
src/assets/. - Import it in
src/components/PortfolioHighlights.vueor the view that needs it. - Pass it through the relevant
imageproperty.
Example:
import introImage from '../assets/intro.jpg'
{
id: '01',
title: t('highlights.about.title'),
description: t('highlights.about.description'),
image: introImage,
to: '/intro'
}The screenshots used in this README are stored in public/Home.png, public/About.png and public/Projects.png.
The contact button copies this demo email address:
const email = 'hello@example.com'Update it in src/App.vue. The same area can be changed to a mailto: link, contact page, modal or form.
Footer links are in src/App.vue.
Project links are in src/views/MoreProjectsView.vue.
Template links are set to # until real profile, CV and project URLs are added.
Theme variables are defined in src/style.css.
:root {
--bg: #f8fbf9;
--surface: #88c4af;
--surface-2: #79bda7;
--text: #21342d;
--muted: #5e746b;
--accent: #69c7ba;
--accent-strong: #317c70;
}The default typography uses Space Grotesk for display text and Manrope for body text.
The project uses a small custom language system in src/composables/useLanguage.js.
Use translations in Vue templates with:
{{ t('nav.about') }}The selected language is saved in localStorage, so visitors keep their preference between sessions.
This is a static Vite application and can be deployed to GitHub Pages, Cloudflare Pages, Netlify, Vercel or a self-hosted static server.
Because the project uses Vue Router history mode, configure the host to fall back to index.html for nested routes.
Example Caddy configuration:
example.com {
root * /var/www/portfolio
try_files {path} /index.html
file_server
}You can find the preview on my portfolio website | slavislaveev.com
This project is released under the MIT License. See LICENSE for details.


