+ About me
+
Nice to meet you! I'm Andrew, a {{ age }}-year-old guy from Kaluga,
Russia. I have been developing software since I was 10, and I have always
been interested in technology. I'm a middle-senior C/++ developer and a
junior full-stack engineer.
1
-
-
- 1
- All titles are based on knowledge and confidence, not on official work
- experience.
+
+
+ 1
+ All titles are based on knowledge and confidence, not on official work
+ experience.
+
Here's a little more about myself:
@@ -70,11 +64,11 @@ useHead({
- My favorite field in mathematics is Algebraic Geometry.
- I work on all sorts of projects, most of the times simultaneously, which
+ I work on all sorts of projects, most of the time simultaneously, which
doesn't help with adhering to deadlines at all. However, you can always
check them out!
- FAQ
+ FAQ
- Why are you called Endermanch?
-
@@ -84,10 +78,9 @@ useHead({
end sounded pretty good. I was 14 at the time of making that decision.
-
- When will you make a new video? What happened to your
- schedule?
+
+ When will you make a new video? What happened to your schedule?
+
-
One day. Haven't been particularly motivated lately, but life's busy. 🙁
diff --git a/pages/blog/[slug].vue b/pages/blog/[slug].vue
index f36c6fe..1d4a748 100644
--- a/pages/blog/[slug].vue
+++ b/pages/blog/[slug].vue
@@ -1,15 +1,16 @@
+
+
![The Ender Chest]()
+
+
Loading document...
+
+ Loading document...
+
+
+
-
{{ data.title }}
-
-
+
{{ data.title }}
+
+
-
- {{ formatDate(data.created, 'LLLL do, y – HH:mm') }}
-
+
+
+ {{ formatDate(data.created, 'LLLL do, y – HH:mm') }}
+
+
-
+
-
- {{ data!.readingTime.text.split(' ')[0] + ' minutes to read' }}
-
+
+
+ {{ data!.readingTime.text.split(' ')[0] + ' minutes to read' }}
+
+
+
+
+
-
-
-
-
+
-
+
diff --git a/pages/blog/index.vue b/pages/blog/index.vue
index bb27fba..59bb5d6 100644
--- a/pages/blog/index.vue
+++ b/pages/blog/index.vue
@@ -3,7 +3,7 @@ import { formatDate } from 'date-fns'
const config = useAppConfig()
const meta = {
- title: 'The Enderchest',
+ title: 'The Ender Chest',
description:
'A blog about software development, scientific research and Windows quirks.',
image: `${config.url}/images/chest.png`,
@@ -25,7 +25,7 @@ useSeoMeta({
})
useHead({
- title: 'The Enderchest',
+ title: 'The Ender Chest',
htmlAttrs: {
lang: config.locale || 'en',
},
@@ -41,12 +41,12 @@ useHead({
- The Enderchest
-
- You're browsing the enderchest — a blog about software development,
+
The Ender Chest
+
+ You're browsing the Ender Chest — a blog about software development,
scientific research and Windows quirks.
- Recent posts
+ Recent posts
-
+
-
{{ post.title }}
+
{{ post.title }}
{{ post.description }}
{{ tag }}
-
+
{{ post.tags.length - 3 }} more
-
+
-
+
-
+
{{ formatDate(post.created, 'LLLL do, y – HH:mm') }}
-
+
{{ formatDate(post.updated, 'LLLL do, y – HH:mm') }}
-
+
-
+
{{ post.readingTime.text }}
@@ -127,13 +129,11 @@ useHead({
-
+
No posts found 🙁
- Back to index
+ Back to index
-
-
diff --git a/pages/index.vue b/pages/index.vue
index fd171a6..06b0695 100644
--- a/pages/index.vue
+++ b/pages/index.vue
@@ -46,18 +46,17 @@ defineRouteRules({
-
+
Welcome 👋
-
+
I'm Enderman – a software engineer, a malware
enthusiast and most importantly, a weird tall creature. I have over 300K
subscribers on YouTube and
over 25K followers on
- Twitter. Sometimes I wish there were 48 hours in a day.
+ Twitter. Sometimes I wish
+ there were 48 hours in a day.
-
+
What I do
@@ -66,7 +65,7 @@ defineRouteRules({
C/C++ for desktop applications and any common
backend stack with framework-loaded TypeScript for web. You can take
a look at my code on
- GitHub.
+ GitHub.
-
I have the most unnecessary, yet fascinating knowledge about
@@ -79,8 +78,7 @@ defineRouteRules({
-
I research and analyze modern malware, educate computer users about
it and preserve history. The repository can be found
- here.
+ here.
- I make videos for you to enjoy!
@@ -95,7 +93,7 @@ defineRouteRules({
- Philosophy
- Geopolitics
-
- Chess
+ Chess
- Solitude
diff --git a/pages/projects.vue b/pages/projects.vue
index 424e7ae..618441f 100644
--- a/pages/projects.vue
+++ b/pages/projects.vue
@@ -67,20 +67,13 @@ useHead({
-
- Projects
-
-
- 🚧 This page is currently under construction. Expect a
- lot more content to be added as time passes.
- Please report all bugs you encounter via the link in the footer,
- I will make sure to sand them down.
-
-
+
+ Projects
+
My current projects are:
-
-
+
{{ item.name }}
diff --git a/pages/social.vue b/pages/social.vue
index d2a401e..4e36f1d 100644
--- a/pages/social.vue
+++ b/pages/social.vue
@@ -115,39 +115,34 @@ useHead({
-
- Online presence
-
-
- 🚧 This page is currently under construction. Expect a
- lot more content to be added as time passes.
- Please report all bugs you encounter via the link in the footer,
- I will make sure to sand them down.
-
-
-
-
-
Social media
+
+ Online presence
+
+
+
-
-
Contact me
+
+
Contact me
Personal:
-
- Manager:
- Abuse:
+
+ Manager:
+ Abuse:
diff --git a/plugins/local.ts b/plugins/local.ts
new file mode 100644
index 0000000..57850c1
--- /dev/null
+++ b/plugins/local.ts
@@ -0,0 +1,21 @@
+export default defineNuxtPlugin(() => {
+ return {
+ provide: {
+ local: {
+ getItem(item: string) {
+ if (import.meta.client) {
+ return localStorage.getItem(item)
+ } else {
+ return undefined
+ }
+ },
+
+ setItem(item: string, value: any) {
+ if (import.meta.client) {
+ return localStorage.setItem(item, value)
+ }
+ },
+ },
+ },
+ }
+})
diff --git a/plugins/vuetify.client.ts b/plugins/vuetify.client.ts
deleted file mode 100644
index 328d941..0000000
--- a/plugins/vuetify.client.ts
+++ /dev/null
@@ -1,11 +0,0 @@
-import { aliases, iconify } from '~/iconify'
-
-export default defineNuxtPlugin((nuxtApp) => {
- nuxtApp.hook('vuetify:before-create', ({ vuetifyOptions }) => {
- vuetifyOptions.icons = {
- defaultSet: 'iconify',
- aliases,
- sets: { iconify },
- }
- })
-})
diff --git a/prettier.config.mjs b/prettier.config.mjs
new file mode 100644
index 0000000..b51228a
--- /dev/null
+++ b/prettier.config.mjs
@@ -0,0 +1,13 @@
+/**
+ * @see https://prettier.io/docs/en/configuration.html
+ * @type {import("prettier").Config}
+ */
+export default {
+ semi: false,
+ quoteProps: 'as-needed',
+ singleQuote: true,
+ useTabs: false,
+ tabWidth: 2,
+ trailingComma: 'all',
+ bracketSpacing: true,
+}
diff --git a/stores/pages.ts b/stores/pages.ts
index 661813f..52f1d21 100644
--- a/stores/pages.ts
+++ b/stores/pages.ts
@@ -1,5 +1,3 @@
-import { defineStore } from 'pinia'
-
import aboutIcon from '~/assets/images/icons/accent/info.png'
import projectIcon from '~/assets/images/icons/defrag.png'
import socialIcon from '~/assets/images/icons/user.png'
@@ -50,8 +48,9 @@ export const usePageStore = defineStore('page', () => {
},
])
- const reader = ref(false)
- const animate = ref(true)
+ const reader = ref
(false)
+ const animate = ref(false)
+ const dark = ref(false)
function _autoFetchPages() {
while (pages.value.length) pages.value.pop()
diff --git a/stylelint.config.mjs b/stylelint.config.mjs
new file mode 100644
index 0000000..7512e29
--- /dev/null
+++ b/stylelint.config.mjs
@@ -0,0 +1,24 @@
+/** @type {import("stylelint").Config} */
+export default {
+ defaultSeverity: 'warning',
+ formatter: 'compact',
+ cache: false,
+ fix: true,
+ extends: [
+ 'stylelint-config-standard-scss',
+ 'stylelint-config-recommended-scss',
+ 'stylelint-config-tailwindcss/scss',
+ 'stylelint-config-recommended-vue/scss',
+ ],
+ plugins: ['stylelint-scss'],
+ rules: {
+ 'at-rule-no-unknown': null,
+ 'scss/at-rule-no-unknown': [
+ true,
+ {
+ ignoreAtRules: ['tailwind', 'responsive', 'screen'],
+ },
+ ],
+ 'declaration-empty-line-before': null,
+ },
+}
diff --git a/tailwind.config.ts b/tailwind.config.ts
index b965231..88644ea 100644
--- a/tailwind.config.ts
+++ b/tailwind.config.ts
@@ -11,6 +11,14 @@ export default >{
'2xl': '2560px',
desktop: '960px',
+ // Landscape Mobile (LM)
+ lm: {
+ raw: '(max-height: 600px)',
+ },
+ // Landscape Tablet (LT)
+ lt: {
+ raw: '(max-height: 996px) and (min-width: 601px) and (max-width: 1280px)',
+ },
},
fontFamily: {
sans: [
@@ -38,6 +46,7 @@ export default >{
'monospace',
],
alex: ['Alexandria', 'serif'],
+ enchant: ['Enchant', 'serif'],
lato: ['Lato', 'sans-serif'],
},
},