diff --git a/assets/png/obsidian-garden.png b/assets/png/obsidian-garden.png new file mode 100644 index 0000000..c6eae41 Binary files /dev/null and b/assets/png/obsidian-garden.png differ diff --git a/assets/png/orchid-map.png b/assets/png/orchid-map.png new file mode 100644 index 0000000..e0c8c9b Binary files /dev/null and b/assets/png/orchid-map.png differ diff --git a/assets/png/vault48.png b/assets/png/vault48.png new file mode 100644 index 0000000..77c1702 Binary files /dev/null and b/assets/png/vault48.png differ diff --git a/components/bio/BioHeading.vue b/components/bio/BioHeading.vue index bac404c..cecf4a5 100644 --- a/components/bio/BioHeading.vue +++ b/components/bio/BioHeading.vue @@ -1,5 +1,5 @@ diff --git a/components/bio/BioProjectCard.vue b/components/bio/BioProjectCard.vue new file mode 100644 index 0000000..cd8c3dc --- /dev/null +++ b/components/bio/BioProjectCard.vue @@ -0,0 +1,106 @@ + + + + + diff --git a/components/bio/BioProjects.vue b/components/bio/BioProjects.vue index 06f3f26..aca517a 100644 --- a/components/bio/BioProjects.vue +++ b/components/bio/BioProjects.vue @@ -1,20 +1,30 @@ - + diff --git a/components/bio/BioSkills.vue b/components/bio/BioSkills.vue index 8e9a456..5f4f1e9 100644 --- a/components/bio/BioSkills.vue +++ b/components/bio/BioSkills.vue @@ -3,7 +3,7 @@

Skills

