diff --git a/package.json b/package.json index bc37fd2..23bbec3 100644 --- a/package.json +++ b/package.json @@ -15,13 +15,13 @@ "@astrojs/rss": "^4.0.12", "@preact/signals": "^2.2.0", "@tailwindcss/typography": "^0.5.16", - "@tailwindcss/vite": "^4.1.8", + "@tailwindcss/vite": "^4.1.10", "astro": "^5.9.2", "astro-icon": "^1.1.5", - "lucide-preact": "^0.513.0", - "preact": "^10.26.8", + "lucide-preact": "^0.514.0", + "preact": "^10.26.9", "sharp": "^0.34.2", - "tailwindcss": "^4.1.8" + "tailwindcss": "^4.1.10" }, "devDependencies": { "@iconify-json/mdi": "^1.2.3", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 3b9802f..52cf6cf 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -10,43 +10,43 @@ importers: dependencies: '@astrojs/mdx': specifier: ^4.3.0 - version: 4.3.0(astro@5.9.2(@types/node@22.15.30)(jiti@2.4.2)(lightningcss@1.30.1)(rollup@4.42.0)(typescript@5.8.3)) + version: 4.3.0(astro@5.9.2(@types/node@24.0.1)(jiti@2.4.2)(lightningcss@1.30.1)(rollup@4.43.0)(typescript@5.8.3)) '@astrojs/node': specifier: ^9.2.2 - version: 9.2.2(astro@5.9.2(@types/node@22.15.30)(jiti@2.4.2)(lightningcss@1.30.1)(rollup@4.42.0)(typescript@5.8.3)) + version: 9.2.2(astro@5.9.2(@types/node@24.0.1)(jiti@2.4.2)(lightningcss@1.30.1)(rollup@4.43.0)(typescript@5.8.3)) '@astrojs/preact': specifier: ^4.1.0 - version: 4.1.0(@babel/core@7.27.4)(@types/node@22.15.30)(jiti@2.4.2)(lightningcss@1.30.1)(preact@10.26.8) + version: 4.1.0(@babel/core@7.27.4)(@types/node@24.0.1)(jiti@2.4.2)(lightningcss@1.30.1)(preact@10.26.9) '@astrojs/rss': specifier: ^4.0.12 version: 4.0.12 '@preact/signals': specifier: ^2.2.0 - version: 2.2.0(preact@10.26.8) + version: 2.2.0(preact@10.26.9) '@tailwindcss/typography': specifier: ^0.5.16 - version: 0.5.16(tailwindcss@4.1.8) + version: 0.5.16(tailwindcss@4.1.10) '@tailwindcss/vite': - specifier: ^4.1.8 - version: 4.1.8(vite@6.3.5(@types/node@22.15.30)(jiti@2.4.2)(lightningcss@1.30.1)) + specifier: ^4.1.10 + version: 4.1.10(vite@6.3.5(@types/node@24.0.1)(jiti@2.4.2)(lightningcss@1.30.1)) astro: specifier: ^5.9.2 - version: 5.9.2(@types/node@22.15.30)(jiti@2.4.2)(lightningcss@1.30.1)(rollup@4.42.0)(typescript@5.8.3) + version: 5.9.2(@types/node@24.0.1)(jiti@2.4.2)(lightningcss@1.30.1)(rollup@4.43.0)(typescript@5.8.3) astro-icon: specifier: ^1.1.5 version: 1.1.5 lucide-preact: - specifier: ^0.513.0 - version: 0.513.0(preact@10.26.8) + specifier: ^0.514.0 + version: 0.514.0(preact@10.26.9) preact: - specifier: ^10.26.8 - version: 10.26.8 + specifier: ^10.26.9 + version: 10.26.9 sharp: specifier: ^0.34.2 version: 0.34.2 tailwindcss: - specifier: ^4.1.8 - version: 4.1.8 + specifier: ^4.1.10 + version: 4.1.10 devDependencies: '@iconify-json/mdi': specifier: ^1.2.3 @@ -622,8 +622,8 @@ packages: '@babel/core': 7.x vite: 2.x || 3.x || 4.x || 5.x || 6.x - '@preact/signals-core@1.9.0': - resolution: {integrity: sha512-uUgFHJLWxb33rfCtb1g+1e3Rg7Jl5EALhGTHlQ5Y0w37OF+fdidYdYEE6crbpUOYDOjlmelIWf0ulXr1ggfUkg==} + '@preact/signals-core@1.10.0': + resolution: {integrity: sha512-qlKeXlfqtlC+sjxCPHt6Sk0/dXBrKZVcPlianqjNc/vW263YBFiP5mRrgKpHoO0q222Thm1TdYQWfCKpbbgvwA==} '@preact/signals@2.2.0': resolution: {integrity: sha512-P3KPcEYyVk9Wiwfw68QQzRpPkt0H+zjfH3X4AaGCDlc86GuRBYFGiAxT1nC5F5qlsVIEmjNJ9yVYe7C91z3L+g==} @@ -660,103 +660,103 @@ packages: rollup: optional: true - '@rollup/rollup-android-arm-eabi@4.42.0': - resolution: {integrity: sha512-gldmAyS9hpj+H6LpRNlcjQWbuKUtb94lodB9uCz71Jm+7BxK1VIOo7y62tZZwxhA7j1ylv/yQz080L5WkS+LoQ==} + '@rollup/rollup-android-arm-eabi@4.43.0': + resolution: {integrity: sha512-Krjy9awJl6rKbruhQDgivNbD1WuLb8xAclM4IR4cN5pHGAs2oIMMQJEiC3IC/9TZJ+QZkmZhlMO/6MBGxPidpw==} cpu: [arm] os: [android] - '@rollup/rollup-android-arm64@4.42.0': - resolution: {integrity: sha512-bpRipfTgmGFdCZDFLRvIkSNO1/3RGS74aWkJJTFJBH7h3MRV4UijkaEUeOMbi9wxtxYmtAbVcnMtHTPBhLEkaw==} + '@rollup/rollup-android-arm64@4.43.0': + resolution: {integrity: sha512-ss4YJwRt5I63454Rpj+mXCXicakdFmKnUNxr1dLK+5rv5FJgAxnN7s31a5VchRYxCFWdmnDWKd0wbAdTr0J5EA==} cpu: [arm64] os: [android] - '@rollup/rollup-darwin-arm64@4.42.0': - resolution: {integrity: sha512-JxHtA081izPBVCHLKnl6GEA0w3920mlJPLh89NojpU2GsBSB6ypu4erFg/Wx1qbpUbepn0jY4dVWMGZM8gplgA==} + '@rollup/rollup-darwin-arm64@4.43.0': + resolution: {integrity: sha512-eKoL8ykZ7zz8MjgBenEF2OoTNFAPFz1/lyJ5UmmFSz5jW+7XbH1+MAgCVHy72aG59rbuQLcJeiMrP8qP5d/N0A==} cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-x64@4.42.0': - resolution: {integrity: sha512-rv5UZaWVIJTDMyQ3dCEK+m0SAn6G7H3PRc2AZmExvbDvtaDc+qXkei0knQWcI3+c9tEs7iL/4I4pTQoPbNL2SA==} + '@rollup/rollup-darwin-x64@4.43.0': + resolution: {integrity: sha512-SYwXJgaBYW33Wi/q4ubN+ldWC4DzQY62S4Ll2dgfr/dbPoF50dlQwEaEHSKrQdSjC6oIe1WgzosoaNoHCdNuMg==} cpu: [x64] os: [darwin] - '@rollup/rollup-freebsd-arm64@4.42.0': - resolution: {integrity: sha512-fJcN4uSGPWdpVmvLuMtALUFwCHgb2XiQjuECkHT3lWLZhSQ3MBQ9pq+WoWeJq2PrNxr9rPM1Qx+IjyGj8/c6zQ==} + '@rollup/rollup-freebsd-arm64@4.43.0': + resolution: {integrity: sha512-SV+U5sSo0yujrjzBF7/YidieK2iF6E7MdF6EbYxNz94lA+R0wKl3SiixGyG/9Klab6uNBIqsN7j4Y/Fya7wAjQ==} cpu: [arm64] os: [freebsd] - '@rollup/rollup-freebsd-x64@4.42.0': - resolution: {integrity: sha512-CziHfyzpp8hJpCVE/ZdTizw58gr+m7Y2Xq5VOuCSrZR++th2xWAz4Nqk52MoIIrV3JHtVBhbBsJcAxs6NammOQ==} + '@rollup/rollup-freebsd-x64@4.43.0': + resolution: {integrity: sha512-J7uCsiV13L/VOeHJBo5SjasKiGxJ0g+nQTrBkAsmQBIdil3KhPnSE9GnRon4ejX1XDdsmK/l30IYLiAaQEO0Cg==} cpu: [x64] os: [freebsd] - '@rollup/rollup-linux-arm-gnueabihf@4.42.0': - resolution: {integrity: sha512-UsQD5fyLWm2Fe5CDM7VPYAo+UC7+2Px4Y+N3AcPh/LdZu23YcuGPegQly++XEVaC8XUTFVPscl5y5Cl1twEI4A==} + '@rollup/rollup-linux-arm-gnueabihf@4.43.0': + resolution: {integrity: sha512-gTJ/JnnjCMc15uwB10TTATBEhK9meBIY+gXP4s0sHD1zHOaIh4Dmy1X9wup18IiY9tTNk5gJc4yx9ctj/fjrIw==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm-musleabihf@4.42.0': - resolution: {integrity: sha512-/i8NIrlgc/+4n1lnoWl1zgH7Uo0XK5xK3EDqVTf38KvyYgCU/Rm04+o1VvvzJZnVS5/cWSd07owkzcVasgfIkQ==} + '@rollup/rollup-linux-arm-musleabihf@4.43.0': + resolution: {integrity: sha512-ZJ3gZynL1LDSIvRfz0qXtTNs56n5DI2Mq+WACWZ7yGHFUEirHBRt7fyIk0NsCKhmRhn7WAcjgSkSVVxKlPNFFw==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm64-gnu@4.42.0': - resolution: {integrity: sha512-eoujJFOvoIBjZEi9hJnXAbWg+Vo1Ov8n/0IKZZcPZ7JhBzxh2A+2NFyeMZIRkY9iwBvSjloKgcvnjTbGKHE44Q==} + '@rollup/rollup-linux-arm64-gnu@4.43.0': + resolution: {integrity: sha512-8FnkipasmOOSSlfucGYEu58U8cxEdhziKjPD2FIa0ONVMxvl/hmONtX/7y4vGjdUhjcTHlKlDhw3H9t98fPvyA==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-arm64-musl@4.42.0': - resolution: {integrity: sha512-/3NrcOWFSR7RQUQIuZQChLND36aTU9IYE4j+TB40VU78S+RA0IiqHR30oSh6P1S9f9/wVOenHQnacs/Byb824g==} + '@rollup/rollup-linux-arm64-musl@4.43.0': + resolution: {integrity: sha512-KPPyAdlcIZ6S9C3S2cndXDkV0Bb1OSMsX0Eelr2Bay4EsF9yi9u9uzc9RniK3mcUGCLhWY9oLr6er80P5DE6XA==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-loongarch64-gnu@4.42.0': - resolution: {integrity: sha512-O8AplvIeavK5ABmZlKBq9/STdZlnQo7Sle0LLhVA7QT+CiGpNVe197/t8Aph9bhJqbDVGCHpY2i7QyfEDDStDg==} + '@rollup/rollup-linux-loongarch64-gnu@4.43.0': + resolution: {integrity: sha512-HPGDIH0/ZzAZjvtlXj6g+KDQ9ZMHfSP553za7o2Odegb/BEfwJcR0Sw0RLNpQ9nC6Gy8s+3mSS9xjZ0n3rhcYg==} cpu: [loong64] os: [linux] - '@rollup/rollup-linux-powerpc64le-gnu@4.42.0': - resolution: {integrity: sha512-6Qb66tbKVN7VyQrekhEzbHRxXXFFD8QKiFAwX5v9Xt6FiJ3BnCVBuyBxa2fkFGqxOCSGGYNejxd8ht+q5SnmtA==} + '@rollup/rollup-linux-powerpc64le-gnu@4.43.0': + resolution: {integrity: sha512-gEmwbOws4U4GLAJDhhtSPWPXUzDfMRedT3hFMyRAvM9Mrnj+dJIFIeL7otsv2WF3D7GrV0GIewW0y28dOYWkmw==} cpu: [ppc64] os: [linux] - '@rollup/rollup-linux-riscv64-gnu@4.42.0': - resolution: {integrity: sha512-KQETDSEBamQFvg/d8jajtRwLNBlGc3aKpaGiP/LvEbnmVUKlFta1vqJqTrvPtsYsfbE/DLg5CC9zyXRX3fnBiA==} + '@rollup/rollup-linux-riscv64-gnu@4.43.0': + resolution: {integrity: sha512-XXKvo2e+wFtXZF/9xoWohHg+MuRnvO29TI5Hqe9xwN5uN8NKUYy7tXUG3EZAlfchufNCTHNGjEx7uN78KsBo0g==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-riscv64-musl@4.42.0': - resolution: {integrity: sha512-qMvnyjcU37sCo/tuC+JqeDKSuukGAd+pVlRl/oyDbkvPJ3awk6G6ua7tyum02O3lI+fio+eM5wsVd66X0jQtxw==} + '@rollup/rollup-linux-riscv64-musl@4.43.0': + resolution: {integrity: sha512-ruf3hPWhjw6uDFsOAzmbNIvlXFXlBQ4nk57Sec8E8rUxs/AI4HD6xmiiasOOx/3QxS2f5eQMKTAwk7KHwpzr/Q==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-s390x-gnu@4.42.0': - resolution: {integrity: sha512-I2Y1ZUgTgU2RLddUHXTIgyrdOwljjkmcZ/VilvaEumtS3Fkuhbw4p4hgHc39Ypwvo2o7sBFNl2MquNvGCa55Iw==} + '@rollup/rollup-linux-s390x-gnu@4.43.0': + resolution: {integrity: sha512-QmNIAqDiEMEvFV15rsSnjoSmO0+eJLoKRD9EAa9rrYNwO/XRCtOGM3A5A0X+wmG+XRrw9Fxdsw+LnyYiZWWcVw==} cpu: [s390x] os: [linux] - '@rollup/rollup-linux-x64-gnu@4.42.0': - resolution: {integrity: sha512-Gfm6cV6mj3hCUY8TqWa63DB8Mx3NADoFwiJrMpoZ1uESbK8FQV3LXkhfry+8bOniq9pqY1OdsjFWNsSbfjPugw==} + '@rollup/rollup-linux-x64-gnu@4.43.0': + resolution: {integrity: sha512-jAHr/S0iiBtFyzjhOkAics/2SrXE092qyqEg96e90L3t9Op8OTzS6+IX0Fy5wCt2+KqeHAkti+eitV0wvblEoQ==} cpu: [x64] os: [linux] - '@rollup/rollup-linux-x64-musl@4.42.0': - resolution: {integrity: sha512-g86PF8YZ9GRqkdi0VoGlcDUb4rYtQKyTD1IVtxxN4Hpe7YqLBShA7oHMKU6oKTCi3uxwW4VkIGnOaH/El8de3w==} + '@rollup/rollup-linux-x64-musl@4.43.0': + resolution: {integrity: sha512-3yATWgdeXyuHtBhrLt98w+5fKurdqvs8B53LaoKD7P7H7FKOONLsBVMNl9ghPQZQuYcceV5CDyPfyfGpMWD9mQ==} cpu: [x64] os: [linux] - '@rollup/rollup-win32-arm64-msvc@4.42.0': - resolution: {integrity: sha512-+axkdyDGSp6hjyzQ5m1pgcvQScfHnMCcsXkx8pTgy/6qBmWVhtRVlgxjWwDp67wEXXUr0x+vD6tp5W4x6V7u1A==} + '@rollup/rollup-win32-arm64-msvc@4.43.0': + resolution: {integrity: sha512-wVzXp2qDSCOpcBCT5WRWLmpJRIzv23valvcTwMHEobkjippNf+C3ys/+wf07poPkeNix0paTNemB2XrHr2TnGw==} cpu: [arm64] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.42.0': - resolution: {integrity: sha512-F+5J9pelstXKwRSDq92J0TEBXn2nfUrQGg+HK1+Tk7VOL09e0gBqUHugZv7SW4MGrYj41oNCUe3IKCDGVlis2g==} + '@rollup/rollup-win32-ia32-msvc@4.43.0': + resolution: {integrity: sha512-fYCTEyzf8d+7diCw8b+asvWDCLMjsCEA8alvtAutqJOJp/wL5hs1rWSqJ1vkjgW0L2NB4bsYJrpKkiIPRR9dvw==} cpu: [ia32] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.42.0': - resolution: {integrity: sha512-LpHiJRwkaVz/LqjHjK8LCi8osq7elmpwujwbXKNW88bM8eeGxavJIKKjkjpMHAh/2xfnrt1ZSnhTv41WYUHYmA==} + '@rollup/rollup-win32-x64-msvc@4.43.0': + resolution: {integrity: sha512-SnGhLiE5rlK0ofq8kzuDkM0g7FN1s5VYY+YSMTibP7CqShxCQvqtNxTARS4xX4PFJfHjG0ZQYX9iGzI3FQh5Aw==} cpu: [x64] os: [win32] @@ -784,65 +784,65 @@ packages: '@swc/helpers@0.5.17': resolution: {integrity: sha512-5IKx/Y13RsYd+sauPb2x+U/xZikHjolzfuDgTAl/Tdf3Q8rslRvC19NKDLgAJQ6wsqADk10ntlv08nPFw/gO/A==} - '@tailwindcss/node@4.1.8': - resolution: {integrity: sha512-OWwBsbC9BFAJelmnNcrKuf+bka2ZxCE2A4Ft53Tkg4uoiE67r/PMEYwCsourC26E+kmxfwE0hVzMdxqeW+xu7Q==} + '@tailwindcss/node@4.1.10': + resolution: {integrity: sha512-2ACf1znY5fpRBwRhMgj9ZXvb2XZW8qs+oTfotJ2C5xR0/WNL7UHZ7zXl6s+rUqedL1mNi+0O+WQr5awGowS3PQ==} - '@tailwindcss/oxide-android-arm64@4.1.8': - resolution: {integrity: sha512-Fbz7qni62uKYceWYvUjRqhGfZKwhZDQhlrJKGtnZfuNtHFqa8wmr+Wn74CTWERiW2hn3mN5gTpOoxWKk0jRxjg==} + '@tailwindcss/oxide-android-arm64@4.1.10': + resolution: {integrity: sha512-VGLazCoRQ7rtsCzThaI1UyDu/XRYVyH4/EWiaSX6tFglE+xZB5cvtC5Omt0OQ+FfiIVP98su16jDVHDEIuH4iQ==} engines: {node: '>= 10'} cpu: [arm64] os: [android] - '@tailwindcss/oxide-darwin-arm64@4.1.8': - resolution: {integrity: sha512-RdRvedGsT0vwVVDztvyXhKpsU2ark/BjgG0huo4+2BluxdXo8NDgzl77qh0T1nUxmM11eXwR8jA39ibvSTbi7A==} + '@tailwindcss/oxide-darwin-arm64@4.1.10': + resolution: {integrity: sha512-ZIFqvR1irX2yNjWJzKCqTCcHZbgkSkSkZKbRM3BPzhDL/18idA8uWCoopYA2CSDdSGFlDAxYdU2yBHwAwx8euQ==} engines: {node: '>= 10'} cpu: [arm64] os: [darwin] - '@tailwindcss/oxide-darwin-x64@4.1.8': - resolution: {integrity: sha512-t6PgxjEMLp5Ovf7uMb2OFmb3kqzVTPPakWpBIFzppk4JE4ix0yEtbtSjPbU8+PZETpaYMtXvss2Sdkx8Vs4XRw==} + '@tailwindcss/oxide-darwin-x64@4.1.10': + resolution: {integrity: sha512-eCA4zbIhWUFDXoamNztmS0MjXHSEJYlvATzWnRiTqJkcUteSjO94PoRHJy1Xbwp9bptjeIxxBHh+zBWFhttbrQ==} engines: {node: '>= 10'} cpu: [x64] os: [darwin] - '@tailwindcss/oxide-freebsd-x64@4.1.8': - resolution: {integrity: sha512-g8C8eGEyhHTqwPStSwZNSrOlyx0bhK/V/+zX0Y+n7DoRUzyS8eMbVshVOLJTDDC+Qn9IJnilYbIKzpB9n4aBsg==} + '@tailwindcss/oxide-freebsd-x64@4.1.10': + resolution: {integrity: sha512-8/392Xu12R0cc93DpiJvNpJ4wYVSiciUlkiOHOSOQNH3adq9Gi/dtySK7dVQjXIOzlpSHjeCL89RUUI8/GTI6g==} engines: {node: '>= 10'} cpu: [x64] os: [freebsd] - '@tailwindcss/oxide-linux-arm-gnueabihf@4.1.8': - resolution: {integrity: sha512-Jmzr3FA4S2tHhaC6yCjac3rGf7hG9R6Gf2z9i9JFcuyy0u79HfQsh/thifbYTF2ic82KJovKKkIB6Z9TdNhCXQ==} + '@tailwindcss/oxide-linux-arm-gnueabihf@4.1.10': + resolution: {integrity: sha512-t9rhmLT6EqeuPT+MXhWhlRYIMSfh5LZ6kBrC4FS6/+M1yXwfCtp24UumgCWOAJVyjQwG+lYva6wWZxrfvB+NhQ==} engines: {node: '>= 10'} cpu: [arm] os: [linux] - '@tailwindcss/oxide-linux-arm64-gnu@4.1.8': - resolution: {integrity: sha512-qq7jXtO1+UEtCmCeBBIRDrPFIVI4ilEQ97qgBGdwXAARrUqSn/L9fUrkb1XP/mvVtoVeR2bt/0L77xx53bPZ/Q==} + '@tailwindcss/oxide-linux-arm64-gnu@4.1.10': + resolution: {integrity: sha512-3oWrlNlxLRxXejQ8zImzrVLuZ/9Z2SeKoLhtCu0hpo38hTO2iL86eFOu4sVR8cZc6n3z7eRXXqtHJECa6mFOvA==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@tailwindcss/oxide-linux-arm64-musl@4.1.8': - resolution: {integrity: sha512-O6b8QesPbJCRshsNApsOIpzKt3ztG35gfX9tEf4arD7mwNinsoCKxkj8TgEE0YRjmjtO3r9FlJnT/ENd9EVefQ==} + '@tailwindcss/oxide-linux-arm64-musl@4.1.10': + resolution: {integrity: sha512-saScU0cmWvg/Ez4gUmQWr9pvY9Kssxt+Xenfx1LG7LmqjcrvBnw4r9VjkFcqmbBb7GCBwYNcZi9X3/oMda9sqQ==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@tailwindcss/oxide-linux-x64-gnu@4.1.8': - resolution: {integrity: sha512-32iEXX/pXwikshNOGnERAFwFSfiltmijMIAbUhnNyjFr3tmWmMJWQKU2vNcFX0DACSXJ3ZWcSkzNbaKTdngH6g==} + '@tailwindcss/oxide-linux-x64-gnu@4.1.10': + resolution: {integrity: sha512-/G3ao/ybV9YEEgAXeEg28dyH6gs1QG8tvdN9c2MNZdUXYBaIY/Gx0N6RlJzfLy/7Nkdok4kaxKPHKJUlAaoTdA==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@tailwindcss/oxide-linux-x64-musl@4.1.8': - resolution: {integrity: sha512-s+VSSD+TfZeMEsCaFaHTaY5YNj3Dri8rST09gMvYQKwPphacRG7wbuQ5ZJMIJXN/puxPcg/nU+ucvWguPpvBDg==} + '@tailwindcss/oxide-linux-x64-musl@4.1.10': + resolution: {integrity: sha512-LNr7X8fTiKGRtQGOerSayc2pWJp/9ptRYAa4G+U+cjw9kJZvkopav1AQc5HHD+U364f71tZv6XamaHKgrIoVzA==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@tailwindcss/oxide-wasm32-wasi@4.1.8': - resolution: {integrity: sha512-CXBPVFkpDjM67sS1psWohZ6g/2/cd+cq56vPxK4JeawelxwK4YECgl9Y9TjkE2qfF+9/s1tHHJqrC4SS6cVvSg==} + '@tailwindcss/oxide-wasm32-wasi@4.1.10': + resolution: {integrity: sha512-d6ekQpopFQJAcIK2i7ZzWOYGZ+A6NzzvQ3ozBvWFdeyqfOZdYHU66g5yr+/HC4ipP1ZgWsqa80+ISNILk+ae/Q==} engines: {node: '>=14.0.0'} cpu: [wasm32] bundledDependencies: @@ -853,20 +853,20 @@ packages: - '@emnapi/wasi-threads' - tslib - '@tailwindcss/oxide-win32-arm64-msvc@4.1.8': - resolution: {integrity: sha512-7GmYk1n28teDHUjPlIx4Z6Z4hHEgvP5ZW2QS9ygnDAdI/myh3HTHjDqtSqgu1BpRoI4OiLx+fThAyA1JePoENA==} + '@tailwindcss/oxide-win32-arm64-msvc@4.1.10': + resolution: {integrity: sha512-i1Iwg9gRbwNVOCYmnigWCCgow8nDWSFmeTUU5nbNx3rqbe4p0kRbEqLwLJbYZKmSSp23g4N6rCDmm7OuPBXhDA==} engines: {node: '>= 10'} cpu: [arm64] os: [win32] - '@tailwindcss/oxide-win32-x64-msvc@4.1.8': - resolution: {integrity: sha512-fou+U20j+Jl0EHwK92spoWISON2OBnCazIc038Xj2TdweYV33ZRkS9nwqiUi2d/Wba5xg5UoHfvynnb/UB49cQ==} + '@tailwindcss/oxide-win32-x64-msvc@4.1.10': + resolution: {integrity: sha512-sGiJTjcBSfGq2DVRtaSljq5ZgZS2SDHSIfhOylkBvHVjwOsodBhnb3HdmiKkVuUGKD0I7G63abMOVaskj1KpOA==} engines: {node: '>= 10'} cpu: [x64] os: [win32] - '@tailwindcss/oxide@4.1.8': - resolution: {integrity: sha512-d7qvv9PsM5N3VNKhwVUhpK6r4h9wtLkJ6lz9ZY9aeZgrUWk1Z8VPyqyDT9MZlem7GTGseRQHkeB1j3tC7W1P+A==} + '@tailwindcss/oxide@4.1.10': + resolution: {integrity: sha512-v0C43s7Pjw+B9w21htrQwuFObSkio2aV/qPx/mhrRldbqxbWJK6KizM+q7BF1/1CmuLqZqX3CeYF7s7P9fbA8Q==} engines: {node: '>= 10'} '@tailwindcss/typography@0.5.16': @@ -874,8 +874,8 @@ packages: peerDependencies: tailwindcss: '>=3.0.0 || insiders || >=4.0.0-alpha.20 || >=4.0.0-beta.1' - '@tailwindcss/vite@4.1.8': - resolution: {integrity: sha512-CQ+I8yxNV5/6uGaJjiuymgw0kEQiNKRinYbZXPdx1fk5WgiyReG0VaUx/Xq6aVNSUNJFzxm6o8FNKS5aMaim5A==} + '@tailwindcss/vite@4.1.10': + resolution: {integrity: sha512-QWnD5HDY2IADv+vYR82lOhqOlS1jSCUUAmfem52cXAhRTKxpDh3ARX8TTXJTCCO7Rv7cD2Nlekabv02bwP3a2A==} peerDependencies: vite: ^5.2.0 || ^6 @@ -913,8 +913,8 @@ packages: '@types/nlcst@2.0.3': resolution: {integrity: sha512-vSYNSDe6Ix3q+6Z7ri9lyWqgGhJTmzRjZRqyq15N0Z/1/UnVsno9G/N40NBijoYx2seFDIl0+B2mgAb9mezUCA==} - '@types/node@22.15.30': - resolution: {integrity: sha512-6Q7lr06bEHdlfplU6YRbgG1SFBdlsfNC4/lX+SkhiTs0cpJkOElmWls8PxDFv4yY/xKb8Y6SO0OmSX4wgqTZbA==} + '@types/node@24.0.1': + resolution: {integrity: sha512-MX4Zioh39chHlDJbKmEgydJDS3tspMP/lnQC67G3SWsTnb9NeYVWOjkxpOSy4oMfPs4StcWHwBrvUb4ybfnuaw==} '@types/tar@6.1.13': resolution: {integrity: sha512-IznnlmU5f4WcGTh2ltRu/Ijpmk8wiWXfF0VA4s+HPjHZgvFggk1YaIkbo5krX/zUCzWF8N/l4+W/LNxnvAJ8nw==} @@ -1035,8 +1035,8 @@ packages: resolution: {integrity: sha512-8WB3Jcas3swSvjIeA2yvCJ+Miyz5l1ZmB6HFb9R1317dt9LCQoswg/BGrmAmkWVEszSrrg4RwmO46qIm2OEnSA==} engines: {node: '>=16'} - caniuse-lite@1.0.30001721: - resolution: {integrity: sha512-cOuvmUVtKrtEaoKiO0rSc29jcjwMwX5tOHDy4MgVFEWiUXj4uBMJkwI8MDySkgXidpMiHUcviogAvFi4pA2hDQ==} + caniuse-lite@1.0.30001722: + resolution: {integrity: sha512-DCQHBBZtiK6JVkAGw7drvAMK0Q0POD/xZvEmDp6baiMMP6QXXk9HpD6mNYBZWhOPG6LvIDb82ITqtWjhDckHCA==} ccount@2.0.1: resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} @@ -1378,8 +1378,8 @@ packages: fd-slicer@1.1.0: resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==} - fdir@6.4.5: - resolution: {integrity: sha512-4BG7puHpVsIYxZUbiUE3RqGloLaSSwzYie5jvasC4LWuBWzZawynvYouhjbQKw2JuIGYdm0DzIxl8iVidKlUEw==} + fdir@6.4.6: + resolution: {integrity: sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w==} peerDependencies: picomatch: ^3 || ^4 peerDependenciesMeta: @@ -1709,8 +1709,8 @@ packages: lru-cache@5.1.1: resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} - lucide-preact@0.513.0: - resolution: {integrity: sha512-YBn2FmzpInlAIRX1dY5jTH0aHbVF1VLq6I28UlDqz615Sa+l4DHVBQYzMmc3ArVm0AorabZmRBaf09gTvpFbuQ==} + lucide-preact@0.514.0: + resolution: {integrity: sha512-D00WPWu29HKYu3rURDdvP4NsPN74nTX3kRrZ72CUfYrqB34LJxJvd58ca2jaQAIaydfsSWyiBvMu4cpmSbaBSg==} peerDependencies: preact: ^10.5.13 @@ -2078,8 +2078,8 @@ packages: resolution: {integrity: sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==} engines: {node: '>=4'} - postcss@8.5.4: - resolution: {integrity: sha512-QSa9EBe+uwlGTFmHsPKokv3B/oEMQZxfqW0QqNCyhpa6mB1afzulwn8hihglqAb2pOw+BJgNlmXQ8la2VeHB7w==} + postcss@8.5.5: + resolution: {integrity: sha512-d/jtm+rdNT8tpXuHY5MMtcbJFBkhXE6593XVR9UoGCH8jSFGci7jGvMGH5RYd5PBJW+00NZQt6gf7CbagJCrhg==} engines: {node: ^10 || ^12 || >=14} preact-render-to-string@6.5.13: @@ -2087,8 +2087,8 @@ packages: peerDependencies: preact: '>=10' - preact@10.26.8: - resolution: {integrity: sha512-1nMfdFjucm5hKvq0IClqZwK4FJkGXhRrQstOQ3P4vp8HxKrJEMFcY6RdBRVTdfQS/UlnX6gfbPuTvaqx/bDoeQ==} + preact@10.26.9: + resolution: {integrity: sha512-SSjF9vcnF27mJK1XyFMNJzFd5u3pQiATFqoaDy03XuN00u4ziveVVEGt5RKJrDR8MHE/wJo9Nnad56RLzS2RMA==} prismjs@1.30.0: resolution: {integrity: sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==} @@ -2194,8 +2194,8 @@ packages: retext@9.0.0: resolution: {integrity: sha512-sbMDcpHCNjvlheSgMfEcVrZko3cDzdbe1x/e7G66dFp0Ff7Mldvi2uv6JkJQzdRcvLYE8CA8Oe8siQx8ZOgTcA==} - rollup@4.42.0: - resolution: {integrity: sha512-LW+Vse3BJPyGJGAJt1j8pWDKPd73QM8cRXYK1IxOBgL2AGLu7Xd2YOW0M2sLUBCkF5MshXXtMApyEAEzMVMsnw==} + rollup@4.43.0: + resolution: {integrity: sha512-wdN2Kd3Twh8MAEOEJZsuxuLKCsBEo4PVNLK6tQWAn10VhsVewQLzcucMgLolRlhFybGxfclbPeEYBaP6RvUFGg==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true @@ -2301,8 +2301,8 @@ packages: engines: {node: '>=14.0.0'} hasBin: true - tailwindcss@4.1.8: - resolution: {integrity: sha512-kjeW8gjdxasbmFKpVGrGd5T4i40mV5J2Rasw48QARfYeQ8YS9x02ON9SFWax3Qf616rt4Cp3nVNIj6Hd1mP3og==} + tailwindcss@4.1.10: + resolution: {integrity: sha512-P3nr6WkvKV/ONsTzj6Gb57sWPMX29EPNPopo7+FcpkQaNsrNpZ1pv8QmrYI2RqEKD7mlGqLnGovlcYnBK0IqUA==} tapable@2.2.2: resolution: {integrity: sha512-Re10+NauLTMCudc7T5WLFLAwDhQ0JWdrMK+9B2M8zR5hRExKmsRDCBA7/aV/pNJFltmBFO5BAMlQFi/vq3nKOg==} @@ -2373,8 +2373,8 @@ packages: uncrypto@0.1.3: resolution: {integrity: sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q==} - undici-types@6.21.0: - resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} + undici-types@7.8.0: + resolution: {integrity: sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw==} undici@6.21.3: resolution: {integrity: sha512-gBLkYIlEnSp8pFbT64yFgGE6UIB9tAkhukC23PmMDCe5Nd+cRqKxSjw5y54MK2AZMgZfJWMaNE4nYUHgi1XEOw==} @@ -2627,8 +2627,8 @@ packages: typescript: ^4.9.4 || ^5.0.2 zod: ^3 - zod@3.25.56: - resolution: {integrity: sha512-rd6eEF3BTNvQnR2e2wwolfTmUTnp70aUTqr0oaGbHifzC3BKJsoV+Gat8vxUMR1hwOKBs6El+qWehrHbCpW6SQ==} + zod@3.25.62: + resolution: {integrity: sha512-YCxsr4DmhPcrKPC9R1oBHQNlQzlJEyPAId//qTau/vBee9uO8K6prmRq4eMkOyxvBfH4wDPIPdLx9HVMWIY3xA==} zwitch@2.0.4: resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} @@ -2677,12 +2677,12 @@ snapshots: transitivePeerDependencies: - supports-color - '@astrojs/mdx@4.3.0(astro@5.9.2(@types/node@22.15.30)(jiti@2.4.2)(lightningcss@1.30.1)(rollup@4.42.0)(typescript@5.8.3))': + '@astrojs/mdx@4.3.0(astro@5.9.2(@types/node@24.0.1)(jiti@2.4.2)(lightningcss@1.30.1)(rollup@4.43.0)(typescript@5.8.3))': dependencies: '@astrojs/markdown-remark': 6.3.2 '@mdx-js/mdx': 3.1.0(acorn@8.15.0) acorn: 8.15.0 - astro: 5.9.2(@types/node@22.15.30)(jiti@2.4.2)(lightningcss@1.30.1)(rollup@4.42.0)(typescript@5.8.3) + astro: 5.9.2(@types/node@24.0.1)(jiti@2.4.2)(lightningcss@1.30.1)(rollup@4.43.0)(typescript@5.8.3) es-module-lexer: 1.7.0 estree-util-visit: 2.0.0 hast-util-to-html: 9.0.5 @@ -2696,22 +2696,22 @@ snapshots: transitivePeerDependencies: - supports-color - '@astrojs/node@9.2.2(astro@5.9.2(@types/node@22.15.30)(jiti@2.4.2)(lightningcss@1.30.1)(rollup@4.42.0)(typescript@5.8.3))': + '@astrojs/node@9.2.2(astro@5.9.2(@types/node@24.0.1)(jiti@2.4.2)(lightningcss@1.30.1)(rollup@4.43.0)(typescript@5.8.3))': dependencies: '@astrojs/internal-helpers': 0.6.1 - astro: 5.9.2(@types/node@22.15.30)(jiti@2.4.2)(lightningcss@1.30.1)(rollup@4.42.0)(typescript@5.8.3) + astro: 5.9.2(@types/node@24.0.1)(jiti@2.4.2)(lightningcss@1.30.1)(rollup@4.43.0)(typescript@5.8.3) send: 1.2.0 server-destroy: 1.0.1 transitivePeerDependencies: - supports-color - '@astrojs/preact@4.1.0(@babel/core@7.27.4)(@types/node@22.15.30)(jiti@2.4.2)(lightningcss@1.30.1)(preact@10.26.8)': + '@astrojs/preact@4.1.0(@babel/core@7.27.4)(@types/node@24.0.1)(jiti@2.4.2)(lightningcss@1.30.1)(preact@10.26.9)': dependencies: - '@preact/preset-vite': 2.10.1(@babel/core@7.27.4)(preact@10.26.8)(vite@6.3.5(@types/node@22.15.30)(jiti@2.4.2)(lightningcss@1.30.1)) - '@preact/signals': 2.2.0(preact@10.26.8) - preact: 10.26.8 - preact-render-to-string: 6.5.13(preact@10.26.8) - vite: 6.3.5(@types/node@22.15.30)(jiti@2.4.2)(lightningcss@1.30.1) + '@preact/preset-vite': 2.10.1(@babel/core@7.27.4)(preact@10.26.9)(vite@6.3.5(@types/node@24.0.1)(jiti@2.4.2)(lightningcss@1.30.1)) + '@preact/signals': 2.2.0(preact@10.26.9) + preact: 10.26.9 + preact-render-to-string: 6.5.13(preact@10.26.9) + vite: 6.3.5(@types/node@24.0.1)(jiti@2.4.2)(lightningcss@1.30.1) transitivePeerDependencies: - '@babel/core' - '@types/node' @@ -3212,46 +3212,46 @@ snapshots: '@oslojs/encoding@1.1.0': {} - '@preact/preset-vite@2.10.1(@babel/core@7.27.4)(preact@10.26.8)(vite@6.3.5(@types/node@22.15.30)(jiti@2.4.2)(lightningcss@1.30.1))': + '@preact/preset-vite@2.10.1(@babel/core@7.27.4)(preact@10.26.9)(vite@6.3.5(@types/node@24.0.1)(jiti@2.4.2)(lightningcss@1.30.1))': dependencies: '@babel/core': 7.27.4 '@babel/plugin-transform-react-jsx': 7.27.1(@babel/core@7.27.4) '@babel/plugin-transform-react-jsx-development': 7.27.1(@babel/core@7.27.4) - '@prefresh/vite': 2.4.7(preact@10.26.8)(vite@6.3.5(@types/node@22.15.30)(jiti@2.4.2)(lightningcss@1.30.1)) + '@prefresh/vite': 2.4.7(preact@10.26.9)(vite@6.3.5(@types/node@24.0.1)(jiti@2.4.2)(lightningcss@1.30.1)) '@rollup/pluginutils': 4.2.1 babel-plugin-transform-hook-names: 1.0.2(@babel/core@7.27.4) debug: 4.4.1 kolorist: 1.8.0 - vite: 6.3.5(@types/node@22.15.30)(jiti@2.4.2)(lightningcss@1.30.1) - vite-prerender-plugin: 0.5.10(vite@6.3.5(@types/node@22.15.30)(jiti@2.4.2)(lightningcss@1.30.1)) + vite: 6.3.5(@types/node@24.0.1)(jiti@2.4.2)(lightningcss@1.30.1) + vite-prerender-plugin: 0.5.10(vite@6.3.5(@types/node@24.0.1)(jiti@2.4.2)(lightningcss@1.30.1)) transitivePeerDependencies: - preact - supports-color - '@preact/signals-core@1.9.0': {} + '@preact/signals-core@1.10.0': {} - '@preact/signals@2.2.0(preact@10.26.8)': + '@preact/signals@2.2.0(preact@10.26.9)': dependencies: - '@preact/signals-core': 1.9.0 - preact: 10.26.8 + '@preact/signals-core': 1.10.0 + preact: 10.26.9 '@prefresh/babel-plugin@0.5.1': {} - '@prefresh/core@1.5.3(preact@10.26.8)': + '@prefresh/core@1.5.3(preact@10.26.9)': dependencies: - preact: 10.26.8 + preact: 10.26.9 '@prefresh/utils@1.2.0': {} - '@prefresh/vite@2.4.7(preact@10.26.8)(vite@6.3.5(@types/node@22.15.30)(jiti@2.4.2)(lightningcss@1.30.1))': + '@prefresh/vite@2.4.7(preact@10.26.9)(vite@6.3.5(@types/node@24.0.1)(jiti@2.4.2)(lightningcss@1.30.1))': dependencies: '@babel/core': 7.27.4 '@prefresh/babel-plugin': 0.5.1 - '@prefresh/core': 1.5.3(preact@10.26.8) + '@prefresh/core': 1.5.3(preact@10.26.9) '@prefresh/utils': 1.2.0 '@rollup/pluginutils': 4.2.1 - preact: 10.26.8 - vite: 6.3.5(@types/node@22.15.30)(jiti@2.4.2)(lightningcss@1.30.1) + preact: 10.26.9 + vite: 6.3.5(@types/node@24.0.1)(jiti@2.4.2)(lightningcss@1.30.1) transitivePeerDependencies: - supports-color @@ -3260,72 +3260,72 @@ snapshots: estree-walker: 2.0.2 picomatch: 2.3.1 - '@rollup/pluginutils@5.1.4(rollup@4.42.0)': + '@rollup/pluginutils@5.1.4(rollup@4.43.0)': dependencies: '@types/estree': 1.0.8 estree-walker: 2.0.2 picomatch: 4.0.2 optionalDependencies: - rollup: 4.42.0 + rollup: 4.43.0 - '@rollup/rollup-android-arm-eabi@4.42.0': + '@rollup/rollup-android-arm-eabi@4.43.0': optional: true - '@rollup/rollup-android-arm64@4.42.0': + '@rollup/rollup-android-arm64@4.43.0': optional: true - '@rollup/rollup-darwin-arm64@4.42.0': + '@rollup/rollup-darwin-arm64@4.43.0': optional: true - '@rollup/rollup-darwin-x64@4.42.0': + '@rollup/rollup-darwin-x64@4.43.0': optional: true - '@rollup/rollup-freebsd-arm64@4.42.0': + '@rollup/rollup-freebsd-arm64@4.43.0': optional: true - '@rollup/rollup-freebsd-x64@4.42.0': + '@rollup/rollup-freebsd-x64@4.43.0': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.42.0': + '@rollup/rollup-linux-arm-gnueabihf@4.43.0': optional: true - '@rollup/rollup-linux-arm-musleabihf@4.42.0': + '@rollup/rollup-linux-arm-musleabihf@4.43.0': optional: true - '@rollup/rollup-linux-arm64-gnu@4.42.0': + '@rollup/rollup-linux-arm64-gnu@4.43.0': optional: true - '@rollup/rollup-linux-arm64-musl@4.42.0': + '@rollup/rollup-linux-arm64-musl@4.43.0': optional: true - '@rollup/rollup-linux-loongarch64-gnu@4.42.0': + '@rollup/rollup-linux-loongarch64-gnu@4.43.0': optional: true - '@rollup/rollup-linux-powerpc64le-gnu@4.42.0': + '@rollup/rollup-linux-powerpc64le-gnu@4.43.0': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.42.0': + '@rollup/rollup-linux-riscv64-gnu@4.43.0': optional: true - '@rollup/rollup-linux-riscv64-musl@4.42.0': + '@rollup/rollup-linux-riscv64-musl@4.43.0': optional: true - '@rollup/rollup-linux-s390x-gnu@4.42.0': + '@rollup/rollup-linux-s390x-gnu@4.43.0': optional: true - '@rollup/rollup-linux-x64-gnu@4.42.0': + '@rollup/rollup-linux-x64-gnu@4.43.0': optional: true - '@rollup/rollup-linux-x64-musl@4.42.0': + '@rollup/rollup-linux-x64-musl@4.43.0': optional: true - '@rollup/rollup-win32-arm64-msvc@4.42.0': + '@rollup/rollup-win32-arm64-msvc@4.43.0': optional: true - '@rollup/rollup-win32-ia32-msvc@4.42.0': + '@rollup/rollup-win32-ia32-msvc@4.43.0': optional: true - '@rollup/rollup-win32-x64-msvc@4.42.0': + '@rollup/rollup-win32-x64-msvc@4.43.0': optional: true '@shikijs/core@3.6.0': @@ -3365,7 +3365,7 @@ snapshots: dependencies: tslib: 2.8.1 - '@tailwindcss/node@4.1.8': + '@tailwindcss/node@4.1.10': dependencies: '@ampproject/remapping': 2.3.0 enhanced-resolve: 5.18.1 @@ -3373,76 +3373,76 @@ snapshots: lightningcss: 1.30.1 magic-string: 0.30.17 source-map-js: 1.2.1 - tailwindcss: 4.1.8 + tailwindcss: 4.1.10 - '@tailwindcss/oxide-android-arm64@4.1.8': + '@tailwindcss/oxide-android-arm64@4.1.10': optional: true - '@tailwindcss/oxide-darwin-arm64@4.1.8': + '@tailwindcss/oxide-darwin-arm64@4.1.10': optional: true - '@tailwindcss/oxide-darwin-x64@4.1.8': + '@tailwindcss/oxide-darwin-x64@4.1.10': optional: true - '@tailwindcss/oxide-freebsd-x64@4.1.8': + '@tailwindcss/oxide-freebsd-x64@4.1.10': optional: true - '@tailwindcss/oxide-linux-arm-gnueabihf@4.1.8': + '@tailwindcss/oxide-linux-arm-gnueabihf@4.1.10': optional: true - '@tailwindcss/oxide-linux-arm64-gnu@4.1.8': + '@tailwindcss/oxide-linux-arm64-gnu@4.1.10': optional: true - '@tailwindcss/oxide-linux-arm64-musl@4.1.8': + '@tailwindcss/oxide-linux-arm64-musl@4.1.10': optional: true - '@tailwindcss/oxide-linux-x64-gnu@4.1.8': + '@tailwindcss/oxide-linux-x64-gnu@4.1.10': optional: true - '@tailwindcss/oxide-linux-x64-musl@4.1.8': + '@tailwindcss/oxide-linux-x64-musl@4.1.10': optional: true - '@tailwindcss/oxide-wasm32-wasi@4.1.8': + '@tailwindcss/oxide-wasm32-wasi@4.1.10': optional: true - '@tailwindcss/oxide-win32-arm64-msvc@4.1.8': + '@tailwindcss/oxide-win32-arm64-msvc@4.1.10': optional: true - '@tailwindcss/oxide-win32-x64-msvc@4.1.8': + '@tailwindcss/oxide-win32-x64-msvc@4.1.10': optional: true - '@tailwindcss/oxide@4.1.8': + '@tailwindcss/oxide@4.1.10': dependencies: detect-libc: 2.0.4 tar: 7.4.3 optionalDependencies: - '@tailwindcss/oxide-android-arm64': 4.1.8 - '@tailwindcss/oxide-darwin-arm64': 4.1.8 - '@tailwindcss/oxide-darwin-x64': 4.1.8 - '@tailwindcss/oxide-freebsd-x64': 4.1.8 - '@tailwindcss/oxide-linux-arm-gnueabihf': 4.1.8 - '@tailwindcss/oxide-linux-arm64-gnu': 4.1.8 - '@tailwindcss/oxide-linux-arm64-musl': 4.1.8 - '@tailwindcss/oxide-linux-x64-gnu': 4.1.8 - '@tailwindcss/oxide-linux-x64-musl': 4.1.8 - '@tailwindcss/oxide-wasm32-wasi': 4.1.8 - '@tailwindcss/oxide-win32-arm64-msvc': 4.1.8 - '@tailwindcss/oxide-win32-x64-msvc': 4.1.8 + '@tailwindcss/oxide-android-arm64': 4.1.10 + '@tailwindcss/oxide-darwin-arm64': 4.1.10 + '@tailwindcss/oxide-darwin-x64': 4.1.10 + '@tailwindcss/oxide-freebsd-x64': 4.1.10 + '@tailwindcss/oxide-linux-arm-gnueabihf': 4.1.10 + '@tailwindcss/oxide-linux-arm64-gnu': 4.1.10 + '@tailwindcss/oxide-linux-arm64-musl': 4.1.10 + '@tailwindcss/oxide-linux-x64-gnu': 4.1.10 + '@tailwindcss/oxide-linux-x64-musl': 4.1.10 + '@tailwindcss/oxide-wasm32-wasi': 4.1.10 + '@tailwindcss/oxide-win32-arm64-msvc': 4.1.10 + '@tailwindcss/oxide-win32-x64-msvc': 4.1.10 - '@tailwindcss/typography@0.5.16(tailwindcss@4.1.8)': + '@tailwindcss/typography@0.5.16(tailwindcss@4.1.10)': dependencies: lodash.castarray: 4.4.0 lodash.isplainobject: 4.0.6 lodash.merge: 4.6.2 postcss-selector-parser: 6.0.10 - tailwindcss: 4.1.8 + tailwindcss: 4.1.10 - '@tailwindcss/vite@4.1.8(vite@6.3.5(@types/node@22.15.30)(jiti@2.4.2)(lightningcss@1.30.1))': + '@tailwindcss/vite@4.1.10(vite@6.3.5(@types/node@24.0.1)(jiti@2.4.2)(lightningcss@1.30.1))': dependencies: - '@tailwindcss/node': 4.1.8 - '@tailwindcss/oxide': 4.1.8 - tailwindcss: 4.1.8 - vite: 6.3.5(@types/node@22.15.30)(jiti@2.4.2)(lightningcss@1.30.1) + '@tailwindcss/node': 4.1.10 + '@tailwindcss/oxide': 4.1.10 + tailwindcss: 4.1.10 + vite: 6.3.5(@types/node@24.0.1)(jiti@2.4.2)(lightningcss@1.30.1) '@trysound/sax@0.2.0': {} @@ -3460,7 +3460,7 @@ snapshots: '@types/fontkit@2.0.8': dependencies: - '@types/node': 22.15.30 + '@types/node': 24.0.1 '@types/hast@3.0.4': dependencies: @@ -3478,13 +3478,13 @@ snapshots: dependencies: '@types/unist': 3.0.3 - '@types/node@22.15.30': + '@types/node@24.0.1': dependencies: - undici-types: 6.21.0 + undici-types: 7.8.0 '@types/tar@6.1.13': dependencies: - '@types/node': 22.15.30 + '@types/node': 24.0.1 minipass: 4.2.8 '@types/unist@2.0.11': {} @@ -3493,7 +3493,7 @@ snapshots: '@types/yauzl@2.10.3': dependencies: - '@types/node': 22.15.30 + '@types/node': 24.0.1 optional: true '@ungap/structured-clone@1.3.0': {} @@ -3536,7 +3536,7 @@ snapshots: - debug - supports-color - astro@5.9.2(@types/node@22.15.30)(jiti@2.4.2)(lightningcss@1.30.1)(rollup@4.42.0)(typescript@5.8.3): + astro@5.9.2(@types/node@24.0.1)(jiti@2.4.2)(lightningcss@1.30.1)(rollup@4.43.0)(typescript@5.8.3): dependencies: '@astrojs/compiler': 2.12.2 '@astrojs/internal-helpers': 0.6.1 @@ -3544,7 +3544,7 @@ snapshots: '@astrojs/telemetry': 3.3.0 '@capsizecss/unpack': 2.4.0 '@oslojs/encoding': 1.1.0 - '@rollup/pluginutils': 5.1.4(rollup@4.42.0) + '@rollup/pluginutils': 5.1.4(rollup@4.43.0) acorn: 8.15.0 aria-query: 5.3.2 axobject-query: 4.1.0 @@ -3591,14 +3591,14 @@ snapshots: unist-util-visit: 5.0.0 unstorage: 1.16.0 vfile: 6.0.3 - vite: 6.3.5(@types/node@22.15.30)(jiti@2.4.2)(lightningcss@1.30.1) - vitefu: 1.0.6(vite@6.3.5(@types/node@22.15.30)(jiti@2.4.2)(lightningcss@1.30.1)) + vite: 6.3.5(@types/node@24.0.1)(jiti@2.4.2)(lightningcss@1.30.1) + vitefu: 1.0.6(vite@6.3.5(@types/node@24.0.1)(jiti@2.4.2)(lightningcss@1.30.1)) xxhash-wasm: 1.1.0 yargs-parser: 21.1.1 yocto-spinner: 0.2.3 - zod: 3.25.56 - zod-to-json-schema: 3.24.5(zod@3.25.56) - zod-to-ts: 1.2.0(typescript@5.8.3)(zod@3.25.56) + zod: 3.25.62 + zod-to-json-schema: 3.24.5(zod@3.25.62) + zod-to-ts: 1.2.0(typescript@5.8.3)(zod@3.25.62) optionalDependencies: sharp: 0.33.5 transitivePeerDependencies: @@ -3679,7 +3679,7 @@ snapshots: browserslist@4.25.0: dependencies: - caniuse-lite: 1.0.30001721 + caniuse-lite: 1.0.30001722 electron-to-chromium: 1.5.166 node-releases: 2.0.19 update-browserslist-db: 1.1.3(browserslist@4.25.0) @@ -3693,7 +3693,7 @@ snapshots: camelcase@8.0.0: {} - caniuse-lite@1.0.30001721: {} + caniuse-lite@1.0.30001722: {} ccount@2.0.1: {} @@ -4045,7 +4045,7 @@ snapshots: dependencies: pend: 1.2.0 - fdir@6.4.5(picomatch@4.0.2): + fdir@6.4.6(picomatch@4.0.2): optionalDependencies: picomatch: 4.0.2 @@ -4425,9 +4425,9 @@ snapshots: dependencies: yallist: 3.1.1 - lucide-preact@0.513.0(preact@10.26.8): + lucide-preact@0.514.0(preact@10.26.9): dependencies: - preact: 10.26.8 + preact: 10.26.9 magic-string@0.30.17: dependencies: @@ -5059,17 +5059,17 @@ snapshots: cssesc: 3.0.0 util-deprecate: 1.0.2 - postcss@8.5.4: + postcss@8.5.5: dependencies: nanoid: 3.3.11 picocolors: 1.1.1 source-map-js: 1.2.1 - preact-render-to-string@6.5.13(preact@10.26.8): + preact-render-to-string@6.5.13(preact@10.26.9): dependencies: - preact: 10.26.8 + preact: 10.26.9 - preact@10.26.8: {} + preact@10.26.9: {} prismjs@1.30.0: {} @@ -5245,30 +5245,30 @@ snapshots: retext-stringify: 4.0.0 unified: 11.0.5 - rollup@4.42.0: + rollup@4.43.0: dependencies: '@types/estree': 1.0.7 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.42.0 - '@rollup/rollup-android-arm64': 4.42.0 - '@rollup/rollup-darwin-arm64': 4.42.0 - '@rollup/rollup-darwin-x64': 4.42.0 - '@rollup/rollup-freebsd-arm64': 4.42.0 - '@rollup/rollup-freebsd-x64': 4.42.0 - '@rollup/rollup-linux-arm-gnueabihf': 4.42.0 - '@rollup/rollup-linux-arm-musleabihf': 4.42.0 - '@rollup/rollup-linux-arm64-gnu': 4.42.0 - '@rollup/rollup-linux-arm64-musl': 4.42.0 - '@rollup/rollup-linux-loongarch64-gnu': 4.42.0 - '@rollup/rollup-linux-powerpc64le-gnu': 4.42.0 - '@rollup/rollup-linux-riscv64-gnu': 4.42.0 - '@rollup/rollup-linux-riscv64-musl': 4.42.0 - '@rollup/rollup-linux-s390x-gnu': 4.42.0 - '@rollup/rollup-linux-x64-gnu': 4.42.0 - '@rollup/rollup-linux-x64-musl': 4.42.0 - '@rollup/rollup-win32-arm64-msvc': 4.42.0 - '@rollup/rollup-win32-ia32-msvc': 4.42.0 - '@rollup/rollup-win32-x64-msvc': 4.42.0 + '@rollup/rollup-android-arm-eabi': 4.43.0 + '@rollup/rollup-android-arm64': 4.43.0 + '@rollup/rollup-darwin-arm64': 4.43.0 + '@rollup/rollup-darwin-x64': 4.43.0 + '@rollup/rollup-freebsd-arm64': 4.43.0 + '@rollup/rollup-freebsd-x64': 4.43.0 + '@rollup/rollup-linux-arm-gnueabihf': 4.43.0 + '@rollup/rollup-linux-arm-musleabihf': 4.43.0 + '@rollup/rollup-linux-arm64-gnu': 4.43.0 + '@rollup/rollup-linux-arm64-musl': 4.43.0 + '@rollup/rollup-linux-loongarch64-gnu': 4.43.0 + '@rollup/rollup-linux-powerpc64le-gnu': 4.43.0 + '@rollup/rollup-linux-riscv64-gnu': 4.43.0 + '@rollup/rollup-linux-riscv64-musl': 4.43.0 + '@rollup/rollup-linux-s390x-gnu': 4.43.0 + '@rollup/rollup-linux-x64-gnu': 4.43.0 + '@rollup/rollup-linux-x64-musl': 4.43.0 + '@rollup/rollup-win32-arm64-msvc': 4.43.0 + '@rollup/rollup-win32-ia32-msvc': 4.43.0 + '@rollup/rollup-win32-x64-msvc': 4.43.0 fsevents: 2.3.3 safer-buffer@2.1.2: {} @@ -5432,7 +5432,7 @@ snapshots: csso: 5.0.5 picocolors: 1.1.1 - tailwindcss@4.1.8: {} + tailwindcss@4.1.10: {} tapable@2.2.2: {} @@ -5462,7 +5462,7 @@ snapshots: tinyglobby@0.2.14: dependencies: - fdir: 6.4.5(picomatch@4.0.2) + fdir: 6.4.6(picomatch@4.0.2) picomatch: 4.0.2 toidentifier@1.0.1: {} @@ -5489,7 +5489,7 @@ snapshots: uncrypto@0.1.3: {} - undici-types@6.21.0: {} + undici-types@7.8.0: {} undici@6.21.3: {} @@ -5598,7 +5598,7 @@ snapshots: '@types/unist': 3.0.3 vfile-message: 4.0.2 - vite-prerender-plugin@0.5.10(vite@6.3.5(@types/node@22.15.30)(jiti@2.4.2)(lightningcss@1.30.1)): + vite-prerender-plugin@0.5.10(vite@6.3.5(@types/node@24.0.1)(jiti@2.4.2)(lightningcss@1.30.1)): dependencies: kolorist: 1.8.0 magic-string: 0.30.17 @@ -5606,25 +5606,25 @@ snapshots: simple-code-frame: 1.3.0 source-map: 0.7.4 stack-trace: 1.0.0-pre2 - vite: 6.3.5(@types/node@22.15.30)(jiti@2.4.2)(lightningcss@1.30.1) + vite: 6.3.5(@types/node@24.0.1)(jiti@2.4.2)(lightningcss@1.30.1) - vite@6.3.5(@types/node@22.15.30)(jiti@2.4.2)(lightningcss@1.30.1): + vite@6.3.5(@types/node@24.0.1)(jiti@2.4.2)(lightningcss@1.30.1): dependencies: esbuild: 0.25.5 - fdir: 6.4.5(picomatch@4.0.2) + fdir: 6.4.6(picomatch@4.0.2) picomatch: 4.0.2 - postcss: 8.5.4 - rollup: 4.42.0 + postcss: 8.5.5 + rollup: 4.43.0 tinyglobby: 0.2.14 optionalDependencies: - '@types/node': 22.15.30 + '@types/node': 24.0.1 fsevents: 2.3.3 jiti: 2.4.2 lightningcss: 1.30.1 - vitefu@1.0.6(vite@6.3.5(@types/node@22.15.30)(jiti@2.4.2)(lightningcss@1.30.1)): + vitefu@1.0.6(vite@6.3.5(@types/node@24.0.1)(jiti@2.4.2)(lightningcss@1.30.1)): optionalDependencies: - vite: 6.3.5(@types/node@22.15.30)(jiti@2.4.2)(lightningcss@1.30.1) + vite: 6.3.5(@types/node@24.0.1)(jiti@2.4.2)(lightningcss@1.30.1) web-namespaces@2.0.1: {} @@ -5678,15 +5678,15 @@ snapshots: yoctocolors@2.1.1: {} - zod-to-json-schema@3.24.5(zod@3.25.56): + zod-to-json-schema@3.24.5(zod@3.25.62): dependencies: - zod: 3.25.56 + zod: 3.25.62 - zod-to-ts@1.2.0(typescript@5.8.3)(zod@3.25.56): + zod-to-ts@1.2.0(typescript@5.8.3)(zod@3.25.62): dependencies: typescript: 5.8.3 - zod: 3.25.56 + zod: 3.25.62 - zod@3.25.56: {} + zod@3.25.62: {} zwitch@2.0.4: {} diff --git a/public/files/DevEdmonton_Talk_HATEOAS.pdf b/public/files/DevEdmonton_Talk_HATEOAS.pdf new file mode 100644 index 0000000..9d07c17 Binary files /dev/null and b/public/files/DevEdmonton_Talk_HATEOAS.pdf differ diff --git a/src/components/NavigationBar.tsx b/src/components/NavigationBar.tsx index 59bccb7..08bf934 100644 --- a/src/components/NavigationBar.tsx +++ b/src/components/NavigationBar.tsx @@ -1,6 +1,13 @@ import { useComputed, useSignal } from "@preact/signals"; import { useEffect } from "preact/hooks"; -import { Home, NotebookPen, FileText, CodeXml, Terminal as TerminalIcon } from 'lucide-preact'; +import { + Home, + NotebookPen, + FileText, + CodeXml, + Terminal as TerminalIcon, + Megaphone, +} from "lucide-preact"; interface NavigationBarProps { currentPath: string; @@ -10,7 +17,7 @@ export default function NavigationBar({ currentPath }: NavigationBarProps) { const isScrolling = useSignal(false); const prevScrollPos = useSignal(0); const currentClientPath = useSignal(currentPath); - + const isVisible = useComputed(() => { if (prevScrollPos.value < 50) return true; @@ -35,28 +42,29 @@ export default function NavigationBar({ currentPath }: NavigationBarProps) { }; // Listen for astro:page-load event which fires after navigation completes - document.addEventListener('astro:page-load', handleAstroNavigation); - + document.addEventListener("astro:page-load", handleAstroNavigation); + // Also listen for astro:after-swap as a backup - document.addEventListener('astro:after-swap', handleAstroNavigation); + document.addEventListener("astro:after-swap", handleAstroNavigation); // Listen for regular navigation events as fallback - window.addEventListener('popstate', updatePath); + window.addEventListener("popstate", updatePath); return () => { - document.removeEventListener('astro:page-load', handleAstroNavigation); - document.removeEventListener('astro:after-swap', handleAstroNavigation); - window.removeEventListener('popstate', updatePath); + document.removeEventListener("astro:page-load", handleAstroNavigation); + document.removeEventListener("astro:after-swap", handleAstroNavigation); + window.removeEventListener("popstate", updatePath); }; }, []); // Use the client path const activePath = currentClientPath.value; - // Normalize path by removing trailing slashes for consistent comparison - const normalizedPath = activePath.endsWith('/') && activePath.length > 1 - ? activePath.slice(0, -1) - : activePath; + // Normalize path + const normalizedPath = + activePath.endsWith("/") && activePath.length > 1 + ? activePath.slice(0, -1) + : activePath; const isPostsPath = (path: string) => { return path.startsWith("/posts") || path.startsWith("/post/"); @@ -125,7 +133,9 @@ export default function NavigationBar({ currentPath }: NavigationBarProps) {
  • @@ -133,6 +143,17 @@ export default function NavigationBar({ currentPath }: NavigationBarProps) {
  • +
  • + +
    + +
    +
    +
  • +
  • ({}); const hasAnimated = useSignal(false); @@ -29,10 +29,10 @@ export default function SkillsSection({ title, skills }: SkillsSectionProps) { } }); }, - { threshold: 0.3 } + { threshold: 0.3 }, ); - const skillsElement = document.getElementById('skills-section'); + const skillsElement = document.getElementById("skills-section"); if (skillsElement) { observer.observe(skillsElement); } @@ -45,8 +45,7 @@ export default function SkillsSection({ title, skills }: SkillsSectionProps) { }, [skills]); const animateSkill = (skillId: string, targetLevel: number) => { - const duration = 1500; // 1.5 seconds - const steps = 60; // 60 frames for smooth animation + const steps = 60; const increment = targetLevel / steps; let currentStep = 0; @@ -55,7 +54,7 @@ export default function SkillsSection({ title, skills }: SkillsSectionProps) { const currentValue = Math.min(increment * currentStep, targetLevel); animatedLevels.value = { ...animatedLevels.value, - [skillId]: currentValue + [skillId]: currentValue, }; currentStep++; requestAnimationFrame(animate); @@ -73,18 +72,19 @@ export default function SkillsSection({ title, skills }: SkillsSectionProps) { {skills.map((skill) => { const currentLevel = animatedLevels.value[skill.id] || 0; const progressValue = currentLevel * 20; // Convert 1-5 scale to 0-100 - + return (
    - + >
    ); })} @@ -92,4 +92,4 @@ export default function SkillsSection({ title, skills }: SkillsSectionProps) { ); -} \ No newline at end of file +} diff --git a/src/components/TalkCard.astro b/src/components/TalkCard.astro new file mode 100644 index 0000000..bb08d7b --- /dev/null +++ b/src/components/TalkCard.astro @@ -0,0 +1,44 @@ +--- +import { Icon } from "astro-icon/components"; + +interface Talk { + id: string; + name: string; + description: string; + link: string; +} + +export interface Props { + talk: Talk; +} + +const { talk } = Astro.props; +--- + +
    + +
    diff --git a/src/pages/resume.astro b/src/pages/resume.astro index 098e0b2..913bb6f 100644 --- a/src/pages/resume.astro +++ b/src/pages/resume.astro @@ -1,223 +1,389 @@ --- -import { Icon } from 'astro-icon/components'; -import Layout from '../layouts/Layout.astro'; -import SkillsSection from '../components/SkillsSection.tsx'; -import '../styles/global.css'; +import { Icon } from "astro-icon/components"; +import Layout from "../layouts/Layout.astro"; +import ResumeSkills from "../components/ResumeSkills"; +import "../styles/global.css"; interface ResumeData { - basics: { - name: string; - email: string; - url?: { href: string }; - }; - sections: { - summary: { name: string; content: string }; - profiles: { name: string; items: { network: string; username: string; url: { href: string } }[] }; - skills: { name: string; items: { id: string; name: string; level: number }[] }; - experience: { name: string; items: { id: string; company: string; position: string; date: string; location: string; summary: string; url?: { href: string } }[] }; - education: { name: string; items: { id: string; institution: string; studyType: string; area: string; date: string; summary: string }[] }; - volunteer: { name: string; items: { id: string; organization: string; position: string; date: string }[] }; - }; + basics: { + name: string; + email: string; + url?: { href: string }; + }; + sections: { + summary: { name: string; content: string }; + profiles: { + name: string; + items: { + network: string; + username: string; + url: { href: string }; + }[]; + }; + skills: { + name: string; + items: { id: string; name: string; level: number }[]; + }; + experience: { + name: string; + items: { + id: string; + company: string; + position: string; + date: string; + location: string; + summary: string; + url?: { href: string }; + }[]; + }; + education: { + name: string; + items: { + id: string; + institution: string; + studyType: string; + area: string; + date: string; + summary: string; + }[]; + }; + volunteer: { + name: string; + items: { + id: string; + organization: string; + position: string; + date: string; + }[]; + }; + }; } let resumeData: ResumeData | undefined = undefined; let fetchError: string | null = null; try { - // Get the base URL for the current request - const baseUrl = Astro.url.origin; - - // Fetch the JSON file from the public directory - const response = await fetch(`${baseUrl}/files/resume.json`); - - if (!response.ok) { - throw new Error(`Failed to fetch resume: ${response.status} ${response.statusText}`); - } - - resumeData = await response.json(); - - if (resumeData && resumeData.sections && resumeData.sections.skills) { - const skillsSection = resumeData.sections.skills; - if (skillsSection.items) { - const tsSkill = skillsSection.items.find(s => s.name === "Typescrpt"); - if (tsSkill) { - tsSkill.name = "Typescript"; - } + // Get the base URL for the current request + const baseUrl = Astro.url.origin; + + // Fetch the JSON file from the public directory + const response = await fetch(`${baseUrl}/files/resume.json`); + + if (!response.ok) { + throw new Error( + `Failed to fetch resume: ${response.status} ${response.statusText}`, + ); + } + + resumeData = await response.json(); + + if (resumeData && resumeData.sections && resumeData.sections.skills) { + const resumeSkills = resumeData.sections.skills; + if (resumeSkills.items) { + const tsSkill = resumeSkills.items.find( + (s) => s.name === "Typescrpt", + ); + if (tsSkill) { + tsSkill.name = "Typescript"; + } + } } - } } catch (error) { - console.error("Error loading resume data:", error); - fetchError = "Unable to load resume data. Please make sure the resume.json file exists in /public/files/"; - resumeData = undefined; + console.error("Error loading resume data:", error); + fetchError = + "Unable to load resume data. Please make sure the resume.json file exists in /public/files/"; + resumeData = undefined; } const data = resumeData; --- -{(!data || fetchError) && ( - -
    -

    Error loading resume data.

    -

    {fetchError || "Please try refreshing the page."}

    -
    -
    -)} - -{data && !fetchError && ( - -
    -

    {data.basics.name}

    - - - - - - {data.sections.summary && ( -
    -
    -

    {data.sections.summary.name || "Summary"}

    -
    -
    -
    - )} - - {data.sections.profiles && data.sections.profiles.items && data.sections.profiles.items.length > 0 && ( -
    -
    -

    {data.sections.profiles.name || "Profiles"}

    -
    - {data.sections.profiles.items.map((profile) => { - let iconName = "mdi:web"; - const networkLower = profile.network.toLowerCase(); - if (networkLower === "github") iconName = "simple-icons:github"; - else if (networkLower === "linkedin") iconName = "simple-icons:linkedin"; - else if (networkLower === "gitea") iconName = "simple-icons:gitea"; - - return ( - - {profile.network} ({profile.username}) - - ); - })} +{ + (!data || fetchError) && ( + +
    +

    + Error loading resume data. +

    +

    {fetchError || "Please try refreshing the page."}

    -
    -
    - )} + + ) +} - {data.sections.skills && data.sections.skills.items && data.sections.skills.items.length > 0 && ( - - )} +{ + data && !fetchError && ( + +
    +

    + {data.basics.name} +

    - {data.sections.experience && data.sections.experience.items && data.sections.experience.items.length > 0 && ( -
    -
    -

    {data.sections.experience.name || "Experience"}

    -
    - {data.sections.experience.items.map((exp, index) => ( -
    - -
    - {exp.position} at {exp.company} -
    - {exp.date} - {exp.location && ( - {exp.location} - )} -
    -
    -
    -
    - {exp.url && exp.url.href && ( - {exp.url.href} +
    + {data.basics.email && ( + + {data.basics.email} + + )} + {data.sections.profiles.items.find( + (p) => p.network === "GitHub", + ) && ( + p.network === "GitHub", + )!.url.href + } + target="_blank" + rel="noopener noreferrer" + class="link link-hover inline-flex items-center gap-1 text-sm sm:text-base" + > + GitHub + + )} + {data.sections.profiles.items.find( + (p) => p.network === "linkedin", + ) && ( + p.network === "linkedin", + )!.url.href + } + target="_blank" + rel="noopener noreferrer" + class="link link-hover inline-flex items-center gap-1 text-sm sm:text-base" + > + LinkedIn + )} -
    -
      - {exp.summary.replace(/<\/?ul>|<\/?p>/g, '') - .split('
    • ') - .filter(item => item.trim() !== '') - .map(item => ( -
    • - {item.replace('
    • ', '')} - - )) - } -
    -
    -
    -
    - ))} -
    -
    -
    - )} - - {data.sections.education && data.sections.education.items && data.sections.education.items.length > 0 && ( -
    -
    -

    {data.sections.education.name || "Education"}

    -
    - {data.sections.education.items.map((edu, index) => ( -
    -

    {edu.institution}

    -

    {edu.studyType} - {edu.area} ({edu.date})

    - {edu.summary && ( -
    - )}
    - ))} -
    -
    -
    - )} - {data.sections.volunteer && data.sections.volunteer.items && data.sections.volunteer.items.length > 0 && ( -
    -
    -

    {data.sections.volunteer.name || "Volunteering"}

    -
    - {data.sections.volunteer.items.map((vol, index) => ( -
    -

    {vol.organization}

    -

    {vol.position} ({vol.date})

    -
    - ))} -
    + + + {data.sections.summary && ( +
    +
    +

    + {data.sections.summary.name || "Summary"} +

    +
    +
    +
    + )} + + {data.sections.profiles && + data.sections.profiles.items && + data.sections.profiles.items.length > 0 && ( +
    +
    +

    + {data.sections.profiles.name || "Profiles"} +

    +
    + {data.sections.profiles.items.map( + (profile) => { + let iconName = "mdi:web"; + const networkLower = + profile.network.toLowerCase(); + if (networkLower === "github") + iconName = + "simple-icons:github"; + else if ( + networkLower === "linkedin" + ) + iconName = + "simple-icons:linkedin"; + else if (networkLower === "gitea") + iconName = "simple-icons:gitea"; + + return ( + + {" "} + {profile.network} ( + {profile.username}) + + ); + }, + )} +
    +
    +
    + )} + + {data.sections.skills && + data.sections.skills.items && + data.sections.skills.items.length > 0 && ( + + )} + + {data.sections.experience && + data.sections.experience.items && + data.sections.experience.items.length > 0 && ( +
    +
    +

    + {data.sections.experience.name || + "Experience"} +

    +
    + {data.sections.experience.items.map( + (exp, index) => ( +
    + +
    + + {exp.position} at{" "} + {exp.company} + +
    + + {exp.date} + + {exp.location && ( + + { + exp.location + } + + )} +
    +
    +
    +
    + {exp.url && + exp.url.href && ( + + {exp.url.href} + + )} +
    +
      + {exp.summary + .replace( + /<\/?ul>|<\/?p>/g, + "", + ) + .split("
    • ") + .filter( + (item) => + item.trim() !== + "", + ) + .map((item) => ( +
    • + {item.replace( + "
    • ", + "", + )} + + ))} +
    +
    +
    +
    + ), + )} +
    +
    +
    + )} + + {data.sections.education && + data.sections.education.items && + data.sections.education.items.length > 0 && ( +
    +
    +

    + {data.sections.education.name || + "Education"} +

    +
    + {data.sections.education.items.map( + (edu, index) => ( +
    +

    + {edu.institution} +

    +

    + {edu.studyType} - {edu.area}{" "} + ({edu.date}) +

    + {edu.summary && ( +
    + )} +
    + ), + )} +
    +
    +
    + )} + + {data.sections.volunteer && + data.sections.volunteer.items && + data.sections.volunteer.items.length > 0 && ( +
    +
    +

    + {data.sections.volunteer.name || + "Volunteering"} +

    +
    + {data.sections.volunteer.items.map( + (vol, index) => ( +
    +

    + {vol.organization} +

    +

    + {vol.position} ({vol.date}) +

    +
    + ), + )} +
    +
    +
    + )}
    -
    - )} -
    - -)} \ No newline at end of file + + ) +} diff --git a/src/pages/talks.astro b/src/pages/talks.astro new file mode 100644 index 0000000..44c8d10 --- /dev/null +++ b/src/pages/talks.astro @@ -0,0 +1,37 @@ +--- +import Layout from "../layouts/Layout.astro"; +import TalkCard from "../components/TalkCard.astro"; + +const talks = [ + { + id: "devedmonton-hateoas", + name: "Hypermedia as the engine of application state - An Introduction", + description: + "A basic introduction to the concepts behind HATEOAS or Hypermedia as the engine of application state.", + link: "/files/DevEdmonton_Talk_HATEOAS.pdf", + }, +]; +--- + + +
    +

    + Talks +

    +
    + {talks.map((talk) => )} +
    + + { + talks.length === 0 && ( +

    + No talks available yet. Check back soon! +

    + ) + } +
    +