Compare commits

..

10 Commits

Author SHA1 Message Date
semantic-release-bot
505f8d6a36 chore(release): 3.7.0 [skip ci]
# [3.7.0](https://gitea.alexlebens.dev/alexlebens/site-profile/compare/3.6.0...3.7.0) (2026-03-12)

### Bug Fixes

* incorrect name of step ([db79f91](db79f912ee))
* use semantic release outputs ([578e166](578e1661cd))

### Features

* add automation to release using release-please in workflows ([99032f7](99032f7a62))
* add if to ignore harbor release result ([ce75e7c](ce75e7ca5e))
* add outputs of semantic release ([36eaa0c](36eaa0c132))
* add release branch, update and merge release workflow ([68f2080](68f2080bda))
* add semantic release ([620b496](620b496957))
* add token ([e0a3d39](e0a3d391b3))
* change release format ([24c837c](24c837cf84))
* ignore on docs updates ([4b58117](4b58117454))
* install deps ([f32b75e](f32b75e31d))
* remove old release workflows ([7882c3e](7882c3ecc7))
* remove release-please ([07fa86b](07fa86b17c))
* setup node for semantic release ([bf3a7ef](bf3a7ef261))
* use different workflow for gitea ([1577ee4](1577ee4c27))
2026-03-12 20:09:59 +00:00
26a2a9dc96 Merge pull request 'fix: use semantic release outputs' (#382) from main into release
All checks were successful
release-image / semantic-release (push) Successful in 1m47s
release-image / guarddog (push) Successful in 1m21s
release-image / build (push) Successful in 3m47s
release-image / release-harbor (push) Successful in 12m42s
release-image / release-gitea (push) Successful in 6m52s
Reviewed-on: #382
2026-03-12 20:08:51 +00:00
semantic-release-bot
3e2e9196a2 chore(release): 3.7.0 [skip ci]
# [3.7.0](https://gitea.alexlebens.dev/alexlebens/site-profile/compare/3.6.0...3.7.0) (2026-03-12)

### Bug Fixes

* incorrect name of step ([db79f91](db79f912ee))

### Features

* add automation to release using release-please in workflows ([99032f7](99032f7a62))
* add if to ignore harbor release result ([ce75e7c](ce75e7ca5e))
* add outputs of semantic release ([36eaa0c](36eaa0c132))
* add release branch, update and merge release workflow ([68f2080](68f2080bda))
* add semantic release ([620b496](620b496957))
* add token ([e0a3d39](e0a3d391b3))
* change release format ([24c837c](24c837cf84))
* ignore on docs updates ([4b58117](4b58117454))
* install deps ([f32b75e](f32b75e31d))
* remove old release workflows ([7882c3e](7882c3ecc7))
* remove release-please ([07fa86b](07fa86b17c))
* setup node for semantic release ([bf3a7ef](bf3a7ef261))
* use different workflow for gitea ([1577ee4](1577ee4c27))
2026-03-12 19:45:09 +00:00
338accdd22 Merge pull request 'Release' (#381) from main into release
All checks were successful
release-image / semantic-release (push) Successful in 1m24s
release-image / guarddog (push) Successful in 16s
release-image / build (push) Successful in 2m5s
release-image / release-harbor (push) Successful in 6m15s
release-image / release-gitea (push) Successful in 4m56s
Reviewed-on: #381
2026-03-12 19:44:08 +00:00
semantic-release-bot
e165c5fea0 chore(release): 3.7.0 [skip ci]
# [3.7.0](https://gitea.alexlebens.dev/alexlebens/site-profile/compare/3.6.0...3.7.0) (2026-03-12)

### Features

* add automation to release using release-please in workflows ([99032f7](99032f7a62))
* add if to ignore harbor release result ([ce75e7c](ce75e7ca5e))
* add outputs of semantic release ([36eaa0c](36eaa0c132))
* add release branch, update and merge release workflow ([68f2080](68f2080bda))
* add semantic release ([620b496](620b496957))
* add token ([e0a3d39](e0a3d391b3))
* change release format ([24c837c](24c837cf84))
* ignore on docs updates ([4b58117](4b58117454))
* install deps ([f32b75e](f32b75e31d))
* remove release-please ([07fa86b](07fa86b17c))
* setup node for semantic release ([bf3a7ef](bf3a7ef261))
* use different workflow for gitea ([1577ee4](1577ee4c27))
2026-03-12 19:36:52 +00:00
8e32c5aaff Merge pull request 'Release' (#380) from main into release
All checks were successful
release-image / semantic-release (push) Successful in 1m38s
release-image / build (push) Has been skipped
release-image / guarddog (push) Has been skipped
release-image / release-harbor (push) Has been skipped
release-image / release-gitea (push) Has been skipped
Reviewed-on: #380
2026-03-12 19:35:47 +00:00
semantic-release-bot
420b971044 chore(release): 1.0.0 [skip ci]
# 1.0.0 (2026-03-12)

### Bug Fixes

* add comments ([a0f83c8](a0f83c874c))
* add env ([ea9ae01](ea9ae016d7))
* add paths ([976bc0c](976bc0c413))
* add remote patterns for images ([ba73c1b](ba73c1b24f))
* change selected count ([fe38992](fe3899242a))
* clean up comments ([4d7886b](4d7886b93c))
* command order ([0a2979e](0a2979ecfe))
* correct credentials ([1a34b93](1a34b932b0))
* correct matchhost ([882063e](882063ea43))
* create new Date to compare posts ([01ee8fa](01ee8fac98))
* debug logs ([8d5c02e](8d5c02e2d1))
* **deps:** update astro monorepo ([ef810ef](ef810efd24))
* **deps:** update dependency shiki to v4 ([da28e5b](da28e5b50e))
* downgrade python ([7a77f0d](7a77f0d2d2))
* fix footer accent color ([9eb0f37](9eb0f37cb2))
* fix lint error ([4c4421c](4c4421c8a8))
* force 3d scaling for button transform ([959d3bd](959d3bd71d))
* hidden button background color on light mode, darken ([0d87af3](0d87af3aca))
* info logs ([c927235](c927235a5a))
* install and run ([e29631c](e29631c4af))
* move host rules to workflow ([ba2477e](ba2477e7af))
* only binary ([31aad55](31aad5511f))
* padding, margin, and width issues ([6d3f3a4](6d3f3a49ab))
* path ([d9833e1](d9833e1c27))
* remove argument ([093e1e2](093e1e2ccb))
* remove border from blog cards ([875b8a7](875b8a7f47))
* remove description ([c2bf64c](c2bf64c6cc))
* remove errant semicolon ([1ddc76a](1ddc76ae69))
* remove unused property ([3d9120c](3d9120c570))
* run theme on page swap ([c4be465](c4be4653be))
* update lock ([fb8f642](fb8f642c52))
* use uvx ([c3e4519](c3e4519682))

### Features

* add additional layout for small screens ([890dbdf](890dbdf313))
* add an all page with cards to link to it ([7327795](7327795d39))
* add applications page ([9678b3c](9678b3c718))
* add automation to release using release-please in workflows ([99032f7](99032f7a62))
* add background shimmer effect, use mask for content scroll fade ([5e37e2b](5e37e2bb53))
* add category logo to blog page ([5b94283](5b94283498))
* add client:load ([ceb70c7](ceb70c7049))
* add creds for dhi ([8797864](879786484d))
* add dark mode logo ([f984a1f](f984a1f759))
* add dark mode swap to logo ([97b1fa0](97b1fa0316))
* add dates to selected ([091af90](091af909d4))
* add docker login ([a8d6446](a8d6446674))
* add docs link to footer ([22860c4](22860c4714))
* add gap to distinguish ([f030da5](f030da549e))
* add gap to header above md ([d3b2b40](d3b2b40ccb))
* add guarddog scan to workflow ([14f7bdc](14f7bdc024))
* add if to ignore harbor release result ([ce75e7c](ce75e7ca5e))
* add logos to category cards ([4c1da43](4c1da43c68))
* add logos to category header pages ([d7d4336](d7d43369dc))
* add margin to bring in the content ([fa618b0](fa618b0524))
* add photoswipe to view images embeded in posts ([ae57c60](ae57c60935))
* add release branch, update and merge release workflow ([68f2080](68f2080bda))
* add rounded option to hero component and use it for about page ([95432d9](95432d9059))
* add rybbit tracking ([efad6c3](efad6c30d1))
* add scroll reset on navigation ([07c7ede](07c7edeb0f))
* add security feature ([a7e7e5b](a7e7e5b0e8))
* add semantic release ([620b496](620b496957))
* add shiki to markdown rendering for code highlighting ([b7f76c5](b7f76c5847))
* add thanks for Icons8 ([6cddae6](6cddae61ed))
* add token ([e0a3d39](e0a3d391b3))
* add weather widget ([b6dfc73](b6dfc738f1))
* adjust height of fade effect ([7498870](7498870d92))
* adjust layout of recent posts ([568220d](568220d39c))
* adjustment pass on spacing between sections ([b3c377f](b3c377f62d))
* better reactive layout for small screen sizes ([56d841a](56d841a335))
* change cache path ([30b2e98](30b2e980c0))
* change responsive height of image ([e25a3d0](e25a3d0189))
* change selected blogs to switch to card form on small screens ([44bd1e4](44bd1e4810))
* consistent gaps and margins ([05d7ad6](05d7ad6557))
* convert hero section to use randomly selected images stored in directus ([c9cb15f](c9cb15f201))
* convert to bun ([1f2820e](1f2820e4b4))
* disable ([1573331](1573331f87))
* disable security feature ([04dfecc](04dfecc099))
* enable cache ([16e14f6](16e14f63ef))
* enable guarddog ([19e8080](19e80809c1))
* enable security feature ([0434480](04344808bd))
* final refactor of sections ([a74cc77](a74cc775d0))
* hide cards on small screens ([e2f5bbb](e2f5bbbe9c))
* ignore on docs updates ([4b58117](4b58117454))
* imporve theme toggle button ([a09a4ee](a09a4ee240))
* imporvement pass over sections ([8a649b7](8a649b7647))
* improve behavior of showmore, fix alignment ([7f2a272](7f2a27248a))
* improve layout for single and two images ([e6d4e34](e6d4e34a0a))
* improve logos and clickability of cards on about and apps ([63cbcdf](63cbcdf39b))
* improve navbar, add opacity fade beneath, layout, and refactor ([5ac23f0](5ac23f08a4))
* install deps ([f32b75e](f32b75e31d))
* major refactor of cards to standardize styles ([104fe35](104fe35ee8))
* make cards fixed height ([9dfcf6f](9dfcf6f006))
* make weather fetching dynamic ([7f7f710](7f7f710fe8))
* markdown support for rss ([6156012](6156012c00))
* minor tweaks ([d42ba08](d42ba08041))
* move all categories card to bottom of category section ([2fbc9a7](2fbc9a764f))
* move all posts to bottom of recent section ([940342c](940342cc3f))
* move categories to directus ([93bf44f](93bf44f89a))
* move directus to local endpoint ([197ad63](197ad63ada))
* move improved components out of ui folder ([47a6373](47a637353c))
* move post metadata to snippet component ([cc8bade](cc8bade886))
* move url configuration to support file ([6f1728a](6f1728a909))
* organize footer to consistency ([c6f3179](c6f3179efb))
* organize layout to consistency ([8270728](8270728e8f))
* organize to consistency ([21085a1](21085a1620))
* organize to consistency ([62dd636](62dd636d4e))
* organize to consistency ([0497731](0497731c45))
* organize to consistency ([6c2c6da](6c2c6da91d))
* organize to consistency pass on sections ([429cf94](429cf94023))
* redo how images, icons, and logos are handled ([76dfef4](76dfef4177))
* redo layout, smaller and with logo ([3414535](341453510f))
* reduce scale effect ([b8379bb](b8379bbc38))
* refactor blog components ([6423ffb](6423ffba63))
* refactor buttons, except for theme ([342ae89](342ae8900a))
* refactor how blog cards layout, add metadata, better responsiveness ([265fd4f](265fd4f2cb))
* refactor pass along pages ([e52d85f](e52d85f931))
* release 2.10.0 ([fcd3057](fcd3057f40))
* release 2.10.1 ([2cdef1a](2cdef1a553))
* release 2.11.0 ([440c952](440c95224d))
* release 2.12.0 ([1a8473b](1a8473b964))
* release 2.13.0 ([2c9486f](2c9486f687))
* release 2.13.1 ([db2711d](db2711d878))
* release 2.14.0 ([0416ab7](0416ab7f9e))
* release 2.14.1 ([d415dda](d415dda661))
* release 2.15.0 ([f3b8d10](f3b8d10106))
* release 2.15.1 ([c5cda00](c5cda006bb))
* release 2.16.0 ([c69eb58](c69eb58a49))
* release 2.17.0 ([d19433a](d19433ae4e))
* release 2.17.1 ([cc5e975](cc5e975ea6))
* release 2.17.2 ([469d9ba](469d9ba3f7))
* release 2.18.0 ([ddbcb33](ddbcb33812))
* release 2.18.1 ([62066c6](62066c6f3b))
* release 2.19.0 ([6ddc382](6ddc382dac))
* release 2.19.1 ([f4676d1](f4676d151f))
* release 2.20.0 ([2c20770](2c2077053b))
* release 2.20.1 ([95ea235](95ea235f9f))
* release 2.21.0 ([89fd0eb](89fd0eb7ce))
* release 2.22.0 ([8b07837](8b07837c0d))
* release 2.23.0 ([50f050c](50f050c0b6))
* release 2.24.0 ([ce9c9c3](ce9c9c3857))
* release 2.25.0 ([e91ffd8](e91ffd8686))
* release 2.3.0 ([bf73905](bf73905658))
* release 2.3.2 ([49969e2](49969e27b0))
* release 2.4.0 ([d0ff16c](d0ff16c8dc))
* release 2.5.0 ([880bafd](880bafd41e))
* release 2.6.0 ([3f5682f](3f5682f80c))
* release 2.7.0 ([00ef91b](00ef91b644))
* release 2.8.0 ([a57f43e](a57f43e082))
* release 2.9.0 ([0f403fa](0f403fa274))
* release 3.0.0, major astro update to 6.0 ([962f354](962f354208))
* release 3.2.0 ([ec10d45](ec10d45fd0))
* release 3.3.0 ([8184d42](8184d42942))
* release 3.5.0 ([6ec2734](6ec27345c3))
* release 3.6.0 ([03f74a8](03f74a8181))
* remove emoji ([734e9ca](734e9cacae))
* remove extra spacing ([5877086](5877086cc3))
* remove hardcoded descriptions ([754f6a2](754f6a22f0))
* remove hardcoded descriptions ([c7d3ca7](c7d3ca7252))
* remove mdx ([4203b63](4203b63893))
* remove option ([19e17ea](19e17ea947))
* remove partytown int ([b55c3a0](b55c3a0e31))
* remove partytown int ([e63abf0](e63abf03ef))
* remove release-please ([07fa86b](07fa86b17c))
* remove security feature ([5e02443](5e02443409))
* remove static robots ([4dbc5d1](4dbc5d12a3))
* remove text-justify from content ([a45a4d7](a45a4d7dd7))
* remove unused files ([00a86b1](00a86b1206))
* remove unused packages ([505670d](505670dbf8))
* remove unused properties ([0a17e3b](0a17e3b8af))
* rename button components to include button in name for consistency ([5271be5](5271be52a2))
* reorganize blog layout ([1f3fed9](1f3fed93a1))
* replace timeago with dayjs ([405fdf2](405fdf297c))
* responsive for small screen ([5b6b6e4](5b6b6e479f))
* reword titles and descriptions ([68f1794](68f179456a))
* scale logos ([0fc359a](0fc359a973))
* setup node ([113f42c](113f42ca21))
* setup node for semantic release ([bf3a7ef](bf3a7ef261))
* shorten transition time ([3eae720](3eae720221))
* simplify layout of the features cards ([31621e4](31621e4f7e))
* slight optimization ([fe6604a](fe6604a5d9))
* tweak to gradient ([20d8c73](20d8c7323f))
* tweaks to background to be more pastel ([ea15224](ea15224eae))
* update BaseHead ([18211ad](18211ad485))
* update features ([7fafa5c](7fafa5c4cf))
* update layout's width ([6fca640](6fca640fd8))
* update robots.txt ([744e72e](744e72efc9))
* update workflow to major version ([dc08830](dc088306ce))
* use different workflow for gitea ([1577ee4](1577ee4c27))
* use hardened image ([d464f0f](d464f0fe43))
* use latest alpine ([e476efb](e476efb96b))
* use many to one relationship for categories in directus ([e7c660c](e7c660c142))
* use mask to blend content to background ([0c63c6b](0c63c6bef4))
* use masonary style layout ([8a7b6b9](8a7b6b97b7))
* use metadata snippet for blog cards ([18c2b54](18c2b54f65))
* use slate for accent ([8c5488f](8c5488fad5))

### Reverts

* release 2.2.2 ([f34f4b2](f34f4b2532))
* release 2.2.3 ([b3bb769](b3bb769c47))
* release 2.2.4 ([fde3973](fde397386c))
* release 2.2.5 ([00b63a5](00b63a5bea))
2026-03-12 19:22:30 +00:00
2c86390c7f Merge pull request 'Release' (#379) from main into release
All checks were successful
release-image / semantic-release (push) Successful in 1m26s
release-image / guarddog (push) Has been skipped
release-image / build (push) Has been skipped
release-image / release-harbor (push) Has been skipped
release-image / release-gitea (push) Has been skipped
Reviewed-on: #379
2026-03-12 19:21:33 +00:00
4bcd542e7b Merge pull request 'Release' (#378) from main into release
Some checks failed
release-image / semantic-release (push) Failing after 27s
release-image / guarddog (push) Has been skipped
release-image / build (push) Has been skipped
release-image / release-harbor (push) Has been skipped
release-image / release-gitea (push) Has been skipped
Reviewed-on: #378
2026-03-12 19:16:18 +00:00
b09e2dc849 Merge pull request 'Generate New Release' (#377) from main into release
Some checks failed
release-image / semantic-release (push) Failing after 16s
release-image / guarddog (push) Has been skipped
release-image / build (push) Has been skipped
release-image / release-harbor (push) Has been skipped
release-image / release-gitea (push) Successful in 7m15s
Reviewed-on: #377
2026-03-12 19:07:16 +00:00
47 changed files with 1173 additions and 559 deletions

View File

@@ -8,7 +8,44 @@ on:
workflow_dispatch: workflow_dispatch:
jobs: jobs:
semantic-release:
runs-on: ubuntu-js
outputs:
new-release-published: ${{ steps.semantic.outputs.new-release-published }}
new-release-version: ${{ steps.semantic.outputs.new-release-version }}
new-release-git-tag: ${{ steps.semantic.outputs.new-release-git-tag }}
steps:
- name: Checkout
uses: actions/checkout@v6
with:
fetch-depth: 0
token: ${{ secrets.BOT_TOKEN }}
- name: Set up Node
uses: actions/setup-node@v6
with:
node-version: 24.14.0
- name: Set up Bun
uses: oven-sh/setup-bun@v2
with:
bun-version: 1.3.10
- name: Install Dependencies
run: bun install --frozen-lockfile
- name: Run Semantic Release
id: semantic
env:
GITEA_TOKEN: ${{ secrets.BOT_TOKEN }}
GITHUB_TOKEN: ${{ secrets.BOT_TOKEN }}
NODE_PATH: ${{ github.workspace }}/node_modules
run: |
bun run semantic-release
build: build:
needs: semantic-release
if: ${{ needs.semantic-release.outputs.new-release-published == 'true' }}
runs-on: ubuntu-js runs-on: ubuntu-js
steps: steps:
- name: Checkout - name: Checkout
@@ -61,6 +98,8 @@ jobs:
image: true image: true
guarddog: guarddog:
needs: semantic-release
if: ${{ needs.semantic-release.outputs.new-release-published == 'true' }}
runs-on: ubuntu-js runs-on: ubuntu-js
steps: steps:
- name: Checkout - name: Checkout
@@ -97,45 +136,9 @@ jobs:
actions: '[{"action": "view", "label": "Open Gitea", "url": "https://gitea.alexlebens.dev/alexlebens/site-profile/actions?workflow=release-image.yaml", "clear": true}]' actions: '[{"action": "view", "label": "Open Gitea", "url": "https://gitea.alexlebens.dev/alexlebens/site-profile/actions?workflow=release-image.yaml", "clear": true}]'
image: true image: true
semantic-release:
needs: [ build, guarddog ]
runs-on: ubuntu-js
outputs:
new-release-published: ${{ steps.semantic.outputs.new-release-published }}
new-release-version: ${{ steps.semantic.outputs.new-release-version }}
new-release-git-tag: ${{ steps.semantic.outputs.new-release-git-tag }}
steps:
- name: Checkout
uses: actions/checkout@v6
with:
fetch-depth: 0
token: ${{ secrets.BOT_TOKEN }}
- name: Set up Node
uses: actions/setup-node@v6
with:
node-version: 24.14.0
- name: Set up Bun
uses: oven-sh/setup-bun@v2
with:
bun-version: 1.3.10
- name: Install Dependencies
run: bun install --frozen-lockfile
- name: Run Semantic Release
id: semantic
env:
GITEA_TOKEN: ${{ secrets.BOT_TOKEN }}
GITHUB_TOKEN: ${{ secrets.BOT_TOKEN }}
NODE_PATH: ${{ github.workspace }}/node_modules
run: |
bun run semantic-release
release-harbor: release-harbor:
runs-on: ubuntu-js runs-on: ubuntu-js
needs: semantic-release needs: [semantic-release, build, guarddog, ]
if: ${{ needs.semantic-release.outputs.new-release-published == 'true' }} if: ${{ needs.semantic-release.outputs.new-release-published == 'true' }}
steps: steps:
- name: Checkout - name: Checkout
@@ -237,10 +240,13 @@ jobs:
release-gitea: release-gitea:
runs-on: ubuntu-js runs-on: ubuntu-js
needs: [ semantic-release, release-harbor ] needs: [ semantic-release, build, guarddog, release-harbor ]
if: | if: |
always() && always() &&
needs.semantic-release.outputs.new-release-published == 'true' needs.semantic-release.result == 'success' &&
needs.semantic-release.outputs.new-release-published == 'true' &&
needs.build.result == 'success' &&
needs.guarddog.result == 'success'
steps: steps:
- name: Checkout - name: Checkout
uses: actions/checkout@v6 uses: actions/checkout@v6

View File

@@ -1,17 +0,0 @@
repos:
- repo: https://github.com/pre-commit/pre-commit-hooks
rev: v6.0.0
hooks:
- id: end-of-file-fixer
- id: trailing-whitespace
- id: check-merge-conflict
- id: check-json
- repo: https://github.com/pre-commit/mirrors-prettier
rev: v4.0.0-alpha.11
hooks:
- id: prettier
types_or: [javascript, typescript, css, scss, html, json, yaml, markdown]
additional_dependencies:
- prettier
- prettier-plugin-astro
- prettier-plugin-tailwindcss

View File

@@ -0,0 +1,277 @@
# [3.7.0](https://gitea.alexlebens.dev/alexlebens/site-profile/compare/3.6.0...3.7.0) (2026-03-12)
### Bug Fixes
* incorrect name of step ([db79f91](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/db79f912eeb4f3741945c95d42508451e9558c1e))
* use semantic release outputs ([578e166](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/578e1661cd3966b9886c952dbb564d1a2290f5dc))
### Features
* add automation to release using release-please in workflows ([99032f7](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/99032f7a62a88bd8310a0eacfa2ab03c17ed9685))
* add if to ignore harbor release result ([ce75e7c](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/ce75e7ca5ec723c6a30f760f930d027012da6de9))
* add outputs of semantic release ([36eaa0c](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/36eaa0c13264cfc9acfb311d4e9fba35ced95d39))
* add release branch, update and merge release workflow ([68f2080](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/68f2080bdaa4b5a10a0d72657d511d287288e68c))
* add semantic release ([620b496](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/620b496957e49aa5615c043dbebb31367df38aaf))
* add token ([e0a3d39](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/e0a3d391b314717402b9577899c37c131a73c71d))
* change release format ([24c837c](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/24c837cf84a2bffb2a9b44a6905f2cbdb58facc6))
* ignore on docs updates ([4b58117](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/4b58117454109cbc3f40df0d1edc5185ca6415f0))
* install deps ([f32b75e](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/f32b75e31d8ac4a3e55f86812bfa0790bfaede57))
* remove old release workflows ([7882c3e](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/7882c3ecc763b2fe396e412d2ba81d7a0629bb11))
* remove release-please ([07fa86b](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/07fa86b17cab585088e299aab081b122db386ade))
* setup node for semantic release ([bf3a7ef](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/bf3a7ef261b437e877fd7c9d1a477dfac1ee0400))
* use different workflow for gitea ([1577ee4](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/1577ee4c2791cb40d2af4b891e37c6c3f4db459a))
# [3.7.0](https://gitea.alexlebens.dev/alexlebens/site-profile/compare/3.6.0...3.7.0) (2026-03-12)
### Bug Fixes
* incorrect name of step ([db79f91](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/db79f912eeb4f3741945c95d42508451e9558c1e))
### Features
* add automation to release using release-please in workflows ([99032f7](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/99032f7a62a88bd8310a0eacfa2ab03c17ed9685))
* add if to ignore harbor release result ([ce75e7c](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/ce75e7ca5ec723c6a30f760f930d027012da6de9))
* add outputs of semantic release ([36eaa0c](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/36eaa0c13264cfc9acfb311d4e9fba35ced95d39))
* add release branch, update and merge release workflow ([68f2080](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/68f2080bdaa4b5a10a0d72657d511d287288e68c))
* add semantic release ([620b496](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/620b496957e49aa5615c043dbebb31367df38aaf))
* add token ([e0a3d39](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/e0a3d391b314717402b9577899c37c131a73c71d))
* change release format ([24c837c](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/24c837cf84a2bffb2a9b44a6905f2cbdb58facc6))
* ignore on docs updates ([4b58117](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/4b58117454109cbc3f40df0d1edc5185ca6415f0))
* install deps ([f32b75e](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/f32b75e31d8ac4a3e55f86812bfa0790bfaede57))
* remove old release workflows ([7882c3e](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/7882c3ecc763b2fe396e412d2ba81d7a0629bb11))
* remove release-please ([07fa86b](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/07fa86b17cab585088e299aab081b122db386ade))
* setup node for semantic release ([bf3a7ef](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/bf3a7ef261b437e877fd7c9d1a477dfac1ee0400))
* use different workflow for gitea ([1577ee4](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/1577ee4c2791cb40d2af4b891e37c6c3f4db459a))
# [3.7.0](https://gitea.alexlebens.dev/alexlebens/site-profile/compare/3.6.0...3.7.0) (2026-03-12)
### Features
* add automation to release using release-please in workflows ([99032f7](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/99032f7a62a88bd8310a0eacfa2ab03c17ed9685))
* add if to ignore harbor release result ([ce75e7c](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/ce75e7ca5ec723c6a30f760f930d027012da6de9))
* add outputs of semantic release ([36eaa0c](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/36eaa0c13264cfc9acfb311d4e9fba35ced95d39))
* add release branch, update and merge release workflow ([68f2080](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/68f2080bdaa4b5a10a0d72657d511d287288e68c))
* add semantic release ([620b496](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/620b496957e49aa5615c043dbebb31367df38aaf))
* add token ([e0a3d39](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/e0a3d391b314717402b9577899c37c131a73c71d))
* change release format ([24c837c](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/24c837cf84a2bffb2a9b44a6905f2cbdb58facc6))
* ignore on docs updates ([4b58117](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/4b58117454109cbc3f40df0d1edc5185ca6415f0))
* install deps ([f32b75e](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/f32b75e31d8ac4a3e55f86812bfa0790bfaede57))
* remove release-please ([07fa86b](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/07fa86b17cab585088e299aab081b122db386ade))
* setup node for semantic release ([bf3a7ef](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/bf3a7ef261b437e877fd7c9d1a477dfac1ee0400))
* use different workflow for gitea ([1577ee4](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/1577ee4c2791cb40d2af4b891e37c6c3f4db459a))
# 1.0.0 (2026-03-12)
### Bug Fixes
* add comments ([a0f83c8](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/a0f83c874c8b4d66168ed54f93919ffaafe2250b))
* add env ([ea9ae01](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/ea9ae016d706b03793a1f4218c9d407ed45e26a4))
* add paths ([976bc0c](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/976bc0c413904bc5b8772a8e5674c1c92ae09eb4))
* add remote patterns for images ([ba73c1b](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/ba73c1b24ff48acc2589b3e7ad1a104a9c813a9d))
* change selected count ([fe38992](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/fe3899242a0e2c951371f42561705ec8d2fa1093))
* clean up comments ([4d7886b](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/4d7886b93c78e89e3fa49d122573fc1a2d4feb39))
* command order ([0a2979e](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/0a2979ecfef952826138c0095ff917ac8926aedb))
* correct credentials ([1a34b93](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/1a34b932b06b410e47653eb98e03cca06385bd14))
* correct matchhost ([882063e](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/882063ea43004d26ccb6b6ccc706d99e4ef7f4be))
* create new Date to compare posts ([01ee8fa](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/01ee8fac98b5bb110670860cf87b1aa3e1b52a9a))
* debug logs ([8d5c02e](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/8d5c02e2d124d7b9c82e03f01b93ac5f8074335d))
* **deps:** update astro monorepo ([ef810ef](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/ef810efd24a3bfb09ab0dd82fdd144ff92e9e7ef))
* **deps:** update dependency shiki to v4 ([da28e5b](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/da28e5b50e60b4e01a7c9ec98297d272945cb1ce))
* downgrade python ([7a77f0d](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/7a77f0d2d2489707bbf5cc815a531282393fa5eb))
* fix footer accent color ([9eb0f37](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/9eb0f37cb2c8dce3602616e490a6214adb6f2f10))
* fix lint error ([4c4421c](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/4c4421c8a897ea54472c3dd1696bcf0dc0ec4e3b))
* force 3d scaling for button transform ([959d3bd](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/959d3bd71d3c6ed3fc34196ff2edaee0441a36c5))
* hidden button background color on light mode, darken ([0d87af3](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/0d87af3aca5e10f13358e480aa56f860ff0ae211))
* info logs ([c927235](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/c927235a5aeb6e6d600eb4de78d4144dd7853d21))
* install and run ([e29631c](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/e29631c4af2d87d0e3518751d0e6327006d4e38d))
* move host rules to workflow ([ba2477e](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/ba2477e7af9ab97045c836634de57384e199f881))
* only binary ([31aad55](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/31aad5511fbf288991e5eab1551204fc9513e253))
* padding, margin, and width issues ([6d3f3a4](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/6d3f3a49ab80c7c49c0552fc18c09cff2a34be57))
* path ([d9833e1](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/d9833e1c27c5b60d4dd1e180e4108623639d6681))
* remove argument ([093e1e2](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/093e1e2ccb55085f34595ffccecf322f9bba4199))
* remove border from blog cards ([875b8a7](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/875b8a7f47698cb397992dbedf48b1d1a35c0cfa))
* remove description ([c2bf64c](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/c2bf64c6ccdf52345f3eecf52b59d472fde372da))
* remove errant semicolon ([1ddc76a](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/1ddc76ae693d6903226ae6ffef635d9ed3adad4f))
* remove unused property ([3d9120c](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/3d9120c5700244137427b929c360920e7227ad6d))
* run theme on page swap ([c4be465](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/c4be4653bea0b4101cfbe20c082b3268c01ddba8))
* update lock ([fb8f642](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/fb8f642c52fe82469e4bc3b41f8b62ca5ca80e46))
* use uvx ([c3e4519](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/c3e4519682599bafe0c9857be90937542be31fd8))
### Features
* add additional layout for small screens ([890dbdf](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/890dbdf313c4596e73734fdca5376c86d4cdc852))
* add an all page with cards to link to it ([7327795](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/7327795d394f05039a3e0fe0e6615453138bcd6a))
* add applications page ([9678b3c](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/9678b3c7185b166d710ab7e0a83cdbdc89cc0ff6))
* add automation to release using release-please in workflows ([99032f7](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/99032f7a62a88bd8310a0eacfa2ab03c17ed9685))
* add background shimmer effect, use mask for content scroll fade ([5e37e2b](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/5e37e2bb539a8d35bd3de3c47f0b2c5d227197c5))
* add category logo to blog page ([5b94283](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/5b94283498131c4265b7f5bb364d81e8ff642a88))
* add client:load ([ceb70c7](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/ceb70c70491d7075cd744a12158bf6a9bf7da367))
* add creds for dhi ([8797864](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/879786484d10a6be14e1cb7a5a6d28ebb6b1a95f))
* add dark mode logo ([f984a1f](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/f984a1f759b14e11c9d9ccd3d389ee3b4cd94d67))
* add dark mode swap to logo ([97b1fa0](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/97b1fa0316dff19bbfc8e34041826fb95b71f2d8))
* add dates to selected ([091af90](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/091af909d49c31568edd00b195c10f4b45c843db))
* add docker login ([a8d6446](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/a8d6446674d872456952146f0b31562f41a873f8))
* add docs link to footer ([22860c4](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/22860c4714c353f407ad0e2383976819a059c232))
* add gap to distinguish ([f030da5](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/f030da549ead68a2334ed70ae32b6c19ef686a93))
* add gap to header above md ([d3b2b40](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/d3b2b40ccbbac494a02cddc1944d698627abcc6f))
* add guarddog scan to workflow ([14f7bdc](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/14f7bdc024868a02566b00bf2a3b52c74a210788))
* add if to ignore harbor release result ([ce75e7c](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/ce75e7ca5ec723c6a30f760f930d027012da6de9))
* add logos to category cards ([4c1da43](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/4c1da43c6833a5e36e52a39fcbe93d2a2422418e))
* add logos to category header pages ([d7d4336](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/d7d43369dc239af1775d99b631fb86368bcac102))
* add margin to bring in the content ([fa618b0](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/fa618b0524912eab62a670b926d70c1d29968780))
* add photoswipe to view images embeded in posts ([ae57c60](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/ae57c6093599f3bb0b6bc6b0856a96fab997e1f6))
* add release branch, update and merge release workflow ([68f2080](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/68f2080bdaa4b5a10a0d72657d511d287288e68c))
* add rounded option to hero component and use it for about page ([95432d9](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/95432d9059cc05afc1a97033e42d7a4322c27a54))
* add rybbit tracking ([efad6c3](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/efad6c30d1387d97b74286d1dec158998b90c047))
* add scroll reset on navigation ([07c7ede](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/07c7edeb0f49fd082d109f85f3407c41ee1924ca))
* add security feature ([a7e7e5b](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/a7e7e5b0e803b604801ed7aee0bdcd81781c612f))
* add semantic release ([620b496](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/620b496957e49aa5615c043dbebb31367df38aaf))
* add shiki to markdown rendering for code highlighting ([b7f76c5](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/b7f76c584752942d0beaec5f8d815dbe139dd1c1))
* add thanks for Icons8 ([6cddae6](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/6cddae61ed40a4f30d121d8f054749c09ee4be59))
* add token ([e0a3d39](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/e0a3d391b314717402b9577899c37c131a73c71d))
* add weather widget ([b6dfc73](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/b6dfc738f15737937fbc6dd438d173c0f4b1e526))
* adjust height of fade effect ([7498870](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/7498870d9221e8f2e403596cfdcb916a59e6bd4f))
* adjust layout of recent posts ([568220d](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/568220d39c4ede230b512b18eb28dc46d941dcca))
* adjustment pass on spacing between sections ([b3c377f](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/b3c377f62dbaf2f6f5e38dc5f023023db42e8baf))
* better reactive layout for small screen sizes ([56d841a](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/56d841a3358df55b59b310247a4b862827ca116c))
* change cache path ([30b2e98](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/30b2e980c0c6d13e8b66de99ee7f811110999360))
* change responsive height of image ([e25a3d0](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/e25a3d0189941cb640c18d423d2b168975a7fd38))
* change selected blogs to switch to card form on small screens ([44bd1e4](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/44bd1e48100dbeecdeecad1c2111cfdb3fd144e7))
* consistent gaps and margins ([05d7ad6](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/05d7ad6557da8aa190396361c57e6534bf02cc2d))
* convert hero section to use randomly selected images stored in directus ([c9cb15f](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/c9cb15f201136c0579bf44106e70efafbda2e0a6))
* convert to bun ([1f2820e](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/1f2820e4b49f827018a2cc1624cc9921a0a48241))
* disable ([1573331](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/1573331f8775aebff7aa9fee896bdc0dd468c16b))
* disable security feature ([04dfecc](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/04dfecc099f4e319e6a673bcb1e774bdd07bc73e))
* enable cache ([16e14f6](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/16e14f63efdfabbca6a31e66495761eb53bb755d))
* enable guarddog ([19e8080](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/19e80809c16f6d30653d1e181fffa84bf4a4ffa1))
* enable security feature ([0434480](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/04344808bdd9a22f3c8ac4c21dec16e71b398b59))
* final refactor of sections ([a74cc77](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/a74cc775d027c95dd989355126d74a3bc2502ef5))
* hide cards on small screens ([e2f5bbb](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/e2f5bbbe9cefd893a40cbd9f14ce819da8ab1c0e))
* ignore on docs updates ([4b58117](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/4b58117454109cbc3f40df0d1edc5185ca6415f0))
* imporve theme toggle button ([a09a4ee](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/a09a4ee2404a5621568e141d32929353a78e750c))
* imporvement pass over sections ([8a649b7](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/8a649b7647804a63013bc9a44485f36e60dfdb7f))
* improve behavior of showmore, fix alignment ([7f2a272](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/7f2a27248a986a1e8921269862220d82d75f89cf))
* improve layout for single and two images ([e6d4e34](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/e6d4e34a0a55260c0f2ee1d166cb6eabcf8f1f61))
* improve logos and clickability of cards on about and apps ([63cbcdf](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/63cbcdf39b1e07a6307c6ab27d75f8edd4902e5b))
* improve navbar, add opacity fade beneath, layout, and refactor ([5ac23f0](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/5ac23f08a4e4519ac7179ec916fdc91abca5883a))
* install deps ([f32b75e](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/f32b75e31d8ac4a3e55f86812bfa0790bfaede57))
* major refactor of cards to standardize styles ([104fe35](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/104fe35ee8d6801d4cf1e6cfe4ad5bb9ff42d2a0))
* make cards fixed height ([9dfcf6f](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/9dfcf6f00698b472753b96117c59a5f8e1c536ea))
* make weather fetching dynamic ([7f7f710](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/7f7f710fe84eca8fbcadc9566f56942f63224d36))
* markdown support for rss ([6156012](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/6156012c0068cb26ee5aad1045b7f8da04412092))
* minor tweaks ([d42ba08](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/d42ba0804197e0f1813aff9178e001a4c5deded1))
* move all categories card to bottom of category section ([2fbc9a7](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/2fbc9a764f6b93a088c46b88d6cbd9a0ad9a1152))
* move all posts to bottom of recent section ([940342c](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/940342cc3f07a0002da4596d7f7047010faf0f96))
* move categories to directus ([93bf44f](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/93bf44f89ab093563c58c5ce1f9bec530c852a87))
* move directus to local endpoint ([197ad63](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/197ad63ada2e5a2335b4e0984bbdf8ee96d07b2f))
* move improved components out of ui folder ([47a6373](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/47a637353cfe34d95558490474968e40c9d779c3))
* move post metadata to snippet component ([cc8bade](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/cc8bade886fee861f9ab7ad1d54fd5415ab2ec7b))
* move url configuration to support file ([6f1728a](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/6f1728a909c4b33a52a31677aeff29c9b5a83261))
* organize footer to consistency ([c6f3179](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/c6f3179efba8920efed80e03eca09a3016d2ac16))
* organize layout to consistency ([8270728](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/8270728e8fbf51b429617fbb6f14369791f58de5))
* organize to consistency ([21085a1](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/21085a1620687f60006cabcb9eef233768e286ea))
* organize to consistency ([62dd636](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/62dd636d4ee0b4a4fb0d4e8f10b50171aa694f15))
* organize to consistency ([0497731](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/0497731c455158e09e7bd876fb8237910ce47826))
* organize to consistency ([6c2c6da](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/6c2c6da91d94b04448f2b744414adeabdd6bec1c))
* organize to consistency pass on sections ([429cf94](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/429cf9402313d97feb486a91729fbf33f10160ca))
* redo how images, icons, and logos are handled ([76dfef4](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/76dfef41774182ca4a3ec8ae36542c786a2a08b2))
* redo layout, smaller and with logo ([3414535](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/341453510fe707ecd2892a34e3af1eb295630d4d))
* reduce scale effect ([b8379bb](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/b8379bbc38dae300e25caab2c1e77b993744cc20))
* refactor blog components ([6423ffb](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/6423ffba639130cafd9d7d526588a6b707f81687))
* refactor buttons, except for theme ([342ae89](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/342ae8900af878b9ae77f82cf95eca62ad67a1d5))
* refactor how blog cards layout, add metadata, better responsiveness ([265fd4f](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/265fd4f2cbe064c2d4a4f7b063b65b1ec623fa95))
* refactor pass along pages ([e52d85f](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/e52d85f9314fbb8b6aeb0667bcec8e475c1b2c5d))
* release 2.10.0 ([fcd3057](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/fcd3057f40d1198012fba2754d95fb2109b2bcd4))
* release 2.10.1 ([2cdef1a](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/2cdef1a5533da355daf4934d3e2a383ae65bfa4a))
* release 2.11.0 ([440c952](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/440c95224d9f5c6e9fdaff7e7d663ca87aa358fc))
* release 2.12.0 ([1a8473b](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/1a8473b96483bbac6ad26904916ecb2226e8243c))
* release 2.13.0 ([2c9486f](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/2c9486f6872a1b2126661a0c5a44c1f1e68bf6c2))
* release 2.13.1 ([db2711d](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/db2711d8782977c639f031ac24213c356d05de57))
* release 2.14.0 ([0416ab7](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/0416ab7f9e299cbcaede6372f396a3f25bde12aa))
* release 2.14.1 ([d415dda](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/d415dda6615cfc6b79e27212846e9b176a016ed9))
* release 2.15.0 ([f3b8d10](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/f3b8d101064ebe4b6cf1adb17145156dbe2a209b))
* release 2.15.1 ([c5cda00](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/c5cda006bb24b326e1d18a650689ba0590afd5db))
* release 2.16.0 ([c69eb58](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/c69eb58a49bf99a8063b8d33118ac2a77febf9dc))
* release 2.17.0 ([d19433a](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/d19433ae4eedaa2fec3dcc0e839e6b08035d6f5d))
* release 2.17.1 ([cc5e975](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/cc5e975ea6adaa8acb8625de91091eb914ec67ce))
* release 2.17.2 ([469d9ba](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/469d9ba3f723c2d085dd3bda829291ef59c5a879))
* release 2.18.0 ([ddbcb33](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/ddbcb338123ada672c90610ad40f9df578acbab6))
* release 2.18.1 ([62066c6](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/62066c6f3bdc7c0d9fa9cf9bf636310a60b6f045))
* release 2.19.0 ([6ddc382](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/6ddc382dac0647231a60a976d351563368d0ffdc))
* release 2.19.1 ([f4676d1](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/f4676d151fa288175db792288bbdb86bc044a822))
* release 2.20.0 ([2c20770](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/2c2077053bb6bff438d312c4e9df1a9764e30c90))
* release 2.20.1 ([95ea235](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/95ea235f9f4dd1bbdcb0c6b95c437c4703c77726))
* release 2.21.0 ([89fd0eb](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/89fd0eb7ce5cfc3b433c9a6ef11299976c94640c))
* release 2.22.0 ([8b07837](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/8b07837c0d2ce15cf0243564dc51e863faa6cb9c))
* release 2.23.0 ([50f050c](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/50f050c0b6db2affc331178b1a5e84fb74346635))
* release 2.24.0 ([ce9c9c3](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/ce9c9c38574d907ea4c72f90e68d705c1f2f507f))
* release 2.25.0 ([e91ffd8](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/e91ffd8686381c4e0ea39c13b4d05b3644f90799))
* release 2.3.0 ([bf73905](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/bf7390565846c3629edf4dc3a2daa00509478d15))
* release 2.3.2 ([49969e2](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/49969e27b0884b166f521e1b44d461551eebcdfd))
* release 2.4.0 ([d0ff16c](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/d0ff16c8dc13aaa4ca390684bea495f95914de04))
* release 2.5.0 ([880bafd](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/880bafd41ec25223c770148cb32e4b651c3997d2))
* release 2.6.0 ([3f5682f](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/3f5682f80ca4ee0c857bc335d8729f7c28d4c038))
* release 2.7.0 ([00ef91b](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/00ef91b644fbc96a0fc76ab7460c3619c5db76ae))
* release 2.8.0 ([a57f43e](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/a57f43e082fb43d438c058990bd245b62cd11bba))
* release 2.9.0 ([0f403fa](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/0f403fa274566ad0e08b04d6566f2f922134e92a))
* release 3.0.0, major astro update to 6.0 ([962f354](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/962f3542089a96ffaf583c716d21ca9ccc0e26e4))
* release 3.2.0 ([ec10d45](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/ec10d45fd0d73affd240eaea8b87c74c5e262bb6))
* release 3.3.0 ([8184d42](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/8184d429421462d9e991129874293ed86e30a49a))
* release 3.5.0 ([6ec2734](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/6ec27345c3e920be11e055e2eb370cecd4a6e651))
* release 3.6.0 ([03f74a8](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/03f74a8181c429eeb69ebdcec6bc23ad11c6bd00))
* remove emoji ([734e9ca](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/734e9cacaefad037c059decc41a7576315096a61))
* remove extra spacing ([5877086](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/5877086cc3935378681035920138a708a919d374))
* remove hardcoded descriptions ([754f6a2](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/754f6a22f00a9e19cfdc5ace2632977530be8a57))
* remove hardcoded descriptions ([c7d3ca7](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/c7d3ca725248cf5faf9c3f2b8c92816b892e02e9))
* remove mdx ([4203b63](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/4203b638930daa3fce44de0d81c8e01bea601c01))
* remove option ([19e17ea](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/19e17ea94713b017f392eab90a982c29debf2eae))
* remove partytown int ([b55c3a0](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/b55c3a0e3151614cd400194922f1ac506202377d))
* remove partytown int ([e63abf0](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/e63abf03ef1d8dbc2f81fade07bd7058bd8777dd))
* remove release-please ([07fa86b](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/07fa86b17cab585088e299aab081b122db386ade))
* remove security feature ([5e02443](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/5e02443409996b763f8dd4bc5c4e96ed38cc9083))
* remove static robots ([4dbc5d1](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/4dbc5d12a3c5bf60e4efe4d33ab9d9c8baa62b87))
* remove text-justify from content ([a45a4d7](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/a45a4d7dd7535ea67e738b028d87d7854165b8b3))
* remove unused files ([00a86b1](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/00a86b120624f81d4f4b4cff9aa89510f7fa90eb))
* remove unused packages ([505670d](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/505670dbf81bbf4b8306520e0df0683cfaea44db))
* remove unused properties ([0a17e3b](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/0a17e3b8af679df1624118bf7dea95e5fd877123))
* rename button components to include button in name for consistency ([5271be5](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/5271be52a22d536f7b6662d4ebab98413f9e4dcd))
* reorganize blog layout ([1f3fed9](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/1f3fed93a15101e26e766b34d906ddb7853b2a90))
* replace timeago with dayjs ([405fdf2](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/405fdf297cf5d57e499a600253741bfdd891cdd2))
* responsive for small screen ([5b6b6e4](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/5b6b6e479f0c164ccc365587c669ea02850743a8))
* reword titles and descriptions ([68f1794](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/68f179456a6c677f5a900db984a58c6b0422ea3e))
* scale logos ([0fc359a](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/0fc359a973e0d7b2de191b76d828f89f3e6fe694))
* setup node ([113f42c](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/113f42ca21d2a917b527e65d61934e34d5628b1a))
* setup node for semantic release ([bf3a7ef](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/bf3a7ef261b437e877fd7c9d1a477dfac1ee0400))
* shorten transition time ([3eae720](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/3eae720221fb5b895942589e3ac5b1cd9825b426))
* simplify layout of the features cards ([31621e4](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/31621e4f7efe5f0bfe394453f24d8120ff6f2ade))
* slight optimization ([fe6604a](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/fe6604a5d993c516d542a5988b78f78e123241ea))
* tweak to gradient ([20d8c73](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/20d8c7323f81a6801b7fc77b10351d3f4a24d8de))
* tweaks to background to be more pastel ([ea15224](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/ea15224eae8b3771f8d5cd5eb68809b12336d016))
* update BaseHead ([18211ad](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/18211ad4852ac0a0cb25d82309f91746f27ba0a1))
* update features ([7fafa5c](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/7fafa5c4cf0d708dd750a46f207ac13c92cba0f3))
* update layout's width ([6fca640](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/6fca640fd8bca269e9295618175f62639b31053f))
* update robots.txt ([744e72e](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/744e72efc9e405ee86ab962fdfa5a8a99a5cb162))
* update workflow to major version ([dc08830](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/dc088306ceee7fc8ddbe0279e836511541350a90))
* use different workflow for gitea ([1577ee4](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/1577ee4c2791cb40d2af4b891e37c6c3f4db459a))
* use hardened image ([d464f0f](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/d464f0fe43417e0965158ef5a99d3fb912fe0382))
* use latest alpine ([e476efb](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/e476efb96b14b5bdd1a10e31a676e55f4222ffab))
* use many to one relationship for categories in directus ([e7c660c](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/e7c660c142010fd45d8fcf4027aad9f191ea394e))
* use mask to blend content to background ([0c63c6b](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/0c63c6bef4472dc078323c937ca516d42ff0b91e))
* use masonary style layout ([8a7b6b9](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/8a7b6b97b79a1eafc525bd25e0132af0d36a551b))
* use metadata snippet for blog cards ([18c2b54](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/18c2b54f658e029f99e608fdfe5eb15d61fbe04a))
* use slate for accent ([8c5488f](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/8c5488fad58710074669d1ef7618110dd724447d))
### Reverts
* release 2.2.2 ([f34f4b2](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/f34f4b25324c2effae642ae96a8a88aed0028435))
* release 2.2.3 ([b3bb769](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/b3bb769c477fbc5b07256a8e16b376672633228b))
* release 2.2.4 ([fde3973](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/fde397386ce5eacc347812c8a1c6620ef387dd08))
* release 2.2.5 ([00b63a5](https://gitea.alexlebens.dev/alexlebens/site-profile/commit/00b63a5bea3969b5c587b330a4125e876093dcd8))

View File

@@ -1,6 +1,4 @@
ARG REGISTRY=dhi.io FROM dhi.io/bun:1.3.10-debian13-dev AS builder
FROM ${REGISTRY}/bun:1.3.10-alpine3.22-dev AS builder
WORKDIR /app WORKDIR /app
COPY package.json bun.lock ./ COPY package.json bun.lock ./
@@ -17,14 +15,14 @@ FROM build-deps AS build
COPY . . COPY . .
RUN bun run build RUN bun run build
FROM ${REGISTRY}/bun:1.3.10-alpine3.22 AS runtime FROM dhi.io/bun:1.3.10-alpine3.22 AS runtime
WORKDIR /app WORKDIR /app
COPY --from=prod-deps /app/node_modules /app/node_modules COPY --from=prod-deps /app/node_modules /app/node_modules
COPY --from=build /app/dist /app/dist COPY --from=build /app/dist /app/dist
ARG APP_VERSION=latest ARG APP_VERSION=latest
ARG APP_VERSION
ENV NODE_ENV=production
ENV HOST=0.0.0.0 ENV HOST=0.0.0.0
ENV PORT=4321 ENV PORT=4321

View File

@@ -8,11 +8,13 @@ import tailwindcss from '@tailwindcss/vite';
import icon from 'astro-icon'; import icon from 'astro-icon';
import swup from '@swup/astro'; import swup from '@swup/astro';
import { getSiteURL } from './src/scripts/url'; import { getSiteURL } from './src/support/url';
export default defineConfig({ export default defineConfig({
site: getSiteURL(), site: getSiteURL(),
security: { csp: true },
image: { image: {
remotePatterns: [ remotePatterns: [
{ protocol: 'https', hostname: '*.alexlebens.net' }, { protocol: 'https', hostname: '*.alexlebens.net' },
@@ -24,6 +26,8 @@ export default defineConfig({
} }
}, },
prefetch: true,
integrations: [ integrations: [
react(), react(),
sitemap(), sitemap(),

View File

@@ -45,12 +45,10 @@
"@semantic-release/changelog": "^6.0.3", "@semantic-release/changelog": "^6.0.3",
"@semantic-release/commit-analyzer": "^13.0.1", "@semantic-release/commit-analyzer": "^13.0.1",
"@semantic-release/git": "^10.0.1", "@semantic-release/git": "^10.0.1",
"@semantic-release/npm": "^13.1.5",
"@semantic-release/release-notes-generator": "^14.1.0", "@semantic-release/release-notes-generator": "^14.1.0",
"@tailwindcss/forms": "^0.5.11", "@tailwindcss/forms": "^0.5.11",
"@tailwindcss/typography": "^0.5.19", "@tailwindcss/typography": "^0.5.19",
"@types/markdown-it": "^14.1.2", "@types/markdown-it": "^14.1.2",
"@types/photoswipe": "^5.2.5",
"eslint": "^10.0.3", "eslint": "^10.0.3",
"eslint-config-prettier": "^10.1.8", "eslint-config-prettier": "^10.1.8",
"eslint-plugin-astro": "^1.6.0", "eslint-plugin-astro": "^1.6.0",
@@ -851,8 +849,6 @@
"@types/parse-json": ["@types/parse-json@4.0.2", "", {}, "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw=="], "@types/parse-json": ["@types/parse-json@4.0.2", "", {}, "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw=="],
"@types/photoswipe": ["@types/photoswipe@5.2.5", "", { "dependencies": { "photoswipe": "*" } }, "sha512-1x8LpPy/a9cMdy8AgSQZOgVN4b1BEAGGLFjkg20RAUbv2vzovH8U2iSZmjlM6Gd6oY/BI+Thdph0kOlxEZHskQ=="],
"@types/react": ["@types/react@19.2.14", "", { "dependencies": { "csstype": "3.2.3" } }, "sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w=="], "@types/react": ["@types/react@19.2.14", "", { "dependencies": { "csstype": "3.2.3" } }, "sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w=="],
"@types/react-dom": ["@types/react-dom@19.1.7", "", { "peerDependencies": { "@types/react": "19.2.14" } }, "sha512-i5ZzwYpqjmrKenzkoLM2Ibzt6mAsM7pxB6BCIouEVVmgiqaMj1TjaK7hnA36hbW5aZv20kx7Lw6hWzPWg0Rurw=="], "@types/react-dom": ["@types/react-dom@19.1.7", "", { "peerDependencies": { "@types/react": "19.2.14" } }, "sha512-i5ZzwYpqjmrKenzkoLM2Ibzt6mAsM7pxB6BCIouEVVmgiqaMj1TjaK7hnA36hbW5aZv20kx7Lw6hWzPWg0Rurw=="],
@@ -1987,7 +1983,7 @@
"node-releases": ["node-releases@2.0.36", "", {}, "sha512-TdC8FSgHz8Mwtw9g5L4gR/Sh9XhSP/0DEkQxfEFXOpiul5IiHgHan2VhYYb6agDSfp4KuvltmGApc8HMgUrIkA=="], "node-releases": ["node-releases@2.0.36", "", {}, "sha512-TdC8FSgHz8Mwtw9g5L4gR/Sh9XhSP/0DEkQxfEFXOpiul5IiHgHan2VhYYb6agDSfp4KuvltmGApc8HMgUrIkA=="],
"normalize-package-data": ["normalize-package-data@8.0.0", "", { "dependencies": { "hosted-git-info": "^9.0.0", "semver": "^7.3.5", "validate-npm-package-license": "^3.0.4" } }, "sha512-RWk+PI433eESQ7ounYxIp67CYuVsS1uYSonX3kA6ps/3LWfjVQa/ptEg6Y3T6uAMq1mWpX9PQ+qx+QaHpsc7gQ=="], "normalize-package-data": ["normalize-package-data@6.0.2", "", { "dependencies": { "hosted-git-info": "^7.0.0", "semver": "^7.3.5", "validate-npm-package-license": "^3.0.4" } }, "sha512-V6gygoYb/5EmNI+MEGrWkC+e6+Rr7mTmfHrxDbLzxQogBkgzo76rkok0Am6thgSF7Mv2nLOajAJj5vDJZEFn7g=="],
"normalize-path": ["normalize-path@3.0.0", "", {}, "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA=="], "normalize-path": ["normalize-path@3.0.0", "", {}, "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA=="],
@@ -2075,7 +2071,7 @@
"parent-module": ["parent-module@1.0.1", "", { "dependencies": { "callsites": "3.1.0" } }, "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g=="], "parent-module": ["parent-module@1.0.1", "", { "dependencies": { "callsites": "3.1.0" } }, "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g=="],
"parse-json": ["parse-json@8.3.0", "", { "dependencies": { "@babel/code-frame": "^7.26.2", "index-to-position": "^1.1.0", "type-fest": "^4.39.1" } }, "sha512-ybiGyvspI+fAoRQbIPRddCcSTV9/LsJbf0e/S85VLowVGzRmokfneg2kwVW/KU5rOXrPSbF1qAKPMgNTqqROQQ=="], "parse-json": ["parse-json@5.2.0", "", { "dependencies": { "@babel/code-frame": "7.29.0", "error-ex": "1.3.4", "json-parse-even-better-errors": "2.3.1", "lines-and-columns": "1.2.4" } }, "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg=="],
"parse-latin": ["parse-latin@7.0.0", "", { "dependencies": { "@types/nlcst": "2.0.3", "@types/unist": "3.0.3", "nlcst-to-string": "4.0.0", "unist-util-modify-children": "4.0.0", "unist-util-visit-children": "3.0.0", "vfile": "6.0.3" } }, "sha512-mhHgobPPua5kZ98EF4HWiH167JWBfl4pvAIXXdbaVohtK7a6YBOy56kvhCqduqyo/f3yrHFWmqmiMg/BkBkYYQ=="], "parse-latin": ["parse-latin@7.0.0", "", { "dependencies": { "@types/nlcst": "2.0.3", "@types/unist": "3.0.3", "nlcst-to-string": "4.0.0", "unist-util-modify-children": "4.0.0", "unist-util-visit-children": "3.0.0", "vfile": "6.0.3" } }, "sha512-mhHgobPPua5kZ98EF4HWiH167JWBfl4pvAIXXdbaVohtK7a6YBOy56kvhCqduqyo/f3yrHFWmqmiMg/BkBkYYQ=="],
@@ -2259,7 +2255,7 @@
"read-package-up": ["read-package-up@11.0.0", "", { "dependencies": { "find-up-simple": "^1.0.0", "read-pkg": "^9.0.0", "type-fest": "^4.6.0" } }, "sha512-MbgfoNPANMdb4oRBNg5eqLbB2t2r+o5Ua1pNt8BqGp4I0FJZhuVSOj3PaBPni4azWuSzEdNn2evevzVmEk1ohQ=="], "read-package-up": ["read-package-up@11.0.0", "", { "dependencies": { "find-up-simple": "^1.0.0", "read-pkg": "^9.0.0", "type-fest": "^4.6.0" } }, "sha512-MbgfoNPANMdb4oRBNg5eqLbB2t2r+o5Ua1pNt8BqGp4I0FJZhuVSOj3PaBPni4azWuSzEdNn2evevzVmEk1ohQ=="],
"read-pkg": ["read-pkg@10.1.0", "", { "dependencies": { "@types/normalize-package-data": "^2.4.4", "normalize-package-data": "^8.0.0", "parse-json": "^8.3.0", "type-fest": "^5.4.4", "unicorn-magic": "^0.4.0" } }, "sha512-I8g2lArQiP78ll51UeMZojewtYgIRCKCWqZEgOO8c/uefTI+XDXvCSXu3+YNUaTNvZzobrL5+SqHjBrByRRTdg=="], "read-pkg": ["read-pkg@9.0.1", "", { "dependencies": { "@types/normalize-package-data": "^2.4.3", "normalize-package-data": "^6.0.0", "parse-json": "^8.0.0", "type-fest": "^4.6.0", "unicorn-magic": "^0.1.0" } }, "sha512-9viLL4/n1BJUCT1NXVTdS1jtm80yDEgR5T4yCelII49Mbj0v1rZdKqj7zCiYdbB0CuCgdrvHcNogAKTFPBocFA=="],
"readable-stream": ["readable-stream@2.3.8", "", { "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", "isarray": "~1.0.0", "process-nextick-args": "~2.0.0", "safe-buffer": "~5.1.1", "string_decoder": "~1.1.1", "util-deprecate": "~1.0.1" } }, "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA=="], "readable-stream": ["readable-stream@2.3.8", "", { "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", "isarray": "~1.0.0", "process-nextick-args": "~2.0.0", "safe-buffer": "~5.1.1", "string_decoder": "~1.1.1", "util-deprecate": "~1.0.1" } }, "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA=="],
@@ -2377,7 +2373,7 @@
"semantic-release-export-data": ["semantic-release-export-data@1.2.0", "", { "peerDependencies": { "semantic-release": ">=20" } }, "sha512-/9+yQWFieiN0KB7YA0TTCXHml7d2tlNLkprLjUOKf8XDQlJ6ZK9gkw0dJJ/8/kBzeuUPq8aZR2n0rYmuYCz7Xg=="], "semantic-release-export-data": ["semantic-release-export-data@1.2.0", "", { "peerDependencies": { "semantic-release": ">=20" } }, "sha512-/9+yQWFieiN0KB7YA0TTCXHml7d2tlNLkprLjUOKf8XDQlJ6ZK9gkw0dJJ/8/kBzeuUPq8aZR2n0rYmuYCz7Xg=="],
"semver": ["semver@7.7.4", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA=="], "semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="],
"semver-regex": ["semver-regex@4.0.5", "", {}, "sha512-hunMQrEy1T6Jr2uEVjrAIqjwWcQTgOAcIM52C8MY1EZSD3DDNft04XzvYKPqjED65bNVVko0YI38nYeEHCX3yw=="], "semver-regex": ["semver-regex@4.0.5", "", {}, "sha512-hunMQrEy1T6Jr2uEVjrAIqjwWcQTgOAcIM52C8MY1EZSD3DDNft04XzvYKPqjED65bNVVko0YI38nYeEHCX3yw=="],
@@ -2623,7 +2619,7 @@
"unicode-property-aliases-ecmascript": ["unicode-property-aliases-ecmascript@2.2.0", "", {}, "sha512-hpbDzxUY9BFwX+UeBnxv3Sh1q7HFxj48DTmXchNgRa46lO8uj3/1iEn3MiNUYTg1g9ctIqXCCERn8gYZhHC5lQ=="], "unicode-property-aliases-ecmascript": ["unicode-property-aliases-ecmascript@2.2.0", "", {}, "sha512-hpbDzxUY9BFwX+UeBnxv3Sh1q7HFxj48DTmXchNgRa46lO8uj3/1iEn3MiNUYTg1g9ctIqXCCERn8gYZhHC5lQ=="],
"unicorn-magic": ["unicorn-magic@0.4.0", "", {}, "sha512-wH590V9VNgYH9g3lH9wWjTrUoKsjLF6sGLjhR4sH1LWpLmCOH0Zf7PukhDA8BiS7KHe4oPNkcTHqYkj7SOGUOw=="], "unicorn-magic": ["unicorn-magic@0.1.0", "", {}, "sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ=="],
"unified": ["unified@11.0.5", "", { "dependencies": { "@types/unist": "3.0.3", "bail": "2.0.2", "devlop": "1.1.0", "extend": "3.0.2", "is-plain-obj": "4.1.0", "trough": "2.2.0", "vfile": "6.0.3" } }, "sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA=="], "unified": ["unified@11.0.5", "", { "dependencies": { "@types/unist": "3.0.3", "bail": "2.0.2", "devlop": "1.1.0", "extend": "3.0.2", "is-plain-obj": "4.1.0", "trough": "2.2.0", "vfile": "6.0.3" } }, "sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA=="],
@@ -2779,20 +2775,10 @@
"@astrojs/check/yargs": ["yargs@17.7.2", "", { "dependencies": { "cliui": "8.0.1", "escalade": "3.2.0", "get-caller-file": "2.0.5", "require-directory": "2.1.1", "string-width": "4.2.3", "y18n": "5.0.8", "yargs-parser": "21.1.1" } }, "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w=="], "@astrojs/check/yargs": ["yargs@17.7.2", "", { "dependencies": { "cliui": "8.0.1", "escalade": "3.2.0", "get-caller-file": "2.0.5", "require-directory": "2.1.1", "string-width": "4.2.3", "y18n": "5.0.8", "yargs-parser": "21.1.1" } }, "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w=="],
"@babel/core/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="],
"@babel/helper-compilation-targets/lru-cache": ["lru-cache@5.1.1", "", { "dependencies": { "yallist": "3.1.1" } }, "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w=="], "@babel/helper-compilation-targets/lru-cache": ["lru-cache@5.1.1", "", { "dependencies": { "yallist": "3.1.1" } }, "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w=="],
"@babel/helper-compilation-targets/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="],
"@babel/helper-create-class-features-plugin/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="],
"@babel/helper-create-regexp-features-plugin/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="],
"@babel/helper-define-polyfill-provider/resolve": ["resolve@1.22.11", "", { "dependencies": { "is-core-module": "2.16.1", "path-parse": "1.0.7", "supports-preserve-symlinks-flag": "1.0.0" }, "bin": { "resolve": "bin/resolve" } }, "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ=="], "@babel/helper-define-polyfill-provider/resolve": ["resolve@1.22.11", "", { "dependencies": { "is-core-module": "2.16.1", "path-parse": "1.0.7", "supports-preserve-symlinks-flag": "1.0.0" }, "bin": { "resolve": "bin/resolve" } }, "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ=="],
"@babel/preset-env/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="],
"@eslint-community/eslint-utils/eslint-visitor-keys": ["eslint-visitor-keys@3.4.3", "", {}, "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="], "@eslint-community/eslint-utils/eslint-visitor-keys": ["eslint-visitor-keys@3.4.3", "", {}, "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="],
"@iconify/tools/svgo": ["svgo@3.3.3", "", { "dependencies": { "commander": "7.2.0", "css-select": "5.2.2", "css-tree": "2.3.1", "css-what": "6.2.2", "csso": "5.0.5", "picocolors": "1.1.1", "sax": "1.5.0" }, "bin": "./bin/svgo" }, "sha512-+wn7I4p7YgJhHs38k2TNjy1vCfPIfLIJWR5MnCStsN8WuuTcBnRKcMHQLMM2ijxGZmDoZwNv8ipl5aTTen62ng=="], "@iconify/tools/svgo": ["svgo@3.3.3", "", { "dependencies": { "commander": "7.2.0", "css-select": "5.2.2", "css-tree": "2.3.1", "css-what": "6.2.2", "csso": "5.0.5", "picocolors": "1.1.1", "sax": "1.5.0" }, "bin": "./bin/svgo" }, "sha512-+wn7I4p7YgJhHs38k2TNjy1vCfPIfLIJWR5MnCStsN8WuuTcBnRKcMHQLMM2ijxGZmDoZwNv8ipl5aTTen62ng=="],
@@ -2855,6 +2841,10 @@
"@semantic-release/npm/fs-extra": ["fs-extra@11.3.4", "", { "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" } }, "sha512-CTXd6rk/M3/ULNQj8FBqBWHYBVYybQ3VPBw0xGKFe3tuH7ytT6ACnvzpIQ3UZtB8yvUKC2cXn1a+x+5EVQLovA=="], "@semantic-release/npm/fs-extra": ["fs-extra@11.3.4", "", { "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" } }, "sha512-CTXd6rk/M3/ULNQj8FBqBWHYBVYybQ3VPBw0xGKFe3tuH7ytT6ACnvzpIQ3UZtB8yvUKC2cXn1a+x+5EVQLovA=="],
"@semantic-release/npm/read-pkg": ["read-pkg@10.1.0", "", { "dependencies": { "@types/normalize-package-data": "^2.4.4", "normalize-package-data": "^8.0.0", "parse-json": "^8.3.0", "type-fest": "^5.4.4", "unicorn-magic": "^0.4.0" } }, "sha512-I8g2lArQiP78ll51UeMZojewtYgIRCKCWqZEgOO8c/uefTI+XDXvCSXu3+YNUaTNvZzobrL5+SqHjBrByRRTdg=="],
"@semantic-release/npm/semver": ["semver@7.7.4", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA=="],
"@surma/rollup-plugin-off-main-thread/magic-string": ["magic-string@0.25.9", "", { "dependencies": { "sourcemap-codec": "1.4.8" } }, "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ=="], "@surma/rollup-plugin-off-main-thread/magic-string": ["magic-string@0.25.9", "", { "dependencies": { "sourcemap-codec": "1.4.8" } }, "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ=="],
"@swup/parallel-plugin/@swup/plugin": ["@swup/plugin@3.0.1", "", { "dependencies": { "@swup/browserslist-config": "1.0.1", "@swup/prettier-config": "1.1.0", "chalk": "5.6.2", "microbundle": "0.15.1", "prettier": "2.8.8", "shelljs": "0.8.5", "shelljs-live": "0.0.5", "swup": "4.8.3" }, "bin": { "swup-plugin": "bin/swup-plugin.js" } }, "sha512-A9yiJeKTmQ9kac2Eo3MbMWW+Tiw23W5OSzAHVTCfW6n5zze6dexY3FLEUSDTcvRgciknvXfMZ9JTnebbvCKKWw=="], "@swup/parallel-plugin/@swup/plugin": ["@swup/plugin@3.0.1", "", { "dependencies": { "@swup/browserslist-config": "1.0.1", "@swup/prettier-config": "1.1.0", "chalk": "5.6.2", "microbundle": "0.15.1", "prettier": "2.8.8", "shelljs": "0.8.5", "shelljs-live": "0.0.5", "swup": "4.8.3" }, "bin": { "swup-plugin": "bin/swup-plugin.js" } }, "sha512-A9yiJeKTmQ9kac2Eo3MbMWW+Tiw23W5OSzAHVTCfW6n5zze6dexY3FLEUSDTcvRgciknvXfMZ9JTnebbvCKKWw=="],
@@ -2867,6 +2857,8 @@
"@typescript-eslint/eslint-plugin/ignore": ["ignore@7.0.5", "", {}, "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg=="], "@typescript-eslint/eslint-plugin/ignore": ["ignore@7.0.5", "", {}, "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg=="],
"@typescript-eslint/typescript-estree/semver": ["semver@7.7.4", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA=="],
"ajv-draft-04/ajv": ["ajv@8.18.0", "", { "dependencies": { "fast-deep-equal": "3.1.3", "fast-uri": "3.1.0", "json-schema-traverse": "1.0.0", "require-from-string": "2.0.2" } }, "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A=="], "ajv-draft-04/ajv": ["ajv@8.18.0", "", { "dependencies": { "fast-deep-equal": "3.1.3", "fast-uri": "3.1.0", "json-schema-traverse": "1.0.0", "require-from-string": "2.0.2" } }, "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A=="],
"ansi-align/string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "8.0.0", "is-fullwidth-code-point": "3.0.0", "strip-ansi": "6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], "ansi-align/string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "8.0.0", "is-fullwidth-code-point": "3.0.0", "strip-ansi": "6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="],
@@ -2875,6 +2867,8 @@
"astro/@astrojs/compiler": ["@astrojs/compiler@3.0.0", "", {}, "sha512-MwAbDE5mawZ1SS+D8qWiHdprdME5Tlj2e0YjxnEICvcOpbSukNS7Sa7hA5PK+6RrmUr/t6Gi5YgrdZKjbO/WPQ=="], "astro/@astrojs/compiler": ["@astrojs/compiler@3.0.0", "", {}, "sha512-MwAbDE5mawZ1SS+D8qWiHdprdME5Tlj2e0YjxnEICvcOpbSukNS7Sa7hA5PK+6RrmUr/t6Gi5YgrdZKjbO/WPQ=="],
"astro/semver": ["semver@7.7.4", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA=="],
"astro/svgo": ["svgo@4.0.1", "", { "dependencies": { "commander": "11.1.0", "css-select": "5.2.2", "css-tree": "3.2.1", "css-what": "6.2.2", "csso": "5.0.5", "picocolors": "1.1.1", "sax": "1.5.0" }, "bin": "./bin/svgo.js" }, "sha512-XDpWUOPC6FEibaLzjfe0ucaV0YrOjYotGJO1WpF0Zd+n6ZGEQUsSugaoLq9QkEZtAfQIxT42UChcssDVPP3+/w=="], "astro/svgo": ["svgo@4.0.1", "", { "dependencies": { "commander": "11.1.0", "css-select": "5.2.2", "css-tree": "3.2.1", "css-what": "6.2.2", "csso": "5.0.5", "picocolors": "1.1.1", "sax": "1.5.0" }, "bin": "./bin/svgo.js" }, "sha512-XDpWUOPC6FEibaLzjfe0ucaV0YrOjYotGJO1WpF0Zd+n6ZGEQUsSugaoLq9QkEZtAfQIxT42UChcssDVPP3+/w=="],
"astro-eslint-parser/entities": ["entities@6.0.1", "", {}, "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g=="], "astro-eslint-parser/entities": ["entities@6.0.1", "", {}, "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g=="],
@@ -2885,12 +2879,12 @@
"astro-eslint-parser/espree": ["espree@10.4.0", "", { "dependencies": { "acorn": "8.16.0", "acorn-jsx": "5.3.2", "eslint-visitor-keys": "4.2.1" } }, "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ=="], "astro-eslint-parser/espree": ["espree@10.4.0", "", { "dependencies": { "acorn": "8.16.0", "acorn-jsx": "5.3.2", "eslint-visitor-keys": "4.2.1" } }, "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ=="],
"astro-eslint-parser/semver": ["semver@7.7.4", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA=="],
"babel-plugin-macros/cosmiconfig": ["cosmiconfig@7.1.0", "", { "dependencies": { "@types/parse-json": "4.0.2", "import-fresh": "3.3.1", "parse-json": "5.2.0", "path-type": "4.0.0", "yaml": "1.10.2" } }, "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA=="], "babel-plugin-macros/cosmiconfig": ["cosmiconfig@7.1.0", "", { "dependencies": { "@types/parse-json": "4.0.2", "import-fresh": "3.3.1", "parse-json": "5.2.0", "path-type": "4.0.0", "yaml": "1.10.2" } }, "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA=="],
"babel-plugin-macros/resolve": ["resolve@1.22.11", "", { "dependencies": { "is-core-module": "2.16.1", "path-parse": "1.0.7", "supports-preserve-symlinks-flag": "1.0.0" }, "bin": { "resolve": "bin/resolve" } }, "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ=="], "babel-plugin-macros/resolve": ["resolve@1.22.11", "", { "dependencies": { "is-core-module": "2.16.1", "path-parse": "1.0.7", "supports-preserve-symlinks-flag": "1.0.0" }, "bin": { "resolve": "bin/resolve" } }, "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ=="],
"babel-plugin-polyfill-corejs2/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="],
"boxen/type-fest": ["type-fest@4.41.0", "", {}, "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA=="], "boxen/type-fest": ["type-fest@4.41.0", "", {}, "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA=="],
"cacheable-request/get-stream": ["get-stream@5.2.0", "", { "dependencies": { "pump": "3.0.4" } }, "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA=="], "cacheable-request/get-stream": ["get-stream@5.2.0", "", { "dependencies": { "pump": "3.0.4" } }, "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA=="],
@@ -2909,7 +2903,7 @@
"clone-response/mimic-response": ["mimic-response@1.0.1", "", {}, "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ=="], "clone-response/mimic-response": ["mimic-response@1.0.1", "", {}, "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ=="],
"cosmiconfig/parse-json": ["parse-json@5.2.0", "", { "dependencies": { "@babel/code-frame": "7.29.0", "error-ex": "1.3.4", "json-parse-even-better-errors": "2.3.1", "lines-and-columns": "1.2.4" } }, "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg=="], "conventional-changelog-writer/semver": ["semver@7.7.4", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA=="],
"crypto-random-string/type-fest": ["type-fest@1.4.0", "", {}, "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA=="], "crypto-random-string/type-fest": ["type-fest@1.4.0", "", {}, "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA=="],
@@ -2917,12 +2911,12 @@
"env-ci/execa": ["execa@8.0.1", "", { "dependencies": { "cross-spawn": "^7.0.3", "get-stream": "^8.0.1", "human-signals": "^5.0.0", "is-stream": "^3.0.0", "merge-stream": "^2.0.0", "npm-run-path": "^5.1.0", "onetime": "^6.0.0", "signal-exit": "^4.1.0", "strip-final-newline": "^3.0.0" } }, "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg=="], "env-ci/execa": ["execa@8.0.1", "", { "dependencies": { "cross-spawn": "^7.0.3", "get-stream": "^8.0.1", "human-signals": "^5.0.0", "is-stream": "^3.0.0", "merge-stream": "^2.0.0", "npm-run-path": "^5.1.0", "onetime": "^6.0.0", "signal-exit": "^4.1.0", "strip-final-newline": "^3.0.0" } }, "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg=="],
"eslint-compat-utils/semver": ["semver@7.7.4", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA=="],
"eslint-plugin-astro/postcss-selector-parser": ["postcss-selector-parser@7.1.1", "", { "dependencies": { "cssesc": "3.0.0", "util-deprecate": "1.0.2" } }, "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg=="], "eslint-plugin-astro/postcss-selector-parser": ["postcss-selector-parser@7.1.1", "", { "dependencies": { "cssesc": "3.0.0", "util-deprecate": "1.0.2" } }, "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg=="],
"eslint-plugin-react/minimatch": ["minimatch@3.1.5", "", { "dependencies": { "brace-expansion": "1.1.12" } }, "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w=="], "eslint-plugin-react/minimatch": ["minimatch@3.1.5", "", { "dependencies": { "brace-expansion": "1.1.12" } }, "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w=="],
"eslint-plugin-react/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="],
"execa/get-stream": ["get-stream@6.0.1", "", {}, "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg=="], "execa/get-stream": ["get-stream@6.0.1", "", {}, "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg=="],
"extract-zip/get-stream": ["get-stream@5.2.0", "", { "dependencies": { "pump": "3.0.4" } }, "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA=="], "extract-zip/get-stream": ["get-stream@5.2.0", "", { "dependencies": { "pump": "3.0.4" } }, "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA=="],
@@ -2955,8 +2949,6 @@
"make-asynchronous/type-fest": ["type-fest@4.41.0", "", {}, "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA=="], "make-asynchronous/type-fest": ["type-fest@4.41.0", "", {}, "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA=="],
"make-dir/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="],
"maxmin/chalk": ["chalk@1.1.3", "", { "dependencies": { "ansi-styles": "2.2.1", "escape-string-regexp": "1.0.5", "has-ansi": "2.0.0", "strip-ansi": "3.0.1", "supports-color": "2.0.0" } }, "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A=="], "maxmin/chalk": ["chalk@1.1.3", "", { "dependencies": { "ansi-styles": "2.2.1", "escape-string-regexp": "1.0.5", "has-ansi": "2.0.0", "strip-ansi": "3.0.1", "supports-color": "2.0.0" } }, "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A=="],
"maxmin/figures": ["figures@1.7.0", "", { "dependencies": { "escape-string-regexp": "1.0.5", "object-assign": "4.1.1" } }, "sha512-UxKlfCRuCBxSXU4C6t9scbDyWZ4VlaFFdojKtzJuSkuOBQ5CNFum+zZXFwHjo+CxBC1t6zlYPgHIgFjL8ggoEQ=="], "maxmin/figures": ["figures@1.7.0", "", { "dependencies": { "escape-string-regexp": "1.0.5", "object-assign": "4.1.1" } }, "sha512-UxKlfCRuCBxSXU4C6t9scbDyWZ4VlaFFdojKtzJuSkuOBQ5CNFum+zZXFwHjo+CxBC1t6zlYPgHIgFjL8ggoEQ=="],
@@ -2981,7 +2973,9 @@
"node-emoji/@sindresorhus/is": ["@sindresorhus/is@4.6.0", "", {}, "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw=="], "node-emoji/@sindresorhus/is": ["@sindresorhus/is@4.6.0", "", {}, "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw=="],
"node-exports-info/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], "normalize-package-data/hosted-git-info": ["hosted-git-info@7.0.2", "", { "dependencies": { "lru-cache": "^10.0.1" } }, "sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w=="],
"normalize-package-data/semver": ["semver@7.7.4", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA=="],
"npm/@gar/promise-retry": ["@gar/promise-retry@1.0.2", "", { "dependencies": { "retry": "^0.13.1" } }, "sha512-Lm/ZLhDZcBECta3TmCQSngiQykFdfw+QtI1/GYMsZd4l3nG+P8WLB16XuS7WaBGLQ+9E+cOcWQsth9cayuGt8g=="], "npm/@gar/promise-retry": ["@gar/promise-retry@1.0.2", "", { "dependencies": { "retry": "^0.13.1" } }, "sha512-Lm/ZLhDZcBECta3TmCQSngiQykFdfw+QtI1/GYMsZd4l3nG+P8WLB16XuS7WaBGLQ+9E+cOcWQsth9cayuGt8g=="],
@@ -3283,8 +3277,6 @@
"p-locate/p-limit": ["p-limit@3.1.0", "", { "dependencies": { "yocto-queue": "0.1.0" } }, "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ=="], "p-locate/p-limit": ["p-limit@3.1.0", "", { "dependencies": { "yocto-queue": "0.1.0" } }, "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ=="],
"parse-json/type-fest": ["type-fest@4.41.0", "", {}, "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA=="],
"parse5-htmlparser2-tree-adapter/parse5": ["parse5@6.0.1", "", {}, "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw=="], "parse5-htmlparser2-tree-adapter/parse5": ["parse5@6.0.1", "", {}, "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw=="],
"parse5-parser-stream/parse5": ["parse5@7.3.0", "", { "dependencies": { "entities": "6.0.1" } }, "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw=="], "parse5-parser-stream/parse5": ["parse5@7.3.0", "", { "dependencies": { "entities": "6.0.1" } }, "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw=="],
@@ -3315,11 +3307,11 @@
"randombytes/safe-buffer": ["safe-buffer@5.2.1", "", {}, "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="], "randombytes/safe-buffer": ["safe-buffer@5.2.1", "", {}, "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="],
"read-package-up/read-pkg": ["read-pkg@9.0.1", "", { "dependencies": { "@types/normalize-package-data": "^2.4.3", "normalize-package-data": "^6.0.0", "parse-json": "^8.0.0", "type-fest": "^4.6.0", "unicorn-magic": "^0.1.0" } }, "sha512-9viLL4/n1BJUCT1NXVTdS1jtm80yDEgR5T4yCelII49Mbj0v1rZdKqj7zCiYdbB0CuCgdrvHcNogAKTFPBocFA=="],
"read-package-up/type-fest": ["type-fest@4.41.0", "", {}, "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA=="], "read-package-up/type-fest": ["type-fest@4.41.0", "", {}, "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA=="],
"read-pkg/type-fest": ["type-fest@5.4.4", "", { "dependencies": { "tagged-tag": "^1.0.0" } }, "sha512-JnTrzGu+zPV3aXIUhnyWJj4z/wigMsdYajGLIYakqyOW1nPllzXEJee0QQbHj+CTIQtXGlAjuK0UY+2xTyjVAw=="], "read-pkg/parse-json": ["parse-json@8.3.0", "", { "dependencies": { "@babel/code-frame": "^7.26.2", "index-to-position": "^1.1.0", "type-fest": "^4.39.1" } }, "sha512-ybiGyvspI+fAoRQbIPRddCcSTV9/LsJbf0e/S85VLowVGzRmokfneg2kwVW/KU5rOXrPSbF1qAKPMgNTqqROQQ=="],
"read-pkg/type-fest": ["type-fest@4.41.0", "", {}, "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA=="],
"readable-stream/isarray": ["isarray@1.0.0", "", {}, "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ=="], "readable-stream/isarray": ["isarray@1.0.0", "", {}, "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ=="],
@@ -3369,8 +3361,12 @@
"semantic-release/read-package-up": ["read-package-up@12.0.0", "", { "dependencies": { "find-up-simple": "^1.0.1", "read-pkg": "^10.0.0", "type-fest": "^5.2.0" } }, "sha512-Q5hMVBYur/eQNWDdbF4/Wqqr9Bjvtrw2kjGxxBbKLbx8bVCL8gcArjTy8zDUuLGQicftpMuU0riQNcAsbtOVsw=="], "semantic-release/read-package-up": ["read-package-up@12.0.0", "", { "dependencies": { "find-up-simple": "^1.0.1", "read-pkg": "^10.0.0", "type-fest": "^5.2.0" } }, "sha512-Q5hMVBYur/eQNWDdbF4/Wqqr9Bjvtrw2kjGxxBbKLbx8bVCL8gcArjTy8zDUuLGQicftpMuU0riQNcAsbtOVsw=="],
"semantic-release/semver": ["semver@7.7.4", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA=="],
"send/mime-types": ["mime-types@3.0.2", "", { "dependencies": { "mime-db": "1.54.0" } }, "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A=="], "send/mime-types": ["mime-types@3.0.2", "", { "dependencies": { "mime-db": "1.54.0" } }, "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A=="],
"sharp/semver": ["semver@7.7.4", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA=="],
"signale/chalk": ["chalk@2.4.2", "", { "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", "supports-color": "^5.3.0" } }, "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ=="], "signale/chalk": ["chalk@2.4.2", "", { "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", "supports-color": "^5.3.0" } }, "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ=="],
"signale/figures": ["figures@2.0.0", "", { "dependencies": { "escape-string-regexp": "^1.0.5" } }, "sha512-Oa2M9atig69ZkfwiApY8F2Yy+tzMbazyvqv21R0NsSC8floSOC09BbT1ITWAdoMGQvJ/aZnR1KMwdx9tvHnTNA=="], "signale/figures": ["figures@2.0.0", "", { "dependencies": { "escape-string-regexp": "^1.0.5" } }, "sha512-Oa2M9atig69ZkfwiApY8F2Yy+tzMbazyvqv21R0NsSC8floSOC09BbT1ITWAdoMGQvJ/aZnR1KMwdx9tvHnTNA=="],
@@ -3389,12 +3385,16 @@
"terser/commander": ["commander@2.20.3", "", {}, "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ=="], "terser/commander": ["commander@2.20.3", "", {}, "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ=="],
"typescript-auto-import-cache/semver": ["semver@7.7.4", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA=="],
"unifont/css-tree": ["css-tree@3.2.1", "", { "dependencies": { "mdn-data": "2.27.1", "source-map-js": "1.2.1" } }, "sha512-X7sjQzceUhu1u7Y/ylrRZFU2FS6LRiFVp6rKLPg23y3x3c3DOKAwuXGDp+PAGjh6CSnCjYeAul8pcT8bAl+lSA=="], "unifont/css-tree": ["css-tree@3.2.1", "", { "dependencies": { "mdn-data": "2.27.1", "source-map-js": "1.2.1" } }, "sha512-X7sjQzceUhu1u7Y/ylrRZFU2FS6LRiFVp6rKLPg23y3x3c3DOKAwuXGDp+PAGjh6CSnCjYeAul8pcT8bAl+lSA=="],
"unstorage/chokidar": ["chokidar@5.0.0", "", { "dependencies": { "readdirp": "5.0.0" } }, "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw=="], "unstorage/chokidar": ["chokidar@5.0.0", "", { "dependencies": { "readdirp": "5.0.0" } }, "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw=="],
"vitefu/vite": ["vite@6.4.1", "", { "dependencies": { "esbuild": "0.25.12", "fdir": "6.5.0", "picomatch": "4.0.3", "postcss": "8.5.8", "rollup": "4.59.0", "tinyglobby": "0.2.15" }, "optionalDependencies": { "@types/node": "25.4.0", "fsevents": "2.3.3", "jiti": "2.6.1", "lightningcss": "1.30.2", "terser": "5.44.1", "yaml": "2.8.2" }, "bin": { "vite": "bin/vite.js" } }, "sha512-+Oxm7q9hDoLMyJOYfUYBuHQo+dkAloi33apOPP56pzj+vsdJDzr+j1NISE5pyaAuKL4A3UD34qd0lx5+kfKp2g=="], "vitefu/vite": ["vite@6.4.1", "", { "dependencies": { "esbuild": "0.25.12", "fdir": "6.5.0", "picomatch": "4.0.3", "postcss": "8.5.8", "rollup": "4.59.0", "tinyglobby": "0.2.15" }, "optionalDependencies": { "@types/node": "25.4.0", "fsevents": "2.3.3", "jiti": "2.6.1", "lightningcss": "1.30.2", "terser": "5.44.1", "yaml": "2.8.2" }, "bin": { "vite": "bin/vite.js" } }, "sha512-+Oxm7q9hDoLMyJOYfUYBuHQo+dkAloi33apOPP56pzj+vsdJDzr+j1NISE5pyaAuKL4A3UD34qd0lx5+kfKp2g=="],
"volar-service-typescript/semver": ["semver@7.7.4", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA=="],
"vscode-json-languageservice/jsonc-parser": ["jsonc-parser@3.3.1", "", {}, "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ=="], "vscode-json-languageservice/jsonc-parser": ["jsonc-parser@3.3.1", "", {}, "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ=="],
"wrap-ansi/ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="], "wrap-ansi/ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="],
@@ -3437,6 +3437,8 @@
"@playform/compress/astro/p-queue": ["p-queue@8.1.1", "", { "dependencies": { "eventemitter3": "5.0.4", "p-timeout": "6.1.4" } }, "sha512-aNZ+VfjobsWryoiPnEApGGmf5WmNsCo9xu8dfaYamG5qaLP7ClhLN6NgsFe6SwJ2UbLEBK5dv9x8Mn5+RVhMWQ=="], "@playform/compress/astro/p-queue": ["p-queue@8.1.1", "", { "dependencies": { "eventemitter3": "5.0.4", "p-timeout": "6.1.4" } }, "sha512-aNZ+VfjobsWryoiPnEApGGmf5WmNsCo9xu8dfaYamG5qaLP7ClhLN6NgsFe6SwJ2UbLEBK5dv9x8Mn5+RVhMWQ=="],
"@playform/compress/astro/semver": ["semver@7.7.4", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA=="],
"@playform/compress/astro/shiki": ["shiki@3.23.0", "", { "dependencies": { "@shikijs/core": "3.23.0", "@shikijs/engine-javascript": "3.23.0", "@shikijs/engine-oniguruma": "3.23.0", "@shikijs/langs": "3.23.0", "@shikijs/themes": "3.23.0", "@shikijs/types": "3.23.0", "@shikijs/vscode-textmate": "10.0.2", "@types/hast": "3.0.4" } }, "sha512-55Dj73uq9ZXL5zyeRPzHQsK7Nbyt6Y10k5s7OjuFZGMhpp4r/rsLBH0o/0fstIzX1Lep9VxefWljK/SKCzygIA=="], "@playform/compress/astro/shiki": ["shiki@3.23.0", "", { "dependencies": { "@shikijs/core": "3.23.0", "@shikijs/engine-javascript": "3.23.0", "@shikijs/engine-oniguruma": "3.23.0", "@shikijs/langs": "3.23.0", "@shikijs/themes": "3.23.0", "@shikijs/types": "3.23.0", "@shikijs/vscode-textmate": "10.0.2", "@types/hast": "3.0.4" } }, "sha512-55Dj73uq9ZXL5zyeRPzHQsK7Nbyt6Y10k5s7OjuFZGMhpp4r/rsLBH0o/0fstIzX1Lep9VxefWljK/SKCzygIA=="],
"@playform/compress/astro/vite": ["vite@6.4.1", "", { "dependencies": { "esbuild": "0.25.12", "fdir": "6.5.0", "picomatch": "4.0.3", "postcss": "8.5.8", "rollup": "4.59.0", "tinyglobby": "0.2.15" }, "optionalDependencies": { "@types/node": "25.4.0", "fsevents": "2.3.3", "jiti": "2.6.1", "lightningcss": "1.30.2", "terser": "5.44.1", "yaml": "2.8.2" }, "bin": { "vite": "bin/vite.js" } }, "sha512-+Oxm7q9hDoLMyJOYfUYBuHQo+dkAloi33apOPP56pzj+vsdJDzr+j1NISE5pyaAuKL4A3UD34qd0lx5+kfKp2g=="], "@playform/compress/astro/vite": ["vite@6.4.1", "", { "dependencies": { "esbuild": "0.25.12", "fdir": "6.5.0", "picomatch": "4.0.3", "postcss": "8.5.8", "rollup": "4.59.0", "tinyglobby": "0.2.15" }, "optionalDependencies": { "@types/node": "25.4.0", "fsevents": "2.3.3", "jiti": "2.6.1", "lightningcss": "1.30.2", "terser": "5.44.1", "yaml": "2.8.2" }, "bin": { "vite": "bin/vite.js" } }, "sha512-+Oxm7q9hDoLMyJOYfUYBuHQo+dkAloi33apOPP56pzj+vsdJDzr+j1NISE5pyaAuKL4A3UD34qd0lx5+kfKp2g=="],
@@ -3499,6 +3501,14 @@
"@semantic-release/npm/fs-extra/universalify": ["universalify@2.0.1", "", {}, "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw=="], "@semantic-release/npm/fs-extra/universalify": ["universalify@2.0.1", "", {}, "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw=="],
"@semantic-release/npm/read-pkg/normalize-package-data": ["normalize-package-data@8.0.0", "", { "dependencies": { "hosted-git-info": "^9.0.0", "semver": "^7.3.5", "validate-npm-package-license": "^3.0.4" } }, "sha512-RWk+PI433eESQ7ounYxIp67CYuVsS1uYSonX3kA6ps/3LWfjVQa/ptEg6Y3T6uAMq1mWpX9PQ+qx+QaHpsc7gQ=="],
"@semantic-release/npm/read-pkg/parse-json": ["parse-json@8.3.0", "", { "dependencies": { "@babel/code-frame": "^7.26.2", "index-to-position": "^1.1.0", "type-fest": "^4.39.1" } }, "sha512-ybiGyvspI+fAoRQbIPRddCcSTV9/LsJbf0e/S85VLowVGzRmokfneg2kwVW/KU5rOXrPSbF1qAKPMgNTqqROQQ=="],
"@semantic-release/npm/read-pkg/type-fest": ["type-fest@5.4.4", "", { "dependencies": { "tagged-tag": "^1.0.0" } }, "sha512-JnTrzGu+zPV3aXIUhnyWJj4z/wigMsdYajGLIYakqyOW1nPllzXEJee0QQbHj+CTIQtXGlAjuK0UY+2xTyjVAw=="],
"@semantic-release/npm/read-pkg/unicorn-magic": ["unicorn-magic@0.4.0", "", {}, "sha512-wH590V9VNgYH9g3lH9wWjTrUoKsjLF6sGLjhR4sH1LWpLmCOH0Zf7PukhDA8BiS7KHe4oPNkcTHqYkj7SOGUOw=="],
"@swup/parallel-plugin/@swup/plugin/prettier": ["prettier@2.8.8", "", { "bin": { "prettier": "bin-prettier.js" } }, "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q=="], "@swup/parallel-plugin/@swup/plugin/prettier": ["prettier@2.8.8", "", { "bin": { "prettier": "bin-prettier.js" } }, "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q=="],
"@swup/route-name-plugin/@swup/plugin/prettier": ["prettier@2.8.8", "", { "bin": { "prettier": "bin-prettier.js" } }, "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q=="], "@swup/route-name-plugin/@swup/plugin/prettier": ["prettier@2.8.8", "", { "bin": { "prettier": "bin-prettier.js" } }, "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q=="],
@@ -3537,8 +3547,6 @@
"astro/svgo/css-tree": ["css-tree@3.2.1", "", { "dependencies": { "mdn-data": "2.27.1", "source-map-js": "1.2.1" } }, "sha512-X7sjQzceUhu1u7Y/ylrRZFU2FS6LRiFVp6rKLPg23y3x3c3DOKAwuXGDp+PAGjh6CSnCjYeAul8pcT8bAl+lSA=="], "astro/svgo/css-tree": ["css-tree@3.2.1", "", { "dependencies": { "mdn-data": "2.27.1", "source-map-js": "1.2.1" } }, "sha512-X7sjQzceUhu1u7Y/ylrRZFU2FS6LRiFVp6rKLPg23y3x3c3DOKAwuXGDp+PAGjh6CSnCjYeAul8pcT8bAl+lSA=="],
"babel-plugin-macros/cosmiconfig/parse-json": ["parse-json@5.2.0", "", { "dependencies": { "@babel/code-frame": "7.29.0", "error-ex": "1.3.4", "json-parse-even-better-errors": "2.3.1", "lines-and-columns": "1.2.4" } }, "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg=="],
"babel-plugin-macros/cosmiconfig/yaml": ["yaml@1.10.2", "", {}, "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg=="], "babel-plugin-macros/cosmiconfig/yaml": ["yaml@1.10.2", "", {}, "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg=="],
"cheerio/parse5/entities": ["entities@6.0.1", "", {}, "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g=="], "cheerio/parse5/entities": ["entities@6.0.1", "", {}, "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g=="],
@@ -3597,6 +3605,8 @@
"mlly/pkg-types/confbox": ["confbox@0.1.8", "", {}, "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w=="], "mlly/pkg-types/confbox": ["confbox@0.1.8", "", {}, "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w=="],
"normalize-package-data/hosted-git-info/lru-cache": ["lru-cache@10.4.3", "", {}, "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ=="],
"npm/minipass-flush/minipass": ["minipass@3.3.6", "", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw=="], "npm/minipass-flush/minipass": ["minipass@3.3.6", "", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw=="],
"npm/minipass-pipeline/minipass": ["minipass@3.3.6", "", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw=="], "npm/minipass-pipeline/minipass": ["minipass@3.3.6", "", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw=="],
@@ -3619,10 +3629,6 @@
"postcss-svgo/svgo/csso": ["csso@4.2.0", "", { "dependencies": { "css-tree": "1.1.3" } }, "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA=="], "postcss-svgo/svgo/csso": ["csso@4.2.0", "", { "dependencies": { "css-tree": "1.1.3" } }, "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA=="],
"read-package-up/read-pkg/normalize-package-data": ["normalize-package-data@6.0.2", "", { "dependencies": { "hosted-git-info": "^7.0.0", "semver": "^7.3.5", "validate-npm-package-license": "^3.0.4" } }, "sha512-V6gygoYb/5EmNI+MEGrWkC+e6+Rr7mTmfHrxDbLzxQogBkgzo76rkok0Am6thgSF7Mv2nLOajAJj5vDJZEFn7g=="],
"read-package-up/read-pkg/unicorn-magic": ["unicorn-magic@0.1.0", "", {}, "sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ=="],
"rollup-plugin-bundle-size/chalk/ansi-styles": ["ansi-styles@2.2.1", "", {}, "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA=="], "rollup-plugin-bundle-size/chalk/ansi-styles": ["ansi-styles@2.2.1", "", {}, "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA=="],
"rollup-plugin-bundle-size/chalk/escape-string-regexp": ["escape-string-regexp@1.0.5", "", {}, "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg=="], "rollup-plugin-bundle-size/chalk/escape-string-regexp": ["escape-string-regexp@1.0.5", "", {}, "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg=="],
@@ -3669,6 +3675,8 @@
"semantic-release/execa/strip-final-newline": ["strip-final-newline@4.0.0", "", {}, "sha512-aulFJcD6YK8V1G7iRB5tigAP4TsHBZZrOV8pjV++zdUwmeV8uzbY7yn6h9MswN62adStNZFuCIx4haBnRuMDaw=="], "semantic-release/execa/strip-final-newline": ["strip-final-newline@4.0.0", "", {}, "sha512-aulFJcD6YK8V1G7iRB5tigAP4TsHBZZrOV8pjV++zdUwmeV8uzbY7yn6h9MswN62adStNZFuCIx4haBnRuMDaw=="],
"semantic-release/read-package-up/read-pkg": ["read-pkg@10.1.0", "", { "dependencies": { "@types/normalize-package-data": "^2.4.4", "normalize-package-data": "^8.0.0", "parse-json": "^8.3.0", "type-fest": "^5.4.4", "unicorn-magic": "^0.4.0" } }, "sha512-I8g2lArQiP78ll51UeMZojewtYgIRCKCWqZEgOO8c/uefTI+XDXvCSXu3+YNUaTNvZzobrL5+SqHjBrByRRTdg=="],
"semantic-release/read-package-up/type-fest": ["type-fest@5.4.4", "", { "dependencies": { "tagged-tag": "^1.0.0" } }, "sha512-JnTrzGu+zPV3aXIUhnyWJj4z/wigMsdYajGLIYakqyOW1nPllzXEJee0QQbHj+CTIQtXGlAjuK0UY+2xTyjVAw=="], "semantic-release/read-package-up/type-fest": ["type-fest@5.4.4", "", { "dependencies": { "tagged-tag": "^1.0.0" } }, "sha512-JnTrzGu+zPV3aXIUhnyWJj4z/wigMsdYajGLIYakqyOW1nPllzXEJee0QQbHj+CTIQtXGlAjuK0UY+2xTyjVAw=="],
"send/mime-types/mime-db": ["mime-db@1.54.0", "", {}, "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ=="], "send/mime-types/mime-db": ["mime-db@1.54.0", "", {}, "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ=="],
@@ -3777,6 +3785,8 @@
"@semantic-release/npm/execa/npm-run-path/unicorn-magic": ["unicorn-magic@0.3.0", "", {}, "sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA=="], "@semantic-release/npm/execa/npm-run-path/unicorn-magic": ["unicorn-magic@0.3.0", "", {}, "sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA=="],
"@semantic-release/npm/read-pkg/parse-json/type-fest": ["type-fest@4.41.0", "", {}, "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA=="],
"ansi-align/string-width/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], "ansi-align/string-width/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="],
"astro/svgo/css-tree/mdn-data": ["mdn-data@2.27.1", "", {}, "sha512-9Yubnt3e8A0OKwxYSXyhLymGW4sCufcLG6VdiDdUGVkPhpqLxlvP5vl1983gQjJl3tqbrM731mjaZaP68AgosQ=="], "astro/svgo/css-tree/mdn-data": ["mdn-data@2.27.1", "", {}, "sha512-9Yubnt3e8A0OKwxYSXyhLymGW4sCufcLG6VdiDdUGVkPhpqLxlvP5vl1983gQjJl3tqbrM731mjaZaP68AgosQ=="],
@@ -3821,8 +3831,6 @@
"postcss-svgo/svgo/css-tree/mdn-data": ["mdn-data@2.0.14", "", {}, "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow=="], "postcss-svgo/svgo/css-tree/mdn-data": ["mdn-data@2.0.14", "", {}, "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow=="],
"read-package-up/read-pkg/normalize-package-data/hosted-git-info": ["hosted-git-info@7.0.2", "", { "dependencies": { "lru-cache": "^10.0.1" } }, "sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w=="],
"rollup-plugin-bundle-size/chalk/strip-ansi/ansi-regex": ["ansi-regex@2.1.1", "", {}, "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA=="], "rollup-plugin-bundle-size/chalk/strip-ansi/ansi-regex": ["ansi-regex@2.1.1", "", {}, "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA=="],
"rollup-plugin-postcss/chalk/ansi-styles/color-convert": ["color-convert@2.0.1", "", { "dependencies": { "color-name": "1.1.4" } }, "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="], "rollup-plugin-postcss/chalk/ansi-styles/color-convert": ["color-convert@2.0.1", "", { "dependencies": { "color-name": "1.1.4" } }, "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="],
@@ -3841,6 +3849,12 @@
"semantic-release/execa/npm-run-path/unicorn-magic": ["unicorn-magic@0.3.0", "", {}, "sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA=="], "semantic-release/execa/npm-run-path/unicorn-magic": ["unicorn-magic@0.3.0", "", {}, "sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA=="],
"semantic-release/read-package-up/read-pkg/normalize-package-data": ["normalize-package-data@8.0.0", "", { "dependencies": { "hosted-git-info": "^9.0.0", "semver": "^7.3.5", "validate-npm-package-license": "^3.0.4" } }, "sha512-RWk+PI433eESQ7ounYxIp67CYuVsS1uYSonX3kA6ps/3LWfjVQa/ptEg6Y3T6uAMq1mWpX9PQ+qx+QaHpsc7gQ=="],
"semantic-release/read-package-up/read-pkg/parse-json": ["parse-json@8.3.0", "", { "dependencies": { "@babel/code-frame": "^7.26.2", "index-to-position": "^1.1.0", "type-fest": "^4.39.1" } }, "sha512-ybiGyvspI+fAoRQbIPRddCcSTV9/LsJbf0e/S85VLowVGzRmokfneg2kwVW/KU5rOXrPSbF1qAKPMgNTqqROQQ=="],
"semantic-release/read-package-up/read-pkg/unicorn-magic": ["unicorn-magic@0.4.0", "", {}, "sha512-wH590V9VNgYH9g3lH9wWjTrUoKsjLF6sGLjhR4sH1LWpLmCOH0Zf7PukhDA8BiS7KHe4oPNkcTHqYkj7SOGUOw=="],
"signale/chalk/supports-color/has-flag": ["has-flag@3.0.0", "", {}, "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw=="], "signale/chalk/supports-color/has-flag": ["has-flag@3.0.0", "", {}, "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw=="],
"vitefu/vite/esbuild/@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.25.12", "", { "os": "aix", "cpu": "ppc64" }, "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA=="], "vitefu/vite/esbuild/@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.25.12", "", { "os": "aix", "cpu": "ppc64" }, "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA=="],
@@ -3915,8 +3929,6 @@
"postcss-svgo/svgo/css-select/domutils/dom-serializer": ["dom-serializer@1.4.1", "", { "dependencies": { "domelementtype": "2.3.0", "domhandler": "4.3.1", "entities": "2.2.0" } }, "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag=="], "postcss-svgo/svgo/css-select/domutils/dom-serializer": ["dom-serializer@1.4.1", "", { "dependencies": { "domelementtype": "2.3.0", "domhandler": "4.3.1", "entities": "2.2.0" } }, "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag=="],
"read-package-up/read-pkg/normalize-package-data/hosted-git-info/lru-cache": ["lru-cache@10.4.3", "", {}, "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ=="],
"rollup-plugin-postcss/chalk/ansi-styles/color-convert/color-name": ["color-name@1.1.4", "", {}, "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="], "rollup-plugin-postcss/chalk/ansi-styles/color-convert/color-name": ["color-name@1.1.4", "", {}, "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="],
"rollup-plugin-visualizer/yargs/cliui/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], "rollup-plugin-visualizer/yargs/cliui/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="],
@@ -3925,6 +3937,8 @@
"rollup-plugin-visualizer/yargs/string-width/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], "rollup-plugin-visualizer/yargs/string-width/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="],
"semantic-release/read-package-up/read-pkg/parse-json/type-fest": ["type-fest@4.41.0", "", {}, "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA=="],
"@astrojs/check/yargs/cliui/wrap-ansi/ansi-styles/color-convert": ["color-convert@2.0.1", "", { "dependencies": { "color-name": "1.1.4" } }, "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="], "@astrojs/check/yargs/cliui/wrap-ansi/ansi-styles/color-convert": ["color-convert@2.0.1", "", { "dependencies": { "color-name": "1.1.4" } }, "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="],
"cli-highlight/yargs/cliui/wrap-ansi/ansi-styles/color-convert": ["color-convert@2.0.1", "", { "dependencies": { "color-name": "1.1.4" } }, "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="], "cli-highlight/yargs/cliui/wrap-ansi/ansi-styles/color-convert": ["color-convert@2.0.1", "", { "dependencies": { "color-name": "1.1.4" } }, "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="],

View File

@@ -1,7 +1,7 @@
{ {
"name": "site-profile", "name": "site-profile",
"type": "module", "type": "module",
"version": "3.6.0", "version": "3.7.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",
@@ -19,10 +19,8 @@
}, },
"scripts": { "scripts": {
"dev": "astro dev", "dev": "astro dev",
"full-dev": "rm -rf dist node_modules .astro && bun install && astro build && astro dev",
"build": "astro build", "build": "astro build",
"preview": "astro preview", "preview": "astro preview",
"full-preview": "rm -rf dist node_modules .astro && bun install && astro build && astro preview",
"astro": "astro", "astro": "astro",
"format": "prettier --write \"**/*.{js,jsx,ts,tsx,md,mdx,astro}\"", "format": "prettier --write \"**/*.{js,jsx,ts,tsx,md,mdx,astro}\"",
"lint": "eslint \"src/**/*.{js,ts,jsx,tsx,astro}\"", "lint": "eslint \"src/**/*.{js,ts,jsx,tsx,astro}\"",
@@ -69,12 +67,10 @@
"@semantic-release/changelog": "^6.0.3", "@semantic-release/changelog": "^6.0.3",
"@semantic-release/commit-analyzer": "^13.0.1", "@semantic-release/commit-analyzer": "^13.0.1",
"@semantic-release/git": "^10.0.1", "@semantic-release/git": "^10.0.1",
"@semantic-release/npm": "^13.1.5",
"@semantic-release/release-notes-generator": "^14.1.0", "@semantic-release/release-notes-generator": "^14.1.0",
"@tailwindcss/forms": "^0.5.11", "@tailwindcss/forms": "^0.5.11",
"@tailwindcss/typography": "^0.5.19", "@tailwindcss/typography": "^0.5.19",
"@types/markdown-it": "^14.1.2", "@types/markdown-it": "^14.1.2",
"@types/photoswipe": "^5.2.5",
"eslint": "^10.0.3", "eslint": "^10.0.3",
"eslint-config-prettier": "^10.1.8", "eslint-config-prettier": "^10.1.8",
"eslint-plugin-astro": "^1.6.0", "eslint-plugin-astro": "^1.6.0",

View File

@@ -95,3 +95,5 @@ const currentPath = pathname.slice(1);
</div> </div>
</nav> </nav>
</header> </header>
<script is:inline src="/vendor/preline/collapse2.1.0.min.js"></script>

View File

@@ -43,93 +43,106 @@
</button> </button>
<script is:inline> <script is:inline>
(() => { const applyTheme = () => {
const isDark = const isDark =
localStorage.theme === 'dark' || localStorage.theme === 'dark' ||
(!('theme' in localStorage) && window.matchMedia('(prefers-color-scheme: dark)').matches); (!('theme' in localStorage) && window.matchMedia('(prefers-color-scheme: dark)').matches);
document.documentElement.classList.toggle('dark', isDark); document.documentElement.classList.toggle('dark', isDark);
})(); };
applyTheme();
document.addEventListener('astro:after-swap', applyTheme);
</script> </script>
<script> <script>
if (!document.querySelector('.theme-switch-overlay')) { function setupThemeToggle() {
const overlay = document.createElement('div'); const themeToggles = document.querySelectorAll('[data-theme-toggle]');
overlay.className = 'theme-switch-overlay fixed inset-0 pointer-events-none z-50';
overlay.style.opacity = '0';
overlay.style.transition = 'opacity 0.15s ease-out';
document.body.appendChild(overlay);
}
['click', 'touchend'].forEach((eventType) => {
document.addEventListener(
eventType,
(e) => {
const target = e.target as HTMLElement;
const toggle = target.closest('[data-theme-toggle]');
if (!toggle) return;
e.preventDefault(); // Create theme switch overlay element
if (!document.querySelector('.theme-switch-overlay')) {
const overlay = document.createElement('div');
overlay.className = 'theme-switch-overlay fixed inset-0 pointer-events-none z-50';
overlay.style.opacity = '0';
overlay.style.transition = 'opacity 0.15s ease-out';
document.body.appendChild(overlay);
}
let x, y; themeToggles.forEach((toggle) => {
const rect = toggle.getBoundingClientRect(); ['click', 'touchend'].forEach((eventType) => {
toggle.addEventListener(
if (eventType === 'touchend') { eventType,
const touchEvent = e as TouchEvent; (e) => {
if (touchEvent.changedTouches && touchEvent.changedTouches[0]) { e.preventDefault();
x = touchEvent.changedTouches[0].clientX - rect.left; e.stopPropagation();
y = touchEvent.changedTouches[0].clientY - rect.top;
}
} else {
const mouseEvent = e as MouseEvent;
x = mouseEvent.clientX - rect.left;
y = mouseEvent.clientY - rect.top;
}
document.documentElement.style.setProperty('--x', `${x}px`); // Get click/touch position for radial animation
document.documentElement.style.setProperty('--y', `${y}px`); let x, y;
if (e.type === 'touchend' && e.changedTouches && e.changedTouches[0]) {
const overlay = document.querySelector('.theme-switch-overlay') as HTMLElement; const rect = toggle.getBoundingClientRect();
const isDark = document.documentElement.classList.contains('dark'); x = e.changedTouches[0].clientX - rect.left;
const newTheme = isDark ? 'light' : 'dark'; y = e.changedTouches[0].clientY - rect.top;
} else {
if (overlay) { const rect = toggle.getBoundingClientRect();
overlay.style.backgroundColor = x = e.clientX - rect.left;
newTheme === 'dark' ? 'rgba(24, 24, 27, 0.3)' : 'rgba(255, 255, 255, 0.3)'; y = e.clientY - rect.top;
overlay.style.opacity = '1';
}
document.documentElement.classList.add('theme-switching');
document.body.offsetHeight;
setTimeout(() => {
if (isDark) {
document.documentElement.classList.remove('dark');
} else {
document.documentElement.classList.add('dark');
}
localStorage.setItem('theme', newTheme);
document.dispatchEvent(
new CustomEvent('themeChanged', {
detail: { isDark: newTheme === 'dark' },
})
);
document.body.offsetHeight;
setTimeout(() => {
if (overlay) {
overlay.style.opacity = '0';
} }
document.documentElement.classList.remove('theme-switching');
}, 150);
}, 50);
},
{ passive: false }
);
});
document.documentElement.style.setProperty('--x', `${x}px`);
document.documentElement.style.setProperty('--y', `${y}px`);
const overlay = document.querySelector('.theme-switch-overlay');
const isDark = document.documentElement.classList.contains('dark');
const newTheme = isDark ? 'light' : 'dark';
// Show overlay during transition
if (overlay) {
overlay.style.backgroundColor =
newTheme === 'dark' ? 'rgba(24, 24, 27, 0.3)' : 'rgba(255, 255, 255, 0.3)';
overlay.style.opacity = '1';
}
document.documentElement.classList.add('theme-switching');
// Force a reflow to ensure all elements update
document.body.offsetHeight;
// Toggle dark mode with a slight delay to allow overlay to appear
setTimeout(() => {
if (isDark) {
document.documentElement.classList.remove('dark');
} else {
document.documentElement.classList.add('dark');
}
localStorage.setItem('theme', newTheme);
document.dispatchEvent(
new CustomEvent('themeChanged', {
detail: { isDark: newTheme === 'dark' },
})
);
// Force another reflow to ensure all elements update
document.body.offsetHeight;
setTimeout(() => {
if (overlay) {
overlay.style.opacity = '0';
}
document.documentElement.classList.remove('theme-switching');
}, 150);
}, 50);
},
{ passive: false }
);
});
});
}
// Run setup on load
document.addEventListener('astro:page-load', setupThemeToggle);
// Also run on page visibility change to ensure theme is consistent
document.addEventListener('visibilitychange', () => { document.addEventListener('visibilitychange', () => {
if (document.visibilityState === 'visible') { if (document.visibilityState === 'visible') {
const currentTheme = localStorage.getItem('theme'); const currentTheme = localStorage.getItem('theme');
@@ -141,6 +154,7 @@
} }
}); });
// Listen for system preference changes
window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', ({ matches }) => { window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', ({ matches }) => {
if (!localStorage.getItem('theme')) { if (!localStorage.getItem('theme')) {
if (matches) { if (matches) {

View File

@@ -4,7 +4,7 @@ import { Image } from 'astro:assets';
import type { Post } from '@lib/directusTypes'; import type { Post } from '@lib/directusTypes';
import PostMetadataSnippet from '@/components/snippets/PostMetadataSnippet.astro'; import PostMetadataSnippet from '@/components/snippets/PostMetadataSnippet.astro';
import { getDirectusImageURL } from '@/scripts/url'; import { getDirectusImageURL } from '@/support/url';
interface Props { interface Props {
post: Post; post: Post;

View File

@@ -1,6 +1,6 @@
--- ---
import Logo from '@components/images/Logo.astro'; import Logo from '@components/images/Logo.astro';
import { getDirectusImageURL } from '@/scripts/url'; import { getDirectusImageURL } from '@/support/url';
interface Props { interface Props {
slug: string; slug: string;
@@ -22,8 +22,8 @@ const { slug, title, description, logoLight, logoDark, count, publishDate } = As
data-astro-prefetch data-astro-prefetch
> >
<div class="relative grow overflow-hidden"> <div class="relative grow overflow-hidden">
<div class="mask-fade-edges absolute inset-1 flex flex-col p-3 md:p-4 lg:p-5"> <div class="absolute inset-1 flex flex-col p-3 md:p-4 lg:p-5">
<div class="flex flex-row items-center mb-4 shrink-0"> <div class="flex flex-row items-center mb-4">
<div class="card-hover-icon-scale shrink-0 mr-3"> <div class="card-hover-icon-scale shrink-0 mr-3">
<Logo <Logo
srcLight={getDirectusImageURL(logoLight)} srcLight={getDirectusImageURL(logoLight)}
@@ -35,12 +35,12 @@ const { slug, title, description, logoLight, logoDark, count, publishDate } = As
{title} {title}
</h3> </h3>
</div> </div>
<div class="overflow-hidden"> <div>
<p class="card-text-description line-clamp-3"> <p class="card-text-description mb-4">
{description} {description}
</p> </p>
</div> </div>
<div class="card-text-description flex shrink-0 items-center justify-between text-xs mt-auto pt-1 md:pt-2"> <div class="card-text-description flex items-center justify-between text-xs mt-auto pt-1 md:pt-2">
<span class="inline-flex items-center"> <span class="inline-flex items-center">
<svg <svg
xmlns="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg"

View File

@@ -2,7 +2,7 @@
import { Icon } from 'astro-icon/components'; import { Icon } from 'astro-icon/components';
import Logo from '@components/images/Logo.astro'; import Logo from '@components/images/Logo.astro';
import { getDirectusImageURL } from '@/scripts/url'; import { getDirectusImageURL } from '@/support/url';
interface Props { interface Props {
topic: string; topic: string;

View File

@@ -5,7 +5,7 @@ import type { Post } from '@lib/directusTypes';
import ReadMoreButton from '@components/buttons/ReadMoreButton.astro'; import ReadMoreButton from '@components/buttons/ReadMoreButton.astro';
import PostMetadataSnippet from '@/components/snippets/PostMetadataSnippet.astro'; import PostMetadataSnippet from '@/components/snippets/PostMetadataSnippet.astro';
import { getDirectusImageURL } from '@/scripts/url'; import { getDirectusImageURL } from '@/support/url';
interface Props { interface Props {
post: Post; post: Post;

View File

@@ -5,7 +5,7 @@ import type { Post } from '@lib/directusTypes';
import ReadMoreButton from '@components/buttons/ReadMoreButton.astro'; import ReadMoreButton from '@components/buttons/ReadMoreButton.astro';
import PostMetadataSnippet from '@/components/snippets/PostMetadataSnippet.astro'; import PostMetadataSnippet from '@/components/snippets/PostMetadataSnippet.astro';
import { getDirectusImageURL } from '@/scripts/url'; import { getDirectusImageURL } from '@/support/url';
interface Props { interface Props {
post: Post; post: Post;

View File

@@ -1,6 +1,6 @@
--- ---
import Logo from '@components/images/Logo.astro'; import Logo from '@components/images/Logo.astro';
import { getDirectusImageURL } from '@/scripts/url'; import { getDirectusImageURL } from '@/support/url';
interface Props { interface Props {
url: string; url: string;

View File

@@ -2,7 +2,7 @@
import { Icon } from 'astro-icon/components'; import { Icon } from 'astro-icon/components';
import { Image } from 'astro:assets'; import { Image } from 'astro:assets';
import { getDirectusImageURL } from '@/scripts/url'; import { getDirectusImageURL } from '@/support/url';
interface Props { interface Props {
title: string; title: string;

View File

@@ -1,7 +1,7 @@
--- ---
import ReadMoreButton from '@components/buttons/ReadMoreButton.astro'; import ReadMoreButton from '@components/buttons/ReadMoreButton.astro';
import Logo from '@components/images/Logo.astro'; import Logo from '@components/images/Logo.astro';
import { getDirectusImageURL } from '@/scripts/url'; import { getDirectusImageURL } from '@/support/url';
interface Props { interface Props {
title: string; title: string;

View File

@@ -6,7 +6,7 @@ import type { Post } from '@lib/directusTypes';
import CategoryCard from '@components/cards/CategoryCard.astro'; import CategoryCard from '@components/cards/CategoryCard.astro';
import LargeCategoryCard from '@components/cards/LargeCategoryCard.astro'; import LargeCategoryCard from '@components/cards/LargeCategoryCard.astro';
import directus from '@lib/directus'; import directus from '@lib/directus';
import { formatFromNow } from '@/scripts/time'; import { formatFromNow } from '@support/time';
const global = await directus.request(readSingleton('site_global')); const global = await directus.request(readSingleton('site_global'));

View File

@@ -1,7 +1,7 @@
--- ---
import GoLinkPrimaryButton from '@components/buttons/GoLinkPrimaryButton.astro'; import GoLinkPrimaryButton from '@components/buttons/GoLinkPrimaryButton.astro';
import Logo from '@components/images/Logo.astro'; import Logo from '@components/images/Logo.astro';
import { getDirectusImageURL } from '@/scripts/url'; import { getDirectusImageURL } from '@/support/url';
interface Props { interface Props {
title: string; title: string;

View File

@@ -7,7 +7,7 @@ import type { HeaderImage } from '@lib/directusTypes';
import GoLinkPrimaryButton from '@components/buttons/GoLinkPrimaryButton.astro'; import GoLinkPrimaryButton from '@components/buttons/GoLinkPrimaryButton.astro';
import GoLinkSecondaryButton from '@components/buttons/GoLinkSecondaryButton.astro'; import GoLinkSecondaryButton from '@components/buttons/GoLinkSecondaryButton.astro';
import directus from '@lib/directus'; import directus from '@lib/directus';
import { getDirectusImageURL } from '@/scripts/url'; import { getDirectusImageURL } from '@/support/url';
interface Props { interface Props {
title: string; title: string;
@@ -82,7 +82,7 @@ const images = await Promise.all(imagesData.map(async (img) => ({
</section> </section>
<script> <script>
function initHeroImage() { document.addEventListener('astro:page-load', () => {
const container = document.getElementById('hero-image-container'); const container = document.getElementById('hero-image-container');
if (container) { if (container) {
const images = container.querySelectorAll('.hero-image'); const images = container.querySelectorAll('.hero-image');
@@ -96,13 +96,5 @@ const images = await Promise.all(imagesData.map(async (img) => ({
images[randomIndex].classList.add('flex'); images[randomIndex].classList.add('flex');
} }
} }
} });
if (document.readyState === 'loading') {
document.addEventListener('DOMContentLoaded', initHeroImage);
} else {
initHeroImage();
}
if ((window as any).swup) {
(window as any).swup.hooks.on('page:view', initHeroImage);
}
</script> </script>

View File

@@ -18,7 +18,7 @@ const global = await directus.request(readSingleton('site_global'));
const { posts, title, subTitle } = Astro.props; const { posts, title, subTitle } = Astro.props;
--- ---
<section class="max-w-340 2xl:max-w-full px-4 sm:px-6 lg:px-8 py-10 lg:py-14 mx-auto mb-2 md:mb-4"> <section class="max-w-340 2xl:max-w-full px-4 sm:px-6 lg:px-8 py-10 lg:py-14 mx-auto mb-2 md:mb-8">
<div class="text-center max-w-2xl mx-auto mb-10 lg:mb-14"> <div class="text-center max-w-2xl mx-auto mb-10 lg:mb-14">
<h1 class="smooth-reveal card-text-header block"> <h1 class="smooth-reveal card-text-header block">
{title} {title}

View File

@@ -11,7 +11,7 @@ interface Props {
const { posts } = Astro.props; const { posts } = Astro.props;
--- ---
<section class="smooth-reveal-cards flex flex-col gap-4 md:mb-20"> <section class="smooth-reveal flex flex-col gap-4 md:mb-20">
{posts.map((post, index) => index % 2 === 0 ? ( {posts.map((post, index) => index % 2 === 0 ? (
<LargeBlogLeftCard post={post}/> <LargeBlogLeftCard post={post}/>
) : ( ) : (

View File

@@ -1,6 +1,6 @@
--- ---
import WeatherCard from '@components/cards/WeatherCard.astro'; import WeatherCard from '@components/cards/WeatherCard.astro';
import { getFiveDayForecast } from '@/scripts/weather'; import { getFiveDayForecast } from '@support/weather';
const { latitude = "44.95", longitude = "-93.09", cityName = "St. Paul, Minnesota", timezone = "America/Chicago" } = Astro.props; const { latitude = "44.95", longitude = "-93.09", cityName = "St. Paul, Minnesota", timezone = "America/Chicago" } = Astro.props;
@@ -20,7 +20,7 @@ const { forecastDays, error } = await getFiveDayForecast(latitude, longitude, ti
</div> </div>
{error ? ( {error ? (
<div class="card-base p-10 text-accent text-center"> <div class="card-base p-10 text-accent text-center">
Sorry, {error.toLowerCase()} Sorry, {error.toLowerCase}
</div> </div>
) : ( ) : (
<div class="flex flex-wrap justify-center gap-4 lg:gap-6"> <div class="flex flex-wrap justify-center gap-4 lg:gap-6">

View File

@@ -4,8 +4,8 @@ import getReadingTime from 'reading-time';
import type { Post } from '@lib/directusTypes'; import type { Post } from '@lib/directusTypes';
import Logo from '@components/images/Logo.astro'; import Logo from '@components/images/Logo.astro';
import { formatShortDate, formatDate } from '@/scripts/time'; import { formatShortDate, formatDate } from '@support/time';
import { getDirectusImageURL } from '@/scripts/url'; import { getDirectusImageURL } from '@/support/url';
interface Props { interface Props {
post: Post; post: Post;

View File

@@ -1,4 +1,5 @@
--- ---
import { ClientRouter } from 'astro:transitions';
import { readSingleton } from '@directus/sdk'; import { readSingleton } from '@directus/sdk';
import BaseHead from '@components/BaseHead.astro'; import BaseHead from '@components/BaseHead.astro';
@@ -38,7 +39,8 @@ const normalizeTitle = !title ? global.name : `${title} | ${global.name}`;
structuredData={structuredData} structuredData={structuredData}
/> />
<!-- Set Theme --> <ClientRouter fallback="swap" />
<script is:inline> <script is:inline>
const theme = (() => { const theme = (() => {
if (typeof localStorage !== 'undefined' && localStorage.getItem('theme')) { if (typeof localStorage !== 'undefined' && localStorage.getItem('theme')) {
@@ -58,12 +60,6 @@ const normalizeTitle = !title ? global.name : `${title} | ${global.name}`;
window.localStorage.setItem('theme', theme); window.localStorage.setItem('theme', theme);
</script> </script>
<!-- Preline -->
<script
src="/vendor/preline/collapse2.1.0.min.js"
is:inline
/>
<!-- Rybbit Tracking Snippet --> <!-- Rybbit Tracking Snippet -->
<script <script
src="https://rybbit.alexlebens.dev/api/script.js" src="https://rybbit.alexlebens.dev/api/script.js"
@@ -101,29 +97,14 @@ const normalizeTitle = !title ? global.name : `${title} | ${global.name}`;
</html> </html>
<script> <script>
import { initPhotoSwipe } from '@/scripts/photoswipe';
import { animateContent } from '@/scripts/animations';
const resetScroll = () => { const resetScroll = () => {
const scrollContainer = document.getElementById('reset-scroll'); const scrollContainer = document.getElementById('reset-scroll');
if (scrollContainer) scrollContainer.scrollTop = 0; if (scrollContainer) {
scrollContainer.scrollTop = 0;
}
}; };
resetScroll(); resetScroll();
initPhotoSwipe(); document.addEventListener('astro:after-swap', resetScroll);
animateContent();
document.addEventListener('swup:page:view', () => {
resetScroll();
initPhotoSwipe();
animateContent();
if (typeof (window as any).HSStaticMethods !== 'undefined') {
(window as any).HSStaticMethods.autoInit();
}
if (typeof (window as any).rybbit === 'function') {
(window as any).rybbit('trackPageview');
}
});
</script> </script>
<style> <style>

View File

@@ -14,7 +14,7 @@ import type {
Skill, Skill,
} from '@lib/directusTypes'; } from '@lib/directusTypes';
import { getDirectusURL } from '@/scripts/url'; import { getDirectusURL } from '@/support/url';
type Schema = { type Schema = {
site_global: Global; site_global: Global;

View File

@@ -86,6 +86,24 @@ const global = await directus.request(readSingleton('site_global'));
const randomFact = funFacts[Math.floor(Math.random() * funFacts.length)]; const randomFact = funFacts[Math.floor(Math.random() * funFacts.length)];
funFactElement.textContent = randomFact; funFactElement.textContent = randomFact;
} }
// 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');
},
100 + index * 150
);
});
};
animateContent();
});
</script> </script>
<style> <style>

View File

@@ -47,3 +47,33 @@ const global = await directus.request(readSingleton('site_global'));
</section> </section>
</BaseLayout> </BaseLayout>
<script>
// Add smooth reveal animations for content after loading
document.addEventListener('astro:page-load', () => {
const animateContent = () => {
const smoothReveal = document.querySelectorAll('.smooth-reveal');
smoothReveal.forEach((el, index) => {
setTimeout(
() => {
el.classList.add('animate-reveal');
},
50 + index * 100
);
});
// Animate with just fade in with staggered delay
const smoothRevealFade = document.querySelectorAll('.smooth-reveal-fade');
smoothRevealFade.forEach((el, index) => {
setTimeout(
() => {
el.classList.add('animate-reveal-fade');
},
100 + index * 250
);
});
};
animateContent();
});
</script>

View File

@@ -52,3 +52,56 @@ const posts = await directus.request(
</section> </section>
</BaseLayout> </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
);
});
// Animate group 2
const smoothReveal2 = document.querySelectorAll('.smooth-reveal-2');
smoothReveal2.forEach((el, index) => {
setTimeout(
() => {
el.classList.add('animate-reveal');
},
200 + index * 150
);
});
// Animate topic cards with staggered delay
const smoothRevealCards = document.querySelectorAll('.smooth-reveal-cards');
smoothRevealCards.forEach((el, index) => {
setTimeout(
() => {
el.classList.add('animate-reveal');
},
500 + index * 100
);
});
// Animate with just fade in with staggered delay
const smoothRevealFade = document.querySelectorAll('.smooth-reveal-fade');
smoothRevealFade.forEach((el, index) => {
setTimeout(
() => {
el.classList.add('animate-reveal-fade');
},
100 + index * 250
);
});
};
animateContent();
});
</script>

View File

@@ -37,3 +37,23 @@ const global = await directus.request(readSingleton('site_global'));
<ApplicationSection className="smooth-reveal-2" /> <ApplicationSection className="smooth-reveal-2" />
</BaseLayout> </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

@@ -1,64 +1,51 @@
--- ---
import { Image } from 'astro:assets'; import { Image } from 'astro:assets';
import { marked } from 'marked'; import { marked } from 'marked';
import markedShiki from 'marked-shiki'; import markedShiki from 'marked-shiki';
import { createHighlighter } from 'shiki'; import { createHighlighter } from 'shiki';
import { readItems, readSingleton } from '@directus/sdk'; import { readItems, readSingleton } from '@directus/sdk';
import "photoswipe/style.css"; import 'photoswipe/style.css';
import type { Post } from '@/lib/directusTypes'
import SocialShareButton from '@components/buttons/SocialShareButton.astro'; import SocialShareButton from '@components/buttons/SocialShareButton.astro';
import PostMetadataSnippet from '@/components/snippets/PostMetadataSnippet.astro'; import PostMetadataSnippet from '@/components/snippets/PostMetadataSnippet.astro';
import BaseLayout from '@layouts/BaseLayout.astro'; import BaseLayout from '@layouts/BaseLayout.astro';
import directus from '@lib/directus'; import directus from '@lib/directus';
import { getDirectusImageURL } from '@/scripts/url'; import { getDirectusImageURL } from '@/support/url';
const post = Astro.props;
export async function getStaticPaths() { export async function getStaticPaths() {
const posts = await directus.request(readItems('posts', { const posts = await directus.request(readItems('posts', {
fields: ['*', { category: ['*'] }], fields: ['*', { category: ['*'] }],
})); }));
const globalData = await directus.request(readSingleton('site_global')); return posts.map((post) => ({
const highlighter = await createHighlighter({
themes: ['github-light', 'github-dark'],
langs: ['typescript', 'python', 'css', 'html', 'yaml', 'bash', 'json'],
});
const renderer = {
image({ href, title, text }: { href: string; title: string | null; text: string }) {
return `
<a
href="${href}"
class="pswp-link"
data-pswp-src="${href}"
target="_blank"
>
<img src="${href}" alt="${text}" title="${title || ''}" loading="lazy" />
</a>
`;
},
};
marked.use({ renderer });
marked.use(markedShiki({
highlight(code, lang) {
return highlighter.codeToHtml(code, {
lang: lang || 'plaintext',
themes: { light: 'github-light', dark: 'github-dark' },
defaultColor: false,
});
}
}));
return posts.map((post: Post) => ({
params: { slug: post.slug }, params: { slug: post.slug },
props: { props: post,
post,
global: globalData,
content: marked.parse(post.content || ''),
},
})); }));
} }
const { post, global, content } = Astro.props; const global = await directus.request(readSingleton('site_global'));
const highlighter = await createHighlighter({
themes: ['github-light', 'github-dark'],
langs: ['typescript', 'python', 'css', 'html', 'yaml', 'bash', 'json'],
});
marked.use(markedShiki({
highlight(code, lang) {
return highlighter.codeToHtml(code, {
lang: lang || 'plaintext',
themes: {
light: 'github-light',
dark: 'github-dark',
},
defaultColor: false,
});
}
}));
const content = marked.parse(post.content || '');
--- ---
<BaseLayout <BaseLayout
@@ -78,7 +65,7 @@ const { post, global, content } = Astro.props;
name: global.name, name: global.name,
description: global.about, description: global.about,
}, },
image: [getDirectusImageURL(post.image)], image: [],
headline: post.title, headline: post.title,
datePublished: post.published_date, datePublished: post.published_date,
dateModified: post.updated_date, dateModified: post.updated_date,
@@ -98,7 +85,7 @@ const { post, global, content } = Astro.props;
<Image <Image
class="rounded-2xl sm:rounded-b-none w-full max-h-150 object-cover" class="rounded-2xl sm:rounded-b-none w-full max-h-150 object-cover"
src={getDirectusImageURL(post.image)} src={getDirectusImageURL(post.image)}
alt={post.image_alt || post.title} alt={post.image_alt}
draggable="false" draggable="false"
format="webp" format="webp"
loading="lazy" loading="lazy"
@@ -123,15 +110,13 @@ const { post, global, content } = Astro.props;
</article> </article>
<div class="grid sm:flex sm:items-center sm:justify-between gap-y-5 sm:gap-y-0 max-w-5xl mx-auto mt-10 md:mt-14"> <div class="grid sm:flex sm:items-center sm:justify-between gap-y-5 sm:gap-y-0 max-w-5xl mx-auto mt-10 md:mt-14">
{post.tags && post.tags.length > 0 && ( <div class="flex flex-wrap sm:flex-nowrap sm:items-center gap-x-2 gap-y-1 sm:gap-y-0">
<div class="flex flex-wrap sm:flex-nowrap sm:items-center gap-x-2 gap-y-1 sm:gap-y-0"> {post.tags.map((tag: string) => (
{post.tags.map((tag: string) => ( <span class="inline-flex items-center button-base bg-cobalt dark:bg-turquoise text-neutral-100 text-xs font-bold rounded-lg gap-x-1.5 px-3 py-1.5">
<span class="inline-flex items-center button-base bg-cobalt dark:bg-turquoise text-neutral-100 text-xs font-bold rounded-lg gap-x-1.5 px-3 py-1.5"> {tag}
{tag} </span>
</span> ))}
))} </div>
</div>
)}
<SocialShareButton pageTitle={post.title}/> <SocialShareButton pageTitle={post.title}/>
</div> </div>
</div> </div>
@@ -154,3 +139,56 @@ const { post, global, content } = Astro.props;
</style> </style>
</BaseLayout> </BaseLayout>
<script>
import PhotoSwipeLightbox from 'photoswipe/lightbox';
const prose = document.querySelector('.prose');
if (prose) {
const images = prose.querySelectorAll('img');
images.forEach((img) => {
if (img.closest('a')) return;
const link = document.createElement('a');
link.href = img.src;
link.dataset.pswpSrc = img.src;
link.dataset.pswpWidth = img.naturalWidth.toString();
link.dataset.pswpHeight = img.naturalHeight.toString();
link.target = '_blank';
link.classList.add('pswp-link');
img.parentNode?.insertBefore(link, img);
link.appendChild(img);
if (!img.complete) {
img.onload = () => {
link.dataset.pswpWidth = img.naturalWidth.toString();
link.dataset.pswpHeight = img.naturalHeight.toString();
};
}
});
const lightbox = new PhotoSwipeLightbox({
gallery: prose,
children: 'a.pswp-link',
pswpModule: () => import('photoswipe'),
});
lightbox.init();
}
// Add smooth reveal animations for content after loading
document.addEventListener('astro:page-load', () => {
const animateContent = () => {
const smoothReveal = document.querySelectorAll('.smooth-reveal');
smoothReveal.forEach((el, index) => {
setTimeout(
() => {
el.classList.add('animate-reveal');
},
100 + index * 100
);
});
};
animateContent();
});
</script>

View File

@@ -57,3 +57,56 @@ const recentPosts: Post[] = posts.filter(
/> />
</BaseLayout> </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');
},
200 + index * 300
);
});
// Animate group 2
const smoothReveal2 = document.querySelectorAll('.smooth-reveal-2');
smoothReveal2.forEach((el, index) => {
setTimeout(
() => {
el.classList.add('animate-reveal');
},
500 + index * 100
);
});
// Animate topic cards with staggered delay
const smoothRevealCards = document.querySelectorAll('.smooth-reveal-cards');
smoothRevealCards.forEach((el, index) => {
setTimeout(
() => {
el.classList.add('animate-reveal');
},
1000 + index * 250
);
});
// Animate with just fade in with staggered delay
const smoothRevealFade = document.querySelectorAll('.smooth-reveal-fade');
smoothRevealFade.forEach((el, index) => {
setTimeout(
() => {
el.classList.add('animate-reveal-fade');
},
100 + index * 250
);
});
};
animateContent();
});
</script>

View File

@@ -75,3 +75,56 @@ const categoriesPosts = posts
</section> </section>
</BaseLayout> </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
);
});
// Animate group 2
const smoothReveal2 = document.querySelectorAll('.smooth-reveal-2');
smoothReveal2.forEach((el, index) => {
setTimeout(
() => {
el.classList.add('animate-reveal');
},
200 + index * 150
);
});
// Animate topic cards with staggered delay
const smoothRevealCards = document.querySelectorAll('.smooth-reveal-cards');
smoothRevealCards.forEach((el, index) => {
setTimeout(
() => {
el.classList.add('animate-reveal');
},
500 + index * 100
);
});
// Animate with just fade in with staggered delay
const smoothRevealFade = document.querySelectorAll('.smooth-reveal-fade');
smoothRevealFade.forEach((el, index) => {
setTimeout(
() => {
el.classList.add('animate-reveal-fade');
},
100 + index * 250
);
});
};
animateContent();
});
</script>

View File

@@ -37,3 +37,56 @@ const global = await directus.request(readSingleton('site_global'));
<CategorySection /> <CategorySection />
</BaseLayout> </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
);
});
// Animate group 2
const smoothReveal2 = document.querySelectorAll('.smooth-reveal-2');
smoothReveal2.forEach((el, index) => {
setTimeout(
() => {
el.classList.add('animate-reveal');
},
200 + index * 150
);
});
// Animate topic cards with staggered delay
const smoothRevealCards = document.querySelectorAll('.smooth-reveal-cards');
smoothRevealCards.forEach((el, index) => {
setTimeout(
() => {
el.classList.add('animate-reveal');
},
500 + index * 100
);
});
// Animate with just fade in with staggered delay
const smoothRevealFade = document.querySelectorAll('.smooth-reveal-fade');
smoothRevealFade.forEach((el, index) => {
setTimeout(
() => {
el.classList.add('animate-reveal-fade');
},
100 + index * 250
);
});
};
animateContent();
});
</script>

View File

@@ -55,25 +55,19 @@ const recentPosts = posts
<FeatureSection /> <FeatureSection />
<RecentPostsSection
posts={recentPosts}
title="Latest Posts"
subTitle="Checkout my most recent thoughts here"
/>
<WeatherSection <WeatherSection
server:defer server:defer
latitude={weather.latitude} latitude={weather.latitude}
longitude={weather.longitude} longitude={weather.longitude}
cityName={weather.location} cityName={weather.location}
timezone={weather.timezone} timezone={weather.timezone}
> />
<div slot="fallback" class="flex items-center justify-center py-10 lg:py-14">
<p class="smooth-reveal card-text-header block"> <RecentPostsSection
Loading weather... posts={recentPosts}
</p> title="Latest Posts"
</div> subTitle="Checkout my most recent thoughts here"
</WeatherSection> />
<GiteaSection <GiteaSection
title="Follow me on Gitea" title="Follow me on Gitea"
@@ -82,3 +76,62 @@ const recentPosts = posts
/> />
</BaseLayout> </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
);
});
// Animate group 2
const smoothReveal2 = document.querySelectorAll('.smooth-reveal-2');
smoothReveal2.forEach((el, index) => {
setTimeout(
() => {
el.classList.add('animate-reveal');
},
200 + index * 250
);
});
// Animate topic cards with staggered delay
const smoothRevealCards = document.querySelectorAll('.smooth-reveal-cards');
smoothRevealCards.forEach((el, index) => {
setTimeout(
() => {
el.classList.add('animate-reveal');
},
400 + index * 250
);
});
// Animate with just fade in with staggered delay
const smoothRevealFade = document.querySelectorAll('.smooth-reveal-fade');
smoothRevealFade.forEach((el, index) => {
setTimeout(
() => {
el.classList.add('animate-reveal-fade');
},
100 + index * 250
);
});
};
animateContent();
const observer = new MutationObserver(() => {
animateContent();
});
observer.observe(document.body, { childList: true, subtree: true });
});
</script>

View File

@@ -1,31 +0,0 @@
const animateContent = () => {
const smoothReveal = document.querySelectorAll('.smooth-reveal');
smoothReveal.forEach((el, index) => {
setTimeout(() => {
el.classList.add('animate-reveal');
}, 50 + index * 100);
});
const smoothReveal2 = document.querySelectorAll('.smooth-reveal-2');
smoothReveal2.forEach((el, index) => {
setTimeout(() => {
el.classList.add('animate-reveal');
}, 200 + index * 250);
});
const smoothRevealCards = document.querySelectorAll('.smooth-reveal-cards');
smoothRevealCards.forEach((el, index) => {
setTimeout(() => {
el.classList.add('animate-reveal');
}, 400 + index * 250);
});
const smoothRevealFade = document.querySelectorAll('.smooth-reveal-fade');
smoothRevealFade.forEach((el, index) => {
setTimeout(() => {
el.classList.add('animate-reveal-fade');
}, 100 + index * 250);
});
};
export { animateContent };

View File

@@ -1,38 +0,0 @@
import PhotoSwipeLightbox from 'photoswipe/lightbox';
import PhotoSwipe from "photoswipe";
let lightbox: PhotoSwipeLightbox | null = null;
function initPhotoSwipe() {
const links = document.querySelectorAll<HTMLAnchorElement>('a.pswp-link');
links.forEach((link) => {
const img = link.querySelector('img');
if (img) {
const applyDimensions = () => {
link.dataset.pswpWidth = (img.naturalWidth || 1920).toString();
link.dataset.pswpHeight = (img.naturalHeight || 1080).toString();
};
if (img.complete) {
applyDimensions();
} else {
img.addEventListener('load', applyDimensions);
}
}
});
if (lightbox) {
lightbox.destroy();
}
lightbox = new PhotoSwipeLightbox({
gallery: '.prose',
children: 'a.pswp-link',
pswpModule: PhotoSwipe,
allowPanToNext: true,
});
lightbox.init();
}
export { initPhotoSwipe };

View File

@@ -1,7 +1,5 @@
@import 'tailwindcss'; @import 'tailwindcss';
@import './utilities-buttons.css'; @import './utilities.css';
@import './utilities-cards.css';
@import './utilities-misc.css';
@plugin '@tailwindcss/typography'; @plugin '@tailwindcss/typography';
@plugin '@tailwindcss/forms'; @plugin '@tailwindcss/forms';
@@ -45,33 +43,6 @@
--color-background-card: light-dark(color-mix(in srgb, var(--color-neutral-100) 80%, transparent), color-mix(in srgb, var(--color-neutral-800) 60%, transparent)); --color-background-card: light-dark(color-mix(in srgb, var(--color-neutral-100) 80%, transparent), color-mix(in srgb, var(--color-neutral-800) 60%, transparent));
--color-divider: light-dark(color-mix(in srgb, var(--color-slate-400) 40%, transparent), color-mix(in srgb, var(--color-neutral-500) 50%, transparent)); --color-divider: light-dark(color-mix(in srgb, var(--color-slate-400) 40%, transparent), color-mix(in srgb, var(--color-neutral-500) 50%, transparent));
/* Typography */
--color-prose-blog-body: var(--color-neutral-700);
--color-prose-blog-headings: var(--color-neutral-900);
--color-prose-blog-links: var(--color-orange-300);
--color-prose-blog-invert-body: var(--color-neutral-400);
--color-prose-blog-invert-headings: var(--color-neutral-200);
--radius-markdown-img: 0.5rem;
/* Shiki */
--color-shiki-bg: light-dark(var(--color-neutral-200), var(--color-neutral-800));
--color-shiki-text: light-dark(var(--shiki-light), var(--shiki-dark));
/* Reveal Animations */
--animate-reveal: reveal 0.8s ease forwards;
--animate-reveal-fade: reveal-fade 1.8s ease forwards;
@keyframes reveal {
from { opacity: 0; transform: translateY(20px); }
to { opacity: 1; transform: translateY(0); }
}
@keyframes reveal-fade {
from { opacity: 0; }
to { opacity: 1; }
}
} }
@layer base { @layer base {
@@ -80,6 +51,7 @@
-moz-osx-font-smoothing: grayscale; -moz-osx-font-smoothing: grayscale;
--theme-transition: 0.3s ease; --theme-transition: 0.3s ease;
--scroll-offset: 0px;
} }
:root:where(.dark, .dark *) { :root:where(.dark, .dark *) {
@@ -118,56 +90,56 @@
border-color var(--theme-transition); border-color var(--theme-transition);
} }
/* Typography */ /* Shiki syntax highlighting */
.prose blockquote { :root {
font-style: normal; --shiki-fg: var(--shiki-light);
quotes: none; --shiki-bg: var(--color-neutral-200);
} }
.prose img { .dark {
@apply rounded-lg; --shiki-fg: var(--shiki-dark);
--shiki-bg: var(--color-neutral-800);
} }
.prose-blog {
--tw-prose-body: var(--color-neutral-700);
--tw-prose-headings: var(--color-neutral-900);
--tw-prose-lead: var(--color-neutral-700);
--tw-prose-links: var(--color-orange-300);
--tw-prose-bold: var(--color-neutral-900);
--tw-prose-counters: var(--color-neutral-600);
--tw-prose-bullets: var(--color-neutral-400);
--tw-prose-hr: var(--color-neutral-300);
--tw-prose-quotes: var(--color-neutral-500);
--tw-prose-quote-borders: var(--color-neutral-300);
--tw-prose-captions: var(--color-neutral-700);
--tw-prose-code: var(--color-neutral-700);
--tw-prose-pre-code: var(--color-neutral-900);
--tw-prose-pre-bg: var(--color-white);
--tw-prose-th-borders: var(--color-neutral-300);
--tw-prose-td-borders: var(--color-neutral-200);
&:where(.dark, .dark *) {
--tw-prose-body: var(--color-neutral-400);
--tw-prose-headings: var(--color-neutral-200);
--tw-prose-lead: var(--color-neutral-300);
--tw-prose-links: var(--color-orange-300);
--tw-prose-bold: var(--color-neutral-300);
--tw-prose-counters: var(--color-neutral-400);
--tw-prose-bullets: var(--color-neutral-600);
--tw-prose-hr: var(--color-neutral-700);
--tw-prose-quotes: var(--color-neutral-500);
--tw-prose-quote-borders: var(--color-neutral-500);
--tw-prose-captions: var(--color-neutral-400);
--tw-prose-code: var(--color-neutral-350);
--tw-prose-pre-code: var(--color-neutral-300);
--tw-prose-th-borders: var(--color-neutral-600);
--tw-prose-td-borders: var(--color-neutral-700);
}
}
/* Shiki */
pre.shiki { pre.shiki {
background-color: var(--shiki-bg) !important; background-color: var(--shiki-bg) !important;
color: var(--shiki-fg) !important; color: var(--shiki-fg) !important;
} }
pre.shiki span {
color: var(--shiki-light);
}
.dark pre.shiki span {
color: var(--shiki-dark) !important;
}
}
/* Content reveal animations */
.smooth-reveal,
.smooth-reveal-2,
.smooth-reveal-cards {
opacity: 0;
transform: translateY(20px);
transition:
opacity 0.8s ease,
transform 0.8s ease;
}
.animate-reveal {
opacity: 1 !important;
transform: translateY(0) !important;
}
.smooth-reveal-fade {
opacity: 0;
transform: translateY(0px);
transition:
opacity 1.8s ease,
transform 0.8s ease;
}
.animate-reveal-fade {
opacity: 1 !important;
transform: translateY(0) !important;
} }

View File

@@ -1,51 +0,0 @@
@utility button-base {
@apply transition-all duration-300
border border-transparent
shadow-sm hover:shadow-md dark:shadow-md dark:hover:shadow-lg
px-4 py-3
}
@utility button-base-hidden {
@apply transition-all duration-300
border border-transparent
hover:bg-neutral-200 dark:hover:bg-neutral-700
p-2
}
@utility button-hover-arrow {
@apply translate-y-px transition duration-300
group-hover:translate-x-1
h-3 w-3 md:h-5 md:w-5
}
@utility button-text-title {
@apply text-neutral-200 2xl:text-base
text-sm font-bold
}
@utility button-text-title-hidden {
@apply transition-all duration-300
text-neutral-600 group-hover:text-neutral-700 dark:text-neutral-400 dark:group-hover:text-neutral-300 2xl:text-base
text-sm font-medium
}
@utility button-bg-blue {
@apply transition-all duration-300
bg-cobalt hover:bg-steel dark:bg-steel dark:hover:bg-cobalt
}
@utility button-bg-teal {
@apply transition-all duration-300
bg-bermuda hover:bg-turquoise group-hover:bg-turquoise dark:bg-turquoise dark:hover:bg-bermuda dark:group-hover:bg-bermuda
}
@utility button-bg-neutral {
@apply transition-all duration-300
border border-neutral-100 dark:border-stone-500/20
bg-background-card hover:bg-neutral-100 dark:hover:bg-neutral-800/90
}
@utility button-bg-gitea {
@apply transition-all duration-300
bg-gitea-primary hover:bg-gitea-secondary dark:bg-gitea-secondary dark:hover:bg-gitea-primary
}

View File

@@ -1,44 +0,0 @@
/* Nav */
@utility nav-base {
@apply border border-neutral-100 dark:border-stone-500/20
bg-neutral-100 dark:bg-neutral-800
shadow-xs dark:shadow-md
}
/* Fade edges of a div */
@utility mask-fade-edges {
-webkit-mask-image:
linear-gradient(to right, transparent, black var(--fade-dist, 1rem), black calc(100% - var(--fade-dist, 1rem)), transparent),
linear-gradient(to bottom, transparent, black var(--fade-dist, 1rem), black calc(100% - var(--fade-dist, 1rem)), transparent);
mask-image:
linear-gradient(to right, transparent, black var(--fade-dist, 1rem), black calc(100% - var(--fade-dist, 1rem)), transparent),
linear-gradient(to bottom, transparent, black var(--fade-dist, 1rem), black calc(100% - var(--fade-dist, 1rem)), transparent);
-webkit-mask-composite: source-in;
mask-composite: intersect;
}
/* Animations */
@utility smooth-reveal {
opacity: 0;
transform: translateY(20px);
transition: opacity 0.8s ease, transform 0.8s ease;
}
@utility smooth-reveal-2 {
opacity: 0;
transform: translateY(20px);
transition: opacity 0.8s ease, transform 0.8s ease;
}
@utility smooth-reveal-cards {
opacity: 0;
transform: translateY(20px);
transition: opacity 0.8s ease, transform 0.8s ease;
}
@utility smooth-reveal-fade {
opacity: 0;
transform: translateY(0px);
transition: opacity 1.8s ease, transform 0.8s ease;
}

View File

@@ -1,3 +1,57 @@
/* Button classes */
@utility button-base {
@apply transition-all duration-300
border border-transparent
shadow-sm hover:shadow-md dark:shadow-md dark:hover:shadow-lg
px-4 py-3
}
@utility button-base-hidden {
@apply transition-all duration-300
border border-transparent
hover:bg-neutral-200 dark:hover:bg-neutral-700
p-2
}
@utility button-hover-arrow {
@apply translate-y-px transition duration-300
group-hover:translate-x-1
h-3 w-3 md:h-5 md:w-5
}
@utility button-text-title {
@apply text-neutral-200 2xl:text-base
text-sm font-bold
}
@utility button-text-title-hidden {
@apply transition-all duration-300
text-neutral-600 group-hover:text-neutral-700 dark:text-neutral-400 dark:group-hover:text-neutral-300 2xl:text-base
text-sm font-medium
}
@utility button-bg-blue {
@apply transition-all duration-300
bg-cobalt hover:bg-steel dark:bg-steel dark:hover:bg-cobalt
}
@utility button-bg-teal {
@apply transition-all duration-300
bg-bermuda hover:bg-turquoise group-hover:bg-turquoise dark:bg-turquoise dark:hover:bg-bermuda dark:group-hover:bg-bermuda
}
@utility button-bg-neutral {
@apply transition-all duration-300
border border-neutral-100 dark:border-stone-500/20
bg-background-card hover:bg-neutral-100 dark:hover:bg-neutral-800/90
}
@utility button-bg-gitea {
@apply transition-all duration-300
bg-gitea-primary hover:bg-gitea-secondary dark:bg-gitea-secondary dark:hover:bg-gitea-primary
}
/* Card classes */
@utility card-base { @utility card-base {
@apply transition-all duration-300 @apply transition-all duration-300
rounded-xl rounded-xl
@@ -77,3 +131,10 @@
@apply transition-all duration-300 @apply transition-all duration-300
text-secondary-hover text-secondary-hover
} }
/* Misc */
@utility nav-base {
@apply border border-neutral-100 dark:border-stone-500/20
bg-neutral-100 dark:bg-neutral-800
shadow-xs dark:shadow-md
}

50
src/support/animation.ts Normal file
View File

@@ -0,0 +1,50 @@
// 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
);
});
// Animate group 2
const smoothReveal2 = document.querySelectorAll('.smooth-reveal-2');
smoothReveal2.forEach((el, index) => {
setTimeout(
() => {
el.classList.add('animate-reveal');
},
200 + index * 250
);
});
// Animate topic cards with staggered delay
const smoothRevealCards = document.querySelectorAll('.smooth-reveal-cards');
smoothRevealCards.forEach((el, index) => {
setTimeout(
() => {
el.classList.add('animate-reveal');
},
400 + index * 250
);
});
// Animate with just fade in with staggered delay
const smoothRevealFade = document.querySelectorAll('.smooth-reveal-fade');
smoothRevealFade.forEach((el, index) => {
setTimeout(
() => {
el.classList.add('animate-reveal-fade');
},
100 + index * 250
);
});
};
animateContent();
});

View File

@@ -1,6 +1,64 @@
/** @type {import('tailwindcss').Config} */ /** @type {import('tailwindcss').Config} */
export default { export default {
content: ['./node_modules/preline/preline.js'], content: [
plugins: [require('preline/plugin')], './src/**/*.{astro,html,js,jsx,md,mdx,svelte,ts,tsx,vue}',
'./node_modules/preline/preline.js',
],
darkMode: 'class',
theme: {
extend: {
typography: ({ theme }) => ({
blog: {
css: {
'--tw-prose-body': theme('colors.neutral[700]'),
'--tw-prose-headings': theme('colors.neutral[900]'),
'--tw-prose-lead': theme('colors.neutral[700]'),
'--tw-prose-links': theme('colors.orange[300]'),
'--tw-prose-bold': theme('colors.neutral[900]'),
'--tw-prose-counters': theme('colors.neutral[600]'),
'--tw-prose-bullets': theme('colors.neutral[400]'),
'--tw-prose-hr': theme('colors.neutral[300]'),
'--tw-prose-quotes': theme('colors.neutral[500]'),
'--tw-prose-quote-borders': theme('colors.neutral[300]'),
'--tw-prose-captions': theme('colors.neutral[700]'),
'--tw-prose-code': theme('colors.neutral[700]'),
'--tw-prose-pre-code': theme('colors.neutral[900]'),
'--tw-prose-pre-bg': theme('colors.white'),
'--tw-prose-th-borders': theme('colors.neutral[300]'),
'--tw-prose-td-borders': theme('colors.neutral[200]'),
'--tw-prose-invert-body': theme('colors.neutral[400]'),
'--tw-prose-invert-headings': theme('colors.neutral[200]'),
'--tw-prose-invert-lead': theme('colors.neutral[300]'),
'--tw-prose-invert-links': theme('colors.orange[300]'),
'--tw-prose-invert-bold': theme('colors.neutral[300]'),
'--tw-prose-invert-counters': theme('colors.neutral[400]'),
'--tw-prose-invert-bullets': theme('colors.neutral[600]'),
'--tw-prose-invert-hr': theme('colors.neutral[700]'),
'--tw-prose-invert-quotes': theme('colors.neutral[500]'),
'--tw-prose-invert-quote-borders': theme('colors.neutral[500]'),
'--tw-prose-invert-captions': theme('colors.neutral[400]'),
'--tw-prose-invert-code': theme('colors.neutral[350]'),
'--tw-prose-invert-pre-code': theme('colors.neutral[300]'),
'--tw-prose-invert-th-borders': theme('colors.neutral[600]'),
'--tw-prose-invert-td-borders': theme('colors.neutral[700]'),
},
},
DEFAULT: {
css: {
blockquote: {
fontStyle: 'normal',
quotes: 'none',
},
},
},
}),
},
},
plugins: [
require('tailwindcss/nesting'),
require('preline/plugin'),
require('@tailwindcss/typography'),
],
}; };

View File

@@ -4,21 +4,20 @@
"exclude": ["dist"], "exclude": ["dist"],
"compilerOptions": { "compilerOptions": {
"strictNullChecks": true, "strictNullChecks": true,
"baseUrl": ".", "baseUrl": "src",
"jsx": "react-jsx", "jsx": "react-jsx",
"jsxImportSource": "react",
"types": ["astro/client"], "types": ["astro/client"],
"paths": { "paths": {
"@/*": ["src/*"], "@/*": ["*"],
"@src/*": ["src/*"], "@src/*": ["src/*"],
"@lib/*": ["src/lib/*"], "@lib/*": ["lib/*"],
"@components/*": ["src/components/*"], "@components/*": ["components/*"],
"@content/*": ["src/content/*"], "@content/*": ["content/*"],
"@layouts/*": ["src/layouts/*"], "@layouts/*": ["layouts/*"],
"@styles/*": ["src/styles/*"], "@styles/*": ["styles/*"],
"@pages/*": ["src/pages/*"], "@pages/*": ["pages/*"],
"@support/*": ["src/scripts/*"], "@support/*": ["support/*"],
"@images/*": ["src/images/*"] "@images/*": ["images/*"]
} }
} }
} }