Compare commits

..

24 Commits

Author SHA1 Message Date
a45a4d7dd7 feat: remove text-justify from content
All checks were successful
renovate / renovate (push) Successful in 55s
test-build / build (push) Successful in 1m32s
2026-02-09 22:12:28 -06:00
6d3f3a49ab fix: padding, margin, and width issues
All checks were successful
renovate / renovate (push) Successful in 1m3s
test-build / build (push) Successful in 1m31s
2026-02-09 22:08:35 -06:00
197ad63ada feat: move directus to local endpoint
All checks were successful
test-build / build (push) Successful in 1m26s
renovate / renovate (push) Successful in 1m40s
2026-02-09 17:07:11 -06:00
4c4421c8a8 fix: fix lint error
All checks were successful
test-build / build (push) Successful in 1m7s
renovate / renovate (push) Successful in 1m12s
release-image-harbor / build (push) Successful in 58s
release-image-gitea / build (push) Successful in 1m20s
release-image-gitea / release (push) Successful in 2m53s
release-image-harbor / release (push) Successful in 3m15s
2026-02-08 23:15:40 -06:00
d0ff16c8dc feat: release 2.4.0 2026-02-08 23:11:20 -06:00
9678b3c718 feat: add applications page
Some checks failed
test-build / build (push) Failing after 43s
renovate / renovate (push) Successful in 1m34s
2026-02-08 23:10:40 -06:00
7fafa5c4cf feat: update features 2026-02-08 17:15:43 -06:00
a909743feb Merge pull request 'chore(deps): update dependency eslint to v10' (#323) from renovate/major-eslint-monorepo into main
All checks were successful
test-build / build (push) Successful in 2m12s
renovate / renovate (push) Successful in 1m56s
Reviewed-on: #323
2026-02-08 22:12:30 +00:00
f116173cb8 chore(deps): update dependency eslint to v10
All checks were successful
renovate/stability-days Updates have met minimum release age requirement
test-build / build (pull_request) Successful in 1m18s
2026-02-08 21:04:30 +00:00
ce62de8883 Merge pull request 'chore(deps): update dependency eslint-plugin-format to v1.4.0' (#326) from renovate/eslint-plugin-format-1.x-lockfile into main
All checks were successful
test-build / build (push) Successful in 1m22s
renovate / renovate (push) Successful in 1m39s
Reviewed-on: #326
2026-02-08 21:02:57 +00:00
94f2779463 chore(deps): update dependency eslint-plugin-format to v1.4.0
All checks were successful
renovate/stability-days Updates have met minimum release age requirement
test-build / build (pull_request) Successful in 1m57s
2026-02-08 20:58:23 +00:00
ed3cf80921 Merge pull request 'chore(deps): update dependency @iconify-json/simple-icons to v1.2.70' (#327) from renovate/iconify-json-simple-icons-1.x-lockfile into main
All checks were successful
renovate / renovate (push) Successful in 1m49s
test-build / build (push) Successful in 2m5s
2026-02-08 20:57:00 +00:00
63aa6bfdbc chore(deps): update dependency @iconify-json/simple-icons to v1.2.70
Some checks are pending
renovate/stability-days Updates have not met minimum release age requirement
test-build / build (pull_request) Successful in 1m25s
2026-02-08 20:56:47 +00:00
4343124c3f Merge pull request 'chore(deps): update dependency @eslint-react/eslint-plugin to v2.12.2' (#325) from renovate/eslint-react-eslint-plugin-2.x-lockfile into main
Some checks failed
renovate / renovate (push) Has been cancelled
test-build / build (push) Has been cancelled
Reviewed-on: #325
2026-02-08 20:55:25 +00:00
a48063a694 chore(deps): update dependency @eslint-react/eslint-plugin to v2.12.2
All checks were successful
renovate/stability-days Updates have met minimum release age requirement
test-build / build (pull_request) Successful in 1m31s
2026-02-08 20:39:47 +00:00
e476efb96b feat: use latest alpine
All checks were successful
test-build / build (push) Successful in 1m41s
renovate / renovate (push) Successful in 3m23s
2026-02-08 14:38:05 -06:00
a99201138e Merge pull request 'chore(deps): update dependency @eslint-react/eslint-plugin to v2.11.2' (#324) from renovate/eslint-react-eslint-plugin-2.x-lockfile into main
All checks were successful
renovate / renovate (push) Successful in 2m15s
test-build / build (push) Successful in 3m14s
2026-02-08 00:02:47 +00:00
9ef86e71dc chore(deps): update dependency @eslint-react/eslint-plugin to v2.11.2
All checks were successful
renovate/stability-days Updates have met minimum release age requirement
test-build / build (pull_request) Successful in 1m40s
2026-02-08 00:02:23 +00:00
5cd59cd1ff Merge pull request 'chore(deps): update dependency @eslint-react/eslint-plugin to v2.11.0' (#321) from renovate/eslint-react-eslint-plugin-2.x-lockfile into main
All checks were successful
test-build / build (push) Successful in 1m6s
renovate / renovate (push) Successful in 3m28s
Reviewed-on: #321
2026-02-07 00:31:33 +00:00
d5cf6fe130 chore(deps): update dependency @eslint-react/eslint-plugin to v2.11.0
All checks were successful
renovate/stability-days Updates have met minimum release age requirement
test-build / build (pull_request) Successful in 1m0s
2026-02-07 00:28:07 +00:00
91136e2e54 Merge pull request 'chore(deps): update dependency @directus/sdk to v21.1.0' (#320) from renovate/directus-sdk-21.x-lockfile into main
All checks were successful
renovate / renovate (push) Successful in 1m1s
test-build / build (push) Successful in 1m16s
Reviewed-on: #320
2026-02-07 00:27:00 +00:00
7b915cf021 chore(deps): update dependency @directus/sdk to v21.1.0
All checks were successful
renovate/stability-days Updates have met minimum release age requirement
test-build / build (pull_request) Successful in 59s
2026-02-07 00:19:11 +00:00
807b8dd9b9 Merge pull request 'chore(deps): update dependency motion to v12.33.0' (#322) from renovate/motion-12.x-lockfile into main
All checks were successful
test-build / build (push) Successful in 2m20s
renovate / renovate (push) Successful in 2m39s
Reviewed-on: #322
2026-02-07 00:17:06 +00:00
76c6933682 chore(deps): update dependency motion to v12.33.0
All checks were successful
renovate/stability-days Updates have met minimum release age requirement
test-build / build (pull_request) Successful in 3m6s
2026-02-07 00:10:24 +00:00
15 changed files with 287 additions and 132 deletions

View File

@@ -1,5 +1,5 @@
ARG REGISTRY=docker.io ARG REGISTRY=docker.io
FROM ${REGISTRY}/node:24.13.0-alpine3.22 AS base FROM ${REGISTRY}/node:24.13.0-alpine AS base
ENV PNPM_HOME="/pnpm" ENV PNPM_HOME="/pnpm"
ENV PATH="$PNPM_HOME:$PATH" ENV PATH="$PNPM_HOME:$PATH"
@@ -26,10 +26,10 @@ COPY --from=build /app/dist /app/dist
ENV HOST=0.0.0.0 ENV HOST=0.0.0.0
ENV SITE_URL=https://www.alexlebens.dev ENV SITE_URL=https://www.alexlebens.dev
ENV DIRECTUS_URL=https://directus.alexlebens.dev ENV DIRECTUS_URL=https://directus.alexlebens.net
ENV PORT=4321 ENV PORT=4321
LABEL version="2.3.2" LABEL version="2.4.0"
LABEL description="Astro based personal website" LABEL description="Astro based personal website"
EXPOSE $PORT EXPOSE $PORT

View File

@@ -14,7 +14,7 @@ For detailed help with Astro CLI commands, visit [Astro's documentation](https:/
## Thanks ## Thanks
Thanks https://github.com/mearashadowfax/ScrewFast, https://github.com/godruoyi/gblog/tree/gblog-template Thanks https://github.com/godruoyi/gblog/tree/gblog-template, https://github.com/mearashadowfax/ScrewFast,
## License ## License

View File

@@ -1,7 +1,7 @@
{ {
"name": "site-profile", "name": "site-profile",
"type": "module", "type": "module",
"version": "2.3.2", "version": "2.4.0",
"homepage": "https://www.alexlebens.dev", "homepage": "https://www.alexlebens.dev",
"bugs": { "bugs": {
"url": "https://gitea.alexlebens.dev/alexlebens/site-profile/issues", "url": "https://gitea.alexlebens.dev/alexlebens/site-profile/issues",

234
pnpm-lock.yaml generated
View File

@@ -28,7 +28,7 @@ importers:
version: 3.7.0 version: 3.7.0
'@directus/sdk': '@directus/sdk':
specifier: ^21.0.0 specifier: ^21.0.0
version: 21.0.0 version: 21.1.0
'@giscus/react': '@giscus/react':
specifier: ^3.1.0 specifier: ^3.1.0
version: 3.1.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4) version: 3.1.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
@@ -40,7 +40,7 @@ importers:
version: 1.2.15 version: 1.2.15
'@iconify-json/simple-icons': '@iconify-json/simple-icons':
specifier: ^1.2.69 specifier: ^1.2.69
version: 1.2.69 version: 1.2.70
'@playform/compress': '@playform/compress':
specifier: ^0.2.1 specifier: ^0.2.1
version: 0.2.1(@types/node@25.2.0)(jiti@2.6.1)(rollup@2.79.2)(typescript@5.9.3)(yaml@2.8.2) version: 0.2.1(@types/node@25.2.0)(jiti@2.6.1)(rollup@2.79.2)(typescript@5.9.3)(yaml@2.8.2)
@@ -79,7 +79,7 @@ importers:
version: 4.0.0 version: 4.0.0
motion: motion:
specifier: ^12.31.0 specifier: ^12.31.0
version: 12.31.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4) version: 12.33.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
preline: preline:
specifier: ^4.0.1 specifier: ^4.0.1
version: 4.0.1 version: 4.0.1
@@ -110,7 +110,7 @@ importers:
devDependencies: devDependencies:
'@eslint-react/eslint-plugin': '@eslint-react/eslint-plugin':
specifier: ^2.9.4 specifier: ^2.9.4
version: 2.9.4(eslint@10.0.0(jiti@2.6.1))(typescript@5.9.3) version: 2.12.2(eslint@10.0.0(jiti@2.6.1))(typescript@5.9.3)
'@tailwindcss/forms': '@tailwindcss/forms':
specifier: ^0.5.11 specifier: ^0.5.11
version: 0.5.11(tailwindcss@4.1.18) version: 0.5.11(tailwindcss@4.1.18)
@@ -128,7 +128,7 @@ importers:
version: 1.5.0(eslint@10.0.0(jiti@2.6.1)) version: 1.5.0(eslint@10.0.0(jiti@2.6.1))
eslint-plugin-format: eslint-plugin-format:
specifier: ^1.3.1 specifier: ^1.3.1
version: 1.3.1(eslint@10.0.0(jiti@2.6.1)) version: 1.4.0(eslint@10.0.0(jiti@2.6.1))
eslint-plugin-react: eslint-plugin-react:
specifier: ^7.37.5 specifier: ^7.37.5
version: 7.37.5(eslint@10.0.0(jiti@2.6.1)) version: 7.37.5(eslint@10.0.0(jiti@2.6.1))
@@ -809,8 +809,8 @@ packages:
resolution: {integrity: sha512-VERIM64vtTP1C4mxQ5thVT9fK0apjPFobqybMtA1UdUujWka24ERHbRHFGmpbbhp73MhV+KSsHQH9C6uOTdEQA==} resolution: {integrity: sha512-VERIM64vtTP1C4mxQ5thVT9fK0apjPFobqybMtA1UdUujWka24ERHbRHFGmpbbhp73MhV+KSsHQH9C6uOTdEQA==}
engines: {node: '>=18'} engines: {node: '>=18'}
'@directus/sdk@21.0.0': '@directus/sdk@21.1.0':
resolution: {integrity: sha512-+Uld9+anm5N1NfVgEmPBReOrT0uTkE3OnQginvqx7yGS94e20qzNsW8IJnstC1OvdUMTDteDrdYMfx6QG+kY7Q==} resolution: {integrity: sha512-Ig8zZAQDbc7QMIM54N+x71C04lni9MN9yalNAezjDjFdNknTJzupDY7V5cb+kOJL8GsqDE9Bg8xq8xCmkDVs5A==}
engines: {node: '>=22'} engines: {node: '>=22'}
'@dprint/formatter@0.5.1': '@dprint/formatter@0.5.1':
@@ -1012,43 +1012,43 @@ packages:
resolution: {integrity: sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==} resolution: {integrity: sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==}
engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0}
'@eslint-react/ast@2.9.4': '@eslint-react/ast@2.12.2':
resolution: {integrity: sha512-WI9iq5ePTlcWo0xhSs4wxLUC6u4QuBmQkKeSiXexkEO8C2p8QE7ECNIXhRVkYs3p3AKH5xTez9V8C/CBIGxeXA==} resolution: {integrity: sha512-OMpEIJguhDOaMDr6U4/qmoSQCjNcqCteiv4okA6a0p5ACX9s1uulmK2tcm7sep4RR+nPYkZUag3sXOi3R0oFmw==}
engines: {node: '>=20.19.0'} engines: {node: '>=20.19.0'}
peerDependencies: peerDependencies:
eslint: ^8.57.0 || ^9.0.0 eslint: ^8.57.0 || ^9.0.0 || ^10.0.0
typescript: '>=4.8.4 <6.0.0' typescript: '>=4.8.4 <6.0.0'
'@eslint-react/core@2.9.4': '@eslint-react/core@2.12.2':
resolution: {integrity: sha512-Ob+Dip1vyR9ch9XL7LUAsGXc0UUf9Kuzn9BEiwOLT7l+cF91ieKeCvIzNPp0LmTuanPfQweJ9iDT9i295SqBZA==} resolution: {integrity: sha512-lS2a1I3G7JXjFfdlOWXJoid8kPstcgMyL3rVQFcZVJF569JwF/VRZ7DDdH7JKrnFPAu1CtkLl8Acqy6Q8+mbdA==}
engines: {node: '>=20.19.0'} engines: {node: '>=20.19.0'}
peerDependencies: peerDependencies:
eslint: ^8.57.0 || ^9.0.0 eslint: ^8.57.0 || ^9.0.0 || ^10.0.0
typescript: '>=4.8.4 <6.0.0' typescript: '>=4.8.4 <6.0.0'
'@eslint-react/eff@2.9.4': '@eslint-react/eff@2.12.2':
resolution: {integrity: sha512-7AOmozmfa0HgXY9O+J+iX3ciZfViz+W+jhRe2y0YqqkDR7PwV2huzhk/Bxq6sRzzf2uFHqoh/AQNZUhRJ3A05A==} resolution: {integrity: sha512-UWN/mtvu8gPVwZzg77h3zV0GEnKHjN/2yAI++UGGlVQ9x6en4/LFbn/9J2aM61lwyU4CvPUKpQ1KcYTTwJeJ0A==}
engines: {node: '>=20.19.0'} engines: {node: '>=20.19.0'}
'@eslint-react/eslint-plugin@2.9.4': '@eslint-react/eslint-plugin@2.12.2':
resolution: {integrity: sha512-B1LOEUBuT4L7EmY3E9F7+K8Jdr9nAzx66USz4uWEtg8ZMn82E2O5TzOBPw6eeL0O9BoyLBoslZotXNQVazR2dA==} resolution: {integrity: sha512-7P2cGKwfTABeBnTac6PpLupE30+TmEbF3jTnGaziMwCzpPS1WAJtyvZw27RDSzb7pfx6GjTNBBHGg3dwfK+nhg==}
engines: {node: '>=20.19.0'} engines: {node: '>=20.19.0'}
peerDependencies: peerDependencies:
eslint: ^8.57.0 || ^9.0.0 eslint: ^8.57.0 || ^9.0.0 || ^10.0.0
typescript: '>=4.8.4 <6.0.0' typescript: '>=4.8.4 <6.0.0'
'@eslint-react/shared@2.9.4': '@eslint-react/shared@2.12.2':
resolution: {integrity: sha512-PU7C4JzDZ6OffAWD+HwJdvzGSho25UPYJRyb4wZ/pDaI8QPTDj8AtKWKK69SEOQl2ic89ht1upjQX+jrXhN15w==} resolution: {integrity: sha512-/40s8neS142nMN9l7SDzwncqh/PNSzeYJ0Gc3h/eacQcUrjLx1NWWvPs1CNA3EbtqJRCvS2gflvzkzM2w6HURA==}
engines: {node: '>=20.19.0'} engines: {node: '>=20.19.0'}
peerDependencies: peerDependencies:
eslint: ^8.57.0 || ^9.0.0 eslint: ^8.57.0 || ^9.0.0 || ^10.0.0
typescript: '>=4.8.4 <6.0.0' typescript: '>=4.8.4 <6.0.0'
'@eslint-react/var@2.9.4': '@eslint-react/var@2.12.2':
resolution: {integrity: sha512-Qiih6hT+D2vZmCbAGUooReKlqXjtb/g3SzYj2zNlci6YcWxsQB/pqhR0ayU2AOdW6U9YdeCCfPIwBBQ4AEpyBA==} resolution: {integrity: sha512-d+s6G1HAghVA25io3Vtj8237mQZUGozH+3UwEboNl+8XE3oTJMYv0T3X9U96GbxrV2S1BPFSYQEMwl6Z0RYgmA==}
engines: {node: '>=20.19.0'} engines: {node: '>=20.19.0'}
peerDependencies: peerDependencies:
eslint: ^8.57.0 || ^9.0.0 eslint: ^8.57.0 || ^9.0.0 || ^10.0.0
typescript: '>=4.8.4 <6.0.0' typescript: '>=4.8.4 <6.0.0'
'@eslint/config-array@0.23.1': '@eslint/config-array@0.23.1':
@@ -1108,8 +1108,8 @@ packages:
'@iconify-json/pajamas@1.2.15': '@iconify-json/pajamas@1.2.15':
resolution: {integrity: sha512-utUwcOZLNQQEmyY38lBw2VzAKIHg6sI+PuY42o73P67iEou2eafuZ4UQxHvRdcqf8h7sPm0JlsX2cWm/JkT06Q==} resolution: {integrity: sha512-utUwcOZLNQQEmyY38lBw2VzAKIHg6sI+PuY42o73P67iEou2eafuZ4UQxHvRdcqf8h7sPm0JlsX2cWm/JkT06Q==}
'@iconify-json/simple-icons@1.2.69': '@iconify-json/simple-icons@1.2.70':
resolution: {integrity: sha512-T/rhy5n7pzE0ZOxQVlF68SNPCYYjRBpddjgjrJO5WWVRG8es5BQmvxIE9kKF+t2hhPGvuGQFpXmUyqbOtnxirQ==} resolution: {integrity: sha512-CYNRCgN6nBTjN4dNkrBCjHXNR2e4hQihdsZUs/afUNFOWLSYjfihca4EFN05rRvDk4Xoy2n8tym6IxBZmcn+Qg==}
'@iconify/tools@4.2.0': '@iconify/tools@4.2.0':
resolution: {integrity: sha512-WRxPva/ipxYkqZd1+CkEAQmd86dQmrwH0vwK89gmp2Kh2WyyVw57XbPng0NehP3x4V1LzLsXUneP1uMfTMZmUA==} resolution: {integrity: sha512-WRxPva/ipxYkqZd1+CkEAQmd86dQmrwH0vwK89gmp2Kh2WyyVw57XbPng0NehP3x4V1LzLsXUneP1uMfTMZmUA==}
@@ -2740,23 +2740,23 @@ packages:
peerDependencies: peerDependencies:
eslint: '>=8.57.0' eslint: '>=8.57.0'
eslint-plugin-format@1.3.1: eslint-plugin-format@1.4.0:
resolution: {integrity: sha512-nK96Gnt6/9wj8KhTFg+D80Mc01cffrcB15NO6pkTJmPpO0vHV+9yxegr+wVry4O3uGbu83HN86inCO3IsML9Rw==} resolution: {integrity: sha512-6o3fBJENUZPXlg01ab0vTldr6YThw0dxb49QMVp1V9bI7k22dtXYuWWMm3mitAsntJOt8V4pa7BWHUalTrSBPA==}
peerDependencies: peerDependencies:
eslint: ^8.40.0 || ^9.0.0 eslint: ^8.40.0 || ^9.0.0
eslint-plugin-react-dom@2.9.4: eslint-plugin-react-dom@2.12.2:
resolution: {integrity: sha512-lRa3iN082cX3HRKdbKSESmlj+z4zMR10DughwagV7h+IOd3O07UGnYQhenH08GMSyLy1f2D6QJmKBLGbx2p20g==} resolution: {integrity: sha512-Tvz+YETB0MQiPHR3KYhkwCioGfXQ6aUXpNOFpgZ70wx5/QuU1lemTWdmXuxgAPifsl150OOZmM2MJ0ElkwBUOw==}
engines: {node: '>=20.19.0'} engines: {node: '>=20.19.0'}
peerDependencies: peerDependencies:
eslint: ^8.57.0 || ^9.0.0 eslint: ^8.57.0 || ^9.0.0 || ^10.0.0
typescript: '>=4.8.4 <6.0.0' typescript: '>=4.8.4 <6.0.0'
eslint-plugin-react-hooks-extra@2.9.4: eslint-plugin-react-hooks-extra@2.12.2:
resolution: {integrity: sha512-8hQArFHpXubT+i++8TwIL24vQ5b/ZcnVT3EFOSvy1TdBZw8NqrcFNBVqywQ6YUWX0utuPiTQgeJB0qnBF7gx4g==} resolution: {integrity: sha512-I3L/iVgyMRbbmMxRZNIxlxMrXUnV74ZHOsmSfzB/ue9hivdd5yN8JhMe+I5PNOw9L0gJHUCo2mgkKV6lMEE5DA==}
engines: {node: '>=20.19.0'} engines: {node: '>=20.19.0'}
peerDependencies: peerDependencies:
eslint: ^8.57.0 || ^9.0.0 eslint: ^8.57.0 || ^9.0.0 || ^10.0.0
typescript: '>=4.8.4 <6.0.0' typescript: '>=4.8.4 <6.0.0'
eslint-plugin-react-hooks@7.0.1: eslint-plugin-react-hooks@7.0.1:
@@ -2765,11 +2765,11 @@ packages:
peerDependencies: peerDependencies:
eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0 eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0
eslint-plugin-react-naming-convention@2.9.4: eslint-plugin-react-naming-convention@2.12.2:
resolution: {integrity: sha512-Ow9ikJ49tDjeTaO2wfUYlSlVBsbG8AZVqoVFu4HH69FZe6I5LEdjZf/gdXnN2W+/JAy7Ru5vYQ8H8LU3tTZERg==} resolution: {integrity: sha512-IsPmSs+AZo11uR47UoSRv9tVntUDL9Ah5F8Zj4HVC4HTxJlFZHC0gbm43q36Xw6c65J0LqA75oDA2h6jvhqSQQ==}
engines: {node: '>=20.19.0'} engines: {node: '>=20.19.0'}
peerDependencies: peerDependencies:
eslint: ^8.57.0 || ^9.0.0 eslint: ^8.57.0 || ^9.0.0 || ^10.0.0
typescript: '>=4.8.4 <6.0.0' typescript: '>=4.8.4 <6.0.0'
eslint-plugin-react-refresh@0.5.0: eslint-plugin-react-refresh@0.5.0:
@@ -2777,25 +2777,25 @@ packages:
peerDependencies: peerDependencies:
eslint: '>=9' eslint: '>=9'
eslint-plugin-react-rsc@2.9.4: eslint-plugin-react-rsc@2.12.2:
resolution: {integrity: sha512-RwBYSLkcGXQV6SQYABdHLrafUmpfdPBYsAa/kvg6smqEn+/vPKSk0I+uAuzkmiw4y4KXW94Q9rlIdJlzOMdJfQ==} resolution: {integrity: sha512-37Z4u6bBddO2wz8wrelYapOoDHhdEyF2pt8pbzFs0nW2USOxoA34/Gv73Dos0Kb6Ul4fFuwEHH2Tu8hZoki5jQ==}
engines: {node: '>=20.19.0'} engines: {node: '>=20.19.0'}
peerDependencies: peerDependencies:
eslint: ^8.57.0 || ^9.0.0 eslint: ^8.57.0 || ^9.0.0 || ^10.0.0
typescript: '>=4.8.4 <6.0.0' typescript: '>=4.8.4 <6.0.0'
eslint-plugin-react-web-api@2.9.4: eslint-plugin-react-web-api@2.12.2:
resolution: {integrity: sha512-/k++qhGoYtMNZrsQT+M08fCGi/VurL1fE/LNiz2fMwOIU7KjXD9N0kGWPFdIAISnYXGzOg53O5WW/mnNR78emQ==} resolution: {integrity: sha512-bnpobQ6pjGdo4sJpd/PDlVM/wTqHt29fsW3uExuB+9ta6LSJjJo0/nXhV/o7q/MU/04QZB8WOw+k9ws8HU1sPQ==}
engines: {node: '>=20.19.0'} engines: {node: '>=20.19.0'}
peerDependencies: peerDependencies:
eslint: ^8.57.0 || ^9.0.0 eslint: ^8.57.0 || ^9.0.0 || ^10.0.0
typescript: '>=4.8.4 <6.0.0' typescript: '>=4.8.4 <6.0.0'
eslint-plugin-react-x@2.9.4: eslint-plugin-react-x@2.12.2:
resolution: {integrity: sha512-a078MHeM/FdjRu3KJsFX+PCHewZyC77EjAO7QstL/vvwjsFae3PCWMZ8Q4b+mzUsT4FkFxi5mEW43ZHksPWDFw==} resolution: {integrity: sha512-0zA48OyHKHePa3mhV/tRxT26LvEhRC7ROQ02sdwoyv/JOYgLX+5Z9o85sneFB7SmkZul4TubxUf+EvHTXdUmVg==}
engines: {node: '>=20.19.0'} engines: {node: '>=20.19.0'}
peerDependencies: peerDependencies:
eslint: ^8.57.0 || ^9.0.0 eslint: ^8.57.0 || ^9.0.0 || ^10.0.0
typescript: '>=4.8.4 <6.0.0' typescript: '>=4.8.4 <6.0.0'
eslint-plugin-react@7.37.5: eslint-plugin-react@7.37.5:
@@ -2988,8 +2988,8 @@ packages:
fraction.js@5.3.4: fraction.js@5.3.4:
resolution: {integrity: sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ==} resolution: {integrity: sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ==}
framer-motion@12.31.0: framer-motion@12.33.0:
resolution: {integrity: sha512-Tnd0FU05zGRFI3JJmBegXonF1rfuzYeuXd1QSdQ99Ysnppk0yWBWSW2wUsqzRpS5nv0zPNx+y0wtDj4kf0q5RQ==} resolution: {integrity: sha512-ca8d+rRPcDP5iIF+MoT3WNc0KHJMjIyFAbtVLvM9eA7joGSpeqDfiNH/kCs1t4CHi04njYvWyj0jS4QlEK/rJQ==}
peerDependencies: peerDependencies:
'@emotion/is-prop-valid': '*' '@emotion/is-prop-valid': '*'
react: ^18.0.0 || ^19.0.0 react: ^18.0.0 || ^19.0.0
@@ -3871,14 +3871,14 @@ packages:
morphdom@2.7.8: morphdom@2.7.8:
resolution: {integrity: sha512-D/fR4xgGUyVRbdMGU6Nejea1RFzYxYtyurG4Fbv2Fi/daKlWKuXGLOdXtl+3eIwL110cI2hz1ZojGICjjFLgTg==} resolution: {integrity: sha512-D/fR4xgGUyVRbdMGU6Nejea1RFzYxYtyurG4Fbv2Fi/daKlWKuXGLOdXtl+3eIwL110cI2hz1ZojGICjjFLgTg==}
motion-dom@12.30.1: motion-dom@12.33.0:
resolution: {integrity: sha512-QXB+iFJRzZTqL+Am4a1CRoHdH+0Nq12wLdqQQZZsfHlp9AMt6PA098L/61oVZsDA+Ep3QSGudzpViyRrhYhGcQ==} resolution: {integrity: sha512-XRPebVypsl0UM+7v0Hr8o9UAj0S2djsQWRdHBd5iVouVpMrQqAI0C/rDAT3QaYnXnHuC5hMcwDHCboNeyYjPoQ==}
motion-utils@12.29.2: motion-utils@12.29.2:
resolution: {integrity: sha512-G3kc34H2cX2gI63RqU+cZq+zWRRPSsNIOjpdl9TN4AQwC4sgwYPl/Q/Obf/d53nOm569T0fYK+tcoSV50BWx8A==} resolution: {integrity: sha512-G3kc34H2cX2gI63RqU+cZq+zWRRPSsNIOjpdl9TN4AQwC4sgwYPl/Q/Obf/d53nOm569T0fYK+tcoSV50BWx8A==}
motion@12.31.0: motion@12.33.0:
resolution: {integrity: sha512-KpZQik3LLFdsiaLdFXQGnty84KcDvvdvBCHSvA9aH+RjQTP6jkJGyngRPSngau13ARUI6TbPphf/Vv/QxwxRJQ==} resolution: {integrity: sha512-TcND7PijsrTeIA9SRVUB8TOJQ+6mJnJ5K4a9oAJZvyI0Zy47Gq5oofU+VkTxbLcvDoKXnHspQcII2mnk3TbFsQ==}
peerDependencies: peerDependencies:
'@emotion/is-prop-valid': '*' '@emotion/is-prop-valid': '*'
react: ^18.0.0 || ^19.0.0 react: ^18.0.0 || ^19.0.0
@@ -6434,7 +6434,7 @@ snapshots:
dependencies: dependencies:
fontkitten: 1.0.2 fontkitten: 1.0.2
'@directus/sdk@21.0.0': {} '@directus/sdk@21.1.0': {}
'@dprint/formatter@0.5.1': {} '@dprint/formatter@0.5.1': {}
@@ -6555,9 +6555,9 @@ snapshots:
'@eslint-community/regexpp@4.12.2': {} '@eslint-community/regexpp@4.12.2': {}
'@eslint-react/ast@2.9.4(eslint@10.0.0(jiti@2.6.1))(typescript@5.9.3)': '@eslint-react/ast@2.12.2(eslint@10.0.0(jiti@2.6.1))(typescript@5.9.3)':
dependencies: dependencies:
'@eslint-react/eff': 2.9.4 '@eslint-react/eff': 2.12.2
'@typescript-eslint/types': 8.54.0 '@typescript-eslint/types': 8.54.0
'@typescript-eslint/typescript-estree': 8.54.0(typescript@5.9.3) '@typescript-eslint/typescript-estree': 8.54.0(typescript@5.9.3)
'@typescript-eslint/utils': 8.54.0(eslint@10.0.0(jiti@2.6.1))(typescript@5.9.3) '@typescript-eslint/utils': 8.54.0(eslint@10.0.0(jiti@2.6.1))(typescript@5.9.3)
@@ -6567,12 +6567,12 @@ snapshots:
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
'@eslint-react/core@2.9.4(eslint@10.0.0(jiti@2.6.1))(typescript@5.9.3)': '@eslint-react/core@2.12.2(eslint@10.0.0(jiti@2.6.1))(typescript@5.9.3)':
dependencies: dependencies:
'@eslint-react/ast': 2.9.4(eslint@10.0.0(jiti@2.6.1))(typescript@5.9.3) '@eslint-react/ast': 2.12.2(eslint@10.0.0(jiti@2.6.1))(typescript@5.9.3)
'@eslint-react/eff': 2.9.4 '@eslint-react/eff': 2.12.2
'@eslint-react/shared': 2.9.4(eslint@10.0.0(jiti@2.6.1))(typescript@5.9.3) '@eslint-react/shared': 2.12.2(eslint@10.0.0(jiti@2.6.1))(typescript@5.9.3)
'@eslint-react/var': 2.9.4(eslint@10.0.0(jiti@2.6.1))(typescript@5.9.3) '@eslint-react/var': 2.12.2(eslint@10.0.0(jiti@2.6.1))(typescript@5.9.3)
'@typescript-eslint/scope-manager': 8.54.0 '@typescript-eslint/scope-manager': 8.54.0
'@typescript-eslint/types': 8.54.0 '@typescript-eslint/types': 8.54.0
'@typescript-eslint/utils': 8.54.0(eslint@10.0.0(jiti@2.6.1))(typescript@5.9.3) '@typescript-eslint/utils': 8.54.0(eslint@10.0.0(jiti@2.6.1))(typescript@5.9.3)
@@ -6582,31 +6582,31 @@ snapshots:
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
'@eslint-react/eff@2.9.4': {} '@eslint-react/eff@2.12.2': {}
'@eslint-react/eslint-plugin@2.9.4(eslint@10.0.0(jiti@2.6.1))(typescript@5.9.3)': '@eslint-react/eslint-plugin@2.12.2(eslint@10.0.0(jiti@2.6.1))(typescript@5.9.3)':
dependencies: dependencies:
'@eslint-react/eff': 2.9.4 '@eslint-react/eff': 2.12.2
'@eslint-react/shared': 2.9.4(eslint@10.0.0(jiti@2.6.1))(typescript@5.9.3) '@eslint-react/shared': 2.12.2(eslint@10.0.0(jiti@2.6.1))(typescript@5.9.3)
'@typescript-eslint/scope-manager': 8.54.0 '@typescript-eslint/scope-manager': 8.54.0
'@typescript-eslint/type-utils': 8.54.0(eslint@10.0.0(jiti@2.6.1))(typescript@5.9.3) '@typescript-eslint/type-utils': 8.54.0(eslint@10.0.0(jiti@2.6.1))(typescript@5.9.3)
'@typescript-eslint/types': 8.54.0 '@typescript-eslint/types': 8.54.0
'@typescript-eslint/utils': 8.54.0(eslint@10.0.0(jiti@2.6.1))(typescript@5.9.3) '@typescript-eslint/utils': 8.54.0(eslint@10.0.0(jiti@2.6.1))(typescript@5.9.3)
eslint: 10.0.0(jiti@2.6.1) eslint: 10.0.0(jiti@2.6.1)
eslint-plugin-react-dom: 2.9.4(eslint@10.0.0(jiti@2.6.1))(typescript@5.9.3) eslint-plugin-react-dom: 2.12.2(eslint@10.0.0(jiti@2.6.1))(typescript@5.9.3)
eslint-plugin-react-hooks-extra: 2.9.4(eslint@10.0.0(jiti@2.6.1))(typescript@5.9.3) eslint-plugin-react-hooks-extra: 2.12.2(eslint@10.0.0(jiti@2.6.1))(typescript@5.9.3)
eslint-plugin-react-naming-convention: 2.9.4(eslint@10.0.0(jiti@2.6.1))(typescript@5.9.3) eslint-plugin-react-naming-convention: 2.12.2(eslint@10.0.0(jiti@2.6.1))(typescript@5.9.3)
eslint-plugin-react-rsc: 2.9.4(eslint@10.0.0(jiti@2.6.1))(typescript@5.9.3) eslint-plugin-react-rsc: 2.12.2(eslint@10.0.0(jiti@2.6.1))(typescript@5.9.3)
eslint-plugin-react-web-api: 2.9.4(eslint@10.0.0(jiti@2.6.1))(typescript@5.9.3) eslint-plugin-react-web-api: 2.12.2(eslint@10.0.0(jiti@2.6.1))(typescript@5.9.3)
eslint-plugin-react-x: 2.9.4(eslint@10.0.0(jiti@2.6.1))(typescript@5.9.3) eslint-plugin-react-x: 2.12.2(eslint@10.0.0(jiti@2.6.1))(typescript@5.9.3)
ts-api-utils: 2.4.0(typescript@5.9.3) ts-api-utils: 2.4.0(typescript@5.9.3)
typescript: 5.9.3 typescript: 5.9.3
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
'@eslint-react/shared@2.9.4(eslint@10.0.0(jiti@2.6.1))(typescript@5.9.3)': '@eslint-react/shared@2.12.2(eslint@10.0.0(jiti@2.6.1))(typescript@5.9.3)':
dependencies: dependencies:
'@eslint-react/eff': 2.9.4 '@eslint-react/eff': 2.12.2
'@typescript-eslint/utils': 8.54.0(eslint@10.0.0(jiti@2.6.1))(typescript@5.9.3) '@typescript-eslint/utils': 8.54.0(eslint@10.0.0(jiti@2.6.1))(typescript@5.9.3)
eslint: 10.0.0(jiti@2.6.1) eslint: 10.0.0(jiti@2.6.1)
ts-pattern: 5.9.0 ts-pattern: 5.9.0
@@ -6615,11 +6615,11 @@ snapshots:
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
'@eslint-react/var@2.9.4(eslint@10.0.0(jiti@2.6.1))(typescript@5.9.3)': '@eslint-react/var@2.12.2(eslint@10.0.0(jiti@2.6.1))(typescript@5.9.3)':
dependencies: dependencies:
'@eslint-react/ast': 2.9.4(eslint@10.0.0(jiti@2.6.1))(typescript@5.9.3) '@eslint-react/ast': 2.12.2(eslint@10.0.0(jiti@2.6.1))(typescript@5.9.3)
'@eslint-react/eff': 2.9.4 '@eslint-react/eff': 2.12.2
'@eslint-react/shared': 2.9.4(eslint@10.0.0(jiti@2.6.1))(typescript@5.9.3) '@eslint-react/shared': 2.12.2(eslint@10.0.0(jiti@2.6.1))(typescript@5.9.3)
'@typescript-eslint/scope-manager': 8.54.0 '@typescript-eslint/scope-manager': 8.54.0
'@typescript-eslint/types': 8.54.0 '@typescript-eslint/types': 8.54.0
'@typescript-eslint/utils': 8.54.0(eslint@10.0.0(jiti@2.6.1))(typescript@5.9.3) '@typescript-eslint/utils': 8.54.0(eslint@10.0.0(jiti@2.6.1))(typescript@5.9.3)
@@ -6688,7 +6688,7 @@ snapshots:
dependencies: dependencies:
'@iconify/types': 2.0.0 '@iconify/types': 2.0.0
'@iconify-json/simple-icons@1.2.69': '@iconify-json/simple-icons@1.2.70':
dependencies: dependencies:
'@iconify/types': 2.0.0 '@iconify/types': 2.0.0
@@ -8729,7 +8729,7 @@ snapshots:
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
eslint-plugin-format@1.3.1(eslint@10.0.0(jiti@2.6.1)): eslint-plugin-format@1.4.0(eslint@10.0.0(jiti@2.6.1)):
dependencies: dependencies:
'@dprint/formatter': 0.5.1 '@dprint/formatter': 0.5.1
'@dprint/markdown': 0.20.0 '@dprint/markdown': 0.20.0
@@ -8741,13 +8741,13 @@ snapshots:
prettier: 3.8.1 prettier: 3.8.1
synckit: 0.11.12 synckit: 0.11.12
eslint-plugin-react-dom@2.9.4(eslint@10.0.0(jiti@2.6.1))(typescript@5.9.3): eslint-plugin-react-dom@2.12.2(eslint@10.0.0(jiti@2.6.1))(typescript@5.9.3):
dependencies: dependencies:
'@eslint-react/ast': 2.9.4(eslint@10.0.0(jiti@2.6.1))(typescript@5.9.3) '@eslint-react/ast': 2.12.2(eslint@10.0.0(jiti@2.6.1))(typescript@5.9.3)
'@eslint-react/core': 2.9.4(eslint@10.0.0(jiti@2.6.1))(typescript@5.9.3) '@eslint-react/core': 2.12.2(eslint@10.0.0(jiti@2.6.1))(typescript@5.9.3)
'@eslint-react/eff': 2.9.4 '@eslint-react/eff': 2.12.2
'@eslint-react/shared': 2.9.4(eslint@10.0.0(jiti@2.6.1))(typescript@5.9.3) '@eslint-react/shared': 2.12.2(eslint@10.0.0(jiti@2.6.1))(typescript@5.9.3)
'@eslint-react/var': 2.9.4(eslint@10.0.0(jiti@2.6.1))(typescript@5.9.3) '@eslint-react/var': 2.12.2(eslint@10.0.0(jiti@2.6.1))(typescript@5.9.3)
'@typescript-eslint/scope-manager': 8.54.0 '@typescript-eslint/scope-manager': 8.54.0
'@typescript-eslint/types': 8.54.0 '@typescript-eslint/types': 8.54.0
'@typescript-eslint/utils': 8.54.0(eslint@10.0.0(jiti@2.6.1))(typescript@5.9.3) '@typescript-eslint/utils': 8.54.0(eslint@10.0.0(jiti@2.6.1))(typescript@5.9.3)
@@ -8758,13 +8758,13 @@ snapshots:
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
eslint-plugin-react-hooks-extra@2.9.4(eslint@10.0.0(jiti@2.6.1))(typescript@5.9.3): eslint-plugin-react-hooks-extra@2.12.2(eslint@10.0.0(jiti@2.6.1))(typescript@5.9.3):
dependencies: dependencies:
'@eslint-react/ast': 2.9.4(eslint@10.0.0(jiti@2.6.1))(typescript@5.9.3) '@eslint-react/ast': 2.12.2(eslint@10.0.0(jiti@2.6.1))(typescript@5.9.3)
'@eslint-react/core': 2.9.4(eslint@10.0.0(jiti@2.6.1))(typescript@5.9.3) '@eslint-react/core': 2.12.2(eslint@10.0.0(jiti@2.6.1))(typescript@5.9.3)
'@eslint-react/eff': 2.9.4 '@eslint-react/eff': 2.12.2
'@eslint-react/shared': 2.9.4(eslint@10.0.0(jiti@2.6.1))(typescript@5.9.3) '@eslint-react/shared': 2.12.2(eslint@10.0.0(jiti@2.6.1))(typescript@5.9.3)
'@eslint-react/var': 2.9.4(eslint@10.0.0(jiti@2.6.1))(typescript@5.9.3) '@eslint-react/var': 2.12.2(eslint@10.0.0(jiti@2.6.1))(typescript@5.9.3)
'@typescript-eslint/scope-manager': 8.54.0 '@typescript-eslint/scope-manager': 8.54.0
'@typescript-eslint/type-utils': 8.54.0(eslint@10.0.0(jiti@2.6.1))(typescript@5.9.3) '@typescript-eslint/type-utils': 8.54.0(eslint@10.0.0(jiti@2.6.1))(typescript@5.9.3)
'@typescript-eslint/types': 8.54.0 '@typescript-eslint/types': 8.54.0
@@ -8786,13 +8786,13 @@ snapshots:
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
eslint-plugin-react-naming-convention@2.9.4(eslint@10.0.0(jiti@2.6.1))(typescript@5.9.3): eslint-plugin-react-naming-convention@2.12.2(eslint@10.0.0(jiti@2.6.1))(typescript@5.9.3):
dependencies: dependencies:
'@eslint-react/ast': 2.9.4(eslint@10.0.0(jiti@2.6.1))(typescript@5.9.3) '@eslint-react/ast': 2.12.2(eslint@10.0.0(jiti@2.6.1))(typescript@5.9.3)
'@eslint-react/core': 2.9.4(eslint@10.0.0(jiti@2.6.1))(typescript@5.9.3) '@eslint-react/core': 2.12.2(eslint@10.0.0(jiti@2.6.1))(typescript@5.9.3)
'@eslint-react/eff': 2.9.4 '@eslint-react/eff': 2.12.2
'@eslint-react/shared': 2.9.4(eslint@10.0.0(jiti@2.6.1))(typescript@5.9.3) '@eslint-react/shared': 2.12.2(eslint@10.0.0(jiti@2.6.1))(typescript@5.9.3)
'@eslint-react/var': 2.9.4(eslint@10.0.0(jiti@2.6.1))(typescript@5.9.3) '@eslint-react/var': 2.12.2(eslint@10.0.0(jiti@2.6.1))(typescript@5.9.3)
'@typescript-eslint/scope-manager': 8.54.0 '@typescript-eslint/scope-manager': 8.54.0
'@typescript-eslint/type-utils': 8.54.0(eslint@10.0.0(jiti@2.6.1))(typescript@5.9.3) '@typescript-eslint/type-utils': 8.54.0(eslint@10.0.0(jiti@2.6.1))(typescript@5.9.3)
'@typescript-eslint/types': 8.54.0 '@typescript-eslint/types': 8.54.0
@@ -8809,11 +8809,11 @@ snapshots:
dependencies: dependencies:
eslint: 10.0.0(jiti@2.6.1) eslint: 10.0.0(jiti@2.6.1)
eslint-plugin-react-rsc@2.9.4(eslint@10.0.0(jiti@2.6.1))(typescript@5.9.3): eslint-plugin-react-rsc@2.12.2(eslint@10.0.0(jiti@2.6.1))(typescript@5.9.3):
dependencies: dependencies:
'@eslint-react/ast': 2.9.4(eslint@10.0.0(jiti@2.6.1))(typescript@5.9.3) '@eslint-react/ast': 2.12.2(eslint@10.0.0(jiti@2.6.1))(typescript@5.9.3)
'@eslint-react/shared': 2.9.4(eslint@10.0.0(jiti@2.6.1))(typescript@5.9.3) '@eslint-react/shared': 2.12.2(eslint@10.0.0(jiti@2.6.1))(typescript@5.9.3)
'@eslint-react/var': 2.9.4(eslint@10.0.0(jiti@2.6.1))(typescript@5.9.3) '@eslint-react/var': 2.12.2(eslint@10.0.0(jiti@2.6.1))(typescript@5.9.3)
'@typescript-eslint/types': 8.54.0 '@typescript-eslint/types': 8.54.0
'@typescript-eslint/utils': 8.54.0(eslint@10.0.0(jiti@2.6.1))(typescript@5.9.3) '@typescript-eslint/utils': 8.54.0(eslint@10.0.0(jiti@2.6.1))(typescript@5.9.3)
eslint: 10.0.0(jiti@2.6.1) eslint: 10.0.0(jiti@2.6.1)
@@ -8822,13 +8822,13 @@ snapshots:
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
eslint-plugin-react-web-api@2.9.4(eslint@10.0.0(jiti@2.6.1))(typescript@5.9.3): eslint-plugin-react-web-api@2.12.2(eslint@10.0.0(jiti@2.6.1))(typescript@5.9.3):
dependencies: dependencies:
'@eslint-react/ast': 2.9.4(eslint@10.0.0(jiti@2.6.1))(typescript@5.9.3) '@eslint-react/ast': 2.12.2(eslint@10.0.0(jiti@2.6.1))(typescript@5.9.3)
'@eslint-react/core': 2.9.4(eslint@10.0.0(jiti@2.6.1))(typescript@5.9.3) '@eslint-react/core': 2.12.2(eslint@10.0.0(jiti@2.6.1))(typescript@5.9.3)
'@eslint-react/eff': 2.9.4 '@eslint-react/eff': 2.12.2
'@eslint-react/shared': 2.9.4(eslint@10.0.0(jiti@2.6.1))(typescript@5.9.3) '@eslint-react/shared': 2.12.2(eslint@10.0.0(jiti@2.6.1))(typescript@5.9.3)
'@eslint-react/var': 2.9.4(eslint@10.0.0(jiti@2.6.1))(typescript@5.9.3) '@eslint-react/var': 2.12.2(eslint@10.0.0(jiti@2.6.1))(typescript@5.9.3)
'@typescript-eslint/scope-manager': 8.54.0 '@typescript-eslint/scope-manager': 8.54.0
'@typescript-eslint/types': 8.54.0 '@typescript-eslint/types': 8.54.0
'@typescript-eslint/utils': 8.54.0(eslint@10.0.0(jiti@2.6.1))(typescript@5.9.3) '@typescript-eslint/utils': 8.54.0(eslint@10.0.0(jiti@2.6.1))(typescript@5.9.3)
@@ -8839,13 +8839,13 @@ snapshots:
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
eslint-plugin-react-x@2.9.4(eslint@10.0.0(jiti@2.6.1))(typescript@5.9.3): eslint-plugin-react-x@2.12.2(eslint@10.0.0(jiti@2.6.1))(typescript@5.9.3):
dependencies: dependencies:
'@eslint-react/ast': 2.9.4(eslint@10.0.0(jiti@2.6.1))(typescript@5.9.3) '@eslint-react/ast': 2.12.2(eslint@10.0.0(jiti@2.6.1))(typescript@5.9.3)
'@eslint-react/core': 2.9.4(eslint@10.0.0(jiti@2.6.1))(typescript@5.9.3) '@eslint-react/core': 2.12.2(eslint@10.0.0(jiti@2.6.1))(typescript@5.9.3)
'@eslint-react/eff': 2.9.4 '@eslint-react/eff': 2.12.2
'@eslint-react/shared': 2.9.4(eslint@10.0.0(jiti@2.6.1))(typescript@5.9.3) '@eslint-react/shared': 2.12.2(eslint@10.0.0(jiti@2.6.1))(typescript@5.9.3)
'@eslint-react/var': 2.9.4(eslint@10.0.0(jiti@2.6.1))(typescript@5.9.3) '@eslint-react/var': 2.12.2(eslint@10.0.0(jiti@2.6.1))(typescript@5.9.3)
'@typescript-eslint/scope-manager': 8.54.0 '@typescript-eslint/scope-manager': 8.54.0
'@typescript-eslint/type-utils': 8.54.0(eslint@10.0.0(jiti@2.6.1))(typescript@5.9.3) '@typescript-eslint/type-utils': 8.54.0(eslint@10.0.0(jiti@2.6.1))(typescript@5.9.3)
'@typescript-eslint/types': 8.54.0 '@typescript-eslint/types': 8.54.0
@@ -9084,9 +9084,9 @@ snapshots:
fraction.js@5.3.4: {} fraction.js@5.3.4: {}
framer-motion@12.31.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4): framer-motion@12.33.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4):
dependencies: dependencies:
motion-dom: 12.30.1 motion-dom: 12.33.0
motion-utils: 12.29.2 motion-utils: 12.29.2
tslib: 2.8.1 tslib: 2.8.1
optionalDependencies: optionalDependencies:
@@ -10214,15 +10214,15 @@ snapshots:
morphdom@2.7.8: {} morphdom@2.7.8: {}
motion-dom@12.30.1: motion-dom@12.33.0:
dependencies: dependencies:
motion-utils: 12.29.2 motion-utils: 12.29.2
motion-utils@12.29.2: {} motion-utils@12.29.2: {}
motion@12.31.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4): motion@12.33.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4):
dependencies: dependencies:
framer-motion: 12.31.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4) framer-motion: 12.33.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
tslib: 2.8.1 tslib: 2.8.1
optionalDependencies: optionalDependencies:
react: 19.2.4 react: 19.2.4

View File

@@ -15,11 +15,12 @@ const borderClasses = 'border border-neutral-100 dark:border-stone-500/20';
const bgColorClasses = const bgColorClasses =
'bg-neutral-100/80 hover:bg-neutral-100 dark:bg-neutral-800/60 dark:hover:bg-neutral-800/90'; 'bg-neutral-100/80 hover:bg-neutral-100 dark:bg-neutral-800/60 dark:hover:bg-neutral-800/90';
const shadowClasses = 'shadow-xs hover:shadow-md dark:shadow-md dark:hover:shadow-lg'; const shadowClasses = 'shadow-xs hover:shadow-md dark:shadow-md dark:hover:shadow-lg';
const sizeClasses = 'h-30 w-100 md:w-[300px]';
--- ---
<div class={`${baseClasses}`}> <div class={`${baseClasses}`}>
<a <a
class={`rounded-xl duration-300 transition-all h-30 ${borderClasses} ${bgColorClasses} ${shadowClasses}`} class={`rounded-xl duration-300 transition-all ${sizeClasses} ${borderClasses} ${bgColorClasses} ${shadowClasses}`}
href={url} href={url}
data-astro-prefetch data-astro-prefetch
> >

View File

@@ -0,0 +1,8 @@
---
import Image from '@components/ui/images/Image.astro';
const { src, alt } = Astro.props;
---
<Image src={src} alt={alt} style="color: transparent; width: 32px; height: 32px; object-fit: contain; max-height: 100%; max-width: 100%;" draggable="false" loading="lazy" width="32" height="32" />

View File

@@ -0,0 +1,58 @@
---
import { readItems } from '@directus/sdk';
import ApplicationLogo from '@components/ui/logos/ApplicationLogo.astro';
import type { Application } from '@lib/directusTypes';
import directus from '@lib/directus';
const applications = await directus.request(
readItems('site_applications', {
fields: ['*'],
sort: ['-isActive'],
})
);
const baseClasses = 'smooth-reveal-cards rounded-xl flex flex-col';
const borderClasses = 'border border-neutral-100 dark:border-stone-500/20';
const bgColorClasses =
'bg-neutral-100/80 hover:bg-neutral-100 dark:bg-neutral-800/60 dark:hover:bg-neutral-800/90';
const shadowClasses = 'shadow-xs hover:shadow-md dark:shadow-md dark:hover:shadow-lg';
---
<section class:list={['flex flex-col gap-4', Astro.props.className]}>
<div class="grid grid-cols-1 gap-3 md:grid-cols-2 print:flex print:flex-col">
{
applications.map((application: Application) => {
return (
<div class={`${baseClasses}`}>
<a
class={`rounded-xl transition-all duration-300 ${borderClasses} ${bgColorClasses} ${shadowClasses}`}
href={application.url}
>
<div class="p-4 md:p-10">
<div class="flex">
<ApplicationLogo
src={application.logoUrl}
alt={`Logo of ${application.name}`}
/>
<h3 class="text-lg font-bold text-gray-800 dark:text-white ml-4">
{application.name}
</h3>
</div>
<p class="mt-2 text-gray-500 dark:text-neutral-400">{application.description}</p>
<ul class="mt-1 flex list-disc flex-col gap-2 text-sm text-gray-500 dark:text-neutral-400 [&>li]:ml-4">
{application.highlights.map((highlight) => {
return <li class="marker:text-yellow-500">{highlight}</li>;
})}
</ul>
<div class="flex">
</div>
</div>
</a>
</div>
);
})
}
</div>
</section>

View File

@@ -7,12 +7,12 @@ import FeaturesCard from '@components/ui/cards/FeaturesCard.astro';
const global = await directus.request(readSingleton('site_global')); const global = await directus.request(readSingleton('site_global'));
--- ---
<section class="mx-auto mb-20 max-w-[85rem] px-4 py-10 sm:px-6 lg:px-8 lg:py-14 2xl:max-w-full"> <section class="mx-auto mb-20 max-w-340 px-4 py-10 sm:px-6 lg:px-8 lg:py-14 2xl:max-w-full">
<div <div
class="flex flex-col items-center justify-center gap-y-2 sm:flex-row sm:gap-x-12 sm:gap-y-0 lg:gap-x-24" class="flex flex-col items-center justify-center gap-y-2 sm:flex-row sm:gap-x-12 sm:gap-y-0 lg:gap-x-24"
> >
<div class="mx-auto max-w-5xl px-4 sm:px-6 lg:px-8"> <div class="max-w-5xl sm:px-6 lg:px-8">
<div class="grid gap-3 sm:grid-cols-2 sm:gap-6 lg:grid-cols-3"> <div class="flex flex-wrap gap-6 sm:grid-cols-2 sm:gap-6 lg:grid-cols-3 justify-center">
<FeaturesCard <FeaturesCard
title="Cloud Engineer" title="Cloud Engineer"
description="Full stack and cloud engineer." description="Full stack and cloud engineer."
@@ -25,6 +25,12 @@ const global = await directus.request(readSingleton('site_global'));
url="/categories/homelab/" url="/categories/homelab/"
icon="mdi:home-variant-outline" icon="mdi:home-variant-outline"
/> />
<FeaturesCard
title="Documentation"
description="Reference and guides for my homelab."
url="https://docs.alexlebens.dev"
icon="mdi:file-document-multiple"
/>
<FeaturesCard <FeaturesCard
title="Email" title="Email"
description={`Send me a message.`} description={`Send me a message.`}

View File

@@ -13,13 +13,14 @@ export const NavigationLinks: NavigationLink[] = [
{ name: 'Home', url: '/' }, { name: 'Home', url: '/' },
{ name: 'Blog', url: '/blog/' }, { name: 'Blog', url: '/blog/' },
{ name: 'Categories', url: '/categories/' }, { name: 'Categories', url: '/categories/' },
{ name: 'Apps', url: '/apps/' },
{ name: 'About Me', url: '/about/' }, { name: 'About Me', url: '/about/' },
]; ];
export const FooterLinks: NavigationLink[] = [ export const FooterLinks: NavigationLink[] = [
{ name: 'RSS', url: '/rss.xml' }, { name: 'RSS', url: '/rss.xml' },
{ name: 'Gitea', url: '/https://gitea.alexlebens.dev' }, { name: 'Gitea', url: 'https://gitea.alexlebens.dev' },
{ name: 'Docs', url: '/https://docs.alexlebens.dev' }, { name: 'Docs', url: 'https://docs.alexlebens.dev' },
]; ];
export const SEO = { export const SEO = {

BIN
src/images/cedar_tree.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.5 MiB

View File

@@ -3,6 +3,7 @@ import { createDirectus, rest } from '@directus/sdk';
import type { import type {
Global, Global,
Post, Post,
Application,
Experience, Experience,
Education, Education,
Certificate, Certificate,
@@ -15,6 +16,7 @@ import { getDirectusURL } from '@lib/directusFunctions';
type Schema = { type Schema = {
site_global: Global; site_global: Global;
posts: Post[]; posts: Post[];
site_applications: Application;
site_experience: Experience; site_experience: Experience;
site_education: Education; site_education: Education;
site_certificate: Certificate; site_certificate: Certificate;

View File

@@ -2,7 +2,7 @@ const getDirectusURL = () => {
if (process.env.DIRECTUS_URL) { if (process.env.DIRECTUS_URL) {
return `https://${process.env.DIRECTUS_URL}`; return `https://${process.env.DIRECTUS_URL}`;
} }
return 'https://directus.alexlebens.dev'; return 'https://directus.alexlebens.net';
}; };
async function getDirectusImageURL(image: string) { async function getDirectusImageURL(image: string) {

View File

@@ -3,6 +3,7 @@ export type Global = {
about: string; about: string;
about_description: string; about_description: string;
about_blog: string; about_blog: string;
about_applications: string;
about_categories: string; about_categories: string;
initials: string; initials: string;
email: string; email: string;
@@ -12,10 +13,12 @@ export type Global = {
portrait_alt: string; portrait_alt: string;
home_image: string; home_image: string;
home_image_alt: string; home_image_alt: string;
categories_image: string;
categories_image_alt: string;
blog_image: string; blog_image: string;
blog_image_alt: string; blog_image_alt: string;
categories_image: string;
categories_image_alt: string;
applications_image: string;
applications_image_alt: string;
footer_image: string; footer_image: string;
footer_image_alt: string; footer_image_alt: string;
}; };
@@ -37,6 +40,16 @@ export type Post = {
updated_date: Date; updated_date: Date;
}; };
export type Application = {
id: string;
name: string;
isActive: boolean;
description: string;
highlights: string[];
url: string;
logoUrl: string;
};
export type Experience = { export type Experience = {
id: string; id: string;
name: string; name: string;

66
src/pages/apps.astro Normal file
View File

@@ -0,0 +1,66 @@
---
import { readSingleton } from '@directus/sdk';
import directus from '@lib/directus';
import BaseLayout from '@layouts/BaseLayout.astro';
import HeroSection from '@components/ui/sections/HeroSection.astro';
import Applications from '@components/ui/sections/Applications.astro';
import applicationImg from '@images/cedar_tree.png';
const global = await directus.request(readSingleton('site_global'));
---
<BaseLayout
title="Applications"
description={global.about_applications}
structuredData={{
'@context': 'https://schema.org',
'@type': 'WebPage',
inLanguage: 'en-US',
'@id': Astro.url.href,
url: Astro.url.href,
name: `Applications | ${global.name}`,
description: global.about_applications,
isPartOf: {
'@type': 'WebSite',
url: global.site_url,
name: global.name,
description: global.about,
},
}}
>
<HeroSection
title="Applications"
subTitle={global.about_applications}
src={applicationImg}
alt={global.applications_image_alt}
/>
<section class="mx-auto max-w-340 px-4 sm:px-6 lg:px-8 lg:py-14 pb-10">
<main class="relative grid grid-cols-1 md:grid-cols-6 gap-12 p-2 md:p-16 xl:gap-24 max-w-7xl mx-auto">
<div class="space-y-12 col-span-1 md:col-span-6">
<Applications className="smooth-reveal-2" />
</div>
</main>
</section>
</BaseLayout>
<script>
// Add smooth reveal animations for content after loading
document.addEventListener('astro:page-load', () => {
const animateContent = () => {
// Animate group 1
const smoothReveal = document.querySelectorAll('.smooth-reveal');
smoothReveal.forEach((el, index) => {
setTimeout(
() => {
el.classList.add('animate-reveal');
},
50 + index * 100
);
});
};
animateContent();
});
</script>

View File

@@ -145,7 +145,7 @@ const content = marked.parse(post.content);
</div> </div>
<article <article
class="prose prose-blog sm:prose-lg dark:prose-invert max-w-none text-justify text-neutral-800 dark:text-neutral-200" class="prose prose-blog sm:prose-lg dark:prose-invert max-w-none text-neutral-800 dark:text-neutral-200"
> >
<div set:html={content} /> <div set:html={content} />
</article> </article>