Optimizations + minor cleanups
All checks were successful
Docker Deploy / build-and-push (push) Successful in 4m15s

This commit is contained in:
2025-12-18 00:30:01 -07:00
parent 203f83bfcb
commit 70ee8a2c42
11 changed files with 190 additions and 227 deletions

View File

@@ -19,7 +19,7 @@
"@react-pdf/renderer": "^4.3.1", "@react-pdf/renderer": "^4.3.1",
"@tailwindcss/typography": "^0.5.19", "@tailwindcss/typography": "^0.5.19",
"@tailwindcss/vite": "^4.1.18", "@tailwindcss/vite": "^4.1.18",
"astro": "^5.16.5", "astro": "^5.16.6",
"astro-icon": "^1.1.5", "astro-icon": "^1.1.5",
"lucide-preact": "^0.561.0", "lucide-preact": "^0.561.0",
"preact": "^10.28.0", "preact": "^10.28.0",
@@ -29,8 +29,8 @@
}, },
"devDependencies": { "devDependencies": {
"@iconify-json/mdi": "^1.2.3", "@iconify-json/mdi": "^1.2.3",
"@iconify-json/simple-icons": "^1.2.62", "@iconify-json/simple-icons": "^1.2.63",
"@types/react": "^19.2.7", "@types/react": "^19.2.7",
"daisyui": "^5.5.13" "daisyui": "^5.5.14"
} }
} }

308
pnpm-lock.yaml generated
View File

