dev #3
|
@ -1,4 +0,0 @@
|
|||
> 1%
|
||||
last 2 versions
|
||||
not dead
|
||||
not ie 11
|
17
.eslintrc.js
|
@ -1,17 +0,0 @@
|
|||
module.exports = {
|
||||
root: true,
|
||||
env: {
|
||||
node: true
|
||||
},
|
||||
'extends': [
|
||||
'plugin:vue/vue3-essential',
|
||||
'eslint:recommended'
|
||||
],
|
||||
parserOptions: {
|
||||
parser: '@babel/eslint-parser'
|
||||
},
|
||||
rules: {
|
||||
'no-console': process.env.NODE_ENV === 'production' ? 'warn' : 'off',
|
||||
'no-debugger': process.env.NODE_ENV === 'production' ? 'warn' : 'off'
|
||||
}
|
||||
}
|
23
.gitignore
vendored
|
@ -1,23 +1,2 @@
|
|||
.DS_Store
|
||||
node_modules
|
||||
/dist
|
||||
|
||||
|
||||
# local env files
|
||||
.env.local
|
||||
.env.*.local
|
||||
|
||||
# Log files
|
||||
npm-debug.log*
|
||||
yarn-debug.log*
|
||||
yarn-error.log*
|
||||
pnpm-debug.log*
|
||||
|
||||
# Editor directories and files
|
||||
.idea
|
||||
build/
|
||||
.vscode
|
||||
*.suo
|
||||
*.ntvs*
|
||||
*.njsproj
|
||||
*.sln
|
||||
*.sw?
|
||||
|
|
49
README.md
|
@ -1,12 +1,45 @@
|
|||
# keyemail-dev by Keyemail
|
||||
# keyemail.dev
|
||||
|
||||
keyemail-dev is a project site to display about the user Keyemail using Vue v3.0 framework. This project was made by the user `Keyemail` and absolutely no one else.
|
||||
Welcome to the official repo for the site https://keyemail.dev! This site is to display all about the user `Keyemail`, it displays the About Me, Gallery Photos, Socials, and Videos! This project is done under Go, but was orginally made in Vue.
|
||||
|
||||
## To Build:
|
||||
Use this command to build:
|
||||
`yarn build`
|
||||
## Installation
|
||||
|
||||
and use the folder `dist` for production.
|
||||
### Automatic (Easy Way)
|
||||
|
||||
## Contact:
|
||||
Contact `Keyemail` if you have any questions or concerns. ABSOLUTELY NO WARRANTY ON THIS PRODUCT.
|
||||
Make the `build.sh` an executable by:
|
||||
```console
|
||||
chmod +x ./build.sh
|
||||
```
|
||||
and then run:
|
||||
```console
|
||||
./build.sh
|
||||
```
|
||||
|
||||
After that, go into the build folder and run the executable that is in there.
|
||||
|
||||
### Manual (Hard Way)
|
||||
|
||||
First create the directory:
|
||||
```console
|
||||
mkdir build/
|
||||
```
|
||||
|
||||
then, copy src to ./build using:
|
||||
```console
|
||||
cp -r src/ ./build
|
||||
```
|
||||
|
||||
then, build using Go:
|
||||
```console
|
||||
go build -o ./build
|
||||
```
|
||||
|
||||
Your done! Go into the build folder and run the executable.
|
||||
|
||||
## Support
|
||||
|
||||
No support is offered on this package, this is a personal project to learn Go.
|
||||
|
||||
## Credits
|
||||
|
||||
Built by `keyemail`, `kuubeu` helped inspire this project, as well as some svg work.
|
||||
|
|
|
@ -1,5 +0,0 @@
|
|||
module.exports = {
|
||||
presets: [
|
||||
'@vue/cli-plugin-babel/preset'
|
||||
]
|
||||
}
|
13
build.sh
Executable file
|
@ -0,0 +1,13 @@
|
|||
#! /bin/bash
|
||||
echo "Building.."
|
||||
|
||||
echo "Making build folder"
|
||||
mkdir build/
|
||||
|
||||
echo "Copying files into build folder"
|
||||
cp -r src/ ./build/
|
||||
|
||||
echo "Building executable"
|
||||
go build -o ./build/
|
||||
|
||||
echo "Done building!"
|
|
@ -1,19 +0,0 @@
|
|||
{
|
||||
"compilerOptions": {
|
||||
"target": "es5",
|
||||
"module": "esnext",
|
||||
"baseUrl": "./",
|
||||
"moduleResolution": "node",
|
||||
"paths": {
|
||||
"@/*": [
|
||||
"src/*"
|
||||
]
|
||||
},
|
||||
"lib": [
|
||||
"esnext",
|
||||
"dom",
|
||||
"dom.iterable",
|
||||
"scripthost"
|
||||
]
|
||||
}
|
||||
}
|
219
main.go
Normal file
|
@ -0,0 +1,219 @@
|
|||
package main
|
||||
|
||||
import (
|
||||
"net/http"
|
||||
"os"
|
||||
"log"
|
||||
"html/template"
|
||||
"strings"
|
||||
"strconv"
|
||||
)
|
||||
|
||||
type Index struct {
|
||||
WebpageTitle string
|
||||
WebpageIcon string
|
||||
WebpageKeywords string
|
||||
WebpageDescription string
|
||||
WebpageURL string
|
||||
GalleryItems []GalleryItems
|
||||
SocialItems []SocialItems
|
||||
VideoItems []VideoItems
|
||||
GalleryPhoto *GalleryItems
|
||||
VideoContent *VideoItems
|
||||
Nav bool
|
||||
}
|
||||
|
||||
type responseWriter struct {
|
||||
http.ResponseWriter
|
||||
status int
|
||||
}
|
||||
|
||||
type GalleryItems struct {
|
||||
URL string
|
||||
ID int
|
||||
Title string
|
||||
}
|
||||
|
||||
type SocialItems struct {
|
||||
URL string
|
||||
Name string
|
||||
Username string
|
||||
Icon string
|
||||
Color string
|
||||
}
|
||||
|
||||
type VideoItems struct {
|
||||
URL string
|
||||
ID int
|
||||
Title string
|
||||
Description string
|
||||
Thumbnail string
|
||||
}
|
||||
|
||||
var data = &Index {
|
||||
WebpageTitle: "Keyemail",
|
||||
WebpageIcon: "/src/assets/main/favicon.ico",
|
||||
WebpageKeywords: "keyemail",
|
||||
WebpageDescription: "Welcome to keyemail.dev! A profile based on Keyemail.",
|
||||
WebpageURL: "https://keyemail.dev",
|
||||
GalleryItems: galleryItems,
|
||||
SocialItems: socialItems,
|
||||
VideoItems: videoItems,
|
||||
}
|
||||
|
||||
var currentData = &Index{}
|
||||
|
||||
var galleryItems = []GalleryItems {
|
||||
{"/src/assets/gallery/2_cats.jpg", 1, "Resting Day"},
|
||||
{"/src/assets/gallery/friend_cat.jpg", 2, "Orange Furr"},
|
||||
{"/src/assets/gallery/miku_poster.jpg", 3, "Miku Spotted"},
|
||||
{"/src/assets/gallery/networking.jpg", 4, "Wires of Networking"},
|
||||
{"/src/assets/gallery/another_friend_cat.jpg", 5, "Night Cat"},
|
||||
{"/src/assets/gallery/pc_case_stickers.jpg", 6, "I use arch BTW"},
|
||||
{"/src/assets/gallery/movie_picture_1.jpg", 7, "Prime Cut Cafe"},
|
||||
{"/src/assets/gallery/movie_picture_2.jpg", 8, "Big Fountain"},
|
||||
{"/src/assets/gallery/bird.jpg", 9, "Birds Eye"},
|
||||
{"/src/assets/gallery/japanese_garden_1.jpg", 10, "Pond of Fishes"},
|
||||
{"/src/assets/gallery/japanese_garden_2.jpg", 11, "Waterfall Pond"},
|
||||
{"/src/assets/gallery/japanese_garden_3.jpg", 12, "Bridge of Faith"},
|
||||
{"/src/assets/gallery/japanese_garden_4.jpg", 13, "Little Rocks"},
|
||||
{"/src/assets/gallery/japanese_garden_5.jpg", 14, "Arc over Pond"},
|
||||
{"/src/assets/gallery/japanese_garden_6.jpg", 15, "Beautiful Pond"},
|
||||
}
|
||||
|
||||
var socialItems = []SocialItems {
|
||||
{"https://discord.gg/VTEn4zuh", "Discord", "keyemail", "/src/assets/icons/discord.svg", "5865F2"},
|
||||
{"https://github.com/Keyemail", "GitHub", "Keyemail", "/src/assets/icons/github.svg", "171515"},
|
||||
{"https://steamcommunity.com/id/keyemail/", "Steam", "Keyemail", "/src/assets/icons/steam.svg", "000000"},
|
||||
{"https://open.spotify.com/user/316yuurxrw3zcprxsnrvgamxktp4", "Spotify", "Keyemail", "/src/assets/icons/spotify.svg", "1DB954"},
|
||||
{"https://www.youtube.com/channel/UCCNkKG8XoZCh52vLCbXYy7g", "YouTube", "Keyemail", "/src/assets/icons/youtube.svg", "CD201F"},
|
||||
{"https://www.instagram.com/keyemail1?igsh=OGQ5ZDc2ODk2ZA%3D%3D&utm_source=qr", "Instagram", "keyemail1", "/src/assets/icons/instagram.svg", "C13584"},
|
||||
}
|
||||
|
||||
var videoItems = []VideoItems {
|
||||
{"/src/assets/videos/JP-Installing-Windows-Project.mp4", 1, "JP Installing Windows Project", "This is a guide in japanese where I teach you how to install windows completely. This was made because of a JP Project I had to do.", "/src/assets/video_thumbnails/JP-Installing-Windows-Project.png"},
|
||||
{"/src/assets/videos/orange-cat.mp4", 2, "Orange Cat", "Cute little orange cat that my friend has!! Hes so cute lol.", "/src/assets/video_thumbnails/orange-cat.png"},
|
||||
}
|
||||
|
||||
func renderTemplate(w http.ResponseWriter, tmpl string, data *Index, nav bool) {
|
||||
var templateFiles[]string
|
||||
|
||||
templateFiles = append(templateFiles, "src/pages/" + tmpl + ".tmpl", "src/index.tmpl", "src/components/navbar.tmpl")
|
||||
|
||||
templates, err := template.ParseFiles(templateFiles...)
|
||||
if err != nil {
|
||||
http.Error(w, err.Error(), http.StatusInternalServerError)
|
||||
return
|
||||
}
|
||||
|
||||
data.Nav = nav
|
||||
|
||||
err = templates.ExecuteTemplate(w, "base", data)
|
||||
if err != nil {
|
||||
http.Error(w, err.Error(), http.StatusInternalServerError)
|
||||
}
|
||||
|
||||
log.Println("GET /" + tmpl)
|
||||
}
|
||||
|
||||
func galleryContentHandler(w http.ResponseWriter, req *http.Request) {
|
||||
parts := strings.Split(req.URL.Path, "/")
|
||||
|
||||
if len(parts) == 3 && parts[1] == "gallery" {
|
||||
idStr := parts[2]
|
||||
id, err := strconv.Atoi(idStr)
|
||||
if err != nil || id < 1 || id > len(galleryItems) {
|
||||
renderTemplate(w, "404", data, true)
|
||||
return
|
||||
}
|
||||
|
||||
var item GalleryItems
|
||||
for _, gi := range galleryItems {
|
||||
if gi.ID == id {
|
||||
item = gi
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
*currentData = *data
|
||||
currentData.GalleryPhoto = &item
|
||||
currentData.GalleryItems = nil
|
||||
|
||||
renderTemplate(w, "gallery_content", currentData, true)
|
||||
return
|
||||
}
|
||||
|
||||
renderTemplate(w, "404", data, true)
|
||||
}
|
||||
|
||||
func videoContentHandler(w http.ResponseWriter, req *http.Request) {
|
||||
parts := strings.Split(req.URL.Path, "/")
|
||||
|
||||
if len(parts) == 3 && parts[1] == "videos" {
|
||||
idStr := parts[2]
|
||||
id, err := strconv.Atoi(idStr)
|
||||
if err!= nil || id < 1 || id > len(videoItems) {
|
||||
renderTemplate(w, "404", data, true)
|
||||
return
|
||||
}
|
||||
|
||||
var item VideoItems
|
||||
for _, gi := range videoItems {
|
||||
if gi.ID == id {
|
||||
item = gi
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
*currentData = *data
|
||||
currentData.VideoContent = &item
|
||||
currentData.VideoItems = nil
|
||||
|
||||
renderTemplate(w, "video_content", currentData, true)
|
||||
return
|
||||
}
|
||||
|
||||
renderTemplate(w, "404", data, true)
|
||||
}
|
||||
|
||||
func videoHandler(w http.ResponseWriter, req *http.Request) {
|
||||
renderTemplate(w, "video", data, true)
|
||||
}
|
||||
|
||||
func socialsHandler(w http.ResponseWriter, req *http.Request) {
|
||||
renderTemplate(w, "socials", data, true)
|
||||
}
|
||||
|
||||
func galleryHandler(w http.ResponseWriter, req *http.Request) {
|
||||
renderTemplate(w, "gallery", data, true)
|
||||
}
|
||||
|
||||
func indexHandler(w http.ResponseWriter, req *http.Request) {
|
||||
if req.URL.Path != "/" {
|
||||
renderTemplate(w, "404", data, true)
|
||||
return
|
||||
}
|
||||
|
||||
renderTemplate(w, "home", data, true)
|
||||
}
|
||||
|
||||
func main() {
|
||||
if _, err := os.Stat("src/index.tmpl"); os.IsNotExist(err) {
|
||||
log.Fatal("Template file does not exist:\n", err)
|
||||
}
|
||||
|
||||
fs := http.FileServer(http.Dir("./src"))
|
||||
http.Handle("/src/", http.StripPrefix("/src/", fs))
|
||||
|
||||
port := ":3939"
|
||||
|
||||
http.HandleFunc("/", indexHandler)
|
||||
http.HandleFunc("/socials", socialsHandler)
|
||||
http.HandleFunc("/gallery", galleryHandler)
|
||||
http.HandleFunc("/videos", videoHandler)
|
||||
http.HandleFunc("/gallery/", galleryContentHandler)
|
||||
http.HandleFunc("/videos/", videoContentHandler)
|
||||
|
||||
log.Println("Server running at http://localhost" + port)
|
||||
http.ListenAndServe(port, nil)
|
||||
}
|
11515
package-lock.json
generated
25
package.json
|
@ -1,25 +0,0 @@
|
|||
{
|
||||
"name": "keyemail-dev",
|
||||
"version": "0.1.0",
|
||||
"private": true,
|
||||
"scripts": {
|
||||
"serve": "vue-cli-service serve",
|
||||
"build": "vue-cli-service build",
|
||||
"lint": "vue-cli-service lint"
|
||||
},
|
||||
"dependencies": {
|
||||
"core-js": "^3.8.3",
|
||||
"vue": "^3.2.13",
|
||||
"vue-router": "^4.0.3"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@babel/core": "^7.12.16",
|
||||
"@babel/eslint-parser": "^7.12.16",
|
||||
"@vue/cli-plugin-babel": "~5.0.0",
|
||||
"@vue/cli-plugin-eslint": "~5.0.0",
|
||||
"@vue/cli-plugin-router": "~5.0.0",
|
||||
"@vue/cli-service": "^5.0.8",
|
||||
"eslint": "^7.32.0",
|
||||
"eslint-plugin-vue": "^8.0.3"
|
||||
}
|
||||
}
|
Before Width: | Height: | Size: 3.8 KiB |
|
@ -1,17 +0,0 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||
<meta name="viewport" content="width=device-width,initial-scale=1.0">
|
||||
<link rel="icon" href="<%= BASE_URL %>favicon.png">
|
||||
<title><%= htmlWebpackPlugin.options.title %></title>
|
||||
<script src="https://kit.fontawesome.com/d18ce6e9fb.js" crossorigin="anonymous"></script>
|
||||
</head>
|
||||
<body>
|
||||
<noscript>
|
||||
<strong>We're sorry but <%= htmlWebpackPlugin.options.title %> doesn't work properly without JavaScript enabled. Please enable it to continue.</strong>
|
||||
</noscript>
|
||||
<div id="app"></div>
|
||||
</body>
|
||||
</html>
|
48
src/App.vue
|
@ -1,48 +0,0 @@
|
|||
<template>
|
||||
<navbar></navbar>
|
||||
<RouterView></RouterView>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import navbar from './components/NavBar.vue'
|
||||
|
||||
export default {
|
||||
components: {
|
||||
navbar,
|
||||
},
|
||||
}
|
||||
</script>
|
||||
|
||||
<style>
|
||||
@import url('https://fonts.googleapis.com/css2?family=Rubik:wght@400;500&display=swap');
|
||||
|
||||
:root {
|
||||
--bg-color: #192236;
|
||||
--bg-alt-color: #151d2f;
|
||||
--bg-alt-hover-color: #111726;
|
||||
--fg-color: #fff;
|
||||
--padding: 20px;
|
||||
}
|
||||
|
||||
body {
|
||||
background-color: var(--bg-color)
|
||||
}
|
||||
|
||||
html, body, #app {
|
||||
scroll-behavior: smooth;
|
||||
}
|
||||
|
||||
#app {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
max-width: 1920px;
|
||||
margin: auto;
|
||||
padding: var(--padding);
|
||||
}
|
||||
|
||||
* {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
</style>
|
1
src/assets/badges/golang.svg
Normal file
|
@ -0,0 +1 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 640 512"><path fill="#00add8" d="M400.1 194.8C389.2 197.6 380.2 199.1 371 202.4C363.7 204.3 356.3 206.3 347.8 208.5L347.2 208.6C343 209.8 342.6 209.9 338.7 205.4C334 200.1 330.6 196.7 324.1 193.5C304.4 183.9 285.4 186.7 267.7 198.2C246.5 211.9 235.6 232.2 235.9 257.4C236.2 282.4 253.3 302.9 277.1 306.3C299.1 309.1 316.9 301.7 330.9 285.8C333 283.2 334.9 280.5 337 277.5V277.5L337 277.5C337.8 276.5 338.5 275.4 339.3 274.2H279.2C272.7 274.2 271.1 270.2 273.3 264.9C277.3 255.2 284.8 239 289.2 230.9C290.1 229.1 292.3 225.1 296.1 225.1H397.2C401.7 211.7 409 198.2 418.8 185.4C441.5 155.5 468.1 139.9 506 133.4C537.8 127.8 567.7 130.9 594.9 149.3C619.5 166.1 634.7 188.9 638.8 218.8C644.1 260.9 631.9 295.1 602.1 324.4C582.4 345.3 557.2 358.4 528.2 364.3C522.6 365.3 517.1 365.8 511.7 366.3C508.8 366.5 506 366.8 503.2 367.1C474.9 366.5 449 358.4 427.2 339.7C411.9 326.4 401.3 310.1 396.1 291.2C392.4 298.5 388.1 305.6 382.1 312.3C360.5 341.9 331.2 360.3 294.2 365.2C263.6 369.3 235.3 363.4 210.3 344.7C187.3 327.2 174.2 304.2 170.8 275.5C166.7 241.5 176.7 210.1 197.2 184.2C219.4 155.2 248.7 136.8 284.5 130.3C313.8 124.1 341.8 128.4 367.1 145.6C383.6 156.5 395.4 171.4 403.2 189.5C405.1 192.3 403.8 193.9 400.1 194.8zM48.3 200.4C47.1 200.4 46.7 199.8 47.4 198.8L53.9 190.4C54.5 189.5 56.1 188.9 57.3 188.9H168.6C169.8 188.9 170.1 189.8 169.5 190.7L164.2 198.8C163.6 199.8 162 200.7 161.1 200.7L48.3 200.4zM1.2 229.1C0 229.1-.3 228.4 .3 227.5L6.9 219.1C7.5 218.2 9 217.5 10.3 217.5H152.4C153.6 217.5 154.2 218.5 153.9 219.4L151.4 226.9C151.1 228.1 149.9 228.8 148.6 228.8L1.2 229.1zM75.7 255.9C75.1 256.8 75.4 257.7 76.7 257.7L144.6 258C145.5 258 146.8 257.1 146.8 255.9L147.4 248.4C147.4 247.1 146.8 246.2 145.5 246.2H83.2C82 246.2 80.7 247.1 80.1 248.1L75.7 255.9zM577.2 237.9C577 235.3 576.9 233.1 576.5 230.9C570.9 200.1 542.5 182.6 512.9 189.5C483.9 196 465.2 214.4 458.4 243.7C452.8 268 464.6 292.6 487 302.6C504.2 310.1 521.3 309.2 537.8 300.7C562.4 287.1 575.8 268 577.4 241.2C577.3 240 577.3 238.9 577.2 237.9z"/></svg>
|
After Width: | Height: | Size: 2 KiB |
BIN
src/assets/gallery/bird.jpg
Normal file
After Width: | Height: | Size: 145 KiB |
BIN
src/assets/gallery/japanese_garden_1.jpg
Normal file
After Width: | Height: | Size: 432 KiB |
BIN
src/assets/gallery/japanese_garden_2.jpg
Normal file
After Width: | Height: | Size: 457 KiB |
BIN
src/assets/gallery/japanese_garden_3.jpg
Normal file
After Width: | Height: | Size: 480 KiB |
BIN
src/assets/gallery/japanese_garden_4.jpg
Normal file
After Width: | Height: | Size: 528 KiB |
BIN
src/assets/gallery/japanese_garden_5.jpg
Normal file
After Width: | Height: | Size: 484 KiB |
BIN
src/assets/gallery/japanese_garden_6.jpg
Normal file
After Width: | Height: | Size: 429 KiB |
1
src/assets/icons/arrow-left.svg
Normal file
|
@ -0,0 +1 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><path fill="#ffffff" d="M9.4 233.4c-12.5 12.5-12.5 32.8 0 45.3l160 160c12.5 12.5 32.8 12.5 45.3 0s12.5-32.8 0-45.3L109.2 288 416 288c17.7 0 32-14.3 32-32s-14.3-32-32-32l-306.7 0L214.6 118.6c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0l-160 160z"/></svg>
|
After Width: | Height: | Size: 316 B |
1
src/assets/icons/discord.svg
Normal file
|
@ -0,0 +1 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 640 512"><path fill="#ffffff" d="M524.5 69.8a1.5 1.5 0 0 0 -.8-.7A485.1 485.1 0 0 0 404.1 32a1.8 1.8 0 0 0 -1.9 .9 337.5 337.5 0 0 0 -14.9 30.6 447.8 447.8 0 0 0 -134.4 0 309.5 309.5 0 0 0 -15.1-30.6 1.9 1.9 0 0 0 -1.9-.9A483.7 483.7 0 0 0 116.1 69.1a1.7 1.7 0 0 0 -.8 .7C39.1 183.7 18.2 294.7 28.4 404.4a2 2 0 0 0 .8 1.4A487.7 487.7 0 0 0 176 479.9a1.9 1.9 0 0 0 2.1-.7A348.2 348.2 0 0 0 208.1 430.4a1.9 1.9 0 0 0 -1-2.6 321.2 321.2 0 0 1 -45.9-21.9 1.9 1.9 0 0 1 -.2-3.1c3.1-2.3 6.2-4.7 9.1-7.1a1.8 1.8 0 0 1 1.9-.3c96.2 43.9 200.4 43.9 295.5 0a1.8 1.8 0 0 1 1.9 .2c2.9 2.4 6 4.9 9.1 7.2a1.9 1.9 0 0 1 -.2 3.1 301.4 301.4 0 0 1 -45.9 21.8 1.9 1.9 0 0 0 -1 2.6 391.1 391.1 0 0 0 30 48.8 1.9 1.9 0 0 0 2.1 .7A486 486 0 0 0 610.7 405.7a1.9 1.9 0 0 0 .8-1.4C623.7 277.6 590.9 167.5 524.5 69.8zM222.5 337.6c-29 0-52.8-26.6-52.8-59.2S193.1 219.1 222.5 219.1c29.7 0 53.3 26.8 52.8 59.2C275.3 311 251.9 337.6 222.5 337.6zm195.4 0c-29 0-52.8-26.6-52.8-59.2S388.4 219.1 417.9 219.1c29.7 0 53.3 26.8 52.8 59.2C470.7 311 447.5 337.6 417.9 337.6z"/></svg>
|
After Width: | Height: | Size: 1.1 KiB |
1
src/assets/icons/github.svg
Normal file
|
@ -0,0 +1 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 496 512"><path fill="#ffffff" d="M165.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3 .3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6zm-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5 .3-6.2 2.3zm44.2-1.7c-2.9 .7-4.9 2.6-4.6 4.9 .3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9zM244.8 8C106.1 8 0 113.3 0 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C428.2 457.8 496 362.9 496 252 496 113.3 383.5 8 244.8 8zM97.2 352.9c-1.3 1-1 3.3 .7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1zm-10.8-8.1c-.7 1.3 .3 2.9 2.3 3.9 1.6 1 3.6 .7 4.3-.7 .7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3 .7zm32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3 .7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1zm-11.4-14.7c-1.6 1-1.6 3.6 0 5.9 1.6 2.3 4.3 3.3 5.6 2.3 1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2z"/></svg>
|
After Width: | Height: | Size: 1.4 KiB |
1
src/assets/icons/instagram.svg
Normal file
|
@ -0,0 +1 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><path fill="#ffffff" d="M224.1 141c-63.6 0-114.9 51.3-114.9 114.9s51.3 114.9 114.9 114.9S339 319.5 339 255.9 287.7 141 224.1 141zm0 189.6c-41.1 0-74.7-33.5-74.7-74.7s33.5-74.7 74.7-74.7 74.7 33.5 74.7 74.7-33.6 74.7-74.7 74.7zm146.4-194.3c0 14.9-12 26.8-26.8 26.8-14.9 0-26.8-12-26.8-26.8s12-26.8 26.8-26.8 26.8 12 26.8 26.8zm76.1 27.2c-1.7-35.9-9.9-67.7-36.2-93.9-26.2-26.2-58-34.4-93.9-36.2-37-2.1-147.9-2.1-184.9 0-35.8 1.7-67.6 9.9-93.9 36.1s-34.4 58-36.2 93.9c-2.1 37-2.1 147.9 0 184.9 1.7 35.9 9.9 67.7 36.2 93.9s58 34.4 93.9 36.2c37 2.1 147.9 2.1 184.9 0 35.9-1.7 67.7-9.9 93.9-36.2 26.2-26.2 34.4-58 36.2-93.9 2.1-37 2.1-147.8 0-184.8zM398.8 388c-7.8 19.6-22.9 34.7-42.6 42.6-29.5 11.7-99.5 9-132.1 9s-102.7 2.6-132.1-9c-19.6-7.8-34.7-22.9-42.6-42.6-11.7-29.5-9-99.5-9-132.1s-2.6-102.7 9-132.1c7.8-19.6 22.9-34.7 42.6-42.6 29.5-11.7 99.5-9 132.1-9s102.7-2.6 132.1 9c19.6 7.8 34.7 22.9 42.6 42.6 11.7 29.5 9 99.5 9 132.1s2.7 102.7-9 132.1z"/></svg>
|
After Width: | Height: | Size: 1,018 B |
1
src/assets/icons/spotify.svg
Normal file
|
@ -0,0 +1 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 496 512"><path fill="#ffffff" d="M248 8C111.1 8 0 119.1 0 256s111.1 248 248 248 248-111.1 248-248S384.9 8 248 8zm100.7 364.9c-4.2 0-6.8-1.3-10.7-3.6-62.4-37.6-135-39.2-206.7-24.5-3.9 1-9 2.6-11.9 2.6-9.7 0-15.8-7.7-15.8-15.8 0-10.3 6.1-15.2 13.6-16.8 81.9-18.1 165.6-16.5 237 26.2 6.1 3.9 9.7 7.4 9.7 16.5s-7.1 15.4-15.2 15.4zm26.9-65.6c-5.2 0-8.7-2.3-12.3-4.2-62.5-37-155.7-51.9-238.6-29.4-4.8 1.3-7.4 2.6-11.9 2.6-10.7 0-19.4-8.7-19.4-19.4s5.2-17.8 15.5-20.7c27.8-7.8 56.2-13.6 97.8-13.6 64.9 0 127.6 16.1 177 45.5 8.1 4.8 11.3 11 11.3 19.7-.1 10.8-8.5 19.5-19.4 19.5zm31-76.2c-5.2 0-8.4-1.3-12.9-3.9-71.2-42.5-198.5-52.7-280.9-29.7-3.6 1-8.1 2.6-12.9 2.6-13.2 0-23.3-10.3-23.3-23.6 0-13.6 8.4-21.3 17.4-23.9 35.2-10.3 74.6-15.2 117.5-15.2 73 0 149.5 15.2 205.4 47.8 7.8 4.5 12.9 10.7 12.9 22.6 0 13.6-11 23.3-23.2 23.3z"/></svg>
|
After Width: | Height: | Size: 885 B |
1
src/assets/icons/steam.svg
Normal file
|
@ -0,0 +1 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 496 512"><path fill="#ffffff" d="M496 256c0 137-111.2 248-248.4 248-113.8 0-209.6-76.3-239-180.4l95.2 39.3c6.4 32.1 34.9 56.4 68.9 56.4 39.2 0 71.9-32.4 70.2-73.5l84.5-60.2c52.1 1.3 95.8-40.9 95.8-93.5 0-51.6-42-93.5-93.7-93.5s-93.7 42-93.7 93.5v1.2L176.6 279c-15.5-.9-30.7 3.4-43.5 12.1L0 236.1C10.2 108.4 117.1 8 247.6 8 384.8 8 496 119 496 256zM155.7 384.3l-30.5-12.6a52.8 52.8 0 0 0 27.2 25.8c26.9 11.2 57.8-1.6 69-28.4 5.4-13 5.5-27.3 .1-40.3-5.4-13-15.5-23.2-28.5-28.6-12.9-5.4-26.7-5.2-38.9-.6l31.5 13c19.8 8.2 29.2 30.9 20.9 50.7-8.3 19.9-31 29.2-50.8 21zm173.8-129.9c-34.4 0-62.4-28-62.4-62.3s28-62.3 62.4-62.3 62.4 28 62.4 62.3-27.9 62.3-62.4 62.3zm.1-15.6c25.9 0 46.9-21 46.9-46.8 0-25.9-21-46.8-46.9-46.8s-46.9 21-46.9 46.8c.1 25.8 21.1 46.8 46.9 46.8z"/></svg>
|
After Width: | Height: | Size: 827 B |
1
src/assets/icons/youtube.svg
Normal file
|
@ -0,0 +1 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512"><path fill="#ffffff" d="M549.7 124.1c-6.3-23.7-24.8-42.3-48.3-48.6C458.8 64 288 64 288 64S117.2 64 74.6 75.5c-23.5 6.3-42 24.9-48.3 48.6-11.4 42.9-11.4 132.3-11.4 132.3s0 89.4 11.4 132.3c6.3 23.7 24.8 41.5 48.3 47.8C117.2 448 288 448 288 448s170.8 0 213.4-11.5c23.5-6.3 42-24.2 48.3-47.8 11.4-42.9 11.4-132.3 11.4-132.3s0-89.4-11.4-132.3zm-317.5 213.5V175.2l142.7 81.2-142.7 81.2z"/></svg>
|
After Width: | Height: | Size: 452 B |
BIN
src/assets/main/favicon.ico
Normal file
After Width: | Height: | Size: 128 KiB |
Before Width: | Height: | Size: 1.2 KiB |
Before Width: | Height: | Size: 38 KiB After Width: | Height: | Size: 38 KiB |
Before Width: | Height: | Size: 17 KiB |
BIN
src/assets/video_thumbnails/orange-cat.png
Normal file
After Width: | Height: | Size: 431 KiB |
BIN
src/assets/videos/orange-cat.mp4
Normal file
|
@ -1,184 +0,0 @@
|
|||
<template>
|
||||
<nav>
|
||||
<h1>Keyemail</h1>
|
||||
<ul v-if="!(isMobile() || smallScreen)">
|
||||
<li>
|
||||
<router-link to="/">Home</router-link>
|
||||
</li>
|
||||
<li>
|
||||
<router-link to="/gallery">Gallery</router-link>
|
||||
</li>
|
||||
<li>
|
||||
<router-link to="/socials">Socials</router-link>
|
||||
</li>
|
||||
<li>
|
||||
<router-link to="/videos">Videos</router-link>
|
||||
</li>
|
||||
<li>
|
||||
<a href="https://git.keyemail.dev/explore/">Git</a>
|
||||
</li>
|
||||
</ul>
|
||||
<i class="fa-solid fa-x" @click="mobileUI(); handleResize();" v-else-if="turnOnMobileUI"></i>
|
||||
<i class="fas fa-bars" @click="mobileUI();" v-else></i>
|
||||
</nav>
|
||||
|
||||
<div id="mobileNav" v-if="turnOnMobileUI">
|
||||
<div>
|
||||
<ul>
|
||||
<li>
|
||||
<router-link to="/" @click="mobileUI()">Home</router-link>
|
||||
</li>
|
||||
<li>
|
||||
<router-link to="/gallery" @click="mobileUI()">Gallery</router-link>
|
||||
</li>
|
||||
<li>
|
||||
<router-link to="/socials" @click="mobileUI()">Socials</router-link>
|
||||
</li>
|
||||
<li>
|
||||
<router-link to="/videos" @click="mobileUI()">Videos</router-link>
|
||||
</li>
|
||||
<li>
|
||||
<a href="https://git.keyemail.dev/explore/">Git</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
<template v-else/>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
export default {
|
||||
data(){
|
||||
return {
|
||||
turnOnMobileUI: false,
|
||||
smallScreen: false
|
||||
}
|
||||
},
|
||||
mounted() {
|
||||
window.addEventListener('resize', this.handleResize);
|
||||
this.handleResize();
|
||||
},
|
||||
methods: {
|
||||
mobileUI() {
|
||||
if(this.turnOnMobileUI == false) {
|
||||
this.turnOnMobileUI = true;
|
||||
document.body.style.overflow = 'hidden';
|
||||
document.body.scrollTop = 0;
|
||||
document.documentElement.scrollTop = 0;
|
||||
} else {
|
||||
this.turnOnMobileUI = false;
|
||||
document.body.style.overflow = 'auto';
|
||||
}
|
||||
},
|
||||
isMobile(){
|
||||
return /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent)
|
||||
},
|
||||
handleResize() {
|
||||
if(window.innerWidth < 450) {
|
||||
this.smallScreen = true;
|
||||
} else if(this.turnOnMobileUI === true) {
|
||||
return;
|
||||
} else {
|
||||
this.smallScreen = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
nav {
|
||||
position: relative;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
color: white;
|
||||
font-family: 'Rubik', sans-serif;
|
||||
font-weight: 500;
|
||||
|
||||
h1{
|
||||
width: fit-content;
|
||||
z-index: 10;
|
||||
}
|
||||
|
||||
ul {
|
||||
list-style: none;
|
||||
float: right;
|
||||
}
|
||||
|
||||
ul li{
|
||||
display: inline;
|
||||
cursor: pointer;
|
||||
margin-left: 10px;
|
||||
font-weight: 400;
|
||||
transition: color 0.3s;
|
||||
}
|
||||
|
||||
ul a {
|
||||
text-decoration: none;
|
||||
color: inherit;
|
||||
}
|
||||
|
||||
ul li:hover{
|
||||
color: #8ee8fc;
|
||||
}
|
||||
|
||||
i {
|
||||
float: right;
|
||||
font-size: 35px;
|
||||
cursor: pointer;
|
||||
transition: 0.3s color;
|
||||
z-index: 10;
|
||||
}
|
||||
|
||||
i:hover {
|
||||
color: #74d2f1;
|
||||
}
|
||||
}
|
||||
|
||||
#mobileNav {
|
||||
position: absolute;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
background-color: rgba(0, 0, 0, 0.9);
|
||||
left: 0;
|
||||
top: 0;
|
||||
z-index: 9;
|
||||
|
||||
i {
|
||||
float: right;
|
||||
font-size: 35px;
|
||||
cursor: pointer;
|
||||
transition: 0.3s color;
|
||||
}
|
||||
|
||||
div {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
div li {
|
||||
cursor: pointer;
|
||||
margin-left: 10px;
|
||||
font-weight: 400;
|
||||
transition: color 0.3s;
|
||||
font-size: 40px;
|
||||
text-align: center;
|
||||
font-family: 'Rubik', sans-serif;
|
||||
margin: 10px;
|
||||
}
|
||||
|
||||
div a {
|
||||
color: white;
|
||||
text-decoration: none;
|
||||
transition: 0.3s color;
|
||||
}
|
||||
|
||||
|
||||
div a:hover {
|
||||
color: #74d2f1;
|
||||
}
|
||||
}
|
||||
</style>
|
22
src/components/navbar.tmpl
Normal file
|
@ -0,0 +1,22 @@
|
|||
{{ define "navbar" }}
|
||||
<nav>
|
||||
<h1>Keyemail</h1>
|
||||
<ul>
|
||||
<li>
|
||||
<a href="/">Home</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="/gallery">Gallery</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="/socials">Socials</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="/videos">Videos</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="https://git.keyemail.dev/explore/">Git</a>
|
||||
</li>
|
||||
</ul>
|
||||
</nav>
|
||||
{{ end }}
|
|
@ -1,42 +0,0 @@
|
|||
export default [
|
||||
{
|
||||
name: "2 cats",
|
||||
id: "1",
|
||||
path: "gallery/2_cats.jpg"
|
||||
},
|
||||
{
|
||||
name: "Friends Cat",
|
||||
id: "2",
|
||||
path: "gallery/friend_cat.jpg"
|
||||
},
|
||||
{
|
||||
name: "Miku Poster",
|
||||
id: "3",
|
||||
path: "gallery/miku_poster.jpg"
|
||||
},
|
||||
{
|
||||
name: "Networking",
|
||||
id: "4",
|
||||
path: "gallery/networking.jpg"
|
||||
},
|
||||
{
|
||||
name: "Another Friends Cat",
|
||||
id: "5",
|
||||
path: "gallery/another_friend_cat.jpg"
|
||||
},
|
||||
{
|
||||
name: "PC Stickers",
|
||||
id: "6",
|
||||
path: "gallery/pc_case_stickers.jpg"
|
||||
},
|
||||
{
|
||||
name: "Movie Theater Picture 1",
|
||||
id: "7",
|
||||
path: "gallery/movie_picture_1.jpg"
|
||||
},
|
||||
{
|
||||
name: "Movie Theater Picture 2",
|
||||
id: "8",
|
||||
path: "gallery/movie_picture_2.jpg"
|
||||
}
|
||||
]
|
|
@ -1,9 +0,0 @@
|
|||
export default [
|
||||
{
|
||||
"videoName": "JP Installing Windows Project",
|
||||
"videoDescription": "This is a guide in japanese where I teach you how to install windows completely. This was made because of a JP Project I had to do.",
|
||||
"videoID": "1",
|
||||
"path": "videos/JP-Installing-Windows-Project.mp4",
|
||||
"thumbnail": "video_thumbnails/JP-Installing-Windows-Project.png"
|
||||
}
|
||||
]
|
25
src/index.tmpl
Normal file
|
@ -0,0 +1,25 @@
|
|||
{{ define "base" }}
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
{{ template "head" . }}
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width,initial-scale=1">
|
||||
<meta property="og:title" content="{{ .WebpageTitle }}"/>
|
||||
<meta property="og:type" content="website">
|
||||
<meta property="og:url" content="https://keyemail.dev">
|
||||
<meta property="keywords" content="{{ .WebpageKeywords }}"/>
|
||||
<meta name="theme-color" content="#192236">
|
||||
<title>{{ .WebpageTitle }}</title>
|
||||
<link rel="icon" type="image/x-icon" href="{{ .WebpageIcon }}">
|
||||
<link rel="stylesheet" href="/src/styles/main.css">
|
||||
<script src="https://kit.fontawesome.com/d18ce6e9fb.js" crossorigin="anonymous"></script>
|
||||
</head>
|
||||
<body>
|
||||
{{ if .Nav }}
|
||||
{{ template "navbar" . }}
|
||||
{{ end }}
|
||||
{{ template "body" . }}
|
||||
</body>
|
||||
</html>
|
||||
{{ end }}
|
|
@ -1,5 +0,0 @@
|
|||
import { createApp } from 'vue'
|
||||
import App from './App.vue'
|
||||
import router from './router'
|
||||
|
||||
createApp(App).use(router).mount('#app')
|
15
src/pages/404.tmpl
Normal file
|
@ -0,0 +1,15 @@
|
|||
<head>
|
||||
{{ define "head" }}
|
||||
<link rel="stylesheet" href="/src/styles/404.css">
|
||||
<meta property="description" content="{{ .WebpageDescription }}"/>
|
||||
<meta property="og:description" content="{{ .WebpageDescription }}">
|
||||
{{ end }}
|
||||
</head>
|
||||
<body>
|
||||
{{ define "body" }}
|
||||
<div id="notFound">
|
||||
<h1>404 Page</h1>
|
||||
<p>This page has not been found, <a href="/">click here</a> to return back home.</p>
|
||||
</div>
|
||||
{{ end }}
|
||||
</body>
|
24
src/pages/gallery.tmpl
Normal file
|
@ -0,0 +1,24 @@
|
|||
<head>
|
||||
{{ define "head" }}
|
||||
<link rel="stylesheet" href="/src/styles/gallery.css">
|
||||
<meta property="description" content="{{ .WebpageDescription }}"/>
|
||||
<meta property="og:description" content="{{ .WebpageDescription }}">
|
||||
{{ end }}
|
||||
</head>
|
||||
<body>
|
||||
{{ define "body" }}
|
||||
<div class="galleryBGAlt">
|
||||
<h1>My Gallery!</h1>
|
||||
<ul id="galleryGrid">
|
||||
{{ range .GalleryItems }}
|
||||
<a href="/gallery/{{ .ID }}">
|
||||
<li>
|
||||
<img src="{{ .URL }}" alt="{{ .Title }}"/>
|
||||
<h2>{{ .Title }}</h2>
|
||||
</li>
|
||||
</a>
|
||||
{{ end }}
|
||||
</li>
|
||||
</div>
|
||||
{{ end }}
|
||||
</body>
|
22
src/pages/gallery_content.tmpl
Normal file
|
@ -0,0 +1,22 @@
|
|||
<head>
|
||||
{{ define "head" }}
|
||||
<link rel="stylesheet" href="/src/styles/gallery.css">
|
||||
<meta property="og:image" content="{{ .WebpageURL }}{{ .GalleryPhoto.URL }}"/>
|
||||
<meta name="twitter:card" content="summary_large_image"/>
|
||||
{{ end }}
|
||||
</head>
|
||||
<body>
|
||||
{{ define "body" }}
|
||||
<div id="galleryContent" class="galleryBGAlt">
|
||||
<div>
|
||||
<a href="/gallery">
|
||||
<img src="/src/assets/icons/arrow-left.svg"/>
|
||||
</a>
|
||||
<h1>{{ .GalleryPhoto.Title }}</h1>
|
||||
</div>
|
||||
<a href="{{ .GalleryPhoto.URL }}" target="_blank" id="galleryPhoto">
|
||||
<img src="{{ .GalleryPhoto.URL }}" alt="{{ .GalleryPhoto.Title }}"/>
|
||||
</a>
|
||||
</div>
|
||||
{{ end }}
|
||||
</body>
|
56
src/pages/home.tmpl
Normal file
|
@ -0,0 +1,56 @@
|
|||
<head>
|
||||
{{ define "head" }}
|
||||
<link rel="stylesheet" href="/src/styles/home.css"/>
|
||||
<meta property="description" content="{{ .WebpageDescription }}"/>
|
||||
<meta property="og:description" content="{{ .WebpageDescription }}">
|
||||
{{ end }}
|
||||
</head>
|
||||
<body>
|
||||
{{ define "body" }}
|
||||
<header>
|
||||
<a class="pfp" href="https://www.pixiv.net/en/artworks/118037520">
|
||||
<img src="/src/assets/profile/profile.jpg"/>
|
||||
</a>
|
||||
<div id="name">
|
||||
<h1>Keyemail</h1>
|
||||
<ul>
|
||||
<li>
|
||||
<img src="/src/assets/badges/code.svg" aria-label="CODE"/>
|
||||
<div>Active Developer</div>
|
||||
</li>
|
||||
<li>
|
||||
<img src="/src/assets/badges/html.svg" aria-label="HTML5"/>
|
||||
<div>HTML</div>
|
||||
</li>
|
||||
<li>
|
||||
<img src="/src/assets/badges/css.svg" aria-label="CSS3"/>
|
||||
<div>CSS</div>
|
||||
</li>
|
||||
<li>
|
||||
<img src="/src/assets/badges/js.svg" aria-label="JS"/>
|
||||
<div>Javascript</div>
|
||||
</li>
|
||||
<li>
|
||||
<img src="/src/assets/badges/vue.svg" aria-label="VUE3"/>
|
||||
<div>Vue 3</div>
|
||||
</li>
|
||||
<li>
|
||||
<img src="/src/assets/badges/golang.svg" aria-label="GOLANG"/>
|
||||
<div>Go</div>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</header>
|
||||
|
||||
<div id="intro">
|
||||
<h1>Hi, I'm Keyemail or Patrick.</h1>
|
||||
<p>I specialize in IT and web development-related stuff, but I also love doing a variety of different hobbies such as Flight Simulator, or learning Japanese. I daily run an Arch Linux machine as my main system and support Linux in every way. I'm glad to meet you! </p>
|
||||
</div>
|
||||
|
||||
<i class="fa-solid fa-arrow-down" id="moreArrow" onclick="quack()">
|
||||
<div>Nothing...</div>
|
||||
</i>
|
||||
|
||||
<script src="/src/scripts/home.js"></script>
|
||||
{{ end }}
|
||||
</body>
|
25
src/pages/socials.tmpl
Normal file
|
@ -0,0 +1,25 @@
|
|||
<head>
|
||||
{{ define "head" }}
|
||||
<link rel="stylesheet" href="/src/styles/socials.css">
|
||||
<meta property="description" content="{{ .WebpageDescription }}"/>
|
||||
<meta property="og:description" content="{{ .WebpageDescription }}">
|
||||
{{ end }}
|
||||
</head>
|
||||
<body>
|
||||
{{ define "body" }}
|
||||
<div id="socialBGAlt">
|
||||
<h1>My Socials!</h1>
|
||||
<ul id="socialsGrid">
|
||||
{{ range .SocialItems }}
|
||||
<a href="{{ .URL }}">
|
||||
<li style="background-color: #{{ .Color }}">
|
||||
<h2>{{ .Name }}</h2>
|
||||
<p>{{ .Username }}</p>
|
||||
<img src="{{ .Icon }}">
|
||||
</li>
|
||||
</a>
|
||||
{{ end }}
|
||||
</ul>
|
||||
</div>
|
||||
{{ end }}
|
||||
</body>
|
26
src/pages/video.tmpl
Normal file
|
@ -0,0 +1,26 @@
|
|||
<head>
|
||||
{{ define "head" }}
|
||||
<link rel="stylesheet" href="/src/styles/video.css"/>
|
||||
<meta property="description" content="{{ .WebpageDescription }}"/>
|
||||
<meta property="og:description" content="{{ .WebpageDescription }}">
|
||||
{{ end }}
|
||||
</head>
|
||||
<body>
|
||||
{{ define "body" }}
|
||||
<div id="videosBGAlt">
|
||||
<h1>My Videos</h1>
|
||||
<ul id="videoGrid">
|
||||
{{ range .VideoItems }}
|
||||
<a href="/videos/{{ .ID }}">
|
||||
<li>
|
||||
<img src="{{ .Thumbnail }}" alt="{{ .Title }}"/>
|
||||
<div id="content">
|
||||
<h2>{{ .Title }}</h2>
|
||||
</div>
|
||||
</li>
|
||||
</a>
|
||||
{{ end }}
|
||||
</ul>
|
||||
</div>
|
||||
{{ end }}
|
||||
</body>
|
20
src/pages/video_content.tmpl
Normal file
|
@ -0,0 +1,20 @@
|
|||
<head>
|
||||
{{ define "head" }}
|
||||
<link rel="stylesheet" href="/src/styles/video.css"/>
|
||||
<meta property="og:image" content="{{ .WebpageURL }}{{ .VideoContent.Thumbnail }}"/>
|
||||
<meta name="twitter:card" content="summary_large_image"/>
|
||||
{{ end }}
|
||||
</head>
|
||||
<body>
|
||||
{{ define "body" }}
|
||||
<div id="contentBGAlt">
|
||||
<video controls>
|
||||
<source src="{{ .VideoContent.URL }}" type="video/mp4">
|
||||
</video>
|
||||
<div id="info">
|
||||
<h1>{{ .VideoContent.Title }}</h1>
|
||||
<p>{{ .VideoContent.Description }}</p>
|
||||
</div>
|
||||
</div>
|
||||
{{ end }}
|
||||
</body>
|
|
@ -1,48 +0,0 @@
|
|||
import { createRouter, createWebHistory } from 'vue-router'
|
||||
|
||||
import homeView from '../views/HomePage.vue'
|
||||
import galleryView from '../views/GalleryPage.vue'
|
||||
import socialView from '../views/SocialsPage.vue'
|
||||
import notFoundPage from '../views/404Page.vue'
|
||||
import videoView from '../views/VideoPage.vue'
|
||||
import videosView from '../views/VideosPage.vue'
|
||||
|
||||
const routes = [
|
||||
{
|
||||
path: '/',
|
||||
name: 'home',
|
||||
component: homeView
|
||||
},
|
||||
{
|
||||
path: '/gallery',
|
||||
name: 'gallery',
|
||||
component: galleryView
|
||||
},
|
||||
{
|
||||
path: '/socials',
|
||||
name: 'socials',
|
||||
component: socialView
|
||||
},
|
||||
{
|
||||
path: '/:pathMatch(.*)',
|
||||
name: '404',
|
||||
component: notFoundPage
|
||||
},
|
||||
{
|
||||
path: '/videos',
|
||||
name: 'video',
|
||||
component: videoView
|
||||
},
|
||||
{
|
||||
path: '/videos/:id',
|
||||
name: 'videos',
|
||||
component: videosView
|
||||
}
|
||||
]
|
||||
|
||||
const router = createRouter({
|
||||
history: createWebHistory(process.env.BASE_URL),
|
||||
routes
|
||||
})
|
||||
|
||||
export default router
|
0
src/scripts/gallery.js
Normal file
6
src/scripts/home.js
Normal file
|
@ -0,0 +1,6 @@
|
|||
function quack() {
|
||||
const moreArrow = document.getElementById('moreArrow')
|
||||
|
||||
moreArrow.innerHTML = '🦆';
|
||||
moreArrow.classList.remove('fa-arrow-down');
|
||||
}
|
0
src/scripts/main.js
Normal file
0
src/scripts/video.js
Normal file
26
src/styles/404.css
Normal file
|
@ -0,0 +1,26 @@
|
|||
#notFound {
|
||||
background-color: var(--bg-alt-color);
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
color: white;
|
||||
font-family: 'Rubik', sans-serif;
|
||||
align-items: center;
|
||||
margin-top: 20px;
|
||||
text-align: center;
|
||||
padding: 40px;
|
||||
border-radius: 20px;
|
||||
|
||||
h1 {
|
||||
font-size: 70px;
|
||||
}
|
||||
p {
|
||||
font-size: 30px;
|
||||
}
|
||||
a {
|
||||
color: #ADD8E6;
|
||||
transition: 0.3s color;
|
||||
}
|
||||
a:hover {
|
||||
color: #74d2f1;
|
||||
}
|
||||
}
|
82
src/styles/gallery.css
Normal file
|
@ -0,0 +1,82 @@
|
|||
.galleryBGAlt {
|
||||
margin-top: 20px;
|
||||
background-color: var(--bg-alt-color);
|
||||
color: white;
|
||||
font-family: 'Rubik', sans-serif;
|
||||
padding: 20px;
|
||||
border-radius: 20px;
|
||||
|
||||
h1 {
|
||||
font-weight: 500;
|
||||
font-size: 3.5rem;
|
||||
text-align: center;
|
||||
}
|
||||
}
|
||||
|
||||
#galleryGrid {
|
||||
display: grid;
|
||||
list-style: none;
|
||||
grid-template-columns: repeat(auto-fill, minmax(400px, 1fr));
|
||||
gap: 40px;
|
||||
margin-top: 30px;
|
||||
width: 100%;
|
||||
|
||||
img {
|
||||
width: 100%;
|
||||
height: 550px;
|
||||
border-radius: 15px;
|
||||
object-fit: cover;
|
||||
object-position: center;
|
||||
cursor: pointer;
|
||||
transition: 0.4s filter;
|
||||
}
|
||||
img:hover {
|
||||
filter: brightness(70%);
|
||||
}
|
||||
}
|
||||
|
||||
#galleryContent {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
flex-direction: column;
|
||||
|
||||
div {
|
||||
width: 100%;
|
||||
display: inherit;
|
||||
flex-direction: row;
|
||||
align-items: inherit;
|
||||
justify-content: space-between;
|
||||
|
||||
h1 {
|
||||
font-size: 3rem;
|
||||
width: 100%;
|
||||
text-align: center;
|
||||
margin-right: 30px;
|
||||
}
|
||||
img {
|
||||
height: 30px;
|
||||
width: 30px;
|
||||
user-select: none;
|
||||
pointer-events: none;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#galleryPhoto {
|
||||
margin-top: 20px;
|
||||
|
||||
img{
|
||||
max-height: calc(100vh - 199px);
|
||||
width: auto;
|
||||
max-width: 100%;
|
||||
border-radius: 15px;
|
||||
user-select: none;
|
||||
pointer-events: none;
|
||||
}
|
||||
}
|
||||
|
||||
@media screen and (max-width: 480px) {
|
||||
#galleryGrid {
|
||||
grid-template-columns: repeat(auto-fill, minmax(190px, 1fr));
|
||||
}
|
||||
}
|
181
src/styles/home.css
Normal file
|
@ -0,0 +1,181 @@
|
|||
header {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
margin-top: 20px;
|
||||
background: repeating-linear-gradient(
|
||||
-45deg,
|
||||
#200080,
|
||||
#200080 20px,
|
||||
#090069 20px,
|
||||
#090069 40px
|
||||
);
|
||||
height: 180px;
|
||||
width: 100%;
|
||||
border-radius: 10px;
|
||||
font-family: 'Rubik', sans-serif;
|
||||
|
||||
h1 {
|
||||
color: white;
|
||||
font-size: 3rem;
|
||||
}
|
||||
}
|
||||
|
||||
.pfp {
|
||||
height: 130px !important;
|
||||
width: 130px !important;
|
||||
border: solid;
|
||||
border-width: 4px;
|
||||
border-radius: 50%;
|
||||
border-color: white;
|
||||
overflow: hidden;
|
||||
margin-left: 20px;
|
||||
user-select: none;
|
||||
|
||||
img {
|
||||
width:100%;
|
||||
height:100%;
|
||||
object-fit: cover;
|
||||
background-color: #afb5c8;
|
||||
}
|
||||
}
|
||||
|
||||
#name {
|
||||
margin-left: 20px;
|
||||
div {
|
||||
display: none;
|
||||
top: calc(100% + 5px);
|
||||
left: 50%;
|
||||
pointer-events: none;
|
||||
position: absolute;
|
||||
translate: -50%;
|
||||
z-index: 1;
|
||||
white-space: nowrap;
|
||||
padding: 5px;
|
||||
height: 20px;
|
||||
background-color: #151d2f;
|
||||
color: white;
|
||||
font-family: 'Rubik', sans-serif;
|
||||
box-sizing: content-box;
|
||||
border-radius: 5px;
|
||||
}
|
||||
|
||||
img {
|
||||
pointer-events: none;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
ul {
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
width: fit-content;
|
||||
gap: 5px;
|
||||
user-select: none;
|
||||
}
|
||||
|
||||
li {
|
||||
position: relative;
|
||||
display: inherit;
|
||||
text-decoration: none;
|
||||
background-color: var(--bg-alt-color);
|
||||
height: 30px;
|
||||
width: 30px;
|
||||
padding: 3px;
|
||||
border-radius: 5px;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
li:hover div {
|
||||
display: block;
|
||||
}
|
||||
}
|
||||
|
||||
#intro {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
margin-top: 40px;
|
||||
width: 100%;
|
||||
color: white;
|
||||
font-family: 'Rubik', sans-serif;
|
||||
background-color: var(--bg-alt-color);
|
||||
border-radius: 10px;
|
||||
padding: 20px;
|
||||
text-align: center;
|
||||
box-sizing: border-box;
|
||||
|
||||
h1 {
|
||||
font-size: 3.5rem;
|
||||
font-weight: 500;
|
||||
}
|
||||
|
||||
p {
|
||||
margin-top: 15px;
|
||||
font-size: 1.8rem;
|
||||
font-weight: 400;
|
||||
max-width: 800px;
|
||||
}
|
||||
}
|
||||
|
||||
#moreArrow {
|
||||
position: relative;
|
||||
cursor: pointer;
|
||||
font-size: 40px;
|
||||
color: white;
|
||||
margin: 40px auto;
|
||||
margin-top: 80px;
|
||||
|
||||
div {
|
||||
display: none;
|
||||
align-items: center;
|
||||
top: calc(100% + 5px);
|
||||
left: 50%;
|
||||
pointer-events: none;
|
||||
position: absolute;
|
||||
translate: -50%;
|
||||
z-index: 1;
|
||||
white-space: nowrap;
|
||||
padding: 5px;
|
||||
height: 20px;
|
||||
background-color: #151d2f;
|
||||
color: white;
|
||||
font-family: 'Rubik', sans-serif;
|
||||
font-size: 1rem;
|
||||
font-weight: 200;
|
||||
box-sizing: content-box;
|
||||
border-radius: 5px;
|
||||
}
|
||||
}
|
||||
|
||||
#moreArrow:hover div {
|
||||
display: flex;
|
||||
}
|
||||
|
||||
@media screen and (max-width: 450px){
|
||||
header {
|
||||
flex-direction: column;
|
||||
height: 240px;
|
||||
justify-content: center;
|
||||
}
|
||||
#name {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
margin-left: 0;
|
||||
}
|
||||
|
||||
header h1 {
|
||||
margin-left: 0px;
|
||||
}
|
||||
#intro h1 {
|
||||
font-size: 3rem;
|
||||
}
|
||||
#intro p {
|
||||
font-size: 1.8rem;
|
||||
}
|
||||
.pfp{
|
||||
margin-left: 0px;
|
||||
}
|
||||
}
|
||||
|
95
src/styles/main.css
Normal file
|
@ -0,0 +1,95 @@
|
|||
@import url('https://fonts.googleapis.com/css2?family=Rubik:wght@400;500&display=swap');
|
||||
|
||||
:root {
|
||||
--bg-color: #192236;
|
||||
--bg-alt-color: #151d2f;
|
||||
--bg-alt-hover-color: #111726;
|
||||
--fg-color: #fff;
|
||||
--padding: 20px;
|
||||
}
|
||||
|
||||
body {
|
||||
background-color: var(--bg-color)
|
||||
}
|
||||
|
||||
html, body {
|
||||
scroll-behavior: smooth;
|
||||
}
|
||||
|
||||
body {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
max-width: 1920px;
|
||||
margin: auto;
|
||||
padding: var(--padding);
|
||||
}
|
||||
|
||||
* {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
|
||||
a {
|
||||
color: inherit;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
nav {
|
||||
position: relative;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
color: white;
|
||||
font-family: 'Rubik', sans-serif;
|
||||
font-weight: 500;
|
||||
|
||||
h1 {
|
||||
width: fit-content;
|
||||
z-index: 10;
|
||||
}
|
||||
|
||||
ul {
|
||||
list-style: none;
|
||||
float: right;
|
||||
}
|
||||
|
||||
ul li{
|
||||
display: inline;
|
||||
cursor: pointer;
|
||||
margin-left: 10px;
|
||||
font-weight: 400;
|
||||
transition: color 0.3s;
|
||||
}
|
||||
|
||||
ul a {
|
||||
text-decoration: none;
|
||||
color: inherit;
|
||||
}
|
||||
|
||||
ul li:hover{
|
||||
color: #8ee8fc;
|
||||
}
|
||||
|
||||
i {
|
||||
float: right;
|
||||
font-size: 35px;
|
||||
cursor: pointer;
|
||||
transition: 0.3s color;
|
||||
z-index: 10;
|
||||
}
|
||||
|
||||
i:hover {
|
||||
color: #74d2f1;
|
||||
}
|
||||
}
|
||||
|
||||
@media screen and (max-width: 430px) {
|
||||
nav {
|
||||
justify-content: center;
|
||||
|
||||
h1 {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
}
|
83
src/styles/socials.css
Normal file
|
@ -0,0 +1,83 @@
|
|||
#socialBGAlt {
|
||||
background-color: var(--bg-alt-color);
|
||||
display: flex;
|
||||
align-items: center;
|
||||
margin-top: 20px;
|
||||
flex-direction: column;
|
||||
color: white;
|
||||
font-family: 'Rubik', sans-serif;
|
||||
padding: 20px;
|
||||
border-radius: 20px;
|
||||
|
||||
h1 {
|
||||
margin-bottom: 20px;
|
||||
font-size: 50px;
|
||||
}
|
||||
}
|
||||
|
||||
#socialsGrid {
|
||||
display: grid;
|
||||
grid-template-columns: auto auto auto;
|
||||
align-content: start;
|
||||
grid-gap: 10px;
|
||||
|
||||
li {
|
||||
margin: 5px;
|
||||
width: 275px;
|
||||
height: 170px;
|
||||
border-radius: 20px;
|
||||
padding: 10px;
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
flex-direction: column;
|
||||
border-color: white;
|
||||
box-sizing: border-box;
|
||||
border: 4px solid transparent;
|
||||
transition: 0.4s border;
|
||||
}
|
||||
li:hover {
|
||||
cursor: pointer;
|
||||
border: 4px;
|
||||
border-style: solid;
|
||||
}
|
||||
h2 {
|
||||
font-size: 30px;
|
||||
}
|
||||
img {
|
||||
width: 35px;
|
||||
height: 35px;
|
||||
margin-top: auto;
|
||||
align-self: flex-end;
|
||||
}
|
||||
}
|
||||
|
||||
@media only screen and (max-width: 905px){
|
||||
#socialsGrid{
|
||||
grid-template-columns: auto auto;
|
||||
}
|
||||
}
|
||||
|
||||
@media only screen and (max-width: 615px){
|
||||
#socialsGrid{
|
||||
grid-template-columns: auto;
|
||||
width: 80%;
|
||||
|
||||
li {
|
||||
width: 100%;
|
||||
margin-left: 0px;
|
||||
}
|
||||
}
|
||||
#socials {
|
||||
margin-top: 80px;
|
||||
justify-content: unset;
|
||||
}
|
||||
}
|
||||
|
||||
@media only screen and (max-height: 720px){
|
||||
#socials {
|
||||
display: flex;
|
||||
justify-content: unset;
|
||||
margin-top: 80px;
|
||||
}
|
||||
}
|
||||
|
116
src/styles/video.css
Normal file
|
@ -0,0 +1,116 @@
|
|||
#videosBGAlt {
|
||||
margin-top: 20px;
|
||||
background-color: var(--bg-alt-color);
|
||||
color: white;
|
||||
font-family: 'Rubik', sans-serif;
|
||||
padding: 20px;
|
||||
border-radius: 20px;
|
||||
|
||||
h1 {
|
||||
font-weight: 500;
|
||||
font-size: 3.5rem;
|
||||
text-align: center;
|
||||
}
|
||||
}
|
||||
|
||||
#videoGrid {
|
||||
display: grid;
|
||||
list-style: none;
|
||||
grid-template-columns: repeat(auto-fill, minmax(330px, 1fr));
|
||||
gap: 40px;
|
||||
margin-top: 30px;
|
||||
justify-items: center;
|
||||
|
||||
li {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
flex-direction: column;
|
||||
|
||||
gap: 10px;
|
||||
padding: 10px;
|
||||
border-radius: 10px;
|
||||
width: 350px;
|
||||
cursor: pointer;
|
||||
transition: 0.3s background-color;
|
||||
|
||||
h2 {
|
||||
color: white;
|
||||
font-family: 'Rubik', sans-serif;
|
||||
font-weight: 500;
|
||||
font-size: 1.5rem;
|
||||
text-align: center;
|
||||
}
|
||||
}
|
||||
|
||||
li:hover {
|
||||
background-color: var(--bg-alt-hover-color);
|
||||
}
|
||||
|
||||
img {
|
||||
max-width: 100%;
|
||||
aspect-ratio: 16 / 9;
|
||||
pointer-events: none;
|
||||
user-select: none;
|
||||
}
|
||||
}
|
||||
|
||||
#contentBGAlt {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
margin-top: 20px;
|
||||
background-color: var(--bg-alt-color);
|
||||
color: white;
|
||||
font-family: 'Rubik', sans-serif;
|
||||
padding: 20px;
|
||||
border-radius: 20px;
|
||||
|
||||
video {
|
||||
max-height: calc(100vh - 330px);
|
||||
max-width: calc(100vw - 40px);
|
||||
width: max-content;
|
||||
aspect-ratio: 16 / 9;
|
||||
margin-top: 20px;
|
||||
border-radius: 20px;
|
||||
background-color: black;
|
||||
}
|
||||
}
|
||||
|
||||
#info {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 10px;
|
||||
margin-top: 30px;
|
||||
border-radius: 10px;
|
||||
background-color: var(--bg-alt-color);
|
||||
max-width: 1052px;
|
||||
|
||||
h1 {
|
||||
color: white;
|
||||
font-family: 'Rubik', sans-serif;
|
||||
font-weight: 500;
|
||||
font-size: 2rem;
|
||||
}
|
||||
p {
|
||||
font-family: 'Rubik', sans-serif;
|
||||
font-weight: 200;
|
||||
font-size: 1.3rem;
|
||||
color: white;
|
||||
}
|
||||
}
|
||||
|
||||
@media only screen and (max-width: 779px) {
|
||||
#videoGrid{
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
|
||||
li {
|
||||
width: 100%;
|
||||
}
|
||||
a {
|
||||
max-width: 100%;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -1,38 +0,0 @@
|
|||
<template>
|
||||
<div class="notFound">
|
||||
<h1>404 Page</h1>
|
||||
<p>This page has not been found, <router-link to="/">click here</router-link> to return back home.</p>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<style>
|
||||
.notFound {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
color: white;
|
||||
font-family: 'Rubik', sans-serif;
|
||||
align-items: center;
|
||||
margin-top: 100px;
|
||||
height: 100%;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.notFound h1 {
|
||||
font-size: 70px;
|
||||
padding: 20px;
|
||||
}
|
||||
|
||||
.notFound p {
|
||||
font-size: 30px;
|
||||
}
|
||||
|
||||
.notFound a {
|
||||
text-decoration: none;
|
||||
color: #ADD8E6;
|
||||
transition: 0.3s color;
|
||||
}
|
||||
|
||||
.notFound a:hover {
|
||||
color: #74d2f1;
|
||||
}
|
||||
</style>
|
|
@ -1,76 +0,0 @@
|
|||
<template>
|
||||
<div class="gallery">
|
||||
<h1>Gallery</h1>
|
||||
<div class="galleryGrid">
|
||||
<a v-for="gallery in gallerys" :key="gallery.id" :href="require('@/assets/' + gallery.path)" target="_blank">
|
||||
<img :src="require('@/assets/' + gallery.path)" :title="gallery.name"/>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import galleryData from '../data/gallery.js'
|
||||
|
||||
export default {
|
||||
data(){
|
||||
return {
|
||||
gallerys: galleryData
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
.gallery {
|
||||
color: white;
|
||||
font-family: 'Rubik', sans-serif;
|
||||
margin-top: 60px;
|
||||
}
|
||||
|
||||
.gallery h1 {
|
||||
font-weight: 500;
|
||||
font-size: 3rem;
|
||||
}
|
||||
|
||||
.galleryGrid {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(auto-fit, minmax(350px, 1fr));
|
||||
row-gap: 32px;
|
||||
margin-top: 10px;
|
||||
}
|
||||
|
||||
.galleryGrid a {
|
||||
width: max-content;
|
||||
}
|
||||
|
||||
.galleryGrid img {
|
||||
width: 320px;
|
||||
height: 480px;
|
||||
border-radius: 16px;
|
||||
object-fit: cover;
|
||||
object-position: center;
|
||||
cursor: pointer;
|
||||
border: 4px solid transparent;
|
||||
transition: 0.4s border;
|
||||
}
|
||||
|
||||
.galleryGrid img:hover{
|
||||
border: 4px;
|
||||
border-style: solid;
|
||||
border-color: white;
|
||||
}
|
||||
|
||||
@media only screen and (max-width: 739px) {
|
||||
.gallery {
|
||||
margin: auto;
|
||||
margin-top: 50px;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
}
|
||||
.galleryGrid {
|
||||
width: 330px;
|
||||
}
|
||||
}
|
||||
</style>
|
|
@ -1,223 +0,0 @@
|
|||
<template>
|
||||
<header>
|
||||
<a class="pfp" href="https://www.pixiv.net/en/artworks/118037520">
|
||||
<img src="@/assets/profile.jpg"/>
|
||||
</a>
|
||||
<div id="name">
|
||||
<h1>Keyemail</h1>
|
||||
<ul>
|
||||
<li @mouseover="showActiveBadge = true" @mouseleave="showActiveBadge = false">
|
||||
<img src="@/assets/badges/code.svg" aria-label="CODE"/>
|
||||
<div v-if="showActiveBadge">Active Developer</div>
|
||||
<template v-else/>
|
||||
</li>
|
||||
<li @mouseover="showHTMLBadge = true" @mouseleave="showHTMLBadge = false">
|
||||
<img src="@/assets/badges/html.svg" aria-label="HTML5"/>
|
||||
<div v-if="showHTMLBadge">HTML</div>
|
||||
<template v-else/>
|
||||
</li>
|
||||
<li @mouseover="showCSSBadge = true" @mouseleave="showCSSBadge = false">
|
||||
<img src="@/assets/badges/css.svg" aria-label="CSS3"/>
|
||||
<div v-if="showCSSBadge">CSS</div>
|
||||
<template v-else/>
|
||||
</li>
|
||||
<li @mouseover="showJavascriptBadge = true" @mouseleave="showJavascriptBadge = false">
|
||||
<img src="@/assets/badges/js.svg" aria-label="JS"/>
|
||||
<div v-if="showJavascriptBadge">Javascript</div>
|
||||
<template v-else/>
|
||||
</li>
|
||||
<li @mouseover="showVue3Badge = true" @mouseleave="showVue3Badge = false">
|
||||
<img src="@/assets/badges/vue.svg" aria-label="VUE3"/>
|
||||
<div v-if="showVue3Badge">Vue 3</div>
|
||||
<template v-else/>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</header>
|
||||
<div class="intro">
|
||||
<h1>Hi, I'm Keyemail or Patrick.</h1>
|
||||
<p>I specialize in IT and web development-related stuff, but I also love doing a variety of different hobbies such as Flight Simulator, or learning Japanese. I daily run an Arch Linux machine as my main system and support Linux in every way. I'm glad to meet you! </p>
|
||||
</div>
|
||||
<i class="fa-solid fa-arrow-down morearrow" @click="downArrow()" title="Nothing.."></i>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
export default {
|
||||
data () {
|
||||
return {
|
||||
showActiveBadge: false,
|
||||
showHTMLBadge: false,
|
||||
showCSSBadge: false,
|
||||
showJavascriptBadge: false,
|
||||
showVue3Badge: false
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
downArrow(){
|
||||
if(counter >= 4){
|
||||
var quack = new Audio(require('@/assets/sounds/duck-quack.mp3'));
|
||||
quack.play();
|
||||
alert('You just got quacked!');
|
||||
counter = 0;
|
||||
} else {
|
||||
alert('Nothing to scroll down to, may come useful later though..');
|
||||
counter++;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
var counter = 0;
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
header {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
margin-top: 20px;
|
||||
background: repeating-linear-gradient(
|
||||
-45deg,
|
||||
#200080,
|
||||
#200080 20px,
|
||||
#090069 20px,
|
||||
#090069 40px
|
||||
);
|
||||
height: 180px;
|
||||
width: 100%;
|
||||
border-radius: 10px;
|
||||
font-family: 'Rubik', sans-serif;
|
||||
|
||||
h1 {
|
||||
color: white;
|
||||
font-size: 3rem;
|
||||
}
|
||||
}
|
||||
|
||||
.pfp {
|
||||
height: 130px !important;
|
||||
width: 130px !important;
|
||||
border: solid;
|
||||
border-width: 4px;
|
||||
border-radius: 50%;
|
||||
border-color: white;
|
||||
overflow: hidden;
|
||||
margin-left: 20px;
|
||||
user-select: none;
|
||||
|
||||
img {
|
||||
width:100%;
|
||||
height:100%;
|
||||
object-fit: cover;
|
||||
background-color: #afb5c8;
|
||||
}
|
||||
}
|
||||
|
||||
#name {
|
||||
margin-left: 20px;
|
||||
div {
|
||||
top: calc(100% + 5px);
|
||||
left: 50%;
|
||||
pointer-events: none;
|
||||
position: absolute;
|
||||
translate: -50%;
|
||||
z-index: 1;
|
||||
white-space: nowrap;
|
||||
padding: 5px;
|
||||
height: 20px;
|
||||
background-color: #151d2f;
|
||||
color: white;
|
||||
font-family: 'Rubik', sans-serif;
|
||||
box-sizing: content-box;
|
||||
border-radius: 5px;
|
||||
}
|
||||
|
||||
img {
|
||||
pointer-events: none;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
ul {
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
width: fit-content;
|
||||
gap: 5px;
|
||||
user-select: none;
|
||||
}
|
||||
|
||||
li {
|
||||
position: relative;
|
||||
display: inherit;
|
||||
text-decoration: none;
|
||||
background-color: var(--bg-alt-color);
|
||||
height: 30px;
|
||||
width: 30px;
|
||||
padding: 3px;
|
||||
border-radius: 5px;
|
||||
cursor: pointer;
|
||||
}
|
||||
}
|
||||
|
||||
.intro {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
margin-top: 40px;
|
||||
width: 100%;
|
||||
color: white;
|
||||
font-family: 'Rubik', sans-serif;
|
||||
background-color: var(--bg-alt-color);
|
||||
border-radius: 10px;
|
||||
padding: 20px;
|
||||
text-align: center;
|
||||
box-sizing: border-box;
|
||||
|
||||
h1 {
|
||||
font-size: 3.5rem;
|
||||
font-weight: 500;
|
||||
}
|
||||
|
||||
p {
|
||||
margin-top: 15px;
|
||||
font-size: 1.8rem;
|
||||
font-weight: 400;
|
||||
max-width: 800px;
|
||||
}
|
||||
}
|
||||
|
||||
.morearrow {
|
||||
cursor: pointer;
|
||||
font-size: 40px;
|
||||
color: white;
|
||||
margin: 40px auto;
|
||||
margin-top: 80px;
|
||||
}
|
||||
|
||||
@media screen and (max-width: 450px){
|
||||
header {
|
||||
flex-direction: column;
|
||||
height: 240px;
|
||||
justify-content: center;
|
||||
}
|
||||
#name {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
margin-left: 0;
|
||||
}
|
||||
|
||||
header h1 {
|
||||
margin-left: 0px;
|
||||
}
|
||||
.intro h1 {
|
||||
font-size: 3rem;
|
||||
}
|
||||
.intro p {
|
||||
font-size: 1.8rem;
|
||||
}
|
||||
.pfp{
|
||||
margin-left: 0px;
|
||||
}
|
||||
}
|
||||
</style>
|
|
@ -1,159 +0,0 @@
|
|||
<template>
|
||||
<div class="socials">
|
||||
<h1>My Socials!</h1>
|
||||
<div class="socialsgrid">
|
||||
<div class="discord">
|
||||
<h2>Discord</h2>
|
||||
<p>keyemail</p>
|
||||
<i class="fa-brands fa-discord"></i>
|
||||
</div>
|
||||
<a href="https://github.com/Keyemail" target="_blank">
|
||||
<div class="github">
|
||||
<h2>GitHub</h2>
|
||||
<p>Keyemail</p>
|
||||
<i class="fa-brands fa-github"></i>
|
||||
</div>
|
||||
</a>
|
||||
<a href="https://steamcommunity.com/id/keyemail/" target="_blank">
|
||||
<div class="steam">
|
||||
<h2>Steam</h2>
|
||||
<p>Keyemail</p>
|
||||
<i class="fa-brands fa-steam"></i>
|
||||
</div>
|
||||
</a>
|
||||
<a href="https://open.spotify.com/user/316yuurxrw3zcprxsnrvgamxktp4" target="_blank">
|
||||
<div class="spotify">
|
||||
<h2>Spotify</h2>
|
||||
<p>Keyemail</p>
|
||||
<i class="fa-brands fa-spotify"></i>
|
||||
</div>
|
||||
</a>
|
||||
<a href="https://www.youtube.com/channel/UCCNkKG8XoZCh52vLCbXYy7g" target="_blank">
|
||||
<div class="youtube">
|
||||
<h2>YouTube</h2>
|
||||
<p>Keyemail</p>
|
||||
<i class="fa-brands fa-youtube"></i>
|
||||
</div>
|
||||
</a>
|
||||
<a href="https://www.instagram.com/keyemail1?igsh=OGQ5ZDc2ODk2ZA%3D%3D&utm_source=qr" target="_blank">
|
||||
<div class="instagram">
|
||||
<h2>Instagram</h2>
|
||||
<p>keyemail1</p>
|
||||
<i class="fa-brands fa-instagram"></i>
|
||||
</div>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<style scoped>
|
||||
.socials {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
margin-top: 100px;
|
||||
flex-direction: column;
|
||||
color: white;
|
||||
font-family: 'Rubik', sans-serif;
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
.socials h1 {
|
||||
margin-bottom: 20px;
|
||||
font-size: 50px;
|
||||
}
|
||||
|
||||
.socialsgrid {
|
||||
display: grid;
|
||||
grid-template-columns: auto auto auto;
|
||||
align-content: start;
|
||||
grid-gap: 10px;
|
||||
}
|
||||
|
||||
.socialsgrid a {
|
||||
color: inherit;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
.socialsgrid div{
|
||||
margin: 5px;
|
||||
width: 275px;
|
||||
height: 170px;
|
||||
border-radius: 20px;
|
||||
padding: 10px;
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
flex-direction: column;
|
||||
border-color: white;
|
||||
box-sizing: border-box;
|
||||
border: 4px solid transparent;
|
||||
transition: 0.4s border;
|
||||
}
|
||||
|
||||
.socialsgrid div:hover {
|
||||
cursor: pointer;
|
||||
border: 4px;
|
||||
border-style: solid;
|
||||
}
|
||||
|
||||
.socialsgrid i {
|
||||
font-size: 35px;
|
||||
margin-top: auto;
|
||||
align-self: flex-end;
|
||||
}
|
||||
|
||||
.socialsgrid h2 {
|
||||
font-size: 30px;
|
||||
}
|
||||
.discord {
|
||||
background-color: #5865F2;
|
||||
}
|
||||
|
||||
.github {
|
||||
background-color: #171515;
|
||||
}
|
||||
|
||||
.steam {
|
||||
background-color: #000000;
|
||||
}
|
||||
|
||||
.spotify {
|
||||
background-color: #1DB954;
|
||||
}
|
||||
|
||||
.youtube {
|
||||
background-color: #CD201F;
|
||||
}
|
||||
|
||||
.instagram {
|
||||
background-color: #C13584;
|
||||
}
|
||||
|
||||
@media only screen and (max-width: 905px){
|
||||
.socialsgrid{
|
||||
grid-template-columns: auto auto;
|
||||
}
|
||||
}
|
||||
|
||||
@media only screen and (max-width: 615px){
|
||||
.socialsgrid{
|
||||
grid-template-columns: auto;
|
||||
width: 80%
|
||||
}
|
||||
.socials {
|
||||
margin-top: 80px;
|
||||
justify-content: unset;
|
||||
}
|
||||
.socialsgrid div {
|
||||
width: 100%;
|
||||
margin-left: 0px;
|
||||
}
|
||||
}
|
||||
|
||||
@media only screen and (max-height: 720px){
|
||||
.socials {
|
||||
display: flex;
|
||||
justify-content: unset;
|
||||
margin-top: 80px;
|
||||
}
|
||||
}
|
||||
</style>
|
|
@ -1,95 +0,0 @@
|
|||
<template>
|
||||
<h1>Videos</h1>
|
||||
<ul>
|
||||
<router-link v-for="video in videos" :key="video.videoID" :to="'/videos/' + video.videoID">
|
||||
<li>
|
||||
<img :src="require('@/assets/' + video.thumbnail)" alt="Video Thumbnail"/>
|
||||
<div id="content">
|
||||
<h2>{{ video.videoName }}</h2>
|
||||
</div>
|
||||
</li>
|
||||
</router-link>
|
||||
</ul>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import videoData from '../data/videos.js'
|
||||
|
||||
export default {
|
||||
data () {
|
||||
return {
|
||||
videos: videoData
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
|
||||
h1 {
|
||||
color: white;
|
||||
font-family: 'Rubik', sans-serif;
|
||||
font-weight: 500;
|
||||
font-size: 3rem;
|
||||
margin-top: 20px;
|
||||
}
|
||||
|
||||
a {
|
||||
max-width: fit-content;
|
||||
}
|
||||
|
||||
ul {
|
||||
margin-top: 10px;
|
||||
display: grid;
|
||||
grid-template-columns: repeat(auto-fit, minmax(370px, 1fr));
|
||||
row-gap: 32px;
|
||||
|
||||
li {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
gap: 10px;
|
||||
background-color: var(--bg-alt-color);
|
||||
padding: 10px;
|
||||
border-radius: 10px;
|
||||
width: 370px;
|
||||
cursor: pointer;
|
||||
transition: 0.3s background-color;
|
||||
|
||||
h2 {
|
||||
color: white;
|
||||
font-family: 'Rubik', sans-serif;
|
||||
font-weight: 500;
|
||||
font-size: 1.5rem;
|
||||
text-align: center;
|
||||
}
|
||||
}
|
||||
|
||||
li:hover {
|
||||
background-color: var(--bg-alt-hover-color);
|
||||
}
|
||||
|
||||
img {
|
||||
max-width: 350px;
|
||||
aspect-ratio: 16 / 9;
|
||||
pointer-events: none;
|
||||
user-select: none;
|
||||
}
|
||||
}
|
||||
|
||||
@media only screen and (max-width: 779px) {
|
||||
a {
|
||||
max-width: 100%;
|
||||
}
|
||||
|
||||
ul {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
|
||||
li {
|
||||
width: 100%;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
</style>
|
|
@ -1,69 +0,0 @@
|
|||
<template>
|
||||
<notfound v-if="!(video)"></notfound>
|
||||
|
||||
<template v-else>
|
||||
<video controls>
|
||||
<source :src="require('@/assets/' + video.path)" type="video/mp4">
|
||||
</video>
|
||||
<div id="info">
|
||||
<h1>{{ video.videoName }}</h1>
|
||||
<p>{{ video.videoDescription }}</p>
|
||||
</div>
|
||||
</template>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import videoData from '../data/videos.js'
|
||||
import notfound from '../views/404Page.vue'
|
||||
|
||||
export default {
|
||||
components: {
|
||||
notfound
|
||||
},
|
||||
data () {
|
||||
return {
|
||||
video: null
|
||||
}
|
||||
},
|
||||
created() {
|
||||
let videoID = this.$route.params.id;
|
||||
this.video = videoData.find(v => v.videoID === videoID);
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
video {
|
||||
max-height: calc(100vh - 420px);
|
||||
max-width: calc(100vw - 40px);
|
||||
width: max-content;
|
||||
aspect-ratio: 16 / 9;
|
||||
margin-top: 20px;
|
||||
}
|
||||
|
||||
#info {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 10px;
|
||||
margin-top: 30px;
|
||||
padding: 20px;
|
||||
border-radius: 10px;
|
||||
background-color: var(--bg-alt-color);
|
||||
max-width: 600px;
|
||||
}
|
||||
|
||||
#info h1 {
|
||||
color: white;
|
||||
font-family: 'Rubik', sans-serif;
|
||||
font-weight: 500;
|
||||
font-size: 2rem;
|
||||
}
|
||||
|
||||
#info p {
|
||||
font-family: 'Rubik', sans-serif;
|
||||
font-weight: 200;
|
||||
font-size: 1.3rem;
|
||||
color: white;
|
||||
}
|
||||
|
||||
</style>
|
|
@ -1,16 +0,0 @@
|
|||
const { defineConfig } = require('@vue/cli-service')
|
||||
|
||||
module.exports = defineConfig({
|
||||
transpileDependencies: true
|
||||
})
|
||||
|
||||
module.exports = {
|
||||
chainWebpack: config => {
|
||||
config
|
||||
.plugin('html')
|
||||
.tap(args => {
|
||||
args[0].title = "Keyemail's Profile"
|
||||
return args;
|
||||
})
|
||||
}
|
||||
}
|