mobile-friendly (#2)
All checks were successful
Deployment / Install (push) Successful in 3m26s
All checks were successful
Deployment / Install (push) Successful in 3m26s
Co-authored-by: Benjamin Palko <benjaminpalko@hotmail.com> Reviewed-on: #2
This commit is contained in:
parent
9dfbdcc554
commit
fbcb3179c9
12 changed files with 170 additions and 122 deletions
|
|
@ -1,11 +1,17 @@
|
|||
<script lang="ts">
|
||||
import { page } from '$app/state';
|
||||
import Footer from '$lib/components/Footer.svelte';
|
||||
import { goto } from '$app/navigation';
|
||||
import { navigating, page } from '$app/state';
|
||||
import Navbar from '$lib/components/Navbar.svelte';
|
||||
import '../app.css';
|
||||
|
||||
let { children } = $props();
|
||||
|
||||
let drawerOpen = $state(false);
|
||||
|
||||
if (navigating) {
|
||||
drawerOpen = false;
|
||||
}
|
||||
|
||||
const pages = [
|
||||
{ slug: '/', name: 'About Me' },
|
||||
{ slug: '/resume', name: 'Resume' },
|
||||
|
|
@ -23,23 +29,67 @@
|
|||
let current = $derived(pages.find((p) => p.slug === page.route.id));
|
||||
</script>
|
||||
|
||||
<div class="h-screen w-screen p-12">
|
||||
<div
|
||||
class="bg-base-200 grid min-h-full grid-rows-[max-content_max-content_auto_max-content] rounded-4xl"
|
||||
>
|
||||
<header class=" p-8">
|
||||
<Navbar title="Benjamin Palko" {pages} route={page.route} />
|
||||
</header>
|
||||
{#if current && current.slug !== '/'}
|
||||
<div class="bg-base-300 w-full px-12 py-8">
|
||||
<h1 class="text-4xl font-light">{current.name}</h1>
|
||||
<div class="drawer drawer-end">
|
||||
<input id="navigation-drawer" type="checkbox" class="drawer-toggle" bind:checked={drawerOpen} />
|
||||
|
||||
<div class="drawer-content h-screen w-screen lg:p-12">
|
||||
<div
|
||||
class="bg-base-200 grid min-h-full grid-rows-[max-content_max-content_auto_max-content] overflow-hidden lg:gap-4 lg:rounded-4xl"
|
||||
>
|
||||
<header class="lg:p-6">
|
||||
<Navbar drawerId="navigation-drawer" title="Benjamin Palko" {pages} route={page.route} />
|
||||
</header>
|
||||
<div>
|
||||
{#if current && current.slug !== '/'}
|
||||
<div class="bg-base-300 w-full px-6 py-4 lg:px-12 lg:py-8">
|
||||
<h1 class="text-2xl font-light lg:text-4xl">{current.name}</h1>
|
||||
</div>
|
||||
{/if}
|
||||
</div>
|
||||
{/if}
|
||||
<main>
|
||||
{@render children()}
|
||||
</main>
|
||||
<footer class="p-8">
|
||||
<Footer links={socialLinks} />
|
||||
</footer>
|
||||
<main>
|
||||
{@render children()}
|
||||
</main>
|
||||
<footer class="p-2 lg:p-6">
|
||||
<div class="flex justify-between text-xs lg:text-lg">
|
||||
<div class="flex gap-2 lg:gap-8">
|
||||
{#each socialLinks as link (link.href)}
|
||||
<a
|
||||
href={link.href}
|
||||
target="_blank"
|
||||
class="hover:text-base-content text-slate-600 transition-colors">{link.name}</a
|
||||
>
|
||||
{/each}
|
||||
</div>
|
||||
<p class="text-slate-600">© 2025 Benjamin Palko</p>
|
||||
</div>
|
||||
</footer>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="drawer-side">
|
||||
<label for="navigation-drawer" aria-label="close sidebar" class="drawer-overlay"></label>
|
||||
<div class="menu bg-base-200 flex min-h-full w-full flex-col justify-between p-4">
|
||||
<ul class="flex flex-col gap-4">
|
||||
{#each pages as page (page.slug)}
|
||||
<li>
|
||||
<button
|
||||
class="btn btn-primary btn-soft btn-lg"
|
||||
onclick={() => {
|
||||
goto(page.slug);
|
||||
drawerOpen = false;
|
||||
}}>{page.name}</button
|
||||
>
|
||||
</li>
|
||||
{/each}
|
||||
</ul>
|
||||
|
||||
<div class="flex flex-col gap-4">
|
||||
<h2 class="text-primary text-center text-4xl font-light lg:text-3xl">
|
||||
<span class="text-base-content font-semibold">Benjamin</span>
|
||||
Palko
|
||||
</h2>
|
||||
<label for="navigation-drawer" class="btn btn-error btn-soft btn-lg">Close</label>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -6,57 +6,63 @@
|
|||
'Lorem ipsum dolor sit amet consectetur adipiscing elit. Quisque faucibus ex sapien vitae pellentesque sem placerat. In id cursus mi pretium tellus duis convallis. Tempus leo eu aenean sed diam urna tempor. Pulvinar vivamus fringilla lacus nec metus bibendum egestas. Iaculis massa nisl malesuada lacinia integer nunc posuere. Ut hendrerit semper vel class aptent taciti sociosqu. Ad litora torquent per conubia nostra inceptos himenaeos.';
|
||||
</script>
|
||||
|
||||
<div class="flex flex-col px-12">
|
||||
<div class="py-48">
|
||||
<div class="flex flex-col items-center px-6 md:px-12">
|
||||
<div class="lg:py-48">
|
||||
<Hero
|
||||
photo="/yeet-winter.jpg"
|
||||
titles={['Software Engineer', 'Game Developer']}
|
||||
photo="/waterfall-cropped.jpg"
|
||||
titles={[
|
||||
'Software Engineer',
|
||||
'Game Developer',
|
||||
'Linux Enjoyer',
|
||||
'Cyclist',
|
||||
'Goalie for Hire ⚽'
|
||||
]}
|
||||
name="Benjamin Palko"
|
||||
{description}
|
||||
/>
|
||||
</div>
|
||||
<div>
|
||||
<h2 class="py-8 text-xl">What I Do</h2>
|
||||
<div class="grid grid-cols-2 gap-8">
|
||||
<div class="flex gap-4">
|
||||
<Braces size={48} class="text-primary" />
|
||||
<div class="flex flex-col">
|
||||
<h3 class="text-xl">Web Development</h3>
|
||||
<p class="max-w-2xl">
|
||||
Lorem ipsum dolor sit amet consectetur adipiscing elit. Quisque faucibus ex sapien vitae
|
||||
pellentesque sem placerat. In id cursus mi pretium tellus duis convallis.
|
||||
</p>
|
||||
</div>
|
||||
<div class="grid grid-cols-1 gap-8 md:grid-cols-2">
|
||||
<div class="col-span-full">
|
||||
<h2 class="border-primary w-fit border-b text-2xl font-light">What I Do</h2>
|
||||
</div>
|
||||
<div class="flex flex-col gap-4 lg:flex-row">
|
||||
<Braces size={48} class="text-primary" />
|
||||
<div class="flex flex-col">
|
||||
<h3 class="text-xl">Web Development</h3>
|
||||
<p class="max-w-2xl">
|
||||
Lorem ipsum dolor sit amet consectetur adipiscing elit. Quisque faucibus ex sapien vitae
|
||||
pellentesque sem placerat. In id cursus mi pretium tellus duis convallis.
|
||||
</p>
|
||||
</div>
|
||||
<div class="flex gap-4">
|
||||
<Gamepad2 size={48} class="text-primary" />
|
||||
<div class="flex flex-col">
|
||||
<h3 class="text-xl">Video Game Development</h3>
|
||||
<p class="max-w-2xl">
|
||||
Lorem ipsum dolor sit amet consectetur adipiscing elit. Quisque faucibus ex sapien vitae
|
||||
pellentesque sem placerat. In id cursus mi pretium tellus duis convallis.
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="flex flex-col gap-4 lg:flex-row">
|
||||
<Gamepad2 size={48} class="text-primary" />
|
||||
<div class="flex flex-col">
|
||||
<h3 class="text-xl">Video Game Development</h3>
|
||||
<p class="max-w-2xl">
|
||||
Lorem ipsum dolor sit amet consectetur adipiscing elit. Quisque faucibus ex sapien vitae
|
||||
pellentesque sem placerat. In id cursus mi pretium tellus duis convallis.
|
||||
</p>
|
||||
</div>
|
||||
<div class="flex gap-4">
|
||||
<MonitorCog size={48} class="text-primary" />
|
||||
<div class="flex flex-col">
|
||||
<h3 class="text-xl">Linux Ricing</h3>
|
||||
<p class="max-w-2xl">
|
||||
Lorem ipsum dolor sit amet consectetur adipiscing elit. Quisque faucibus ex sapien vitae
|
||||
pellentesque sem placerat. In id cursus mi pretium tellus duis convallis.
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="flex flex-col gap-4 lg:flex-row">
|
||||
<MonitorCog size={48} class="text-primary" />
|
||||
<div class="flex flex-col">
|
||||
<h3 class="text-xl">Linux Ricing</h3>
|
||||
<p class="max-w-2xl">
|
||||
Lorem ipsum dolor sit amet consectetur adipiscing elit. Quisque faucibus ex sapien vitae
|
||||
pellentesque sem placerat. In id cursus mi pretium tellus duis convallis.
|
||||
</p>
|
||||
</div>
|
||||
<div class="flex gap-4">
|
||||
<HeartHandshake size={48} class="text-primary" />
|
||||
<div class="flex flex-col">
|
||||
<h3 class="text-xl">Open-Source Development</h3>
|
||||
<p class="max-w-2xl">
|
||||
Lorem ipsum dolor sit amet consectetur adipiscing elit. Quisque faucibus ex sapien vitae
|
||||
pellentesque sem placerat. In id cursus mi pretium tellus duis convallis.
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="flex flex-col gap-4 lg:flex-row">
|
||||
<HeartHandshake size={48} class="text-primary" />
|
||||
<div class="flex flex-col">
|
||||
<h3 class="text-xl">Open-Source Development</h3>
|
||||
<p class="max-w-2xl">
|
||||
Lorem ipsum dolor sit amet consectetur adipiscing elit. Quisque faucibus ex sapien vitae
|
||||
pellentesque sem placerat. In id cursus mi pretium tellus duis convallis.
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -1,9 +1,4 @@
|
|||
import {
|
||||
MAIL_TRANSPORT_HOST,
|
||||
MAIL_TRANSPORT_PASS,
|
||||
MAIL_TRANSPORT_PORT,
|
||||
MAIL_TRANSPORT_USER
|
||||
} from '$env/static/private';
|
||||
import { env } from '$env/dynamic/private';
|
||||
import { fail } from '@sveltejs/kit';
|
||||
import { createTransport } from 'nodemailer';
|
||||
import type { Actions } from './$types';
|
||||
|
|
@ -49,11 +44,11 @@ export const actions = {
|
|||
}
|
||||
|
||||
const transport = createTransport({
|
||||
host: MAIL_TRANSPORT_HOST,
|
||||
port: isNaN(Number(MAIL_TRANSPORT_PORT)) ? 587 : Number(MAIL_TRANSPORT_PORT),
|
||||
host: env.MAIL_TRANSPORT_HOST,
|
||||
port: isNaN(Number(env.MAIL_TRANSPORT_PORT)) ? 587 : Number(env.MAIL_TRANSPORT_PORT),
|
||||
auth: {
|
||||
user: MAIL_TRANSPORT_USER,
|
||||
pass: MAIL_TRANSPORT_PASS
|
||||
user: env.MAIL_TRANSPORT_USER,
|
||||
pass: env.MAIL_TRANSPORT_PASS
|
||||
}
|
||||
});
|
||||
|
||||
|
|
|
|||
|
|
@ -15,7 +15,7 @@
|
|||
</script>
|
||||
|
||||
<form id="contact" method="post" use:enhance>
|
||||
<div class="mx-auto grid max-w-3xl grid-flow-col grid-cols-3 grid-rows-7 content-end gap-4 py-8">
|
||||
<div class="mx-auto grid max-w-3xl gap-4 py-8 sm:grid-flow-col sm:grid-cols-3 sm:grid-rows-6">
|
||||
<div class="col-span-full">
|
||||
{#if form?.response?.rejected.length ?? 0 > 0}
|
||||
<div role="alert" class="alert alert-error w-full">
|
||||
|
|
@ -37,21 +37,20 @@
|
|||
|
||||
<h2 class="col-span-full text-3xl font-light">Reach out! 🤝</h2>
|
||||
|
||||
<label class="input input-bordered flex w-full items-center">
|
||||
<label class="input input-bordered col-span-full flex w-full items-center sm:col-span-1">
|
||||
<UserRound />
|
||||
<input name="name" type="text" class="grow" placeholder="Full Name" />
|
||||
</label>
|
||||
<label class="input input-bordered flex w-full items-center gap-2">
|
||||
<label class="input input-bordered col-span-full flex w-full items-center gap-2 sm:col-span-1">
|
||||
<Mail />
|
||||
<input name="email" type="text" class="grow" placeholder="Your Email" />
|
||||
</label>
|
||||
<label class="input input-bordered flex w-full items-center gap-2">
|
||||
<label class="input input-bordered col-span-full flex w-full items-center gap-2 sm:col-span-1">
|
||||
<Croissant />
|
||||
<input name="subject" type="text" class="grow" placeholder="Subject" />
|
||||
</label>
|
||||
<button type="submit" class="btn btn-primary">Send Message <Send size={20} /></button>
|
||||
|
||||
<div class="col-span-2 row-span-4">
|
||||
<div class="row-span-3 sm:col-span-2">
|
||||
<textarea
|
||||
name="message"
|
||||
form="contact"
|
||||
|
|
@ -59,5 +58,7 @@
|
|||
placeholder="Message"
|
||||
></textarea>
|
||||
</div>
|
||||
|
||||
<button type="submit" class="btn btn-primary col-span0">Send Message <Send size={20} /></button>
|
||||
</div>
|
||||
</form>
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue