Compare commits

...

11 Commits

Author SHA1 Message Date
Cutieguwu
689354fc7b Begin site v2 and split SCSS into more manageable chunks. 2025-07-21 13:32:24 -04:00
Cutieguwu
2bd92e6fdc Create balloon.py 2025-07-21 13:31:22 -04:00
Cutieguwu
ee8b173ac4 Create colour_theme.svg 2025-07-21 13:31:18 -04:00
Cutieguwu
a85dbb4474 Create balloon.py 2025-07-21 13:31:07 -04:00
Cutieguwu
e8497d7e28 Begin migration to SCSS. 2025-07-21 13:30:40 -04:00
Cutieguwu
4bb634f920 Delete test-favicon.jpg 2025-07-21 13:29:57 -04:00
Cutieguwu
799da71198 Delete background.png 2025-07-21 13:29:54 -04:00
Cutieguwu
c8e7889d34 Update LICENSE 2025-07-21 13:29:30 -04:00
Cutieguwu
c79d6cd075 Prep stuff for balloon preprocessor. 2025-07-18 18:02:13 -04:00
Cutieguwu
de5289bcab Update index.html 2025-07-14 11:53:16 -04:00
Cutieguwu
aab6e59287 Create robots.txt 2025-07-13 20:08:13 -04:00
37 changed files with 973 additions and 328 deletions

2
.gitignore vendored
View File

@@ -1 +1 @@
**/target

View File

@@ -1,6 +1,6 @@
MIT License
Copyright (c) 2025 Olivia Bridie Alexandria Millicent Ivette Brooks
Copyright (c) 2025 Olivia Brooks
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

View File

@@ -1,87 +0,0 @@
<!doctype html>
<html lang="en-ca">
<head>
<meta charset="utf-8" />
<title>Acknowledgements | Cutieguwu</title>
<link rel="icon" type="image/x-icon" href="img/test-favicon.jpg" />
<link rel="stylesheet" type="text/css" href="style.css" />
<meta name="description" content="Cutieguwu's Official website" />
<meta
name="viewport"
content="width=device-width, height=device-height, initial-scale=1.0"
/>
<meta name="keywords" content="cutieguwu" />
</head>
<body class="viewport">
<nav class="nav_pane">
<h2 class="nav_logo">Cutieguwu</h2>
<ul class="nav_menu">
<li class="nav_body"><a class="nav_title" href="">Home</a></li>
<li class="nav_body">
<a class="nav_title" href="#">About</a>
</li>
<li class="dropdown">
<div class="dropdown_header nav_body">
<p class="nav_title" href="#">Minecraft</p>
<ion-icon name="chevron-forward-outline"></ion-icon>
</div>
<div class="dropdown_body">
<a class="nav_title" href="#">Bearock SMP</a>
<a class="nav_title" href="#">Rebirth SMP</a>
</div>
</li>
<li class="dropdown">
<div class="dropdown_header nav_body">
<p class="nav_title">Links</p>
<ion-icon name="chevron-forward-outline"></ion-icon>
</div>
<div class="dropdown_body">
<a class="nav_title" href="https://gitea.cutieguwu.ca">Gitea</a>
<a class="nav_title" href="https://jellyfin.cutieguwu.ca">Jellyfin</a>
<a class="nav_title" href="https://nextcloud.cutieguwu.ca">Nextcloud</a>
<a class="nav_title" href="https://play.cutieguwu.ca">Rebirth</a>
<a class="nav_title" href="https://zotero.cutieguwu.ca">Zotero</a>
</div>
</li>
<li class="dropdown">
<div class="dropdown_header nav_body">
<a class="nav_title" href="https://pronouns.page/@Cutieguwu"
>Pronoun Pages</a
>
<ion-icon name="chevron-forward-outline"></ion-icon>
</div>
<div class="dropdown_body">
<a class="nav_title" href="https://en.pronouns.page/@Cutieguwu">English</a>
<a class="nav_title" href="https://pronoms.fr/@Cutieguwu">French</a>
</div>
</li>
<li class="nav_body">
<a class="nav_title" href="#">Other</a>
</li>
<li class="nav_body">
<a class="nav_title" href="#">Other 2</a>
</li>
<li class="nav_body">
<a class="nav_title" href="#">Super long titled</a>
</li>
</ul>
</nav>
<div class="main_pane">
<p>There are currently no acknowledgements</p>
<p>In terms of security, hopefully that means I'm doing a good-ish job.</p>
<p>
I will get my thanks to various open projects in here in time, but I'm still busy
getting the basics handled.
</p>
</div>
<script
type="module"
src="https://unpkg.com/ionicons@7.1.0/dist/ionicons/ionicons.esm.js"
></script>
<script nomodule src="https://unpkg.com/ionicons@7.1.0/dist/ionicons/ionicons.js"></script>
</body>
</html>

