Compare commits

..
20 Commits
Author SHA1 Message Date
Nikology 4064853ea7 Update about 2026-09-13 10:52:18 +02:00
Nikology 387361b0a3 Make it a little better for mobile. 2026-09-13 10:42:58 +02:00
Nikology 2c63f1bc3a Format Document and remove redundant style 2026-09-13 10:28:12 +02:00
Nikology a98617b8f0 remove unnecesary style from hero 2026-09-13 10:16:26 +02:00
Nikology 7f863f5b9f add wrangler to gitignore 2026-09-13 10:15:58 +02:00
Nikology 82117c4fb5 Fix bird button naming scheme 2026-09-13 10:15:49 +02:00
Nikology c4a1b1fbbd Fix Hero to header so that when its moved up it doesnt take up space and size logo correctly 2026-09-13 10:15:14 +02:00
Nikology b7c3212fcb Remove gitlab association 2026-09-12 18:32:15 +02:00
Nikology 01ae6a8832 Add stuff to .gitignore 2026-09-12 17:30:21 +02:00
Nikology de0fa7d0ee Add .gitignore 2026-09-12 17:29:21 +02:00
Nikology 36a9e47bcd Add photography.html 2026-04-20 23:22:34 +02:00
Nikology b9af747314 Update error.html 2026-04-20 23:20:09 +02:00
Nikology 28ca13fdea Fix the footer so its like not part of the thing app and can work on its own, STRONG FOOTER FOREVER 2026-04-20 23:16:54 +02:00
Nikology 1d8c130019 Build in Hero to home and animate stuff correctly 2026-04-20 21:31:57 +02:00
Nikology 037f3cf1fc Add SPA navigation 2026-04-20 13:37:12 +02:00
Nikology 1dac91ac38 Remove natural-paper.png 2026-04-20 01:54:46 +02:00
Nikology 6acc03d51a Resize hero header 2026-04-20 01:52:50 +02:00
Nikology 5566991bc8 Add Nav Bar, Temporarily Remove Home Content 2026-04-20 01:48:55 +02:00
Nikology 0fa1699dff Add page source link and footer link hover effects 2026-04-20 01:11:46 +02:00
Nikology 0f65c953ba Changed offset from 10px to 5px 2026-04-19 20:51:28 +02:00
12 changed files with 317 additions and 47 deletions
+46
View File
@@ -0,0 +1,46 @@
### macOS ###
.DS_Store
.AppleDouble
.LSOverride
._*
.DocumentRevisions-V100
.fseventsd
.Spotlight-V100
.Trashes
.TemporaryItems
.VolumeIcon.icns
.com.apple.timemachine.donotpresent
.AppleDB
.AppleDesktop
Network Trash Folder
Temporary Items
.apdisk
### Windows ###
Thumbs.db
ehthumbs.db
Desktop.ini
$RECYCLE.BIN/
*.cab
*.msi
*.msm
*.msp
*.lnk
### Linux ###
*~
.fuse_hidden*
.directory
.Trash-*
.nfs*
### VS Code ###
.vscode/*
!.vscode/settings.json
!.vscode/tasks.json
!.vscode/launch.json
!.vscode/extensions.json
*.code-workspace
## Wrangler ##
.wrangler
-16
View File
@@ -1,16 +0,0 @@
# You can override the included template(s) by including variable overrides
# SAST customization: https://docs.gitlab.com/user/application_security/sast/#available-cicd-variables
# Secret Detection customization: https://docs.gitlab.com/user/application_security/secret_detection/pipeline/configure/
# Dependency Scanning customization: https://docs.gitlab.com/user/application_security/dependency_scanning/dependency_scanning_sbom/#customizing-analyzer-behavior
# Container Scanning customization: https://docs.gitlab.com/user/application_security/container_scanning/#customizing-analyzer-behavior
# Note that environment variables can be set in several places
# See https://docs.gitlab.com/ci/variables/#cicd-variable-precedence
stages:
- test
- secret-detection
variables:
SECRET_DETECTION_ENABLED: 'true'
secret_detection:
stage: secret-detection
include:
- template: Security/Secret-Detection.gitlab-ci.yml
+2
View File
@@ -0,0 +1,2 @@
/pages/* /pages/:splat 404
/* /index.html 200
+1
View File
@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" xml:space="preserve" viewBox="0 0 640 640"><path d="M622.7 149.8c-4.1-4.1-9.6-4-9.6-4s-117.2 6.6-177.9 8c-13.3.3-26.5.6-39.6.7v117.2c-5.5-2.6-11.1-5.3-16.6-7.9 0-36.4-.1-109.2-.1-109.2-29 .4-89.2-2.2-89.2-2.2s-141.4-7.1-156.8-8.5c-9.8-.6-22.5-2.1-39 1.5-8.7 1.8-33.5 7.4-53.8 26.9C-4.9 212.4 6.6 276.2 8 285.8c1.7 11.7 6.9 44.2 31.7 72.5 45.8 56.1 144.4 54.8 144.4 54.8s12.1 28.9 30.6 55.5c25 33.1 50.7 58.9 75.7 62 63 0 188.9-.1 188.9-.1s12 .1 28.3-10.3c14-8.5 26.5-23.4 26.5-23.4S547 483 565 451.5c5.5-9.7 10.1-19.1 14.1-28 0 0 55.2-117.1 55.2-231.1-1.1-34.5-9.6-40.6-11.6-42.6M125.6 353.9c-25.9-8.5-36.9-18.7-36.9-18.7S69.6 321.8 60 295.4c-16.5-44.2-1.4-71.2-1.4-71.2s8.4-22.5 38.5-30c13.8-3.7 31-3.1 31-3.1s7.1 59.4 15.7 94.2c7.2 29.2 24.8 77.7 24.8 77.7s-26.1-3.1-43-9.1m300.3 107.6s-6.1 14.5-19.6 15.4c-5.8.4-10.3-1.2-10.3-1.2s-.3-.1-5.3-2.1l-112.9-55s-10.9-5.7-12.8-15.6c-2.2-8.1 2.7-18.1 2.7-18.1L322 273s4.8-9.7 12.2-13c.6-.3 2.3-1 4.5-1.5 8.1-2.1 18 2.8 18 2.8L467.4 315s12.6 5.7 15.3 16.2c1.9 7.4-.5 14-1.8 17.2-6.3 15.4-55 113.1-55 113.1" style="fill:#3d2f1f"/><path d="M326.8 380.1c-8.2.1-15.4 5.8-17.3 13.8s2 16.3 9.1 20c7.7 4 17.5 1.8 22.7-5.4 5.1-7.1 4.3-16.9-1.8-23.1l24-49.1c1.5.1 3.7.2 6.2-.5 4.1-.9 7.1-3.6 7.1-3.6 4.2 1.8 8.6 3.8 13.2 6.1 4.8 2.4 9.3 4.9 13.4 7.3.9.5 1.8 1.1 2.8 1.9 1.6 1.3 3.4 3.1 4.7 5.5 1.9 5.5-1.9 14.9-1.9 14.9-2.3 7.6-18.4 40.6-18.4 40.6-8.1-.2-15.3 5-17.7 12.5-2.6 8.1 1.1 17.3 8.9 21.3s17.4 1.7 22.5-5.3c5-6.8 4.6-16.3-1.1-22.6 1.9-3.7 3.7-7.4 5.6-11.3 5-10.4 13.5-30.4 13.5-30.4.9-1.7 5.7-10.3 2.7-21.3-2.5-11.4-12.6-16.7-12.6-16.7-12.2-7.9-29.2-15.2-29.2-15.2s0-4.1-1.1-7.1c-1.1-3.1-2.8-5.1-3.9-6.3 4.7-9.7 9.4-19.3 14.1-29-4.1-2-8.1-4-12.2-6.1-4.8 9.8-9.7 19.7-14.5 29.5-6.7-.1-12.9 3.5-16.1 9.4-3.4 6.3-2.7 14.1 1.9 19.8z" style="fill:#3d2f1f"/></svg>

After

Width:  |  Height:  |  Size: 1.8 KiB

+119 -14
View File
@@ -6,6 +6,7 @@
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Lusitana:wght@400;700&display=swap" rel="stylesheet">
<link rel="preload" href="cream-paper.png" as="image">
<link rel="stylesheet" href="styles.css">
<title>nikology.dev</title>
<!-- <link rel="icon" href="birbFavicon.svg" type="image/svg+xml"> -->
@@ -13,25 +14,129 @@
<body>
<div class="ribbon">Work In Progress</div>
<h1>nikology.dev
<!-- <h1>nikology.dev
<span class="bird-wrap">
<button id="birdButton"><img src="birb.svg" alt=""></button>
<svg id="barTemplate" xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 8.47 8.47"><path fill="none" stroke="#3d2f1f" stroke-linecap="round" stroke-linejoin="round" stroke-width="0.8" d="m1.5 4.23.23-.1a6 6 0 0 1 5.01 0l.23.1" style="paint-order:markers stroke fill"/></svg>
</span>
</h1>
<h2>About Me</h2>
<p>Hi there! I am Niki and welcome to my website, I make stuff with computers. My current project is <a href="https://roplus.dev" target="_blank" rel="noopener">roplus.dev</a>!</p>
<h2>Links n Stuff</h2>
</h1> -->
<header>
<div id="hero">
<h1>nikology.dev</h1>
<span class="bird-wrap">
<button id="birdButton"><img src="birb.svg" alt=""></button>
<svg id="barTemplate" xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 8.47 8.47"><path fill="none" stroke="#3d2f1f" stroke-linecap="round" stroke-linejoin="round" stroke-width="0.8" d="m1.5 4.23.23-.1a6 6 0 0 1 5.01 0l.23.1" style="paint-order:markers stroke fill"/></svg>
</span>
</div>
<nav>
<a href="/" data-link>Home</a>
<span>-</span>
<a href="/about" data-link>About</a>
<span>-</span>
<a href="/photography" data-link>Photography</a>
</nav>
</header>
<!-- Nav Bar -->
<div id="app"></div>
<!-- <h2>About Me</h2>
<p>Hi there! I am Niki and welcome to my website, I make stuff with computers. My current project is <a href="https://roplus.dev" target="_blank" rel="noopener">roplus.dev</a>!</p> -->
<!-- <h2>Links n Stuff</h2>
<ul>
<li><a href="https://gitlab.com/Nikology" target="_blank" rel="noopener">GitLab</a></li>
</ul>
</ul> -->
<footer>
<p>Bird recording by Petter Westberg via <a href="https://xeno-canto.org/1087467" target="_blank" rel="noopener">xeno-canto</a>, CC BY-NC-SA 4.0</p>
<p class="birdSoundCredit">Bird recording by Petter Westberg via <a href="https://xeno-canto.org/1087467" target="_blank" rel="noopener">xeno-canto</a>, CC BY-NC-SA 4.0</p>
<p>
<a href="https://gitea.nikology.dev/Nikology/nikology.dev">
Page Source
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 640 640"><path d="M622.7 149.8c-4.1-4.1-9.6-4-9.6-4s-117.2 6.6-177.9 8c-13.3.3-26.5.6-39.6.7v117.2c-5.5-2.6-11.1-5.3-16.6-7.9 0-36.4-.1-109.2-.1-109.2-29 .4-89.2-2.2-89.2-2.2s-141.4-7.1-156.8-8.5c-9.8-.6-22.5-2.1-39 1.5-8.7 1.8-33.5 7.4-53.8 26.9C-4.9 212.4 6.6 276.2 8 285.8c1.7 11.7 6.9 44.2 31.7 72.5 45.8 56.1 144.4 54.8 144.4 54.8s12.1 28.9 30.6 55.5c25 33.1 50.7 58.9 75.7 62 63 0 188.9-.1 188.9-.1s12 .1 28.3-10.3c14-8.5 26.5-23.4 26.5-23.4S547 483 565 451.5c5.5-9.7 10.1-19.1 14.1-28 0 0 55.2-117.1 55.2-231.1-1.1-34.5-9.6-40.6-11.6-42.6M125.6 353.9c-25.9-8.5-36.9-18.7-36.9-18.7S69.6 321.8 60 295.4c-16.5-44.2-1.4-71.2-1.4-71.2s8.4-22.5 38.5-30c13.8-3.7 31-3.1 31-3.1s7.1 59.4 15.7 94.2c7.2 29.2 24.8 77.7 24.8 77.7s-26.1-3.1-43-9.1m300.3 107.6s-6.1 14.5-19.6 15.4c-5.8.4-10.3-1.2-10.3-1.2s-.3-.1-5.3-2.1l-112.9-55s-10.9-5.7-12.8-15.6c-2.2-8.1 2.7-18.1 2.7-18.1L322 273s4.8-9.7 12.2-13c.6-.3 2.3-1 4.5-1.5 8.1-2.1 18 2.8 18 2.8L467.4 315s12.6 5.7 15.3 16.2c1.9 7.4-.5 14-1.8 17.2-6.3 15.4-55 113.1-55 113.1"/><path d="M326.8 380.1c-8.2.1-15.4 5.8-17.3 13.8s2 16.3 9.1 20c7.7 4 17.5 1.8 22.7-5.4 5.1-7.1 4.3-16.9-1.8-23.1l24-49.1c1.5.1 3.7.2 6.2-.5 4.1-.9 7.1-3.6 7.1-3.6 4.2 1.8 8.6 3.8 13.2 6.1 4.8 2.4 9.3 4.9 13.4 7.3.9.5 1.8 1.1 2.8 1.9 1.6 1.3 3.4 3.1 4.7 5.5 1.9 5.5-1.9 14.9-1.9 14.9-2.3 7.6-18.4 40.6-18.4 40.6-8.1-.2-15.3 5-17.7 12.5-2.6 8.1 1.1 17.3 8.9 21.3s17.4 1.7 22.5-5.3c5-6.8 4.6-16.3-1.1-22.6 1.9-3.7 3.7-7.4 5.6-11.3 5-10.4 13.5-30.4 13.5-30.4.9-1.7 5.7-10.3 2.7-21.3-2.5-11.4-12.6-16.7-12.6-16.7-12.2-7.9-29.2-15.2-29.2-15.2s0-4.1-1.1-7.1c-1.1-3.1-2.8-5.1-3.9-6.3 4.7-9.7 9.4-19.3 14.1-29-4.1-2-8.1-4-12.2-6.1-4.8 9.8-9.7 19.7-14.5 29.5-6.7-.1-12.9 3.5-16.1 9.4-3.4 6.3-2.7 14.1 1.9 19.8z"/></svg>
</a>
</p>
</footer>
<!-- Scripts -->
<script>
const cache = new Map();
async function loadApp(file) {
if (!cache.has(file)) {
const res = await fetch(file);
if (!res.ok) {
return { status: res.status, content: null };
}
const text = await res.text();
if (text.includes('id="app"')) {
return { status: 404, content: null};
}
cache.set(file, text);
}
return { status: 200, content: cache.get(file)};
}
async function fetchApp() {
const path = location.pathname;
document.body.classList.toggle('home', path === '/');
const file = `/pages${path === '/' ? '/home' : path}.html`;
document.querySelectorAll('nav a').forEach(a => {
a.classList.toggle('active', a.pathname === location.pathname);
})
return await loadApp(file);
}
async function commit(appFile) {
if (appFile.content !== null) {
document.getElementById('app').innerHTML = appFile.content;
} else {
const errorResult = await loadApp('/pages/error.html');
document.getElementById('app').innerHTML = errorResult.content;
document.getElementById('error-code').textContent = appFile.status;
}
document.body.classList.toggle('homeCommitted' , location.pathname === '/')
}
async function navigate() {
const result = await fetchApp();
await commit(result);
}
document.addEventListener('click', async e => {
const link = e.target.closest('[data-link]');
if (link) {
e.preventDefault();
if (link.pathname === location.pathname) return;
history.pushState(null, '', link.href);
document.body.classList.add('fading');
const fetchedApp = fetchApp();
await new Promise(r => setTimeout(r, 300));
await commit(await fetchedApp);
document.body.classList.remove('fading')
}
});
window.addEventListener('popstate', navigate);
navigate().then(() => {
requestAnimationFrame(() => document.body.classList.add('ready'))
});
// Bird Button
const DISTANCE = 20
const birdIcon = document.getElementById("birdButton");
const birdButton = document.getElementById("birdButton");
const birdSound = new Audio("SnowBuntingSound.ogg");
const template = document.getElementById("barTemplate");
const wrap = document.querySelector(".bird-wrap");
@@ -43,21 +148,21 @@
clone.style.setProperty("--angle", `${angle}deg`);
clone.style.setProperty("--distance", `${-distance}px`);
clone.style.setProperty("--delay", `${delay}s`);
wrap.appendChild(clone);
birdButton.appendChild(clone);
clone.addEventListener("animationend", () => clone.remove());
}
function birdSoundAnim() {
const leftRandom = (Math.random() * 40) + 40
const rightRandom = (Math.random() * 40) + 40
const leftRandom = (Math.random() * 20) + 80
const rightRandom = (Math.random() * 20) + 40
spawnBar(DISTANCE, -leftRandom, 0.2)
spawnBar(DISTANCE, -leftRandom, 0.4)
spawnBar(DISTANCE, rightRandom, 0.6)
spawnBar(DISTANCE, rightRandom, 0.8)
spawnBar(DISTANCE, -rightRandom, 0.6)
spawnBar(DISTANCE, -rightRandom, 0.8)
}
birdIcon.addEventListener("click", (e) => {
birdButton.addEventListener("click", (e) => {
if (!birdSound.paused) return;
birdSound.play();
birdSoundAnim()
BIN
View File
Binary file not shown.

Before

Width:  |  Height:  |  Size: 99 KiB

+2
View File
@@ -0,0 +1,2 @@
<h1>About</h1>
<p>Hi there! I am Niki and welcome to my website. I am a gay guy studying computer science in Denmark. In case you did not know I am in face a furry and my fursona is a <a href="https://en.wikipedia.org/wiki/Snow_bunting" target="_blank" rel="noopener">Snow Bunting</a>. Writing is not really my expertise so I am sorta just dumping stuff here.</p>
+1
View File
@@ -0,0 +1 @@
<h1>Error: <span id="error-code">---</span></h1>
View File
+2
View File
@@ -0,0 +1,2 @@
<h1>Photography</h1>
<p>This is where I will share photos I take, have a look! :3</p>
+7
View File
@@ -0,0 +1,7 @@
{
"cleanUrls": false,
"rewrites": [
{ "source": "/", "destination": "/index.html" },
{ "source": "/!(pages)**", "destination": "/index.html" }
]
}
+136 -16
View File
@@ -9,20 +9,81 @@ body {
margin: 0;
display: flex;
flex-direction: column;
justify-content: center;
align-items: flex-start;
padding: 2rem 20rem 2rem 20rem;
justify-content: flex-start;
padding: clamp(2rem, 8vw, 6rem);
box-sizing: border-box;
position: relative;
}
@media(max-width: 1024px) {
body {
padding: 2rem;
body.ready {
transition: padding-top 0.6s ease;
}
body.ready #hero {
transition: transform 0.6s ease, opacity 0.3s ease;
}
body.home {
padding-top: 45vh;
}
header {
position: relative;
}
#hero {
position: absolute;
bottom: calc(100% + 1rem);
font-size: clamp(1.5rem, 8vw, 4rem);
display: flex;
align-items: baseline;
}
#hero h1 {
margin: 0;
}
body:not(.home) #hero {
opacity: 0;
pointer-events: none;
}
/* App */
#app {
transition: opacity 0.3s;
}
body.fading #app,
body.fading footer {
opacity: 0;
}
/* Nav Bar */
nav {
display: flex;
gap: 1rem;
}
nav a {
color: #3d2f1f99;
text-decoration: none;
transition: color 0.5s, -webkit-text-stroke-width 0.5s;
}
nav a:hover {
color: #3d2f1f;
}
nav a.active {
-webkit-text-stroke-width: 1px;
}
/* Other */
h1 {
font-size: 3rem;
margin-bottom: 1rem;
}
h1 img {
@@ -43,12 +104,50 @@ p {
margin-bottom: 0;
}
/* a {
transition: color 0.5s;
}
a:hover {
color: #3d2f1f;
} */
/* Footer */
footer {
display: flex;
position: fixed;
bottom: 1rem;
left: 1rem;
font-size: 0.8rem;
opacity: 0.4;
gap: 1rem;
transition: opacity 0.3s;
flex-wrap: wrap;
}
footer p {
color: #3d2f1f66;
}
footer a {
color: #3d2f1f66;
transition: color 0.5s;
}
footer a:hover {
color: #3d2f1f;
}
footer svg {
margin-left: 0.25rem;
height: 1.25em;
width: 1.25em;
vertical-align: -0.25rem;
fill: currentColor;
}
body:not(.homeCommitted) .birdSoundCredit {
display: none;
}
/* Corner Ribbon */
@@ -64,19 +163,26 @@ footer {
top: 2rem;
left: -3rem;
width: 12rem;
outline: 2px dashed #faf4e8;
outline-offset: -4px;
}
/* Birdy */
.bird-wrap {
position: relative;
padding-left: 1rem;
height: 2em;
width: auto;
}
.bar {
opacity: 0;
position: absolute;
top: 0;
left: 10px;
top: 15px;
left: 20px;
/* Offset */
animation: pop 0.8s ease-out var(--delay);
pointer-events: none;
}
@@ -86,15 +192,29 @@ footer {
}
@keyframes pop {
0% {opacity: 0; transform: rotate(var(--angle)) translateY(var(--distance))}
50% {opacity: 1; }
100% {opacity: 0; transform: rotate(var(--angle)) translateY(calc(var(--distance) - 40px));}
0% {
opacity: 0;
transform: rotate(var(--angle)) translateY(var(--distance))
}
50% {
opacity: 1;
}
100% {
opacity: 0;
transform: rotate(var(--angle)) translateY(calc(var(--distance) - 40px));
}
}
#birdButton {
font-size: inherit;
background: none;
border: none;
padding: 0;
height: 100%;
border: none;
background: none;
cursor: pointer;
}
#birdButton img {
height: 100%;
}