@@ -10,13 +10,13 @@ importers:
dependencies: dependencies:
'@astrojs/mdx': '@astrojs/mdx':
specifier: ^4.3.13 specifier: ^4.3.13
version: 4.3.13(astro@5.16.5(@types/node@25.0.1)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.53.3)(typescript@5.8.3)) version: 4.3.13(astro@5.16.6(@types/node@25.0.3)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.53.5)(typescript@5.8.3))
'@astrojs/node': '@astrojs/node':
specifier: ^9.5.1 specifier: ^9.5.1
version: 9.5.1(astro@5.16.5(@types/node@25.0.1)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.53.3)(typescript@5.8.3)) version: 9.5.1(astro@5.16.6(@types/node@25.0.3)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.53.5)(typescript@5.8.3))
'@astrojs/preact': '@astrojs/preact':
specifier: ^4.1.3 specifier: ^4.1.3
version: 4.1.3(@babel/core@7.28.5)(@types/node@25.0.1)(jiti@2.6.1)(lightningcss@1.30.2)(preact@10.28.0) version: 4.1.3(@babel/core@7.28.5)(@types/node@25.0.3)(jiti@2.6.1)(lightningcss@1.30.2)(preact@10.28.0)
'@astrojs/rss': '@astrojs/rss':
specifier: ^4.0.14 specifier: ^4.0.14
version: 4.0.14 version: 4.0.14
@@ -34,10 +34,10 @@ importers:
version: 0.5.19(tailwindcss@4.1.18) version: 0.5.19(tailwindcss@4.1.18)
'@tailwindcss/vite': '@tailwindcss/vite':
specifier: ^4.1.18 specifier: ^4.1.18
version: 4.1.18(vite@6.4.1(@types/node@25.0.1)(jiti@2.6.1)(lightningcss@1.30.2)) version: 4.1.18(vite@6.4.1(@types/node@25.0.3)(jiti@2.6.1)(lightningcss@1.30.2))
astro: astro:
specifier: ^5.16.5 specifier: ^5.16.6
version: 5.16.5(@types/node@25.0.1)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.53.3)(typescript@5.8.3) version: 5.16.6(@types/node@25.0.3)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.53.5)(typescript@5.8.3)
astro-icon: astro-icon:
specifier: ^1.1.5 specifier: ^1.1.5
version: 1.1.5 version: 1.1.5
@@ -61,14 +61,14 @@ importers:
specifier: ^1.2.3 specifier: ^1.2.3
version: 1.2.3 version: 1.2.3
'@iconify-json/simple-icons': '@iconify-json/simple-icons':
specifier: ^1.2.62 specifier: ^1.2.63
version: 1.2.62 version: 1.2.63
'@types/react': '@types/react':
specifier: ^19.2.7 specifier: ^19.2.7
version: 19.2.7 version: 19.2.7
daisyui: daisyui:
specifier: ^5.5.13 specifier: ^5.5.14
version: 5.5.13 version: 5.5.14
packages: packages:
@@ -381,8 +381,8 @@ packages:
'@iconify-json/mdi@1.2.3': '@iconify-json/mdi@1.2.3':
resolution: {integrity: sha512-O3cLwbDOK7NNDf2ihaQOH5F9JglnulNDFV7WprU2dSoZu3h3cWH//h74uQAB87brHmvFVxIOkuBX2sZSzYhScg==} resolution: {integrity: sha512-O3cLwbDOK7NNDf2ihaQOH5F9JglnulNDFV7WprU2dSoZu3h3cWH//h74uQAB87brHmvFVxIOkuBX2sZSzYhScg==}
'@iconify-json/simple-icons@1.2.62': '@iconify-json/simple-icons@1.2.63':
resolution: {integrity: sha512-GpWQ294d4lraB3D2eBSSMROh1x9uKgpmyereLlGzVQjGZ7lbeFzby2ywXxyp4vEODmTDyf1/4WcOYs/yH4rJ5Q==} resolution: {integrity: sha512-xZl2UWCwE58VlqZ+pDPmaUhE2tq8MVSTJRr4/9nzzHlDdjJ0Ud1VxNXPrwTSgESKY29iCQw3S0r2nJTSNNngHw==}
'@iconify/tools@4.2.0': '@iconify/tools@4.2.0':
resolution: {integrity: sha512-WRxPva/ipxYkqZd1+CkEAQmd86dQmrwH0vwK89gmp2Kh2WyyVw57XbPng0NehP3x4V1LzLsXUneP1uMfTMZmUA==} resolution: {integrity: sha512-WRxPva/ipxYkqZd1+CkEAQmd86dQmrwH0vwK89gmp2Kh2WyyVw57XbPng0NehP3x4V1LzLsXUneP1uMfTMZmUA==}
@@ -643,113 +643,113 @@ packages:
rollup: rollup:
optional: true optional: true
'@rollup/rollup-android-arm-eabi@4.53.3': '@rollup/rollup-android-arm-eabi@4.53.5':
resolution: {integrity: sha512-mRSi+4cBjrRLoaal2PnqH82Wqyb+d3HsPUN/W+WslCXsZsyHa9ZeQQX/pQsZaVIWDkPcpV6jJ+3KLbTbgnwv8w==} resolution: {integrity: sha512-iDGS/h7D8t7tvZ1t6+WPK04KD0MwzLZrG0se1hzBjSi5fyxlsiggoJHwh18PCFNn7tG43OWb6pdZ6Y+rMlmyNQ==}
cpu: [arm] cpu: [arm]
os: [android] os: [android]
'@rollup/rollup-android-arm64@4.53.3': '@rollup/rollup-android-arm64@4.53.5':
resolution: {integrity: sha512-CbDGaMpdE9sh7sCmTrTUyllhrg65t6SwhjlMJsLr+J8YjFuPmCEjbBSx4Z/e4SmDyH3aB5hGaJUP2ltV/vcs4w==} resolution: {integrity: sha512-wrSAViWvZHBMMlWk6EJhvg8/rjxzyEhEdgfMMjREHEq11EtJ6IP6yfcCH57YAEca2Oe3FNCE9DSTgU70EIGmVw==}
cpu: [arm64] cpu: [arm64]
os: [android] os: [android]
'@rollup/rollup-darwin-arm64@4.53.3': '@rollup/rollup-darwin-arm64@4.53.5':
resolution: {integrity: sha512-Nr7SlQeqIBpOV6BHHGZgYBuSdanCXuw09hon14MGOLGmXAFYjx1wNvquVPmpZnl0tLjg25dEdr4IQ6GgyToCUA==} resolution: {integrity: sha512-S87zZPBmRO6u1YXQLwpveZm4JfPpAa6oHBX7/ghSiGH3rz/KDgAu1rKdGutV+WUI6tKDMbaBJomhnT30Y2t4VQ==}
cpu: [arm64] cpu: [arm64]
os: [darwin] os: [darwin]
'@rollup/rollup-darwin-x64@4.53.3': '@rollup/rollup-darwin-x64@4.53.5':
resolution: {integrity: sha512-DZ8N4CSNfl965CmPktJ8oBnfYr3F8dTTNBQkRlffnUarJ2ohudQD17sZBa097J8xhQ26AwhHJ5mvUyQW8ddTsQ==} resolution: {integrity: sha512-YTbnsAaHo6VrAczISxgpTva8EkfQus0VPEVJCEaboHtZRIb6h6j0BNxRBOwnDciFTZLDPW5r+ZBmhL/+YpTZgA==}
cpu: [x64] cpu: [x64]
os: [darwin] os: [darwin]
'@rollup/rollup-freebsd-arm64@4.53.3': '@rollup/rollup-freebsd-arm64@4.53.5':
resolution: {integrity: sha512-yMTrCrK92aGyi7GuDNtGn2sNW+Gdb4vErx4t3Gv/Tr+1zRb8ax4z8GWVRfr3Jw8zJWvpGHNpss3vVlbF58DZ4w==} resolution: {integrity: sha512-1T8eY2J8rKJWzaznV7zedfdhD1BqVs1iqILhmHDq/bqCUZsrMt+j8VCTHhP0vdfbHK3e1IQ7VYx3jlKqwlf+vw==}
cpu: [arm64] cpu: [arm64]
os: [freebsd] os: [freebsd]
'@rollup/rollup-freebsd-x64@4.53.3': '@rollup/rollup-freebsd-x64@4.53.5':
resolution: {integrity: sha512-lMfF8X7QhdQzseM6XaX0vbno2m3hlyZFhwcndRMw8fbAGUGL3WFMBdK0hbUBIUYcEcMhVLr1SIamDeuLBnXS+Q==} resolution: {integrity: sha512-sHTiuXyBJApxRn+VFMaw1U+Qsz4kcNlxQ742snICYPrY+DDL8/ZbaC4DVIB7vgZmp3jiDaKA0WpBdP0aqPJoBQ==}
cpu: [x64] cpu: [x64]
os: [freebsd] os: [freebsd]
'@rollup/rollup-linux-arm-gnueabihf@4.53.3': '@rollup/rollup-linux-arm-gnueabihf@4.53.5':
resolution: {integrity: sha512-k9oD15soC/Ln6d2Wv/JOFPzZXIAIFLp6B+i14KhxAfnq76ajt0EhYc5YPeX6W1xJkAdItcVT+JhKl1QZh44/qw==} resolution: {integrity: sha512-dV3T9MyAf0w8zPVLVBptVlzaXxka6xg1f16VAQmjg+4KMSTWDvhimI/Y6mp8oHwNrmnmVl9XxJ/w/mO4uIQONA==}
cpu: [arm] cpu: [arm]
os: [linux] os: [linux]
'@rollup/rollup-linux-arm-musleabihf@4.53.3': '@rollup/rollup-linux-arm-musleabihf@4.53.5':
resolution: {integrity: sha512-vTNlKq+N6CK/8UktsrFuc+/7NlEYVxgaEgRXVUVK258Z5ymho29skzW1sutgYjqNnquGwVUObAaxae8rZ6YMhg==} resolution: {integrity: sha512-wIGYC1x/hyjP+KAu9+ewDI+fi5XSNiUi9Bvg6KGAh2TsNMA3tSEs+Sh6jJ/r4BV/bx/CyWu2ue9kDnIdRyafcQ==}
cpu: [arm] cpu: [arm]
os: [linux] os: [linux]
'@rollup/rollup-linux-arm64-gnu@4.53.3': '@rollup/rollup-linux-arm64-gnu@4.53.5':
resolution: {integrity: sha512-RGrFLWgMhSxRs/EWJMIFM1O5Mzuz3Xy3/mnxJp/5cVhZ2XoCAxJnmNsEyeMJtpK+wu0FJFWz+QF4mjCA7AUQ3w==} resolution: {integrity: sha512-Y+qVA0D9d0y2FRNiG9oM3Hut/DgODZbU9I8pLLPwAsU0tUKZ49cyV1tzmB/qRbSzGvY8lpgGkJuMyuhH7Ma+Vg==}
cpu: [arm64] cpu: [arm64]
os: [linux] os: [linux]
'@rollup/rollup-linux-arm64-musl@4.53.3': '@rollup/rollup-linux-arm64-musl@4.53.5':
resolution: {integrity: sha512-kASyvfBEWYPEwe0Qv4nfu6pNkITLTb32p4yTgzFCocHnJLAHs+9LjUu9ONIhvfT/5lv4YS5muBHyuV84epBo/A==} resolution: {integrity: sha512-juaC4bEgJsyFVfqhtGLz8mbopaWD+WeSOYr5E16y+1of6KQjc0BpwZLuxkClqY1i8sco+MdyoXPNiCkQou09+g==}
cpu: [arm64] cpu: [arm64]
os: [linux] os: [linux]
'@rollup/rollup-linux-loong64-gnu@4.53.3': '@rollup/rollup-linux-loong64-gnu@4.53.5':
resolution: {integrity: sha512-JiuKcp2teLJwQ7vkJ95EwESWkNRFJD7TQgYmCnrPtlu50b4XvT5MOmurWNrCj3IFdyjBQ5p9vnrX4JM6I8OE7g==} resolution: {integrity: sha512-rIEC0hZ17A42iXtHX+EPJVL/CakHo+tT7W0pbzdAGuWOt2jxDFh7A/lRhsNHBcqL4T36+UiAgwO8pbmn3dE8wA==}
cpu: [loong64] cpu: [loong64]
os: [linux] os: [linux]
'@rollup/rollup-linux-ppc64-gnu@4.53.3': '@rollup/rollup-linux-ppc64-gnu@4.53.5':
resolution: {integrity: sha512-EoGSa8nd6d3T7zLuqdojxC20oBfNT8nexBbB/rkxgKj5T5vhpAQKKnD+h3UkoMuTyXkP5jTjK/ccNRmQrPNDuw==} resolution: {integrity: sha512-T7l409NhUE552RcAOcmJHj3xyZ2h7vMWzcwQI0hvn5tqHh3oSoclf9WgTl+0QqffWFG8MEVZZP1/OBglKZx52Q==}
cpu: [ppc64] cpu: [ppc64]
os: [linux] os: [linux]
'@rollup/rollup-linux-riscv64-gnu@4.53.3': '@rollup/rollup-linux-riscv64-gnu@4.53.5':
resolution: {integrity: sha512-4s+Wped2IHXHPnAEbIB0YWBv7SDohqxobiiPA1FIWZpX+w9o2i4LezzH/NkFUl8LRci/8udci6cLq+jJQlh+0g==} resolution: {integrity: sha512-7OK5/GhxbnrMcxIFoYfhV/TkknarkYC1hqUw1wU2xUN3TVRLNT5FmBv4KkheSG2xZ6IEbRAhTooTV2+R5Tk0lQ==}
cpu: [riscv64] cpu: [riscv64]
os: [linux] os: [linux]
'@rollup/rollup-linux-riscv64-musl@4.53.3': '@rollup/rollup-linux-riscv64-musl@4.53.5':
resolution: {integrity: sha512-68k2g7+0vs2u9CxDt5ktXTngsxOQkSEV/xBbwlqYcUrAVh6P9EgMZvFsnHy4SEiUl46Xf0IObWVbMvPrr2gw8A==} resolution: {integrity: sha512-GwuDBE/PsXaTa76lO5eLJTyr2k8QkPipAyOrs4V/KJufHCZBJ495VCGJol35grx9xryk4V+2zd3Ri+3v7NPh+w==}
cpu: [riscv64] cpu: [riscv64]
os: [linux] os: [linux]
'@rollup/rollup-linux-s390x-gnu@4.53.3': '@rollup/rollup-linux-s390x-gnu@4.53.5':
resolution: {integrity: sha512-VYsFMpULAz87ZW6BVYw3I6sWesGpsP9OPcyKe8ofdg9LHxSbRMd7zrVrr5xi/3kMZtpWL/wC+UIJWJYVX5uTKg==} resolution: {integrity: sha512-IAE1Ziyr1qNfnmiQLHBURAD+eh/zH1pIeJjeShleII7Vj8kyEm2PF77o+lf3WTHDpNJcu4IXJxNO0Zluro8bOw==}
cpu: [s390x] cpu: [s390x]
os: [linux] os: [linux]
'@rollup/rollup-linux-x64-gnu@4.53.3': '@rollup/rollup-linux-x64-gnu@4.53.5':
resolution: {integrity: sha512-3EhFi1FU6YL8HTUJZ51imGJWEX//ajQPfqWLI3BQq4TlvHy4X0MOr5q3D2Zof/ka0d5FNdPwZXm3Yyib/UEd+w==} resolution: {integrity: sha512-Pg6E+oP7GvZ4XwgRJBuSXZjcqpIW3yCBhK4BcsANvb47qMvAbCjR6E+1a/U2WXz1JJxp9/4Dno3/iSJLcm5auw==}
cpu: [x64] cpu: [x64]
os: [linux] os: [linux]
'@rollup/rollup-linux-x64-musl@4.53.3': '@rollup/rollup-linux-x64-musl@4.53.5':
resolution: {integrity: sha512-eoROhjcc6HbZCJr+tvVT8X4fW3/5g/WkGvvmwz/88sDtSJzO7r/blvoBDgISDiCjDRZmHpwud7h+6Q9JxFwq1Q==} resolution: {integrity: sha512-txGtluxDKTxaMDzUduGP0wdfng24y1rygUMnmlUJ88fzCCULCLn7oE5kb2+tRB+MWq1QDZT6ObT5RrR8HFRKqg==}
cpu: [x64] cpu: [x64]
os: [linux] os: [linux]
'@rollup/rollup-openharmony-arm64@4.53.3': '@rollup/rollup-openharmony-arm64@4.53.5':
resolution: {integrity: sha512-OueLAWgrNSPGAdUdIjSWXw+u/02BRTcnfw9PN41D2vq/JSEPnJnVuBgw18VkN8wcd4fjUs+jFHVM4t9+kBSNLw==} resolution: {integrity: sha512-3DFiLPnTxiOQV993fMc+KO8zXHTcIjgaInrqlG8zDp1TlhYl6WgrOHuJkJQ6M8zHEcntSJsUp1XFZSY8C1DYbg==}
cpu: [arm64] cpu: [arm64]
os: [openharmony] os: [openharmony]
'@rollup/rollup-win32-arm64-msvc@4.53.3': '@rollup/rollup-win32-arm64-msvc@4.53.5':
resolution: {integrity: sha512-GOFuKpsxR/whszbF/bzydebLiXIHSgsEUp6M0JI8dWvi+fFa1TD6YQa4aSZHtpmh2/uAlj/Dy+nmby3TJ3pkTw==} resolution: {integrity: sha512-nggc/wPpNTgjGg75hu+Q/3i32R00Lq1B6N1DO7MCU340MRKL3WZJMjA9U4K4gzy3dkZPXm9E1Nc81FItBVGRlA==}
cpu: [arm64] cpu: [arm64]
os: [win32] os: [win32]
'@rollup/rollup-win32-ia32-msvc@4.53.3': '@rollup/rollup-win32-ia32-msvc@4.53.5':
resolution: {integrity: sha512-iah+THLcBJdpfZ1TstDFbKNznlzoxa8fmnFYK4V67HvmuNYkVdAywJSoteUszvBQ9/HqN2+9AZghbajMsFT+oA==} resolution: {integrity: sha512-U/54pTbdQpPLBdEzCT6NBCFAfSZMvmjr0twhnD9f4EIvlm9wy3jjQ38yQj1AGznrNO65EWQMgm/QUjuIVrYF9w==}
cpu: [ia32] cpu: [ia32]
os: [win32] os: [win32]
'@rollup/rollup-win32-x64-gnu@4.53.3': '@rollup/rollup-win32-x64-gnu@4.53.5':
resolution: {integrity: sha512-J9QDiOIZlZLdcot5NXEepDkstocktoVjkaKUtqzgzpt2yWjGlbYiKyp05rWwk4nypbYUNoFAztEgixoLaSETkg==} resolution: {integrity: sha512-2NqKgZSuLH9SXBBV2dWNRCZmocgSOx8OJSdpRaEcRlIfX8YrKxUT6z0F1NpvDVhOsl190UFTRh2F2WDWWCYp3A==}
cpu: [x64] cpu: [x64]
os: [win32] os: [win32]
'@rollup/rollup-win32-x64-msvc@4.53.3': '@rollup/rollup-win32-x64-msvc@4.53.5':
resolution: {integrity: sha512-UhTd8u31dXadv0MopwGgNOBpUVROFKWVQgAg5N1ESyCz8AuBcMqm4AuTjrwgQKGDfoFuz02EuMRHQIw/frmYKQ==} resolution: {integrity: sha512-JRpZUhCfhZ4keB5v0fe02gQJy05GqboPOaxvjugW04RLSYYoB/9t2lx2u/tMs/Na/1NXfY8QYjgRljRpN+MjTQ==}
cpu: [x64] cpu: [x64]
os: [win32] os: [win32]
@@ -903,8 +903,8 @@ packages:
'@types/nlcst@2.0.3': '@types/nlcst@2.0.3':
resolution: {integrity: sha512-vSYNSDe6Ix3q+6Z7ri9lyWqgGhJTmzRjZRqyq15N0Z/1/UnVsno9G/N40NBijoYx2seFDIl0+B2mgAb9mezUCA==} resolution: {integrity: sha512-vSYNSDe6Ix3q+6Z7ri9lyWqgGhJTmzRjZRqyq15N0Z/1/UnVsno9G/N40NBijoYx2seFDIl0+B2mgAb9mezUCA==}
'@types/node@25.0.1': '@types/node@25.0.3':
resolution: {integrity: sha512-czWPzKIAXucn9PtsttxmumiQ9N0ok9FrBwgRWrwmVLlp86BrMExzvXRLFYRJ+Ex3g6yqj+KuaxfX1JTgV2lpfg==} resolution: {integrity: sha512-W609buLVRVmeW693xKfzHeIV6nJGGz98uCPfeXI1ELMLXVeKYZ9m15fAMSaUPBHYLGFsVRcMmSCksQOrZV9BYA==}
'@types/react@19.2.7': '@types/react@19.2.7':
resolution: {integrity: sha512-MWtvHrGZLFttgeEj28VXHxpmwYbor/ATPYbBfSFZEIRK0ecCFLl2Qo55z52Hss+UV9CRN7trSeq1zbgx7YDWWg==} resolution: {integrity: sha512-MWtvHrGZLFttgeEj28VXHxpmwYbor/ATPYbBfSFZEIRK0ecCFLl2Qo55z52Hss+UV9CRN7trSeq1zbgx7YDWWg==}
@@ -970,8 +970,8 @@ packages:
astro-icon@1.1.5: astro-icon@1.1.5:
resolution: {integrity: sha512-CJYS5nWOw9jz4RpGWmzNQY7D0y2ZZacH7atL2K9DeJXJVaz7/5WrxeyIxO8KASk1jCM96Q4LjRx/F3R+InjJrw==} resolution: {integrity: sha512-CJYS5nWOw9jz4RpGWmzNQY7D0y2ZZacH7atL2K9DeJXJVaz7/5WrxeyIxO8KASk1jCM96Q4LjRx/F3R+InjJrw==}
astro@5.16.5: astro@5.16.6:
resolution: {integrity: sha512-QeuM4xzTR0QuXFDNlGVW0BW7rcquKFIkylaPeM4ufii0/RRiPTYtwxDYVZ3KfiMRuuc+nbLD0214kMKTvz/yvQ==} resolution: {integrity: sha512-6mF/YrvwwRxLTu+aMEa5pwzKUNl5ZetWbTyZCs9Um0F12HUmxUiF5UHiZPy4rifzU3gtpM3xP2DfdmkNX9eZRg==}
engines: {node: 18.20.8 || ^20.3.0 || >=22.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0'} engines: {node: 18.20.8 || ^20.3.0 || >=22.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0'}
hasBin: true hasBin: true
@@ -997,8 +997,8 @@ packages:
base64-js@1.5.1: base64-js@1.5.1:
resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==}
baseline-browser-mapping@2.9.7: baseline-browser-mapping@2.9.9:
resolution: {integrity: sha512-k9xFKplee6KIio3IDbwj+uaCLpqzOwakOgmqzPezM0sFJlFKcg30vk2wOiAJtkTSfx0SSQDSe8q+mWA/fSH5Zg==} resolution: {integrity: sha512-V8fbOCSeOFvlDj7LLChUcqbZrdKD9RU/VR260piF1790vT0mfLSwGc/Qzxv3IqiTukOpNtItePa0HBpMAj7MDg==}
hasBin: true hasBin: true
bidi-js@1.0.3: bidi-js@1.0.3:
@@ -1158,8 +1158,8 @@ packages:
csstype@3.2.3: csstype@3.2.3:
resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==} resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==}
daisyui@5.5.13: daisyui@5.5.14:
resolution: {integrity: sha512-Y1tHPzxU3a/MsArjQ5Bw4DaOnC1IsT9O+M9Wz2NwCw08vuCGhM+xx3ScWfL6IS4YiJXZHh73qNK9GhBWMRKY6Q==} resolution: {integrity: sha512-L47rvw7I7hK68TA97VB8Ee0woHew+/ohR6Lx6Ah/krfISOqcG4My7poNpX5Mo5/ytMxiR40fEaz6njzDi7cuSg==}
debug@4.4.3: debug@4.4.3:
resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==}
@@ -2111,8 +2111,8 @@ packages:
retext@9.0.0: retext@9.0.0:
resolution: {integrity: sha512-sbMDcpHCNjvlheSgMfEcVrZko3cDzdbe1x/e7G66dFp0Ff7Mldvi2uv6JkJQzdRcvLYE8CA8Oe8siQx8ZOgTcA==} resolution: {integrity: sha512-sbMDcpHCNjvlheSgMfEcVrZko3cDzdbe1x/e7G66dFp0Ff7Mldvi2uv6JkJQzdRcvLYE8CA8Oe8siQx8ZOgTcA==}
rollup@4.53.3: rollup@4.53.5:
resolution: {integrity: sha512-w8GmOxZfBmKknvdXU1sdM9NHcoQejwF/4mNgj2JuEEdRaHwwF12K7e9eXn1nLZ07ad+du76mkVsyeb2rKGllsA==} resolution: {integrity: sha512-iTNAbFSlRpcHeeWu73ywU/8KuU/LZmNCSxp6fjQkJBD3ivUb8tpDrXhIxEzA05HlYMEwmtaUnb3RP+YNv162OQ==}
engines: {node: '>=18.0.0', npm: '>=8.0.0'} engines: {node: '>=18.0.0', npm: '>=8.0.0'}
hasBin: true hasBin: true
@@ -2137,8 +2137,8 @@ packages:
engines: {node: '>=10'} engines: {node: '>=10'}
hasBin: true hasBin: true
send@1.2.0: send@1.2.1:
resolution: {integrity: sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==} resolution: {integrity: sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ==}
engines: {node: '>= 18'} engines: {node: '>= 18'}
server-destroy@1.0.1: server-destroy@1.0.1:
@@ -2404,8 +2404,8 @@ packages:
uploadthing: uploadthing:
optional: true optional: true
update-browserslist-db@1.2.2: update-browserslist-db@1.2.3:
resolution: {integrity: sha512-E85pfNzMQ9jpKkA7+TJAi4TJN+tBCuWh5rUcS/sv6cFi+1q9LYDwDI5dpUL0u/73EElyQ8d3TEaeW4sPedBqYA==} resolution: {integrity: sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==}
hasBin: true hasBin: true
peerDependencies: peerDependencies:
browserslist: '>= 4.21.0' browserslist: '>= 4.21.0'
@@ -2593,12 +2593,12 @@ snapshots:
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
'@astrojs/mdx@4.3.13(astro@5.16.5(@types/node@25.0.1)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.53.3)(typescript@5.8.3))': '@astrojs/mdx@4.3.13(astro@5.16.6(@types/node@25.0.3)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.53.5)(typescript@5.8.3))':
dependencies: dependencies:
'@astrojs/markdown-remark': 6.3.10 '@astrojs/markdown-remark': 6.3.10
'@mdx-js/mdx': 3.1.1 '@mdx-js/mdx': 3.1.1
acorn: 8.15.0 acorn: 8.15.0
astro: 5.16.5(@types/node@25.0.1)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.53.3)(typescript@5.8.3) astro: 5.16.6(@types/node@25.0.3)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.53.5)(typescript@5.8.3)
es-module-lexer: 1.7.0 es-module-lexer: 1.7.0
estree-util-visit: 2.0.0 estree-util-visit: 2.0.0
hast-util-to-html: 9.0.5 hast-util-to-html: 9.0.5
@@ -2612,22 +2612,22 @@ snapshots:
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
'@astrojs/node@9.5.1(astro@5.16.5(@types/node@25.0.1)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.53.3)(typescript@5.8.3))': '@astrojs/node@9.5.1(astro@5.16.6(@types/node@25.0.3)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.53.5)(typescript@5.8.3))':
dependencies: dependencies:
'@astrojs/internal-helpers': 0.7.5 '@astrojs/internal-helpers': 0.7.5
astro: 5.16.5(@types/node@25.0.1)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.53.3)(typescript@5.8.3) astro: 5.16.6(@types/node@25.0.3)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.53.5)(typescript@5.8.3)
send: 1.2.0 send: 1.2.1
server-destroy: 1.0.1 server-destroy: 1.0.1
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
'@astrojs/preact@4.1.3(@babel/core@7.28.5)(@types/node@25.0.1)(jiti@2.6.1)(lightningcss@1.30.2)(preact@10.28.0)': '@astrojs/preact@4.1.3(@babel/core@7.28.5)(@types/node@25.0.3)(jiti@2.6.1)(lightningcss@1.30.2)(preact@10.28.0)':
dependencies: dependencies:
'@preact/preset-vite': 2.10.2(@babel/core@7.28.5)(preact@10.28.0)(vite@6.4.1(@types/node@25.0.1)(jiti@2.6.1)(lightningcss@1.30.2)) '@preact/preset-vite': 2.10.2(@babel/core@7.28.5)(preact@10.28.0)(vite@6.4.1(@types/node@25.0.3)(jiti@2.6.1)(lightningcss@1.30.2))
'@preact/signals': 2.5.1(preact@10.28.0) '@preact/signals': 2.5.1(preact@10.28.0)
preact: 10.28.0 preact: 10.28.0
preact-render-to-string: 6.6.4(preact@10.28.0) preact-render-to-string: 6.6.4(preact@10.28.0)
vite: 6.4.1(@types/node@25.0.1)(jiti@2.6.1)(lightningcss@1.30.2) vite: 6.4.1(@types/node@25.0.3)(jiti@2.6.1)(lightningcss@1.30.2)
transitivePeerDependencies: transitivePeerDependencies:
- '@babel/core' - '@babel/core'
- '@types/node' - '@types/node'
@@ -2888,7 +2888,7 @@ snapshots:
dependencies: dependencies:
'@iconify/types': 2.0.0 '@iconify/types': 2.0.0
'@iconify-json/simple-icons@1.2.62': '@iconify-json/simple-icons@1.2.63':
dependencies: dependencies:
'@iconify/types': 2.0.0 '@iconify/types': 2.0.0
@@ -3072,18 +3072,18 @@ snapshots:
'@oslojs/encoding@1.1.0': {} '@oslojs/encoding@1.1.0': {}
'@preact/preset-vite@2.10.2(@babel/core@7.28.5)(preact@10.28.0)(vite@6.4.1(@types/node@25.0.1)(jiti@2.6.1)(lightningcss@1.30.2))': '@preact/preset-vite@2.10.2(@babel/core@7.28.5)(preact@10.28.0)(vite@6.4.1(@types/node@25.0.3)(jiti@2.6.1)(lightningcss@1.30.2))':
dependencies: dependencies:
'@babel/core': 7.28.5 '@babel/core': 7.28.5
'@babel/plugin-transform-react-jsx': 7.27.1(@babel/core@7.28.5) '@babel/plugin-transform-react-jsx': 7.27.1(@babel/core@7.28.5)
'@babel/plugin-transform-react-jsx-development': 7.27.1(@babel/core@7.28.5) '@babel/plugin-transform-react-jsx-development': 7.27.1(@babel/core@7.28.5)
'@prefresh/vite': 2.4.11(preact@10.28.0)(vite@6.4.1(@types/node@25.0.1)(jiti@2.6.1)(lightningcss@1.30.2)) '@prefresh/vite': 2.4.11(preact@10.28.0)(vite@6.4.1(@types/node@25.0.3)(jiti@2.6.1)(lightningcss@1.30.2))
'@rollup/pluginutils': 4.2.1 '@rollup/pluginutils': 4.2.1
babel-plugin-transform-hook-names: 1.0.2(@babel/core@7.28.5) babel-plugin-transform-hook-names: 1.0.2(@babel/core@7.28.5)
debug: 4.4.3 debug: 4.4.3
picocolors: 1.1.1 picocolors: 1.1.1
vite: 6.4.1(@types/node@25.0.1)(jiti@2.6.1)(lightningcss@1.30.2) vite: 6.4.1(@types/node@25.0.3)(jiti@2.6.1)(lightningcss@1.30.2)
vite-prerender-plugin: 0.5.12(vite@6.4.1(@types/node@25.0.1)(jiti@2.6.1)(lightningcss@1.30.2)) vite-prerender-plugin: 0.5.12(vite@6.4.1(@types/node@25.0.3)(jiti@2.6.1)(lightningcss@1.30.2))
transitivePeerDependencies: transitivePeerDependencies:
- preact - preact
- supports-color - supports-color
@@ -3103,7 +3103,7 @@ snapshots:
'@prefresh/utils@1.2.1': {} '@prefresh/utils@1.2.1': {}
'@prefresh/vite@2.4.11(preact@10.28.0)(vite@6.4.1(@types/node@25.0.1)(jiti@2.6.1)(lightningcss@1.30.2))': '@prefresh/vite@2.4.11(preact@10.28.0)(vite@6.4.1(@types/node@25.0.3)(jiti@2.6.1)(lightningcss@1.30.2))':
dependencies: dependencies:
'@babel/core': 7.28.5 '@babel/core': 7.28.5
'@prefresh/babel-plugin': 0.5.2 '@prefresh/babel-plugin': 0.5.2
@@ -3111,7 +3111,7 @@ snapshots:
'@prefresh/utils': 1.2.1 '@prefresh/utils': 1.2.1
'@rollup/pluginutils': 4.2.1 '@rollup/pluginutils': 4.2.1
preact: 10.28.0 preact: 10.28.0
vite: 6.4.1(@types/node@25.0.1)(jiti@2.6.1)(lightningcss@1.30.2) vite: 6.4.1(@types/node@25.0.3)(jiti@2.6.1)(lightningcss@1.30.2)
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
@@ -3221,78 +3221,78 @@ snapshots:
estree-walker: 2.0.2 estree-walker: 2.0.2
picomatch: 2.3.1 picomatch: 2.3.1
'@rollup/pluginutils@5.3.0(rollup@4.53.3)': '@rollup/pluginutils@5.3.0(rollup@4.53.5)':
dependencies: dependencies:
'@types/estree': 1.0.8 '@types/estree': 1.0.8
estree-walker: 2.0.2 estree-walker: 2.0.2
picomatch: 4.0.3 picomatch: 4.0.3
optionalDependencies: optionalDependencies:
rollup: 4.53.3 rollup: 4.53.5
'@rollup/rollup-android-arm-eabi@4.53.3': '@rollup/rollup-android-arm-eabi@4.53.5':
optional: true optional: true
'@rollup/rollup-android-arm64@4.53.3': '@rollup/rollup-android-arm64@4.53.5':
optional: true optional: true
'@rollup/rollup-darwin-arm64@4.53.3': '@rollup/rollup-darwin-arm64@4.53.5':
optional: true optional: true
'@rollup/rollup-darwin-x64@4.53.3': '@rollup/rollup-darwin-x64@4.53.5':
optional: true optional: true
'@rollup/rollup-freebsd-arm64@4.53.3': '@rollup/rollup-freebsd-arm64@4.53.5':
optional: true optional: true
'@rollup/rollup-freebsd-x64@4.53.3': '@rollup/rollup-freebsd-x64@4.53.5':
optional: true optional: true
'@rollup/rollup-linux-arm-gnueabihf@4.53.3': '@rollup/rollup-linux-arm-gnueabihf@4.53.5':
optional: true optional: true
'@rollup/rollup-linux-arm-musleabihf@4.53.3': '@rollup/rollup-linux-arm-musleabihf@4.53.5':
optional: true optional: true
'@rollup/rollup-linux-arm64-gnu@4.53.3': '@rollup/rollup-linux-arm64-gnu@4.53.5':
optional: true optional: true
'@rollup/rollup-linux-arm64-musl@4.53.3': '@rollup/rollup-linux-arm64-musl@4.53.5':
optional: true optional: true
'@rollup/rollup-linux-loong64-gnu@4.53.3': '@rollup/rollup-linux-loong64-gnu@4.53.5':
optional: true optional: true
'@rollup/rollup-linux-ppc64-gnu@4.53.3': '@rollup/rollup-linux-ppc64-gnu@4.53.5':
optional: true optional: true
'@rollup/rollup-linux-riscv64-gnu@4.53.3': '@rollup/rollup-linux-riscv64-gnu@4.53.5':
optional: true optional: true
'@rollup/rollup-linux-riscv64-musl@4.53.3': '@rollup/rollup-linux-riscv64-musl@4.53.5':
optional: true optional: true
'@rollup/rollup-linux-s390x-gnu@4.53.3': '@rollup/rollup-linux-s390x-gnu@4.53.5':
optional: true optional: true
'@rollup/rollup-linux-x64-gnu@4.53.3': '@rollup/rollup-linux-x64-gnu@4.53.5':
optional: true optional: true
'@rollup/rollup-linux-x64-musl@4.53.3': '@rollup/rollup-linux-x64-musl@4.53.5':
optional: true optional: true
'@rollup/rollup-openharmony-arm64@4.53.3': '@rollup/rollup-openharmony-arm64@4.53.5':
optional: true optional: true
'@rollup/rollup-win32-arm64-msvc@4.53.3': '@rollup/rollup-win32-arm64-msvc@4.53.5':
optional: true optional: true
'@rollup/rollup-win32-ia32-msvc@4.53.3': '@rollup/rollup-win32-ia32-msvc@4.53.5':
optional: true optional: true
'@rollup/rollup-win32-x64-gnu@4.53.3': '@rollup/rollup-win32-x64-gnu@4.53.5':
optional: true optional: true
'@rollup/rollup-win32-x64-msvc@4.53.3': '@rollup/rollup-win32-x64-msvc@4.53.5':
optional: true optional: true
'@shikijs/core@3.20.0': '@shikijs/core@3.20.0':
@@ -3398,12 +3398,12 @@ snapshots:
postcss-selector-parser: 6.0.10 postcss-selector-parser: 6.0.10
tailwindcss: 4.1.18 tailwindcss: 4.1.18
'@tailwindcss/vite@4.1.18(vite@6.4.1(@types/node@25.0.1)(jiti@2.6.1)(lightningcss@1.30.2))': '@tailwindcss/vite@4.1.18(vite@6.4.1(@types/node@25.0.3)(jiti@2.6.1)(lightningcss@1.30.2))':
dependencies: dependencies:
'@tailwindcss/node': 4.1.18 '@tailwindcss/node': 4.1.18
'@tailwindcss/oxide': 4.1.18 '@tailwindcss/oxide': 4.1.18
tailwindcss: 4.1.18 tailwindcss: 4.1.18
vite: 6.4.1(@types/node@25.0.1)(jiti@2.6.1)(lightningcss@1.30.2) vite: 6.4.1(@types/node@25.0.3)(jiti@2.6.1)(lightningcss@1.30.2)
'@trysound/sax@0.2.0': {} '@trysound/sax@0.2.0': {}
@@ -3419,7 +3419,7 @@ snapshots:
'@types/fontkit@2.0.8': '@types/fontkit@2.0.8':
dependencies: dependencies:
'@types/node': 25.0.1 '@types/node': 25.0.3
'@types/hast@3.0.4': '@types/hast@3.0.4':
dependencies: dependencies:
@@ -3437,7 +3437,7 @@ snapshots:
dependencies: dependencies:
'@types/unist': 3.0.3 '@types/unist': 3.0.3
'@types/node@25.0.1': '@types/node@25.0.3':
dependencies: dependencies:
undici-types: 7.16.0 undici-types: 7.16.0
@@ -3451,7 +3451,7 @@ snapshots:
'@types/yauzl@2.10.3': '@types/yauzl@2.10.3':
dependencies: dependencies:
'@types/node': 25.0.1 '@types/node': 25.0.3
optional: true optional: true
'@ungap/structured-clone@1.3.0': {} '@ungap/structured-clone@1.3.0': {}
@@ -3495,7 +3495,7 @@ snapshots:
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
astro@5.16.5(@types/node@25.0.1)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.53.3)(typescript@5.8.3): astro@5.16.6(@types/node@25.0.3)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.53.5)(typescript@5.8.3):
dependencies: dependencies:
'@astrojs/compiler': 2.13.0 '@astrojs/compiler': 2.13.0
'@astrojs/internal-helpers': 0.7.5 '@astrojs/internal-helpers': 0.7.5
@@ -3503,7 +3503,7 @@ snapshots:
'@astrojs/telemetry': 3.3.0 '@astrojs/telemetry': 3.3.0
'@capsizecss/unpack': 3.0.1 '@capsizecss/unpack': 3.0.1
'@oslojs/encoding': 1.1.0 '@oslojs/encoding': 1.1.0
'@rollup/pluginutils': 5.3.0(rollup@4.53.3) '@rollup/pluginutils': 5.3.0(rollup@4.53.5)
acorn: 8.15.0 acorn: 8.15.0
aria-query: 5.3.2 aria-query: 5.3.2
axobject-query: 4.1.0 axobject-query: 4.1.0
@@ -3552,8 +3552,8 @@ snapshots:
unist-util-visit: 5.0.0 unist-util-visit: 5.0.0
unstorage: 1.17.3 unstorage: 1.17.3
vfile: 6.0.3 vfile: 6.0.3
vite: 6.4.1(@types/node@25.0.1)(jiti@2.6.1)(lightningcss@1.30.2) vite: 6.4.1(@types/node@25.0.3)(jiti@2.6.1)(lightningcss@1.30.2)
vitefu: 1.1.1(vite@6.4.1(@types/node@25.0.1)(jiti@2.6.1)(lightningcss@1.30.2)) vitefu: 1.1.1(vite@6.4.1(@types/node@25.0.3)(jiti@2.6.1)(lightningcss@1.30.2))
xxhash-wasm: 1.1.0 xxhash-wasm: 1.1.0
yargs-parser: 21.1.1 yargs-parser: 21.1.1
yocto-spinner: 0.2.3 yocto-spinner: 0.2.3
@@ -3611,7 +3611,7 @@ snapshots:
base64-js@1.5.1: {} base64-js@1.5.1: {}
baseline-browser-mapping@2.9.7: {} baseline-browser-mapping@2.9.9: {}
bidi-js@1.0.3: bidi-js@1.0.3:
dependencies: dependencies:
@@ -3640,11 +3640,11 @@ snapshots:
browserslist@4.28.1: browserslist@4.28.1:
dependencies: dependencies:
baseline-browser-mapping: 2.9.7 baseline-browser-mapping: 2.9.9
caniuse-lite: 1.0.30001760 caniuse-lite: 1.0.30001760
electron-to-chromium: 1.5.267 electron-to-chromium: 1.5.267
node-releases: 2.0.27 node-releases: 2.0.27
update-browserslist-db: 1.2.2(browserslist@4.28.1) update-browserslist-db: 1.2.3(browserslist@4.28.1)
buffer-crc32@0.2.13: {} buffer-crc32@0.2.13: {}
@@ -3767,7 +3767,7 @@ snapshots:
csstype@3.2.3: {} csstype@3.2.3: {}
daisyui@5.5.13: {} daisyui@5.5.14: {}
debug@4.4.3: debug@4.4.3:
dependencies: dependencies:
@@ -5131,32 +5131,32 @@ snapshots:
retext-stringify: 4.0.0 retext-stringify: 4.0.0
unified: 11.0.5 unified: 11.0.5
rollup@4.53.3: rollup@4.53.5:
dependencies: dependencies:
'@types/estree': 1.0.8 '@types/estree': 1.0.8
optionalDependencies: optionalDependencies:
'@rollup/rollup-android-arm-eabi': 4.53.3 '@rollup/rollup-android-arm-eabi': 4.53.5
'@rollup/rollup-android-arm64': 4.53.3 '@rollup/rollup-android-arm64': 4.53.5
'@rollup/rollup-darwin-arm64': 4.53.3 '@rollup/rollup-darwin-arm64': 4.53.5
'@rollup/rollup-darwin-x64': 4.53.3 '@rollup/rollup-darwin-x64': 4.53.5
'@rollup/rollup-freebsd-arm64': 4.53.3 '@rollup/rollup-freebsd-arm64': 4.53.5
'@rollup/rollup-freebsd-x64': 4.53.3 '@rollup/rollup-freebsd-x64': 4.53.5
'@rollup/rollup-linux-arm-gnueabihf': 4.53.3 '@rollup/rollup-linux-arm-gnueabihf': 4.53.5
'@rollup/rollup-linux-arm-musleabihf': 4.53.3 '@rollup/rollup-linux-arm-musleabihf': 4.53.5
'@rollup/rollup-linux-arm64-gnu': 4.53.3 '@rollup/rollup-linux-arm64-gnu': 4.53.5
'@rollup/rollup-linux-arm64-musl': 4.53.3 '@rollup/rollup-linux-arm64-musl': 4.53.5
'@rollup/rollup-linux-loong64-gnu': 4.53.3 '@rollup/rollup-linux-loong64-gnu': 4.53.5
'@rollup/rollup-linux-ppc64-gnu': 4.53.3 '@rollup/rollup-linux-ppc64-gnu': 4.53.5
'@rollup/rollup-linux-riscv64-gnu': 4.53.3 '@rollup/rollup-linux-riscv64-gnu': 4.53.5
'@rollup/rollup-linux-riscv64-musl': 4.53.3 '@rollup/rollup-linux-riscv64-musl': 4.53.5
'@rollup/rollup-linux-s390x-gnu': 4.53.3 '@rollup/rollup-linux-s390x-gnu': 4.53.5
'@rollup/rollup-linux-x64-gnu': 4.53.3 '@rollup/rollup-linux-x64-gnu': 4.53.5
'@rollup/rollup-linux-x64-musl': 4.53.3 '@rollup/rollup-linux-x64-musl': 4.53.5
'@rollup/rollup-openharmony-arm64': 4.53.3 '@rollup/rollup-openharmony-arm64': 4.53.5
'@rollup/rollup-win32-arm64-msvc': 4.53.3 '@rollup/rollup-win32-arm64-msvc': 4.53.5
'@rollup/rollup-win32-ia32-msvc': 4.53.3 '@rollup/rollup-win32-ia32-msvc': 4.53.5
'@rollup/rollup-win32-x64-gnu': 4.53.3 '@rollup/rollup-win32-x64-gnu': 4.53.5
'@rollup/rollup-win32-x64-msvc': 4.53.3 '@rollup/rollup-win32-x64-msvc': 4.53.5
fsevents: 2.3.3 fsevents: 2.3.3
safe-buffer@5.2.1: {} safe-buffer@5.2.1: {}
@@ -5171,7 +5171,7 @@ snapshots:
semver@7.7.3: {} semver@7.7.3: {}
send@1.2.0: send@1.2.1:
dependencies: dependencies:
debug: 4.4.3 debug: 4.4.3
encodeurl: 2.0.0 encodeurl: 2.0.0
@@ -5446,7 +5446,7 @@ snapshots:
ofetch: 1.5.1 ofetch: 1.5.1
ufo: 1.6.1 ufo: 1.6.1
update-browserslist-db@1.2.2(browserslist@4.28.1): update-browserslist-db@1.2.3(browserslist@4.28.1):
dependencies: dependencies:
browserslist: 4.28.1 browserslist: 4.28.1
escalade: 3.2.0 escalade: 3.2.0
@@ -5475,7 +5475,7 @@ snapshots:
string_decoder: 1.3.0 string_decoder: 1.3.0
util-deprecate: 1.0.2 util-deprecate: 1.0.2
vite-prerender-plugin@0.5.12(vite@6.4.1(@types/node@25.0.1)(jiti@2.6.1)(lightningcss@1.30.2)): vite-prerender-plugin@0.5.12(vite@6.4.1(@types/node@25.0.3)(jiti@2.6.1)(lightningcss@1.30.2)):
dependencies: dependencies:
kolorist: 1.8.0 kolorist: 1.8.0
magic-string: 0.30.21 magic-string: 0.30.21
@@ -5483,25 +5483,25 @@ snapshots:
simple-code-frame: 1.3.0 simple-code-frame: 1.3.0
source-map: 0.7.6 source-map: 0.7.6
stack-trace: 1.0.0-pre2 stack-trace: 1.0.0-pre2
vite: 6.4.1(@types/node@25.0.1)(jiti@2.6.1)(lightningcss@1.30.2) vite: 6.4.1(@types/node@25.0.3)(jiti@2.6.1)(lightningcss@1.30.2)
vite@6.4.1(@types/node@25.0.1)(jiti@2.6.1)(lightningcss@1.30.2): vite@6.4.1(@types/node@25.0.3)(jiti@2.6.1)(lightningcss@1.30.2):
dependencies: dependencies:
esbuild: 0.25.12 esbuild: 0.25.12
fdir: 6.5.0(picomatch@4.0.3) fdir: 6.5.0(picomatch@4.0.3)
picomatch: 4.0.3 picomatch: 4.0.3
postcss: 8.5.6 postcss: 8.5.6
rollup: 4.53.3 rollup: 4.53.5
tinyglobby: 0.2.15 tinyglobby: 0.2.15
optionalDependencies: optionalDependencies:
'@types/node': 25.0.1 '@types/node': 25.0.3
fsevents: 2.3.3 fsevents: 2.3.3
jiti: 2.6.1 jiti: 2.6.1
lightningcss: 1.30.2 lightningcss: 1.30.2
vitefu@1.1.1(vite@6.4.1(@types/node@25.0.1)(jiti@2.6.1)(lightningcss@1.30.2)): vitefu@1.1.1(vite@6.4.1(@types/node@25.0.3)(jiti@2.6.1)(lightningcss@1.30.2)):
optionalDependencies: optionalDependencies:
vite: 6.4.1(@types/node@25.0.1)(jiti@2.6.1)(lightningcss@1.30.2) vite: 6.4.1(@types/node@25.0.3)(jiti@2.6.1)(lightningcss@1.30.2)
web-namespaces@2.0.1: {} web-namespaces@2.0.1: {}