107
balloon.py Normal file
View File

@@ -0,0 +1,107 @@
from __future__ import annotations
from dataclasses import dataclass
from types import NoneType
from typing import Optional
from result import Result, Ok, Err
from icecream import ic
import os
from typing import TYPE_CHECKING
if TYPE_CHECKING:
from _typeshed import StrPath
WORK_DIR: StrPath = os.getcwd()
@dataclass
class Tag:
value: str
trail: Optional[str]
def __post_init__(self) -> None:
self.trail = self.trail if (self.trail is not None) and (self.trail.strip() != '') else None
# Returns the type of tag.
def type(self) -> str:
type = str()
for c in self.value:
if c.isspace():
break
type += c
return type
def get_param(self, param: str) -> Optional[str]:
pos = self.value.find(param) + param.__len__() + len('="')
if pos == -1:
return None
param_value = str()
for idx in range(pos, (self.value.__len__() - param.__len__())):
param_value += self.value[idx]
return param_value
def write(self) -> str:
return f'<{self.value}>{self.trail if self.trail != None else ''}'
@dataclass
class HTML:
value: str
# Returns all tags in order in the html file.
def tags(self) -> list[Tag]:
tag = str()
trail: Optional[str] = str()
tags = list()
record = False
for c in self.value:
if c == '<' and tag != '':
tags.append(Tag(tag, trail))
tag = str()
trail = str()
if c == '<' or c == '>':
record = not record # why can't I have ! operator...
elif record == True:
tag += c
else:
trail += c
tags.append(Tag(tag, trail))
return tags
def inflate(self) -> Result[str, str]:
file = str()
for tag in self.tags():
if tag.type() == 'include':
chunk = tag.get_param('src')
if isinstance(chunk, NoneType):
return Err('FileNotFoundError')
html = HTML(open(str(WORK_DIR) + '/src/' + chunk, 'rt').read())
file += html.inflate().expect('FileNotFoundError')
else:
file += tag.write()
return Ok(file)
# Convert the HTML obj into a str to write to file.
def write(self) -> str:
return self.inflate().unwrap()
def main() -> None:
with open(str(WORK_DIR) + '/src/index.html', 'rt') as f:
html_src = HTML(f.read())
with open(str(WORK_DIR) + '/target/index.html', 'w') as f:
f.write(html_src.write())
if __name__ == '__main__':
main()

275
colour_theme.svg Normal file
View File