- - +
diff --git a/components/skills/SkillsCard.vue b/components/bio/BioSkillsCard.vue similarity index 78% rename from components/skills/SkillsCard.vue rename to components/bio/BioSkillsCard.vue index e681256..0961a23 100644 --- a/components/skills/SkillsCard.vue +++ b/components/bio/BioSkillsCard.vue @@ -1,5 +1,5 @@ diff --git a/components/ui/UiActionButton.vue b/components/ui/UiActionButton.vue index b3cf413..f454062 100644 --- a/components/ui/UiActionButton.vue +++ b/components/ui/UiActionButton.vue @@ -30,7 +30,7 @@ interface Props { href: string; size?: "md"; - variant?: "outline"; + variant?: "outline" | "text" | "primary"; } withDefaults(defineProps(), { @@ -44,11 +44,15 @@ withDefaults(defineProps(), { color: white; border-radius: 8px; text-decoration: none; + display: inline-flex; + align-items: center; + justify-content: center; + + &.variant-primary { + background-color: var(--color-primary); + } &.variant-outline { - display: inline-flex; - align-items: center; - justify-content: center; box-shadow: var(--color-text) 0 0 0 1px; color: var(--color-text); overflow: hidden; @@ -68,7 +72,6 @@ withDefaults(defineProps(), { } &:hover { - color: var(--color-background); box-shadow: var(--color-background) 0 0 0 1px; &::after { @@ -96,6 +99,8 @@ withDefaults(defineProps(), { .title { z-index: 1; position: relative; + flex: 1; + text-align: center; .size-md.prefixed & { padding-left: 10px; diff --git a/components/ui/UiCard.vue b/components/ui/UiCard.vue new file mode 100644 index 0000000..8d289f9 --- /dev/null +++ b/components/ui/UiCard.vue @@ -0,0 +1,20 @@ + + + + + diff --git a/constants/projects.ts b/constants/projects.ts new file mode 100644 index 0000000..3971833 --- /dev/null +++ b/constants/projects.ts @@ -0,0 +1,55 @@ +import { Technology } from "./technologies"; +import vault from "~~/assets/png/vault48.png"; +import orchid from "~~/assets/png/orchid-map.png"; +import obsidian from "~~/assets/png/obsidian-garden.png"; + +interface Project { + name: string; + description: string; + pageUrl: string; + codeUrl: string; + image: string; + technologies: Technology[]; +} + +export const projects: Project[] = [ + { + name: "Vault48", + description: `Community blog with a long 13-year history, features photo, video and audio embedding.\n\nBeeing initially written with Drupal 5, went through refactoring to Laravel + Vue and then, nowadays works on React and Golang stack.`, + pageUrl: "https://vault48.org", + codeUrl: "https://github.com/muerwre/vault-frontend", + image: vault, + technologies: [ + Technology.React, + Technology.ReactSSR, + Technology.GoLang, + Technology.Postgres, + ], + }, + { + name: "Orchid Map", + description: `Local cycling community Web Maps made with React, Leaflet, and Golang.\n\nImplements automatic route building with OSRM and map rasterization with canvas. Used by users in local cycling communities for ride sharing.`, + pageUrl: "https://map.vault48.org", + codeUrl: "https://github.com/muerwre/orchidmap-front", + image: orchid, + technologies: [ + Technology.React, + Technology.ReactSSR, + Technology.GoLang, + Technology.Postgres, + ], + }, + { + name: "Obsidian Garden", + description: `Frontend for personal knowledge database managed by Obsidian.md software.\n\nMade with nuxt3, nuxt-content plugin and some customizations. Deployed with drone-ci directly to github-pages.`, + pageUrl: "https://muerwre.github.io", + codeUrl: "https://github.com/muerwre/muerwre.github.io", + image: obsidian, + technologies: [ + Technology.React, + Technology.ReactSSR, + Technology.GoLang, + Technology.Postgres, + ], + }, +]; diff --git a/constants/skills.ts b/constants/skills.ts index 7a34325..dc8ed8b 100644 --- a/constants/skills.ts +++ b/constants/skills.ts @@ -1,16 +1,4 @@ -import ReactLogo from "@/assets/svg/react-logo.svg"; -import ReactNativeLogo from "@/assets/svg/react-native-logo.svg"; -import ReactSSR from "@/assets/svg/react-ssr-logo.svg"; -import TsLogo from "@/assets/svg/ts-logo.svg"; -import GoLangLogo from "@/assets/svg/golang-logo.svg"; -import HTMLLogo from "@/assets/svg/html-logo.svg"; -import SVGLogo from "@/assets/svg/svg-logo.svg"; -import ArchLogo from "@/assets/svg/arch-logo.svg"; -import GQLLogo from "@/assets/svg/gql-logo.svg"; -import SwaggerLogo from "@/assets/svg/swagger-logo.svg"; -import VueLogo from "@/assets/svg/vue-logo.svg"; -import PostgresLogo from "@/assets/svg/postgres-logo.svg"; -import DockerLogo from "@/assets/svg/docker-logo.svg"; +import { Technology, technologyIcons, technologyTitles } from "./technologies"; interface Skill { title: string; @@ -21,80 +9,80 @@ interface Skill { export const skills: Skill[] = [ { - title: "React", + title: technologyTitles[Technology.React], description: "Classes and FC-s, hooks, context, redux, redux-saga, mobx", level: 5, - icon: ReactLogo, + icon: technologyIcons[Technology.React], }, { - title: "Typescript", + title: technologyTitles[Technology.ReactNative], description: "For both frontend and backend development: generics, guards, infers", level: 4, - icon: TsLogo, + icon: technologyIcons[Technology.Ts], }, { - title: "SSR (Next, Gatsby)", + title: technologyTitles[Technology.ReactSSR], description: `Automated generation, incremental, static, and dynamic rendering`, level: 4, - icon: ReactSSR, + icon: technologyIcons[Technology.ReactSSR], }, { - title: "Vue.js & Nuxt", + title: technologyTitles[Technology.Ts], description: `Common SPA-s and SSR blogs like this one, with composition API, and Vuex`, level: 3, - icon: VueLogo, + icon: technologyIcons[Technology.Vue], }, { - title: "React Native", + title: technologyTitles[Technology.GoLang], description: `Basic developing and releasing experience without native modules`, level: 3, - icon: ReactNativeLogo, + icon: technologyIcons[Technology.ReactNative], }, { - title: "Golang", + title: technologyTitles[Technology.HTML], description: "Monolith and microservice apps with REST, GraphQL, and GRPC", level: 2, - icon: GoLangLogo, + icon: technologyIcons[Technology.GoLang], }, { - title: "Docker", + title: technologyTitles[Technology.Arch], description: "Docker, docker-compose, private registries, gitlab-ci, and drone-ci", level: 4, - icon: DockerLogo as string, + icon: technologyIcons[Technology.Docker], }, { - title: "HTML, CSS, SVG", + title: technologyTitles[Technology.GQL], description: "Adaptive markup, all modern techniques, preprocessors, and CSS-in-JS", level: 5, - icon: HTMLLogo, + icon: technologyIcons[Technology.HTML], }, { - title: "Linux Shell", + title: technologyTitles[Technology.Swagger], description: "Linux user since 2003, can write scripts to automate my work. BTW, I use Arch!", level: 4, - icon: ArchLogo as string, + icon: technologyIcons[Technology.Arch], }, { - title: "GraphQL", + title: technologyTitles[Technology.Vue], description: "Both server- and client-side. Queries, mutations, cache manipulation", level: 4, - icon: GQLLogo as string, + icon: technologyIcons[Technology.GQL], }, { - title: "REST API", + title: technologyTitles[Technology.Postgres], description: "With Axios, fetch, express, gorilla-mux, and gin-gonic", level: 4, - icon: SwaggerLogo as string, + icon: technologyIcons[Technology.Swagger], }, { - title: "SQL", + title: technologyTitles[Technology.Docker], description: "Base queries, JOIN-s, indexes and simpl query optimizations", level: 2, - icon: PostgresLogo as string, + icon: technologyIcons[Technology.Postgres], }, ]; diff --git a/constants/technologies.ts b/constants/technologies.ts new file mode 100644 index 0000000..2929bbd --- /dev/null +++ b/constants/technologies.ts @@ -0,0 +1,57 @@ +import ReactLogo from "@/assets/svg/react-logo.svg"; +import ReactNativeLogo from "@/assets/svg/react-native-logo.svg"; +import ReactSSRLogo from "@/assets/svg/react-ssr-logo.svg"; +import TsLogo from "@/assets/svg/ts-logo.svg"; +import GoLangLogo from "@/assets/svg/golang-logo.svg"; +import HTMLLogo from "@/assets/svg/html-logo.svg"; +import ArchLogo from "@/assets/svg/arch-logo.svg"; +import GQLLogo from "@/assets/svg/gql-logo.svg"; +import SwaggerLogo from "@/assets/svg/swagger-logo.svg"; +import VueLogo from "@/assets/svg/vue-logo.svg"; +import PostgresLogo from "@/assets/svg/postgres-logo.svg"; +import DockerLogo from "@/assets/svg/docker-logo.svg"; + +export enum Technology { + React = "React", + ReactNative = "ReactNative", + ReactSSR = "ReactSSR", + Ts = "Ts", + GoLang = "GoLang", + HTML = "HTML", + Arch = "Arch", + GQL = "GQL", + Swagger = "Swagger", + Vue = "Vue", + Postgres = "Postgres", + Docker = "Docker", +} + +export const technologyIcons: Record = { + [Technology.React]: ReactLogo, + [Technology.ReactNative]: ReactNativeLogo, + [Technology.ReactSSR]: ReactSSRLogo, + [Technology.Ts]: TsLogo, + [Technology.GoLang]: GoLangLogo, + [Technology.HTML]: HTMLLogo, + [Technology.Arch]: ArchLogo, + [Technology.GQL]: GQLLogo, + [Technology.Swagger]: SwaggerLogo, + [Technology.Vue]: VueLogo, + [Technology.Postgres]: PostgresLogo, + [Technology.Docker]: DockerLogo, +}; + +export const technologyTitles: Record = { + [Technology.React]: "React", + [Technology.ReactNative]: "Typescript", + [Technology.ReactSSR]: "SSR (Next, Gatsby)", + [Technology.Ts]: "Vue.js & Nuxt", + [Technology.GoLang]: "React Native", + [Technology.HTML]: "Golang", + [Technology.Arch]: "Docker", + [Technology.GQL]: "HTML, CSS, SVG", + [Technology.Swagger]: "Linux Shell", + [Technology.Vue]: "GraphQL", + [Technology.Postgres]: "REST API", + [Technology.Docker]: "SQL", +}; diff --git a/custom.d.ts b/custom.d.ts index 5e52f80..e4d7e6d 100644 --- a/custom.d.ts +++ b/custom.d.ts @@ -2,3 +2,8 @@ declare module "*.svg" { const content: string; export default content; } + +declare module "*.png" { + const content: string; + export default content; +} diff --git a/pages/bio.vue b/pages/bio.vue index 8eeda18..9d6fa49 100644 --- a/pages/bio.vue +++ b/pages/bio.vue @@ -7,6 +7,10 @@
+ +
+ +