Compare commits

..

17 Commits

Author SHA1 Message Date
Cat Flynn 8df4e68899 update blog
continuous-integration/drone/push Build is passing Details
2024-10-26 01:36:42 +01:00
Cat Flynn 7269d2df1a update blog
continuous-integration/drone Build is passing Details
2024-10-26 01:03:39 +01:00
Cat Flynn 4ea9f759d6 chore: remove about page
continuous-integration/drone Build is failing Details
2024-08-11 16:24:54 +01:00
ktyl c65854df9f chore: remove CSS templating (#34)
continuous-integration/drone/push Build is passing Details
re #31

Reviewed-on: #34
Co-authored-by: ktyl <me@ktyl.dev>
Co-committed-by: ktyl <me@ktyl.dev>
2024-06-16 17:20:51 +02:00
ktyl d606dcc1f4 chore: update blog
continuous-integration/drone/push Build is passing Details
2024-06-16 16:09:25 +01:00
ktyl 26525fcc43 chore: remove redundant deploy rule
continuous-integration/drone/push Build is passing Details
2024-06-08 16:31:51 +01:00
ktyl 49333b641e chore: remove ppp submodule
continuous-integration/drone/push Build was killed Details
2024-06-08 16:15:02 +01:00
ktyl 2471160986 chore: update python
continuous-integration/drone/push Build is failing Details
continuous-integration/drone Build is passing Details
2024-06-08 12:24:47 +01:00
ktyl 592749a5b4 feat: add favicon
continuous-integration/drone Build is failing Details
2024-06-08 12:16:00 +01:00
Cat Flynn 059a5f68bf blog: fix typo
continuous-integration/drone/push Build is passing Details
2024-04-27 10:49:51 +01:00
Cat Flynn 12fe8baf2b fix blog post
continuous-integration/drone/push Build is passing Details
2024-04-27 00:59:12 +01:00
Cat Flynn f205c4d3f3 blog: interactive astrodynamics
continuous-integration/drone Build is passing Details
2024-04-26 23:43:43 +01:00
ktyl 41c52f59d1 feat(vn): simple vn
continuous-integration/drone/push Build is passing Details
2024-03-07 00:42:30 +00:00
ktyl 59d6131c5a fix typos
continuous-integration/drone/push Build is passing Details
2024-02-06 00:14:13 +00:00
ktyl 9b442db80a blog: we all dream about flying
continuous-integration/drone/push Build is passing Details
2024-02-05 00:18:19 +00:00
ktyl 2b0141051d blog: fix typos 2024-02-03 16:36:02 +00:00
ktyl bd4cd99664 fix blog typos
continuous-integration/drone/push Build is passing Details
2024-01-02 16:10:59 +00:00
192 changed files with 1101 additions and 1333 deletions

View File

@ -18,7 +18,7 @@ steps:
- name: build - name: build
image: archlinux image: archlinux
environment: environment:
PYTHON_ENV: python python-pipenv python-setuptools PYTHON_ENV: pyenv python python-pipenv python-setuptools
commands: commands:
# set up python # set up python

11
Pipfile.lock generated
View File

@ -1,11 +1,11 @@
{ {
"_meta": { "_meta": {
"hash": { "hash": {
"sha256": "4f4f4fc0dc77addc9a4bf6c737f31df9507ee22a83548fcff1891a4e7bc27bed" "sha256": "8197b62eaf2c2267235d798d625f266e606263fb3108ba131e012c8ae7814dcd"
}, },
"pipfile-spec": 6, "pipfile-spec": 6,
"requires": { "requires": {
"python_version": "3.10" "python_version": "3.11"
}, },
"sources": [ "sources": [
{ {
@ -18,11 +18,12 @@
"default": { "default": {
"markdown": { "markdown": {
"hashes": [ "hashes": [
"sha256:08fb8465cffd03d10b9dd34a5c3fea908e20391a2a90b88d66362cb05beed186", "sha256:48f276f4d8cfb8ce6527c8f79e2ee29708508bf4d40aa410fbc3b4ee832c850f",
"sha256:3b809086bb6efad416156e00a0da66fe47618a5d6918dd688f53f40c8e4cfeff" "sha256:ed4f41f6daecbeeb96e576ce414c41d2d876daa9a16cb35fa8ed8c2ddfad0224"
], ],
"index": "pypi", "index": "pypi",
"version": "==3.4.1" "markers": "python_version >= '3.8'",
"version": "==3.6"
} }
}, },
"develop": {} "develop": {}

2
blog

@ -1 +1 @@
Subproject commit 5a1de185c30b8a1ef3400fe161fcc8f12fbacaa0 Subproject commit 57cb9a24716d1094c4fc3cb491eec296d7a1dc0d

BIN
img/favicon.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1000 B

View File

@ -1,9 +1,3 @@
SITE_NAME = ktyl.dev
# configured in ~/.ssh/config
HOST = pluto
# a script on the remote server to move it on arrival
REMOTE_SCRIPT = ./deploy-$(SITE_NAME)
SRC_DIR = src SRC_DIR = src
IMG_DIR = img IMG_DIR = img
OUT_DIR = site OUT_DIR = site
@ -15,38 +9,33 @@ BLOG_BUILD_DIR = $(BLOG_BASE_DIR)out/html/
BLOG_OUT_DIR = $(OUT_DIR)/blog BLOG_OUT_DIR = $(OUT_DIR)/blog
BLOG_INDEX = $(BLOG_BUILD_DIR)/index.html BLOG_INDEX = $(BLOG_BUILD_DIR)/index.html
GARDEN_BASE_DIR = $(SRC_DIR)/garden/ VN = src/vn/
GARDEN_BUILD_DIR = $(GARDEN_BASE_DIR)html
PAGES = $(shell find $(ROOT_DIR) -wholename "$(ROOT_DIR)*.html") PAGES = $(shell find $(ROOT_DIR) -wholename "$(ROOT_DIR)*.html")
STYLES = $(shell find $(ROOT_DIR) -wholename "$(ROOT_DIR)*.css") STYLES = $(shell find $(ROOT_DIR) -wholename "$(ROOT_DIR)*.css")
IMAGES = $(shell find $(IMG_DIR) -wholename "$(IMG_DIR)/*.png") IMAGES = $(shell find $(IMG_DIR) -wholename "$(IMG_DIR)/*.png")
HTML_INCLUDES = $(shell find $(SRC_DIR)/inc_html -name *.html) HTML_INCLUDES = $(shell find $(SRC_DIR)/inc_html -name *.html)
CSS_INCLUDES = $(shell find $(SRC_DIR)/inc_css -name *.css)
HTML_TARGETS = $(PAGES:$(ROOT_DIR)/%.html=$(OUT_DIR)/%.html) HTML_TARGETS = $(PAGES:$(ROOT_DIR)/%.html=$(OUT_DIR)/%.html)
CSS_TARGETS = $(STYLES:$(ROOT_DIR)/%.css=$(OUT_DIR)/%.css) CSS_TARGETS = $(STYLES:$(ROOT_DIR)/%.css=$(OUT_DIR)/%.css)
PNG_TARGETS = $(IMG_DIR)/%.png=$(OUT_DIR)/%.png PNG_TARGETS = $(IMG_DIR)/%.png=$(OUT_DIR)/%.png
all: html blog garden | $(OUT_DIR) all: html blog vn | $(OUT_DIR)
cp -r src/garden/html $(OUT_DIR)/garden
vn: $(VN) | $(OUT_DIR)
cp -r $(VN) $(OUT_DIR)/vn
html: $(HTML_TARGETS) $(CSS_TARGETS) | $(OUT_DIR) html: $(HTML_TARGETS) $(CSS_TARGETS) | $(OUT_DIR)
cp $(IMG_DIR)/*.ico $(OUT_DIR)/
cp $(IMG_DIR)/*.png $(OUT_DIR)/ cp $(IMG_DIR)/*.png $(OUT_DIR)/
cp $(IMG_DIR)/*.jpg $(OUT_DIR)/ cp $(IMG_DIR)/*.jpg $(OUT_DIR)/
deploy:
cp -r $(OUT_DIR) $(SITE_NAME)
rsync -rP $(SITE_NAME) $(HOST):~
rm -r $(SITE_NAME)
ssh $(HOST) "sudo $(REMOTE_SCRIPT)"
$(OUT_DIR)/%.html: $(ROOT_DIR)/%.html $(HTML_INCLUDES) $(BLOG_INDEX) | $(OUT_DIR) $(OUT_DIR)/%.html: $(ROOT_DIR)/%.html $(HTML_INCLUDES) $(BLOG_INDEX) | $(OUT_DIR)
python ppp/ppp.py $< $(HTML_INCLUDES) $(BLOG_INDEX) > $@ python ppp.py $< $(HTML_INCLUDES) $(BLOG_INDEX) > $@
$(OUT_DIR)/%.css: $(ROOT_DIR)/%.css $(CSS_INCLUDES) | $(OUT_DIR) $(OUT_DIR)/%.css: $(ROOT_DIR)/%.css | $(OUT_DIR)
python ppp/ppp.py $< $(CSS_INCLUDES) > $@ cp $< $@
$(OUT_DIR): $(OUT_DIR):
mkdir -p $@ mkdir -p $@
@ -61,17 +50,13 @@ blog: $(HTML_INCLUDES) $(CSS_TARGETS)
make --directory $(BLOG_BASE_DIR) html make --directory $(BLOG_BASE_DIR) html
cp -r $(BLOG_BUILD_DIR)/* $(BLOG_OUT_DIR) cp -r $(BLOG_BUILD_DIR)/* $(BLOG_OUT_DIR)
for page in `find "$(BLOG_OUT_DIR)" -wholename "*.html"`; do \ for page in `find "$(BLOG_OUT_DIR)" -wholename "*.html"`; do \
pipenv run python ppp/ppp.py $$page $(HTML_INCLUDES) > temp ; \ python ppp.py $$page $(HTML_INCLUDES) > temp ; \
mv temp $$page ; \ mv temp $$page ; \
cp $(CSS_TARGETS) `dirname $$page` ; \ cp $(CSS_TARGETS) $(IMG_DIR)/*.ico `dirname $$page` ; \
done done
garden:
make --directory $(GARDEN_BASE_DIR) site
clean: clean:
make --directory $(GARDEN_BASE_DIR) clean
make --directory $(BLOG_BASE_DIR) clean make --directory $(BLOG_BASE_DIR) clean
rm -rf $(OUT_DIR) rm -rf $(OUT_DIR)
.PHONY: blog garden .PHONY: blog vn

1
ppp

@ -1 +0,0 @@
Subproject commit 2253d24ad239afe2b4fe2cf53471bcc3414879cd

83
ppp.py Normal file
View File

@ -0,0 +1,83 @@
import sys
import os.path
import re
err = False
paths = []
def print_usage():
print("\nusage: python ppp.py ROOT TEMPLATES [...]")
# check arguments
argc = len(sys.argv)
if argc < 3:
print_usage()
sys.exit(1)
includes = sys.argv[2:]
# figure out src dir from root argument
sep="/"
src_dir = sep.join(sys.argv[2].split(sep)[:-1])
# regex patterns
p_var = re.compile(r'(#.+?\.css)')
def preprocess_file(path):
lines=0
with open(path) as f:
content = f.readlines()
content = [x.strip('\n') for x in content]
lines=len(content)
for l in content:
# replace lines that start with #include with the contents of a file
if l.startswith("#include"):
include_path = l.split(" ")[1]
# prepend directory
#include_path = "/".join([src_dir, include_path])
for inc in includes:
if os.path.basename(inc) == include_path:
include_path = inc
break
preprocess_file(include_path)
continue
# inline replace any occurrence of #filename with the contents of that file
match = re.search(p_var, l)
if match:
path = "/".join([src_dir, match.group(0)[1:]])
with open(path) as var_file:
var_content = var_file.read().strip()
l = re.sub(p_var, var_content, l)
print(l)
for i in range(1,argc):
path = sys.argv[i]
if not os.path.isfile(path):
print(path + " is not a file")
err = True
continue
if path in paths:
# ignore duplicates
continue
paths.append(path)
if err:
print_usage()
sys.exit(1)
preprocess_file(sys.argv[1])
sys.exit(0)

View File

@ -1 +0,0 @@
*.html

View File

@ -1,22 +0,0 @@
py = feed.py books.py
md = rss.md book-collecting.md gardens.md
html = $(md:%.md=%.html)
site: Makefile $(md) $(py)
mkdir html
python md2html.py $(md)
cp $(html) $(py) Makefile html
clean-html:
rm -r html
.PHONY: clean-html
feed:
python feed.py `pwd`
rss: feed
clean: clean-html
.PHONY: feed clean

View File

@ -1,106 +0,0 @@
how do you define a book collection?
my book collection is the set of all books.
i prefer physical books to e-readers.
unfortunately i have quite a few these days.
i want to read them all eventually!
i also tend to live in quite small places
and i want to be able to move city easily!
so here's my system for organising my physical book collection.
i want to:
* read books i already have
* read as many different books as possible
* minimise physical storage requirements
* keep track of books i've read
* gather books i don't already have
constraints
* i don't know for sure what book i will want to read next
for every book in the world
* i either have or have not read it
* i have access to it or i don't
so i sort my book collection with 4 categories
*-------------------*-----------------------*
| | |
| unread | read |
| have | have |
| | |
| 37º2 le matin | L'Homme des Jeux |
| | |
*-------------------*-----------------------*
| | |
| unread | read |
| haven't | haven't |
| | |
| Das Kapital | Frankisstein |
| | |
*-------------------*-----------------------*
i can then begin to optimise my collection.
* i do not have this book, and i have read it.
* i have this book, but i have not read it.
* i have this book, and i have read it.
* i do not have this book, but i have not read it.
the books i am most interested in having nearby are unread ones, as i would like to read as many different books as possible.
books i have already read i don't need nearby anymore.
i might pass it on, or store it somewhere with less of a premium on space.
i could also attempt to track where it is!
based on my requirements and my categories, i create four lists for the books
* ready
* all done
* read and gone
* hunted
that looks like a decent start to the system, so i suppose now i'll start collecting!
so i'll use markdown lists in the format
```
* [x] author - title # reading
* [ ] author - title # nearby
```
when collecting music i use artist - year - name
however, publication year is an extra step that will slow data entry, so won't use this to start with - i have a lot of books
i realised i had a gpt-4 sub and that it could look at pictures now so i gave it a go
i fed it some photos and some formatting preferences and i got out perfect markdown lists
```
- [ ] Doctorow, Cory - Walkaway
- [ ] Ferreira, Pedro G. - The Perfect Theory
- [ ] Hadfield, Chris - An Astronaut's Guide to Life on Earth
- [ ] Heinlein, Robert A. - Beyond This Horizon
```
books are lovely are great to look at, but the mishmash of fonts and presentation are a nightmare for indexing.
now we have some good and lovely metadata :)
this is an imperfect method, as the only way i can check it is still by combing through the physical books manually
but it does let me target my combing after identifying problems in the index
and in the meantime gives us a bunch of data to play with
markdown lists also allow me to mark some items in a list
this is looks flexible, so i think in my 'ready' list i will mark which book(s) i am currently reading
```
- [ ] Doctorow, Cory - Walkaway
- [ ] Ferreira, Pedro G. - The Perfect Theory
- [ ] Hadfield, Chris - An Astronaut's Guide to Life on Earth
- [ ] Heinlein, Robert A. - Beyond This Horizon
```
the other lists i will leave unmarked for now, until i think of something to do with them.
as for doing things with them, i wrote a [python script](#) which processes the data in the now-populated all-done and ready lists to yield some interesting (?) and fun (?) results?
[example output](#)

View File

@ -1,87 +0,0 @@
import sys
import os
import re
def print_usage():
print(f"usage: python {sys.argv[0]} DIR")
print(f"")
print(f"\tDIR\tdirectory containing markdown lists in files.")
if len(sys.argv) != 2:
print_usage()
exit(1)
base_path = os.path.abspath(sys.argv[1])
ready_list_name = "ready.md"
done_list_name = "all-done.md"
def get_path(list_name : str) -> str:
return os.path.join(base_path, list_name)
def get_matches(list_name : str) -> list[re.Match]:
# Matches a markdown list item
entry_pattern = re.compile(r"^[*-] \[([ *x])\] (.+) - (.+)")
matches = []
with open(get_path(list_name)) as f:
matches = [entry_pattern.match(l) for l in f.readlines()]
return [m for m in matches if m is not None]
class Book:
def __init__(self, match : re.Pattern):
self.mark = match.group(1) != " "
self.author = match.group(2)
self.title = match.group(3)
def is_metadata_complete(self):
if not self.title or not self.author:
return False
if self.title == "???" or self.author == "???":
return False
return True
@staticmethod
def get_list(list_name : str, filter_partial_metadata = True) -> []:
books = [Book(m) for m in get_matches(list_name)]
if filter_partial_metadata:
books = [b for b in books if b.is_metadata_complete()]
return books
def print_section(title : str, books : list[str]):
print(f"# {title} ({len(books)})\n")
longest_title = max([len(b.title) for b in books])
title_column_width = longest_title + 2
for book in books:
row = [book.title, book.author]
format_str = "- {: <" + str(title_column_width) + "} {: <20}"
print(format_str.format(*row))
print()
def print_in_progress():
books = [b for b in Book.get_list(ready_list_name, False) if b.mark]
print_section("in progress", books)
def print_completed():
books = Book.get_list(done_list_name)
print_section("up for borrowing", books)
def print_partial_metadata():
books = Book.get_list(ready_list_name, False)
books += Book.get_list(done_list_name, False)
books = [b for b in books if not b.is_metadata_complete()]
print_section("metadata incomplete", books)
print_in_progress()
print_completed()
print_partial_metadata()

View File

@ -1,63 +0,0 @@
#!/usr/bin/env python3
import markdown
import pathlib
import sys
import re
import glob
import os
def print_usage():
print("\nusage: python feed.py ROOT\n")
print("\n")
print("\t\ROOT\tbase folder")
# check args for at most one file paths
if len(sys.argv) > 2:
print_usage()
sys.exit(1)
base_folder = sys.argv[1] if len(sys.argv) == 2 else os.getcwd()
print(base_folder)
def get_paths() -> [str]:
return [x for x in glob.glob(f"{base_folder}/*.md")]
def get_text(path):
with open(path) as f:
return f.read()
#def to_html(md : str) -> str:
# return markdown.markdown(md, extensions=["fenced_code"])
def get_title(md):
m = re.compile(r"^# (.+)\n").match(md)
if m is not None:
return m.groups(1)[0]
# truncated first line of file for auto-title
return md.splitlines()[0][0:30]
def get_entry(path):
return get_title(get_text(path))
def get_entries() -> [str]:
entries = [get_entry(p) for p in get_paths()]
return "\n\n".join(entries)
def get_header() -> str:
return """<?xml version="1.0" encoding="utf-8" ?>
<rss xmlns:atom="http://www.w3.org/2005/Atom" version="2.0">
<channel>
<title></title>
<link>https://ktyl.dev/garden</link>
<description></description>
<atom:link href="https://ktyl.dev/garden/feed.xml" rel="self" type="application/rss+xml"/>
"""
def get_footer() -> str:
return "\n</channel></rss>"
print(get_header())
print(get_entries())
print(get_footer())

View File

@ -1,15 +0,0 @@
python feed.py `pwd`
<?xml version="1.0" encoding="utf-8" ?>
<rss xmlns:atom="http://www.w3.org/2005/Atom" version="2.0">
<channel>
<title></title>
<link>https://ktyl.dev/garden</link>
<description></description>
<atom:link href="https://ktyl.dev/garden/feed.xml" rel="self" type="application/rss+xml"/>
Digital Gardens
RSS
</channel></rss>

View File

@ -1,5 +0,0 @@
# Digital Gardens
* Obsidian
* Notion
* Git

View File

@ -1,32 +0,0 @@
#!/usr/bin/env python
import sys
import markdown
def print_usage():
print(f"usage: python {sys.argv[0]} PATHS")
print("")
print("\t\PATHS\tpaths of input markdown files")
if len(sys.argv) < 2:
print_usage()
sys.exit(1)
paths = sys.argv[1:]
bad_paths = [p for p in paths if not p.endswith(".md")]
if len(bad_paths) != 0:
for p in bad_paths:
print(f"Not a markdown file: {p}")
exit(1)
def write_html(src : str):
with open(src) as md:
dest = src.replace(".md", ".html")
with open(dest, "w") as html:
print(f"{src} -> {dest}")
html.write(markdown.markdown(md.read()))
for p in paths:
write_html(p)

View File

@ -1,35 +0,0 @@
# RSS
Really Simple Syndication (RSS) is an ancient file format for communicating updates over the Web, and my personal favourite.
* [It's Time for an RSS Revival](https://www.wired.com/story/rss-readers-feedly-inoreader-old-reader/)
### Stubs:
* my curated feeds
* reader applications
## Technical Simplicity
From a technical perspective, like [Gemini](gemini://gemini.circumlunar.space) [\(HTTP\)](https://gemini.circumlunar.space/) it's grokkable with a couple good reads of the specification.
I wrote [a simple generator](https://ktyl.dev/blog/2022/6/3/rss.md)] for my blog posts, and am now working on [a simpler one](./feed.py) for the garden.
To start with, I'd like to generate it as simply as possible, from just a directory structure, but I can already see I'd like to do more with it.
I work predominantly in [Git](https://git-scm.com/) repositories, which, like a directory, or a garden, is tree-based.
My blog's feed has a chronological hierarchy, but at present it's based on manually creating and naming folders.
It's also very much a _published_ format, rather than a living one.
This is silly!
Instead, I'd like to structure my feed around a Git repository, as I think it'd be a much better descriptor of activity.
## Managing YouTube Subscriptions
There are many reasons to avoid the YouTube homepage, such as recommended videos or the accursed Shorts.
YouTube publishes channel-specific RSS feeds, making it totally possible to circumvent its subscription system entirely - including having to make an account - and keep track of channels one enjoys with RSS feeds instead.
Get a channel's ID:
1. Go to the channel's page
2. Go to the About section
3. Share icon under Stats block
4. Copy channel ID
The channel's feed is available at `https://www.youtube.com/feeds/videos.xml?channel_id=CHANNEL_ID_HERE`.

View File

@ -1,24 +0,0 @@
.pfp {
position: relative;
top: 3em;
left: 50%;
width: 20em;
height: 20em;
text-align: center;
overflow: hidden;
border-color: var(--background-alt);
border-style: solid;
border-width: 3px;
border-radius: 50%;
transform: translate(-50%, 0);
margin-bottom: 4em;
}
.pfp img {
position: absolute;
left: 50%;
top: 50%;
height: 100%;
width: auto;
transform: translate(-50%, -50%);
}

View File

@ -1,121 +0,0 @@
.page .blog {
}
.page .blog h1 {
font-size: 2.5em;
}
.page .blog .para-block {
color: var(--foreground-inactive);
font-size: 1.1em;
line-height: 1.25em;
background-color: var(--background);
border-color: var(--background-alt);
border-width: 3px;
border-radius: 2em;
border-style: solid;
padding: 1.0em 1.5em;
}
.page .blog .text-panel ul li {
display: block;
}
.page .blog .text-panel ul li::before {
content: "• "
}
.page .blog .code-panel {
color: var(--background);
background-color: var(--foreground);
font-size 1.5em;
line-height: 1.3em;
border-color: var(--accent);
border-width: 2px;
border-radius: 2em;
border-style: solid;
padding: 1.0em 2.0em;
margin: 2.5em -4.0em;
overflow: hidden;
}
.page .blog .code-panel pre {
overflow: scroll;
}
.page .blog .code-panel pre::-webkit-scrollbar {
height: 0;
width: 0;
background: transparent;
}
.page .blog p code {
height: 0.8em;
padding: 0.07em 0.25em;
margin: 0 0.1em;
background-color: var(--foreground-inactive);
color: var(--background);
border-radius: .3em;
}
ul.blog-index li {
display: block;
margin: .2em 0;
}
ul.blog-index li a {
color: var(--foreground-inactive);
transition: none;
text-decoration: none;
}
.blog-index li a:hover {
color: var(--accent);
}
.blog-index li a:visited {
color: var(--foreground);
}
.page ul.blog-index li a::before {
content: "• "
}
.blog-index .post-date {
padding-right: 1em;
}
.page .blog .img-panel
{
margin-top: 2em;
margin-bottom: 2em;
}
.page .blog .img-panel img {
position: relative;
width: 120%;
max-width: 100vw;
left: -10%;
border-radius: 2em;
}
@media only screen and (max-width: 700px) {
.page .blog .code-panel {
padding: 1.0em 5.0em;
}
.page .blog .img-panel img {
width: 100%;
left: 0;
border-radius: 0;
}
}

View File

@ -1,18 +0,0 @@
.demoTile {
opacity: 0.3;
transition: opacity 0.3s;
max-width: 15vw;
display: inline-block;
}
.demoTile:hover {
opacity: 1.0;
}
.demoTiles {
position: absolute;
background-color:white;
left:27.5%;
top: var(--title-height);
margin-top:40px;
}

View File

@ -1,11 +0,0 @@
.footer {
position: relative;
}
.footer span {
position: absolute;
left: 50%;
transform: translate(-50%, 0);
color: var(--foreground-inactive);
padding: 2em;
}

View File

@ -1,112 +0,0 @@
.page.portfolio {
padding-top: 0;
width: 50%;
margin-left:auto;
margin-right:auto;
transform: translate(-50%,0);
}
.portfolio p {
margin: 1.2em 0 2em;
text-align: center;
border-style: none;
background-color: var(--clear);
}
.glass {
padding: 0.4em 0.6em;
color: var(--foreground-inactive);
background-color: var(--background);
opacity:0.9;
border-style:solid;
border-radius:2em;
border-color:var(--clear);
}
/* gallery img */
.wrapper {
margin-top: 1em;
width: 100%;
height: 100%;
display: grid;
grid-template-columns: 1fr 1fr 1fr;
}
.wrapper .imgHolder {
position: relative;
width: 100%;
height: 100%;
}
.wrapper img {
pointer-events: none;
box-sizing: border-box;
width: 100%;
height: 100%;
object-fit: cover;
left: auto;
right: auto;
transition: all 0.2s ease-out;
}
.wrapper .imgHolder span {
position:absolute;
top:100%;
width:100%;
transform: translateY(-50%) scale(0.6);
text-align: center;
opacity: 0;
transition: all 0.3s;
color: var(--accent);
}
.wrapper .imgHolder span p {
padding:0;
margin:0;
opacity: 1;
color: var(--background);
}
.lightTileText {
color: var(--background);
}
.wrapper .imgHolder a {
position: absolute;
top:0;
left:0;
width:100%;
height:100%;
}
@media only screen and (max-width: 600px) {
.page.portfolio {
width: 100%;
}
.wrapper .imgHolder {
overflow: hidden;
}
.wrapper .imgHolder span {
position: absolute;
top:0;
left:0;
width:100%;
height:100%;
transform: none;
}
.icon-link {
display: none;
}
.wrapper .imgHolder span i {
/*display: none;*/
}
}

View File

@ -1,67 +0,0 @@
.landing {
margin-top: 10%;
text-align: center;
}
.landing a {
color: var(--foreground-inactive);
font-size: 2em;
transform: translate(0,50%);
transition: all 0.3s;
}
.landing a:hover {
color: var(--accent);
}
.landing ul {
width: 100%;
padding: .5em 0 0;
margin: 0;
}
.landing li a {
position: relative;
font-size: 2.5em;
margin: 0 .2em;
color: var(--foreground-inactive);
}
.landing li a:hover {
transform: translateY(-10%);
color: var(--accent);
}
.landing .socials {
position: relative;
background-color: var(--clear);
top: 1em;
left: auto;
right: auto;
text-align: center;
}
.landing .socials i {
color: var(--foreground-inactive);
padding: 0 .07em;
}
@media only screen and (max-width: 600px) {
.landing.page {
position: fixed;
margin: 0;
padding: 0;
height: 100%;
}
.landing.page .socials {
top: .5em;
bottom: 0;
}
.landing.page .socials i {
font-size: 3em;
}
}

View File

@ -1,114 +0,0 @@
.nav {
position: fixed;
width: max(11vmax, 200px);
top: 0;
bottom:0;
padding-top: 2em;
padding-left: 2em;
background-color: var(--background);
color: var(--foreground);
}
.nav-links {
position: relative;
padding-top: 2em;
padding-bottom: 1em;
padding-left:0;
width: 80%;
}
ul.nav-links {
margin-top: 0;
list-style-type: none;
}
.nav .nav-links li {
display: block;
margin-bottom: 0.8em;
}
.nav .nav-links li a {
color: var(--foreground-inactive);
font-size: 1.4em;
display: block;
}
.nav li a::before {
content: "/";
}
.nav li a {
display: block;
padding: 2px;
background-color: var(--clear);
transition: background-color 0.5s;
}
.nav li a:hover {
color: var(--accent);
}
@media only screen and (max-width: 1200px) {
.nav .socials a {
padding: .2em 0;
display: block;
text-align: center;
}
}
@media only screen and (max-width: 1000px) {
.nav {
position: fixed;
width: 100%;
padding: 0;
z-index: 1;
top: 0;
height: 3em;
border-bottom: 3px solid var(--background-alt);
}
.nav .title {
padding-top: .6em;
padding-left: .6em;
height: 2em;
}
.nav .nav-links {
position: absolute;
top: 0;
right: 0;
padding: .6em .6em 0 0;
float: right;
text-align: right;
width: auto;
}
.nav .nav-links li {
display: inline-block;
}
.nav .nav-links li a::before {
content: "";
}
.nav .pageTitle {
display: none;
}
.nav .socials {
position: fixed;
left: .5em;
bottom: .5em;
}
}
@media only screen and (max-width: 700px) {
.nav .socials {
display: none;
}
}

View File

@ -1 +0,0 @@
440px

View File

@ -1 +0,0 @@
570px

View File

@ -1 +0,0 @@
180px

View File

@ -1 +0,0 @@
320px

View File

@ -1 +0,0 @@
0.2rem

View File

@ -1,79 +0,0 @@
.page {
position: absolute;
width: max(30vmax,500px);
left:50%;
top:0;
padding: 0px 0 50px;
padding-top: 5vh;
transform: translate(-50%, 0);
}
.page .separator {
position: relative;
background-color: var(--foreground-inactive);
width: .35em;
height: .35em;
left: 50%;
border-radius: 100%;
transform: translateX(-50%);
}
.page a {
color: var(--accent);
transition: all 0.1s;
}
.page a:hover {
color: var(--foreground);
}
.page .text-panel {
margin: 0;
margin-left: -1.5em;
padding: .2em 1.3em;
color: var(--foreground-inactive);
font-size: 1.1em;
/*font-weight: bold;*/
line-height: 1.25em;
background-color: var(--background);
border-radius: 1.5em;
width: 100%;
border-color: var(--background-alt);
border-width: 3px;
border-style: solid;
}
.page h1, h2 {
color: var(--foreground-inactive);
font-size: 1.7em;
margin-top: 1.2em;
padding: 0.2em 0.4em;
text-align: center;
}
@media (max-width: 700px) {
.page {
margin-top: 2.5em;
width: 100%;
padding: 0;
overflow: hidden;
}
.page .text-panel p {
padding: 0 .5em;
margin-right: .5em;
}
}

View File

@ -1,234 +0,0 @@
.planets {
overflow: hidden;
position: fixed;
height: 80vmax;
width: 80vmax;
right: 0;
bottom: 0;
z-index: -1;
/*background-color: var(--background);*/
background-color: transparent;
}
@media only screen and (max-width: 600px) {
.planets {
height: 200vmax;
width: 200vmax;
transform: scale(0.5) translate(50%, 50%);
}
}
.planet {
position: absolute;
border-radius: 50%;
display: inline-block;
width: var(--radius);
height: var(--radius);
}
.orbit {
position: absolute;
/*border: #orbit_thickness.css solid var(--foreground-inactive);*/
border-radius: 100%;
background-color: transparent;
z-index:-1;
}
@-webkit-keyframes orbit_mercury {
from { -webkit-transform: rotate(360deg) translateX(#or_mercury.css) rotate(360deg); }
to { -webkit-transform: rotate(0deg) translateX(#or_mercury.css) rotate(0deg); }
}
@-moz-keyframes orbit_mercury {
from { -moz-transform: rotate(360deg) translateX(#or_mercury.css) rotate(360deg); }
to { -moz-transform: rotate(0deg) translateX(#or_mercury.css) rotate(0deg); }
}
@-o-keyframes orbit_mercury {
from { -o-transform: rotate(360deg) translateX(#or_mercury.css) rotate(360deg); }
to { -o-transform: rotate(0deg) translateX(#or_mercury.css) rotate(0deg); }
}
@keyframes orbit_mercury {
from { transform: rotate(360deg) translateX(#or_mercury.css) rotate(360deg); }
to { transform: rotate(0deg) translateX(#or_mercury.css) rotate(0deg); }
}
#mercury {
--period: 4.82s;
--radius: 30px;
--color: var(--background-alt);
width: var(--radius);
height: var(--radius);
background-color: var(--color);
right: #solposx.css;
bottom: #solposy.css;
-webkit-animation: orbit_mercury var(--period) linear infinite;
-moz-animation: orbit_mercury var(--period) linear infinite;
-o-animation: orbit_mercury var(--period) linear infinite;
animation: orbit_mercury var(--period) linear infinite;
}
#mercury-orbit {
--orbit-radius: #or_mercury.css;
--planet-radius: #pr_mercury.css;
--orbit-thickness: #orbit_thickness.css;
--diameter: calc(2 * var(--orbit-radius) + (var(--planet-radius) - var(--orbit-thickness)) / 2);
right: #solposx.css;
bottom: #solposy.css;
transform: translate(#or_mercury.css, #or_mercury.css);
width: var(--diameter);
height: var(--diameter);
border: #orbit_thickness.css solid var(--background-alt);
}
@-webkit-keyframes orbit_venus {
from { -webkit-transform: rotate(360deg) translateX(#or_venus.css) rotate(360deg); }
to { -webkit-transform: rotate(0deg) translateX(#or_venus.css) rotate(0deg); }
}
@-moz-keyframes orbit_venus {
from { -moz-transform: rotate(360deg) translateX(#or_venus.css) rotate(360deg); }
to { -moz-transform: rotate(0deg) translateX(#or_venus.css) rotate(0deg); }
}
@-o-keyframes orbit_venus {
from { -o-transform: rotate(360deg) translateX(#or_venus.css) rotate(360deg); }
to { -o-transform: rotate(0deg) translateX(#or_venus.css) rotate(0deg); }
}
@keyframes orbit_venus {
from { transform: rotate(360deg) translateX(#or_venus.css) rotate(360deg); }
to { transform: rotate(0deg) translateX(#or_venus.css) rotate(0deg); }
}
#venus {
--period: 12.3s;
--radius: #pr_venus.css;
--color: var(--background-alt);
width: var(--radius);
height: var(--radius);
background-color: var(--color);
right: #solposx.css;
bottom: #solposy.css;
-webkit-animation: orbit_venus var(--period) linear infinite;
-moz-animation: orbit_venus var(--period) linear infinite;
-o-animation: orbit_venus var(--period) linear infinite;
animation: orbit_venus var(--period) linear infinite;
}
#venus-orbit {
--orbit-radius: #or_venus.css;
--planet-radius: #pr_venus.css;
--orbit-thickness: #orbit_thickness.css;
--diameter: calc(2 * var(--orbit-radius) + (var(--planet-radius) - var(--orbit-thickness)) / 2);
right: #solposx.css;
bottom: #solposy.css;
transform: translate(#or_venus.css, #or_venus.css);
width: var(--diameter);
height: var(--diameter);
border: #orbit_thickness.css solid var(--background-alt);
}
@-webkit-keyframes orbit_earth {
from { -webkit-transform: rotate(360deg) translateX(#or_earth.css) rotate(360deg); }
to { -webkit-transform: rotate(0deg) translateX(#or_earth.css) rotate(0deg); }
}
@-moz-keyframes orbit_earth {
from { -moz-transform: rotate(360deg) translateX(#or_earth.css) rotate(360deg); }
to { -moz-transform: rotate(0deg) translateX(#or_earth.css) rotate(0deg); }
}
@-o-keyframes orbit_earth {
from { -o-transform: rotate(360deg) translateX(#or_earth.css) rotate(360deg); }
to { -o-transform: rotate(0deg) translateX(#or_earth.css) rotate(0deg); }
}
@keyframes orbit_earth {
from { transform: rotate(360deg) translateX(#or_earth.css) rotate(360deg); }
to { transform: rotate(0deg) translateX(#or_earth.css) rotate(0deg); }
}
#earth {
--period: 20s;
--radius: #pr_earth.css;
--color: var(--background-alt);
width: var(--radius);
height: var(--radius);
background-color: var(--color);
right: #solposx.css;
bottom: #solposy.css;
-webkit-animation: orbit_earth var(--period) linear infinite;
-moz-animation: orbit_earth var(--period) linear infinite;
-o-animation: orbit_earth var(--period) linear infinite;
animation: orbit_earth var(--period) linear infinite;
}
#earth-orbit {
--orbit-radius: #or_earth.css;
--planet-radius: #pr_earth.css;
--orbit-thickness: #orbit_thickness.css;
--diameter: calc(2 * var(--orbit-radius) + (var(--planet-radius) - var(--orbit-thickness)) / 2);
right: #solposx.css;
bottom: #solposy.css;
transform: translate(#or_earth.css, #or_earth.css);
width: var(--diameter);
height: var(--diameter);
border: #orbit_thickness.css solid var(--background-alt);
}
@-webkit-keyframes orbit_mars {
from { -webkit-transform: rotate(360deg) translateX(#or_mars.css) rotate(360deg); }
to { -webkit-transform: rotate(0deg) translateX(#or_mars.css) rotate(0deg); }
}
@-moz-keyframes orbit_mars {
from { -moz-transform: rotate(360deg) translateX(#or_mars.css) rotate(360deg); }
to { -moz-transform: rotate(0deg) translateX(#or_mars.css) rotate(0deg); }
}
@-o-keyframes orbit_mars{
from { -o-transform: rotate(360deg) translateX(#or_mars.css) rotate(360deg); }
to { -o-transform: rotate(0deg) translateX(#or_mars.css) rotate(0deg); }
}
@keyframes orbit_mars {
from { transform: rotate(360deg) translateX(#or_mars.css) rotate(360deg); }
to { transform: rotate(0deg) translateX(#or_mars.css) rotate(0deg); }
}
#mars {
--period: 37.6s;
--radius: #pr_mars.css;
--color: var(--background-alt);
width: var(--radius);
height: var(--radius);
background-color: var(--color);
right: #solposx.css;
bottom: #solposy.css;
-webkit-animation: orbit_mars var(--period) linear infinite;
-moz-animation: orbit_mars var(--period) linear infinite;
-o-animation: orbit_mars var(--period) linear infinite;
animation: orbit_mars var(--period) linear infinite;
}
#mars-orbit {
--orbit-radius: #or_mars.css;
--planet-radius: #pr_mars.css;
--orbit-thickness: #orbit_thickness.css;
--diameter: calc(2 * var(--orbit-radius) + (var(--planet-radius) - var(--orbit-thickness)) / 2);
right: #solposx.css;
bottom: #solposy.css;
transform: translate(#or_mars.css, #or_mars.css);
width: var(--diameter);
height: var(--diameter);
border: #orbit_thickness.css solid var(--background-alt);
}

View File

@ -1 +0,0 @@
30px

View File

@ -1 +0,0 @@
30px

View File

@ -1 +0,0 @@
30px

View File

@ -1 +0,0 @@
30px

View File

@ -1,25 +0,0 @@
.socials {
position: absolute;
background-color:var(--background);
bottom: 1.6em;
}
.socials i {
font-size: 2.0em;
padding-right: .1em;
color: var(--foreground-inactive);
transition: color 0.3s;
}
.socials i:hover {
color: var(--accent);
}
.socials a {
text-decoration: none;
transition: color 0.3s;
}

View File

@ -1 +0,0 @@
0

View File

@ -1 +0,0 @@
0

View File

@ -1,25 +0,0 @@
.title {
font-size: 1em;
}
.title h1 {
font-size: 1.4em;
padding-bottom: 0;
margin-bottom:0;
margin-top:0;
}
.title a {
transition: all 0.1s ease-in;
color: var(--foreground-active);
}
.title a:hover {
color: var(--accent);
transform: translateY(50%);
}
.pageTitle {
margin-left: -0.15em;
color: var(--foreground-inactive);
}

View File

@ -6,6 +6,7 @@
<meta name="keywords" content="Cat Flynn, Ktyl, Portfolio, Showreel, Blog, Gallery"/> <!-- blog, gallery --> <meta name="keywords" content="Cat Flynn, Ktyl, Portfolio, Showreel, Blog, Gallery"/> <!-- blog, gallery -->
<link rel="canonical" href="https://ktyl.dev/"> <link rel="canonical" href="https://ktyl.dev/">
<link rel="stylesheet" href="styles.css" /> <link rel="stylesheet" href="styles.css" />
<link rel="icon" type="image/x-icon" href="favicon.ico" />
<script src="https://kit.fontawesome.com/ad50bb2e16.js" crossorigin="anonymous"></script> <script src="https://kit.fontawesome.com/ad50bb2e16.js" crossorigin="anonymous"></script>
<!-- <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script> --> <!-- <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script> -->

View File

@ -1,6 +1,5 @@
<ul class="nav-links"> <ul class="nav-links">
<li><a href="/about.html">about</a></li>
<li><a href="/blog.html">blog</a></li> <li><a href="/blog.html">blog</a></li>
<li><a href="/gallery.html">gallery</a></li> <li><a href="/gallery.html">gallery</a></li>
<li><a href="/garden/index.html">garden</a></li> <li><a href="/vn/books.html">vn</a></li>
</ul> </ul>

View File

@ -1,62 +0,0 @@
<!doctype html>
<html>
#include header.html
<body>
<title>ktyl ~ about</title>
<div class="nav">
#include titlestart.html
/about
#include titleend.html
#include nav.html
#include socials.html
</div>
<div class="page">
<div class="pfp">
<img src="pfp.jpg"></img>
</div>
<h1>Hi, I'm Cat</h1>
<div class="text-panel">
<p>
I am an engineer/artist exploring human technology.
</p>
<div class="separator"></div>
<p>
In my day job I find novel uses for interactive, immersive and games technology for training and simulation.
I am passionate about free and open source software, and the importance of developing tools that serve everyone.
</p>
<p>
I tinker for fun and when I can, make things inspired by physics, the universe and boundaries, physical, imagined or otherwise.
I am currently most enamoured by optics, orbital mechanics and relativity.
</p>
<p>
Besides computing, I like caring for my plants, photography, and studying language, culture and philosophy.
I explore fashion, makeup, gender expression and regularly see live music.
</p>
<div class="separator"></div>
<p>
For inquiries, professional or otherwise, please <a href="mailto:me@ktyl.dev">send me an email</a>!
</p>
</div>
</div>
#include planets.html
</body>
</html>

View File

@ -1,17 +0,0 @@
<!doctype html>
<html>
#include header.html
<body>
#include titlestart.html
/contact
#include titleend.html
#include sidebar.html
#include planets.html
</body>
</html>

View File

@ -2,6 +2,10 @@
:root { :root {
--title-height: min(20vmin, 90px); --title-height: min(20vmin, 90px);
--orbit-thickness: 0.2em;
--sol-pos-x: 0;
--sol-pos-y: 0;
} }
body { body {
font-family: sans-serif; font-family: sans-serif;
@ -10,12 +14,445 @@ body {
background-color: var(--background); background-color: var(--background);
} }
#include title.css .title {
#include nav.css font-size: 1em;
#include page.css }
#include landing.css
#include blog.css .title h1 {
#include about.css font-size: 1.4em;
padding-bottom: 0;
margin-bottom:0;
margin-top:0;
}
.title a {
transition: all 0.1s ease-in;
color: var(--foreground-active);
}
.title a:hover {
color: var(--accent);
transform: translateY(50%);
}
.pageTitle {
margin-left: -0.15em;
color: var(--foreground-inactive);
}
.nav {
position: fixed;
width: max(11vmax, 200px);
top: 0;
bottom:0;
padding-top: 2em;
padding-left: 2em;
background-color: var(--background);
color: var(--foreground);
}
.nav-links {
position: relative;
padding-top: 2em;
padding-bottom: 1em;
padding-left:0;
width: 80%;
}
ul.nav-links {
margin-top: 0;
list-style-type: none;
}
.nav .nav-links li {
display: block;
margin-bottom: 0.8em;
}
.nav .nav-links li a {
color: var(--foreground-inactive);
font-size: 1.4em;
display: block;
}
.nav li a::before {
content: "/";
}
.nav li a {
display: block;
padding: 2px;
background-color: var(--clear);
transition: background-color 0.5s;
}
.nav li a:hover {
color: var(--accent);
}
@media only screen and (max-width: 1200px) {
.nav .socials a {
padding: .2em 0;
display: block;
text-align: center;
}
}
@media only screen and (max-width: 1000px) {
.nav {
position: fixed;
width: 100%;
padding: 0;
z-index: 1;
top: 0;
height: 3em;
border-bottom: 3px solid var(--background-alt);
}
.nav .title {
padding-top: .6em;
padding-left: .6em;
height: 2em;
}
.nav .nav-links {
position: absolute;
top: 0;
right: 0;
padding: .6em .6em 0 0;
float: right;
text-align: right;
width: auto;
}
.nav .nav-links li {
display: inline-block;
}
.nav .nav-links li a::before {
content: "";
}
.nav .pageTitle {
display: none;
}
.nav .socials {
position: fixed;
left: .5em;
bottom: .5em;
}
}
@media only screen and (max-width: 700px) {
.nav .socials {
display: none;
}
}
.page {
position: absolute;
width: max(30vmax,500px);
left:50%;
top:0;
padding: 0px 0 50px;
padding-top: 5vh;
transform: translate(-50%, 0);
}
.page .separator {
position: relative;
background-color: var(--foreground-inactive);
width: .35em;
height: .35em;
left: 50%;
border-radius: 100%;
transform: translateX(-50%);
}
.page a {
color: var(--accent);
transition: all 0.1s;
}
.page a:hover {
color: var(--foreground);
}
.page .text-panel {
margin: 0;
margin-left: -1.5em;
padding: .2em 1.3em;
color: var(--foreground-inactive);
font-size: 1.1em;
/*font-weight: bold;*/
line-height: 1.25em;
background-color: var(--background);
border-radius: 1.5em;
width: 100%;
border-color: var(--background-alt);
border-width: 3px;
border-style: solid;
}
.page h1, h2 {
color: var(--foreground-inactive);
font-size: 1.7em;
margin-top: 1.2em;
padding: 0.2em 0.4em;
text-align: center;
}
@media (max-width: 700px) {
.page {
margin-top: 2.5em;
width: 100%;
padding: 0;
overflow: hidden;
}
.page .text-panel p {
padding: 0 .5em;
margin-right: .5em;
}
}
.landing {
margin-top: 10%;
text-align: center;
}
.landing a {
color: var(--foreground-inactive);
font-size: 2em;
transform: translate(0,50%);
transition: all 0.3s;
}
.landing a:hover {
color: var(--accent);
}
.landing ul {
width: 100%;
padding: .5em 0 0;
margin: 0;
}
.landing li a {
position: relative;
font-size: 2.5em;
margin: 0 .2em;
color: var(--foreground-inactive);
}
.landing li a:hover {
transform: translateY(-10%);
color: var(--accent);
}
.landing .socials {
position: relative;
background-color: var(--clear);
top: 1em;
left: auto;
right: auto;
text-align: center;
}
.landing .socials i {
color: var(--foreground-inactive);
padding: 0 .07em;
}
@media only screen and (max-width: 600px) {
.landing.page {
position: fixed;
margin: 0;
padding: 0;
height: 100%;
}
.landing.page .socials {
top: .5em;
bottom: 0;
}
.landing.page .socials i {
font-size: 3em;
}
}
.page .blog {
}
.page .blog h1 {
font-size: 2.5em;
}
.page .blog .para-block {
color: var(--foreground-inactive);
font-size: 1.1em;
line-height: 1.25em;
background-color: var(--background);
border-color: var(--background-alt);
border-width: 3px;
border-radius: 2em;
border-style: solid;
padding: 1.0em 1.5em;
}
.page .blog .text-panel ul li {
display: block;
}
.page .blog .text-panel ul li::before {
content: "• "
}
.page .blog .code-panel {
color: var(--background);
background-color: var(--foreground);
font-size 1.5em;
line-height: 1.3em;
border-color: var(--accent);
border-width: 2px;
border-radius: 2em;
border-style: solid;
padding: 1.0em 2.0em;
margin: 2.5em -4.0em;
overflow: hidden;
}
.page .blog .code-panel pre {
overflow: scroll;
}
.page .blog .code-panel pre::-webkit-scrollbar {
height: 0;
width: 0;
background: transparent;
}
.page .blog p code {
height: 0.8em;
padding: 0.07em 0.25em;
margin: 0 0.1em;
background-color: var(--foreground-inactive);
color: var(--background);
border-radius: .3em;
}
ul.blog-index li {
display: block;
margin: .2em 0;
}
ul.blog-index li a {
color: var(--foreground-inactive);
transition: none;
text-decoration: none;
}
.blog-index li a:hover {
color: var(--accent);
}
.blog-index li a:visited {
color: var(--foreground);
}
.page ul.blog-index li a::before {
content: "• "
}
.blog-index .post-date {
padding-right: 1em;
}
.page .blog .img-panel
{
margin-top: 2em;
margin-bottom: 2em;
}
.page .blog .img-panel img {
position: relative;
width: 120%;
max-width: 100vw;
left: -10%;
border-radius: 2em;
}
@media only screen and (max-width: 700px) {
.page .blog .code-panel {
padding: 1.0em 5.0em;
}
.page .blog .img-panel img {
width: 100%;
left: 0;
border-radius: 0;
}
}
.pfp {
position: relative;
top: 3em;
left: 50%;
width: 20em;
height: 20em;
text-align: center;
overflow: hidden;
border-color: var(--background-alt);
border-style: solid;
border-width: 3px;
border-radius: 50%;
transform: translate(-50%, 0);
margin-bottom: 4em;
}
.pfp img {
position: absolute;
left: 50%;
top: 50%;
height: 100%;
width: auto;
transform: translate(-50%, -50%);
}
li { li {
display:inline; display:inline;
@ -31,7 +468,382 @@ a {
margin-bottom: 2em; margin-bottom: 2em;
} }
#include socials.css .socials {
#include gallery.css position: absolute;
#include planets.css
#include footer.css background-color:var(--background);
bottom: 1.6em;
}
.socials i {
font-size: 2.0em;
padding-right: .1em;
color: var(--foreground-inactive);
transition: color 0.3s;
}
.socials i:hover {
color: var(--accent);
}
.socials a {
text-decoration: none;
transition: color 0.3s;
}
.page.portfolio {
padding-top: 0;
width: 50%;
margin-left:auto;
margin-right:auto;
transform: translate(-50%,0);
}
.portfolio p {
margin: 1.2em 0 2em;
text-align: center;
border-style: none;
background-color: var(--clear);
}
.glass {
padding: 0.4em 0.6em;
color: var(--foreground-inactive);
background-color: var(--background);
opacity:0.9;
border-style:solid;
border-radius:2em;
border-color:var(--clear);
}
/* gallery img */
.wrapper {
margin-top: 1em;
width: 100%;
height: 100%;
display: grid;
grid-template-columns: 1fr 1fr 1fr;
}
.wrapper .imgHolder {
position: relative;
width: 100%;
height: 100%;
}
.wrapper img {
pointer-events: none;
box-sizing: border-box;
width: 100%;
height: 100%;
object-fit: cover;
left: auto;
right: auto;
transition: all 0.2s ease-out;
}
.wrapper .imgHolder span {
position:absolute;
top:100%;
width:100%;
transform: translateY(-50%) scale(0.6);
text-align: center;
opacity: 0;
transition: all 0.3s;
color: var(--accent);
}
.wrapper .imgHolder span p {
padding:0;
margin:0;
opacity: 1;
color: var(--background);
}
.lightTileText {
color: var(--background);
}
.wrapper .imgHolder a {
position: absolute;
top:0;
left:0;
width:100%;
height:100%;
}
@media only screen and (max-width: 600px) {
.page.portfolio {
width: 100%;
}
.wrapper .imgHolder {
overflow: hidden;
}
.wrapper .imgHolder span {
position: absolute;
top:0;
left:0;
width:100%;
height:100%;
transform: none;
}
.icon-link {
display: none;
}
.wrapper .imgHolder span i {
/*display: none;*/
}
}
.planets {
overflow: hidden;
position: fixed;
height: 80vmax;
width: 80vmax;
right: 0;
bottom: 0;
z-index: -1;
/*background-color: var(--background);*/
background-color: transparent;
}
@media only screen and (max-width: 600px) {
.planets {
height: 200vmax;
width: 200vmax;
transform: scale(0.5) translate(50%, 50%);
}
}
.planet {
position: absolute;
border-radius: 50%;
display: inline-block;
width: var(--radius);
height: var(--radius);
}
.orbit {
position: absolute;
border-radius: 100%;
background-color: transparent;
z-index:-1;
}
:root {
--mercury-orbit-radius: 180px;
--venus-orbit-radius: 320px;
--earth-orbit-radius: 440px;
--mars-orbit-radius: 570px;
--planet-radius: 30px;
}
@-webkit-keyframes orbit_mercury {
from { -webkit-transform: rotate(360deg) translateX(var(--mercury-orbit-radius)) rotate(360deg); }
to { -webkit-transform: rotate(0deg) translateX(var(--mercury-orbit-radius)) rotate(0deg); }
}
@-moz-keyframes orbit_mercury {
from { -moz-transform: rotate(360deg) translateX(var(--mercury-orbit-radius)) rotate(360deg); }
to { -moz-transform: rotate(0deg) translateX(var(--mercury-orbit-radius)) rotate(0deg); }
}
@-o-keyframes orbit_mercury {
from { -o-transform: rotate(360deg) translateX(var(--mercury-orbit-radius)) rotate(360deg); }
to { -o-transform: rotate(0deg) translateX(var(--mercury-orbit-radius)) rotate(0deg); }
}
@keyframes orbit_mercury {
from { transform: rotate(360deg) translateX(var(--mercury-orbit-radius)) rotate(360deg); }
to { transform: rotate(0deg) translateX(var(--mercury-orbit-radius)) rotate(0deg); }
}
#mercury {
--period: 4.82s;
--radius: 30px;
--color: var(--background-alt);
width: var(--radius);
height: var(--radius);
background-color: var(--color);
right: var(--sol-pos-x);
bottom: var(--sol-pos-y);
-webkit-animation: orbit_mercury var(--period) linear infinite;
-moz-animation: orbit_mercury var(--period) linear infinite;
-o-animation: orbit_mercury var(--period) linear infinite;
animation: orbit_mercury var(--period) linear infinite;
}
#mercury-orbit {
--orbit-radius: var(--mercury-orbit-radius);
--diameter: calc(2 * var(--orbit-radius) + (var(--planet-radius) - var(--orbit-thickness)) / 2);
right: var(--sol-pos-x);
bottom: var(--sol-pos-y);
transform: translate(var(--mercury-orbit-radius), var(--mercury-orbit-radius));
width: var(--diameter);
height: var(--diameter);
border: var(--orbit-thickness) solid var(--background-alt);
}
@-webkit-keyframes orbit_venus {
from { -webkit-transform: rotate(360deg) translateX(var(--venus-orbit-radius)) rotate(360deg); }
to { -webkit-transform: rotate(0deg) translateX(var(--venus-orbit-radius)) rotate(0deg); }
}
@-moz-keyframes orbit_venus {
from { -moz-transform: rotate(360deg) translateX(var(--venus-orbit-radius)) rotate(360deg); }
to { -moz-transform: rotate(0deg) translateX(var(--venus-orbit-radius)) rotate(0deg); }
}
@-o-keyframes orbit_venus {
from { -o-transform: rotate(360deg) translateX(var(--venus-orbit-radius)) rotate(360deg); }
to { -o-transform: rotate(0deg) translateX(var(--venus-orbit-radius)) rotate(0deg); }
}
@keyframes orbit_venus {
from { transform: rotate(360deg) translateX(var(--venus-orbit-radius)) rotate(360deg); }
to { transform: rotate(0deg) translateX(var(--venus-orbit-radius)) rotate(0deg); }
}
#venus {
--period: 12.3s;
--color: var(--background-alt);
width: var(--planet-radius);
height: var(--planet-radius);
background-color: var(--color);
right: var(--sol-pos-x);
bottom: var(--sol-pos-y);
-webkit-animation: orbit_venus var(--period) linear infinite;
-moz-animation: orbit_venus var(--period) linear infinite;
-o-animation: orbit_venus var(--period) linear infinite;
animation: orbit_venus var(--period) linear infinite;
}
#venus-orbit {
--diameter: calc(2 * var(--venus-orbit-radius) + (var(--planet-radius) - var(--orbit-thickness)) / 2);
right: var(--sol-pos-x);
bottom: var(--sol-pos-y);
transform: translate(var(--venus-orbit-radius), var(--venus-orbit-radius));
width: var(--diameter);
height: var(--diameter);
border: var(--orbit-thickness) solid var(--background-alt);
}
@-webkit-keyframes orbit_earth {
from { -webkit-transform: rotate(360deg) translateX(var(--earth-orbit-radius)) rotate(360deg); }
to { -webkit-transform: rotate(0deg) translateX(var(--earth-orbit-radius)) rotate(0deg); }
}
@-moz-keyframes orbit_earth {
from { -moz-transform: rotate(360deg) translateX(var(--earth-orbit-radius)) rotate(360deg); }
to { -moz-transform: rotate(0deg) translateX(var(--earth-orbit-radius)) rotate(0deg); }
}
@-o-keyframes orbit_earth {
from { -o-transform: rotate(360deg) translateX(var(--earth-orbit-radius)) rotate(360deg); }
to { -o-transform: rotate(0deg) translateX(var(--earth-orbit-radius)) rotate(0deg); }
}
@keyframes orbit_earth {
from { transform: rotate(360deg) translateX(var(--earth-orbit-radius)) rotate(360deg); }
to { transform: rotate(0deg) translateX(var(--earth-orbit-radius)) rotate(0deg); }
}
#earth {
--period: 20s;
--color: var(--background-alt);
width: var(--planet-radius);
height: var(--planet-radius);
background-color: var(--color);
right: var(--sol-pos-x);
bottom: var(--sol-pos-y);
-webkit-animation: orbit_earth var(--period) linear infinite;
-moz-animation: orbit_earth var(--period) linear infinite;
-o-animation: orbit_earth var(--period) linear infinite;
animation: orbit_earth var(--period) linear infinite;
}
#earth-orbit {
--diameter: calc(2 * var(--earth-orbit-radius) + (var(--planet-radius) - var(--orbit-thickness)) / 2);
right: var(--sol-pos-x);
bottom: var(--sol-pos-y);
transform: translate(var(--earth-orbit-radius), var(--earth-orbit-radius));
width: var(--diameter);
height: var(--diameter);
border: var(--orbit-thickness) solid var(--background-alt);
}
@-webkit-keyframes orbit_mars {
from { -webkit-transform: rotate(360deg) translateX(var(--mars-orbit-radius)) rotate(360deg); }
to { -webkit-transform: rotate(0deg) translateX(var(--mars-orbit-radius)) rotate(0deg); }
}
@-moz-keyframes orbit_mars {
from { -moz-transform: rotate(360deg) translateX(var(--mars-orbit-radius)) rotate(360deg); }
to { -moz-transform: rotate(0deg) translateX(var(--mars-orbit-radius)) rotate(0deg); }
}
@-o-keyframes orbit_mars{
from { -o-transform: rotate(360deg) translateX(var(--mars-orbit-radius)) rotate(360deg); }
to { -o-transform: rotate(0deg) translateX(var(--mars-orbit-radius)) rotate(0deg); }
}
@keyframes orbit_mars {
from { transform: rotate(360deg) translateX(var(--mars-orbit-radius)) rotate(360deg); }
to { transform: rotate(0deg) translateX(var(--mars-orbit-radius)) rotate(0deg); }
}
#mars {
--period: 37.6s;
--color: var(--background-alt);
width: var(--planet-radius);
height: var(--planet-radius);
background-color: var(--color);
right: var(--sol-pos-x);
bottom: var(--sol-pos-y);
-webkit-animation: orbit_mars var(--period) linear infinite;
-moz-animation: orbit_mars var(--period) linear infinite;
-o-animation: orbit_mars var(--period) linear infinite;
animation: orbit_mars var(--period) linear infinite;
}
#mars-orbit {
--diameter: calc(2 * var(--mars-orbit-radius) + (var(--planet-radius) - var(--orbit-thickness)) / 2);
right: var(--sol-pos-x);
bottom: var(--sol-pos-y);
transform: translate(var(--mars-orbit-radius), var(--mars-orbit-radius));
width: var(--diameter);
height: var(--diameter);
border: var(--orbit-thickness) solid var(--background-alt);
}
.footer {
position: relative;
}
.footer span {
position: absolute;
left: 50%;
transform: translate(-50%, 0);
color: var(--foreground-inactive);
padding: 2em;
}

24
src/vn/books.html Normal file
View File

@ -0,0 +1,24 @@
<head>
<meta charset="UTF-8"/>
<link rel="stylesheet" href="styles.css" />
</head>
<html>
<body onload="advance()">
<div class="column">
<div class=img-container>
<img id="portrait" src="img/frog.png"></img>
</div>
<div class="text-box">
<p id="text-box-content">SET_DIALOGUE_TEXT</p>
</div>
<div id="button" onclick="advance()">
<a id="button-text" class="centre" href="#">SET_BUTTON_TEXT</a>
</div>
</div>
</body>
</html>
<script src="main.js"></script>

BIN
src/vn/img/angry0.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 235 KiB

BIN
src/vn/img/angry1.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 169 KiB

BIN
src/vn/img/angry2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 94 KiB

BIN
src/vn/img/angry3.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 251 KiB

BIN
src/vn/img/apologetic.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 106 KiB

BIN
src/vn/img/asleep.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 155 KiB

BIN
src/vn/img/blast.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 135 KiB

BIN
src/vn/img/books-colour.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 107 KiB

BIN
src/vn/img/books-messy.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB

BIN
src/vn/img/books-size.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 47 KiB

BIN
src/vn/img/bookworm.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 174 KiB

BIN
src/vn/img/calm.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 60 KiB

BIN
src/vn/img/cat.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 109 KiB

BIN
src/vn/img/chillin0.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 164 KiB

BIN
src/vn/img/chillin1.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 79 KiB

BIN
src/vn/img/chillin2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 255 KiB

BIN
src/vn/img/coffee.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 98 KiB

BIN
src/vn/img/confident.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 133 KiB

BIN
src/vn/img/dance.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 198 KiB

BIN
src/vn/img/derp.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 53 KiB

BIN
src/vn/img/derp.png_ Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 237 KiB

BIN
src/vn/img/determined.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 134 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 149 KiB

BIN
src/vn/img/disappoint.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 66 KiB

BIN
src/vn/img/dreamer0.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 132 KiB

BIN
src/vn/img/excited.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 120 KiB

BIN
src/vn/img/fixin-time.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 146 KiB

BIN
src/vn/img/foood.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 374 KiB

BIN
src/vn/img/frog.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 55 KiB

BIN
src/vn/img/gah.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 139 KiB

BIN
src/vn/img/gendo.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 138 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 229 KiB

BIN
src/vn/img/goofy.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 163 KiB

BIN
src/vn/img/grin.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 173 KiB

BIN
src/vn/img/hii.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 90 KiB

BIN
src/vn/img/hmph.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 190 KiB

BIN
src/vn/img/hopeful.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 170 KiB

BIN
src/vn/img/huh.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 134 KiB

BIN
src/vn/img/kt/angry0.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 235 KiB

BIN
src/vn/img/kt/angry1.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 169 KiB

BIN
src/vn/img/kt/angry2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 94 KiB

BIN
src/vn/img/kt/angry3.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 251 KiB

BIN
src/vn/img/kt/angry4.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 220 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 106 KiB

BIN
src/vn/img/kt/asleep.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 155 KiB

BIN
src/vn/img/kt/blast.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 135 KiB

BIN
src/vn/img/kt/bookworm.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 174 KiB

BIN
src/vn/img/kt/buzzcut.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 432 KiB

BIN
src/vn/img/kt/calm.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 60 KiB

BIN
src/vn/img/kt/chillin0.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 164 KiB

BIN
src/vn/img/kt/chillin1.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 79 KiB

BIN
src/vn/img/kt/chillin2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 255 KiB

BIN
src/vn/img/kt/coffee.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 98 KiB

BIN
src/vn/img/kt/confident.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 133 KiB

BIN
src/vn/img/kt/dance.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 198 KiB

BIN
src/vn/img/kt/derp0.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 53 KiB

Some files were not shown because too many files have changed in this diff Show More