@@ -0,0 +1,275 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="335mm"
height="225mm"
viewBox="0 0 335 225"
version="1.1"
id="svg1"
inkscape:version="1.4.2 (ebf0e940d0, 2025-05-08)"
sodipodi:docname="colour_theme.svg"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<sodipodi:namedview
id="namedview1"
pagecolor="#505050"
bordercolor="#ffffff"
borderopacity="1"
inkscape:showpageshadow="0"
inkscape:pageopacity="0"
inkscape:pagecheckerboard="1"
inkscape:deskcolor="#505050"
inkscape:document-units="mm"
inkscape:zoom="0.7046647"
inkscape:cx="603.12373"
inkscape:cy="523.65331"
inkscape:window-width="1920"
inkscape:window-height="1042"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="layer1" />
<defs
id="defs1" />
<g
inkscape:groupmode="layer"
id="layer2"
inkscape:label="Background Layer"
style="fill:#ffffff;fill-opacity:1">
<rect
style="fill:#353535;fill-opacity:1;stroke-width:0.290862"
id="rect1"
width="225"
height="335"
x="-280"
y="-55"
transform="rotate(-90,-2.9791666e-7,-55.000001)"
inkscape:label="bg" />
</g>
<g
inkscape:label="Foreground Layer"
inkscape:groupmode="layer"
id="layer1"
style="fill:#ffffff;fill-opacity:1"
transform="translate(55.000001,-55.000001)">
<rect
style="fill:#f5f5f5;fill-opacity:1;stroke-width:0.246609;stroke:none;stroke-opacity:1"
id="rect2-0-2"
width="50"
height="50"
x="-275"
y="170"
transform="rotate(-90)"
inkscape:label="white-3" />
<rect
style="fill:#e5e5e5;fill-opacity:1;stroke-width:0.246609;stroke:#000000;stroke-opacity:1"
id="rect3-9-3"
width="50"
height="50"
x="-220"
y="170"
transform="rotate(-90)"
inkscape:label="white-2" />
<rect
style="fill:#d9d9d9;fill-opacity:1;stroke-width:0.246609;stroke:#000000;stroke-opacity:1"
id="rect4-3-6"
width="50"
height="50"
x="-165"
y="170"
transform="rotate(-90)"
inkscape:label="white-1" />
<rect
style="fill:#944db6;fill-opacity:1;display:inline;stroke:#000000;stroke-width:0.246609;stroke-opacity:1"
id="rect2"
width="50"
height="50"
x="-110"
y="225"
transform="rotate(-90)"
inkscape:label="highlight-hover" />
<rect
style="fill:#bfbfbf;fill-opacity:1;stroke-width:0.247;stroke-dasharray:none;stroke:#000000;stroke-opacity:1"
id="rect5-6-1"
width="50"
height="50"
x="-110"
y="170"
transform="rotate(-90)"
inkscape:label="white-0" />
<rect
style="fill:#272727;fill-opacity:1;stroke-width:0.246609"
id="rect3-5-6"
width="50"
height="50"
x="-220"
y="115"
transform="rotate(-90)"
inkscape:label="block-2" />
<rect
style="fill:#1a1a1a;fill-opacity:1;stroke-width:0.246609"
id="rect4-6-2"
width="50"
height="50"
x="-165"
y="115"
transform="rotate(-90)"
inkscape:label="block-1" />
<rect
style="fill:#0d0d0d;fill-opacity:1;stroke-width:0.246609"
id="rect5-2-6"
width="50"
height="50"
x="-110"
y="115"
transform="rotate(-90)"
inkscape:label="block-0" />
<rect
style="fill:#2a223e;fill-opacity:1;display:inline;stroke:none;stroke-width:0.246609;stroke-opacity:1"
id="rect2-3-0"
width="50"
height="50"
x="-275"
y="115"
transform="rotate(-90)"
inkscape:label="background-4" />
<rect
style="fill:#211635;fill-opacity:1;stroke-width:0.246609"
id="rect3-9"
width="50"
height="50"
x="-275"
y="60"
transform="rotate(-90)"
inkscape:label="background-3" />
<rect
style="fill:#231833;fill-opacity:1;stroke-width:0.246609"
id="rect4-3"
width="50"
height="50"
x="-220"
y="60"
transform="rotate(-90)"
inkscape:label="background-2" />
<rect
style="fill:#170d28;fill-opacity:1;stroke-width:0.247;stroke-dasharray:none"
id="rect5-6"
width="50"
height="50"
x="-165"
y="60"
transform="rotate(-90)"
inkscape:label="background-1" />
<rect
style="fill:#130b21;fill-opacity:1;stroke:#000000;stroke-width:0.246609;stroke-opacity:1"
id="rect2-0"
width="50"
height="50"
x="-110"
y="60"
transform="rotate(-90)"
inkscape:label="background-0" />
<rect
style="display:inline;fill:#aa7ab7;fill-opacity:1;stroke:#000000;stroke-width:0.246609;stroke-opacity:1"
id="rect4"
width="50"
height="50"
x="-275"
y="-50"
transform="rotate(-90)"
inkscape:label="accent-purple" />
<rect
style="fill:#868ab7;fill-opacity:1;display:inline;stroke:#000000;stroke-width:0.246609;stroke-opacity:1"
id="rect3"
width="50"
height="50"
x="-220"
y="-50"
transform="rotate(-90)"
inkscape:label="accent-blue" />
<rect
style="fill:#ff9f9f;fill-opacity:1;stroke-width:0.246609"
id="rect5-2"
width="50"
height="50"
x="-165"
y="-50"
transform="rotate(-90)"
inkscape:label="accent-pink" />
<rect
style="fill:#cfeb9e;fill-opacity:1;stroke-width:0.246609"
id="rect5"
width="50"
height="50"
x="-110"
y="-50"
transform="rotate(-90)"
inkscape:label="accent-green" />
<rect
style="display:none;fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:0.246609;stroke-opacity:1"
id="rect4-6-2-9"
width="50"
height="50"
x="-165"
y="225"
transform="rotate(-90)"
inkscape:label="unused" />
<rect
style="display:none;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.246609;stroke-opacity:1"
id="rect4-6"
width="50"
height="50"
x="-110"
y="5"
transform="rotate(-90)"
inkscape:label="unused" />
<rect
style="display:none;fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:0.246609;stroke-opacity:1"
id="rect2-3"
width="50"
height="50"
x="-275"
y="5"
transform="rotate(-90)"
inkscape:label="unused" />
<rect
style="display:none;fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:0.246609;stroke-opacity:1"
id="rect3-5"
width="50"
height="50"
x="-220"
y="5"
transform="rotate(-90)"
inkscape:label="unused" />
<rect
style="display:none;fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:0.246609;stroke-opacity:1"
id="rect2-3-0-7"
width="50"
height="50"
x="-275"
y="225"
transform="rotate(-90)"
inkscape:label="unused" />
<rect
style="display:none;fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:0.246609;stroke-opacity:1"
id="rect3-5-6-5"
width="50"
height="50"
x="-220"
y="225"
transform="rotate(-90)"
inkscape:label="unused" />
<rect
style="display:none;fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:0.246609;stroke-opacity:1"
id="rect5-2-6-2"
width="50"
height="50"
x="-165"
y="5"
transform="rotate(-90)"
inkscape:label="unused" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 7.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.2 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 10 KiB