View File

@@ -1,10 +1,5 @@
import { Icon } from "astro-icon/components"; import { Icon } from "astro-icon/components";
import type { import type { IconType, LucideIcon, AstroIconName } from "../types";
IconType,
LucideIcon,
AstroIconName,
CustomIconComponent,
} from "../types";
interface IconRendererProps { interface IconRendererProps {
icon: IconType; icon: IconType;
@@ -22,10 +17,6 @@ function isAstroIconName(icon: IconType): icon is AstroIconName {
return typeof icon === "string"; return typeof icon === "string";
} }
function isCustomComponent(icon: IconType): icon is CustomIconComponent {
return typeof icon === "function" && !isLucideIcon(icon);
}
export default function IconRenderer({ export default function IconRenderer({
icon, icon,
size, size,
@@ -41,11 +32,10 @@ export default function IconRenderer({
return <Icon name={icon} class={className} {...props} />; return <Icon name={icon} class={className} {...props} />;
} }
if (isCustomComponent(icon)) { if (typeof icon === "function") {
const CustomComponent = icon; const CustomComponent = icon;
return <CustomComponent class={className} {...props} />; return <CustomComponent class={className} {...props} />;
} }
// Fallback
return null; return null;
} }

View File

@@ -32,26 +32,15 @@ export default function NavigationBar({ currentPath }: NavigationBarProps) {
} }
}; };
// Set initial path
updatePath(); updatePath();
// Listen for Astro's view transition events document.addEventListener("astro:page-load", updatePath);
const handleAstroNavigation = () => { document.addEventListener("astro:after-swap", updatePath);
updatePath();
};
// Listen for astro:page-load event which fires after navigation completes
document.addEventListener("astro:page-load", handleAstroNavigation);
// Also listen for astro:after-swap as a backup
document.addEventListener("astro:after-swap", handleAstroNavigation);
// Listen for regular navigation events as fallback
window.addEventListener("popstate", updatePath); window.addEventListener("popstate", updatePath);
return () => { return () => {
document.removeEventListener("astro:page-load", handleAstroNavigation); document.removeEventListener("astro:page-load", updatePath);
document.removeEventListener("astro:after-swap", handleAstroNavigation); document.removeEventListener("astro:after-swap", updatePath);
window.removeEventListener("popstate", updatePath); window.removeEventListener("popstate", updatePath);
}; };
}, []); }, []);

