diff --git a/public/tech-logos/angular.svg b/public/tech-logos/angular.svg new file mode 100644 index 0000000..efab186 --- /dev/null +++ b/public/tech-logos/angular.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/tech-logos/csharp.svg b/public/tech-logos/csharp.svg new file mode 100644 index 0000000..567a363 --- /dev/null +++ b/public/tech-logos/csharp.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/tech-logos/docker.svg b/public/tech-logos/docker.svg new file mode 100644 index 0000000..3722516 --- /dev/null +++ b/public/tech-logos/docker.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/tech-logos/dotnet.svg b/public/tech-logos/dotnet.svg new file mode 100644 index 0000000..9899d75 --- /dev/null +++ b/public/tech-logos/dotnet.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/tech-logos/flutter.svg b/public/tech-logos/flutter.svg new file mode 100644 index 0000000..da4bcc7 --- /dev/null +++ b/public/tech-logos/flutter.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/tech-logos/ionic.svg b/public/tech-logos/ionic.svg new file mode 100644 index 0000000..bb440a1 --- /dev/null +++ b/public/tech-logos/ionic.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/tech-logos/java.svg b/public/tech-logos/java.svg new file mode 100644 index 0000000..7f83254 --- /dev/null +++ b/public/tech-logos/java.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/tech-logos/javascript.svg b/public/tech-logos/javascript.svg new file mode 100644 index 0000000..6b62449 --- /dev/null +++ b/public/tech-logos/javascript.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/tech-logos/react.svg b/public/tech-logos/react.svg new file mode 100644 index 0000000..fe27542 --- /dev/null +++ b/public/tech-logos/react.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/tech-logos/spring.svg b/public/tech-logos/spring.svg new file mode 100644 index 0000000..28ac4cb --- /dev/null +++ b/public/tech-logos/spring.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/tech-logos/typescript.svg b/public/tech-logos/typescript.svg new file mode 100644 index 0000000..3ce7315 --- /dev/null +++ b/public/tech-logos/typescript.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/tech-logos/wpf.svg b/public/tech-logos/wpf.svg new file mode 100644 index 0000000..614e072 --- /dev/null +++ b/public/tech-logos/wpf.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/pages/home/home.css b/src/pages/home/home.css index 181ec4d..c14b749 100644 --- a/src/pages/home/home.css +++ b/src/pages/home/home.css @@ -140,6 +140,117 @@ h2 { outline: none; } +.stack-carousel-shell { + display: grid; + grid-template-columns: auto 1fr auto; + gap: 0.75rem; + align-items: center; +} + +.stack-carousel { + display: flex; + gap: 1rem; + overflow-x: auto; + padding: 0.2rem; + scroll-snap-type: x mandatory; + scrollbar-width: thin; + scrollbar-color: rgba(88, 166, 255, 0.45) rgba(33, 38, 45, 0.65); +} + +.stack-slide { + flex: 0 0 min(320px, calc(100% - 0.2rem)); + scroll-snap-align: start; +} + +.skill-heading { + display: flex; + align-items: center; + gap: 0.65rem; +} + +.skill-icon { + display: inline-flex; + justify-content: center; + align-items: center; + width: 2rem; + height: 2rem; + border-radius: 10px; + border: 1px solid rgba(88, 166, 255, 0.4); + background: radial-gradient(circle at 30% 20%, rgba(88, 166, 255, 0.2), rgba(22, 27, 34, 0.95)); + box-shadow: inset 0 1px 0 rgba(240, 246, 252, 0.08); + overflow: hidden; + transition: border-color 140ms ease, box-shadow 140ms ease, background-color 140ms ease; +} + +.skill-logo { + width: 1.2rem; + height: 1.2rem; + object-fit: contain; + opacity: 0.92; + filter: grayscale(1) brightness(1.25) contrast(0.92); + transition: transform 140ms ease, opacity 140ms ease, filter 140ms ease; +} + +.skill-fallback { + display: none; + font-size: 0.72rem; + font-weight: 700; + letter-spacing: 0.04em; + color: #9ecbff; +} + +.skill-icon.is-fallback .skill-logo { + display: none; +} + +.skill-icon.is-fallback .skill-fallback { + display: inline; +} + +.skill-card .meta { + margin-top: 0.9rem; +} + +.skill-card { + transition: border-color 140ms ease, box-shadow 140ms ease; +} + +.stack-slide:hover .skill-icon, +.stack-slide:focus-within .skill-icon { + border-color: rgba(121, 192, 255, 0.75); + box-shadow: 0 0 0 3px rgba(56, 139, 253, 0.18), inset 0 1px 0 rgba(240, 246, 252, 0.14); + background: radial-gradient(circle at 30% 20%, rgba(121, 192, 255, 0.28), rgba(22, 27, 34, 0.95)); +} + +.stack-slide:hover .skill-logo, +.stack-slide:focus-within .skill-logo { + opacity: 1; + transform: scale(1.04); + filter: grayscale(1) brightness(1.4) contrast(1); +} + +.carousel-btn { + width: 2.5rem; + height: 2.5rem; + border: 1px solid #3d444d; + border-radius: 999px; + background: rgba(33, 38, 45, 0.8); + color: #e6edf3; + cursor: pointer; + transition: border-color 120ms ease, background-color 120ms ease, transform 120ms ease; +} + +.carousel-btn:hover { + border-color: #58a6ff; + background: rgba(56, 139, 253, 0.2); + transform: translateY(-1px); +} + +.carousel-btn:focus-visible { + outline: 2px solid #58a6ff; + outline-offset: 2px; +} + .card h3 { margin: 0; font-size: 1.08rem; @@ -167,4 +278,22 @@ h2 { .hero { padding: 2rem 1.2rem; } + + .stack-carousel-shell { + grid-template-columns: 1fr; + } + + .carousel-btn { + display: none; + } + + .stack-slide { + flex-basis: min(280px, 85%); + } +} + +@media (min-width: 1000px) { + .stack-slide { + flex-basis: calc((100% - 2rem) / 3); + } } diff --git a/src/pages/home/home.html b/src/pages/home/home.html index 195c311..eac0311 100644 --- a/src/pages/home/home.html +++ b/src/pages/home/home.html @@ -34,13 +34,36 @@
Primary technologies I use to deliver production-ready software.
-