View File

@@ -1,82 +0,0 @@
<!doctype html>
<html lang="en-ca">
<head>
<meta charset="utf-8" />
<title>Home | Cutieguwu</title>
<link rel="icon" type="image/x-icon" href="img/test-favicon.jpg" />
<link rel="stylesheet" type="text/css" href="style.css" />
<meta name="description" content="Cutieguwu's Official website" />
<meta
name="viewport"
content="width=device-width, height=device-height, initial-scale=1.0"
/>
<meta name="keywords" content="cutieguwu" />
</head>
<body class="viewport">
<nav class="nav_pane">
<h2 class="nav_logo">Cutieguwu</h2>
<ul class="nav_menu">
<li class="nav_body"><a class="nav_title" href="">Home</a></li>
<li class="nav_body">
<a class="nav_title" href="#">About</a>
</li>
<li class="dropdown">
<div class="dropdown_header nav_body">
<p class="nav_title" href="#">Minecraft</p>
<ion-icon name="chevron-forward-outline"></ion-icon>
</div>
<div class="dropdown_body">
<a class="nav_title" href="#">Bearock SMP</a>
<a class="nav_title" href="#">Rebirth SMP</a>
</div>
</li>
<li class="dropdown">
<div class="dropdown_header nav_body">
<p class="nav_title">Links</p>
<ion-icon name="chevron-forward-outline"></ion-icon>
</div>
<div class="dropdown_body">
<a class="nav_title" href="https://gitea.cutieguwu.ca">Gitea</a>
<a class="nav_title" href="https://jellyfin.cutieguwu.ca">Jellyfin</a>
<a class="nav_title" href="https://nextcloud.cutieguwu.ca">Nextcloud</a>
<a class="nav_title" href="https://play.cutieguwu.ca">Rebirth</a>
<a class="nav_title" href="https://zotero.cutieguwu.ca">Zotero</a>
</div>
</li>
<li class="dropdown">
<div class="dropdown_header nav_body">
<a class="nav_title" href="https://pronouns.page/@Cutieguwu"
>Pronoun Pages</a
>
<ion-icon name="chevron-forward-outline"></ion-icon>
</div>
<div class="dropdown_body">
<a class="nav_title" href="https://en.pronouns.page/@Cutieguwu">English</a>
<a class="nav_title" href="https://pronoms.fr/@Cutieguwu">French</a>
</div>
</li>
<li class="nav_body">
<a class="nav_title" href="#">Other</a>
</li>
<li class="nav_body">
<a class="nav_title" href="#">Other 2</a>
</li>
<li class="nav_body">
<a class="nav_title" href="#">Super long titled</a>
</li>
</ul>
</nav>
<div class="main_pane">
<p>lorem ipsum etc idk what else there is in this latin phrase</p>
</div>
<script
type="module"
src="https://unpkg.com/ionicons@7.1.0/dist/ionicons/ionicons.esm.js"
></script>
<script nomodule src="https://unpkg.com/ionicons@7.1.0/dist/ionicons/ionicons.js"></script>
</body>
</html>

20
src/acknowledgements.html Normal file
View File

@@ -0,0 +1,20 @@
<!doctype html>
<html lang="en-ca">
<head>
<title>Acknowledgements | Cutieguwu</title>
<include src="includes/meta.html" />
</head>
<body class="viewport">
<include src="includes/nav.html" />
<div class="main_pane">
<p>There are currently no acknowledgements</p>
<p>In terms of security, hopefully that means I'm doing a good-ish job.</p>
<p>
I will get my thanks to various open projects in here in time, but I'm still busy
getting the basics handled.
</p>
</div>
<include src="includes/scripts.html" />
</body>
</html>

