├── mise.toml
├── public
├── robots.txt
└── favicon
│ ├── favicon.ico
│ ├── favicon-96x96.png
│ ├── apple-touch-icon.png
│ ├── web-app-manifest-192x192.png
│ ├── web-app-manifest-512x512.png
│ └── favicon.svg
├── layouts
├── web.png
└── mobile.png
├── app
├── types
│ ├── locale.type.ts
│ ├── menu-item.type.ts
│ └── github.type.ts
├── assets
│ ├── fonts
│ │ ├── icomoon.eot
│ │ ├── icomoon.ttf
│ │ └── icomoon.woff
│ ├── images
│ │ └── 24493328.jpg
│ ├── social.json
│ ├── menu.json
│ ├── experiences.json
│ ├── css
│ │ ├── index.css
│ │ ├── dark.css
│ │ ├── light.css
│ │ └── fonts.css
│ └── technologies.json
├── components
│ ├── navigation
│ │ ├── NavIcon.vue
│ │ ├── NavMobileTop.vue
│ │ ├── NavMobileBottom.vue
│ │ └── NavDesktop.vue
│ ├── Title.vue
│ ├── layout
│ │ └── MainContent.vue
│ ├── FormInput.vue
│ ├── ProjectItem.vue
│ ├── CustomLoading.vue
│ ├── ExperienceItem.vue
│ └── AboutMe.vue
├── filters
│ └── index.ts
├── pages
│ ├── index.vue
│ ├── open-source.vue
│ ├── Technologies.vue
│ ├── experiences.vue
│ └── Contact.vue
├── stores
│ └── website.ts
└── layouts
│ └── default.vue
├── eslint.config.mjs
├── .gitignore
├── tsconfig.json
├── server
└── api
│ ├── contact.ts
│ └── latest-article.ts
├── package.json
├── i18n
└── locales
│ ├── en.json
│ └── pt.json
├── README.md
└── nuxt.config.ts
/mise.toml:
--------------------------------------------------------------------------------
1 | [tools]
2 | node = "20"
3 |
--------------------------------------------------------------------------------
/public/robots.txt:
--------------------------------------------------------------------------------
1 | User-Agent: *
2 | Disallow:
3 |
--------------------------------------------------------------------------------
/layouts/web.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/acidiney/dev.acidineydias/HEAD/layouts/web.png
--------------------------------------------------------------------------------
/layouts/mobile.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/acidiney/dev.acidineydias/HEAD/layouts/mobile.png
--------------------------------------------------------------------------------
/app/types/locale.type.ts:
--------------------------------------------------------------------------------
1 | export type Locale = {
2 | code: string;
3 | // name: string;
4 | };
5 |
--------------------------------------------------------------------------------
/public/favicon/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/acidiney/dev.acidineydias/HEAD/public/favicon/favicon.ico
--------------------------------------------------------------------------------
/app/assets/fonts/icomoon.eot:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/acidiney/dev.acidineydias/HEAD/app/assets/fonts/icomoon.eot
--------------------------------------------------------------------------------
/app/assets/fonts/icomoon.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/acidiney/dev.acidineydias/HEAD/app/assets/fonts/icomoon.ttf
--------------------------------------------------------------------------------
/app/assets/fonts/icomoon.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/acidiney/dev.acidineydias/HEAD/app/assets/fonts/icomoon.woff
--------------------------------------------------------------------------------
/app/assets/images/24493328.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/acidiney/dev.acidineydias/HEAD/app/assets/images/24493328.jpg
--------------------------------------------------------------------------------
/public/favicon/favicon-96x96.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/acidiney/dev.acidineydias/HEAD/public/favicon/favicon-96x96.png
--------------------------------------------------------------------------------
/public/favicon/apple-touch-icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/acidiney/dev.acidineydias/HEAD/public/favicon/apple-touch-icon.png
--------------------------------------------------------------------------------
/public/favicon/web-app-manifest-192x192.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/acidiney/dev.acidineydias/HEAD/public/favicon/web-app-manifest-192x192.png
--------------------------------------------------------------------------------
/public/favicon/web-app-manifest-512x512.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/acidiney/dev.acidineydias/HEAD/public/favicon/web-app-manifest-512x512.png
--------------------------------------------------------------------------------
/eslint.config.mjs:
--------------------------------------------------------------------------------
1 | // @ts-check
2 | import withNuxt from './.nuxt/eslint.config.mjs'
3 |
4 | export default withNuxt(
5 | // Your custom configs here
6 | )
7 |
--------------------------------------------------------------------------------
/app/types/menu-item.type.ts:
--------------------------------------------------------------------------------
1 | export type MenuItem = {
2 | text: string;
3 | icon: string;
4 | url: string;
5 | mobile?: boolean;
6 | external?: boolean;
7 | separator?: boolean;
8 | };
9 |
--------------------------------------------------------------------------------
/app/components/navigation/NavIcon.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
10 |
--------------------------------------------------------------------------------
/app/types/github.type.ts:
--------------------------------------------------------------------------------
1 | export type GithubRepo = {
2 | fork: boolean
3 | stargazers_count: number
4 | id: number
5 | name: string
6 | description: string
7 | html_url: string
8 | language: string
9 | updated_at: Date
10 | }
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # Nuxt dev/build outputs
2 | .output
3 | .data
4 | .nuxt
5 | .nitro
6 | .cache
7 | dist
8 |
9 | # Node dependencies
10 | node_modules
11 |
12 | # Logs
13 | logs
14 | *.log
15 |
16 | # Misc
17 | .DS_Store
18 | .fleet
19 | .idea
20 |
21 | # Local env files
22 | .env
23 | .env.*
24 | !.env.example
25 |
--------------------------------------------------------------------------------
/app/filters/index.ts:
--------------------------------------------------------------------------------
1 | export const formateDate = (date: Date) => {
2 | const locale = 'pt'
3 | return new Date(date).toLocaleString(locale, { day: 'numeric', month: 'short', year: 'numeric' })
4 | }
5 |
6 | export const capitalize = (text: string) => {
7 | return text.charAt(0).toUpperCase() + text.slice(1).toLowerCase()
8 | }
9 |
--------------------------------------------------------------------------------
/app/components/Title.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
12 |
13 |
19 |
--------------------------------------------------------------------------------
/app/pages/index.vue:
--------------------------------------------------------------------------------
1 |
2 |
9 |
10 |
17 |
--------------------------------------------------------------------------------
/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | // https://nuxt.com/docs/guide/concepts/typescript
3 | "files": [],
4 | "references": [
5 | {
6 | "path": "./.nuxt/tsconfig.app.json"
7 | },
8 | {
9 | "path": "./.nuxt/tsconfig.server.json"
10 | },
11 | {
12 | "path": "./.nuxt/tsconfig.shared.json"
13 | },
14 | {
15 | "path": "./.nuxt/tsconfig.node.json"
16 | }
17 | ]
18 | }
19 |
--------------------------------------------------------------------------------
/app/components/layout/MainContent.vue:
--------------------------------------------------------------------------------
1 |
2 |
5 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
--------------------------------------------------------------------------------
/app/stores/website.ts:
--------------------------------------------------------------------------------
1 | export const useWebsiteStore = defineStore("websiteStore", {
2 | state: () => ({
3 | theme: "system",
4 | }),
5 | actions: {
6 | initTheme() {
7 | if (import.meta.client) {
8 | this.theme = localStorage.getItem("nuxt_theme") || "dark";
9 | }
10 | },
11 |
12 | toggleTheme() {
13 | this.theme = this.theme === "dark" ? "light" : "dark";
14 | if (import.meta.client) {
15 | localStorage.setItem("nuxt_theme", this.theme);
16 | }
17 | },
18 | },
19 | });
20 |
--------------------------------------------------------------------------------
/server/api/contact.ts:
--------------------------------------------------------------------------------
1 | import { Resend } from "resend";
2 |
3 | const resend = new Resend(process.env.RESEND_API_KEY!);
4 | const noReplyEmail = process.env.NO_REPLY_EMAIL!;
5 | const contactRecipientEmail = process.env.CONTACT_RECIPIENT_EMAIL!;
6 |
7 | export default defineEventHandler(async (event) => {
8 | const body = await readBody(event);
9 |
10 | await resend.emails.send({
11 | from: `Contact Form <${noReplyEmail}>`,
12 | to: [contactRecipientEmail],
13 | subject: "Contact Form Submission",
14 | html: `
15 |
From: ${body.name} (${body.email})
16 | ${body.message}
17 | `,
18 | });
19 |
20 | return { success: true };
21 | });
22 |
--------------------------------------------------------------------------------
/app/assets/social.json:
--------------------------------------------------------------------------------
1 | [
2 | {
3 | "aria-label": "links.github",
4 | "link": "https://github.com/acidiney", "icon": "icon-github" },
5 | {
6 | "aria-label": "links.youtube",
7 | "link": "https://www.youtube.com/channel/UCMjOcKmA1UjiimzRDNZ_uOQ",
8 | "icon": "icon-youtube"
9 | },
10 | {
11 | "aria-label": "links.linkedin",
12 | "link": "https://linkedin.com/in/acidineydias", "icon": "icon-linkedin" },
13 | {
14 | "aria-label": "links.twitter",
15 | "link": "https://x.com/acidineydias", "icon": "icon-twitter" },
16 | {
17 | "aria-label": "links.instagram",
18 | "link": "https://www.instagram.com/acidineydias/",
19 | "icon": "icon-instagram"
20 | }
21 | ]
--------------------------------------------------------------------------------
/app/components/FormInput.vue:
--------------------------------------------------------------------------------
1 |
2 |
10 |
11 |
12 |
21 |
22 |
27 |
28 |
38 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "acidineydias.dev",
3 | "type": "module",
4 | "private": true,
5 | "scripts": {
6 | "build": "nuxt build",
7 | "dev": "nuxt dev",
8 | "generate": "nuxt generate",
9 | "preview": "nuxt preview",
10 | "postinstall": "nuxt prepare"
11 | },
12 | "dependencies": {
13 | "@nuxt/eslint": "1.11.0",
14 | "@nuxt/image": "2.0.0",
15 | "@nuxtjs/sitemap": "7.4.7",
16 | "@pinia/nuxt": "0.11.3",
17 | "@types/xml2js": "^0.4.14",
18 | "@vite-pwa/nuxt": "1.1.0",
19 | "eslint": "^9.0.0",
20 | "nuxt": "^4.2.1",
21 | "nuxt-gtag": "4.1.0",
22 | "pinia": "^3.0.4",
23 | "resend": "^6.5.2",
24 | "typescript": "^5.6.3",
25 | "vue": "^3.5.25",
26 | "vue-router": "^4.6.3",
27 | "xml2js": "^0.6.2"
28 | },
29 | "devDependencies": {
30 | "@nuxtjs/i18n": "^10.2.1",
31 | "@nuxtjs/tailwindcss": "^6.14.0"
32 | }
33 | }
34 |
--------------------------------------------------------------------------------
/app/assets/menu.json:
--------------------------------------------------------------------------------
1 | [
2 | {
3 | "url": "https://blog.acidineydias.dev",
4 | "text": "menu.blog",
5 | "icon": "icon-book-open",
6 | "separator": true,
7 | "external": true
8 | },
9 | {
10 | "url": "/",
11 | "text": "menu.experiences",
12 | "icon": "icon-home",
13 | "separator": true
14 | },
15 | {
16 | "url": "/experiences",
17 | "text": "menu.experiences",
18 | "icon": "icon-layers",
19 | "mobile": true,
20 | "separator": true
21 | },
22 | {
23 | "url": "/technologies",
24 | "text": "menu.technologies",
25 | "icon": "icon-terminal",
26 | "separator": true
27 | },
28 | {
29 | "url": "/open-source",
30 | "text": "menu.openSource",
31 | "icon": "icon-github1",
32 | "separator": true
33 | },
34 | {
35 | "url": "/contact",
36 | "text": "menu.contact",
37 | "icon": "icon-send",
38 | "separator": false
39 | }
40 | ]
--------------------------------------------------------------------------------
/app/components/navigation/NavMobileTop.vue:
--------------------------------------------------------------------------------
1 |
2 |
27 |
28 |
29 |
39 |
40 |
46 |
--------------------------------------------------------------------------------
/app/components/navigation/NavMobileBottom.vue:
--------------------------------------------------------------------------------
1 |
2 |
28 |
29 |
30 |
38 |
39 |
52 |
--------------------------------------------------------------------------------
/app/pages/open-source.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | {{ $t("menu.openSource") }}
5 | {{
6 | $t("findAnyProjectToContribute")
7 | }}
8 |
9 |
14 |
15 |
16 |
17 |
40 |
41 |
51 |
--------------------------------------------------------------------------------
/server/api/latest-article.ts:
--------------------------------------------------------------------------------
1 | import {defineEventHandler} from 'h3'
2 | import { parseStringPromise } from "xml2js";
3 |
4 | interface RSSItem {
5 | title: string;
6 | link: string;
7 | pubDate: string;
8 | description: string;
9 | image?: string;
10 | tags?: string[];
11 | }
12 |
13 | function extractImage(item: any): string | undefined {
14 | if (item.enclosure && item.enclosure[0].$.url) {
15 | return item.enclosure[0].$.url;
16 | }
17 | return undefined;
18 | }
19 |
20 | function extractTags(item: any): string[] | undefined {
21 | if (item.category) {
22 | return item.category.map((c: any) => c._ || c);
23 | }
24 | return undefined;
25 | }
26 |
27 | async function getLatestArticle(xmlData: string): Promise {
28 |
29 | const parsed = await parseStringPromise(xmlData);
30 |
31 | const items = parsed.rss.channel[0].item;
32 |
33 | if (!items || items.length === 0) return null;
34 |
35 | // Map items to RSSItem
36 | const articles: RSSItem[] = items.map((item: any) => {
37 | return ({
38 | title: item.title[0],
39 | link: item.link[0].replace('github.com/acidineydias/', ''),
40 | pubDate: item.pubDate[0],
41 | description: item.description[0],
42 | image: extractImage(item),
43 | tags: extractTags(item),
44 | })
45 | });
46 |
47 | // Sort by pubDate descending
48 | articles.sort((a, b) => new Date(b.pubDate).getTime() - new Date(a.pubDate).getTime());
49 |
50 | return articles[0];
51 | }
52 |
53 | export default defineEventHandler(async () => {
54 | const xml = await $fetch('https://blog.acidineydias.dev/rss.xml', { responseType: 'text' })
55 | return getLatestArticle(xml)
56 | })
--------------------------------------------------------------------------------
/app/components/navigation/NavDesktop.vue:
--------------------------------------------------------------------------------
1 |
2 |
48 |
49 |
50 |
62 |
--------------------------------------------------------------------------------
/app/components/ProjectItem.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | {{ repo.stargazers_count }}
5 |
6 |
7 | {{ formateDate(repo.updated_at) }}
8 |
9 |
10 | {{ capitalize(repo.name.trim()) }}
11 |
12 |
13 |
14 |
15 | {{ repo.language }}
16 |
17 |
18 |
19 |
20 |
21 |
22 |
30 |
31 |
36 |
37 |
75 |
--------------------------------------------------------------------------------
/app/pages/Technologies.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
{{ $t("menu.technologies") }}
4 |
5 |
10 |
11 | {{ $t(`technologies.${tech.name}`) }}
12 |
13 |
16 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
51 |
52 |
57 |
77 |
--------------------------------------------------------------------------------
/app/pages/experiences.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
{{ $t("menu.experiences") }}
4 |
23 |
24 |
25 |
55 |
56 |
76 |
--------------------------------------------------------------------------------
/app/components/CustomLoading.vue:
--------------------------------------------------------------------------------
1 |
2 |
5 |
6 |
7 |
79 |
--------------------------------------------------------------------------------
/app/components/ExperienceItem.vue:
--------------------------------------------------------------------------------
1 |
2 |
27 |
28 |
29 |
40 |
41 |
46 |
47 |
91 |
--------------------------------------------------------------------------------
/app/assets/experiences.json:
--------------------------------------------------------------------------------
1 | {
2 | "scheme": "technologies",
3 | "description": "List of all my professional experiences",
4 | "author": "Acidiney Dias ",
5 | "version": "0.1.0",
6 | "experiences": [
7 | {
8 | "companyLogo": "https://media.licdn.com/dms/image/v2/D4D0BAQFSexdvK2mWhw/company-logo_200_200/company-logo_200_200/0/1736250958915/aubay_portugal_logo?e=1766620800&v=beta&t=xWBeAJ9umcKZKWcURv_kd6YMBgmoPAMx4NBaTKw26qs",
9 | "companyName": "Aubay Portugal > Mercedes Benz",
10 | "website": "https://aubay.pt",
11 | "role": "Senior Software Engineer",
12 | "startDate": "Aug. 2025",
13 | "endDate": "Current",
14 | "location": "Remote, Portugal"
15 | },
16 | {
17 | "companyLogo": "https://cdn.brandfetch.io/idAmZO9G-h/w/1080/h/1080/theme/dark/icon.jpeg?c=1bxid64Mup7aczewSAYMX&t=1761132968897",
18 | "companyName": "ITGest Portugal",
19 | "website": "https://itgest.pt",
20 | "role": "Senior Software Developer",
21 | "startDate": "Nov. 2024",
22 | "endDate": "Aug. 2025",
23 | "location": "Aveiro, Portugal"
24 | },
25 | {
26 | "companyLogo": "https://cdn.brandfetch.io/idAmZO9G-h/w/1080/h/1080/theme/dark/icon.jpeg?c=1bxid64Mup7aczewSAYMX&t=1761132968897",
27 | "companyName": "ITGest Angola",
28 | "website": "https://itgest.co.ao",
29 | "role": "DevOps Eng.& Product Owner",
30 | "startDate": "Mar. 2022",
31 | "endDate": "Nov. 2024",
32 | "location": "Nova Vida, Angola"
33 | },
34 | {
35 | "companyLogo": "https://cdn.brandfetch.io/idAmZO9G-h/w/1080/h/1080/theme/dark/icon.jpeg?c=1bxid64Mup7aczewSAYMX&t=1761132968897",
36 | "companyName": "ITGest Angola",
37 | "website": "https://itgest.co.ao",
38 | "role": "Software Developer",
39 | "startDate": "Jun. 2020",
40 | "endDate": "Mar. 2022",
41 | "location": "Talatona, Angola"
42 | },
43 | {
44 | "companyLogo": "https://avatars1.githubusercontent.com/u/55786188?s=200&v=4",
45 | "companyName": "Digital Factory Angola",
46 | "website": "https://digitalfactory.co.ao",
47 | "role": "Frontend Team Leader",
48 | "startDate": "Mar. 2019",
49 | "endDate": "Jun. 2020",
50 | "location": "Talatona, Angola"
51 | },
52 | {
53 | "companyLogo": "https://avatars1.githubusercontent.com/u/47317779?s=200&v=4",
54 | "companyName": "KiandaStream",
55 | "website": "http://kianda.stream",
56 | "role": "Frontend Developer",
57 | "startDate": "Jan. 2019",
58 | "endDate": "Mar. 2019",
59 | "location": "Maianga, Angola"
60 | }
61 | ]
62 | }
63 |
--------------------------------------------------------------------------------
/i18n/locales/en.json:
--------------------------------------------------------------------------------
1 | {
2 | "hello": "Hello, I'm
Acidiney Dias",
3 | "avatar": {
4 | "alt": "Acidiney Dias Profile Picture"
5 | },
6 | "cv_link": "https://www.icloud.com/iclouddrive/085LivXm9viWS4vaAp-R_twpg#ACIDINEY_DIAS",
7 | "toggle-theme": "Toggle theme dark/light",
8 | "last-article": "Read my last article:",
9 | "cover": "I'm a software engineer with +7 years, during this time I had the opportunity to work with all parts of the software development cycle. From designing a system that was projected to receive thousand of requests per second in Telecom, to design a Big Data ETL that combine data from different sources, applying data mining in it, and extract relevant data to show to ours stakeholders. I have implemented scalable systems architecture and lead development teams together with other departments.",
10 | "links": {
11 | "youtube": "My Youtube Channel",
12 | "twitter": "My X Account",
13 | "medium": "My Medium Account",
14 | "linkedin": "My Linkedin Profile",
15 | "github": "My Github Profile",
16 | "instagram": "My Instagram Account"
17 | },
18 | "menu": {
19 | "openSource": "Open source projects",
20 | "blog": "Blog",
21 | "technologies": "Technologies",
22 | "experiences": "Experiences",
23 | "contact": "Contact"
24 | },
25 | "findAnyProjectToContribute": "Find one and contribute 😄",
26 | "contact": {
27 | "subTitle": "You can contact me using form above ^^",
28 | "fromName": "Your name here...",
29 | "fromEmail": "Your email here...",
30 | "message": "You can write your message here...",
31 | "submit": "Send Message",
32 | "success": "Message sended, I will respond as soon as possible.",
33 | "error": "Oops, this should not have happened! Send an e-mail to hireme[at]acidineydias.dev instead."
34 | },
35 | "downloadCV": "Download my CV",
36 | "technologies": {
37 | "languages": "Programming Languages",
38 | "frontendTools": "Frontend Tools",
39 | "backendTools": "Backend Tools",
40 | "testingTools": "Testing Tools",
41 | "packageManager": "Package Manager",
42 | "database": "Database",
43 | "editors": "Editors",
44 | "mobileDevelopment": "Mobile Development",
45 | "devToolsAndDevOps": "Dev Tools & DevOps",
46 | "extraTools": "Extra Tools",
47 | "browser": "Browsers",
48 | "managementAndDeploymentTools": "Management and deployment Tools",
49 | "videoStreamPlatforms": "Video Stream Platforms",
50 | "gamming": "Gamming",
51 | "projects": "Projects",
52 | "socialMedia": "Social Media",
53 | "drive": "Drive",
54 | "eventTickets": "Event Tickets",
55 | "operationalSystems": "Operational Systems",
56 | "enthusiast": "Enthusiast"
57 | }
58 | }
--------------------------------------------------------------------------------
/app/layouts/default.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
10 |
11 |
12 |
16 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
94 |
95 |
100 |
--------------------------------------------------------------------------------
/app/assets/css/index.css:
--------------------------------------------------------------------------------
1 | /* ---------------------------------------
2 | Global Reset
3 | ---------------------------------------- */
4 | *, *::before, *::after {
5 | box-sizing: border-box;
6 | margin: 0;
7 | transition: all 0.26s linear;
8 | }
9 |
10 | /* ---------------------------------------
11 | Transitions - Page Animations
12 | ---------------------------------------- */
13 | .slide-fade {
14 | &-enter-active,
15 | &-leave-active {
16 | transition: all 0.4s ease;
17 | }
18 |
19 | &-enter,
20 | &-leave-to {
21 | transform: translateX(50px);
22 | opacity: 0;
23 | }
24 | }
25 |
26 | .fade {
27 | &-enter-active,
28 | &-leave-active {
29 | transition: opacity 0.5s;
30 | }
31 |
32 | &-enter,
33 | &-leave-to {
34 | opacity: 0;
35 | }
36 | }
37 |
38 | /* ---------------------------------------
39 | Scrollbar
40 | ---------------------------------------- */
41 | ::-webkit-scrollbar {
42 | width: 5px;
43 | height: 5px;
44 | }
45 |
46 | ::-webkit-scrollbar-track {
47 | background-color: rgba(255, 255, 255, 0.1);
48 | border-radius: 10px;
49 | }
50 |
51 | ::-webkit-scrollbar-thumb {
52 | background-color: #11171a;
53 | border-radius: 10px;
54 | }
55 |
56 | /* ---------------------------------------
57 | HTML Base Styles
58 | ---------------------------------------- */
59 | html {
60 | font-family: "Gothic A1", "Source Sans Pro", -apple-system,
61 | BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial,
62 | sans-serif !important;
63 | font-size: 16px;
64 | word-spacing: 1px;
65 | -ms-text-size-adjust: 100%;
66 | -webkit-text-size-adjust: 100%;
67 | -moz-osx-font-smoothing: grayscale;
68 | -webkit-font-smoothing: antialiased;
69 | box-sizing: border-box;
70 | }
71 |
72 | /* ---------------------------------------
73 | Navigation
74 | ---------------------------------------- */
75 | nav {
76 | display: flex;
77 | justify-content: space-between;
78 | align-items: center;
79 |
80 | ul.left {
81 | span.separator {
82 | margin: 0 5px;
83 | }
84 | }
85 |
86 | ul.left a,
87 | ul.right a {
88 | display: flex;
89 | }
90 | }
91 |
92 | /* ---------------------------------------
93 | Utilities
94 | ---------------------------------------- */
95 | .gothic-font {
96 | font-family: "Gothic A1", "Source Sans Pro", -apple-system,
97 | BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial,
98 | sans-serif;
99 | }
100 |
101 | /* ---------------------------------------
102 | Article Styles
103 | ---------------------------------------- */
104 | .last-article {
105 | padding: 15px;
106 | margin: 15px 0;
107 | font-family: "Gothic A1", sans-serif;
108 | }
109 |
110 |
111 | .text-primary {
112 | color: var(--text-primary);
113 | }
114 |
115 | .text-secondary {
116 | color: var(--text-secondary);
117 | }
118 |
119 | .router-link-exact-active {
120 | font-weight: bold !important;
121 | }
--------------------------------------------------------------------------------
/i18n/locales/pt.json:
--------------------------------------------------------------------------------
1 | {
2 | "hello": "Olá, eu sou o
Acidiney Dias",
3 | "cover": "Software Engineer com +7 anos de experiência. Durante esse período, tive a oportunidade de atuar em todas as etapas do ciclo de desenvolvimento de software. Desde projetar um sistema para uma empresa de Telecom, capaz de receber milhares de requisições por segundo, até desenvolver um ETL de Big Data que combina dados de diferentes fontes, aplica técnicas de mineração de dados e extrai informações relevantes para apresentar aos nossos stakeholders. Também implementei arquiteturas de sistemas escaláveis e liderei equipes de desenvolvimento em colaboração com outros departamentos.",
4 | "avatar": {
5 | "alt": "Foto de Perfil de Acidiney Dias"
6 | },
7 | "cv_link": "https://www.icloud.com/iclouddrive/085LivXm9viWS4vaAp-R_twpg#ACIDINEY_DIAS",
8 | "toggle-theme": "Inverter tema escuro/claro",
9 | "last-article": "Leia o meu último artigo:",
10 | "links": {
11 | "youtube": "Meu canal do youtube",
12 | "twitter": "Minha conta no twitter",
13 | "medium": "Minha conta no medium",
14 | "linkedin": "Meu perfil no linkedin",
15 | "github": "Meu perfil no github",
16 | "instagram": "Minha conta no instagram"
17 | },
18 | "menu": {
19 | "openSource": "Projectos abertos",
20 | "blog": "Blog",
21 | "technologies": "Tecnologias",
22 | "experiences": "Experiências",
23 | "contact": "Contacte-me"
24 | },
25 | "findAnyProjectToContribute": "Encontre algum projecto para contribuir 😄",
26 | "contact": {
27 | "subTitle": "Você pode entrar em contacto comigo pelo formulário abaixo ^^",
28 | "fromName": "Escreva o seu nome aqui...",
29 | "fromEmail": "Escreva o seu e-mail aqui...",
30 | "message": "Ok, agora escreva sua mensagem...",
31 | "submit": "Enviar para mim.",
32 | "success": "Mensagem enviada, irei responder o mais rápido possível",
33 | "error": "Oops, isso não deveria ter acontecido! Envie um e-mail para hireme[at]acidineydias.dev no lugar."
34 | },
35 | "downloadCV": "Baixar o meu CV",
36 | "technologies": {
37 | "languages": "Linguagens de programação",
38 | "frontendTools": "Ferramentas de frontend",
39 | "backendTools": "Ferramentas de backend",
40 | "testingTools": "Ferramentas para testes",
41 | "packageManager": "Gerenciador de pacotes",
42 | "database": "Base de dados",
43 | "editors": "Editores",
44 | "mobileDevelopment": "Desenvolvimento móvel",
45 | "devToolsAndDevOps": "Ferramentas de desenvolvimento & DevOps",
46 | "extraTools": "Extras",
47 | "browser": "Navegadores",
48 | "managementAndDeploymentTools": "Ferramentas de gerenciamento e publicação de projectos",
49 | "videoStreamPlatforms": "Plataformas de exibição de vídeo",
50 | "gamming": "Jogos",
51 | "projects": "Projectos",
52 | "socialMedia": "Redes sóciais",
53 | "drive": "Armazenamento",
54 | "eventTickets": "Ingressos",
55 | "operationalSystems": "Sistemas operacionais",
56 | "enthusiast": "Entusiasta de "
57 | }
58 | }
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | [](https://app.netlify.com/sites/acidineydias/deploys)
2 |
3 |
4 | Acidiney Dias Personal Website
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 | Techs |
24 | Project |
25 | Layout |
26 | How to Build Setup |
27 | How to Contribute |
28 | License |
29 | Author
30 |
31 |
32 | ## :rocket: Techs
33 |
34 | This project was developed with the following technologies:
35 |
36 | - [VueJs](https://vuejs.org/)
37 | - [Javascript](https://www.w3schools.com/js/)
38 | - [NuxtJs](https://nuxtjs.org/)
39 | - [Jamstack](https://jamstack.org/)
40 | - [CSS](https://www.w3schools.com/css/)
41 |
42 | ## 💻 Project
43 |
44 | This is Acidiney Dias personal website, made with Nuxt JS.
45 |
46 | ## Layout
47 |
48 | ### Desktop Layout
49 |
50 | 
51 |
52 | ### Mobile Layout
53 |
54 | 
55 |
56 | #### Link to preview project
57 |
58 | [Preview](https://www.acidineydias.me/)
59 |
60 |
61 | ## How to Build Setup
62 |
63 | ```bash
64 | # install dependencies
65 | $ bun install
66 |
67 | # serve with hot reload at localhost:3000
68 | $ bun dev
69 |
70 | # build for production and launch server
71 | $ bun build
72 | $ bun start
73 |
74 | # generate static project
75 | $ bun generate
76 | ```
77 |
78 | ## 🤔 How to Contribute
79 |
80 | - Fork this repository;
81 | - Create a branch with your feature: `git checkout -b my-feature`;
82 | - Commit your changes: `git commit -m 'feat: my new feature'`;
83 | - Push to your branch: `git push origin my-feature`.
84 |
85 | After the merge of your pull request is done, you can delete your branch.
86 |
87 | ## :memo: License
88 |
89 | This project is under the MIT license. See the archive [LICENSE](LICENSE.md) for more details.
90 |
91 | ## Author
92 |
93 | [Acidiney Dias](https://github.com/acidiney/)
94 |
--------------------------------------------------------------------------------
/app/pages/Contact.vue:
--------------------------------------------------------------------------------
1 |
2 |
44 |
45 |
46 |
112 |
113 |
127 |
--------------------------------------------------------------------------------
/nuxt.config.ts:
--------------------------------------------------------------------------------
1 | const builtAt = new Date().toISOString();
2 | const sw = process.env.SW === "true";
3 | // https://nuxt.com/docs/api/configuration/nuxt-config
4 | export default defineNuxtConfig({
5 | compatibilityDate: "2025-07-15",
6 | devtools: { enabled: false },
7 | modules: [
8 | "@nuxt/image",
9 | "@nuxt/eslint",
10 | "@nuxtjs/i18n",
11 | "@nuxtjs/tailwindcss",
12 | "@pinia/nuxt",
13 | "@nuxtjs/sitemap",
14 | "nuxt-gtag",
15 | "@vite-pwa/nuxt",
16 | ],
17 | i18n: {
18 | defaultLocale: "en",
19 | locales: [
20 | { code: "en", name: "English", file: "en.json" },
21 | { code: "pt", name: "Portuguese", file: "pt.json" },
22 | ],
23 | baseUrl: "https://acidineydias.dev",
24 | strategy: "prefix_except_default",
25 | detectBrowserLanguage: {
26 | useCookie: true,
27 | cookieKey: "i18n_redirected",
28 | redirectOn: "root",
29 | },
30 | compilation: {
31 | strictMessage: false,
32 | },
33 | },
34 | app: {
35 | head: {
36 | meta: [
37 | { charset: "utf-8" },
38 | { name: "author", content: "Acidiney Dias " },
39 | { name: "application-name", content: "Acidiney Dias Website" },
40 | { name: "viewport", content: "width=device-width, initial-scale=1" },
41 | { name: "robots", content: "index, blog, follow" },
42 | { name: "twitter:card", content: "summary_large_image" },
43 | { name: "twitter:site", content: "@acidineydias" },
44 | { name: "linkedin:site", content: "acidineydias" },
45 | { name: "medium:site", content: "@acidiney" },
46 | { name: "github:site", content: "acidiney" },
47 | { property: "og:type", content: "profile" },
48 | { property: "og:updated_time", content: builtAt },
49 | { property: "apple-mobile-web-app-title", content: "Acidiney Dias" },
50 | ],
51 | link: [
52 | {
53 | type: "shortcut icon",
54 | href: "/favicon/favicon.ico",
55 | },
56 | {
57 | rel: "icon",
58 | type: "image/svg+xml",
59 | href: "/favicon/favicon.svg",
60 | },
61 | {
62 | rel: "icon",
63 | type: "image/png",
64 | href: "/favicon/favicon-96x96.png",
65 | sizes: "96x96",
66 | },
67 | {
68 | rel: "apple-touch-icon",
69 | href: "/favicon/apple-touch-icon.png",
70 | sizes: "180x180",
71 | },
72 | ],
73 | },
74 | },
75 | css: [
76 | "~/assets/css/fonts.css",
77 | "~/assets/css/index.css",
78 | "~/assets/css/dark.css",
79 | "~/assets/css/light.css",
80 | ],
81 | pwa: {
82 | registerType: "autoUpdate",
83 | strategies: sw ? "injectManifest" : "generateSW",
84 | client: {
85 | installPrompt: true,
86 | },
87 | manifest: {
88 | id: "acidiney_dias_dev",
89 | name: "Acidiney Dias | Full stack developer",
90 | short_name: "acidiney_dias",
91 | theme_color: "#212121",
92 | background_color: "#212121",
93 | display: "standalone",
94 | lang: "en",
95 | icons: [
96 | {
97 | src: "/favicon/web-app-manifest-192x192.png",
98 | sizes: "192x192",
99 | type: "image/png",
100 | purpose: "maskable",
101 | },
102 | {
103 | src: "/favicon/web-app-manifest-512x512.png",
104 | sizes: "512x512",
105 | type: "image/png",
106 | purpose: "maskable",
107 | },
108 | ],
109 | },
110 | },
111 | });
112 |
--------------------------------------------------------------------------------
/app/assets/technologies.json:
--------------------------------------------------------------------------------
1 | {
2 | "scheme": "technologies",
3 | "description": "List of tools that I use now",
4 | "author": "Acidiney Dias ",
5 | "version": "0.1.0",
6 | "technologies": [
7 | {
8 | "name": "languages",
9 | "icons": [
10 | "icon-javascript",
11 | "icon-python",
12 | "icon-go",
13 | "icon-kotlin",
14 | "icon-php"
15 | ]
16 | },
17 | {
18 | "name": "frontendTools",
19 | "icons": [
20 | "icon-html5",
21 | "icon-vue-dot-js",
22 | "icon-angular",
23 | "icon-css3",
24 | "icon-react",
25 | "icon-storybook",
26 | "icon-svelte",
27 | "icon-tailwindcss",
28 | "icon-typescript",
29 | "icon-webpack",
30 | "icon-figma",
31 | "icon-adobexd"
32 | ]
33 | },
34 | {
35 | "name": "backendTools",
36 | "icons": [
37 | "icon-codeigniter",
38 | "icon-deno",
39 | "icon-node-dot-js",
40 | "icon-laravel",
41 | "icon-django",
42 | "icon-nginx"
43 | ]
44 | },
45 | {
46 | "name": "testingTools",
47 | "icons": [
48 | "icon-jest",
49 | "icon-postman",
50 | "icon-swagger"
51 | ]
52 | },
53 | {
54 | "name": "packageManager",
55 | "icons": [
56 | "icon-yarn",
57 | "icon-npm"
58 | ]
59 | },
60 | {
61 | "name": "database",
62 | "icons": [
63 | "icon-mysql",
64 | "icon-postgresql",
65 | "icon-mongodb"
66 | ]
67 | },
68 | {
69 | "name": "editors",
70 | "icons": [
71 | "icon-visualstudiocode",
72 | "icon-vim",
73 | "icon-jetbrains",
74 | "icon-sublimetext",
75 | "icon-xcode"
76 | ]
77 | },
78 | {
79 | "name": "mobileDevelopment",
80 | "icons": [
81 | "icon-ionic"
82 | ]
83 | },
84 | {
85 | "name": "devToolsAndDevOps",
86 | "icons": [
87 | "icon-docker",
88 | "icon-jenkins",
89 | "icon-github",
90 | "icon-gitlab"
91 | ]
92 | },
93 | {
94 | "name": "extraTools",
95 | "icons": [
96 | "icon-todoist",
97 | "icon-trello",
98 | "icon-spotify",
99 | "icon-shopify",
100 | "icon-microsoftteams"
101 | ]
102 | },
103 | {
104 | "name": "browser",
105 | "icons": [
106 | "icon-brave",
107 | "icon-mozillafirefox"
108 | ]
109 | },
110 | {
111 | "name": "managementAndDeploymentTools",
112 | "icons": [
113 | "icon-cloudflare",
114 | "icon-netlify",
115 | "icon-heroku",
116 | "icon-microsoftazure",
117 | "icon-amazonaws",
118 | "icon-linode"
119 | ]
120 | },
121 | {
122 | "name": "videoStreamPlatforms",
123 | "icons": [
124 | "icon-youtube",
125 | "icon-crunchyroll"
126 | ]
127 | },
128 | {
129 | "name": "gamming",
130 | "icons": [
131 | "icon-steam"
132 | ]
133 | },
134 | {
135 | "name": "projects",
136 | "icons": [
137 | "icon-github",
138 | "icon-gitlab",
139 | "icon-medium",
140 | "icon-producthunt"
141 | ]
142 | },
143 | {
144 | "name": "socialMedia",
145 | "icons": [
146 | "icon-x",
147 | "icon-linkedin",
148 | "icon-instagram",
149 | "icon-discord",
150 | "icon-reddit"
151 | ]
152 | },
153 | {
154 | "name": "operationalSystems",
155 | "icons": [
156 | "icon-apple",
157 | "icon-ubuntu",
158 | "icon-archlinux"
159 | ]
160 | },
161 | {
162 | "name": "enthusiast",
163 | "icons": [
164 | "icon-monero",
165 | "icon-bitcoin",
166 | "icon-ethereum"
167 | ]
168 | }
169 | ]
170 | }
--------------------------------------------------------------------------------
/app/components/AboutMe.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
12 |
13 |
14 |
66 |
67 |
68 |
69 |
70 |
118 |
119 |
124 |
125 |
146 |
--------------------------------------------------------------------------------
/app/assets/css/dark.css:
--------------------------------------------------------------------------------
1 | .theme-dark {
2 | /* ---------------------------------------
3 | Theme Variables
4 | --------------------------------------- */
5 | --bg: #212121;
6 | --bg-soft: rgba(21, 21, 21, 0.82);
7 | --text-primary: #fafafa;
8 | --text-secondary: #bababa;
9 | --text-muted: rgba(148, 148, 149, 0.9);
10 |
11 | background-color: var(--bg);
12 | width: 100%;
13 | height: 100%;
14 |
15 | .bg-secondary {
16 | background-color: var(--bg-soft);
17 | }
18 |
19 |
20 | /* ---------------------------------------
21 | Navigation
22 | --------------------------------------- */
23 | nav {
24 | ul.left a {
25 | color: var(--text-primary);
26 | font-weight: 300;
27 | transition: all 0.26s linear;
28 |
29 | &:hover,
30 | &.nuxt-link-exact-active {
31 | font-weight: 800;
32 | }
33 | }
34 |
35 | ul.right li {
36 | a {
37 | color: var(--text-secondary);
38 | font-weight: 300;
39 | }
40 |
41 | button i::before {
42 | color: var(--text-secondary);
43 | font-size: 18pt;
44 | }
45 | }
46 |
47 | .menu-button {
48 | height: 30px;
49 | width: 30px;
50 | border: 1.5px solid var(--text-secondary);
51 | border-radius: 25px;
52 | display: flex;
53 | align-items: center;
54 | justify-content: center;
55 |
56 | i::before {
57 | color: var(--text-secondary);
58 | }
59 |
60 | &:hover {
61 | border-color: var(--text-primary);
62 |
63 | i::before {
64 | color: var(--text-primary);
65 | }
66 | }
67 | }
68 | }
69 |
70 | /* ---------------------------------------
71 | Mobile Menu
72 | --------------------------------------- */
73 | .mobile-menu {
74 | background-color: var(--bg-soft);
75 | color: var(--text-primary);
76 |
77 | button.absolute {
78 | border: 1px solid #fff;
79 | color: #fff;
80 | }
81 | }
82 |
83 | /* ---------------------------------------
84 | About Me
85 | --------------------------------------- */
86 | .about-me {
87 | h1 {
88 | color: var(--text-primary);
89 | }
90 |
91 | p {
92 | color: var(--text-secondary);
93 |
94 | a {
95 | color: var(--text-primary);
96 | }
97 | }
98 |
99 | .icon-2x {
100 | &::before {
101 | font-size: 2em;
102 | color: var(--text-primary);
103 | }
104 |
105 | &:hover::before {
106 | color: var(--text-muted);
107 | }
108 | }
109 | }
110 |
111 | /* ---------------------------------------
112 | Contact Form
113 | --------------------------------------- */
114 | .contact {
115 | form {
116 | p {
117 | color: var(--text-secondary);
118 | }
119 |
120 | input,
121 | textarea {
122 | background-color: var(--bg-soft);
123 | color: var(--text-primary);
124 |
125 | &::placeholder {
126 | color: var(--text-secondary);
127 | }
128 | }
129 | }
130 |
131 | button {
132 | background: var(--bg-soft);
133 | color: var(--text-primary);
134 | padding: 12px 30px;
135 | font-family: "Gothic A1", sans-serif;
136 |
137 | &:hover {
138 | background: #0f0f0f;
139 | }
140 | }
141 | }
142 |
143 | .download-button {
144 | color: var(--text-primary);
145 | }
146 |
147 | /* ---------------------------------------
148 | Articles & Projects
149 | --------------------------------------- */
150 | .articles,
151 | .projects {
152 | article a {
153 | background-color: var(--bg-soft);
154 |
155 | .categories p,
156 | h2,
157 | span {
158 | color: var(--text-primary);
159 | }
160 | }
161 |
162 | h2.sub-title {
163 | color: var(--text-primary);
164 | }
165 | }
166 |
167 | .app-title.sub-title {
168 | color: var(--text-primary);
169 | }
170 |
171 | /* ---------------------------------------
172 | Single Article Page
173 | --------------------------------------- */
174 | .article {
175 | color: var(--text-primary);
176 |
177 | header {
178 | p {
179 | color: var(--text-muted);
180 | }
181 |
182 | .icon-2x {
183 | &::before {
184 | color: var(--text-primary);
185 | }
186 |
187 | &:hover::before {
188 | color: var(--text-muted);
189 | }
190 | }
191 | }
192 | }
193 |
194 | /* ---------------------------------------
195 | Technologies Icons
196 | --------------------------------------- */
197 | .icon-github::before,
198 | .icon-medium::before,
199 | .icon-steam::before,
200 | .icon-rust::before,
201 | .icon-stylus::before,
202 | .icon-deno::before,
203 | .icon-jetbrains::before {
204 | color: var(--text-primary);
205 | }
206 |
207 | /* ---------------------------------------
208 | Experiences Timeline
209 | --------------------------------------- */
210 | .experiences {
211 | .content,
212 | .dot {
213 | background-color: var(--bg-soft);
214 | }
215 |
216 | .content .description {
217 | color: var(--text-primary);
218 | }
219 |
220 | .line {
221 | border-left: 1px solid var(--bg-soft);
222 | }
223 | }
224 |
225 | /* ---------------------------------------
226 | Last Article Block
227 | --------------------------------------- */
228 | .last-article {
229 | border: 2px dashed rgba(21, 21, 21, 0.86);
230 |
231 | &:hover,
232 | &:focus {
233 | background-color: var(--bg-soft);
234 | }
235 |
236 | a {
237 | span {
238 | color: var(--text-muted);
239 | }
240 |
241 | p.title {
242 | font-weight: bold;
243 | color: var(--text-primary);
244 | }
245 | }
246 | }
247 | }
248 |
--------------------------------------------------------------------------------
/app/assets/css/light.css:
--------------------------------------------------------------------------------
1 | .theme-light {
2 | /* ---------------------------------------
3 | Theme Variables
4 | --------------------------------------- */
5 | --bg: #f0f0f0;
6 | --bg-soft: rgba(231, 231, 231, 0.81);
7 | --text-primary: #212121;
8 | --text-secondary: #333333;
9 | --text-accent: #222;
10 | --text-muted: #777;
11 | --text-light: #f0f0f0;
12 |
13 | background-color: var(--bg);
14 | width: 100%;
15 | height: 100%;
16 |
17 | .bg-secondary {
18 | background-color: #fff;
19 | }
20 |
21 | /* ---------------------------------------
22 | Navigation
23 | --------------------------------------- */
24 | nav {
25 | ul.left a {
26 | color: var(--text-primary);
27 | font-weight: 300;
28 |
29 | &:hover,
30 | &.nuxt-link-exact-active {
31 | font-weight: 800;
32 | }
33 | }
34 |
35 | ul.right li {
36 | a {
37 | color: var(--text-primary);
38 | font-weight: 300;
39 | }
40 |
41 | button i::before {
42 | color: var(--text-primary);
43 | font-size: 18pt;
44 | }
45 | }
46 |
47 | .menu-button {
48 | height: 30px;
49 | width: 30px;
50 | border: 1.5px solid var(--text-primary);
51 | border-radius: 25px;
52 | display: flex;
53 | align-items: center;
54 | justify-content: center;
55 |
56 | i::before {
57 | color: var(--text-primary);
58 | }
59 |
60 | &:hover {
61 | border-color: var(--text-primary);
62 |
63 | i::before {
64 | color: var(--text-primary);
65 | }
66 | }
67 | }
68 | }
69 |
70 | /* ---------------------------------------
71 | Download Button
72 | --------------------------------------- */
73 | .download-button {
74 | color: var(--text-primary);
75 | }
76 |
77 | /* ---------------------------------------
78 | Mobile Menu
79 | --------------------------------------- */
80 | .mobile-menu {
81 | background-color: var(--bg-soft);
82 | color: var(--text-primary);
83 |
84 | button.absolute {
85 | border: 1px solid var(--text-primary);
86 | color: var(--text-primary);
87 | }
88 | }
89 |
90 | /* ---------------------------------------
91 | About Me
92 | --------------------------------------- */
93 | .about-me {
94 | h1 {
95 | color: var(--text-primary);
96 | }
97 |
98 | p {
99 | color: var(--text-secondary);
100 |
101 | a {
102 | color: var(--text-accent);
103 | }
104 | }
105 |
106 | a {
107 | color: var(--text-secondary);
108 | }
109 |
110 | .icon-2x {
111 | &::before {
112 | font-size: 2em;
113 | color: var(--text-secondary);
114 | }
115 |
116 | &:hover::before {
117 | color: rgba(148, 148, 149, 0.9);
118 | }
119 | }
120 | }
121 |
122 | /* ---------------------------------------
123 | Articles
124 | --------------------------------------- */
125 | .articles {
126 | article a {
127 | background-color: #1e1e1ebd;
128 |
129 | .categories p,
130 | h2,
131 | span {
132 | color: var(--text-light);
133 | }
134 | }
135 | }
136 |
137 | /* ---------------------------------------
138 | Projects
139 | --------------------------------------- */
140 | .projects {
141 | article a {
142 | background: #fff;
143 |
144 | .categories p,
145 | h2,
146 | span {
147 | color: #1e1e1ebd;
148 | }
149 |
150 | h2.sub-title {
151 | color: #1e1e1ebd;
152 | }
153 | }
154 | }
155 |
156 | /* ---------------------------------------
157 | Contact Form
158 | --------------------------------------- */
159 | .contact {
160 | form {
161 | p {
162 | color: var(--text-primary);
163 | }
164 |
165 | input::placeholder,
166 | textarea::placeholder {
167 | color: #444;
168 | }
169 | }
170 |
171 | button {
172 | background: var(--text-primary);
173 | color: var(--text-light);
174 | padding: 12px 30px;
175 | font-family: "Gothic A1", sans-serif;
176 |
177 | &:hover {
178 | background: rgba(21, 21, 21, 0.82);
179 | }
180 | }
181 | }
182 |
183 | /* ---------------------------------------
184 | Titles
185 | --------------------------------------- */
186 | .app-title.sub-title {
187 | color: var(--text-primary);
188 | }
189 |
190 | /* ---------------------------------------
191 | Article Page
192 | --------------------------------------- */
193 | .article {
194 | color: #444;
195 |
196 | header {
197 | p {
198 | color: var(--text-muted);
199 | }
200 |
201 | .icon-2x {
202 | &::before {
203 | color: var(--text-primary);
204 | }
205 |
206 | &:hover::before {
207 | color: rgba(148, 148, 149, 0.9);
208 | }
209 | }
210 | }
211 | }
212 |
213 | /* ---------------------------------------
214 | Technologies
215 | --------------------------------------- */
216 | .technologies .tech-section h3 {
217 | color: var(--text-primary);
218 | }
219 |
220 | .icon-instagram::before,
221 | .icon-linkedin::before,
222 | .icon-twitter::before {
223 | color: var(--text-primary);
224 | }
225 |
226 | /* ---------------------------------------
227 | Experiences Timeline
228 | --------------------------------------- */
229 | .experiences {
230 | .content,
231 | .dot {
232 | background-color: #fff;
233 | }
234 |
235 | .content .description {
236 | color: var(--text-primary);
237 | }
238 |
239 | .line {
240 | border-left: 1px solid #fff;
241 | }
242 | }
243 |
244 | /* ---------------------------------------
245 | Last Article Block
246 | --------------------------------------- */
247 | .last-article {
248 | border: 2px dashed #fff;
249 |
250 | &:hover,
251 | &:focus {
252 | background-color: #fff;
253 | }
254 |
255 | a p.title {
256 | font-weight: bold;
257 | }
258 | }
259 | }
260 |
--------------------------------------------------------------------------------
/app/assets/css/fonts.css:
--------------------------------------------------------------------------------
1 | @import url('https://fonts.googleapis.com/css2?family=Gothic+A1:wght@200;300;400;600;700&family=Roboto&display=swap');
2 |
3 | @font-face {
4 | font-family: 'icomoon';
5 | src: url('../fonts/icomoon.eot?1iz44a');
6 | src: url('../fonts/icomoon.eot?1iz44a#iefix') format('embedded-opentype'),
7 | url('../fonts/icomoon.ttf?1iz44a') format('truetype'),
8 | url('../fonts/icomoon.woff?1iz44a') format('woff'),
9 | url('../fonts/icomoon.svg?1iz44a#icomoon') format('svg');
10 | font-weight: normal;
11 | font-style: normal;
12 | font-display: block;
13 | }
14 |
15 | [class^="icon-"], [class*=" icon-"] {
16 | /* use !important to prevent issues with browser extensions that change fonts */
17 | font-family: 'icomoon' !important;
18 | speak: never;
19 | font-style: normal;
20 | font-weight: normal;
21 | font-variant: normal;
22 | text-transform: none;
23 | line-height: 1;
24 |
25 | /* Better Font Rendering =========== */
26 | -webkit-font-smoothing: antialiased;
27 | -moz-osx-font-smoothing: grayscale;
28 | }
29 |
30 | .icon-book-open:before {
31 | content: "\e94a";
32 | }
33 | .icon-github1:before {
34 | content: "\e94b";
35 | }
36 | .icon-home:before {
37 | content: "\e94c";
38 | }
39 | .icon-layers:before {
40 | content: "\e950";
41 | }
42 | .icon-send:before {
43 | content: "\e94d";
44 | }
45 | .icon-terminal:before {
46 | content: "\e94e";
47 | }
48 | .icon-download:before {
49 | content: "\e94f";
50 | }
51 | .icon-sun:before {
52 | content: "\e943";
53 | }
54 | .icon-moon:before {
55 | content: "\e944";
56 | }
57 | .icon-figma:before {
58 | content: "\e900";
59 | }
60 | .icon-heroku:before {
61 | content: "\e947";
62 | color: #430098;
63 | }
64 | .icon-netlify:before {
65 | content: "\e948";
66 | color: #00c7b7;
67 | }
68 | .icon-cloudflare:before {
69 | content: "\e949";
70 | color: #f38020;
71 | }
72 | .icon-gitlab:before {
73 | content: "\e946";
74 | color: #fca121;
75 | }
76 | .icon-php:before {
77 | content: "\e945";
78 | color: #777bb4;
79 | }
80 | .icon-spotify:before {
81 | content: "\e901";
82 | color: #1ed760;
83 | }
84 | .icon-shopify:before {
85 | content: "\e902";
86 | color: #7ab55c;
87 | }
88 | .icon-django:before {
89 | content: "\e903";
90 | }
91 | .icon-nginx:before {
92 | content: "\e904";
93 | color: #269539;
94 | }
95 | .icon-ethereum:before {
96 | content: "\e905";
97 | }
98 | .icon-monero:before {
99 | content: "\e906";
100 | color: #f60;
101 | }
102 | .icon-javascript:before {
103 | content: "\e907";
104 | color: #f7df1e;
105 | }
106 | .icon-ionic:before {
107 | content: "\e908";
108 | color: #3880ff;
109 | }
110 | .icon-trello:before {
111 | content: "\e909";
112 | color: #0079bf;
113 | }
114 | .icon-reddit:before {
115 | content: "\e90a";
116 | color: #ff4500;
117 | }
118 | .icon-discord:before {
119 | content: "\e90b";
120 | color: #7289da;
121 | }
122 | .icon-instagram:before {
123 | content: "\e90c";
124 | color: #e4405f;
125 | }
126 | .icon-x:before {
127 | content: "\e90d";
128 | }
129 | .icon-linkedin:before {
130 | content: "\e90e";
131 | color: #0077b5;
132 | }
133 | .icon-amazonaws:before {
134 | content: "\e90f";
135 | }
136 | .icon-xcode:before {
137 | content: "\e910";
138 | color: #1575f9;
139 | }
140 | .icon-kotlin:before {
141 | content: "\e911";
142 | color: #0095d5;
143 | }
144 | .icon-go:before {
145 | content: "\e912";
146 | color: #00add8;
147 | }
148 | .icon-python:before {
149 | content: "\e913";
150 | color: #3776ab;
151 | }
152 | .icon-jetbrains:before {
153 | content: "\e914";
154 | }
155 | .icon-bitcoin:before {
156 | content: "\e915";
157 | color: #f7931a;
158 | }
159 | .icon-archlinux:before {
160 | content: "\e916";
161 | color: #1793d1;
162 | }
163 | .icon-ubuntu:before {
164 | content: "\e917";
165 | color: #e95420;
166 | }
167 | .icon-apple:before {
168 | content: "\e918";
169 | color: #999;
170 | }
171 | .icon-producthunt:before {
172 | content: "\e919";
173 | color: #da552f;
174 | }
175 | .icon-medium:before {
176 | content: "\e91a";
177 | }
178 | .icon-github:before {
179 | content: "\e91b";
180 | }
181 | .icon-steam:before {
182 | content: "\e91c";
183 | }
184 | .icon-crunchyroll:before {
185 | content: "\e91d";
186 | color: #f47521;
187 | }
188 | .icon-youtube:before {
189 | content: "\e91e";
190 | color: #f00;
191 | }
192 | .icon-mozillafirefox:before {
193 | content: "\e91f";
194 | color: #ff7139;
195 | }
196 | .icon-brave:before {
197 | content: "\e920";
198 | color: #fb542b;
199 | }
200 | .icon-todoist:before {
201 | content: "\e921";
202 | color: #e44332;
203 | }
204 | .icon-microsoftteams:before {
205 | content: "\e922";
206 | color: #6264a7;
207 | }
208 | .icon-docker:before {
209 | content: "\e923";
210 | color: #1488c6;
211 | }
212 | .icon-microsoftazure:before {
213 | content: "\e924";
214 | color: #0089d6;
215 | }
216 | .icon-webpack:before {
217 | content: "\e925";
218 | color: #8dd6f9;
219 | }
220 | .icon-jest:before {
221 | content: "\e926";
222 | color: #c21325;
223 | }
224 | .icon-jenkins:before {
225 | content: "\e927";
226 | color: #d24939;
227 | }
228 | .icon-redis:before {
229 | content: "\e928";
230 | color: #d82c20;
231 | }
232 | .icon-mongodb:before {
233 | content: "\e929";
234 | color: #47a248;
235 | }
236 | .icon-postgresql:before {
237 | content: "\e92a";
238 | color: #336791;
239 | }
240 | .icon-mysql:before {
241 | content: "\e92b";
242 | color: #4479a1;
243 | }
244 | .icon-adobexd:before {
245 | content: "\e92c";
246 | color: #ff2bc2;
247 | }
248 | .icon-vim:before {
249 | content: "\e92d";
250 | color: #019733;
251 | }
252 | .icon-sublimetext:before {
253 | content: "\e92e";
254 | color: #ff9800;
255 | }
256 | .icon-visualstudiocode:before {
257 | content: "\e92f";
258 | color: #007acc;
259 | }
260 | .icon-yarn:before {
261 | content: "\e930";
262 | color: #2c8ebb;
263 | }
264 | .icon-npm:before {
265 | content: "\e931";
266 | color: #cb3837;
267 | }
268 | .icon-postman:before {
269 | content: "\e932";
270 | color: #ff6c37;
271 | }
272 | .icon-codeigniter:before {
273 | content: "\e933";
274 | color: #ee4623;
275 | }
276 | .icon-laravel:before {
277 | content: "\e934";
278 | color: #ff2d20;
279 | }
280 | .icon-swagger:before {
281 | content: "\e935";
282 | color: #85ea2d;
283 | }
284 | .icon-deno:before {
285 | content: "\e936";
286 | }
287 | .icon-typescript:before {
288 | content: "\e937";
289 | color: #007acc;
290 | }
291 | .icon-svelte:before {
292 | content: "\e938";
293 | color: #ff3e00;
294 | }
295 | .icon-tailwindcss:before {
296 | content: "\e939";
297 | color: #38b2ac;
298 | }
299 | .icon-nuxt-dot-js:before {
300 | content: "\e93a";
301 | color: #00c58e;
302 | }
303 | .icon-node-dot-js:before {
304 | content: "\e93b";
305 | color: #393;
306 | }
307 | .icon-linode:before {
308 | content: "\e93c";
309 | color: #00a95c;
310 | }
311 | .icon-storybook:before {
312 | content: "\e93d";
313 | color: #ff4785;
314 | }
315 | .icon-css3:before {
316 | content: "\e93e";
317 | color: #1572b6;
318 | }
319 | .icon-html5:before {
320 | content: "\e93f";
321 | color: #e34f26;
322 | }
323 | .icon-react:before {
324 | content: "\e940";
325 | color: #61dafb;
326 | }
327 | .icon-angular:before {
328 | content: "\e941";
329 | color: #dd0031;
330 | }
331 | .icon-vue-dot-js:before {
332 | content: "\e942";
333 | color: #4fc08d;
334 | }
--------------------------------------------------------------------------------
/public/favicon/favicon.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------