Compare commits
10 Commits
a9910337ad
...
c10b765903
Author | SHA1 | Date | |
---|---|---|---|
|
c10b765903 | ||
ff4602ec71 | |||
cfb82735b1 | |||
00a26e4750 | |||
8e26ac53bf | |||
28842a12a7 | |||
1614b572c6 | |||
804b912e88 | |||
328d5412cc | |||
22ac56fa92 |
3
.gitmodules
vendored
Normal file
@ -0,0 +1,3 @@
|
||||
[submodule "themes/gokarna"]
|
||||
path = themes/gokarna
|
||||
url = https://github.com/gokarna-theme/gokarna-hugo.git
|
77
config.toml
Normal file
@ -0,0 +1,77 @@
|
||||
baseURL= "https://fosscat.com/"
|
||||
defaultContentLanguage = "en-us"
|
||||
title = "Foss Cat"
|
||||
theme = "gokarna"
|
||||
enableRobotsTXT= true
|
||||
enableEmoji = true
|
||||
# code highlighting style
|
||||
pygmentsStyle = "catppuccin-frappe"
|
||||
|
||||
[params]
|
||||
accentColor = "#715483"
|
||||
socialIcons = [
|
||||
{name = "gitea", url = "https://git.fosscat.com/n8r"},
|
||||
{name = "twitch", url = "https://twitch.tv/fosscat"},
|
||||
{name = "youtube", url = ""},
|
||||
{name = "rss", url = "https://fosscat.com/index.xml"},
|
||||
]
|
||||
# <link> tags for favicon support
|
||||
customHeadHTML = '''
|
||||
<link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png">
|
||||
<link rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png">
|
||||
<link rel="icon" type="image/png" sizes="16x16" href="/favicon-16x16.png">
|
||||
<link rel="manifest" href="/site.webmanifest">
|
||||
<script>console.log("Custom script")</script>
|
||||
<!-- <script src="/js/custom.js"></script> -->
|
||||
''' # Import file from `static/`
|
||||
# customFooterHTML = '<p>foot123</p>'
|
||||
togglePreviousAndNextButtons = "false"
|
||||
avatarUrl = "/images/fosscat_icon.png"
|
||||
avatarSize = "size-s"
|
||||
numberPostsOnHomePage = 5
|
||||
showPostsOnHomePage = "recent" # "popular"
|
||||
|
||||
[params.meta]
|
||||
favicon = true
|
||||
svg = false
|
||||
|
||||
# Show table of contents
|
||||
[markup]
|
||||
[markup.tableOfContents]
|
||||
startLevel = 1
|
||||
endLevel = 3
|
||||
ordered = false
|
||||
|
||||
[menu]
|
||||
[[menu.main]]
|
||||
name = "Home"
|
||||
url = "/"
|
||||
weight = 1
|
||||
[[menu.main]]
|
||||
name = "Projects"
|
||||
url = "/projects/"
|
||||
weight = 2
|
||||
[[menu.main]]
|
||||
name = "Posts"
|
||||
url = "/posts/"
|
||||
weight = 3
|
||||
[[menu.main]]
|
||||
name = "Tags"
|
||||
url= "/tags/"
|
||||
weight= 4
|
||||
[[menu.main]]
|
||||
identifier = "Gitea"
|
||||
url = "https://git.fosscat.com/n8r/fosscat-site"
|
||||
weight = 5
|
||||
# Add Icon
|
||||
pre = "<span data-feather='code'></span>"
|
||||
[[menu.main]]
|
||||
identifier = "RSS"
|
||||
url = "https://fosscat.com/index.xml"
|
||||
weight = 6
|
||||
# Add Icon
|
||||
pre = "<span data-feather='rss'></span>"
|
||||
|
||||
# Enable raw HTML
|
||||
[markup.goldmark.renderer]
|
||||
unsafe= true
|
59
config.yml
@ -1,59 +0,0 @@
|
||||
baseURL: http://fosscat.com/
|
||||
languageCode: en-us
|
||||
title: Foss Cat
|
||||
theme: "PaperMod"
|
||||
params:
|
||||
env: production
|
||||
defaultTheme: dark
|
||||
homeInfoParams:
|
||||
Title: Hello weary traveler
|
||||
Content: This is my personal blog. I write about open source, technology, philosophy, digital privacy, and whatever else is pressing on my mind. Feel free to reach out over email, tom@fosscat.com
|
||||
ShowShareButtons: false
|
||||
ShowReadingTime: true
|
||||
ShowToc: true # Table of Contents
|
||||
ShowBreadCrumbs: true
|
||||
ShowCodeCopyButtons: true
|
||||
ShowPostNavLinks: true
|
||||
author: Tom Cat
|
||||
fuseOpts: # This modifies search params
|
||||
isCaseSensitive: false
|
||||
shouldSort: true
|
||||
location: 0
|
||||
distance: 1000
|
||||
threshold: 0.4
|
||||
minMatchCharLength: 2
|
||||
keys: ["title", "permalink", "summary", "tags", "content"]
|
||||
assets:
|
||||
disableHLJS: true
|
||||
cover:
|
||||
responsiveImages: true # disable to speed up build times at cost of responsive sizes
|
||||
editPost:
|
||||
URL: "https://gitlab.com/foss-cat/hugo-site/-/blob/main/content/"
|
||||
Text: "Suggest Changes" # edit text
|
||||
appendFilePath: true # to append file path to Edit link
|
||||
enableEmoji: true
|
||||
outputs:
|
||||
home:
|
||||
- HTML
|
||||
- RSS
|
||||
- JSON
|
||||
menu:
|
||||
main:
|
||||
- identifier: search
|
||||
name: search
|
||||
url: /search/
|
||||
weight: 1
|
||||
- identifier: tags
|
||||
name: tags
|
||||
url: /tags/
|
||||
weight: 2
|
||||
taxonomies:
|
||||
tag: tags
|
||||
markup:
|
||||
highlight:
|
||||
tabWidth: 2
|
||||
codeFences: true
|
||||
guessSyntax: true
|
||||
lineNos: false
|
||||
noClasses: false
|
||||
style: dracula
|
3
content/index-about.md
Normal file
@ -0,0 +1,3 @@
|
||||
## Hello Weary Traveler
|
||||
|
||||
Took alot of effort to fetch those bytes, hope I have something here worth your while.
|
153
content/posts/hosting-mumble-on-a-subdomain-with-nginx.md
Normal file
@ -0,0 +1,153 @@
|
||||
---
|
||||
title: "Hosting Mumble on a Subdomain with Nginx"
|
||||
date: 2024-01-04T10:04:57-07:00
|
||||
description: 'How to host a mumble server on a subdomain behind nginx reverse proxy'
|
||||
tags: ["nginx"]
|
||||
showTableOfContents: true
|
||||
image: "/images/nginx-mumble.png"
|
||||
weight: 1
|
||||
type: "post"
|
||||
---
|
||||
|
||||
# All I Found Was Tumble Weeds
|
||||
|
||||
Well I couldn't find any actual examples of someone doing what I wanted, namely, hosting
|
||||
the murmur server on a subdomain on my machine behind an nginx proxy. I only have ports 80
|
||||
and 443 opened on my router, so I chose to recieve the mumble traffic to come in on port 443.
|
||||
Sounds easy enough, but the problem comes when you let nginx decrypt the packets in the process
|
||||
of passing them to the murmur server, it raises a TLS/SSL Termination Error. Murmur insists on
|
||||
End to End Encryption (E2EE), which is a good thing.
|
||||
|
||||
To not repeat the classic Cooking Recipe website mistake and put the solution at the bottom of
|
||||
an Ad riddled page, here is the nginx config that got my setup working, all of this is the default
|
||||
on an Arch Linux install, minus the `stream` block. Ports need to be defined for your setup for
|
||||
`INTERNAL_MUMBLE_PORT` (port that murmur is listening on) and `NEW_NGINX_SSL_PORT`. Previously,
|
||||
`NEW_NGINX_SSL_PORT` was 443, but the stream block now will be using 443, and you can't bind to the same
|
||||
port with seperate services. So pick a new port for the other ssl nginx services to listen on,
|
||||
as well as pass traffic to, internally.
|
||||
|
||||
`nginx.conf`
|
||||
|
||||
```conf
|
||||
worker_processes 4;
|
||||
|
||||
events {
|
||||
worker_connections 1024;
|
||||
}
|
||||
|
||||
stream {
|
||||
# Define upstreams that nginx can route traffic to
|
||||
upstream mumble {
|
||||
server localhost:<INTERNAL_MUMBLE_PORT>;
|
||||
}
|
||||
|
||||
upstream fosscat {
|
||||
server localhost:<NEW_NGINX_SSL_PORT>; # Was 443 until I added murmur
|
||||
}
|
||||
|
||||
# SNI, route to murmur if the subdomain matches
|
||||
map $ssl_preread_server_name $name {
|
||||
# Destination Upstream (above) to Route traffic to
|
||||
mumble.fosscat.com mumble;
|
||||
default fosscat;
|
||||
}
|
||||
|
||||
server {
|
||||
# TCP traffic
|
||||
listen 443;
|
||||
# UDP traffic
|
||||
listen 443 udp;
|
||||
proxy_pass $name;
|
||||
# Necessary line
|
||||
# Dont decrypt packets, just pass them along
|
||||
ssl_preread on;
|
||||
}
|
||||
}
|
||||
|
||||
http {
|
||||
include mime.types;
|
||||
include /etc/nginx/sites-enabled/*;
|
||||
default_type application/octet-stream;
|
||||
|
||||
sendfile on;
|
||||
keepalive_timeout 65;
|
||||
|
||||
server {
|
||||
listen 80;
|
||||
server_name localhost;
|
||||
|
||||
location / {
|
||||
root /usr/share/nginx/html;
|
||||
index index.html index.htm;
|
||||
}
|
||||
|
||||
error_page 500 502 503 504 /50x.html;
|
||||
location = /50x.html {
|
||||
root /usr/share/nginx/html;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
```
|
||||
|
||||
Then here is this blog's nginx config file in `/etc/nginx/sites-available` that is sim-linked
|
||||
into `/etc/nginx/sites-enabled`. I'm using certbot for ssl certs. Note that a port needs to be
|
||||
provided in the second server block that matches the one provided above.
|
||||
|
||||
`fosscat.com` file:
|
||||
|
||||
```conf
|
||||
server {
|
||||
if ($host = www.fosscat.com) {
|
||||
return 301 https://$host$request_uri;
|
||||
} # managed by Certbot
|
||||
|
||||
|
||||
if ($host = fosscat.com) {
|
||||
return 301 https://$host$request_uri;
|
||||
} # managed by Certbot
|
||||
|
||||
|
||||
listen 80;
|
||||
server_name fosscat.com www.fosscat.com;
|
||||
|
||||
}
|
||||
|
||||
server {
|
||||
listen <NEW_NGINX_SSL_PORT> ssl;
|
||||
server_name fosscat.com www.fosscat.com;
|
||||
ssl_certificate /etc/letsencrypt/live/fosscat.com/fullchain.pem; # managed by Certbot
|
||||
ssl_certificate_key /etc/letsencrypt/live/fosscat.com/privkey.pem; # managed by Certbot
|
||||
|
||||
root /usr/share/nginx/html/fosscat-site/public/; #Absolute path to where your hugo site is
|
||||
index index.html; # Hugo generates HTML
|
||||
|
||||
location / {
|
||||
root /usr/share/nginx/html/fosscat-site/public;
|
||||
try_files $uri $uri/ =404;
|
||||
}
|
||||
|
||||
error_page 404 /404.html;
|
||||
location = /404.html {
|
||||
root /usr/share/nginx/html/fosscat-site/public;
|
||||
internal;
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## Caveats
|
||||
|
||||
I figured this setup out cobbling together some sparse posts online, the nginx docs, and asking chatGPT for
|
||||
explanations.
|
||||
|
||||
Currently, all of my sites and services work as expected with TLS and whatnot, however the murmur server doesn't
|
||||
report as being online to clients before they connect. Also, the mumble client reports that only TLS is supported
|
||||
so it switches to TLS only mode automatically, i.e. increased latency. I'm not sure why either of these are the case.
|
||||
|
||||
To use the `stream` block and `ssl_preread` you have to have your nginx compiled with those options. Running `nginx -V`
|
||||
should tell you whether you have a compatible nginx version.
|
||||
|
||||
Thought I'd share my discovery in case anyone else runs into the same problem I did.
|
||||
|
||||
As always, questions or corrections, feel free to open a PR on my git instance or email me @ tom@fosscat.com
|
||||
|
@ -1,16 +1,12 @@
|
||||
---
|
||||
title: "How I Made This Site"
|
||||
date: 2022-08-31T20:38:09-06:00
|
||||
draft: false
|
||||
searchHidden: false
|
||||
tags: ['self host', 'raspberry pi']
|
||||
summary: 'I talk about how the "cloud" works, and show how one can host a site on the internet'
|
||||
tocOpen: true
|
||||
cover:
|
||||
image: "/images/ocean-aerial.jpg"
|
||||
alt: ""
|
||||
caption: "The ocean, like my mind, is really big"
|
||||
relative: false
|
||||
description: 'I talk about how the "cloud" works, and show how one can host a site on the internet'
|
||||
type: "post"
|
||||
image: "/images/ocean-aerial.jpg"
|
||||
showTableOfContents: true
|
||||
weight: 1
|
||||
---
|
||||
|
||||
I've dreamed of this day but never imagined I'd actually think I've got ideas mature enough to do it. Turns out, kids can have good ideas too once in a while.
|
||||
|
20
content/posts/in_defense_of_privacy.md
Normal file
@ -0,0 +1,20 @@
|
||||
---
|
||||
title: "In_defense_of_privacy"
|
||||
date: 2023-08-17T22:26:23-06:00
|
||||
draft: true
|
||||
tags:
|
||||
summary:
|
||||
tocOpen: true
|
||||
cover:
|
||||
image: "/images/img.jpg"
|
||||
# can also paste direct link from external site
|
||||
# ex. https://i.ibb.co/K0HVPBd/paper-mod-profilemode.png
|
||||
alt: ""
|
||||
caption: ""
|
||||
relative: false
|
||||
---
|
||||
|
||||
|
||||
https://www.bleepingcomputer.com/news/security/new-acoustic-attack-steals-data-from-keystrokes-with-95-percent-accuracy/
|
||||
|
||||
|
@ -1,16 +1,12 @@
|
||||
---
|
||||
title: "Japan 1 Arrival"
|
||||
title: "Japan: Arrival"
|
||||
date: 2022-11-18T14:31:04-07:00
|
||||
draft: false
|
||||
tags: ['travel', 'japan']
|
||||
searchHidden: false
|
||||
summary: 'We arrived to Tokyo, experienced some of the city as we found our way to our hotel for the night.'
|
||||
tocOpen: true
|
||||
cover:
|
||||
image: "/images/japan-arrival.JPG"
|
||||
alt: ""
|
||||
caption: "The land of the rising sun greeted us with a setting one."
|
||||
relative: false
|
||||
description: 'We arrived to Tokyo, experienced some of the city as we found our way to our hotel for the night.'
|
||||
showTableOfContents: true
|
||||
image: "/images/japan-arrival.JPG"
|
||||
weight: 1
|
||||
type: "post"
|
||||
---
|
||||
|
||||
# We Made It
|
||||
@ -33,4 +29,4 @@ Of course the first thing we had to do was shop! The city is filled with conbini
|
||||
|
||||

|
||||
|
||||
We saw a 6 story McDonalds on our way to the hotel so we satisfied our cravings there then went to a store called UNIQLO. Everything is so clean here, people have been really kind, and they even laugh when I say "konichiwa" (I won't read into why, feels better to assume my humor is bilingual). After about an hour of shopping we headed back to our room. We hit the sac around 9 and sleep caught us faster than we hoped.
|
||||
We saw a 6 story McDonalds on our way to the hotel so we satisfied our cravings there then went to a store called UNIQLO. Everything is so clean here, people have been really kind, and they even laugh when I say "konichiwa" (I won't read into why, feels better to assume my humor is bilingual). After about an hour of shopping we headed back to our room. We hit the sac around 9 and sleep caught us faster than we hoped.
|
||||
|
@ -1,15 +1,11 @@
|
||||
---
|
||||
title: "Japan 2 Cats"
|
||||
title: "Japan: Cats"
|
||||
date: 2022-11-20T01:00:59-07:00
|
||||
draft: false
|
||||
tags: ['japan', 'travel', 'cats']
|
||||
summary: 'Our second day was full of cats, visiting Nippori and walking down the "shotengai", or the main shopping street.'
|
||||
tocOpen: true
|
||||
cover:
|
||||
image: "/images/japan-nippori-walk.JPG"
|
||||
alt: ""
|
||||
caption: "Walking through Niporri's shotenga"
|
||||
relative: false
|
||||
description: 'Our second day was full of cats, visiting Nippori and walking down the "shotengai", or the main shopping street.'
|
||||
type: "post"
|
||||
showTableOfContents: true
|
||||
image: "/images/japan-nippori-walk.JPG"
|
||||
---
|
||||
|
||||
# Japan is Fond of Their Cats
|
||||
@ -47,4 +43,4 @@ I think there will be a number of things I will learn over the course of this tr
|
||||
|
||||
- Coming from the U.S., managing water and trash is difficult at first. There are many conbinis (convenience stores) that sell water bottles, and inside you can find trash cans. There aren't really any other convenient ways to fill water or toss trash.
|
||||
|
||||
- Steering wheels are on the right side, so everything is reversed. Mostly this just means people will pass you on the sidewalk on the left side, and it makes for lots of _you and the person walking toward you both move to the right, then it gets awkward_ moments.
|
||||
- Steering wheels are on the right side, so everything is reversed. Mostly this just means people will pass you on the sidewalk on the left side, and it makes for lots of _you and the person walking toward you both move to the right, then it gets awkward_ moments.
|
||||
|
@ -1,19 +0,0 @@
|
||||
---
|
||||
title: "Japan 3 Capitalism - WIP"
|
||||
date: 2022-11-20T04:33:54-07:00
|
||||
draft: false
|
||||
tags: ['japan', 'travel']
|
||||
summary: 'For our third day in Tokyo, we shopped til we dropped'
|
||||
tocOpen: true
|
||||
cover:
|
||||
image: "/images/japan-shopping.JPG"
|
||||
# can also paste direct link from external site
|
||||
# ex. https://i.ibb.co/K0HVPBd/paper-mod-profilemode.png
|
||||
alt: ""
|
||||
caption: "In the heart of Shinjuku, the number of shops is overwhelming. Well, maybe for a novice **smirk*"
|
||||
relative: false
|
||||
---
|
||||
|
||||
# Hold on
|
||||
|
||||
I have this post half written, we are going to be on a long train ride today so I'll finish this one up then.
|
@ -1,17 +1,12 @@
|
||||
---
|
||||
title: "Japan 4 Hospitality"
|
||||
title: "Japan: Hospitality"
|
||||
date: 2022-11-21T05:19:38-07:00
|
||||
draft: false
|
||||
tags: ['japan', 'travel', 'culture', 'politics']
|
||||
summary: 'We packed up from Shinjuku and headed to a small town near the base of Mount Fuji and experienced the generosity and kindness of an old man there.'
|
||||
tocOpen: true
|
||||
cover:
|
||||
image: "/images/japan-fuji.JPG"
|
||||
# can also paste direct link from external site
|
||||
# ex. https://i.ibb.co/K0HVPBd/paper-mod-profilemode.png
|
||||
alt: ""
|
||||
caption: "Mount Fuji view from Lake Kawaguchi"
|
||||
relative: false
|
||||
tags: ['travel', 'japan']
|
||||
description: 'We packed up from Shinjuku and headed to a small town near the base of Mount Fuji and experienced the generosity and kindness of an old man there.'
|
||||
showTableOfContents: true
|
||||
image: "/images/japan-fuji.JPG"
|
||||
weight: 1
|
||||
type: "post"
|
||||
---
|
||||
|
||||
# Japan's Hospitality
|
||||
@ -46,4 +41,4 @@ Our host was greatly amused at our noodle cup dinner. He heated up some water fo
|
||||
|
||||

|
||||
|
||||
His house is off-grid with solar panels, with lots of custom wood carpentry, he told us its a hobby of his. He also runs a small cafe out of the house that is all organic, he serves food he grows in his little farm. Its a pretty incredible passion project of his, all in an effort he says to reduce his CO2 emissions, as global warming has increased the size and damage of typhoons to Japan. His eletric car also has a big sticker on it about being in some sort of EV club that I suspect views him as the president. As he showed us the house, he mentioned that we could use his 'onsen' (hot spring / public bath). He shows us into a sauna looking room with a large wooden bath. We happily accepted the offer. We had a wonderfully warm evening after some trekking out in the cold.
|
||||
His house is off-grid with solar panels, with lots of custom wood carpentry, he told us its a hobby of his. He also runs a small cafe out of the house that is all organic, he serves food he grows in his little farm. Its a pretty incredible passion project of his, all in an effort he says to reduce his CO2 emissions, as global warming has increased the size and damage of typhoons to Japan. His eletric car also has a big sticker on it about being in some sort of EV club that I suspect views him as the president. As he showed us the house, he mentioned that we could use his 'onsen' (hot spring / public bath). He shows us into a sauna looking room with a large wooden bath. We happily accepted the offer. We had a wonderfully warm evening after some trekking out in the cold.
|
||||
|
46
content/posts/learning-style.md
Normal file
@ -0,0 +1,46 @@
|
||||
---
|
||||
title: "Learning Style"
|
||||
date: 2022-12-29T15:59:11-07:00
|
||||
description: "I rant about the myth of learning styles"
|
||||
tags: ["thougts", "learning"]
|
||||
showTableOfContents: true
|
||||
weight: 1
|
||||
type: "post"
|
||||
---
|
||||
|
||||
# What's Your Learning Style?
|
||||
|
||||
Hot take warning.
|
||||
|
||||
I think the notion that a person has a preferred learning style is ridiculous.
|
||||
I think it is a learned preference and a widely accepted myth, people learn in
|
||||
all sorts of different ways depending on the subject matter, environment, and age.
|
||||
|
||||
# Why do I care?
|
||||
|
||||
Because, I think its annoying when people bring up their learning preference
|
||||
to say that they are a visual learner. No one ever brings it up to say they
|
||||
have a tactile or auditory learning style. Why? Kinda like how (in my experience)
|
||||
whenever someone feels the need to unsolicitedly claim they have native american
|
||||
ancestry it is always Cherokee. Nothing against the Cherokee nation, its just funny
|
||||
to me that in my experience no one has broken those molds.
|
||||
|
||||
The real bone I have to pick with visual learners is I feel it is used as a crutch
|
||||
to make some claim that they are unable to participate well in school or complete
|
||||
some task because it isn't catered toward their learning style. If anything,
|
||||
today would be the greatest time in the history of the world to be a visual
|
||||
learner. You can give ai somne words and it creates photo-realistic images.
|
||||
Youtube has more content to watch than you could ever get through in your
|
||||
lifetime, 1000's fold. And that's one platform. But visual learners, in my mind,
|
||||
have a close connotation with lazy zoomer tik-tok scrollers who can 'only learn'
|
||||
DIY hacks presented to them in a rapid fire, meme-spliced format. No. Thats
|
||||
learned through your terrible habits. Put your phone down and try to read a good
|
||||
book. Humans have learned through auditory and written means for thousands of
|
||||
years. Now you are gonna tell me there isn't a single auditory or tactile learner
|
||||
that brings up this inconvenience when Mr. Bones turns on Bill Nye the Science Guy?
|
||||
|
||||
To be realistic, this hardly ever happens, but it is irksome to me when it does.
|
||||
|
||||
Turns out [Veritasium](https://www.youtube.com/watch?v=rhgwIhB58PA) made a video
|
||||
about this exact thing. He cites reviewing articles that state "There is no
|
||||
credible evidence that learning styles exist", so there we go. Just an intellect's imaginary invention.
|
36
content/posts/my-first-real-job.md
Normal file
@ -0,0 +1,36 @@
|
||||
---
|
||||
title: "My First Real Job"
|
||||
date: 2022-12-27T00:47:29-07:00
|
||||
description: 'I take a trip down memory lane, explaining how I got my first real job as a developer.'
|
||||
tags: ["$DAY_JOB", "thoughts"]
|
||||
showTableOfContents: true
|
||||
image: "/images/monochrome-path.jpg"
|
||||
weight: 1
|
||||
type: "post"
|
||||
---
|
||||
|
||||
# What's a 'Real' Job?
|
||||
|
||||
Previous to the 'real' job I got, I had worked a handful of other jobs, some were even related to my field of work, computer wizardry. What made this job different from my previous internships and odd-job contract work, was that this job payed a salary, and a pretty good one for taking a "beginner". I thought I would chronicle the experience for other software developers out there curious of what one random anon's experience was like.
|
||||
|
||||
# The Dating Period
|
||||
|
||||
I dropped out of college, just temporarily, to pursue other interests, and also try the job market, to see what I could catch with, what was in my mind, a decent amount of real world experience. I had worked some sort of software developer job for about two years, and had just recently concluded a summer internship. I could have continued at my internship except for the fact that I wasn't offered a full time position, which is a good story for another time. So, with my 2.5 year college education and nearly equal work experience, I ventured onto Indeed and other similar shark sites for poor saps like myself with naive hopes to throw their resume into the abyss. A month or so into my college semester break, I recieved an email from a recruiting agency with an offer for a full time, remote position paying a salaried amount I thought surely wasn't deserving of a college drop out. To sweeten the pot, the job's tech stack mentioned flutter, which I had spent the last year building a handful of apps and had really come to love the framework. I am compelled to add that I really don't like React or Vue, or really Javascript / npm / webpack / css in any form / webdev in general (typescript is the only thing I do like in that space), so building something in Flutter got me really excited. However, it was one of probably 20 emails I got a week spamming my inbox, I really don't know why I was reading this one, and thought surely I wasn't qualified enough for the position. I clicked a link in the email and was brought to a calendar to schedule a zoom call with the recruiter. I wasn't sure this was even legit, and there was a time slot in 15 minutes that a scheduled. I 'showed up' and sure enough, a recruiter on the other side of the internet was waiting for me. We chatted and I walked him through my work experience, no mention of school. He seemed impressed. A few days pass and he connects me with someone from the company, we set up another zoom meeting, more of a 'get to know you'. That call was interesting. I talked with two guys, which are the only two full time devs in the company, and neither of them had really hired anyone before. The questions they asked really weren't technical in nature, but I also couldn't get a read in the slightest what kind of information they were looking for so I could tailor my answers. 15 minutes passed and the lead dev said something like "Alright, well thats all the questions I could think of..." * trails off... Uhhh -- I desperately thought of a question to ask them about the company to buy myself some time to assess what was happening. It seemed to me that this interview had gone poorly, they didn't see my true awesomeness (because their questions weren't really introspective or technical) so I thought of something I could do to rescue this sinking ship. I learned more about the prooduct they are building and what their jobs are like. They seemed to like that. After 40 minutes, we ended the call and I felt a bit more satisfied with that ending. I believe that was on a Monday, and on Thursday they reached out to setup a lunch the next day. Though the company is remote, both devs are located close to me, so we met over lunch the next day. I was told by the recruiter that I would have a more technical portion of the interview, a paid day working in the office with the team to see if I'm a good fit. Heading to lunch, I expected them to congradulate me for a god interview and schedule the 'technical' part, which is probably the most dreaded step of the software engineer aquisition ritual. We had lunch and just got to know each other better, I discovered both of them align pretty closely with my conservative values, which was a nice bonus. Made conversation easy as there is lots to talk about with new acquantances that you discover to have similar passions. At the end of the hour dinner, with no previous mention of the position, the lead dev says "So we both like you, we want you on the team." This came as a bit of a surprise, where was my gauntlet technical obstacle course? But obviously I was thrilled. The dating phase ended as quickly as it began, and with that, I found myself a married to the corporate system.
|
||||
|
||||

|
||||
|
||||
Incoming!! Analogies to life as an rpg with points assigned to various traits that may be more genetic / permanent than I make it seem. Character composition is a little more that just stats, buffs / debuffs, and inventory. But only a little...
|
||||
|
||||
# Advice
|
||||
|
||||
How much luck was involved in this process? How much was my modestly stacked resume? I can't say for certain. From my experience, there are a few things within your control that you can try to develop to incerase your odds in the game. I stress *in your control*. I wager 80% of the time when you aren't hired, but you are qualified, its because of forces completely outside your control, hiring freeze, nepotism, off by one error, lazy hr guy, etc, the list has no end.
|
||||
|
||||
## Emotional intelligence
|
||||
|
||||
During this hiring process, they took alot of my expertise and experience by my word, and I can only assume they did so because it seemed that my word was one they could trust. I think experience is great; lots of experience gives you the confidence to answer questions about previous problems you have solved, but experience isn't all, or possibly even, the majority of what gets you hired. I think alot of it comes down to your interpersonal skills, your charisma stat, how chisled your chin looks. Some of that you can't change easily, I think I was born with an above average emotional intelligence. But, I can't stess enough how important it is that you appear confident but not overbearing, and eager to learn and work. With everything today getting people to get as far away from socializing I R L, not having any grounded confidence in their abilities, I get the sense that a lot of qualified individuals just don't sell themselves enough. Want the job, and convince yourself you would be a great addition to the team.
|
||||
|
||||
## Most Important Trait
|
||||
|
||||
If you could do a character stat reset on yourself and spec everything into one category, I think you should go all in on "Ability / Willingness to Learn". I think the sciency term is brain plasticity. But you don't need to spend 250 drupals to activate the stat reset, I think its a habit of thought, and can be a learned behavior. What do you do when you encounter a problem? Do you google it? What if google has no answers? What if the answer is "Read these 20 pages of docs"? Do you read them? Or do you say you are 'blocked' during stand up and let your team lead or that one guy that solves every mystery get to the bottom of it? If you can teach yourself something by gritting your teeth and stumbling along the way, only to realize your solution is magnitudes slower that its supposed to be, I think you are still leaps ahead of the snooty pampered rich mom's son who has kombucha and white granite counter tops at home to retreat to when he gets too 'whelmed with work. A wise woman said to me that grit is the greatest word in the english language, if you got enough of it, there isn't anything you can't do. Wise words I reckon.
|
||||
|
||||
|
21
content/posts/my-server-got-cryptoad.md
Normal file
@ -0,0 +1,21 @@
|
||||
---
|
||||
title: "My Server Got Cryptoad"
|
||||
date: 2024-01-24T22:05:48-07:00
|
||||
draft: true
|
||||
tags:
|
||||
summary:
|
||||
tocOpen: true
|
||||
cover:
|
||||
image: "/images/img.jpg"
|
||||
# can also paste direct link from external site
|
||||
# ex. https://i.ibb.co/K0HVPBd/paper-mod-profilemode.png
|
||||
alt: ""
|
||||
caption: ""
|
||||
relative: false
|
||||
---
|
||||
|
||||
5 6 * * 0 /var/lib/gitea/.configrc5/a/upd>/dev/null 2>&1
|
||||
@reboot /var/lib/gitea/.configrc5/a/upd>/dev/null 2>&1
|
||||
5 8 * * 0 /var/lib/gitea/.configrc5/b/sync>/dev/null 2>&1
|
||||
@reboot /var/lib/gitea/.configrc5/b/sync>/dev/null 2>&1
|
||||
0 0 */3 * * /tmp/.X2c0-unix/.rsync/c/aptitude>/dev/null 2>&1
|
67
content/posts/the-migration-to-arch.md
Normal file
@ -0,0 +1,67 @@
|
||||
---
|
||||
title: "The Migration to Arch"
|
||||
date: 2023-08-15T02:04:21-06:00
|
||||
description:
|
||||
showTableOfContents: true
|
||||
image: "/images/arch-logo.png"
|
||||
weight: 1
|
||||
type: "post"
|
||||
---
|
||||
|
||||
# I finally did it
|
||||
|
||||
A post after such a long drought. I've been busy working on lots of little projects, and I realized that I really ought to take the time to write on the blog sight
|
||||
I take such pain to keep up and running.
|
||||
|
||||
You might be thinking to yourself, pain? Shouldn't this be like a set and forget sort of ordeal? Well, it would be, except that I tinker too much for my own good.
|
||||
As they say, there are two wolves inside each man, one that craves stable, calm waters, maintainable code, reproducible builds, and the other wants to look under
|
||||
hood, fat finger `rm -rf /` and other monstrosities that I don't care to joke about because they hurt me too much.
|
||||
|
||||
So, I moved off of the Raspberry Pi Zero W2, and on to a much more legitimate pc build. The blog could have run fine on the pi, but it didn't take long for me to
|
||||
feel justified in spending some money on a faster machine. Bought it second hand from a crypto mining rig, swapped out the pentium for a respectable i7 of some
|
||||
recent generation, and I had an upcycled machine ready for some data crunching!
|
||||
|
||||
## The Services
|
||||
|
||||
Eventually, I envision a whole bunch of services running in my 'home lab', as home-labians have taken to calling their piles of processors, but for now, I have a humble three:
|
||||
|
||||
- [fosscat.com](https://fosscat.com):
|
||||
|
||||
The wonderful website you find yourself on currently
|
||||
|
||||
- [git.fosscat.com](https://git.fosscat.com):
|
||||
|
||||
My newly hosted gitea instance to host all of my current and future repos! This was a bugger to setup, but I ended up [figuring out the issues _WRITE ME_](https://fosscat.com/)
|
||||
|
||||
- [sub.fosscat.com](https://sub.fosscat.com):
|
||||
|
||||
I don't want to say what the actual subdomain is (though its probably discoverable) just because the project using it is still WIP, but my wife and built a budget app together, and
|
||||
this machine hosts the REST Api I wrote in Zig.
|
||||
|
||||
## The Alt Timeline with Guix
|
||||
|
||||
Arch Linux was not actually the first OS I put on this new (to me) machine. I had drunk from the FSF goblet and got it in my head to try out
|
||||
[Guix System, or Guix SD,](https://guix.gnu.org/) or whatever its officially called. I recommend checking it out. It was a couple month adventure, but I think my lisp-less mind
|
||||
couldn't handle the parantheses required. It has some really cool concepts similar to NixOS, your whole system (users, installed packages, mount points, etc) is defined in one or
|
||||
more files. Despite its great documentation, it is hard to understand what is going on without some good Guile / Scheme fundamentals, which I lack. So, back to what I know: Arch (btw).
|
||||
|
||||
## What Did I Learn?
|
||||
|
||||
I am not exaggerating that I have completely nuked my machine (server, work and/or personal) many times. But, I've learned a whole lot from it: mostly that I need to
|
||||
setup proper backups as soon as my system is running. So, with this new machine, especially because I am going to start storing all of my code on it, I am following the 3 - 2 - 1 rule:
|
||||
|
||||
- 3: Copies of the data
|
||||
|
||||
- 2: Storage medias (harddrive, usb, ssd, nas)
|
||||
|
||||
- 1: Offsite
|
||||
|
||||
I decided to go with Hetzner's [Storage Box](https://docs.hetzner.com/robot/storage-box) solution for Offsite. And its waaay offsite (for me), the company is located in the EU.
|
||||
But, for only ~$5.00 a month, I get access to a sftp server with 1TB capacity, which mirrors the server's nvme drive running the OS, and then I also am backing the nvme drive up
|
||||
to a HDD drive connected to the computer. I have lots more to say about so many of these things, I spent pretty much all day configuring everything and getting it all to work, but I
|
||||
told myself to prioritize frequency over comprehensiveness, so I will leave it at that.
|
||||
|
||||
Oh! I almost forgot, if you want to use the gitea instance I am running as an alternative to having your code fed to AI models, please email me! Im no enterprise company with infinite
|
||||
backups and resources, but I'd love to share what little I have if it would be useful to you!
|
||||
|
||||
Thanks for stopping in :)
|
36
content/posts/the-view-through-the-airplane-window.md
Normal file
@ -0,0 +1,36 @@
|
||||
---
|
||||
title: "The View through the Airplane Window"
|
||||
date: 2023-11-07T17:34:55-07:00
|
||||
description: "Why do they make me choose a seat? What happens if I don't?"
|
||||
tags: ["travel", "thoughts"]
|
||||
showTableOfContents: true
|
||||
weight: 1
|
||||
type: "post"
|
||||
---
|
||||
|
||||
I fly fairly frequently from where I live now to my hometown. It's a convenient trip because there
|
||||
are two conveniently located mini-boss sized airports close to both places. The (un)fortunate thing
|
||||
about mini-boss sized airports is that they only attract the budget airline offerings. When you
|
||||
purchase flights through these low-spec'd airlines, they try and swindle you by charging you for
|
||||
making choices, like do you want to bring any bags? How about choose a seat to sit in the plane?
|
||||
At first, I thought choosing a seat was part of the fare: these slippery execs won't let me fly unless
|
||||
I have a boarding pass AND a seat ticket! I've learned however, that it is a false choice.
|
||||
|
||||
I take the high (cheap) road and choose nothing, which means they pick a seat for me. Which means I
|
||||
sit above the turbines every flight, my window looks out at the wing.
|
||||
I am led to believe that these mid-range seats are picked
|
||||
least often, so I wonder, why are these seats of no apparent distinguishing quality least often
|
||||
selected by the 'selectors'? If you want seats closer to the front, but dont want to front the bill,
|
||||
you're in luck! Selecting the back of the plane is more expensive than not choosing a seat, and your
|
||||
odds have to be impossibly better that you'll sit closer to the front by abstaining from seat selection.
|
||||
|
||||
But I'm not complaining, nor do I wish people would have different airline decision-making habits.
|
||||
I feel privileged to sit in view of the wing: I watch it move a surprising amount during flights, which
|
||||
could very well be troubling to the anxious or weary traveler, but to me, I find it satisfying. I
|
||||
watch the slightest shift of an aeleron send the whole plane in a calculated, soft roll. I imagine
|
||||
my arm as the wing: extending out the side of the plane. It reminds me of sticking my hand out the
|
||||
window while driving to feel the force of the wind against my palm, turning a once invisible
|
||||
everpresent essence into a carvable, ridable rush of energy. Watching the wing wobble a bit gives
|
||||
the plane a little more mortality, I feel a little more of the rush and terror of flight.
|
||||
|
||||
So thank you, mini-boss C-suite for giving me the view through the window everytime I fly without a seat.
|
58
content/posts/when-easy-going-isnt-easy.md
Normal file
@ -0,0 +1,58 @@
|
||||
---
|
||||
title: "When Easy Going Isnt Easy"
|
||||
date: 2023-09-08T10:02:55-06:00
|
||||
draft: false
|
||||
tags: ['personality', 'mental health', 'advice']
|
||||
summary: 'My people-pleasing brain demands smooth sailing waters, often at the cost of the emotionally sensitive.'
|
||||
tocOpen: true
|
||||
---
|
||||
|
||||
# Easy Doesn't Equal Right
|
||||
|
||||
I was sitting in the train,
|
||||
watching someone across the aisle from me struggle to wrangle their electric scooter under their
|
||||
seat. This person had a stainless steel insulated mug with what appeared to be a warm muddied
|
||||
liquid inside. She placed it in the walkway, but I saw immediatly that the butt of her scooter
|
||||
would shortly bump into the cup with any further scooter-scuffling. So, to avoid a muddy train,
|
||||
I scooped up her mug and held it dutifully until the scooter sorting finished.
|
||||
|
||||
"Thank you" She said.
|
||||
|
||||
Me, wanting to assure her that it was really no inconvenience at all, that she shouldn't have to
|
||||
worry about returning any favors, that it was just the right thing to do, I replied "No problem"
|
||||
|
||||
My brain has a strong people-pleaser mode network; its often the default way I handle social
|
||||
situations. I don't think there is anything wrong with that. But, I do think that its important
|
||||
to be aware of the consequences of how we tend to handle things. This became apparent during a
|
||||
conversation with family members.
|
||||
|
||||
## Family Dynamics
|
||||
|
||||
I will try to find the right words to explain the dynamic here, but my lack of professional
|
||||
psycology training may lead me use incorrect vocabulary, so allow me to start with a blank slate.
|
||||
My family is comprised of mostly emotionally low personalities. By low emotion I dont mean non-feeling
|
||||
I mean behaviors common to people not as empathetic, like speaking before thinking, teasing (in
|
||||
good faith), avoiding confrontation, making positive assumptions of others. However, there are
|
||||
a few emotionally high personalities (I married one, love you ;) ), with behaviors like deeply
|
||||
feeling, not assuming the best intention, thinking before speaking. These aren't necessarily hard lines,
|
||||
and no one is entirely one or the other. Also, I did not illustrate all of the differences, but
|
||||
hopefully enough just to see the big picture. I mostly just want to draw the distinction when it
|
||||
comes to the easy going ethic.
|
||||
|
||||
## Akuna Matada Gas Lighting
|
||||
|
||||
With much of the family exhibiting an air of ease and light-heartedness, it became clear to me that
|
||||
saying "No Worries" can invalidate the very real feelings and reactions of the emotionally high
|
||||
people in the group. For example, I could say something meant in jest, a light jab of some flaw we
|
||||
all recognize. In an emotionally high personality however, this can seem like an attack. Everyone
|
||||
laughs, but for the teased person, their internal defense systems are blairing to elevate to DEFCON 1
|
||||
and fire up the shield generators. On seeing that I have made a mistake, I quickly reverse gears and
|
||||
attempt to extinguish the fire. I reassure the emotionally high
|
||||
person that there isnt any problem to worry about, it was just a tease. This, can inadvertendly tell this wonderful human
|
||||
being that the feelings they are having are unecessary and wrong. I coined this
|
||||
interaction Akuna Matada Gas Lighting, it means no worries, the feelings you have aren't real (goes with the tune even).
|
||||
|
||||
I intend this post mostly for myself, in self reflection and puting my thoughts to words I feel like
|
||||
the things I learn become more concrete. But, if it helps anyone like myself take a deeper introspective
|
||||
look, then thats hopefully good too!
|
||||
|
10
content/projects.md
Normal file
@ -0,0 +1,10 @@
|
||||
---
|
||||
title: "Projects"
|
||||
type: "page"
|
||||
---
|
||||
|
||||
Worked on frequently, updated on occassion.
|
||||
|
||||
- ## [Game in Zig & SDL2 ⚡️](/projects/zig-sdl)
|
||||
- ## [Gaining 15 Pounds in 2025 :muscle:]()
|
||||
- ## [Drones :video_game: :helicopter:]()
|
29
content/projects/zig-sdl.md
Normal file
@ -0,0 +1,29 @@
|
||||
---
|
||||
title: "SDL Game in Zig"
|
||||
image: ""
|
||||
type: "page"
|
||||
---
|
||||
|
||||
# Zig Game Dev with SDL2
|
||||
|
||||
I'm making a game in Zig!
|
||||
|
||||
Watch me stream it [here](https://twitch.tv/fosscat), or below!
|
||||
|
||||
Repo for the project is [here](https://git.fosscat.com/n8r/zsdl)
|
||||
|
||||
<div id="twitch-embed"></div>
|
||||
|
||||
<!-- Load the Twitch embed JavaScript file -->
|
||||
<script src="https://embed.twitch.tv/embed/v1.js"></script>
|
||||
|
||||
<!-- Create a Twitch.Embed object that will render within the "twitch-embed" element -->
|
||||
<script type="text/javascript">
|
||||
new Twitch.Embed("twitch-embed", {
|
||||
width: 854,
|
||||
height: 480,
|
||||
channel: "fosscat",
|
||||
// Only needed if this page is going to be embedded on other websites
|
||||
parent: ["fosscat.com"]
|
||||
});
|
||||
</script>
|
@ -1,8 +0,0 @@
|
||||
---
|
||||
title: "Search"
|
||||
layout: "search" # is necessary
|
||||
# url: "/search-fosscat"
|
||||
# description: "Description for Search"
|
||||
# summary: "search"
|
||||
# placeholder: "How i made this site..."
|
||||
---
|
BIN
static/android-chrome-192x192.png
Normal file
After ![]() (image error) Size: 23 KiB |
BIN
static/android-chrome-512x512.png
Normal file
After ![]() (image error) Size: 92 KiB |
BIN
static/apple-touch-icon.png
Normal file
After ![]() (image error) Size: 21 KiB |
BIN
static/favicon-16x16.png
Normal file
After ![]() (image error) Size: 815 B |
BIN
static/favicon-32x32.png
Normal file
After ![]() (image error) Size: 2.1 KiB |
BIN
static/favicon.ico
Normal file
After Width: 48px | Height: 48px | Size: 15 KiB |
BIN
static/images/arch-logo.png
Normal file
After ![]() (image error) Size: 320 KiB |
BIN
static/images/eagle-wizard.jpg
Normal file
After ![]() (image error) Size: 274 KiB |
BIN
static/images/fosscat_icon.png
Normal file
After ![]() (image error) Size: 240 KiB |
BIN
static/images/monochrome-path.jpg
Normal file
After ![]() (image error) Size: 870 KiB |
BIN
static/images/nginx-mumble.png
Normal file
After ![]() (image error) Size: 121 KiB |
1
static/site.webmanifest
Normal file
@ -0,0 +1 @@
|
||||
{"name":"","short_name":"","icons":[{"src":"/android-chrome-192x192.png","sizes":"192x192","type":"image/png"},{"src":"/android-chrome-512x512.png","sizes":"512x512","type":"image/png"}],"theme_color":"#ffffff","background_color":"#ffffff","display":"standalone"}
|
1
static/svg/icons/gitea.svg
Normal file
@ -0,0 +1 @@
|
||||
<svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><title>Gitea</title><path d="M4.209 4.603c-.247 0-.525.02-.84.088-.333.07-1.28.283-2.054 1.027C-.403 7.25.035 9.685.089 10.052c.065.446.263 1.687 1.21 2.768 1.749 2.141 5.513 2.092 5.513 2.092s.462 1.103 1.168 2.119c.955 1.263 1.936 2.248 2.89 2.367 2.406 0 7.212-.004 7.212-.004s.458.004 1.08-.394c.535-.324 1.013-.893 1.013-.893s.492-.527 1.18-1.73c.21-.37.385-.729.538-1.068 0 0 2.107-4.471 2.107-8.823-.042-1.318-.367-1.55-.443-1.627-.156-.156-.366-.153-.366-.153s-4.475.252-6.792.306c-.508.011-1.012.023-1.512.027v4.474l-.634-.301c0-1.39-.004-4.17-.004-4.17-1.107.016-3.405-.084-3.405-.084s-5.399-.27-5.987-.324c-.187-.011-.401-.032-.648-.032zm.354 1.832h.111s.271 2.269.6 3.597C5.549 11.147 6.22 13 6.22 13s-.996-.119-1.641-.348c-.99-.324-1.409-.714-1.409-.714s-.73-.511-1.096-1.52C1.444 8.73 2.021 7.7 2.021 7.7s.32-.859 1.47-1.145c.395-.106.863-.12 1.072-.12zm8.33 2.554c.26.003.509.127.509.127l.868.422-.529 1.075a.686.686 0 0 0-.614.359.685.685 0 0 0 .072.756l-.939 1.924a.69.69 0 0 0-.66.527.687.687 0 0 0 .347.763.686.686 0 0 0 .867-.206.688.688 0 0 0-.069-.882l.916-1.874a.667.667 0 0 0 .237-.02.657.657 0 0 0 .271-.137 8.826 8.826 0 0 1 1.016.512.761.761 0 0 1 .286.282c.073.21-.073.569-.073.569-.087.29-.702 1.55-.702 1.55a.692.692 0 0 0-.676.477.681.681 0 1 0 1.157-.252c.073-.141.141-.282.214-.431.19-.397.515-1.16.515-1.16.035-.066.218-.394.103-.814-.095-.435-.48-.638-.48-.638-.467-.301-1.116-.58-1.116-.58s0-.156-.042-.27a.688.688 0 0 0-.148-.241l.516-1.062 2.89 1.401s.48.218.583.619c.073.282-.019.534-.069.657-.24.587-2.1 4.317-2.1 4.317s-.232.554-.748.588a1.065 1.065 0 0 1-.393-.045l-.202-.08-4.31-2.1s-.417-.218-.49-.596c-.083-.31.104-.691.104-.691l2.073-4.272s.183-.37.466-.497a.855.855 0 0 1 .35-.077z"/></svg>
|
After (image error) Size: 1.8 KiB |
@ -1,50 +0,0 @@
|
||||
---
|
||||
name: Bug report
|
||||
about: Create a report to help us improve
|
||||
title: "[BUG]"
|
||||
labels: bug
|
||||
assignees: ''
|
||||
|
||||
---
|
||||
|
||||
<!--
|
||||
|
||||
## READ BEFORE OPENING ISSUES
|
||||
|
||||
Please fill the template below
|
||||
- **DO NOT** ask for instructions.
|
||||
- Use Discussions section if you need help
|
||||
- See project wiki https://github.com/adityatelange/hugo-PaperMod/wiki
|
||||
- Read FAQs section https://github.com/adityatelange/hugo-PaperMod/wiki/FAQs
|
||||
- Search for previous issues/ pull requests
|
||||
|
||||
-->
|
||||
|
||||
**Describe the bug**
|
||||
<!-- A clear and concise description of what the bug is. -->
|
||||
|
||||
- Device/Os: [e.g. Android 10]
|
||||
- Type: [e.g. Desktop/Mobile]
|
||||
- Browser and version [e.g. Chrome 86.0]:
|
||||
- Hugo Version [ >=0.83.0 expected]:
|
||||
- Theme Version [e.g. v4.0, master, or commit-id ]:
|
||||
|
||||
**Steps to reproduce the behavior:**
|
||||
<!--
|
||||
1. Go to '...'
|
||||
2. Click on '....'
|
||||
3. Scroll down to '....'
|
||||
4. See error
|
||||
-->
|
||||
|
||||
**Expected behavior**:
|
||||
<!-- A clear and concise description of what you expected to happen. -->
|
||||
|
||||
**Repo/Source where this issue can be reproduced**:
|
||||
<!-- Please link source code of website where the said issue can be reproduced -->
|
||||
|
||||
**Screenshots**
|
||||
<!-- If applicable, add screenshots to help explain your problem. -->
|
||||
|
||||
**Additional context**
|
||||
<!--Add any other context about the problem here. -->
|
@ -1,5 +0,0 @@
|
||||
blank_issues_enabled: false
|
||||
contact_links:
|
||||
- name: PaperMod Discussions
|
||||
url: https://github.com/adityatelange/hugo-PaperMod/discussions
|
||||
about: Please ask and answer questions/doubts here, do not open an issue for questions.
|
@ -1,7 +0,0 @@
|
||||
---
|
||||
name: New Blank Issue
|
||||
about: Anything other than bug report
|
||||
title: ""
|
||||
labels: ""
|
||||
assignees: ""
|
||||
---
|
44
themes/PaperMod/.github/PULL_REQUEST_TEMPLATE.md
vendored
@ -1,44 +0,0 @@
|
||||
<!--
|
||||
|
||||
## READ BEFORE OPENING A PR
|
||||
|
||||
Thank you for contributing to hugo-PaperMod!
|
||||
Please fill out the following questions to make it easier for us to review your
|
||||
changes. You do not need to check all the boxes below.
|
||||
|
||||
**NOTE**: PaperMod does not have any external dependencies fetched from 3rd party
|
||||
CDN servers. However we do have custom Head/Footer extender templates which you can use
|
||||
to add those to your website.
|
||||
https://github.com/adityatelange/hugo-PaperMod/wiki/FAQs#custom-head--footer
|
||||
|
||||
-->
|
||||
|
||||
|
||||
**What does this PR change? What problem does it solve?**
|
||||
|
||||
<!--
|
||||
Describe the changes and their purpose here, as detailed as and if needed.
|
||||
|
||||
Please do not add 2 unrelated changes in a single PR as it is difficult to track/revert those in future.
|
||||
-->
|
||||
|
||||
|
||||
**Was the change discussed in an issue or in the Discussions before?**
|
||||
|
||||
<!--
|
||||
Link issues and relevant Discussions posts here.
|
||||
|
||||
If this PR resolves an issue on GitHub, use "Closes #1234" so that the issue
|
||||
is closed automatically when this PR is merged.
|
||||
-->
|
||||
|
||||
|
||||
## PR Checklist
|
||||
|
||||
- [ ] This change adds/updates translations and I have used the [template present here](https://github.com/adityatelange/hugo-PaperMod/wiki/Translations#want-to-add-your-language-).
|
||||
- [ ] I have enabled [maintainer edits for this PR](https://help.github.com/en/github/collaborating-with-issues-and-pull-requests/allowing-changes-to-a-pull-request-branch-created-from-a-fork).
|
||||
- [ ] I have verified that the code works as described/as intended.
|
||||
- [ ] This change adds a Social Icon which has a permissive license to use it.
|
||||
- [ ] This change **does not** include any CDN resources/links.
|
||||
- [ ] This change **does not** include any unrelated scripts such as bash and python scripts.
|
||||
- [ ] This change updates the overridden internal templates from HUGO's repository.
|
17
themes/PaperMod/.github/stale.yml
vendored
@ -1,17 +0,0 @@
|
||||
# Number of days of inactivity before an issue becomes stale
|
||||
daysUntilStale: 7
|
||||
# Number of days of inactivity before a stale issue is closed
|
||||
daysUntilClose: 3
|
||||
# Issues with these labels will never be considered stale
|
||||
exemptLabels:
|
||||
- pinned
|
||||
- keep
|
||||
# Label to use when marking an issue as stale
|
||||
staleLabel: stale
|
||||
# Comment to post when marking an issue as stale. Set to `false` to disable
|
||||
markComment: >
|
||||
This issue has been automatically marked as stale because it has not had
|
||||
recent activity. It will be closed if no further activity occurs. Thank you
|
||||
for your contributions.
|
||||
# Comment to post when closing a stale issue. Set to `false` to disable
|
||||
closeComment: false
|
80
themes/PaperMod/.github/workflows/gh-pages.yml
vendored
@ -1,80 +0,0 @@
|
||||
name: Deploy Hugo PaperMod Demo to Pages
|
||||
|
||||
on:
|
||||
push:
|
||||
paths-ignore:
|
||||
- "images/**"
|
||||
- "LICENSE"
|
||||
- "README.md"
|
||||
branches:
|
||||
- master
|
||||
- exampleSite
|
||||
workflow_dispatch:
|
||||
# manual run
|
||||
inputs:
|
||||
hugoVersion:
|
||||
description: "Hugo Version"
|
||||
required: false
|
||||
default: "0.83.0"
|
||||
|
||||
# Allow one concurrent deployment
|
||||
concurrency:
|
||||
group: "pages"
|
||||
cancel-in-progress: true
|
||||
|
||||
# Default to bash
|
||||
defaults:
|
||||
run:
|
||||
shell: bash
|
||||
|
||||
# Sets permissions of the GITHUB_TOKEN to allow deployment to GitHub Pages
|
||||
permissions:
|
||||
contents: read
|
||||
pages: write
|
||||
id-token: write
|
||||
|
||||
jobs:
|
||||
# Build job
|
||||
build:
|
||||
runs-on: ubuntu-latest
|
||||
env:
|
||||
HUGO_VERSION: "0.83.0"
|
||||
steps:
|
||||
- name: Check version
|
||||
if: ${{ github.event.inputs.hugoVersion }}
|
||||
run: export HUGO_VERSION="${{ github.event.inputs.hugoVersion }}"
|
||||
- name: Install Hugo CLI
|
||||
run: |
|
||||
wget -O ${{ runner.temp }}/hugo.deb https://github.com/gohugoio/hugo/releases/download/v${HUGO_VERSION}/hugo_${HUGO_VERSION}_Linux-64bit.deb \
|
||||
&& sudo dpkg -i ${{ runner.temp }}/hugo.deb
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v3
|
||||
with:
|
||||
ref: exampleSite
|
||||
- name: Setup Pages
|
||||
id: pages
|
||||
uses: actions/configure-pages@v1
|
||||
- name: Get Theme
|
||||
run: git submodule update --init --recursive
|
||||
- name: Update theme to Latest commit
|
||||
run: git submodule update --remote --merge
|
||||
- name: Build with Hugo
|
||||
run: |
|
||||
hugo \
|
||||
--buildDrafts --gc --verbose \
|
||||
--baseURL ${{ steps.pages.outputs.base_url }}
|
||||
- name: Upload artifact
|
||||
uses: actions/upload-pages-artifact@v1
|
||||
with:
|
||||
path: ./public
|
||||
# Deployment job
|
||||
deploy:
|
||||
environment:
|
||||
name: github-pages
|
||||
url: ${{ steps.deployment.outputs.page_url }}
|
||||
runs-on: ubuntu-latest
|
||||
needs: build
|
||||
steps:
|
||||
- name: Deploy to GitHub Pages
|
||||
id: deployment
|
||||
uses: actions/deploy-pages@v1
|
@ -1,22 +0,0 @@
|
||||
MIT License
|
||||
|
||||
Copyright (c) 2020 nanxiaobei and adityatelange
|
||||
Copyright (c) 2021-2022 adityatelange
|
||||
|
||||
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:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
@ -1,96 +0,0 @@
|
||||
<h1 align=center>Hugo PaperMod | <a href="https://adityatelange.github.io/hugo-PaperMod/" rel="nofollow">Demo</a></h1>
|
||||
|
||||
<h4 align=center>☄️ Fast | ☁️ Fluent | 🌙 Smooth | 📱 Responsive</h4>
|
||||
<br>
|
||||
|
||||
> Hugo PaperMod is a theme based on [hugo-paper](https://github.com/nanxiaobei/hugo-paper).
|
||||
> The goal of this project is to add more features and customization to the og theme.
|
||||
|
||||
The [demo](https://adityatelange.github.io/hugo-PaperMod/) includes a lot of documentation about Installation, Features with a few more stuff. Make sure you visit it, to get an awesome hands-on experience and get to know about the features ...
|
||||
|
||||
**ExampleSite** can be found here: [exampleSite](https://github.com/adityatelange/hugo-PaperMod/tree/exampleSite). Demo is built up with [exampleSite](https://github.com/adityatelange/hugo-PaperMod/tree/exampleSite) as source.
|
||||
|
||||
[](https://github.com/gohugoio/hugo/releases/tag/v0.83.0)
|
||||
[](https://github.com/adityatelange/hugo-PaperMod/deployments/activity_log?environment=github-pages)
|
||||
[](https://github.com/adityatelange/hugo-PaperMod/blob/master/LICENSE)
|
||||
[](https://themes.gohugo.io/themes/hugo-papermod/)
|
||||
[](https://sonarcloud.io/dashboard?id=adityatelange_hugo-PaperMod)
|
||||

|
||||
[](https://discord.gg/ahpmTvhVmp)
|
||||
|
||||
---
|
||||
|
||||
<p align="center">
|
||||
<kbd><img src="https://user-images.githubusercontent.com/21258296/114303440-bfc0ae80-9aeb-11eb-8cfa-48a4bb385a6d.png" alt="Mockup image" title="Mockup"/></kbd>
|
||||
</p>
|
||||
|
||||
---
|
||||
|
||||
## Features/Mods 💥
|
||||
|
||||
- Uses Hugo's asset generator with pipelining, fingerprinting, bundling and minification by default.
|
||||
- 3 Modes:
|
||||
- [Regular Mode.](https://github.com/adityatelange/hugo-PaperMod/wiki/Features#regular-mode-default-mode)
|
||||
- [Home-Info Mode.](https://github.com/adityatelange/hugo-PaperMod/wiki/Features#home-info-mode)
|
||||
- [Profile Mode.](https://github.com/adityatelange/hugo-PaperMod/wiki/Features#profile-mode)
|
||||
- Table of Content Generation (newer implementation).
|
||||
- Archive of posts.
|
||||
- Social Icons (home-info and profile-mode)
|
||||
- Social-Media Share buttons on posts.
|
||||
- Menu location indicator.
|
||||
- Multilingual support. (with language selector)
|
||||
- Taxonomies
|
||||
- Cover image for each post (with Responsive image support).
|
||||
- Light/Dark theme (automatic theme switch a/c to browser theme and theme-switch button).
|
||||
- SEO Friendly.
|
||||
- Multiple Author support.
|
||||
- Search Page with Fuse.js
|
||||
- Other Posts suggestion below a post
|
||||
- Breadcrumb Navigation
|
||||
- Code Block Copy buttons
|
||||
- No webpack, nodejs and other dependencies are required to edit the theme.
|
||||
|
||||
Read Wiki For More Details => **[PaperMod - Features](https://github.com/adityatelange/hugo-PaperMod/wiki/Features)**
|
||||
|
||||
---
|
||||
|
||||
## Install/Update 📥
|
||||
|
||||
Read Wiki For More Details => **[PaperMod - Installation](https://github.com/adityatelange/hugo-PaperMod/wiki/Installation)**
|
||||
|
||||
---
|
||||
|
||||
## Social-Icons/Share-Icons 🖼️
|
||||
|
||||
Read Wiki For More Details => **[PaperMod-Icons](https://github.com/adityatelange/hugo-PaperMod/wiki/Icons)**
|
||||
|
||||
---
|
||||
|
||||
## FAQs / How To's Guide 🙋
|
||||
|
||||
Read Wiki For More Details => **[PaperMod-FAQs](https://github.com/adityatelange/hugo-PaperMod/wiki/FAQs)**
|
||||
|
||||
---
|
||||
|
||||
## Release Changelog 📃
|
||||
|
||||
Release ChangeLog has info about stuff added: **[Releases](https://github.com/adityatelange/hugo-PaperMod/releases)**
|
||||
|
||||
---
|
||||
|
||||
## [Pagespeed Insights (100% ?)](https://pagespeed.web.dev/report?url=https://adityatelange.github.io/hugo-PaperMod/) 👀
|
||||
|
||||
---
|
||||
|
||||
## Special Thanks 🌟
|
||||
|
||||
- [**Highlight.js**](https://github.com/highlightjs/highlight.js)
|
||||
- [**Fuse.js**](https://github.com/krisk/fuse)
|
||||
- [**Feather Icons**](https://github.com/feathericons/feather)
|
||||
- [**Simple Icons**](https://github.com/simple-icons/simple-icons)
|
||||
- **All Contributors and Supporters**
|
||||
|
||||
## Stargazers over time 📈
|
||||
|
||||
<kbd>[](https://starchart.cc/adityatelange/hugo-PaperMod)</kbd>
|
||||
|
@ -1,11 +0,0 @@
|
||||
.not-found {
|
||||
position: absolute;
|
||||
left: 0;
|
||||
right: 0;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
height: 80%;
|
||||
font-size: 160px;
|
||||
font-weight: 700;
|
||||
}
|
@ -1,44 +0,0 @@
|
||||
.archive-posts {
|
||||
width: 100%;
|
||||
font-size: 16px;
|
||||
}
|
||||
|
||||
.archive-year {
|
||||
margin-top: 40px;
|
||||
}
|
||||
|
||||
.archive-year:not(:last-of-type) {
|
||||
border-bottom: 2px solid var(--border);
|
||||
}
|
||||
|
||||
.archive-month {
|
||||
display: flex;
|
||||
align-items: flex-start;
|
||||
padding: 10px 0;
|
||||
}
|
||||
|
||||
.archive-month-header {
|
||||
margin: 25px 0;
|
||||
width: 200px;
|
||||
}
|
||||
|
||||
.archive-month:not(:last-of-type) {
|
||||
border-bottom: 1px solid var(--border);
|
||||
}
|
||||
|
||||
.archive-entry {
|
||||
position: relative;
|
||||
padding: 5px;
|
||||
margin: 10px 0;
|
||||
}
|
||||
|
||||
.archive-entry-title {
|
||||
margin: 5px 0;
|
||||
font-weight: 400;
|
||||
}
|
||||
|
||||
.archive-count,
|
||||
.archive-meta {
|
||||
color: var(--secondary);
|
||||
font-size: 14px;
|
||||
}
|
@ -1,60 +0,0 @@
|
||||
.footer,
|
||||
.top-link {
|
||||
font-size: 12px;
|
||||
color: var(--secondary);
|
||||
}
|
||||
|
||||
.footer {
|
||||
max-width: calc(var(--main-width) + var(--gap) * 2);
|
||||
margin: auto;
|
||||
padding: calc((var(--footer-height) - var(--gap)) / 2) var(--gap);
|
||||
text-align: center;
|
||||
line-height: 24px;
|
||||
}
|
||||
|
||||
.footer span {
|
||||
margin-inline-start: 1px;
|
||||
margin-inline-end: 1px;
|
||||
}
|
||||
|
||||
.footer span:last-child {
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
.footer a {
|
||||
color: inherit;
|
||||
border-bottom: 1px solid var(--secondary);
|
||||
}
|
||||
|
||||
.footer a:hover {
|
||||
border-bottom: 1px solid var(--primary);
|
||||
}
|
||||
|
||||
.top-link {
|
||||
visibility: hidden;
|
||||
position: fixed;
|
||||
bottom: 60px;
|
||||
right: 30px;
|
||||
z-index: 99;
|
||||
background: var(--tertiary);
|
||||
width: 42px;
|
||||
height: 42px;
|
||||
padding: 12px;
|
||||
border-radius: 64px;
|
||||
transition: visibility 0.5s, opacity 0.8s linear;
|
||||
}
|
||||
|
||||
.top-link,
|
||||
.top-link svg {
|
||||
filter: drop-shadow(0px 0px 0px var(--theme));
|
||||
}
|
||||
|
||||
.footer a:hover,
|
||||
.top-link:hover {
|
||||
color: var(--primary);
|
||||
}
|
||||
|
||||
.top-link:focus,
|
||||
#theme-toggle:focus {
|
||||
outline: 0;
|
||||
}
|
@ -1,93 +0,0 @@
|
||||
.nav {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
justify-content: space-between;
|
||||
max-width: calc(var(--nav-width) + var(--gap) * 2);
|
||||
margin-inline-start: auto;
|
||||
margin-inline-end: auto;
|
||||
line-height: var(--header-height);
|
||||
}
|
||||
|
||||
.nav a {
|
||||
display: block;
|
||||
}
|
||||
|
||||
.logo,
|
||||
#menu {
|
||||
display: flex;
|
||||
margin: auto var(--gap);
|
||||
}
|
||||
|
||||
.logo {
|
||||
flex-wrap: inherit;
|
||||
}
|
||||
|
||||
.logo a {
|
||||
font-size: 24px;
|
||||
font-weight: 700;
|
||||
}
|
||||
|
||||
.logo a img, .logo a svg {
|
||||
display: inline;
|
||||
vertical-align: middle;
|
||||
pointer-events: none;
|
||||
transform: translate(0, -10%);
|
||||
border-radius: 6px;
|
||||
margin-inline-end: 8px;
|
||||
}
|
||||
|
||||
button#theme-toggle {
|
||||
font-size: 26px;
|
||||
margin: auto 4px;
|
||||
}
|
||||
|
||||
body.dark #moon {
|
||||
vertical-align: middle;
|
||||
display: none;
|
||||
}
|
||||
|
||||
body:not(.dark) #sun {
|
||||
display: none;
|
||||
}
|
||||
|
||||
#menu {
|
||||
list-style: none;
|
||||
word-break: keep-all;
|
||||
overflow-x: auto;
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
#menu li + li {
|
||||
margin-inline-start: var(--gap);
|
||||
}
|
||||
|
||||
#menu a {
|
||||
font-size: 16px;
|
||||
}
|
||||
|
||||
#menu .active {
|
||||
font-weight: 500;
|
||||
border-bottom: 2px solid currentColor;
|
||||
}
|
||||
|
||||
.lang-switch li,
|
||||
.lang-switch ul,
|
||||
.logo-switches {
|
||||
display: inline-flex;
|
||||
margin: auto 4px;
|
||||
}
|
||||
|
||||
.lang-switch {
|
||||
display: flex;
|
||||
flex-wrap: inherit;
|
||||
}
|
||||
|
||||
.lang-switch a {
|
||||
margin: auto 3px;
|
||||
font-size: 16px;
|
||||
font-weight: 500;
|
||||
}
|
||||
|
||||
.logo-switches {
|
||||
flex-wrap: inherit;
|
||||
}
|
@ -1,68 +0,0 @@
|
||||
.main {
|
||||
position: relative;
|
||||
min-height: calc(100vh - var(--header-height) - var(--footer-height));
|
||||
max-width: calc(var(--main-width) + var(--gap) * 2);
|
||||
margin: auto;
|
||||
padding: var(--gap);
|
||||
}
|
||||
|
||||
.page-header h1 {
|
||||
font-size: 40px;
|
||||
}
|
||||
|
||||
.pagination {
|
||||
display: flex;
|
||||
}
|
||||
|
||||
.pagination a {
|
||||
color: var(--theme);
|
||||
font-size: 13px;
|
||||
line-height: 36px;
|
||||
background: var(--primary);
|
||||
border-radius: calc(36px / 2);
|
||||
padding: 0 16px;
|
||||
}
|
||||
|
||||
.pagination .next {
|
||||
margin-inline-start: auto;
|
||||
}
|
||||
|
||||
.social-icons {
|
||||
padding: 12px 0;
|
||||
}
|
||||
|
||||
.social-icons a:not(:last-of-type) {
|
||||
margin-inline-end: 12px;
|
||||
}
|
||||
|
||||
.social-icons a svg {
|
||||
height: 26px;
|
||||
width: 26px;
|
||||
}
|
||||
|
||||
code {
|
||||
direction: ltr;
|
||||
}
|
||||
|
||||
div.highlight,
|
||||
pre {
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.copy-code {
|
||||
display: none;
|
||||
position: absolute;
|
||||
top: 4px;
|
||||
right: 4px;
|
||||
color: rgba(255, 255, 255, 0.8);
|
||||
background: rgba(78, 78, 78, 0.8);
|
||||
border-radius: var(--radius);
|
||||
padding: 0 5px;
|
||||
font-size: 14px;
|
||||
user-select: none;
|
||||
}
|
||||
|
||||
div.highlight:hover .copy-code,
|
||||
pre:hover .copy-code {
|
||||
display: block;
|
||||
}
|
@ -1,104 +0,0 @@
|
||||
.first-entry {
|
||||
position: relative;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
justify-content: center;
|
||||
min-height: 320px;
|
||||
margin: var(--gap) 0 calc(var(--gap) * 2) 0;
|
||||
}
|
||||
|
||||
.first-entry .entry-header {
|
||||
overflow: hidden;
|
||||
display: -webkit-box;
|
||||
-webkit-box-orient: vertical;
|
||||
-webkit-line-clamp: 3;
|
||||
}
|
||||
|
||||
.first-entry .entry-header h1 {
|
||||
font-size: 34px;
|
||||
line-height: 1.3;
|
||||
}
|
||||
|
||||
.first-entry .entry-content {
|
||||
margin: 14px 0;
|
||||
font-size: 16px;
|
||||
-webkit-line-clamp: 3;
|
||||
}
|
||||
|
||||
.first-entry .entry-footer {
|
||||
font-size: 14px;
|
||||
}
|
||||
|
||||
.home-info .entry-content {
|
||||
-webkit-line-clamp: unset;
|
||||
}
|
||||
|
||||
.post-entry {
|
||||
position: relative;
|
||||
margin-bottom: var(--gap);
|
||||
padding: var(--gap);
|
||||
background: var(--entry);
|
||||
border-radius: var(--radius);
|
||||
transition: transform 0.1s;
|
||||
border: 1px solid var(--border);
|
||||
}
|
||||
|
||||
.post-entry:active {
|
||||
transform: scale(0.96);
|
||||
}
|
||||
|
||||
.tag-entry .entry-cover {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.entry-header h2 {
|
||||
font-size: 24px;
|
||||
line-height: 1.3;
|
||||
}
|
||||
|
||||
.entry-content {
|
||||
margin: 8px 0;
|
||||
color: var(--secondary);
|
||||
font-size: 14px;
|
||||
line-height: 1.6;
|
||||
overflow: hidden;
|
||||
display: -webkit-box;
|
||||
-webkit-box-orient: vertical;
|
||||
-webkit-line-clamp: 2;
|
||||
}
|
||||
|
||||
.entry-footer {
|
||||
color: var(--secondary);
|
||||
font-size: 13px;
|
||||
}
|
||||
|
||||
.entry-link {
|
||||
position: absolute;
|
||||
left: 0;
|
||||
right: 0;
|
||||
top: 0;
|
||||
bottom: 0;
|
||||
}
|
||||
|
||||
.entry-cover,
|
||||
.entry-isdraft {
|
||||
font-size: 14px;
|
||||
color: var(--secondary);
|
||||
}
|
||||
|
||||
.entry-cover {
|
||||
margin-bottom: var(--gap);
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.entry-cover img {
|
||||
border-radius: var(--radius);
|
||||
pointer-events: none;
|
||||
width: 100%;
|
||||
height: auto;
|
||||
}
|
||||
|
||||
.entry-cover a {
|
||||
color: var(--secondary);
|
||||
box-shadow: 0 1px 0 var(--primary);
|
||||
}
|
@ -1,401 +0,0 @@
|
||||
.page-header,
|
||||
.post-header {
|
||||
margin: 24px auto var(--content-gap) auto;
|
||||
}
|
||||
|
||||
.post-title {
|
||||
margin-bottom: 2px;
|
||||
font-size: 40px;
|
||||
}
|
||||
|
||||
.post-description {
|
||||
margin-top: 10px;
|
||||
margin-bottom: 5px;
|
||||
}
|
||||
|
||||
.post-meta,
|
||||
.breadcrumbs {
|
||||
color: var(--secondary);
|
||||
font-size: 14px;
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
}
|
||||
|
||||
.post-meta .i18n_list li {
|
||||
display: inline-flex;
|
||||
list-style: none;
|
||||
margin: auto 3px;
|
||||
box-shadow: 0 1px 0 var(--secondary);
|
||||
}
|
||||
|
||||
.breadcrumbs a {
|
||||
font-size: 16px;
|
||||
}
|
||||
|
||||
.post-content {
|
||||
color: var(--content);
|
||||
}
|
||||
|
||||
.post-content h3,
|
||||
.post-content h4,
|
||||
.post-content h5,
|
||||
.post-content h6 {
|
||||
margin: 24px 0 16px;
|
||||
}
|
||||
|
||||
.post-content h1 {
|
||||
margin: 40px auto 32px;
|
||||
font-size: 40px;
|
||||
}
|
||||
|
||||
.post-content h2 {
|
||||
margin: 32px auto 24px;
|
||||
font-size: 32px;
|
||||
}
|
||||
|
||||
.post-content h3 {
|
||||
font-size: 24px;
|
||||
}
|
||||
|
||||
.post-content h4 {
|
||||
font-size: 16px;
|
||||
}
|
||||
|
||||
.post-content h5 {
|
||||
font-size: 14px;
|
||||
}
|
||||
|
||||
.post-content h6 {
|
||||
font-size: 12px;
|
||||
}
|
||||
|
||||
.post-content a,
|
||||
.toc a:hover {
|
||||
box-shadow: 0 1px 0;
|
||||
}
|
||||
|
||||
.post-content a code {
|
||||
margin: auto 0;
|
||||
border-radius: 0;
|
||||
box-shadow: 0 -1px 0 var(--primary) inset;
|
||||
}
|
||||
|
||||
.post-content del {
|
||||
text-decoration: none;
|
||||
background: linear-gradient(to right, var(--primary) 100%, transparent 0) 0 50%/1px 1px repeat-x;
|
||||
}
|
||||
|
||||
.post-content dl,
|
||||
.post-content ol,
|
||||
.post-content p,
|
||||
.post-content figure,
|
||||
.post-content ul {
|
||||
margin-bottom: var(--content-gap);
|
||||
}
|
||||
|
||||
.post-content ol,
|
||||
.post-content ul {
|
||||
padding-inline-start: 20px;
|
||||
}
|
||||
|
||||
.post-content li {
|
||||
margin-top: 5px;
|
||||
}
|
||||
|
||||
.post-content li p {
|
||||
margin-bottom: 0;
|
||||
}
|
||||
|
||||
.post-content dl {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
.post-content dt {
|
||||
width: 25%;
|
||||
font-weight: 700;
|
||||
}
|
||||
|
||||
.post-content dd {
|
||||
width: 75%;
|
||||
margin-inline-start: 0;
|
||||
padding-inline-start: 10px;
|
||||
}
|
||||
|
||||
.post-content dd ~ dd,
|
||||
.post-content dt ~ dt {
|
||||
margin-top: 10px;
|
||||
}
|
||||
|
||||
.post-content table {
|
||||
margin-bottom: 32px;
|
||||
}
|
||||
|
||||
.post-content table th,
|
||||
.post-content table:not(.highlighttable, .highlight table, .gist .highlight) td {
|
||||
min-width: 80px;
|
||||
padding: 12px 8px;
|
||||
line-height: 1.5;
|
||||
border-bottom: 1px solid var(--border);
|
||||
}
|
||||
|
||||
.post-content table th {
|
||||
font-size: 14px;
|
||||
text-align: start;
|
||||
}
|
||||
|
||||
.post-content table:not(.highlighttable) td code:only-child {
|
||||
margin: auto 0;
|
||||
}
|
||||
|
||||
.post-content .highlight table {
|
||||
border-radius: var(--radius);
|
||||
}
|
||||
|
||||
.post-content .highlight:not(table) {
|
||||
margin: 10px auto;
|
||||
background: var(--hljs-bg) !important;
|
||||
border-radius: var(--radius);
|
||||
direction: ltr;
|
||||
}
|
||||
|
||||
.post-content li > .highlight {
|
||||
margin-inline-end: 0;
|
||||
}
|
||||
|
||||
.post-content ul pre {
|
||||
margin-inline-start: calc(var(--gap) * -2);
|
||||
}
|
||||
|
||||
.post-content .highlight pre {
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
.post-content .highlighttable {
|
||||
table-layout: fixed;
|
||||
}
|
||||
|
||||
.post-content .highlighttable td:first-child {
|
||||
width: 40px;
|
||||
}
|
||||
|
||||
.post-content .highlighttable td .linenodiv {
|
||||
padding-inline-end: 0 !important;
|
||||
}
|
||||
|
||||
.post-content .highlighttable td .highlight,
|
||||
.post-content .highlighttable td .linenodiv pre {
|
||||
margin-bottom: 0;
|
||||
}
|
||||
|
||||
.post-content code {
|
||||
margin: auto 4px;
|
||||
padding: 4px 6px;
|
||||
font-size: 0.78em;
|
||||
line-height: 1.5;
|
||||
background: var(--code-bg);
|
||||
border-radius: 2px;
|
||||
}
|
||||
|
||||
.post-content pre code {
|
||||
display: block;
|
||||
margin: auto 0;
|
||||
padding: 10px;
|
||||
color: rgb(213, 213, 214);
|
||||
background: var(--hljs-bg) !important;
|
||||
border-radius: var(--radius);
|
||||
overflow-x: auto;
|
||||
word-break: break-all;
|
||||
}
|
||||
|
||||
.post-content blockquote {
|
||||
margin: 20px 0;
|
||||
padding: 0 14px;
|
||||
border-inline-start: 3px solid var(--primary);
|
||||
}
|
||||
|
||||
.post-content hr {
|
||||
margin: 30px 0;
|
||||
height: 2px;
|
||||
background: var(--tertiary);
|
||||
border: 0;
|
||||
}
|
||||
|
||||
.post-content iframe {
|
||||
max-width: 100%;
|
||||
}
|
||||
|
||||
.post-content img {
|
||||
border-radius: 4px;
|
||||
margin: 1rem 0;
|
||||
}
|
||||
|
||||
.post-content img[src*="#center"] {
|
||||
margin: 1rem auto;
|
||||
}
|
||||
|
||||
.post-content figure.align-center {
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.post-content figure > figcaption {
|
||||
color: var(--primary);
|
||||
font-size: 16px;
|
||||
font-weight: bold;
|
||||
margin: 8px 0 16px;
|
||||
}
|
||||
|
||||
.post-content figure > figcaption > p {
|
||||
color: var(--secondary);
|
||||
font-size: 14px;
|
||||
font-weight: normal;
|
||||
}
|
||||
|
||||
.toc {
|
||||
margin: 0 2px 40px 2px;
|
||||
border: 1px solid var(--border);
|
||||
background: var(--code-bg);
|
||||
border-radius: var(--radius);
|
||||
padding: 0.4em;
|
||||
}
|
||||
|
||||
.dark .toc {
|
||||
background: var(--entry);
|
||||
}
|
||||
|
||||
.toc details summary {
|
||||
cursor: zoom-in;
|
||||
margin-inline-start: 20px;
|
||||
}
|
||||
|
||||
.toc details[open] summary {
|
||||
cursor: zoom-out;
|
||||
}
|
||||
|
||||
.toc .details {
|
||||
display: inline;
|
||||
font-weight: 500;
|
||||
}
|
||||
|
||||
.toc .inner {
|
||||
margin: 0 20px;
|
||||
padding: 10px 20px;
|
||||
}
|
||||
|
||||
.toc li ul {
|
||||
margin-inline-start: var(--gap);
|
||||
}
|
||||
|
||||
.toc summary:focus {
|
||||
outline: 0;
|
||||
}
|
||||
|
||||
.post-footer {
|
||||
margin-top: 56px;
|
||||
}
|
||||
|
||||
.post-tags li {
|
||||
display: inline-block;
|
||||
margin-inline-end: 3px;
|
||||
margin-bottom: 5px;
|
||||
}
|
||||
|
||||
.post-tags a,
|
||||
.share-buttons,
|
||||
.paginav {
|
||||
border-radius: var(--radius);
|
||||
background: var(--code-bg);
|
||||
border: 1px solid var(--border);
|
||||
}
|
||||
|
||||
.post-tags a {
|
||||
display: block;
|
||||
padding-inline-start: 14px;
|
||||
padding-inline-end: 14px;
|
||||
color: var(--secondary);
|
||||
font-size: 14px;
|
||||
line-height: 34px;
|
||||
background: var(--code-bg);
|
||||
}
|
||||
|
||||
.post-tags a:hover,
|
||||
.paginav a:hover {
|
||||
background: var(--border);
|
||||
}
|
||||
|
||||
.share-buttons {
|
||||
margin: 14px 0;
|
||||
padding-inline-start: var(--radius);
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
overflow-x: auto;
|
||||
}
|
||||
|
||||
.share-buttons a {
|
||||
margin-top: 10px;
|
||||
}
|
||||
|
||||
.share-buttons a:not(:last-of-type) {
|
||||
margin-inline-end: 12px;
|
||||
}
|
||||
|
||||
h1:hover .anchor,
|
||||
h2:hover .anchor,
|
||||
h3:hover .anchor,
|
||||
h4:hover .anchor,
|
||||
h5:hover .anchor,
|
||||
h6:hover .anchor {
|
||||
display: inline-flex;
|
||||
color: var(--secondary);
|
||||
margin-inline-start: 8px;
|
||||
font-weight: 500;
|
||||
user-select: none;
|
||||
}
|
||||
|
||||
.paginav {
|
||||
margin: 10px 0;
|
||||
display: flex;
|
||||
line-height: 30px;
|
||||
border-radius: var(--radius);
|
||||
}
|
||||
|
||||
.paginav a {
|
||||
padding-inline-start: 14px;
|
||||
padding-inline-end: 14px;
|
||||
border-radius: var(--radius);
|
||||
}
|
||||
|
||||
.paginav .title {
|
||||
letter-spacing: 1px;
|
||||
text-transform: uppercase;
|
||||
font-size: small;
|
||||
color: var(--secondary);
|
||||
}
|
||||
|
||||
.paginav .prev,
|
||||
.paginav .next {
|
||||
width: 50%;
|
||||
}
|
||||
|
||||
.paginav span:hover:not(.title) {
|
||||
box-shadow: 0 1px 0;
|
||||
}
|
||||
|
||||
.paginav .next {
|
||||
margin-inline-start: auto;
|
||||
text-align: right;
|
||||
}
|
||||
|
||||
[dir="rtl"] .paginav .next {
|
||||
text-align: left;
|
||||
}
|
||||
|
||||
h1>a>svg {
|
||||
display: inline;
|
||||
}
|
||||
|
||||
img.in-text {
|
||||
display: inline;
|
||||
margin: auto;
|
||||
}
|
@ -1,42 +0,0 @@
|
||||
.buttons,
|
||||
.main .profile {
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
}
|
||||
|
||||
.main .profile {
|
||||
align-items: center;
|
||||
min-height: calc(100vh - var(--header-height) - var(--footer-height) - (var(--gap) * 2));
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.profile .profile_inner h1 {
|
||||
padding: 12px 0;
|
||||
}
|
||||
|
||||
.profile img {
|
||||
display: inline-table;
|
||||
border-radius: 50%;
|
||||
}
|
||||
|
||||
.buttons {
|
||||
flex-wrap: wrap;
|
||||
max-width: 400px;
|
||||
margin: 0 auto;
|
||||
}
|
||||
|
||||
.button {
|
||||
background: var(--tertiary);
|
||||
border-radius: var(--radius);
|
||||
margin: 8px;
|
||||
padding: 6px;
|
||||
transition: transform 0.1s;
|
||||
}
|
||||
|
||||
.button-inner {
|
||||
padding: 0 8px;
|
||||
}
|
||||
|
||||
.button:active {
|
||||
transform: scale(0.96);
|
||||
}
|
@ -1,45 +0,0 @@
|
||||
#searchbox input {
|
||||
padding: 4px 10px;
|
||||
width: 100%;
|
||||
color: var(--primary);
|
||||
font-weight: bold;
|
||||
border: 2px solid var(--tertiary);
|
||||
border-radius: var(--radius);
|
||||
}
|
||||
|
||||
#searchbox input:focus {
|
||||
border-color: var(--secondary);
|
||||
}
|
||||
|
||||
#searchResults li {
|
||||
list-style: none;
|
||||
border-radius: var(--radius);
|
||||
padding: 10px;
|
||||
margin: 10px 0;
|
||||
position: relative;
|
||||
font-weight: 500;
|
||||
}
|
||||
|
||||
#searchResults {
|
||||
margin: 10px 0;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
#searchResults li:active {
|
||||
transition: transform 0.1s;
|
||||
transform: scale(0.98);
|
||||
}
|
||||
|
||||
#searchResults a {
|
||||
position: absolute;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
top: 0px;
|
||||
left: 0px;
|
||||
outline: none;
|
||||
}
|
||||
|
||||
#searchResults .focus {
|
||||
transform: scale(0.98);
|
||||
border: 2px solid var(--tertiary);
|
||||
}
|
@ -1,85 +0,0 @@
|
||||
/* Background */ .bg { color: #f8f8f2; background-color: #282a36; }
|
||||
/* PreWrapper */ .chroma { color: #f8f8f2; background-color: #282a36; }
|
||||
/* Other */ .chroma .x { }
|
||||
/* Error */ .chroma .err { }
|
||||
/* CodeLine */ .chroma .cl { }
|
||||
/* LineTableTD */ .chroma .lntd { vertical-align: top; padding: 0; margin: 0; border: 0; }
|
||||
/* LineTable */ .chroma .lntable { border-spacing: 0; padding: 0; margin: 0; border: 0; }
|
||||
/* LineHighlight */ .chroma .hl { background-color: #5e5e5e }
|
||||
/* LineNumbersTable */ .chroma .lnt { white-space: pre; user-select: none; margin-right: 0.4em; padding: 0 0.4em 0 0.4em;color: #7f7f7f }
|
||||
/* LineNumbers */ .chroma .ln { white-space: pre; user-select: none; margin-right: 0.4em; padding: 0 0.4em 0 0.4em;color: #7f7f7f }
|
||||
/* Line */ .chroma .line { display: flex; }
|
||||
/* Keyword */ .chroma .k { color: #ff79c6 }
|
||||
/* KeywordConstant */ .chroma .kc { color: #ff79c6 }
|
||||
/* KeywordDeclaration */ .chroma .kd { color: #8be9fd; font-style: italic }
|
||||
/* KeywordNamespace */ .chroma .kn { color: #ff79c6 }
|
||||
/* KeywordPseudo */ .chroma .kp { color: #ff79c6 }
|
||||
/* KeywordReserved */ .chroma .kr { color: #ff79c6 }
|
||||
/* KeywordType */ .chroma .kt { color: #8be9fd }
|
||||
/* Name */ .chroma .n { }
|
||||
/* NameAttribute */ .chroma .na { color: #50fa7b }
|
||||
/* NameBuiltin */ .chroma .nb { color: #8be9fd; font-style: italic }
|
||||
/* NameBuiltinPseudo */ .chroma .bp { }
|
||||
/* NameClass */ .chroma .nc { color: #50fa7b }
|
||||
/* NameConstant */ .chroma .no { }
|
||||
/* NameDecorator */ .chroma .nd { }
|
||||
/* NameEntity */ .chroma .ni { }
|
||||
/* NameException */ .chroma .ne { }
|
||||
/* NameFunction */ .chroma .nf { color: #50fa7b }
|
||||
/* NameFunctionMagic */ .chroma .fm { }
|
||||
/* NameLabel */ .chroma .nl { color: #8be9fd; font-style: italic }
|
||||
/* NameNamespace */ .chroma .nn { }
|
||||
/* NameOther */ .chroma .nx { }
|
||||
/* NameProperty */ .chroma .py { }
|
||||
/* NameTag */ .chroma .nt { color: #ff79c6 }
|
||||
/* NameVariable */ .chroma .nv { color: #8be9fd; font-style: italic }
|
||||
/* NameVariableClass */ .chroma .vc { color: #8be9fd; font-style: italic }
|
||||
/* NameVariableGlobal */ .chroma .vg { color: #8be9fd; font-style: italic }
|
||||
/* NameVariableInstance */ .chroma .vi { color: #8be9fd; font-style: italic }
|
||||
/* NameVariableMagic */ .chroma .vm { }
|
||||
/* Literal */ .chroma .l { }
|
||||
/* LiteralDate */ .chroma .ld { }
|
||||
/* LiteralString */ .chroma .s { color: #f1fa8c }
|
||||
/* LiteralStringAffix */ .chroma .sa { color: #f1fa8c }
|
||||
/* LiteralStringBacktick */ .chroma .sb { color: #f1fa8c }
|
||||
/* LiteralStringChar */ .chroma .sc { color: #f1fa8c }
|
||||
/* LiteralStringDelimiter */ .chroma .dl { color: #f1fa8c }
|
||||
/* LiteralStringDoc */ .chroma .sd { color: #f1fa8c }
|
||||
/* LiteralStringDouble */ .chroma .s2 { color: #f1fa8c }
|
||||
/* LiteralStringEscape */ .chroma .se { color: #f1fa8c }
|
||||
/* LiteralStringHeredoc */ .chroma .sh { color: #f1fa8c }
|
||||
/* LiteralStringInterpol */ .chroma .si { color: #f1fa8c }
|
||||
/* LiteralStringOther */ .chroma .sx { color: #f1fa8c }
|
||||
/* LiteralStringRegex */ .chroma .sr { color: #f1fa8c }
|
||||
/* LiteralStringSingle */ .chroma .s1 { color: #f1fa8c }
|
||||
/* LiteralStringSymbol */ .chroma .ss { color: #f1fa8c }
|
||||
/* LiteralNumber */ .chroma .m { color: #bd93f9 }
|
||||
/* LiteralNumberBin */ .chroma .mb { color: #bd93f9 }
|
||||
/* LiteralNumberFloat */ .chroma .mf { color: #bd93f9 }
|
||||
/* LiteralNumberHex */ .chroma .mh { color: #bd93f9 }
|
||||
/* LiteralNumberInteger */ .chroma .mi { color: #bd93f9 }
|
||||
/* LiteralNumberIntegerLong */ .chroma .il { color: #bd93f9 }
|
||||
/* LiteralNumberOct */ .chroma .mo { color: #bd93f9 }
|
||||
/* Operator */ .chroma .o { color: #ff79c6 }
|
||||
/* OperatorWord */ .chroma .ow { color: #ff79c6 }
|
||||
/* Punctuation */ .chroma .p { }
|
||||
/* Comment */ .chroma .c { color: #6272a4 }
|
||||
/* CommentHashbang */ .chroma .ch { color: #6272a4 }
|
||||
/* CommentMultiline */ .chroma .cm { color: #6272a4 }
|
||||
/* CommentSingle */ .chroma .c1 { color: #6272a4 }
|
||||
/* CommentSpecial */ .chroma .cs { color: #6272a4 }
|
||||
/* CommentPreproc */ .chroma .cp { color: #ff79c6 }
|
||||
/* CommentPreprocFile */ .chroma .cpf { color: #ff79c6 }
|
||||
/* Generic */ .chroma .g { }
|
||||
/* GenericDeleted */ .chroma .gd { color: #ff5555 }
|
||||
/* GenericEmph */ .chroma .ge { text-decoration: underline }
|
||||
/* GenericError */ .chroma .gr { }
|
||||
/* GenericHeading */ .chroma .gh { font-weight: bold }
|
||||
/* GenericInserted */ .chroma .gi { color: #50fa7b; font-weight: bold }
|
||||
/* GenericOutput */ .chroma .go { color: #44475a }
|
||||
/* GenericPrompt */ .chroma .gp { }
|
||||
/* GenericStrong */ .chroma .gs { }
|
||||
/* GenericSubheading */ .chroma .gu { font-weight: bold }
|
||||
/* GenericTraceback */ .chroma .gt { }
|
||||
/* GenericUnderline */ .chroma .gl { text-decoration: underline }
|
||||
/* TextWhitespace */ .chroma .w { }
|
@ -1,18 +0,0 @@
|
||||
.terms-tags li {
|
||||
display: inline-block;
|
||||
margin: 10px;
|
||||
font-weight: 500;
|
||||
}
|
||||
|
||||
.terms-tags a {
|
||||
display: block;
|
||||
padding: 3px 10px;
|
||||
background: var(--tertiary);
|
||||
border-radius: 6px;
|
||||
transition: transform 0.1s;
|
||||
}
|
||||
|
||||
.terms-tags a:active {
|
||||
background: var(--tertiary);
|
||||
transform: scale(0.96);
|
||||
}
|
@ -1,6 +0,0 @@
|
||||
/*
|
||||
PaperMod v6
|
||||
License: MIT https://github.com/adityatelange/hugo-PaperMod/blob/master/LICENSE
|
||||
Copyright (c) 2020 nanxiaobei and adityatelange
|
||||
Copyright (c) 2021-2022 adityatelange
|
||||
*/
|
@ -1,116 +0,0 @@
|
||||
*,
|
||||
::after,
|
||||
::before {
|
||||
box-sizing: border-box;
|
||||
}
|
||||
|
||||
html {
|
||||
-webkit-tap-highlight-color: transparent;
|
||||
overflow-y: scroll;
|
||||
}
|
||||
|
||||
a,
|
||||
button,
|
||||
body,
|
||||
h1,
|
||||
h2,
|
||||
h3,
|
||||
h4,
|
||||
h5,
|
||||
h6 {
|
||||
color: var(--primary);
|
||||
}
|
||||
|
||||
body {
|
||||
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;
|
||||
font-size: 18px;
|
||||
line-height: 1.6;
|
||||
word-break: break-word;
|
||||
background: var(--theme);
|
||||
}
|
||||
|
||||
article,
|
||||
aside,
|
||||
figcaption,
|
||||
figure,
|
||||
footer,
|
||||
header,
|
||||
hgroup,
|
||||
main,
|
||||
nav,
|
||||
section,
|
||||
table {
|
||||
display: block;
|
||||
}
|
||||
|
||||
h1,
|
||||
h2,
|
||||
h3,
|
||||
h4,
|
||||
h5,
|
||||
h6 {
|
||||
line-height: 1.2;
|
||||
}
|
||||
|
||||
h1,
|
||||
h2,
|
||||
h3,
|
||||
h4,
|
||||
h5,
|
||||
h6,
|
||||
p {
|
||||
margin-top: 0;
|
||||
margin-bottom: 0;
|
||||
}
|
||||
|
||||
ul {
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
a {
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
body,
|
||||
figure,
|
||||
ul {
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
table {
|
||||
width: 100%;
|
||||
border-collapse: collapse;
|
||||
border-spacing: 0;
|
||||
overflow-x: auto;
|
||||
word-break: keep-all;
|
||||
}
|
||||
|
||||
button,
|
||||
input,
|
||||
textarea {
|
||||
padding: 0;
|
||||
font: inherit;
|
||||
background: 0 0;
|
||||
border: 0;
|
||||
}
|
||||
|
||||
input,
|
||||
textarea {
|
||||
outline: 0;
|
||||
}
|
||||
|
||||
button,
|
||||
input[type=button],
|
||||
input[type=submit] {
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
input:-webkit-autofill,
|
||||
textarea:-webkit-autofill {
|
||||
box-shadow: 0 0 0 50px var(--theme) inset;
|
||||
}
|
||||
|
||||
img {
|
||||
display: block;
|
||||
max-width: 100%;
|
||||
}
|
@ -1,38 +0,0 @@
|
||||
:root {
|
||||
--gap: 24px;
|
||||
--content-gap: 20px;
|
||||
--nav-width: 1024px;
|
||||
--main-width: 720px;
|
||||
--header-height: 60px;
|
||||
--footer-height: 60px;
|
||||
--radius: 8px;
|
||||
--theme: rgb(255, 255, 255);
|
||||
--entry: rgb(255, 255, 255);
|
||||
--primary: rgb(30, 30, 30);
|
||||
--secondary: rgb(108, 108, 108);
|
||||
--tertiary: rgb(214, 214, 214);
|
||||
--content: rgb(31, 31, 31);
|
||||
--hljs-bg: rgb(28, 29, 33);
|
||||
--code-bg: rgb(245, 245, 245);
|
||||
--border: rgb(238, 238, 238);
|
||||
}
|
||||
|
||||
.dark {
|
||||
--theme: rgb(29, 30, 32);
|
||||
--entry: rgb(46, 46, 51);
|
||||
--primary: rgb(218, 218, 219);
|
||||
--secondary: rgb(155, 156, 157);
|
||||
--tertiary: rgb(65, 66, 68);
|
||||
--content: rgb(196, 196, 197);
|
||||
--hljs-bg: rgb(46, 46, 51);
|
||||
--code-bg: rgb(55, 56, 62);
|
||||
--border: rgb(51, 51, 51);
|
||||
}
|
||||
|
||||
.list {
|
||||
background: var(--code-bg);
|
||||
}
|
||||
|
||||
.dark.list {
|
||||
background: var(--theme);
|
||||
}
|
@ -1,49 +0,0 @@
|
||||
@media screen and (max-width: 768px) {
|
||||
/* theme-vars */
|
||||
:root {
|
||||
--gap: 14px;
|
||||
}
|
||||
|
||||
/* profile-mode */
|
||||
.profile img {
|
||||
transform: scale(0.85);
|
||||
}
|
||||
|
||||
/* post-entry */
|
||||
.first-entry {
|
||||
min-height: 260px;
|
||||
}
|
||||
|
||||
/* archive */
|
||||
.archive-month {
|
||||
flex-direction: column;
|
||||
}
|
||||
|
||||
.archive-year {
|
||||
margin-top: 20px;
|
||||
}
|
||||
|
||||
/* footer */
|
||||
.footer {
|
||||
padding: calc((var(--footer-height) - var(--gap) - 10px) / 2) var(--gap);
|
||||
}
|
||||
}
|
||||
|
||||
/* footer */
|
||||
@media screen and (max-width: 900px) {
|
||||
.list .top-link {
|
||||
transform: translateY(-5rem);
|
||||
}
|
||||
}
|
||||
|
||||
@media (prefers-reduced-motion) {
|
||||
/* terms; profile-mode; post-single; post-entry; post-entry; search; search */
|
||||
.terms-tags a:active,
|
||||
.button:active,
|
||||
.post-entry:active,
|
||||
.top-link,
|
||||
#searchResults .focus,
|
||||
#searchResults li:active {
|
||||
transform: none;
|
||||
}
|
||||
}
|
@ -1,5 +0,0 @@
|
||||
/*
|
||||
This is just a placeholder blank stylesheet so as to support adding custom styles budled with theme's default styles
|
||||
|
||||
Read https://github.com/adityatelange/hugo-PaperMod/wiki/FAQs#bundling-custom-css-with-themes-assets for more info
|
||||
*/
|
@ -1,63 +0,0 @@
|
||||
.hljs-comment,
|
||||
.hljs-quote {
|
||||
color: #b6b18b;
|
||||
}
|
||||
|
||||
.hljs-deletion,
|
||||
.hljs-name,
|
||||
.hljs-regexp,
|
||||
.hljs-selector-class,
|
||||
.hljs-selector-id,
|
||||
.hljs-tag,
|
||||
.hljs-template-variable,
|
||||
.hljs-variable {
|
||||
color: #eb3c54;
|
||||
}
|
||||
|
||||
.hljs-built_in,
|
||||
.hljs-builtin-name,
|
||||
.hljs-link,
|
||||
.hljs-literal,
|
||||
.hljs-meta,
|
||||
.hljs-number,
|
||||
.hljs-params,
|
||||
.hljs-type {
|
||||
color: #e7ce56;
|
||||
}
|
||||
|
||||
.hljs-attribute {
|
||||
color: #ee7c2b;
|
||||
}
|
||||
|
||||
.hljs-addition,
|
||||
.hljs-bullet,
|
||||
.hljs-string,
|
||||
.hljs-symbol {
|
||||
color: #4fb4d7;
|
||||
}
|
||||
|
||||
.hljs-section,
|
||||
.hljs-title {
|
||||
color: #78bb65;
|
||||
}
|
||||
|
||||
.hljs-keyword,
|
||||
.hljs-selector-tag {
|
||||
color: #b45ea4;
|
||||
}
|
||||
|
||||
.hljs {
|
||||
display: block;
|
||||
overflow-x: auto;
|
||||
background: #1c1d21;
|
||||
color: #c0c5ce;
|
||||
padding: .5em;
|
||||
}
|
||||
|
||||
.hljs-emphasis {
|
||||
font-style: italic;
|
||||
}
|
||||
|
||||
.hljs-strong {
|
||||
font-weight: 700;
|
||||
}
|
@ -1,63 +0,0 @@
|
||||
/* from reset */
|
||||
::-webkit-scrollbar-track {
|
||||
background: 0 0;
|
||||
}
|
||||
|
||||
.list:not(.dark)::-webkit-scrollbar-track {
|
||||
background: var(--code-bg);
|
||||
}
|
||||
|
||||
::-webkit-scrollbar-thumb {
|
||||
background: var(--tertiary);
|
||||
border: 5px solid var(--theme);
|
||||
border-radius: var(--radius);
|
||||
}
|
||||
|
||||
.list:not(.dark)::-webkit-scrollbar-thumb {
|
||||
border: 5px solid var(--code-bg);
|
||||
}
|
||||
|
||||
::-webkit-scrollbar-thumb:hover {
|
||||
background: var(--secondary);
|
||||
}
|
||||
|
||||
::-webkit-scrollbar:not(.highlighttable, .highlight table, .gist .highlight) {
|
||||
background: var(--theme);
|
||||
}
|
||||
|
||||
/* from post-single */
|
||||
.post-content .highlighttable td .highlight pre code::-webkit-scrollbar {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.post-content :not(table) ::-webkit-scrollbar-thumb {
|
||||
border: 2px solid var(--hljs-bg);
|
||||
background: rgb(113, 113, 117);
|
||||
}
|
||||
|
||||
.post-content :not(table) ::-webkit-scrollbar-thumb:hover {
|
||||
background: rgb(163, 163, 165);
|
||||
}
|
||||
|
||||
.gist table::-webkit-scrollbar-thumb {
|
||||
border: 2px solid rgb(255, 255, 255);
|
||||
background: rgb(173, 173, 173);
|
||||
}
|
||||
|
||||
.gist table::-webkit-scrollbar-thumb:hover {
|
||||
background: rgb(112, 112, 112);
|
||||
}
|
||||
|
||||
.post-content table::-webkit-scrollbar-thumb {
|
||||
border-width: 2px;
|
||||
}
|
||||
|
||||
/* from zmedia */
|
||||
@media screen and (min-width: 768px) {
|
||||
|
||||
/* reset */
|
||||
::-webkit-scrollbar {
|
||||
width: 19px;
|
||||
height: 11px;
|
||||
}
|
||||
}
|
@ -1,148 +0,0 @@
|
||||
import * as params from '@params';
|
||||
|
||||
let fuse; // holds our search engine
|
||||
let resList = document.getElementById('searchResults');
|
||||
let sInput = document.getElementById('searchInput');
|
||||
let first, last, current_elem = null
|
||||
let resultsAvailable = false;
|
||||
|
||||
// load our search index
|
||||
window.onload = function () {
|
||||
let xhr = new XMLHttpRequest();
|
||||
xhr.onreadystatechange = function () {
|
||||
if (xhr.readyState === 4) {
|
||||
if (xhr.status === 200) {
|
||||
let data = JSON.parse(xhr.responseText);
|
||||
if (data) {
|
||||
// fuse.js options; check fuse.js website for details
|
||||
let options = {
|
||||
distance: 100,
|
||||
threshold: 0.4,
|
||||
ignoreLocation: true,
|
||||
keys: [
|
||||
'title',
|
||||
'permalink',
|
||||
'summary',
|
||||
'content'
|
||||
]
|
||||
};
|
||||
if (params.fuseOpts) {
|
||||
options = {
|
||||
isCaseSensitive: params.fuseOpts.iscasesensitive ? params.fuseOpts.iscasesensitive : false,
|
||||
includeScore: params.fuseOpts.includescore ? params.fuseOpts.includescore : false,
|
||||
includeMatches: params.fuseOpts.includematches ? params.fuseOpts.includematches : false,
|
||||
minMatchCharLength: params.fuseOpts.minmatchcharlength ? params.fuseOpts.minmatchcharlength : 1,
|
||||
shouldSort: params.fuseOpts.shouldsort ? params.fuseOpts.shouldsort : true,
|
||||
findAllMatches: params.fuseOpts.findallmatches ? params.fuseOpts.findallmatches : false,
|
||||
keys: params.fuseOpts.keys ? params.fuseOpts.keys : ['title', 'permalink', 'summary', 'content'],
|
||||
location: params.fuseOpts.location ? params.fuseOpts.location : 0,
|
||||
threshold: params.fuseOpts.threshold ? params.fuseOpts.threshold : 0.4,
|
||||
distance: params.fuseOpts.distance ? params.fuseOpts.distance : 100,
|
||||
ignoreLocation: params.fuseOpts.ignorelocation ? params.fuseOpts.ignorelocation : true
|
||||
}
|
||||
}
|
||||
fuse = new Fuse(data, options); // build the index from the json file
|
||||
}
|
||||
} else {
|
||||
console.log(xhr.responseText);
|
||||
}
|
||||
}
|
||||
};
|
||||
xhr.open('GET', "../index.json");
|
||||
xhr.send();
|
||||
}
|
||||
|
||||
function activeToggle(ae) {
|
||||
document.querySelectorAll('.focus').forEach(function (element) {
|
||||
// rm focus class
|
||||
element.classList.remove("focus")
|
||||
});
|
||||
if (ae) {
|
||||
ae.focus()
|
||||
document.activeElement = current_elem = ae;
|
||||
ae.parentElement.classList.add("focus")
|
||||
} else {
|
||||
document.activeElement.parentElement.classList.add("focus")
|
||||
}
|
||||
}
|
||||
|
||||
function reset() {
|
||||
resultsAvailable = false;
|
||||
resList.innerHTML = sInput.value = ''; // clear inputbox and searchResults
|
||||
sInput.focus(); // shift focus to input box
|
||||
}
|
||||
|
||||
// execute search as each character is typed
|
||||
sInput.onkeyup = function (e) {
|
||||
// run a search query (for "term") every time a letter is typed
|
||||
// in the search box
|
||||
if (fuse) {
|
||||
const results = fuse.search(this.value.trim()); // the actual query being run using fuse.js
|
||||
if (results.length !== 0) {
|
||||
// build our html if result exists
|
||||
let resultSet = ''; // our results bucket
|
||||
|
||||
for (let item in results) {
|
||||
resultSet += `<li class="post-entry"><header class="entry-header">${results[item].item.title} »</header>` +
|
||||
`<p>${results[item].item.summary}</p>` +
|
||||
`<a href="${results[item].item.permalink}" aria-label="${results[item].item.title}"></a></li>`
|
||||
}
|
||||
|
||||
resList.innerHTML = resultSet;
|
||||
resultsAvailable = true;
|
||||
first = resList.firstChild;
|
||||
last = resList.lastChild;
|
||||
} else {
|
||||
resultsAvailable = false;
|
||||
resList.innerHTML = '';
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
sInput.addEventListener('search', function (e) {
|
||||
// clicked on x
|
||||
if (!this.value) reset()
|
||||
})
|
||||
|
||||
// kb bindings
|
||||
document.onkeydown = function (e) {
|
||||
let key = e.key;
|
||||
let ae = document.activeElement;
|
||||
|
||||
let inbox = document.getElementById("searchbox").contains(ae)
|
||||
|
||||
if (ae === sInput) {
|
||||
let elements = document.getElementsByClassName('focus');
|
||||
while (elements.length > 0) {
|
||||
elements[0].classList.remove('focus');
|
||||
}
|
||||
} else if (current_elem) ae = current_elem;
|
||||
|
||||
if (key === "Escape") {
|
||||
reset()
|
||||
} else if (!resultsAvailable || !inbox) {
|
||||
return
|
||||
} else if (key === "ArrowDown") {
|
||||
e.preventDefault();
|
||||
if (ae == sInput) {
|
||||
// if the currently focused element is the search input, focus the <a> of first <li>
|
||||
activeToggle(resList.firstChild.lastChild);
|
||||
} else if (ae.parentElement != last) {
|
||||
// if the currently focused element's parent is last, do nothing
|
||||
// otherwise select the next search result
|
||||
activeToggle(ae.parentElement.nextSibling.lastChild);
|
||||
}
|
||||
} else if (key === "ArrowUp") {
|
||||
e.preventDefault();
|
||||
if (ae.parentElement == first) {
|
||||
// if the currently focused element is first item, go to input box
|
||||
activeToggle(sInput);
|
||||
} else if (ae != sInput) {
|
||||
// if the currently focused element is input box, do nothing
|
||||
// otherwise select the previous search result
|
||||
activeToggle(ae.parentElement.previousSibling.lastChild);
|
||||
}
|
||||
} else if (key === "ArrowRight") {
|
||||
ae.click(); // click on active link
|
||||
}
|
||||
}
|
9
themes/PaperMod/assets/js/fuse.basic.min.js
vendored
44
themes/PaperMod/assets/js/highlight.min.js
vendored
@ -1,6 +0,0 @@
|
||||
/*
|
||||
PaperMod v6
|
||||
License: MIT https://github.com/adityatelange/hugo-PaperMod/blob/master/LICENSE
|
||||
Copyright (c) 2020 nanxiaobei and adityatelange
|
||||
Copyright (c) 2021-2022 adityatelange
|
||||
*/
|
@ -1,3 +0,0 @@
|
||||
module github.com/adityatelange/hugo-PaperMod
|
||||
|
||||
go 1.12
|
@ -1,22 +0,0 @@
|
||||
- id: prev_page
|
||||
translation: "الصفحة السابقة"
|
||||
|
||||
- id: next_page
|
||||
translation: "الصفحة التالية"
|
||||
|
||||
- id: read_time
|
||||
translation:
|
||||
one: "دقيقة واحدة"
|
||||
two: "دقيقتان"
|
||||
few: "بضع ثوان"
|
||||
zero: "الآن"
|
||||
other: "دقائق {{ .Count }}"
|
||||
|
||||
- id: toc
|
||||
translation: "فهرس المحتوى"
|
||||
|
||||
- id: translations
|
||||
translation: "ترجمات أخرى"
|
||||
|
||||
- id: home
|
||||
translation: "الصفحة الرئيسية"
|
@ -1,16 +0,0 @@
|
||||
- id: prev_page
|
||||
translation: "Предишна страница"
|
||||
|
||||
- id: next_page
|
||||
translation: "Следваща страница"
|
||||
|
||||
- id: read_time
|
||||
translation:
|
||||
one : "1 мин"
|
||||
other: "{{ .Count }} мин"
|
||||
|
||||
- id: toc
|
||||
translation: "Съдържание"
|
||||
|
||||
- id: translations
|
||||
translation: "Преводи"
|
@ -1,28 +0,0 @@
|
||||
- id: prev_page
|
||||
translation: "পূর্ববর্তী"
|
||||
|
||||
- id: next_page
|
||||
translation: "পরবর্তী"
|
||||
|
||||
- id: read_time
|
||||
translation:
|
||||
one : "১ মিনিট"
|
||||
other: "{{ .Count }} মিনিট"
|
||||
|
||||
- id: toc
|
||||
translation: "সূচিপত্র"
|
||||
|
||||
- id: translations
|
||||
translation: "অনুবাদসমূহ"
|
||||
|
||||
- id: home
|
||||
translation: "হোম"
|
||||
|
||||
- id: edit_post
|
||||
translation: "সম্পাদনা করুন"
|
||||
|
||||
- id: code_copy
|
||||
translation: "কপি করুন"
|
||||
|
||||
- id: code_copied
|
||||
translation: "কপি হয়েছে!"
|
@ -1,19 +0,0 @@
|
||||
- id: prev_page
|
||||
translation: "Pàgina anterior"
|
||||
|
||||
- id: next_page
|
||||
translation: "Pàgina següent"
|
||||
|
||||
- id: read_time
|
||||
translation:
|
||||
one : "1 min"
|
||||
other: "{{ .Count }} min"
|
||||
|
||||
- id: toc
|
||||
translation: "Taula de Continguts"
|
||||
|
||||
- id: translations
|
||||
translation: "Traduccions"
|
||||
|
||||
- id: home
|
||||
translation: "Inici"
|
@ -1,25 +0,0 @@
|
||||
- id: prev_page
|
||||
translation: "پەڕەی پێشتر"
|
||||
|
||||
- id: next_page
|
||||
translation: "پەڕەی دواتر"
|
||||
|
||||
- id: read_time
|
||||
translation:
|
||||
one : "1 خولەک"
|
||||
other: "{{ .Count }} خولەک"
|
||||
|
||||
- id: toc
|
||||
translation: "پێڕست"
|
||||
|
||||
- id: translations
|
||||
translation: "وەرگێڕانەکان"
|
||||
|
||||
- id: home
|
||||
translation: "ماڵەوە"
|
||||
|
||||
- id: code_copy
|
||||
translation: "لەبەری بگرەوە"
|
||||
|
||||
- id: code_copied
|
||||
translation: "لەبەر گیرایەوە!"
|
@ -1,28 +0,0 @@
|
||||
- id: prev_page
|
||||
translation: "Forrige Side"
|
||||
|
||||
- id: next_page
|
||||
translation: "Næste Side"
|
||||
|
||||
- id: read_time
|
||||
translation:
|
||||
one: "1 min"
|
||||
other: "{{ .Count }} min"
|
||||
|
||||
- id: toc
|
||||
translation: "Indholdsfortegnelse"
|
||||
|
||||
- id: translations
|
||||
translation: "Oversættelser"
|
||||
|
||||
- id: home
|
||||
translation: "Start"
|
||||
|
||||
- id: edit_post
|
||||
translation: "Rediger"
|
||||
|
||||
- id: code_copy
|
||||
translation: "kopier"
|
||||
|
||||
- id: code_copied
|
||||
translation: "kopieret!"
|
@ -1,33 +0,0 @@
|
||||
- id: prev_page
|
||||
translation: "Vorherige"
|
||||
|
||||
- id: next_page
|
||||
translation: "Nächste"
|
||||
|
||||
- id: read_time
|
||||
translation:
|
||||
one: "1 Minute"
|
||||
other: "{{ .Count }} Minuten"
|
||||
|
||||
- id: words
|
||||
translation:
|
||||
one : "Wort"
|
||||
other: "{{ .Count }} Wörter"
|
||||
|
||||
- id: toc
|
||||
translation: "Inhaltsverzeichnis"
|
||||
|
||||
- id: translations
|
||||
translation: "Übersetzungen"
|
||||
|
||||
- id: home
|
||||
translation: "Home"
|
||||
|
||||
- id: edit_post
|
||||
translation: "Bearbeiten"
|
||||
|
||||
- id: code_copy
|
||||
translation: "Kopieren"
|
||||
|
||||
- id: code_copied
|
||||
translation: "Kopiert!"
|
@ -1,33 +0,0 @@
|
||||
- id: prev_page
|
||||
translation: "Prev"
|
||||
|
||||
- id: next_page
|
||||
translation: "Next"
|
||||
|
||||
- id: read_time
|
||||
translation:
|
||||
one : "1 min"
|
||||
other: "{{ .Count }} min"
|
||||
|
||||
- id: words
|
||||
translation:
|
||||
one : "word"
|
||||
other: "{{ .Count }} words"
|
||||
|
||||
- id: toc
|
||||
translation: "Table of Contents"
|
||||
|
||||
- id: translations
|
||||
translation: "Translations"
|
||||
|
||||
- id: home
|
||||
translation: "Home"
|
||||
|
||||
- id: edit_post
|
||||
translation: "Edit"
|
||||
|
||||
- id: code_copy
|
||||
translation: "copy"
|
||||
|
||||
- id: code_copied
|
||||
translation: "copied!"
|
@ -1,25 +0,0 @@
|
||||
- id: prev_page
|
||||
translation: "antaŭa paĝo"
|
||||
|
||||
- id: next_page
|
||||
translation: "sekva paĝo"
|
||||
|
||||
- id: read_time
|
||||
translation:
|
||||
one : "1 min"
|
||||
other: "{{ .Count }} min"
|
||||
|
||||
- id: toc
|
||||
translation: "Enhavo"
|
||||
|
||||
- id: translations
|
||||
translation: "tradukoj"
|
||||
|
||||
- id: home
|
||||
translation: "ĉefpaĝo"
|
||||
|
||||
- id: code_copy
|
||||
translation: "kopii"
|
||||
|
||||
- id: code_copied
|
||||
translation: "kopiite!"
|
@ -1,33 +0,0 @@
|
||||
- id: prev_page
|
||||
translation: "Anterior"
|
||||
|
||||
- id: next_page
|
||||
translation: "Siguiente"
|
||||
|
||||
- id: read_time
|
||||
translation:
|
||||
one : "1 min"
|
||||
other: "{{ .Count }} min"
|
||||
|
||||
- id: words
|
||||
translation:
|
||||
one : "palabra"
|
||||
other: "{{ .Count }} palabras"
|
||||
|
||||
- id: toc
|
||||
translation: "Tabla de Contenidos"
|
||||
|
||||
- id: translations
|
||||
translation: "Traducciones"
|
||||
|
||||
- id: home
|
||||
translation: "Inicio"
|
||||
|
||||
- id: edit_post
|
||||
translation: "Editar"
|
||||
|
||||
- id: code_copy
|
||||
translation: "copiar"
|
||||
|
||||
- id: code_copied
|
||||
translation: "¡copiado!"
|
@ -1,28 +0,0 @@
|
||||
- id: prev_page
|
||||
translation: "صفحه قبلی"
|
||||
|
||||
- id: next_page
|
||||
translation: "صفحه بعدی"
|
||||
|
||||
- id: read_time
|
||||
translation:
|
||||
one: "۱ دقیقه"
|
||||
other: "{{ .Count }} دقیقه"
|
||||
|
||||
- id: toc
|
||||
translation: "فهرست مطالب"
|
||||
|
||||
- id: translations
|
||||
translation: "ترجمه ها"
|
||||
|
||||
- id: home
|
||||
translation: "خانه"
|
||||
|
||||
- id: edit_post
|
||||
translation: "ویرایش"
|
||||
|
||||
- id: code_copy
|
||||
translation: "کپی"
|
||||
|
||||
- id: code_copied
|
||||
translation: "کپی شد!"
|
@ -1,33 +0,0 @@
|
||||
- id: prev_page
|
||||
translation: "Page précédente"
|
||||
|
||||
- id: next_page
|
||||
translation: "Page suivante"
|
||||
|
||||
- id: read_time
|
||||
translation:
|
||||
one : "1 min"
|
||||
other: "{{ .Count }} min"
|
||||
|
||||
- id: words
|
||||
translation:
|
||||
one : "mot"
|
||||
other: "{{ .Count }} mots"
|
||||
|
||||
- id: toc
|
||||
translation: "Table des matières"
|
||||
|
||||
- id: translations
|
||||
translation: "Traductions"
|
||||
|
||||
- id: home
|
||||
translation: "Accueil"
|
||||
|
||||
- id: edit_post
|
||||
translation: "Modifier"
|
||||
|
||||
- id: code_copy
|
||||
translation: "Copier"
|
||||
|
||||
- id: code_copied
|
||||
translation: "Copié !"
|
@ -1,19 +0,0 @@
|
||||
- id: prev_page
|
||||
translation: "לעמוד הקודם"
|
||||
|
||||
- id: next_page
|
||||
translation: "לעמוד הבא"
|
||||
|
||||
- id: read_time
|
||||
translation:
|
||||
one : "דקה אחת"
|
||||
other: "{{ .Count }} דקות"
|
||||
|
||||
- id: toc
|
||||
translation: "תוכן עניינים"
|
||||
|
||||
- id: translations
|
||||
translation: "תרגומים"
|
||||
|
||||
- id: home
|
||||
translation: "דף בית"
|
@ -1,19 +0,0 @@
|
||||
- id: prev_page
|
||||
translation: "पिछला"
|
||||
|
||||
- id: next_page
|
||||
translation: "अगला"
|
||||
|
||||
- id: read_time
|
||||
translation:
|
||||
one : "एक मिनट"
|
||||
other: "{{ .Count }} मिनट"
|
||||
|
||||
- id: edit_post
|
||||
translation: "सुधारें"
|
||||
|
||||
- id: toc
|
||||
translation: "विषय - सूची"
|
||||
|
||||
- id: translations
|
||||
translation: "अनुवाद"
|
@ -1,16 +0,0 @@
|
||||
- id: prev_page
|
||||
translation: "Előző oldal"
|
||||
|
||||
- id: next_page
|
||||
translation: "Következő oldal"
|
||||
|
||||
- id: read_time
|
||||
translation:
|
||||
one: "1 perc"
|
||||
other: "{{ .Count }} perc"
|
||||
|
||||
- id: toc
|
||||
translation: "Tartalomjegyzék"
|
||||
|
||||
- id: translations
|
||||
translation: "Fordítások"
|
@ -1,33 +0,0 @@
|
||||
- id: prev_page
|
||||
translation: "Sebelumnya"
|
||||
|
||||
- id: next_page
|
||||
translation: "Selanjutnya"
|
||||
|
||||
- id: read_time
|
||||
translation:
|
||||
one : "1 menit"
|
||||
other: "{{ .Count }} menit"
|
||||
|
||||
- id: words
|
||||
translation:
|
||||
one : "kata"
|
||||
other: "{{ .Count }} kata"
|
||||
|
||||
- id: toc
|
||||
translation: "Daftar isi"
|
||||
|
||||
- id: translations
|
||||
translation: "Terjemahan"
|
||||
|
||||
- id: home
|
||||
translation: "Beranda"
|
||||
|
||||
- id: edit_post
|
||||
translation: "Sunting"
|
||||
|
||||
- id: code_copy
|
||||
translation: "salin"
|
||||
|
||||
- id: code_copied
|
||||
translation: "disalin!"
|
@ -1,27 +0,0 @@
|
||||
- id: prev_page
|
||||
translation: "Pag Prec"
|
||||
|
||||
- id: next_page
|
||||
translation: "Pag Succ"
|
||||
|
||||
- id: read_time
|
||||
translation:
|
||||
one: "1 minuto"
|
||||
other: "{{ .Count }} minuti"
|
||||
|
||||
- id: words
|
||||
translation:
|
||||
one : "parola"
|
||||
other: "{{ .Count }} parole"
|
||||
|
||||
- id: toc
|
||||
translation: "Tabella dei Contenuti"
|
||||
|
||||
- id: translations
|
||||
translation: "Traduzioni"
|
||||
|
||||
- id: code_copy
|
||||
translation: "copia"
|
||||
|
||||
- id: code_copied
|
||||
translation: "copiato!"
|
@ -1,33 +0,0 @@
|
||||
- id: prev_page
|
||||
translation: "前のページ"
|
||||
|
||||
- id: next_page
|
||||
translation: "次のページ"
|
||||
|
||||
- id: read_time
|
||||
translation:
|
||||
one : "1 分"
|
||||
other: "{{ .Count }} 分"
|
||||
|
||||
- id: words
|
||||
translation:
|
||||
one: "文字"
|
||||
other: "{{ .Count }} 文字"
|
||||
|
||||
- id: toc
|
||||
translation: "目次"
|
||||
|
||||
- id: translations
|
||||
translation: "言語"
|
||||
|
||||
- id: home
|
||||
translation: "ホーム"
|
||||
|
||||
- id: edit_post
|
||||
translation: "編集"
|
||||
|
||||
- id: code_copy
|
||||
translation: "コピー"
|
||||
|
||||
- id: code_copied
|
||||
translation: "コピーされました!"
|
@ -1,33 +0,0 @@
|
||||
- id: prev_page
|
||||
translation: "이전 페이지"
|
||||
|
||||
- id: next_page
|
||||
translation: "다음 페이지"
|
||||
|
||||
- id: read_time
|
||||
translation:
|
||||
one : "1 분"
|
||||
other: "{{ .Count }} 분"
|
||||
|
||||
- id: words
|
||||
translation:
|
||||
one : "단어"
|
||||
other: "{{ .Count }} 단어"
|
||||
|
||||
- id: toc
|
||||
translation: "목차"
|
||||
|
||||
- id: translations
|
||||
translation: "번역"
|
||||
|
||||
- id: home
|
||||
translation: "홈"
|
||||
|
||||
- id: edit_post
|
||||
translation: "편집"
|
||||
|
||||
- id: code_copy
|
||||
translation: "복사"
|
||||
|
||||
- id: code_copied
|
||||
translation: "복사 완료!"
|
@ -1,25 +0,0 @@
|
||||
- id: prev_page
|
||||
translation: "Rûpela Paş"
|
||||
|
||||
- id: next_page
|
||||
translation: "Rûpela Pêş"
|
||||
|
||||
- id: read_time
|
||||
translation:
|
||||
one : "1 xulek"
|
||||
other: "{{ .Count }} xulek"
|
||||
|
||||
- id: toc
|
||||
translation: "Pêrist"
|
||||
|
||||
- id: translations
|
||||
translation: "Wergeran"
|
||||
|
||||
- id: home
|
||||
translation: "Xanî"
|
||||
|
||||
- id: code_copy
|
||||
translation: "Jê bigire"
|
||||
|
||||
- id: code_copied
|
||||
translation: "Hat jêgirtin!"
|
@ -1,25 +0,0 @@
|
||||
- id: prev_page
|
||||
translation: "Ѳмнѳх"
|
||||
|
||||
- id: next_page
|
||||
translation: "Дараах"
|
||||
|
||||
- id: read_time
|
||||
translation:
|
||||
one : "1 МИН"
|
||||
other: "{{ .Count }} МИН"
|
||||
|
||||
- id: toc
|
||||
translation: "Агуулга"
|
||||
|
||||
- id: translations
|
||||
translation: "Орчуулга"
|
||||
|
||||
- id: home
|
||||
translation: "Нүүр"
|
||||
|
||||
- id: code_copy
|
||||
translation: "хуулах"
|
||||
|
||||
- id: code_copied
|
||||
translation: "хуулсан!"
|
@ -1,28 +0,0 @@
|
||||
- id: prev_page
|
||||
translation: "Halaman Sebelumnya"
|
||||
|
||||
- id: next_page
|
||||
translation: "Halaman Seterusnya"
|
||||
|
||||
- id: read_time
|
||||
translation:
|
||||
one: "1 minit"
|
||||
other: "{{ .Count }} minit"
|
||||
|
||||
- id: toc
|
||||
translation: "Isi Kandungan"
|
||||
|
||||
- id: translations
|
||||
translation: "Terjemahan"
|
||||
|
||||
- id: home
|
||||
translation: "Home"
|
||||
|
||||
- id: edit_post
|
||||
translation: "Sunting"
|
||||
|
||||
- id: code_copy
|
||||
translation: "Salin"
|
||||
|
||||
- id: code_copied
|
||||
translation: "Disalin!"
|
@ -1,33 +0,0 @@
|
||||
- id: prev_page
|
||||
translation: "Vorige"
|
||||
|
||||
- id: next_page
|
||||
translation: "Volgende"
|
||||
|
||||
- id: read_time
|
||||
translation:
|
||||
one: "1 min"
|
||||
other: "{{ .Count }} min"
|
||||
|
||||
- id: words
|
||||
translation:
|
||||
one : "woord"
|
||||
other: "{{ .Count }} woorden"
|
||||
|
||||
- id: toc
|
||||
translation: "Inhoudsopgave"
|
||||
|
||||
- id: translations
|
||||
translation: "Vertalingen"
|
||||
|
||||
- id: home
|
||||
translation: "Startpagina"
|
||||
|
||||
- id: edit_post
|
||||
translation: "Bewerk"
|
||||
|
||||
- id: code_copy
|
||||
translation: "kopieer"
|
||||
|
||||
- id: code_copied
|
||||
translation: "gekopieerd!"
|
@ -1,28 +0,0 @@
|
||||
- id: prev_page
|
||||
translation: "Poprzednia strona"
|
||||
|
||||
- id: next_page
|
||||
translation: "Następna strona"
|
||||
|
||||
- id: read_time
|
||||
translation:
|
||||
one: "1 min"
|
||||
other: "{{ .Count }} min"
|
||||
|
||||
- id: toc
|
||||
translation: "Spis treści"
|
||||
|
||||
- id: translations
|
||||
translation: "Tłumaczenia"
|
||||
|
||||
- id: home
|
||||
translation: "Strona Główna"
|
||||
|
||||
- id: edit_post
|
||||
translation: "Edytuj"
|
||||
|
||||
- id: code_copy
|
||||
translation: "Kopiuj"
|
||||
|
||||
- id: code_copied
|
||||
translation: "Skopiowano!"
|
@ -1,21 +0,0 @@
|
||||
- id: prev_page
|
||||
translation: "Página Anterior"
|
||||
|
||||
- id: next_page
|
||||
translation: "Próxima Página"
|
||||
|
||||
- id: read_time
|
||||
translation:
|
||||
one: "1 minuto"
|
||||
other: "{{ .Count }} minutos"
|
||||
|
||||
- id: words
|
||||
translation:
|
||||
one : "palavra"
|
||||
other: "{{ .Count }} palavras"
|
||||
|
||||
- id: toc
|
||||
translation: "Conteúdo"
|
||||
|
||||
- id: translations
|
||||
translation: "Traduções"
|
@ -1,39 +0,0 @@
|
||||
- id: prev_page
|
||||
translation: "Предыдущая"
|
||||
|
||||
- id: next_page
|
||||
translation: "Следующая"
|
||||
|
||||
- id: read_time
|
||||
translation:
|
||||
zero: "0 минут"
|
||||
one: "1 минута"
|
||||
few: "{{ .Count }} минуты"
|
||||
many: "{{ .Count }} минут"
|
||||
other: "{{ .Count }} минута"
|
||||
|
||||
- id: words
|
||||
translation:
|
||||
zero: "0 слов"
|
||||
one: "1 слово"
|
||||
few: "{{ .Count }} слова"
|
||||
many: "{{ .Count }} слов"
|
||||
other: "{{ .Count }} слово"
|
||||
|
||||
- id: toc
|
||||
translation: "Оглавление"
|
||||
|
||||
- id: translations
|
||||
translation: "Переводы"
|
||||
|
||||
- id: home
|
||||
translation: "Главная"
|
||||
|
||||
- id: edit_post
|
||||
translation: "Редактировать"
|
||||
|
||||
- id: code_copy
|
||||
translation: "копировать"
|
||||
|
||||
- id: code_copied
|
||||
translation: "скопировано!"
|
@ -1,28 +0,0 @@
|
||||
- id: prev_page
|
||||
translation: "Förra Sidan"
|
||||
|
||||
- id: next_page
|
||||
translation: "Nästa Sida"
|
||||
|
||||
- id: read_time
|
||||
translation:
|
||||
one: "1 min"
|
||||
other: "{{ .Count }} min"
|
||||
|
||||
- id: toc
|
||||
translation: "Innehållsförteckning"
|
||||
|
||||
- id: translations
|
||||
translation: "Översättningar"
|
||||
|
||||
- id: home
|
||||
translation: "Hem"
|
||||
|
||||
- id: edit_post
|
||||
translation: "Redigera"
|
||||
|
||||
- id: code_copy
|
||||
translation: "kopiera"
|
||||
|
||||
- id: code_copied
|
||||
translation: "kopierad!"
|
@ -1,25 +0,0 @@
|
||||
- id: prev_page
|
||||
translation: "Önceki Sayfa"
|
||||
|
||||
- id: next_page
|
||||
translation: "Sonraki Sayfa"
|
||||
|
||||
- id: read_time
|
||||
translation:
|
||||
one : "1 dk"
|
||||
other: "{{ .Count }} dk"
|
||||
|
||||
- id: toc
|
||||
translation: "İçindekiler"
|
||||
|
||||
- id: translations
|
||||
translation: "Çeviriler"
|
||||
|
||||
- id: home
|
||||
translation: "Anasayfa"
|
||||
|
||||
- id: code_copy
|
||||
translation: "Kopyala"
|
||||
|
||||
- id: code_copied
|
||||
translation: "Kopyalandı!"
|
@ -1,25 +0,0 @@
|
||||
- id: prev_page
|
||||
translation: "Попередня"
|
||||
|
||||
- id: next_page
|
||||
translation: "Наступна"
|
||||
|
||||
- id: read_time
|
||||
translation:
|
||||
one : "1 хвилина"
|
||||
other: "{{ .Count }} хвилин"
|
||||
|
||||
- id: toc
|
||||
translation: "Зміст"
|
||||
|
||||
- id: translations
|
||||
translation: "Переклади"
|
||||
|
||||
- id: home
|
||||
translation: "Головна"
|
||||
|
||||
- id: code_copy
|
||||
translation: "копіювати"
|
||||
|
||||
- id: code_copied
|
||||
translation: "скопійовано!"
|
@ -1,20 +0,0 @@
|
||||
- id: prev_page
|
||||
translation: "Oldingi sahifa"
|
||||
|
||||
- id: next_page
|
||||
translation: "Keyingi sahifa"
|
||||
|
||||
- id: read_time
|
||||
translation:
|
||||
one : "Bir daqiqa"
|
||||
other: "{{ .Count }} daqiqa"
|
||||
|
||||
- id: toc
|
||||
translation: "Mundarija"
|
||||
|
||||
- id: translations
|
||||
translation: "Tarjimalar"
|
||||
|
||||
- id: home
|
||||
translation: "Bosh sahifa"
|
||||
|
@ -1,25 +0,0 @@
|
||||
- id: prev_page
|
||||
translation: "Trang trước"
|
||||
|
||||
- id: next_page
|
||||
translation: "Trang tiếp theo"
|
||||
|
||||
- id: read_time
|
||||
translation:
|
||||
one : "1 phút"
|
||||
other: "{{ .Count }} phút"
|
||||
|
||||
- id: toc
|
||||
translation: "Mục lục"
|
||||
|
||||
- id: translations
|
||||
translation: "Bản dịch"
|
||||
|
||||
- id: home
|
||||
translation: "Trang chủ"
|
||||
|
||||
- id: code_copy
|
||||
translation: "Sao chép"
|
||||
|
||||
- id: code_copied
|
||||
translation: "Đã sao chép!"
|
@ -1,33 +0,0 @@
|
||||
- id: prev_page
|
||||
translation: "上一頁"
|
||||
|
||||
- id: next_page
|
||||
translation: "下一頁"
|
||||
|
||||
- id: read_time
|
||||
translation:
|
||||
one : "1 分鐘"
|
||||
other: "{{ .Count }} 分鐘"
|
||||
|
||||
- id: words
|
||||
translation:
|
||||
one: "字"
|
||||
other: "{{ .Count }} 字"
|
||||
|
||||
- id: toc
|
||||
translation: "目錄"
|
||||
|
||||
- id: translations
|
||||
translation: "語言"
|
||||
|
||||
- id: home
|
||||
translation: "首頁"
|
||||
|
||||
- id: edit_post
|
||||
translation: "編輯"
|
||||
|
||||
- id: code_copy
|
||||
translation: "複製"
|
||||
|
||||
- id: code_copied
|
||||
translation: "已複製!"
|
@ -1,33 +0,0 @@
|
||||
- id: prev_page
|
||||
translation: "上一页"
|
||||
|
||||
- id: next_page
|
||||
translation: "下一页"
|
||||
|
||||
- id: read_time
|
||||
translation:
|
||||
one : "1 分钟"
|
||||
other: "{{ .Count }} 分钟"
|
||||
|
||||
- id: words
|
||||
translation:
|
||||
one: "字"
|
||||
other: "{{ .Count }} 字"
|
||||
|
||||
- id: toc
|
||||
translation: "目录"
|
||||
|
||||
- id: translations
|
||||
translation: "语言"
|
||||
|
||||
- id: home
|
||||
translation: "主页"
|
||||
|
||||
- id: edit_post
|
||||
translation: "编辑"
|
||||
|
||||
- id: code_copy
|
||||
translation: "复制"
|
||||
|
||||
- id: code_copied
|
||||
translation: "已复制!"
|
Before ![]() (image error) Size: 138 KiB |
Before ![]() (image error) Size: 16 KiB |