107
src/balloon.py Normal file
View File

@@ -0,0 +1,107 @@
from __future__ import annotations
from dataclasses import dataclass
from types import NoneType
from typing import Optional
from result import Result, Ok, Err
from icecream import ic
import os
from typing import TYPE_CHECKING
if TYPE_CHECKING:
from _typeshed import StrPath
WORK_DIR: StrPath = os.getcwd()
@dataclass
class Tag:
value: str
trail: Optional[str]
def __post_init__(self) -> None:
self.trail = self.trail if (self.trail is not None) and (self.trail.strip() != '') else None
# Returns the type of tag.
def type(self) -> str:
type = str()
for c in self.value:
if c.isspace():
break
type += c
return type
def get_param(self, param: str) -> Optional[str]:
pos = self.value.find(param) + param.__len__() + len('="')
if pos == -1:
return None
param_value = str()
for idx in range(pos, (self.value.__len__() - param.__len__())):
param_value += self.value[idx]
return param_value
def write(self) -> str:
return f'<{self.value}>{self.trail if self.trail != None else ''}'
@dataclass
class HTML:
value: str
# Returns all tags in order in the html file.
def tags(self) -> list[Tag]:
tag = str()
trail: Optional[str] = str()
tags = list()
record = False
for c in self.value:
if c == '<' and tag != '':
tags.append(Tag(tag, trail))
tag = str()
trail = str()
if c == '<' or c == '>':
record = not record # why can't I have ! operator...
elif record == True:
tag += c
else:
trail += c
tags.append(Tag(tag, trail))
return tags
def inflate(self) -> Result[str, str]:
file = str()
for tag in self.tags():
if tag.type() == 'include':
chunk = tag.get_param('src')
if isinstance(chunk, NoneType):
return Err('FileNotFoundError')
html = HTML(open(str(WORK_DIR) + '/src/' + chunk, 'rt').read())
file += html.inflate().expect('FileNotFoundError')
else:
file += tag.write()
return Ok(file)
# Convert the HTML obj into a str to write to file.
def write(self) -> str:
return self.inflate().unwrap()
def main() -> None:
with open(str(WORK_DIR) + '/src/index.html', 'rt') as f:
html_src = HTML(f.read())
with open(str(WORK_DIR) + '/target/index.html', 'w') as f:
f.write(html_src.write())
if __name__ == '__main__':
main()

11
src/includes/meta.html Normal file
View File

@@ -0,0 +1,11 @@
<meta charset="utf-8" />
<meta name="description" content="Cutieguwu's Official website" />
<meta
name="viewport"
content="width=device-width, height=device-height, initial-scale=1.0"
/>
<meta name="keywords" content="cutieguwu" />
<link rel="icon" type="image/x-icon" href="img/test-favicon.jpg" />
<link rel="stylesheet" type="text/css" href="style.css" />

View File

@@ -0,0 +1 @@
<h2 class="nav_logo">Cutieguwu</h2>

View File

