mirror of
https://github.com/djkotowski/personal-website.git
synced 2026-09-13 14:00:39 -05:00
Compare commits
1
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
d25196cc7e |
@@ -1,3 +0,0 @@
|
|||||||
worktrees/
|
|
||||||
*.local.*
|
|
||||||
|
|
||||||
@@ -5,11 +5,11 @@ updates:
|
|||||||
reviewers:
|
reviewers:
|
||||||
- "djkotowski"
|
- "djkotowski"
|
||||||
schedule:
|
schedule:
|
||||||
interval: "weekly"
|
interval: "daily"
|
||||||
versioning-strategy: "increase-if-necessary"
|
versioning-strategy: "increase-if-necessary"
|
||||||
- package-ecosystem: "github-actions"
|
- package-ecosystem: "github-actions"
|
||||||
directory: "/"
|
directory: "/"
|
||||||
reviewers:
|
reviewers:
|
||||||
- "djkotowski"
|
- "djkotowski"
|
||||||
schedule:
|
schedule:
|
||||||
interval: "weekly"
|
interval: "daily"
|
||||||
|
|||||||
@@ -10,19 +10,17 @@ concurrency:
|
|||||||
cancel-in-progress: true
|
cancel-in-progress: true
|
||||||
jobs:
|
jobs:
|
||||||
check:
|
check:
|
||||||
name: CI
|
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@v7
|
uses: actions/checkout@v4
|
||||||
- name: Setup pnpm
|
|
||||||
uses: pnpm/action-setup@v5
|
|
||||||
- name: Setup Node.js
|
- name: Setup Node.js
|
||||||
uses: actions/setup-node@v7
|
uses: actions/setup-node@v4
|
||||||
with:
|
with:
|
||||||
node-version-file: '.tool-versions'
|
node-version: '20'
|
||||||
cache: 'pnpm'
|
|
||||||
- name: Install Dependencies
|
- name: Install Dependencies
|
||||||
run: pnpm install --frozen-lockfile
|
run: |
|
||||||
|
npm install -g yarn
|
||||||
|
yarn install
|
||||||
- name: Lint solution
|
- name: Lint solution
|
||||||
run: pnpm check
|
run: yarn check
|
||||||
|
|||||||
@@ -1,35 +1,30 @@
|
|||||||
name: deploy
|
name: deploy
|
||||||
run-name: "${{ github.actor }} is deploying ${{ github.event.workflow_run.head_sha }}"
|
run-name: "${{ github.actor }} is deploying ${{ github.sha }}"
|
||||||
on:
|
on:
|
||||||
workflow_run:
|
push:
|
||||||
workflows: ['ci-test']
|
branches:
|
||||||
types: [completed]
|
- 'main'
|
||||||
branches: ['main']
|
|
||||||
concurrency:
|
concurrency:
|
||||||
group: pages
|
group: ${{ github.workflow }}-${{ github.ref }}
|
||||||
cancel-in-progress: false
|
cancel-in-progress: true
|
||||||
jobs:
|
jobs:
|
||||||
build:
|
build:
|
||||||
if: github.event.workflow_run.conclusion == 'success'
|
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@v7
|
uses: actions/checkout@v4
|
||||||
with:
|
|
||||||
ref: ${{ github.event.workflow_run.head_sha }}
|
|
||||||
- name: Setup pnpm
|
|
||||||
uses: pnpm/action-setup@v5
|
|
||||||
- name: Setup Node.js
|
- name: Setup Node.js
|
||||||
uses: actions/setup-node@v7
|
uses: actions/setup-node@v4
|
||||||
with:
|
with:
|
||||||
node-version-file: '.tool-versions'
|
node-version: '20'
|
||||||
cache: 'pnpm'
|
|
||||||
- name: Install Dependencies
|
- name: Install Dependencies
|
||||||
run: pnpm install --frozen-lockfile
|
run: |
|
||||||
|
npm install -g yarn
|
||||||
|
yarn install
|
||||||
- name: Build solution
|
- name: Build solution
|
||||||
run: pnpm build
|
run: yarn build
|
||||||
- name: Archive artifacts
|
- name: Archive artifacts
|
||||||
uses: actions/upload-pages-artifact@v5.0.0
|
uses: actions/upload-pages-artifact@v3.0.1
|
||||||
with:
|
with:
|
||||||
path: dist/
|
path: dist/
|
||||||
deploy:
|
deploy:
|
||||||
@@ -37,24 +32,11 @@ jobs:
|
|||||||
permissions:
|
permissions:
|
||||||
pages: write
|
pages: write
|
||||||
id-token: write
|
id-token: write
|
||||||
contents: write
|
|
||||||
environment:
|
environment:
|
||||||
name: github-pages
|
name: github-pages
|
||||||
url: ${{ steps.deployment.outputs.page_url }}
|
url: ${{ steps.deployment.outputs.page_url }}
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
|
||||||
uses: actions/checkout@v7
|
|
||||||
with:
|
|
||||||
ref: ${{ github.event.workflow_run.head_sha }}
|
|
||||||
- name: Deploy to GitHub Pages
|
- name: Deploy to GitHub Pages
|
||||||
id: deployment
|
id: deployment
|
||||||
uses: actions/deploy-pages@v5
|
uses: actions/deploy-pages@v4
|
||||||
- name: Tag deploy
|
|
||||||
run: |
|
|
||||||
git config user.name "github-actions[bot]"
|
|
||||||
git config user.email "github-actions[bot]@users.noreply.github.com"
|
|
||||||
sha="${{ github.event.workflow_run.head_sha }}"
|
|
||||||
tag="deploy-$(date +%Y-%m-%d)-${sha::7}"
|
|
||||||
git tag "$tag" "$sha"
|
|
||||||
git push origin "$tag"
|
|
||||||
|
|||||||
+11
@@ -2,6 +2,8 @@
|
|||||||
logs
|
logs
|
||||||
*.log
|
*.log
|
||||||
npm-debug.log*
|
npm-debug.log*
|
||||||
|
yarn-debug.log*
|
||||||
|
yarn-error.log*
|
||||||
pnpm-debug.log*
|
pnpm-debug.log*
|
||||||
lerna-debug.log*
|
lerna-debug.log*
|
||||||
|
|
||||||
@@ -20,3 +22,12 @@ dist-ssr
|
|||||||
*.njsproj
|
*.njsproj
|
||||||
*.sln
|
*.sln
|
||||||
*.sw?
|
*.sw?
|
||||||
|
|
||||||
|
# Yarn 2+
|
||||||
|
.pnp.*
|
||||||
|
.yarn/*
|
||||||
|
!.yarn/patches
|
||||||
|
!.yarn/plugins
|
||||||
|
!.yarn/releases
|
||||||
|
!.yarn/sdks
|
||||||
|
!.yarn/versions
|
||||||
|
|||||||
+1
-1
@@ -1 +1 @@
|
|||||||
pnpm check
|
yarn check
|
||||||
|
|||||||
@@ -1,12 +0,0 @@
|
|||||||
{
|
|
||||||
"mcpServers": {
|
|
||||||
"playwright": {
|
|
||||||
"type": "stdio",
|
|
||||||
"command": "npx",
|
|
||||||
"args": [
|
|
||||||
"@playwright/mcp@latest"
|
|
||||||
],
|
|
||||||
"env": {}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,12 +0,0 @@
|
|||||||
<component name="ProjectRunConfigurationManager">
|
|
||||||
<configuration default="false" name="App" type="js.build_tools.npm">
|
|
||||||
<package-json value="$PROJECT_DIR$/package.json" />
|
|
||||||
<command value="run" />
|
|
||||||
<scripts>
|
|
||||||
<script value="dev" />
|
|
||||||
</scripts>
|
|
||||||
<node-interpreter value="project" />
|
|
||||||
<envs />
|
|
||||||
<method v="2" />
|
|
||||||
</configuration>
|
|
||||||
</component>
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
nodejs 22.14.0
|
|
||||||
Vendored
+873
File diff suppressed because one or more lines are too long
@@ -0,0 +1,2 @@
|
|||||||
|
nodeLinker: node-modules
|
||||||
|
yarnPath: .yarn/releases/yarn-3.5.1.cjs
|
||||||
@@ -1,35 +0,0 @@
|
|||||||
# CLAUDE.md
|
|
||||||
|
|
||||||
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
|
|
||||||
|
|
||||||
## Commands
|
|
||||||
|
|
||||||
This project uses **pnpm** — pinned via `packageManager` in `package.json` (enable it with `corepack enable`). Use `pnpm`, not `npm` or `yarn`.
|
|
||||||
|
|
||||||
- `pnpm dev` — start the Vite dev server
|
|
||||||
- `pnpm build` — production build to `dist/`
|
|
||||||
- `pnpm preview` — serve the production build locally
|
|
||||||
- `pnpm check` — type-check with `svelte-check` (the only "lint"/CI gate; there is no ESLint/Prettier and no test suite)
|
|
||||||
|
|
||||||
`pnpm check` runs automatically on `git commit` via the Husky `pre-commit` hook, and on every PR / push to `main` via the `ci-test` workflow. There are no unit tests, so `pnpm check` is the check to run before considering a change done.
|
|
||||||
|
|
||||||
## Architecture
|
|
||||||
|
|
||||||
A single-page, statically-generated personal résumé site — no router, no backend, no data fetching. Everything is hardcoded content in Svelte components.
|
|
||||||
|
|
||||||
- **Entry:** `src/main.ts` mounts `App.svelte` into `#app` (see `index.html`) using Svelte 5's `mount()`.
|
|
||||||
- **Composition:** `App.svelte` stacks four page **sections** from `src/lib/`: `HeaderSection`, `SkillsSection`, `ExpSection`, `ContactSection`. Adding/reordering page content happens here.
|
|
||||||
- **Reusable primitives** live in `src/lib/components/` (`Header`, `Hero`, `Link`) and `src/lib/icons/`. Sections compose these; primitives hold no page-specific content.
|
|
||||||
- Résumé text (skills, experience, contact info) is written inline in the section components — edit the relevant `*Section.svelte` file to change site content.
|
|
||||||
|
|
||||||
## Conventions
|
|
||||||
|
|
||||||
- **Svelte 5 runes syntax** throughout: props via `let { ... } = $props()`, slots via `{@render children?.()}`. Do not use legacy `export let` / `<slot>`.
|
|
||||||
- Prefer `<script lang="ts">` with a typed props object for new components (see `components/Link.svelte`, `components/Hero.svelte`). Some older section files use plain `<script>` — match the file you are editing.
|
|
||||||
- **Tailwind CSS v4** with **no config file**. It is enabled via the `@tailwindcss/vite` plugin and `@import "tailwindcss"` in `src/app.css`; customize through CSS, not a `tailwind.config.js`. `tailwind-merge` is available for conditional class composition.
|
|
||||||
- Styling is Tailwind utility classes in markup; the dark theme base (`bg-gray-950 text-white`) is set on `<body>` in `index.html`.
|
|
||||||
- `checkJs` is on and `.js`/`.svelte` files are type-checked — keep JSDoc/types valid so `pnpm check` passes.
|
|
||||||
|
|
||||||
## Deploy
|
|
||||||
|
|
||||||
Pushing to `main` triggers the `deploy` workflow: `pnpm build` → upload `dist/` → GitHub Pages (https://dankotowski.dev). CI reads its Node version from `.tool-versions` (pinned to 22.14.0), matching local dev — pnpm 11 requires Node >=22.13.
|
|
||||||
+11
-11
@@ -7,25 +7,25 @@
|
|||||||
"scripts": {
|
"scripts": {
|
||||||
"dev": "vite",
|
"dev": "vite",
|
||||||
"build": "vite build",
|
"build": "vite build",
|
||||||
"preinstall": "npx only-allow pnpm",
|
|
||||||
"preview": "vite preview",
|
"preview": "vite preview",
|
||||||
"check": "svelte-check --tsconfig ./tsconfig.json",
|
"check": "svelte-check --tsconfig ./tsconfig.json",
|
||||||
"prepare": "husky"
|
"prepare": "husky"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@sveltejs/vite-plugin-svelte": "^7.2.0",
|
"@sveltejs/vite-plugin-svelte": "^3.1.2",
|
||||||
"@tailwindcss/vite": "^4.1.1",
|
"@tsconfig/svelte": "^4.0.1",
|
||||||
"@tsconfig/svelte": "^5.0.4",
|
"autoprefixer": "^10.4.14",
|
||||||
"husky": "^9.0.11",
|
"husky": "^9.0.11",
|
||||||
"svelte": "^5.25.6",
|
"postcss": "^8.4.39",
|
||||||
"svelte-check": "^4.1.5",
|
"svelte": "^3.58.0",
|
||||||
"tailwindcss": "^4.1.1",
|
"svelte-check": "^4.1.4",
|
||||||
|
"tailwindcss": "^3.3.2",
|
||||||
"tslib": "^2.5.0",
|
"tslib": "^2.5.0",
|
||||||
"typescript": "^6.0.3",
|
"typescript": "^5.0.4",
|
||||||
"vite": "^8.1.4"
|
"vite": "^6.0.2"
|
||||||
},
|
},
|
||||||
"packageManager": "[email protected]",
|
"packageManager": "[email protected]",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"tailwind-merge": "^3.1.0"
|
"tailwind-merge": "^2.5.5"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Generated
-1062
File diff suppressed because it is too large
Load Diff
@@ -1,5 +0,0 @@
|
|||||||
# esbuild ships its native binary via an optional dependency; its postinstall
|
|
||||||
# is only a launcher optimization. Allowed so pnpm 11 doesn't block install on
|
|
||||||
# the undecided build script.
|
|
||||||
allowBuilds:
|
|
||||||
esbuild: true
|
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
export default {
|
||||||
|
plugins: {
|
||||||
|
tailwindcss: {},
|
||||||
|
autoprefixer: {},
|
||||||
|
},
|
||||||
|
}
|
||||||
+3
-1
@@ -1 +1,3 @@
|
|||||||
@import "tailwindcss";
|
@tailwind base;
|
||||||
|
@tailwind components;
|
||||||
|
@tailwind utilities;
|
||||||
|
|||||||
@@ -103,8 +103,4 @@
|
|||||||
<p>C#, ASP.NET MVC 3, Microsoft SQL Server, jQuery, Manhattan SCALE</p>
|
<p>C#, ASP.NET MVC 3, Microsoft SQL Server, jQuery, Manhattan SCALE</p>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
<p class="text-center pt-10">
|
|
||||||
Please see my <Link href="https://drive.proton.me/urls/2AY1WCCC54#BcxvDzVu1IM8" target="_blank" rel="nofollow">resumé</Link> for more details.
|
|
||||||
</p>
|
|
||||||
</section>
|
</section>
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ import Hero from "./components/Hero.svelte";
|
|||||||
Senior web software engineer with strong technical and interpersonal skills
|
Senior web software engineer with strong technical and interpersonal skills
|
||||||
</p>
|
</p>
|
||||||
<p class="mt-4 text-lg lg:text-xl text-gray-300">
|
<p class="mt-4 text-lg lg:text-xl text-gray-300">
|
||||||
Based in New Braunfels, Texas
|
Based in Chicago, Illinois
|
||||||
</p>
|
</p>
|
||||||
</Hero>
|
</Hero>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
<script>
|
<script>
|
||||||
import Header from './components/Header.svelte'
|
import Header from "./components/Header.svelte";
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<section class="container mx-auto px-4">
|
<section class="container mx-auto px-4">
|
||||||
@@ -7,26 +7,18 @@
|
|||||||
|
|
||||||
<div class="content-center lg:text-lg">
|
<div class="content-center lg:text-lg">
|
||||||
<table class="mx-auto sm:whitespace-nowrap">
|
<table class="mx-auto sm:whitespace-nowrap">
|
||||||
<tbody>
|
|
||||||
<tr>
|
<tr>
|
||||||
<th class="block sm:table-cell font-bold w-auto pr-3 lg:pr-5 text-left">Backend:</th>
|
<th class="block sm:table-cell font-bold w-auto pr-3 lg:pr-5 text-left">Backend:</th>
|
||||||
<td class="block pb-4 sm:pb-0 sm:table-cell text-left">Ruby, Ruby on Rails, Node.js, Sinatra</td>
|
<td class="block pb-4 sm:pb-0 sm:table-cell text-left">Ruby, Ruby on Rails, Node.js, Sinatra</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<th class="block sm:table-cell font-bold w-auto pr-3 lg:pr-5 text-left">Frontend:</th>
|
<th class="block sm:table-cell font-bold w-auto pr-3 lg:pr-5 text-left">Frontend:</th>
|
||||||
<td class="block pb-4 sm:pb-0 sm:table-cell text-left">ES6, TypeScript, React, Redux, CSS/Sass, Vite,
|
<td class="block pb-4 sm:pb-0 sm:table-cell text-left">ES6, TypeScript, React, Redux, CSS/Sass, Webpack, Vite</td>
|
||||||
Webpack
|
|
||||||
</td>
|
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<th class="block sm:table-cell font-bold w-auto pr-3 lg:pr-5 text-left">Data:</th>
|
<th class="block sm:table-cell font-bold w-auto pr-3 lg:pr-5 text-left">Data:</th>
|
||||||
<td class="block pb-4 sm:pb-0 sm:table-cell text-left">PostgreSQL, MySQL, Redis, Elasticsearch</td>
|
<td class="block pb-4 sm:pb-0 sm:table-cell text-left">PostgreSQL, MySQL, Redis, Elasticsearch</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
|
||||||
<th class="block sm:table-cell font-bold w-auto pr-3 lg:pr-5 text-left">AI Tools:</th>
|
|
||||||
<td class="block pb-4 sm:pb-0 sm:table-cell text-left">Claude Code, Github Copilot</td>
|
|
||||||
</tr>
|
|
||||||
</tbody>
|
|
||||||
</table>
|
</table>
|
||||||
</div>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
|
|||||||
@@ -1,7 +1,3 @@
|
|||||||
<script lang="ts">
|
|
||||||
let { children } = $props();
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<h1 class="text-center text-white text-3xl font-bold mt-20 mb-10">
|
<h1 class="text-center text-white text-3xl font-bold mt-20 mb-10">
|
||||||
{@render children?.()}
|
<slot />
|
||||||
</h1>
|
</h1>
|
||||||
|
|||||||
@@ -1,17 +1,13 @@
|
|||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
type Props = {
|
export let title: string;
|
||||||
children?: any
|
export let imageUrl: string;
|
||||||
title: string
|
export let imageAlt: string;
|
||||||
imageUrl: string
|
|
||||||
imageAlt: string
|
|
||||||
};
|
|
||||||
let { children, title, imageUrl, imageAlt }: Props = $props()
|
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<div class="px-6 py-1 pb-10 sm:pt-32 sm:pb-24 lg:px-8">
|
<div class="px-6 py-1 pb-10 sm:pt-32 sm:pb-24 lg:px-8">
|
||||||
<div class="mx-auto max-w-2xl text-center">
|
<div class="mx-auto max-w-2xl text-center">
|
||||||
<img class="mx-auto mb-6 w-32 h-32 lg:w-48 lg:h-48 rounded-full" src={imageUrl} alt={imageAlt} />
|
<img class="mx-auto mb-6 w-32 h-32 lg:w-48 lg:h-48 rounded-full" src={imageUrl} alt={imageAlt} />
|
||||||
<h2 class="text-4xl lg:text-6xl font-bold tracking-tight text-gray-100 sm:text-6x1">{title}</h2>
|
<h2 class="text-4xl lg:text-6xl font-bold tracking-tight text-gray-100 sm:text-6x1">{title}</h2>
|
||||||
{@render children?.()}
|
<slot />
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -1,9 +1,10 @@
|
|||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import type { HTMLAnchorAttributes } from 'svelte/elements'
|
import type { HTMLAnchorAttributes } from 'svelte/elements'
|
||||||
type LinkProps = { children: any, href: string; target: HTMLAnchorAttributes['target']; title?: HTMLAnchorAttributes['title']; rel?: HTMLAnchorAttributes['rel'] }
|
|
||||||
|
|
||||||
let { children, href, target, title, rel }: LinkProps = $props()
|
export let href: string
|
||||||
|
export let target: HTMLAnchorAttributes['target']
|
||||||
|
export let title: HTMLAnchorAttributes['title'] = undefined
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<a class="text-cyan-200 hover:text-cyan-400 hover:border-b border-dotted" {href} {target} {title} {rel}>{@render children?.()}</a>
|
<a class="text-cyan-200 hover:text-cyan-400 hover:border-b border-dotted" {href} {target} {title}><slot /></a>
|
||||||
|
|
||||||
|
|||||||
+2
-3
@@ -1,9 +1,8 @@
|
|||||||
import { mount } from 'svelte'
|
|
||||||
import './app.css'
|
import './app.css'
|
||||||
import App from './App.svelte'
|
import App from './App.svelte'
|
||||||
|
|
||||||
const app = mount(App, {
|
const app = new App({
|
||||||
target: document.getElementById('app')!,
|
target: document.getElementById('app'),
|
||||||
})
|
})
|
||||||
|
|
||||||
export default app
|
export default app
|
||||||
|
|||||||
@@ -0,0 +1,12 @@
|
|||||||
|
/** @type {import('tailwindcss').Config} */
|
||||||
|
export default {
|
||||||
|
content: [
|
||||||
|
'./index.html',
|
||||||
|
'./src/**/*.svelte'
|
||||||
|
],
|
||||||
|
theme: {
|
||||||
|
extend: {},
|
||||||
|
},
|
||||||
|
plugins: [],
|
||||||
|
}
|
||||||
|
|
||||||
+1
-2
@@ -1,8 +1,7 @@
|
|||||||
import { defineConfig } from 'vite'
|
import { defineConfig } from 'vite'
|
||||||
import { svelte } from '@sveltejs/vite-plugin-svelte'
|
import { svelte } from '@sveltejs/vite-plugin-svelte'
|
||||||
import tailwindcss from '@tailwindcss/vite'
|
|
||||||
|
|
||||||
// https://vitejs.dev/config/
|
// https://vitejs.dev/config/
|
||||||
export default defineConfig({
|
export default defineConfig({
|
||||||
plugins: [svelte(), tailwindcss()],
|
plugins: [svelte()],
|
||||||
})
|
})
|
||||||
|
|||||||
Reference in New Issue
Block a user