new website
This commit is contained in:
parent
98ecf63687
commit
4fe44f4a9e
4 changed files with 629 additions and 207 deletions
|
|
@ -1,4 +1,4 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100">
|
||||
<rect width="100" height="100" rx="20" fill="#000080"/>
|
||||
<path d="M30 30 L70 50 L30 70" stroke="white" stroke-width="12" fill="none" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
<rect width="100" height="100" rx="22" fill="#1a6b3c"/>
|
||||
<text x="50" y="66" font-family="-apple-system,BlinkMacSystemFont,sans-serif" font-size="44" font-weight="700" fill="white" text-anchor="middle">JB</text>
|
||||
</svg>
|
||||
|
|
|
|||
|
Before Width: | Height: | Size: 255 B After Width: | Height: | Size: 285 B |
454
index.html
454
index.html
|
|
@ -1,174 +1,308 @@
|
|||
<!DOCTYPE html>
|
||||
<!doctype html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||
<link href="./style.css" rel="stylesheet" />
|
||||
<link rel="icon" type="image/svg+xml" href="favicon.svg" />
|
||||
<title>Jakub Bronk | Portfolio</title>
|
||||
</head>
|
||||
<head>
|
||||
<meta charset="UTF-8" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||
<link href="./style.css" rel="stylesheet" />
|
||||
<link rel="icon" type="image/svg+xml" href="favicon.svg" />
|
||||
<title>Jakub Bronk | Portfolio</title>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<header>
|
||||
<h1>Jakub Bronk</h1>
|
||||
<div>
|
||||
<a href="mailto:bronk.jakub@proton.me">Email</a>
|
||||
<a href="https://github.com/Bronku">GitHub</a>
|
||||
<span> Somonino, Poland </span>
|
||||
</div>
|
||||
</header>
|
||||
<body>
|
||||
<header>
|
||||
<div>
|
||||
<h1>Jakub Bronk</h1>
|
||||
<p>
|
||||
Computer Science student @ Gdańsk University of Technology
|
||||
</p>
|
||||
</div>
|
||||
<nav>
|
||||
<a href="#experience">Experience</a>
|
||||
<a href="#projects">Projects</a>
|
||||
<a href="#availability">Availability</a>
|
||||
</nav>
|
||||
</header>
|
||||
|
||||
<section>
|
||||
<p>
|
||||
Computer Science student at Gdańsk University of Technology with strong
|
||||
foundations in algorithms, systems programming, and Linux environments.
|
||||
Experienced in Go, C/C++, and C# as well as familiar with Java, Python,
|
||||
Ruby, Rust, and TypeScript, through academic and personal projects,
|
||||
including self-hosted infrastructure and low-level development.
|
||||
</p>
|
||||
<section id="about">
|
||||
<p>
|
||||
Computer Science student at Gdańsk University of Technology with
|
||||
strong foundations in algorithms, systems programming, and Linux
|
||||
environments. Experienced in Go, C/C++, and Python, as well as
|
||||
familiar with Java, Ruby, Rust, and TypeScript - through
|
||||
academic, personal, and professional projects including
|
||||
full-stack web development, compiler design, and self-hosted
|
||||
infrastructure.
|
||||
</p>
|
||||
<div class="contact-bar">
|
||||
<a href="mailto:bronk.jakub@proton.me">bronk.jakub@proton.me</a>
|
||||
<a href="https://git.bronku.xyz">git.bronku.xyz</a>
|
||||
<span>Somonino, Poland</span>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<h2>AVAILABILITY & COMMITMENT</h2>
|
||||
<p>
|
||||
I am looking for a long-term professional relationship rather than a
|
||||
short-term placement. My intended availability is as follows:
|
||||
</p>
|
||||
<ul>
|
||||
<li>
|
||||
<b>Current Semester:</b> Part-time internship (approx. 20h/week).
|
||||
</li>
|
||||
<li><b>Summer 2026:</b> Transition to full-time engineering.</li>
|
||||
<li>
|
||||
<b>Academic Year 2026/27:</b> Return to part-time until graduation.
|
||||
</li>
|
||||
<li><b>Post-Graduation:</b> Transition to permanent full-time role.</li>
|
||||
</ul>
|
||||
</section>
|
||||
<section id="experience">
|
||||
<h2>Experience</h2>
|
||||
<div class="entry">
|
||||
<div class="entry-head">
|
||||
<h3>Software Engineering Intern</h3>
|
||||
<span class="entry-meta"
|
||||
>Vention Teams · February 2026 – April 2026</span
|
||||
>
|
||||
</div>
|
||||
<p>
|
||||
Contributed to a full-stack web application. Worked with
|
||||
Ruby on Rails, React, TypeScript, and RTK Query in a team -
|
||||
delivering features, reviewing code, and participating in
|
||||
the full development lifecycle.
|
||||
</p>
|
||||
<div class="tags">
|
||||
<span>Ruby on Rails</span>
|
||||
<span>React</span>
|
||||
<span>TypeScript</span>
|
||||
<span>RTK Query</span>
|
||||
<span>PostgreSQL</span>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section>
|
||||
<h2>SELECTED PROJECTS</h2>
|
||||
<section>
|
||||
<h3>B+ Tree Implementation <span>Rust</span></h3>
|
||||
<p>
|
||||
A disk-friendly B+ tree implementation focusing on memory-efficient
|
||||
data structures and safety.
|
||||
</p>
|
||||
</section>
|
||||
<section id="projects">
|
||||
<h2>Selected Projects</h2>
|
||||
<div class="project-grid">
|
||||
<article class="card">
|
||||
<a
|
||||
href="https://new.piekarnikgosi.pl"
|
||||
class="card-img"
|
||||
target="_blank"
|
||||
>
|
||||
<img
|
||||
src="screenshots/piekarnikgosi-hero.avif"
|
||||
alt="piekarnikgosi.pl screenshot"
|
||||
loading="lazy"
|
||||
/>
|
||||
</a>
|
||||
<div class="card-body">
|
||||
<h3>piekarnikgosi.pl</h3>
|
||||
<p>
|
||||
A multi-page business website for a local cake shop
|
||||
and café, built for a real client. Features include
|
||||
a categorized product catalog, photo gallery with
|
||||
lightbox, café landing page, and contact information
|
||||
- all server-rendered with HTMX-powered navigation
|
||||
for instant page transitions.
|
||||
</p>
|
||||
<div class="tags">
|
||||
<span>HTML/CSS</span>
|
||||
<span>HTMX</span>
|
||||
<span>Go</span>
|
||||
<span>JavaScript</span>
|
||||
</div>
|
||||
<div class="card-links">
|
||||
<a href="https://new.piekarnikgosi.pl"
|
||||
>→ Live site</a
|
||||
>
|
||||
<a
|
||||
href="https://git.bronku.xyz/bronku/piekarnikgosipl"
|
||||
>→ Source</a
|
||||
>
|
||||
</div>
|
||||
</div>
|
||||
</article>
|
||||
|
||||
<section>
|
||||
<h3>
|
||||
Python-to-Ruby Transpiler
|
||||
<span>Flex / Bison / C++ / Make</span>
|
||||
</h3>
|
||||
<p>
|
||||
A compiler-front-end project focused on lexer/parser design. This
|
||||
project allowed me to familiarize myself with lexer and parser design,
|
||||
engineer a lexing solution for significant indentation in Python,
|
||||
while effectively modeling real-world objects through class design.
|
||||
Solved complex build challenges involving circular dependencies.
|
||||
</p>
|
||||
</section>
|
||||
<article class="card">
|
||||
<div class="card-body">
|
||||
<h3>Cake Order Tracker</h3>
|
||||
<p>
|
||||
Production-ready order management system for the
|
||||
same cake shop. Single-binary Go application with
|
||||
SQLite persistence, and a dynamic HTMX frontend.
|
||||
Features real-time order filtering, transactional
|
||||
integrity, and zero-dependency deployment.
|
||||
</p>
|
||||
<div class="tags">
|
||||
<span>Go</span>
|
||||
<span>SQLite</span>
|
||||
<span>HTMX</span>
|
||||
<span>SQL</span>
|
||||
</div>
|
||||
<div class="card-links">
|
||||
<a
|
||||
href="https://git.bronku.xyz/bronku/cake-order-tracker"
|
||||
>→ Source</a
|
||||
>
|
||||
</div>
|
||||
</div>
|
||||
</article>
|
||||
|
||||
<section>
|
||||
<h3>External Sorting Implementation <span>C++</span></h3>
|
||||
<p>
|
||||
High-performance implementation for sorting datasets exceeding RAM
|
||||
capacity. Utilized min-heaps and optimized disk I/O buffers to manage
|
||||
large-scale data processing efficiently.
|
||||
</p>
|
||||
</section>
|
||||
<article class="card">
|
||||
<div class="card-body">
|
||||
<h3>Python-to-Ruby Transpiler</h3>
|
||||
<p>
|
||||
A compiler front-end built with Flex, Bison, and
|
||||
C++. Handles Python's significant indentation
|
||||
through custom lexer logic, produces Ruby AST
|
||||
output, and solves complex build challenges
|
||||
including circular dependency resolution in
|
||||
generated code.
|
||||
</p>
|
||||
<div class="code-compare">
|
||||
<span class="code-label">Input (Python)</span>
|
||||
<pre>
|
||||
class Counter:
|
||||
def increment(self):
|
||||
self.count = self.count + 1</pre
|
||||
>
|
||||
</div>
|
||||
<div class="arrow-mid">↓</div>
|
||||
<div class="code-compare">
|
||||
<span class="code-label">Output (Ruby)</span>
|
||||
<pre>
|
||||
class Counter
|
||||
def increment
|
||||
@count = @count + 1
|
||||
end
|
||||
end</pre
|
||||
>
|
||||
</div>
|
||||
<div class="tags">
|
||||
<span>Flex</span>
|
||||
<span>Bison</span>
|
||||
<span>C++</span>
|
||||
<span>Make</span>
|
||||
</div>
|
||||
<div class="card-links">
|
||||
<a href="https://git.bronku.xyz/bronku/python2ruby"
|
||||
>→ Source</a
|
||||
>
|
||||
</div>
|
||||
</div>
|
||||
</article>
|
||||
|
||||
<section>
|
||||
<h3>Order Tracker for Cake Shop <span>Go / SQLite / HTMX</span></h3>
|
||||
<p>
|
||||
A production-ready logistics system for a local business. Features
|
||||
transactional integrity, secure session-based auth, and a dynamic UI
|
||||
using HTMX. The entire stack is compiled into a single binary using
|
||||
Go's embed system for zero-dependency deployment.
|
||||
</p>
|
||||
</section>
|
||||
<article class="card">
|
||||
<div class="card-body">
|
||||
<h3>Minesweeper</h3>
|
||||
<p>
|
||||
A fully-playable Minesweeper clone built with C and
|
||||
SDL3. Demonstrates comfort with low-level graphics
|
||||
programming and C memory management.
|
||||
</p>
|
||||
<div class="tags">
|
||||
<span>C</span>
|
||||
<span>SDL3</span>
|
||||
<span>CMake</span>
|
||||
</div>
|
||||
<div class="card-links">
|
||||
<a href="https://git.bronku.xyz/bronku/minesweeper"
|
||||
>→ Source</a
|
||||
>
|
||||
</div>
|
||||
</div>
|
||||
</article>
|
||||
|
||||
<section>
|
||||
<h3>
|
||||
Self-Hosted Infrastructure
|
||||
<span>Debian / Docker / NixOS</span>
|
||||
</h3>
|
||||
<p>
|
||||
Management of a production environment for media, backups, and small
|
||||
business order-tracking. Running in Docker, secured behind an overlay
|
||||
VPN, and exposed via Cloudflare tunnels when required.
|
||||
</p>
|
||||
</section>
|
||||
</section>
|
||||
<article class="card">
|
||||
<div class="card-body">
|
||||
<h3>Disk-Friendly B+ Tree</h3>
|
||||
<p>
|
||||
A B+ tree implementation focused on memory-efficient
|
||||
data structures and disk-aware storage.
|
||||
</p>
|
||||
<div class="tags">
|
||||
<span>Rust</span>
|
||||
<span>Data Structures</span>
|
||||
</div>
|
||||
<div class="card-links">
|
||||
<a href="https://git.bronku.xyz/bronku/B-tree"
|
||||
>→ Source</a
|
||||
>
|
||||
</div>
|
||||
</div>
|
||||
</article>
|
||||
|
||||
<section>
|
||||
<h2>DEVELOPMENT PHILOSOPHY</h2>
|
||||
<p>
|
||||
I believe in <b>Deep Ownership</b>. Beyond writing code, I strive to
|
||||
understand the entire delivery chain—from database commit logs and
|
||||
memory management to final binary deployment. I am guided by:
|
||||
</p>
|
||||
<ul>
|
||||
<li>
|
||||
<b>Intentional Tooling:</b> I choose stacks based on problem-solving
|
||||
efficiency rather than industry trends. This pragmatic approach
|
||||
ensures the right tool is used for the specific performance
|
||||
requirements of the task.
|
||||
</li>
|
||||
<li>
|
||||
<b>Minimalism:</b> I prioritize low dependency counts to reduce attack
|
||||
surfaces, minimize maintenance debt, and ensure lightning-fast
|
||||
execution—whether in a systems binary or a browser-based UI.
|
||||
</li>
|
||||
<li>
|
||||
<b>Transparency:</b> I value understanding the abstractions I use. My
|
||||
experience with systems-level languages (C, Go, Rust) provides me with
|
||||
a unique perspective on optimizing high-level applications and
|
||||
debugging complex performance bottlenecks.
|
||||
</li>
|
||||
</ul>
|
||||
</section>
|
||||
<article class="card">
|
||||
<div class="card-body">
|
||||
<h3>Self-Hosted Infrastructure</h3>
|
||||
<p>
|
||||
Production server running Debian with Docker
|
||||
containers and systemd-managed services. Hosts
|
||||
media, backups, and the cake shop's order-tracking
|
||||
system. Secured behind an overlay VPN, exposed
|
||||
through Cloudflare tunnels where needed, with
|
||||
automated backups and monitoring.
|
||||
</p>
|
||||
<div class="tags">
|
||||
<span>Docker</span>
|
||||
<span>Debian</span>
|
||||
<span>systemd</span>
|
||||
<span>Cloudflare</span>
|
||||
<span>VPN</span>
|
||||
</div>
|
||||
</div>
|
||||
</article>
|
||||
|
||||
<section>
|
||||
<h2>OTHER INTERESTS</h2>
|
||||
<section>
|
||||
<h3>Literary</h3>
|
||||
<p>
|
||||
I primarily read Science Fiction but also enjoy classic murder
|
||||
mysteries. Some of my favorite books include:
|
||||
</p>
|
||||
<ul>
|
||||
<li><i>Foundation</i> (Isaac Asimov)</li>
|
||||
<li><i>God Emperor of Dune</i> (Frank Herbert)</li>
|
||||
<li><i>The Three-Body Problem</i> (Cixin Liu)</li>
|
||||
<li><i>The Murder of Roger Ackroyd</i> (Agatha Christie)</li>
|
||||
</ul>
|
||||
<article class="card">
|
||||
<div class="card-body">
|
||||
<h3>External Sorting</h3>
|
||||
<p>
|
||||
High-performance external sort for datasets
|
||||
exceeding RAM capacity. Uses min-heaps and optimized
|
||||
disk I/O buffers.
|
||||
</p>
|
||||
<div class="tags">
|
||||
<span>C++</span>
|
||||
<span>Algorithms</span>
|
||||
</div>
|
||||
<div class="card-links">
|
||||
<a href="https://git.bronku.xyz/bronku/file_sorting"
|
||||
>→ Source</a
|
||||
>
|
||||
</div>
|
||||
</div>
|
||||
</article>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<h3>Gaming</h3>
|
||||
<p>I mostly play automation games but also enjoy other indie titles:</p>
|
||||
<ul>
|
||||
<li>Factorio</li>
|
||||
<li>Satisfactory</li>
|
||||
<li>Celeste</li>
|
||||
<li>Outer Wilds</li>
|
||||
</ul>
|
||||
<section id="availability">
|
||||
<h2>Availability & Commitment</h2>
|
||||
<p>
|
||||
I am looking for a paid internship or junior developer position
|
||||
- full-time for summer 2026, then part-time during the academic
|
||||
year.
|
||||
</p>
|
||||
<ul>
|
||||
<li>
|
||||
<b>Summer 2026 (Jul–Sep):</b> Full-time internship / junior
|
||||
role.
|
||||
</li>
|
||||
<li>
|
||||
<b>Academic Year 2026/27:</b> Part-time (approx. 20h/week).
|
||||
</li>
|
||||
<li><b>Post-Graduation (2027+):</b> Full-time, permanent.</li>
|
||||
</ul>
|
||||
</section>
|
||||
|
||||
<h3>Other</h3>
|
||||
<ul>
|
||||
<li>Bouldering</li>
|
||||
<li>Motorcycling</li>
|
||||
<li>Cubing (Rubik's Cube)</li>
|
||||
<li>
|
||||
Tinkering with hardware and building custom, hand-wired keyboards
|
||||
</li>
|
||||
</ul>
|
||||
</section>
|
||||
</section>
|
||||
|
||||
<footer>
|
||||
<p>
|
||||
Built with plain HTML/CSS. Hosted on github due to home bandwidth
|
||||
limitations. Text on this site has been proofread with AI assistance.
|
||||
</p>
|
||||
</footer>
|
||||
</body>
|
||||
<section id="philosophy">
|
||||
<h2>Development Philosophy</h2>
|
||||
<p>
|
||||
I believe in <b>Deep Ownership</b> — understanding the full
|
||||
delivery chain from memory management to deployment. I am guided
|
||||
by:
|
||||
</p>
|
||||
<ul>
|
||||
<li>
|
||||
<b>Intentional Tooling:</b> Choosing stacks for
|
||||
problem-solving efficiency over trends. The right tool for
|
||||
the constraints at hand.
|
||||
</li>
|
||||
<li>
|
||||
<b>Minimalism:</b> Low dependency counts reduce attack
|
||||
surfaces, maintenance debt, and keep execution fast —
|
||||
whether in a systems binary or a browser UI.
|
||||
</li>
|
||||
<li>
|
||||
<b>Transparency:</b> Understanding the abstractions I use.
|
||||
Systems-level experience (C, Go, Rust) informs better
|
||||
decisions in high-level code and debugging.
|
||||
</li>
|
||||
</ul>
|
||||
</section>
|
||||
</body>
|
||||
</html>
|
||||
|
|
|
|||
BIN
screenshots/piekarnikgosi-hero.avif
Normal file
BIN
screenshots/piekarnikgosi-hero.avif
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 27 KiB |
378
style.css
378
style.css
|
|
@ -1,65 +1,353 @@
|
|||
:root {
|
||||
--bg: #ffffff;
|
||||
--text: #1a1a1a;
|
||||
--accent: #000080;
|
||||
--dim: #666;
|
||||
--code-bg: #f4f4f4;
|
||||
--bg: #fafafa;
|
||||
--bg-card: #ffffff;
|
||||
--text: #1a1a1a;
|
||||
--text-dim: #666666;
|
||||
--accent: #1a6b3c;
|
||||
--accent-dim: #2d8a4e;
|
||||
--border: #e0e0e0;
|
||||
--tag-bg: #f0f0f4;
|
||||
--tag-text: #333;
|
||||
--shadow: 0 1px 3px rgba(0, 0, 0, 0.06), 0 1px 2px rgba(0, 0, 0, 0.04);
|
||||
--radius: 8px;
|
||||
}
|
||||
|
||||
@media (prefers-color-scheme: dark) {
|
||||
:root {
|
||||
--bg: #111113;
|
||||
--bg-card: #1a1a1e;
|
||||
--text: #e4e4e7;
|
||||
--text-dim: #a1a1aa;
|
||||
--accent: #4ade80;
|
||||
--accent-dim: #22c55e;
|
||||
--border: #27272a;
|
||||
--tag-bg: #27272a;
|
||||
--tag-text: #d4d4d8;
|
||||
--shadow: 0 1px 3px rgba(0, 0, 0, 0.3), 0 1px 2px rgba(0, 0, 0, 0.2);
|
||||
}
|
||||
}
|
||||
|
||||
* {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
|
||||
body {
|
||||
font-family: "Liberation Sans", sans-serif;
|
||||
line-height: 1.6;
|
||||
color: var(--text);
|
||||
max-width: 800px;
|
||||
margin: 0 auto;
|
||||
padding: 2rem 1.5rem;
|
||||
font-family:
|
||||
-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial,
|
||||
sans-serif;
|
||||
line-height: 1.65;
|
||||
color: var(--text);
|
||||
background: var(--bg);
|
||||
max-width: 900px;
|
||||
margin: 0 auto;
|
||||
padding: 2.5rem 1.5rem;
|
||||
transition:
|
||||
color 0.2s,
|
||||
background 0.2s;
|
||||
}
|
||||
|
||||
header {
|
||||
border-bottom: 2px solid var(--text);
|
||||
padding-bottom: 1rem;
|
||||
margin-bottom: 2rem;
|
||||
section {
|
||||
margin-top: 3rem;
|
||||
}
|
||||
|
||||
a {
|
||||
color: var(--accent);
|
||||
text-decoration: none;
|
||||
font-weight: bold;
|
||||
margin-right: 15px;
|
||||
}
|
||||
|
||||
a:hover {
|
||||
text-decoration: underline;
|
||||
h1 {
|
||||
font-size: 1.75rem;
|
||||
font-weight: 700;
|
||||
letter-spacing: -0.02em;
|
||||
}
|
||||
|
||||
h2 {
|
||||
font-size: 1.1rem;
|
||||
text-transform: uppercase;
|
||||
letter-spacing: 2px;
|
||||
border-bottom: 1px solid #ddd;
|
||||
padding-bottom: 0.3rem;
|
||||
margin-top: 2.5rem;
|
||||
font-size: 1rem;
|
||||
font-weight: 600;
|
||||
text-transform: uppercase;
|
||||
letter-spacing: 0.08em;
|
||||
color: var(--accent);
|
||||
margin-bottom: 1.25rem;
|
||||
}
|
||||
|
||||
h3 {
|
||||
margin-bottom: 0.5rem;
|
||||
font-size: 1.1rem;
|
||||
font-size: 1.1rem;
|
||||
font-weight: 600;
|
||||
margin-bottom: 0.4rem;
|
||||
}
|
||||
|
||||
h3 span {
|
||||
font-family: monospace;
|
||||
font-size: 0.85rem;
|
||||
background: var(--code-bg);
|
||||
padding: 2px 6px;
|
||||
border-radius: 4px;
|
||||
font-weight: normal;
|
||||
margin-left: 10px;
|
||||
color: var(--text);
|
||||
p {
|
||||
margin-bottom: 0.75rem;
|
||||
}
|
||||
|
||||
a {
|
||||
color: var(--accent);
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
a:hover {
|
||||
text-decoration: underline;
|
||||
}
|
||||
|
||||
header {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: flex-start;
|
||||
gap: 1rem;
|
||||
padding-bottom: 1.5rem;
|
||||
border-bottom: 1px solid var(--border);
|
||||
margin-bottom: 0;
|
||||
}
|
||||
|
||||
header p {
|
||||
color: var(--text-dim);
|
||||
font-size: 0.95rem;
|
||||
margin-top: 0.2rem;
|
||||
margin-bottom: 0;
|
||||
}
|
||||
|
||||
header nav {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 0.75rem;
|
||||
flex-shrink: 0;
|
||||
}
|
||||
|
||||
header nav a {
|
||||
font-size: 0.875rem;
|
||||
font-weight: 500;
|
||||
color: var(--text-dim);
|
||||
}
|
||||
|
||||
header nav a:hover {
|
||||
color: var(--accent);
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
.contact-bar {
|
||||
display: flex;
|
||||
gap: 1.5rem;
|
||||
flex-wrap: wrap;
|
||||
font-size: 0.9rem;
|
||||
color: var(--text-dim);
|
||||
margin-top: 0.5rem;
|
||||
}
|
||||
|
||||
.contact-bar a {
|
||||
font-weight: 500;
|
||||
}
|
||||
|
||||
.entry {
|
||||
padding: 1.25rem;
|
||||
background: var(--bg-card);
|
||||
border: 1px solid var(--border);
|
||||
border-radius: var(--radius);
|
||||
box-shadow: var(--shadow);
|
||||
}
|
||||
|
||||
.entry-head {
|
||||
margin-bottom: 0.75rem;
|
||||
}
|
||||
|
||||
.entry-head h3 {
|
||||
font-size: 1rem;
|
||||
margin-bottom: 0.15rem;
|
||||
}
|
||||
|
||||
.entry-meta {
|
||||
font-size: 0.85rem;
|
||||
color: var(--text-dim);
|
||||
}
|
||||
|
||||
.tags {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
gap: 0.4rem;
|
||||
margin-top: 0.75rem;
|
||||
}
|
||||
|
||||
.tags span {
|
||||
font-size: 0.75rem;
|
||||
font-family: "SF Mono", "Fira Code", "Fira Mono", Menlo, monospace;
|
||||
background: var(--tag-bg);
|
||||
color: var(--tag-text);
|
||||
padding: 0.2rem 0.5rem;
|
||||
border-radius: 4px;
|
||||
}
|
||||
|
||||
.tag-desc {
|
||||
font-size: 0.85rem;
|
||||
font-weight: 400;
|
||||
color: var(--text-dim);
|
||||
margin-left: 0.3rem;
|
||||
}
|
||||
|
||||
.project-grid {
|
||||
display: grid;
|
||||
grid-template-columns: 1fr;
|
||||
gap: 1rem;
|
||||
}
|
||||
|
||||
@media (min-width: 640px) {
|
||||
.project-grid {
|
||||
grid-template-columns: 1fr 1fr;
|
||||
}
|
||||
}
|
||||
|
||||
.card {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
background: var(--bg-card);
|
||||
border: 1px solid var(--border);
|
||||
border-radius: var(--radius);
|
||||
box-shadow: var(--shadow);
|
||||
overflow: hidden;
|
||||
transition:
|
||||
border-color 0.2s,
|
||||
box-shadow 0.2s;
|
||||
}
|
||||
|
||||
.card:hover {
|
||||
border-color: var(--accent);
|
||||
box-shadow:
|
||||
0 2px 8px rgba(0, 0, 0, 0.08),
|
||||
0 1px 3px rgba(0, 0, 0, 0.04);
|
||||
}
|
||||
|
||||
.card-img {
|
||||
display: block;
|
||||
line-height: 0;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.card-img:hover {
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
.card-img img {
|
||||
width: 100%;
|
||||
height: 180px;
|
||||
object-fit: cover;
|
||||
transition: transform 0.3s ease;
|
||||
}
|
||||
|
||||
.card-img img[src$=".svg"] {
|
||||
height: auto;
|
||||
max-height: 200px;
|
||||
object-fit: contain;
|
||||
background: var(--bg);
|
||||
padding: 0.5rem 0;
|
||||
}
|
||||
|
||||
.card-img:hover img {
|
||||
transform: scale(1.03);
|
||||
}
|
||||
|
||||
.card-body {
|
||||
padding: 1.25rem;
|
||||
flex: 1;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
}
|
||||
|
||||
.card-body h3 {
|
||||
font-size: 1rem;
|
||||
margin-bottom: 0.4rem;
|
||||
}
|
||||
|
||||
.card-body p {
|
||||
font-size: 0.9rem;
|
||||
color: var(--text-dim);
|
||||
line-height: 1.55;
|
||||
flex: 1;
|
||||
}
|
||||
|
||||
.code-compare {
|
||||
margin: 0.75rem 0 0;
|
||||
font-size: 0.8rem;
|
||||
border-radius: 6px;
|
||||
overflow: hidden;
|
||||
border: 1px solid var(--border);
|
||||
}
|
||||
|
||||
.code-compare .code-label {
|
||||
display: block;
|
||||
font-size: 0.65rem;
|
||||
font-weight: 600;
|
||||
text-transform: uppercase;
|
||||
letter-spacing: 0.05em;
|
||||
padding: 0.3rem 0.6rem;
|
||||
background: var(--tag-bg);
|
||||
color: var(--text-dim);
|
||||
border-bottom: 1px solid var(--border);
|
||||
}
|
||||
|
||||
.code-compare pre {
|
||||
margin: 0;
|
||||
padding: 0.6rem;
|
||||
overflow-x: auto;
|
||||
font-family: "SF Mono", "Fira Code", "Fira Mono", Menlo, monospace;
|
||||
font-size: 0.75rem;
|
||||
line-height: 1.45;
|
||||
color: var(--text);
|
||||
background: var(--bg);
|
||||
}
|
||||
|
||||
.code-compare + .code-compare {
|
||||
border-top: 0;
|
||||
border-radius: 0 0 6px 6px;
|
||||
}
|
||||
|
||||
.arrow-mid {
|
||||
text-align: center;
|
||||
font-size: 0.8rem;
|
||||
color: var(--text-dim);
|
||||
padding: 0.25rem 0;
|
||||
line-height: 1;
|
||||
}
|
||||
|
||||
.card-links {
|
||||
margin-top: 0.75rem;
|
||||
font-size: 0.875rem;
|
||||
display: flex;
|
||||
gap: 1.25rem;
|
||||
}
|
||||
|
||||
.card-links a {
|
||||
font-weight: 500;
|
||||
}
|
||||
|
||||
#availability ul {
|
||||
list-style: none;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
#availability li {
|
||||
padding: 0.5rem 0;
|
||||
border-bottom: 1px solid var(--border);
|
||||
font-size: 0.95rem;
|
||||
}
|
||||
|
||||
#availability li:last-child {
|
||||
border-bottom: none;
|
||||
}
|
||||
|
||||
#philosophy ul {
|
||||
padding-left: 1.2rem;
|
||||
}
|
||||
|
||||
#philosophy li {
|
||||
margin-bottom: 0.6rem;
|
||||
font-size: 0.95rem;
|
||||
line-height: 1.55;
|
||||
}
|
||||
|
||||
footer {
|
||||
margin-top: 4rem;
|
||||
border-top: 1px solid #eee;
|
||||
font-size: 0.85rem;
|
||||
color: var(--dim);
|
||||
margin-top: 4rem;
|
||||
padding-top: 1.5rem;
|
||||
border-top: 1px solid var(--border);
|
||||
font-size: 0.85rem;
|
||||
color: var(--text-dim);
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
footer p {
|
||||
margin-bottom: 0;
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue