Compare commits

...

10 Commits

Author SHA1 Message Date
Nate Anderson
c10b765903 Update theme, posts, created projects page 2025-01-10 16:13:20 -07:00
Tom
ff4602ec71 Add WIP crypto post 2024-02-20 08:53:21 -07:00
cfb82735b1 executable to update script, finished easy going article 2024-01-04 12:17:45 -07:00
00a26e4750 Add nginx post 2024-01-04 11:53:40 -07:00
8e26ac53bf Fix edit to view content on make a change 2023-08-15 03:35:04 -06:00
28842a12a7 formatting 2023-08-15 03:20:47 -06:00
1614b572c6 Spelling and formatting, fixed image 2023-08-15 03:02:50 -06:00
804b912e88 Add arch post 2023-08-15 02:48:06 -06:00
Tom
328d5412cc That felt good 2022-12-30 01:31:32 -07:00
Tom
22ac56fa92 Added first jb post 2022-12-27 02:08:22 -07:00
144 changed files with 590 additions and 5066 deletions

3
.gitmodules vendored Normal file
View File

@ -0,0 +1,3 @@
[submodule "themes/gokarna"]
path = themes/gokarna
url = https://github.com/gokarna-theme/gokarna-hugo.git

2
.ignore Normal file
View File

@ -0,0 +1,2 @@
themes/
static/

77
config.toml Normal file
View 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

View File

@ -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
View File

@ -0,0 +1,3 @@
## Hello Weary Traveler
Took alot of effort to fetch those bytes, hope I have something here worth your while.

View 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

View File

@ -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.

View 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/

View File

@ -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
![image](/images/japan-mcdonalds.jpg#center)
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.

View File

@ -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.

View File

@ -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.

View File

@ -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
![image](/images/japan-noodle-cup.JPG#center)
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.

View 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.

View 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.
![image](/images/eagle-wizard.jpg#center)
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.

View 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

View 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 :)

View 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.

View 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
View 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:]()

View 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>

View File

@ -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..."
---

Binary file not shown.

After

(image error) Size: 23 KiB

Binary file not shown.

After

(image error) Size: 92 KiB

BIN
static/apple-touch-icon.png Normal file

Binary file not shown.

After

(image error) Size: 21 KiB

BIN
static/favicon-16x16.png Normal file

Binary file not shown.

After

(image error) Size: 815 B

BIN
static/favicon-32x32.png Normal file

Binary file not shown.

After

(image error) Size: 2.1 KiB

BIN
static/favicon.ico Normal file

Binary file not shown.

After

Width: 48px  |  Height: 48px  |  Size: 15 KiB

BIN
static/images/arch-logo.png Normal file

Binary file not shown.

After

(image error) Size: 320 KiB

Binary file not shown.

After

(image error) Size: 274 KiB

Binary file not shown.

After

(image error) Size: 240 KiB

Binary file not shown.

After

(image error) Size: 870 KiB

Binary file not shown.

After

(image error) Size: 121 KiB

1
static/site.webmanifest Normal file
View 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"}

View 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

View File

@ -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. -->

View File

@ -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.

View File

@ -1,7 +0,0 @@
---
name: New Blank Issue
about: Anything other than bug report
title: ""
labels: ""
assignees: ""
---

View File

@ -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.

View File

@ -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

View File

@ -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

View File

@ -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.

View File

@ -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.
[![Minimum Hugo Version](https://img.shields.io/static/v1?label=min-HUGO-version&message=0.83.0&color=blue&logo=hugo)](https://github.com/gohugoio/hugo/releases/tag/v0.83.0)
[![Build GH-Pages](https://github.com/adityatelange/hugo-PaperMod/workflows/Build%20GH-Pages/badge.svg)](https://github.com/adityatelange/hugo-PaperMod/deployments/activity_log?environment=github-pages)
[![GitHub](https://img.shields.io/github/license/adityatelange/hugo-PaperMod)](https://github.com/adityatelange/hugo-PaperMod/blob/master/LICENSE)
[![hugo-papermod](https://img.shields.io/badge/Hugo--Themes-@PaperMod-blue)](https://themes.gohugo.io/themes/hugo-papermod/)
[![Quality Gate Status](https://sonarcloud.io/api/project_badges/measure?project=adityatelange_hugo-PaperMod&metric=alert_status)](https://sonarcloud.io/dashboard?id=adityatelange_hugo-PaperMod)
![code-size](https://img.shields.io/github/languages/code-size/adityatelange/hugo-PaperMod)
[![Discord](https://img.shields.io/discord/971046860317921340?label=Discord)](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>[![Stargazers over time](https://starchart.cc/adityatelange/hugo-PaperMod.svg)](https://starchart.cc/adityatelange/hugo-PaperMod)</kbd>

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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);
}

View File

@ -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;
}

View File

@ -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);
}

View File

@ -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);
}

View File

@ -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 { }

View File

@ -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);
}

View File

@ -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
*/

View File

@ -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%;
}

View File

@ -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);
}

View File

@ -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;
}
}

View File

@ -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
*/

View File

@ -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;
}

View File

@ -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;
}
}

View File

@ -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}&nbsp;»</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
}
}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -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
*/

View File

@ -1,3 +0,0 @@
module github.com/adityatelange/hugo-PaperMod
go 1.12

View File

@ -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: "الصفحة الرئيسية"

View File

@ -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: "Преводи"

View File

@ -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: "কপি হয়েছে!"

View File

@ -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"

View File

@ -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: "لەبەر گیرایەوە!"

View File

@ -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!"

View File

@ -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!"

View File

@ -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!"

View File

@ -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!"

View File

@ -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!"

View File

@ -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: "کپی شد!"

View File

@ -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é !"

View File

@ -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: "דף בית"

View File

@ -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: "अनुवाद"

View File

@ -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"

View File

@ -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!"

View File

@ -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!"

View File

@ -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: "コピーされました!"

View File

@ -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: "복사 완료!"

View File

@ -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!"

View File

@ -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: "хуулсан!"

View File

@ -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!"

View File

@ -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!"

View File

@ -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!"

View File

@ -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"

View File

@ -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: "скопировано!"

View File

@ -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!"

View File

@ -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ı!"

View File

@ -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: "скопійовано!"

View File

@ -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"

View File

@ -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!"

View File

@ -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: "已複製!"

View File

@ -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: "已复制!"

Binary file not shown.

Before

(image error) Size: 138 KiB

Binary file not shown.

Before

(image error) Size: 16 KiB

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