@@ -0,0 +1,78 @@
<ul class="nav_menu">
<!-- Home -->
<li class="nav_body"><a class="nav_title" href="#">Home</a></li>
<!-- Minecraft -->
<li class="dropdown">
<div class="dropdown_header nav_body">
<p class="nav_title" href="#">Minecraft</p>
<ion-icon name="chevron-forward-outline"></ion-icon>
</div>
<div class="dropdown_body">
<a class="nav_title" href="#">Bearock SMP</a>
<a class="nav_title" href="#">Rebirth SMP</a>
</div>
</li>
<hr />
<!-- About -->
<li class="nav_body"><a class="nav_title" href="#">About</a></li>
<!-- Pronoun Pages -->
<li class="dropdown">
<div class="dropdown_header nav_body">
<a class="nav_title" href="https://pronouns.page/@Cutieguwu">Pronoun Pages</a>
<ion-icon name="chevron-forward-outline"></ion-icon>
</div>
<div class="dropdown_body">
<a class="nav_title" href="https://en.pronouns.page/@Cutieguwu">English</a>
<a class="nav_title" href="https://pronoms.fr/@Cutieguwu">French</a>
</div>
</li>
<!-- External Links -->
<li class="dropdown">
<div class="dropdown_header nav_body">
<p class="nav_title">External Links</p>
<ion-icon name="chevron-forward-outline"></ion-icon>
</div>
<div class="dropdown_body">
<a class="nav_title" href="https://github.com/Cutieguwu">Github</a>
<a class="nav_title" href="https://www.twitch.tv/cutieguwu">Twitch</a>
</div>
</li>
<hr />
<!-- Public Services -->
<li class="dropdown">
<div class="dropdown_header nav_body">
<p class="nav_title">Public Services</p>
<ion-icon name="chevron-forward-outline"></ion-icon>
</div>
<div class="dropdown_body">
<a class="nav_title" href="https://webcheck.cutieguwu.ca">Web Check</a>
</div>
</li>
<!-- Services -->
<li class="dropdown">
<div class="dropdown_header nav_body">
<p class="nav_title">Services</p>
<ion-icon name="chevron-forward-outline"></ion-icon>
</div>
<div class="dropdown_body">
<a class="nav_title" href="https://gitea.cutieguwu.ca/Cutieguwu">Gitea</a>
<a class="nav_title" href="https://jellyfin.cutieguwu.ca">Jellyfin</a>
<a class="nav_title" href="https://nextcloud.cutieguwu.ca">Nextcloud</a>
<a class="nav_title" href="https://play.cutieguwu.ca">Rebirth</a>
<a class="nav_title" href="https://zotero.cutieguwu.ca">Zotero</a>
</div>
</li>
<hr />
<!-- Website Disclosure -->
<li class="nav_body"><a class="nav_title" href="#">Website Disclosure</a></li>
</ul>

View File

@@ -0,0 +1,17 @@
<div class="nav_quick_links">
<a href="https://gitea.cutieguwu.ca/Cutieguwu/cutieguwu-site" title="Website Source">
<ion-icon
name="git-branch-outline"
class="icon_gitea"
alt="(Gitea) Website Source"
></ion-icon>
</a>
<a href="https://github.com/Cutieguwu/cutieguwu-site" title="(Mirror) Website Source">
<ion-icon name="logo-github" class="icon_github" alt="(Mirror) Website Source"></ion-icon>
</a>
<a
href="https://gitea.cutieguwu.ca/Cutieguwu/cutieguwu-site/src/branch/main/LICENSE"
title="MIT License"
><ion-icon name="book-outline" class="icon_license" alt="MIT License"></ion-icon
></a>
</div>

View File

@@ -0,0 +1,2 @@
<script type="module" src="https://unpkg.com/ionicons@7.1.0/dist/ionicons/ionicons.esm.js"></script>
<script nomodule src="https://unpkg.com/ionicons@7.1.0/dist/ionicons/ionicons.js"></script>

28
src/index.html Normal file
View File

@@ -0,0 +1,28 @@
<!doctype html>
<html lang="en-ca">
<head>
<title>Home | Cutieguwu</title>
<include src="includes/meta.html" />
</head>
<body class="viewport">
<nav class="pane_nav">
<include src="includes/nav_logo.html" />
<include src="includes/nav_menu.html" />
<div class="location">
<p class="location_header">You are here:</p>
<p class="location_page">Home</p>
</div>
<include src="includes/nav_quick_links.html" />
</nav>
<div class="pane_main">
<h1>Home</h1>
<p>lorem ipsum idk what else there is in this latin phrase</p>
</div>
<div class="pane_spacer">
<div class="spacer_container"><p>#AD</p></div>
<div class="spacer_container"><p>#AD</p></div>
</div>
<include src="includes/scripts.html" />
</body>
</html>

View File

@@ -0,0 +1,18 @@
.location {
margin: 0;
padding: var(--spacing-horizontal);
background-color: var(--background-2);
border-radius: var(--border-radius-small)
var(--border-radius-large);
text-align: center;
.location_header {
font-weight: bold;
margin: 0 0 0.5rem;
}
.location_page {
margin: 0;
padding: 0;
}
}

View File

@@ -0,0 +1,5 @@
.nav_logo {
font-family: var(--font-family-generic);
text-align: center;
margin: 0;
}

View File

