diff --git a/src/components/Header.astro b/src/components/Header.astro index e991388..74d8b3e 100644 --- a/src/components/Header.astro +++ b/src/components/Header.astro @@ -1,73 +1,206 @@ -
-
- +
+ + + + -
\ No newline at end of file + + 04 / ABOUT + + + +
+ + +``` + +
+ + diff --git a/src/components/Hero.astro b/src/components/Hero.astro index 0031125..4223c93 100644 --- a/src/components/Hero.astro +++ b/src/components/Hero.astro @@ -1,81 +1,130 @@ -
+
+
+ + +
+ +
- +
- -
+ +
- - + + + SYSTEM ONLINE + + / + + ALASTOR.LOL
-
- SYSTEMS / AUTOMATION / INFRASTRUCTURE -
- +

- BUILD. -
- BREAK. -
- UNDERSTAND. -
- REPEAT. + BUILD. + + + BREAK. + + + + + UNDERSTAND. + + + + REPEAT.

-
- -

- Systems administrator and infrastructure engineer. - I build infrastructure, automate systems and investigate - things when they inevitably break. -

- - - -
+ +

+ Systems administrator and infrastructure engineer. + I build infrastructure, automate systems and investigate + things when they inevitably break. +

+ + +
+ LINUX + NETWORKING + AUTOMATION + HOMELAB +
+
- -
- -
- +
+ +
- + SYSTEM STATUS @@ -85,102 +134,108 @@ OPERATIONAL -
- -
- CAPABILITIES + +
+ $ +   ./check-system.sh
-
- + +
- Linux - ● + + Linux + + + + ● OK +
-
-
- Infrastructure - ● + + Infrastructure + + + + ● OK +
-
-
- Networking - ● + + Networking + + + + ● OK +
-
-
- Automation - ● -
+ + Automation + + + ● OK + +
-
- + +
- HOMELAB - 87% + + HOMELAB + + + + 87% +
-
-
+
+
-
-
- -
-
HOSTS
-
06
-
- -
-
SERVICES
-
30+
-
- -
- -
- + +
- UPTIME - 99.9% + HOSTS + 06
- STATUS - BUILDING + SERVICES + 30+
+
+ UPTIME + + 99.9% + +
-
-
-
-
-
+ diff --git a/src/components/Now.astro b/src/components/Now.astro index 6763327..3914742 100644 --- a/src/components/Now.astro +++ b/src/components/Now.astro @@ -1,166 +1,273 @@
-
-
+``` + +
+
+ 01 / NOW + + + + + +
+ +
+ + + SYNCING +
+
+ + +
+ + +
+
+ CURRENT STATE
-
- +
+ - SYNCING +
+
+ Building things, +
+ breaking things, +
+ understanding why. +
+ +
+ ALASTOR.LOL +
+
-
- -
-
- CURRENT STATE -
- -
- Building things,
- break fixing things. -
-
- -
-
-
+ +
+
+
+ ♪ LISTENING -
+ - +
- - Loading... - - -
- Spotify -
- -
- SPOTIFY -
+ + 01 +
-
-
-
- PLAYING -
- + +
+ +
+
+ Loading... +
+ +
+ Spotify +
+
- - Loading... - +
+ + SPOTIFY + -
- Steam + + 30s + +
+
+ + +
+
+
+ + PLAYING + + +
-
- STEAM -
+ + 02 +
-
- + + +
+
+
BUILDING
-
- alastor.lol -
+ + 03 + +
-
- This website -
+
+
+
+ -
- ASTRO · TYPESCRIPT + +
+ +
+
+ alastor.lol +
+ +
+ This website +
+
+
+ + ASTRO · TS + + + + ACTIVE + +
+
+
+ + +
+
+ ACTIVITY FEED + + WAITING FOR SYNC
+
+ SPOTIFY / STEAM / LOCAL +
+``` + +
\ No newline at end of file + diff --git a/src/components/Projects.astro b/src/components/Projects.astro index 565f652..272d92f 100644 --- a/src/components/Projects.astro +++ b/src/components/Projects.astro @@ -1,4 +1,3 @@ - --- import { getCollection } from "astro:content"; @@ -11,83 +10,116 @@ const projects = await getCollection("projects", ({ data }) => { id="projects" class="border-t border-[var(--border)]" > -
+
- -
+
-
- 02 / PROJECTS +
+ 02 + / + PROJECTS
-

- Things I build. +

+ Things I + build.

-

- Infrastructure, automation, networking and experiments. - Some are production systems. Some are glorified - learning exercises. -

+
+

+ Infrastructure, automation, networking and experiments. + Some are production systems. Some are glorified learning + exercises. +

+
- - -
+ +
{ projects.map((project, index) => ( -
- - - -
- {String(index + 1).padStart(2, "0")} -
+ +
+ {String(index + 1).padStart(2, "0")} +
- +
-
+ +
-
+
-

- {project.data.title} -

+
+ PROJECT {String(index + 1).padStart(2, "0")} +
- - → - +
+ + + + + {project.data.status} + + +
-

- {project.data.description} -

+ + +
+ +

+ {project.data.title} +

+ +

+ {project.data.description} +

+ +
- - -
+ +
{ project.data.stack.map((item) => ( - + {item} )) @@ -95,42 +127,21 @@ const projects = await getCollection("projects", ({ data }) => {
-
- +
- - {project.data.status} + + EXPLORE PROJECT + + + + →
- - - - -
@@ -141,18 +152,22 @@ const projects = await getCollection("projects", ({ data }) => { +
-
- - - {projects.length} PROJECTS - +
+ + {projects.length} PROJECTS +
- VIEW ALL PROJECTS → + VIEW ALL PROJECTS + + + → +
@@ -161,3 +176,5 @@ const projects = await getCollection("projects", ({ data }) => { + + diff --git a/src/pages/rickroll.astro b/src/pages/rickroll.astro new file mode 100644 index 0000000..b94882a --- /dev/null +++ b/src/pages/rickroll.astro @@ -0,0 +1,88 @@ +--- +import Layout from "../layouts/Layout.astro"; +--- + + +
+
+ +
+
+
+ + SECURITY INCIDENT + + + + + CRITICAL + +
+ +
+
+ ERR / 0x1337 / ALASTOR.LOL +
+ +

+ Внимание! +
+ + Вас зарикроллили! + +

+ +
+ +
+ +
+ + STATUS: YOU SHOULD HAVE KNOWN BETTER + + + + ← RETURN TO SAFETY + +
+
+
+ +
+ No systems were harmed during this incident. +
+
+
+
\ No newline at end of file diff --git a/src/styles/global.css b/src/styles/global.css index 6223db8..86ce172 100644 --- a/src/styles/global.css +++ b/src/styles/global.css @@ -1,119 +1,643 @@ + @import "tailwindcss"; :root { - --bg: #090909; - --surface: #0e0e0e; - --surface-hover: #131313; + --bg: #090909; + --surface: #0e0e0e; + --surface-hover: #131313; - --text: #e7e7e7; - --muted: #777; - --border: #242424; + --text: #e7e7e7; + --muted: #777; + --border: #242424; - --accent: #b8ff00; + --accent: #b8ff00; } html { - background: var(--bg); - color: var(--text); - scroll-behavior: smooth; + background: var(--bg); + color: var(--text); + scroll-behavior: smooth; } body { - margin: 0; - min-width: 320px; - background: - linear-gradient( - rgba(255, 255, 255, 0.012) 1px, - transparent 1px - ), - linear-gradient( - 90deg, - rgba(255, 255, 255, 0.012) 1px, - transparent 1px - ), - var(--bg); + margin: 0; + min-width: 320px; + background: var(--bg); - background-size: 48px 48px; - - font-family: - Inter, - ui-sans-serif, - system-ui, - -apple-system, - BlinkMacSystemFont, - "Segoe UI", - sans-serif; - - -webkit-font-smoothing: antialiased; - text-rendering: optimizeLegibility; + font-family: + Inter, + ui-sans-serif, + system-ui, + -apple-system, + BlinkMacSystemFont, + "Segoe UI", + sans-serif; } ::selection { - background: var(--accent); - color: #000; + background: var(--accent); + color: #000; } a { - color: inherit; - text-decoration: none; -} - -button, -a { - -webkit-tap-highlight-color: transparent; -} - -:focus-visible { - outline: 1px solid var(--accent); - outline-offset: 4px; + color: inherit; + text-decoration: none; } .font-mono { - font-family: - "JetBrains Mono", - "SFMono-Regular", - Consolas, - "Liberation Mono", - monospace; + font-family: + "JetBrains Mono", + "SFMono-Regular", + Consolas, + "Liberation Mono", + monospace; } -/* Scrollbar */ -::-webkit-scrollbar { - width: 8px; +/* ───────────────────────────────────────── + Markdown / Article typography + ───────────────────────────────────────── */ + +.prose { + max-width: 760px; + color: var(--text); + font-size: 0.95rem; + line-height: 1.85; } -::-webkit-scrollbar-track { - background: var(--bg); +.prose > *:first-child { + margin-top: 0; } -::-webkit-scrollbar-thumb { - background: #292929; +.prose > *:last-child { + margin-bottom: 0; } -::-webkit-scrollbar-thumb:hover { - background: #3a3a3a; + +/* Headings */ + +.prose h1 { + margin-top: 3rem; + margin-bottom: 1.25rem; + + font-size: 2.25rem; + line-height: 1.15; + font-weight: 700; + letter-spacing: -0.035em; } -/* Firefox */ +.prose h2 { + margin-top: 3rem; + margin-bottom: 1rem; -* { - scrollbar-width: thin; - scrollbar-color: #292929 var(--bg); + font-size: 1.65rem; + line-height: 1.25; + font-weight: 650; + letter-spacing: -0.025em; } -/* Motion */ +.prose h3 { + margin-top: 2.25rem; + margin-bottom: 0.75rem; -@media (prefers-reduced-motion: reduce) { - html { - scroll-behavior: auto; - } - - *, - *::before, - *::after { - animation-duration: 0.01ms !important; - animation-iteration-count: 1 !important; - transition-duration: 0.01ms !important; - } + font-size: 1.2rem; + line-height: 1.35; + font-weight: 600; +} + +.prose h4 { + margin-top: 1.75rem; + margin-bottom: 0.5rem; + + font-size: 1rem; + font-weight: 600; +} + + +/* Paragraphs */ + +.prose p { + margin-top: 1.25rem; + margin-bottom: 1.25rem; +} + + +/* Links */ + +.prose a { + color: var(--accent); + text-decoration: underline; + text-decoration-color: color-mix( + in srgb, + var(--accent) 40%, + transparent + ); + text-underline-offset: 3px; + + transition: + color 150ms ease, + text-decoration-color 150ms ease; +} + +.prose a:hover { + color: var(--text); + text-decoration-color: var(--text); +} + + +/* Lists */ + +.prose ul, +.prose ol { + margin-top: 1.25rem; + margin-bottom: 1.25rem; + padding-left: 1.5rem; +} + +.prose ul { + list-style-type: disc; +} + +.prose ol { + list-style-type: decimal; +} + +.prose li { + margin-top: 0.45rem; + padding-left: 0.25rem; +} + +.prose li::marker { + color: var(--accent); +} + +.prose li > ul, +.prose li > ol { + margin-top: 0.5rem; + margin-bottom: 0.5rem; +} + + +/* Blockquotes */ + +.prose blockquote { + margin: 2rem 0; + padding: 0.75rem 0 0.75rem 1.25rem; + + border-left: 2px solid var(--accent); + + color: var(--muted); + font-style: italic; +} + +.prose blockquote p { + margin: 0; +} + + +/* Inline code */ + +.prose :not(pre) > code { + padding: 0.15rem 0.4rem; + + border: 1px solid var(--border); + background: var(--surface); + + color: var(--accent); + + font-family: + "JetBrains Mono", + "SFMono-Regular", + Consolas, + monospace; + + font-size: 0.82em; +} + + +/* Code blocks */ + +.prose pre { + position: relative; + + margin: 2rem 0; + padding: 1.25rem 1.5rem; + + overflow-x: auto; + + border: 1px solid var(--border); + background: #070707; + + font-family: + "JetBrains Mono", + "SFMono-Regular", + Consolas, + monospace; + + font-size: 0.8rem; + line-height: 1.7; + + scrollbar-width: thin; +} + +.prose pre code { + padding: 0; + border: 0; + background: transparent; + + color: var(--text); + font-size: inherit; +} + + +/* Horizontal rule */ + +.prose hr { + margin: 3rem 0; + + border: 0; + border-top: 1px solid var(--border); +} + + +/* Images */ + +.prose img { + display: block; + + width: 100%; + height: auto; + + margin: 2rem 0; + + border: 1px solid var(--border); +} + + +/* Tables */ + +.prose table { + width: 100%; + margin: 2rem 0; + + border-collapse: collapse; + + font-size: 0.85rem; +} + +.prose th, +.prose td { + padding: 0.75rem 1rem; + + border: 1px solid var(--border); + + text-align: left; +} + +.prose th { + background: var(--surface); + + font-family: + "JetBrains Mono", + "SFMono-Regular", + Consolas, + monospace; + + font-size: 0.7rem; + text-transform: uppercase; + letter-spacing: 0.08em; +} + +.prose td { + color: var(--muted); +} + + +/* Strong / emphasis */ + +.prose strong { + color: var(--text); + font-weight: 650; +} + +.prose em { + color: var(--muted); +} + + +/* Definition-style spacing */ + +.prose dl { + margin: 1.5rem 0; +} + +.prose dt { + margin-top: 1rem; + + font-weight: 600; +} + +.prose dd { + margin-left: 1.5rem; + color: var(--muted); +} + + +/* Mobile */ + +@media (max-width: 640px) { + .prose { + font-size: 0.9rem; + line-height: 1.8; + } + + .prose h1 { + font-size: 1.9rem; + } + + .prose h2 { + font-size: 1.4rem; + } + + .prose h3 { + font-size: 1.1rem; + } + + .prose pre { + margin-left: -0.5rem; + margin-right: -0.5rem; + + padding: 1rem; + } + + .prose table { + display: block; + overflow-x: auto; + } +} +/* ───────────────────────────────────────────── + Markdown / Article typography + ───────────────────────────────────────────── */ + +.markdown { + max-width: none; + color: var(--text); + font-size: 0.95rem; + line-height: 1.8; +} + +.markdown > *:first-child { + margin-top: 0; +} + +.markdown > *:last-child { + margin-bottom: 0; +} + +/* Headings */ + +.markdown h1, +.markdown h2, +.markdown h3, +.markdown h4 { + color: var(--text); + font-weight: 700; + letter-spacing: -0.025em; + line-height: 1.2; +} + +.markdown h1 { + margin-top: 3rem; + margin-bottom: 1.25rem; + font-size: 2.25rem; +} + +.markdown h2 { + margin-top: 3rem; + margin-bottom: 1rem; + padding-bottom: 0.65rem; + border-bottom: 1px solid var(--border); + font-size: 1.65rem; +} + +.markdown h3 { + margin-top: 2.25rem; + margin-bottom: 0.75rem; + font-size: 1.25rem; +} + +.markdown h4 { + margin-top: 1.75rem; + margin-bottom: 0.65rem; + font-size: 1rem; +} + +/* Paragraphs */ + +.markdown p { + margin: 1.15rem 0; + color: #c4c4c4; +} + +/* Strong / emphasis */ + +.markdown strong { + color: var(--text); + font-weight: 650; +} + +.markdown em { + color: #d0d0d0; +} + +/* Links */ + +.markdown a { + color: var(--accent); + text-decoration: underline; + text-decoration-color: color-mix( + in srgb, + var(--accent) 35%, + transparent + ); + text-underline-offset: 3px; + transition: + text-decoration-color 150ms ease, + opacity 150ms ease; +} + +.markdown a:hover { + text-decoration-color: var(--accent); +} + +/* Lists */ + +.markdown ul, +.markdown ol { + margin: 1.25rem 0; + padding-left: 1.5rem; + color: #c4c4c4; +} + +.markdown ul { + list-style-type: disc; +} + +.markdown ol { + list-style-type: decimal; +} + +.markdown li { + margin: 0.45rem 0; + padding-left: 0.25rem; +} + +.markdown li::marker { + color: var(--muted); +} + +.markdown li > ul, +.markdown li > ol { + margin-top: 0.45rem; + margin-bottom: 0.45rem; +} + +/* Inline code */ + +.markdown :not(pre) > code { + border: 1px solid var(--border); + background: var(--surface); + padding: 0.15rem 0.4rem; + color: var(--accent); + font-family: + "JetBrains Mono", + "SFMono-Regular", + Consolas, + "Liberation Mono", + monospace; + font-size: 0.82em; +} + +/* Code blocks */ + +.markdown pre { + position: relative; + overflow-x: auto; + margin: 1.75rem 0; + border: 1px solid var(--border); + background: #050505; + padding: 1.25rem 1.35rem; + color: #d8d8d8; + font-family: + "JetBrains Mono", + "SFMono-Regular", + Consolas, + "Liberation Mono", + monospace; + font-size: 0.8rem; + line-height: 1.7; +} + +.markdown pre code { + font-family: inherit; + font-size: inherit; +} + +/* Blockquotes */ + +.markdown blockquote { + margin: 1.75rem 0; + border-left: 2px solid var(--accent); + background: var(--surface); + padding: 1rem 1.25rem; + color: #bdbdbd; +} + +.markdown blockquote p { + margin: 0; +} + +/* Horizontal rule */ + +.markdown hr { + margin: 3rem 0; + border: 0; + border-top: 1px solid var(--border); +} + +/* Tables */ + +.markdown table { + width: 100%; + margin: 1.75rem 0; + border-collapse: collapse; + font-size: 0.85rem; +} + +.markdown thead { + background: var(--surface); +} + +.markdown th, +.markdown td { + border: 1px solid var(--border); + padding: 0.7rem 0.8rem; + text-align: left; +} + +.markdown th { + color: var(--text); + font-family: + "JetBrains Mono", + "SFMono-Regular", + Consolas, + monospace; + font-size: 0.7rem; + font-weight: 500; + letter-spacing: 0.08em; + text-transform: uppercase; +} + +.markdown td { + color: #bdbdbd; +} + +/* Images */ + +.markdown img { + display: block; + max-width: 100%; + height: auto; + margin: 2rem auto; + border: 1px solid var(--border); +} + +/* Small screens */ + +@media (max-width: 640px) { + .markdown { + font-size: 0.9rem; + } + + .markdown h1 { + font-size: 1.8rem; + } + + .markdown h2 { + font-size: 1.4rem; + } + + .markdown pre { + margin-left: -1rem; + margin-right: -1rem; + border-left: 0; + border-right: 0; + padding: 1rem; + border-radius: 0; + } + + .markdown table { + display: block; + overflow-x: auto; + } }