View File

@@ -61,7 +61,7 @@ export default function ResumeDownloadButton({
Generating PDF... Generating PDF...
</> </>
) : ( ) : (
<>Download Resume</> "Download Resume"
)} )}
</button> </button>
{error && <div class="mt-2 text-error text-sm">{error}</div>} {error && <div class="mt-2 text-error text-sm">{error}</div>}

View File

@@ -218,8 +218,8 @@ export default function ResumeSettingsModal({
role="tab" role="tab"
class={`px-4 py-2 rounded-full text-sm font-bold transition-all duration-200 ${ class={`px-4 py-2 rounded-full text-sm font-bold transition-all duration-200 ${
activeTab === "edit" activeTab === "edit"
? "btn btn-primary font-bold shadow-sm" ? "btn btn-primary shadow-sm"
: "text-base-content/70 hover:text-base-content font-bold hover:bg-base-200" : "text-base-content/70 hover:text-base-content hover:bg-base-200"
}`} }`}
onClick={() => setActiveTab("edit")} onClick={() => setActiveTab("edit")}
> >

View File

@@ -9,7 +9,7 @@ I change what I use _constantly_ in order to find something that feels just
right. I wanted to share them here and update them here so when someone asks, I right. I wanted to share them here and update them here so when someone asks, I
can just point them to this article. can just point them to this article.
1. VSCodium - The joys of VSCode and its extension ecosystem, but without Microsoft's insane amount of tracking and AI slop 1. Zed - Zed is a performany open-source code editor that allows you to configure away all of the AI and signin features. Performs well and has its own extensive extension ecosystem. My config to clean it up can be found [here](https://git.atri.dad/atridad/zed-config).
3. Ghostty - A Zig based terminal emulator by one of the founders of Hashicorp. Runs great on MacOS and Linux. No windows for those who are into that. 3. Ghostty - A Zig based terminal emulator by one of the founders of Hashicorp. Runs great on MacOS and Linux. No windows for those who are into that.
4. Bitwarden - An open-source password manager. Easy to self host with Vaultwarden and with the recent updates, it has SSH Agent support! 4. Bitwarden - An open-source password manager. Easy to self host with Vaultwarden and with the recent updates, it has SSH Agent support!
5. iA Writer - A minimalist Markdown editor. For MacOS and Windows only, but really the MacOS version is the most mature. Awesome for focus. 5. iA Writer - A minimalist Markdown editor. For MacOS and Windows only, but really the MacOS version is the most mature. Awesome for focus.

View File

@@ -6,23 +6,14 @@ export const GET: APIRoute = async () => {
const posts = await getCollection('posts'); const posts = await getCollection('posts');
// Get the raw content from each post // Get the raw content from each post
const postsWithContent = await Promise.all( const postsWithContent = posts.map((post) => ({
posts.map(async (post) => {
const { Content } = await post.render();
// Get the raw markdown content by reading the file
const rawContent = post.body;
return {
slug: post.slug, slug: post.slug,
title: post.data.title, title: post.data.title,
description: post.data.description, description: post.data.description,
pubDate: post.data.pubDate.toISOString().split('T')[0], pubDate: post.data.pubDate.toISOString().split('T')[0],
tags: post.data.tags || [], tags: post.data.tags || [],
content: rawContent content: post.body
}; }));
})
);
return new Response(JSON.stringify(postsWithContent), { return new Response(JSON.stringify(postsWithContent), {
status: 200, status: 200,

View File

@@ -3,7 +3,6 @@ import { config } from "../../../config";
import * as TOML from "@iarna/toml"; import * as TOML from "@iarna/toml";
import { renderToStream } from "@react-pdf/renderer"; import { renderToStream } from "@react-pdf/renderer";
import { ResumeDocument } from "../../../pdf/ResumeDocument"; import { ResumeDocument } from "../../../pdf/ResumeDocument";
import React from "react";
async function getSimpleIconPath(iconName: string): Promise<string> { async function getSimpleIconPath(iconName: string): Promise<string> {
try { try {

View File

@@ -1,5 +1,4 @@
/** @jsxImportSource react */ /** @jsxImportSource react */
import React from "react";
import { import {
Document, Document,
Page, Page,
@@ -9,7 +8,6 @@ import {
Link, Link,
Svg, Svg,
Path, Path,
Font,
} from "@react-pdf/renderer"; } from "@react-pdf/renderer";
const styles = StyleSheet.create({ const styles = StyleSheet.create({

View File

@@ -92,29 +92,25 @@ export async function fetchGiteaInfoFromUrl(
return fetchGiteaRepoInfo(config); return fetchGiteaRepoInfo(config);
} }
const MINUTE_MS = 60_000;
const HOUR_MS = 3_600_000;
const DAY_MS = 86_400_000;
const pluralize = (n: number, unit: string) => `${n} ${unit}${n !== 1 ? "s" : ""} ago`;
export function formatRelativeTime(dateString: string): string { export function formatRelativeTime(dateString: string): string {
if (!dateString) return "Unknown"; if (!dateString) return "Unknown";
const date = new Date(dateString); const diffMs = Date.now() - new Date(dateString).getTime();
const now = new Date(); const diffMinutes = Math.floor(diffMs / MINUTE_MS);
const diffMs = now.getTime() - date.getTime(); const diffHours = Math.floor(diffMs / HOUR_MS);
const diffDays = Math.floor(diffMs / (1000 * 60 * 60 * 24)); const diffDays = Math.floor(diffMs / DAY_MS);
const diffHours = Math.floor(diffMs / (1000 * 60 * 60));
const diffMinutes = Math.floor(diffMs / (1000 * 60));
if (diffMinutes < 60) { if (diffMinutes < 60) return pluralize(diffMinutes, "minute");
return `${diffMinutes} minute${diffMinutes !== 1 ? "s" : ""} ago`; if (diffHours < 24) return pluralize(diffHours, "hour");
} else if (diffHours < 24) { if (diffDays < 30) return pluralize(diffDays, "day");
return `${diffHours} hour${diffHours !== 1 ? "s" : ""} ago`; if (diffDays < 365) return pluralize(Math.floor(diffDays / 30), "month");
} else if (diffDays < 30) { return pluralize(Math.floor(diffDays / 365), "year");
return `${diffDays} day${diffDays !== 1 ? "s" : ""} ago`;
} else if (diffDays < 365) {
const months = Math.floor(diffDays / 30);
return `${months} month${months !== 1 ? "s" : ""} ago`;
} else {
const years = Math.floor(diffDays / 365);
return `${years} year${years !== 1 ? "s" : ""} ago`;
}
} }
export function formatRepoSize(sizeKb: number): string { export function formatRepoSize(sizeKb: number): string {