@@ -0,0 +1,99 @@
.nav_menu {
/*
Remove default padding and style applied to ul for bullets.
*/
padding: 0;
list-style: none;
display: grid;
grid-auto-flow: row;
gap: var(--spacing-menu-gap);
align-self: center;
margin: 0;
hr {
border-color: var(--accent-pink);
margin: 0 var(--spacing-horizontal);
}
.nav_body {
background-color: var(--background-2);
border-radius: var(--border-radius-small);
transition: var(--transition-fade);
}
.dropdown:hover .nav_body,
.dropdown .nav_body:hover,
.nav_body:hover {
transform: var(--transform-scale-x);
transition: var(--transition-cut);
.nav_title,
ion-icon {
color: var(--highlight-hover);
transition: var(--transition-cut);
}
}
.dropdown {
.dropdown_header {
display: grid;
grid-template-columns: 1fr min-content;
align-items: center;
ion-icon {
/*
This one aligns visually odd if trying to use the same margins as it's neighbouring nav_title class.
*/
margin-right: 0.5rem;
align-self: center;
transition-duration: 0.25s;
}
}
.dropdown_body {
display: none;
border-bottom-left-radius: var(--border-radius-small);
border-bottom-right-radius: var(--border-radius-small);
background-color: var(--background-1);
}
}
.dropdown:hover {
.dropdown_header {
transform: var(--transform-scale-x);
ion-icon {
rotate: 90deg;
transition-duration: 0.25s;
}
}
.dropdown_body {
display: grid;
}
}
.nav_body,
.dropdown .nav_body,
.dropdown .dropdown_body {
.nav_title {
/* Need to force inheritence, otherwise <a> would require overrides for all color states from base styling for element. */
color: inherit;
text-decoration: none;
font-family: var(--font-family-generic);
font-weight: bold;
white-space: nowrap;
margin: 0 var(--spacing-horizontal);
transition: var(--transition-fade);
text-transform: uppercase;
}
.nav_title:hover {
color: var(--highlight-hover);
transition: var(--transition-cut);
}
}
}

View File

@@ -0,0 +1,54 @@
.nav_quick_links {
--cols: 5;
--item-padding: 0.35rem;
--item-edge-length: 1.25rem;
--item-size: calc(
var(--item-edge-length) + calc(var(--item-padding) * 2)
);
/*
display: flex;
flex-flow: row wrap;
align-items: center;
margin-right: auto;
*/
display: grid;
grid-template-columns:
var(--item-size) var(--item-size) var(--item-size)
var(--item-size) var(--item-size);
align-items: center;
gap: var(--spacing-menu-gap)
calc(
calc(100% - calc(var(--item-size) * var(--cols))) /
calc(var(--cols) - 1)
);
a {
width: var(--item-size);
height: var(--item-size);
* {
width: var(--item-edge-length);
height: var(--item-edge-length);
padding: var(--item-padding);
background-color: var(--background-2);
border-radius: var(--border-radius-small)
var(--border-radius-large);
}
.icon_gitea {
color: var(--accent-green);
}
.icon_github {
color: var(--accent-blue);
}
.icon_license {
color: var(--accent-purple);
}
}
}

View File

@@ -0,0 +1,6 @@
.pane_error {
width: max-content;
margin: auto; /* center object */
text-align: center;
background-color: var(--background-2);
}

View File

@@ -0,0 +1,10 @@
.pane_main {
flex: 1;
text-align: center;
background-color: var(--background-2);
margin: var(--margin-pane);
padding: 0;
border-radius: var(--border-radius-small)
var(--border-radius-large);
}

View File

@@ -0,0 +1,17 @@
@use "nav_logo";
@use "nav_menu";
@use "nav_location";
@use "nav_quick_links";
.pane_nav {
--spacing-horizontal: 0.75rem;
--transform-scale-x: scaleX(1.15);
margin: var(--margin-pane);
padding: 0;
gap: var(--spacing-menu-gap);
width: min-content;
align-content: start;
display: grid;
color: var(--accent-pink);
}

View File

@@ -0,0 +1,31 @@
.pane_spacer {
margin: var(--margin-pane);
padding: 0;
width: 10vw;
display: grid;
grid-auto-flow: row;
gap: var(--spacing-menu-gap);
.spacer_container {
margin: 0;
background-color: var(--background-2);
height: calc(
50vh - var(--margin-pane) - calc(
var(--spacing-menu-gap) / 2
)
);
flex: 1;
border-radius: var(--border-radius-small)
var(--border-radius-large);
/* Vertical Text Align */
display: flex;
align-items: center;
justify-content: center;
p {
margin: 0;
text-align: center;
}
}
}

2
src/robots.txt Normal file
View File

@@ -0,0 +1,2 @@
User-agent: *
Disallow: /

83
src/style.scss Normal file
View File

@@ -0,0 +1,83 @@
@use "partials/pane_main";
@use "partials/pane_nav";
@use "partials/pane_spacer";
@use "partials/pane_error";
:root {
/*
0: Base of an element. Example: the viewport class.
The higher the integer, the lighter the colour, the higher it should be visually, meaning more nested in the cascade.
Odd numbers should be used as intermediate colours between the fore and back elements. Excepting white--white's special.
Eg. Current dropdown menu.
*/
font-size: var(--font-size-generic);
--accent-green: #cfeb9eff;
--accent-pink: #ff9f9fff;
--accent-blue: #868ab7ff;
--accent-purple: #aa7ab7ff;
--background-0: #130b21ff;
--background-1: #170d28ff;
--background-2: #231833ff;
--background-3: #211635ff;
--background-4: #2a223eff;
--block-0: #0d0d0dff;
--block-1: #1a1a1aff;
--block-2: #272727ff;
--highlight-hover: #944db6ff;
--white-0: #bfbfbfff;
--white-1: #d9d9d9ff;
--white-2: #e5e5e5ff;
--white-3: #f5f5f5ff;
--font-size-generic: 1.65vh;
--font-family-generic: Arial, Sans-Serif, Helvetica;
--transition-fade: 0.4s ease-out;
--transition-cut: none;
--border-radius-large: 1rem;
--border-radius-small: calc(var(--border-radius-large) / 2);
--margin-pane: 1.5rem;
--spacing-menu-gap: 1rem;
}
/*
* {
outline: 1px solid red;
}
*/
h1 {
font-size: 3.3vh;
}
h2 {
font-size: 2.5vh;
}
ion-icon {
width: 1rem;
height: 1rem;
}
.viewport {
/* Adds a margin otherwise for some reason. */
margin: 0;
background-color: var(--background-0);
color: var(--white-3);
display: flex;
flex-flow: row wrap;
align-items: flex-start;
}

157
style.css
View File

@@ -1,157 +0,0 @@
* {
margin: 0;
padding: 0;
/*outline: 1px solid red;*/
}
h1 {
font-size: 3.3vh;
}
h2 {
font-size: 2.5vh;
}
p {
font-size: 1.65vh;
}
a {
font-size: 1.65vh;
}
hr {
margin: 1.25vh;
}
.viewport {
height: 100vh;
width: 100vw;
background-image: url(img/background.png);
background-position: center;
background-size: cover;
background-blend-mode: multiply;
align-items: flex-start;
display: flex;
flex-flow: row wrap;
}
.nav_pane {
padding: 1em;
gap: 1em;
width: min-content;
align-content: start;
display: grid;
float: left;
}
.nav_logo {
color: lightpink;
font-family: Arial, Helvetica, sans-serif;
text-align: center;
height: fit-content;
}
.nav_menu {
list-style: none;
min-width: fit-content;
display: grid;
grid-auto-flow: row;
row-gap: 1em;
}
.nav_body {
background-color: rgba(0, 0, 0, 50%);
border-radius: 50cqh;
height: auto;
transition: 0.4s ease-out;
}
.nav_body:hover {
transform: scaleX(1.15);
transition: 0s ease-in;
}
.nav_body:hover * {
color: darkviolet;
transition: 0s ease-out;
}
.nav_title:hover {
color: darkviolet;
transition: 0s ease-out;
}
.nav_title {
text-decoration-line: none;
font-family: Arial, Helvetica, sans-serif;
font-weight: bold;
white-space: nowrap;
font-size: 1.65vh;
padding-left: 1cqw;
padding-right: 1cqw;
transition: 0.4s ease-out;
float: left;
text-transform: uppercase;
color: lightpink;
}
.dropdown {
list-style: none;
}
.dropdown .dropdown_header {
display: grid;
grid-template-columns: 1fr min-content;
grid-auto-flow: column;
}
.dropdown_header ion-icon {
margin-right: 0.5vw;
align-self: center;
width: 1.65vh;
height: 1.65vh;
float: right;
color: lightpink;
transition-duration: 0.25s;
}
.dropdown_body {
display: none;
border-bottom-left-radius: 1em;
border-bottom-right-radius: 1em;
background-color: rgba(0, 0, 0, 50%);
}
.dropdown:hover .dropdown_body {
display: grid;
}
.dropdown:hover .dropdown_header {
transform: scaleX(1.15);
}
.dropdown:hover .dropdown_header ion-icon {
rotate: 90deg;
transition-duration: 0.25s;
}
.dropdown_body:hover {
display: grid;
}
.main_pane {
padding: 1rem;
background-color: rgba(0, 0, 0, 50%);
color: white;
}
.error_pane {
padding: 1rem;
width: max-content;
margin: auto; /* center object */
text-align: center;
background-color: rgba(0, 0, 0, 50%);
color: white;
border-radius: 1cqh;
}