From 096198727627b3dba9c5bd28f20e90cff680316b Mon Sep 17 00:00:00 2001 From: Yassine Doghri Date: Wed, 18 Feb 2026 19:57:20 +0000 Subject: [PATCH] fix(player): load icons locally instead of relying on vimejs picking them from third party scripts - use codeigniter-vite to manage static resources - update dependencies to latest closes #551 --- .gitlab-ci.yml | 1 + .rsync-filter | 4 +- app/Config/Images.php | 16 +- app/Config/Vite.php | 27 + app/Helpers/components_helper.php | 3 +- app/Libraries/Vite/Config/Services.php | 31 - app/Libraries/Vite/Config/Vite.php | 20 - app/Libraries/Vite/Vite.php | 111 ---- app/Resources/images/castopod-logo-base.svg | 5 - app/Resources/images/castopod-logo.svg | 6 - .../images/castopod-mascot_confused.svg | 40 -- app/Resources/js/admin.ts | 40 -- app/Resources/js/app.ts | 5 - app/Resources/js/charts.ts | 3 - app/Resources/js/install.ts | 3 - app/Resources/js/map.ts | 3 - app/Resources/js/podcast.ts | 10 - app/Resources/styles/index.css | 15 - app/Views/errors/html/error_400.php | 2 +- app/Views/errors/html/error_403.php | 2 +- app/Views/errors/html/error_404.php | 2 +- app/Views/errors/html/production.php | 4 +- composer.json | 5 +- composer.lock | 96 ++- package.json | 25 +- php-icons.php | 10 +- pnpm-lock.yaml | 607 +++++++++++++++--- public/castopod-avatar_medium.webp | Bin 10163 -> 0 bytes public/castopod-avatar_thumbnail.webp | Bin 4879 -> 0 bytes public/castopod-avatar_tiny.webp | Bin 1454 -> 0 bytes public/castopod-banner-amber_federation.jpg | Bin 14886 -> 0 bytes public/castopod-banner-amber_medium.webp | Bin 6764 -> 0 bytes public/castopod-banner-amber_small.webp | Bin 1674 -> 0 bytes public/castopod-banner-crimson_federation.jpg | Bin 14859 -> 0 bytes public/castopod-banner-crimson_medium.webp | Bin 6759 -> 0 bytes public/castopod-banner-crimson_small.webp | Bin 1675 -> 0 bytes .../castopod-banner-jacaranda_federation.jpg | Bin 14722 -> 0 bytes public/castopod-banner-jacaranda_medium.webp | Bin 6716 -> 0 bytes public/castopod-banner-jacaranda_small.webp | Bin 1643 -> 0 bytes public/castopod-banner-lake_federation.jpg | Bin 14638 -> 0 bytes public/castopod-banner-lake_medium.webp | Bin 6634 -> 0 bytes public/castopod-banner-lake_small.webp | Bin 1630 -> 0 bytes public/castopod-banner-onyx_federation.jpg | Bin 14734 -> 0 bytes public/castopod-banner-onyx_medium.webp | Bin 6742 -> 0 bytes public/castopod-banner-onyx_small.webp | Bin 1670 -> 0 bytes public/castopod-banner-pine_federation.jpg | Bin 14521 -> 0 bytes public/castopod-banner-pine_medium.webp | Bin 6594 -> 0 bytes public/castopod-banner-pine_small.webp | Bin 1627 -> 0 bytes .../icons/custom/_index.php | 0 .../icons/custom/repeat-off.svg | 0 .../icons/funding/_index.php | 0 .../icons/funding/buymeacoffee.svg | 0 .../icons/funding/default.svg | 0 .../icons/funding/donorbox.svg | 0 .../icons/funding/gofundme.svg | 0 .../icons/funding/helloasso.svg | 0 .../icons/funding/indiegogo.svg | 0 .../icons/funding/kickstarter.svg | 0 .../icons/funding/kisskissbankbank.svg | 0 .../icons/funding/kofi.svg | 0 .../icons/funding/liberapay.svg | 0 .../icons/funding/patreon.svg | 0 .../icons/funding/paypal.svg | 0 .../icons/funding/tipeee.svg | 0 .../icons/funding/ulule.svg | 0 .../icons/podcasting/_index.php | 0 .../icons/podcasting/amazon.svg | 0 .../icons/podcasting/antennapod.svg | 0 .../icons/podcasting/anytime.svg | 0 .../icons/podcasting/apple.svg | 0 .../icons/podcasting/blubrry.svg | 0 .../icons/podcasting/breaker.svg | 0 .../icons/podcasting/breez.svg | 0 .../icons/podcasting/castamatic.svg | 0 .../icons/podcasting/castbox.svg | 0 .../icons/podcasting/castopod.svg | 0 .../icons/podcasting/castro.svg | 0 .../icons/podcasting/deezer.svg | 0 .../icons/podcasting/default.svg | 0 .../icons/podcasting/episodes-fm.svg | 0 .../icons/podcasting/fountain.svg | 0 .../icons/podcasting/fyyd.svg | 0 .../icons/podcasting/google.svg | 0 .../icons/podcasting/gpodder.svg | 0 .../icons/podcasting/ivoox.svg | 0 .../icons/podcasting/listennotes.svg | 0 .../icons/podcasting/overcast.svg | 0 .../icons/podcasting/playerfm.svg | 0 .../icons/podcasting/plink.svg | 0 .../icons/podcasting/pocketcasts.svg | 0 .../icons/podcasting/podbean.svg | 0 .../icons/podcasting/podcastaddict.svg | 0 .../icons/podcasting/podcastguru.svg | 0 .../icons/podcasting/podcastindex.svg | 0 .../icons/podcasting/podchaser.svg | 0 .../icons/podcasting/podcloud.svg | 0 .../icons/podcasting/podfriend.svg | 0 .../icons/podcasting/podinstall.svg | 0 .../icons/podcasting/podlink.svg | 0 .../icons/podcasting/podlp.svg | 0 .../icons/podcasting/podnews.svg | 0 .../icons/podcasting/podtail.svg | 0 .../icons/podcasting/podverse.svg | 0 .../icons/podcasting/radiopublic.svg | 0 .../icons/podcasting/sphinxchat.svg | 0 .../icons/podcasting/spotify.svg | 0 .../icons/podcasting/spreaker.svg | 0 .../icons/podcasting/stitcher.svg | 0 .../icons/podcasting/truefans.svg | 0 .../icons/podcasting/tsacdop.svg | 0 .../icons/podcasting/tunein.svg | 0 .../icons/podcasting/youtube-music.svg | 0 .../icons/social/_index.php | 0 .../icons/social/bluesky.svg | 0 .../icons/social/castopod.svg | 0 .../icons/social/default.svg | 0 .../icons/social/discord.svg | 0 .../icons/social/discourse.svg | 0 .../icons/social/facebook.svg | 0 .../icons/social/funkwhale.svg | 0 .../icons/social/instagram.svg | 0 .../icons/social/linkedin.svg | 0 .../icons/social/mastodon.svg | 0 .../icons/social/matrix.svg | 0 .../icons/social/misskey.svg | 0 .../icons/social/mobilizon.svg | 0 .../icons/social/peertube.svg | 0 .../icons/social/pixelfed.svg | 0 .../icons/social/pleroma.svg | 0 .../icons/social/plume.svg | 0 .../icons/social/reddit.svg | 0 .../icons/social/slack.svg | 0 .../icons/social/telegram.svg | 0 .../icons/social/threads.svg | 0 .../icons/social/tiktok.svg | 0 .../icons/social/twitch.svg | 0 .../icons/social/twitter.svg | 0 .../icons/social/writefreely.svg | 0 .../icons/social/x.svg | 0 .../icons/social/youtube.svg | 0 .../js/_modules}/Charts.ts | 0 .../js/_modules}/ClientTimezone.ts | 0 .../js/_modules}/Clipboard.ts | 0 .../js/_modules}/DateTimePicker.ts | 0 .../js/_modules}/Dropdown.ts | 0 .../js/_modules}/EpisodesMap.ts | 9 +- .../js/_modules}/HotKeys.ts | 0 .../js/_modules}/Modal.ts | 0 .../js/_modules}/MultiSelect.ts | 0 .../js/_modules}/PublishMessageWarning.ts | 0 .../js/_modules}/Select.ts | 0 .../js/_modules}/SidebarToggler.ts | 0 .../js/_modules}/Slugify.ts | 0 .../js/_modules}/ThemePicker.ts | 0 .../modules => resources/js/_modules}/Time.ts | 0 .../js/_modules}/Toggler.ts | 0 .../js/_modules}/Tooltip.ts | 0 .../js/_modules}/ValidateFileSize.ts | 0 .../js/_modules}/VideoClipBuilder.ts | 0 .../js/_modules}/audio-clipper.ts | 0 .../js/_modules}/markdown-preview.ts | 0 .../js/_modules}/markdown-write-preview.ts | 0 .../js/_modules}/permalink-edit.ts | 0 .../js/_modules}/play-episode-button.ts | 0 .../js/_modules}/play-soundbite.ts | 0 .../js/_modules}/video-clip-previewer.ts | 0 .../js/_modules}/xml-editor.ts | 0 .../js/admin-audio-player.ts | 10 +- resources/js/admin.ts | 40 ++ resources/js/app.ts | 5 + .../js/audio-player.ts | 13 +- resources/js/charts.ts | 3 + {app/Resources => resources}/js/embed.ts | 8 + {app/Resources => resources}/js/error.ts | 0 resources/js/install.ts | 3 + resources/js/map.ts | 3 + resources/js/podcast.ts | 10 + {app/Resources => resources}/js/typings.d.ts | 0 {app/Resources => resources}/js/vite-env.d.ts | 0 .../static}/fonts/inter-600.woff2 | Bin .../static}/fonts/inter-regular.woff2 | Bin .../static}/fonts/kumbh-sans-700.woff2 | Bin .../static}/fonts/kumbh-sans-regular.woff2 | Bin .../fonts/noto-sans-mono-regular.woff2 | Bin .../static/images}/castopod-avatar.jpg | Bin .../static/images}/castopod-banner-amber.jpg | Bin .../images}/castopod-banner-crimson.jpg | Bin .../images}/castopod-banner-jacaranda.jpg | Bin .../static/images}/castopod-banner-lake.jpg | Bin .../static/images}/castopod-banner-onyx.jpg | Bin .../static/images}/castopod-banner-pine.jpg | Bin .../static/images/castopod-logo-base.svg | 1 + resources/static/images/castopod-logo.svg | 1 + .../images/castopod-mascot_confused.svg | 1 + .../static}/images/marker/marker-icon-2x.png | Bin .../static}/images/marker/marker-icon.png | Bin .../static}/images/marker/marker-shadow.png | Bin resources/static/vm-player-icons/check.svg | 1 + resources/static/vm-player-icons/pause.svg | 1 + resources/static/vm-player-icons/play.svg | 1 + resources/static/vm-player-icons/settings.svg | 1 + .../static/vm-player-icons/volume-high.svg | 1 + .../static/vm-player-icons/volume-low.svg | 1 + .../static/vm-player-icons/volume-mute.svg | 1 + .../styles/_modules}/breadcrumb.css | 0 .../styles/_modules}/choices.css | 0 .../styles/_modules}/colorRadioBtn.css | 0 .../styles/_modules}/colors.css | 0 .../styles/_modules}/custom.css | 0 .../styles/_modules}/dropdown.css | 0 .../styles/_modules}/fonts.css | 10 +- .../styles/_modules}/formInputTabs.css | 0 .../styles/_modules}/inputRange.css | 0 .../styles/_modules}/radioBtn.css | 0 .../styles/_modules}/radioToggler.css | 0 .../styles/_modules}/readMore.css | 0 .../styles/_modules}/seeMore.css | 0 .../styles/_modules}/stickyHeader.css | 0 .../styles/_modules}/switch.css | 0 .../styles/_modules}/tailwind.css | 0 resources/styles/index.css | 15 + tailwind.config.cjs | 2 +- themes/cp_admin/_layout.php | 6 +- themes/cp_admin/dashboard.php | 2 +- themes/cp_admin/episode/view.php | 2 +- themes/cp_admin/podcast/analytics/index.php | 2 +- .../podcast/analytics/listening_time.php | 2 +- .../cp_admin/podcast/analytics/locations.php | 2 +- themes/cp_admin/podcast/analytics/players.php | 2 +- .../podcast/analytics/time_periods.php | 2 +- .../podcast/analytics/unique_listeners.php | 2 +- .../cp_admin/podcast/analytics/webpages.php | 2 +- themes/cp_app/embed.php | 7 +- themes/cp_app/episode/_layout-preview.php | 8 +- themes/cp_app/episode/_layout.php | 8 +- themes/cp_app/home.php | 4 +- themes/cp_app/pages/_layout.php | 6 +- themes/cp_app/pages/map.php | 6 +- themes/cp_app/podcast/_layout.php | 8 +- themes/cp_app/podcast/follow.php | 4 +- themes/cp_app/podcast/links.php | 6 +- themes/cp_app/podcast/unlock.php | 4 +- themes/cp_app/post/remote_action.php | 4 +- themes/cp_auth/_layout.php | 2 +- themes/cp_install/_layout.php | 4 +- tsconfig.json | 4 +- vite.config.ts | 60 +- 247 files changed, 869 insertions(+), 527 deletions(-) create mode 100644 app/Config/Vite.php delete mode 100644 app/Libraries/Vite/Config/Services.php delete mode 100644 app/Libraries/Vite/Config/Vite.php delete mode 100644 app/Libraries/Vite/Vite.php delete mode 100644 app/Resources/images/castopod-logo-base.svg delete mode 100644 app/Resources/images/castopod-logo.svg delete mode 100644 app/Resources/images/castopod-mascot_confused.svg delete mode 100644 app/Resources/js/admin.ts delete mode 100644 app/Resources/js/app.ts delete mode 100644 app/Resources/js/charts.ts delete mode 100644 app/Resources/js/install.ts delete mode 100644 app/Resources/js/map.ts delete mode 100644 app/Resources/js/podcast.ts delete mode 100644 app/Resources/styles/index.css delete mode 100644 public/castopod-avatar_medium.webp delete mode 100644 public/castopod-avatar_thumbnail.webp delete mode 100644 public/castopod-avatar_tiny.webp delete mode 100644 public/castopod-banner-amber_federation.jpg delete mode 100644 public/castopod-banner-amber_medium.webp delete mode 100644 public/castopod-banner-amber_small.webp delete mode 100644 public/castopod-banner-crimson_federation.jpg delete mode 100644 public/castopod-banner-crimson_medium.webp delete mode 100644 public/castopod-banner-crimson_small.webp delete mode 100644 public/castopod-banner-jacaranda_federation.jpg delete mode 100644 public/castopod-banner-jacaranda_medium.webp delete mode 100644 public/castopod-banner-jacaranda_small.webp delete mode 100644 public/castopod-banner-lake_federation.jpg delete mode 100644 public/castopod-banner-lake_medium.webp delete mode 100644 public/castopod-banner-lake_small.webp delete mode 100644 public/castopod-banner-onyx_federation.jpg delete mode 100644 public/castopod-banner-onyx_medium.webp delete mode 100644 public/castopod-banner-onyx_small.webp delete mode 100644 public/castopod-banner-pine_federation.jpg delete mode 100644 public/castopod-banner-pine_medium.webp delete mode 100644 public/castopod-banner-pine_small.webp rename {app/Resources => resources}/icons/custom/_index.php (100%) rename {app/Resources => resources}/icons/custom/repeat-off.svg (100%) rename {app/Resources => resources}/icons/funding/_index.php (100%) rename {app/Resources => resources}/icons/funding/buymeacoffee.svg (100%) rename {app/Resources => resources}/icons/funding/default.svg (100%) rename {app/Resources => resources}/icons/funding/donorbox.svg (100%) rename {app/Resources => resources}/icons/funding/gofundme.svg (100%) rename {app/Resources => resources}/icons/funding/helloasso.svg (100%) rename {app/Resources => resources}/icons/funding/indiegogo.svg (100%) rename {app/Resources => resources}/icons/funding/kickstarter.svg (100%) rename {app/Resources => resources}/icons/funding/kisskissbankbank.svg (100%) rename {app/Resources => resources}/icons/funding/kofi.svg (100%) rename {app/Resources => resources}/icons/funding/liberapay.svg (100%) rename {app/Resources => resources}/icons/funding/patreon.svg (100%) rename {app/Resources => resources}/icons/funding/paypal.svg (100%) rename {app/Resources => resources}/icons/funding/tipeee.svg (100%) rename {app/Resources => resources}/icons/funding/ulule.svg (100%) rename {app/Resources => resources}/icons/podcasting/_index.php (100%) rename {app/Resources => resources}/icons/podcasting/amazon.svg (100%) rename {app/Resources => resources}/icons/podcasting/antennapod.svg (100%) rename {app/Resources => resources}/icons/podcasting/anytime.svg (100%) rename {app/Resources => resources}/icons/podcasting/apple.svg (100%) rename {app/Resources => resources}/icons/podcasting/blubrry.svg (100%) rename {app/Resources => resources}/icons/podcasting/breaker.svg (100%) rename {app/Resources => resources}/icons/podcasting/breez.svg (100%) rename {app/Resources => resources}/icons/podcasting/castamatic.svg (100%) rename {app/Resources => resources}/icons/podcasting/castbox.svg (100%) rename {app/Resources => resources}/icons/podcasting/castopod.svg (100%) rename {app/Resources => resources}/icons/podcasting/castro.svg (100%) rename {app/Resources => resources}/icons/podcasting/deezer.svg (100%) rename {app/Resources => resources}/icons/podcasting/default.svg (100%) rename {app/Resources => resources}/icons/podcasting/episodes-fm.svg (100%) rename {app/Resources => resources}/icons/podcasting/fountain.svg (100%) rename {app/Resources => resources}/icons/podcasting/fyyd.svg (100%) rename {app/Resources => resources}/icons/podcasting/google.svg (100%) rename {app/Resources => resources}/icons/podcasting/gpodder.svg (100%) rename {app/Resources => resources}/icons/podcasting/ivoox.svg (100%) rename {app/Resources => resources}/icons/podcasting/listennotes.svg (100%) rename {app/Resources => resources}/icons/podcasting/overcast.svg (100%) rename {app/Resources => resources}/icons/podcasting/playerfm.svg (100%) rename {app/Resources => resources}/icons/podcasting/plink.svg (100%) rename {app/Resources => resources}/icons/podcasting/pocketcasts.svg (100%) rename {app/Resources => resources}/icons/podcasting/podbean.svg (100%) rename {app/Resources => resources}/icons/podcasting/podcastaddict.svg (100%) rename {app/Resources => resources}/icons/podcasting/podcastguru.svg (100%) rename {app/Resources => resources}/icons/podcasting/podcastindex.svg (100%) rename {app/Resources => resources}/icons/podcasting/podchaser.svg (100%) rename {app/Resources => resources}/icons/podcasting/podcloud.svg (100%) rename {app/Resources => resources}/icons/podcasting/podfriend.svg (100%) rename {app/Resources => resources}/icons/podcasting/podinstall.svg (100%) rename {app/Resources => resources}/icons/podcasting/podlink.svg (100%) rename {app/Resources => resources}/icons/podcasting/podlp.svg (100%) rename {app/Resources => resources}/icons/podcasting/podnews.svg (100%) rename {app/Resources => resources}/icons/podcasting/podtail.svg (100%) rename {app/Resources => resources}/icons/podcasting/podverse.svg (100%) rename {app/Resources => resources}/icons/podcasting/radiopublic.svg (100%) rename {app/Resources => resources}/icons/podcasting/sphinxchat.svg (100%) rename {app/Resources => resources}/icons/podcasting/spotify.svg (100%) rename {app/Resources => resources}/icons/podcasting/spreaker.svg (100%) rename {app/Resources => resources}/icons/podcasting/stitcher.svg (100%) rename {app/Resources => resources}/icons/podcasting/truefans.svg (100%) rename {app/Resources => resources}/icons/podcasting/tsacdop.svg (100%) rename {app/Resources => resources}/icons/podcasting/tunein.svg (100%) rename {app/Resources => resources}/icons/podcasting/youtube-music.svg (100%) rename {app/Resources => resources}/icons/social/_index.php (100%) rename {app/Resources => resources}/icons/social/bluesky.svg (100%) rename {app/Resources => resources}/icons/social/castopod.svg (100%) rename {app/Resources => resources}/icons/social/default.svg (100%) rename {app/Resources => resources}/icons/social/discord.svg (100%) rename {app/Resources => resources}/icons/social/discourse.svg (100%) rename {app/Resources => resources}/icons/social/facebook.svg (100%) rename {app/Resources => resources}/icons/social/funkwhale.svg (100%) rename {app/Resources => resources}/icons/social/instagram.svg (100%) rename {app/Resources => resources}/icons/social/linkedin.svg (100%) rename {app/Resources => resources}/icons/social/mastodon.svg (100%) rename {app/Resources => resources}/icons/social/matrix.svg (100%) rename {app/Resources => resources}/icons/social/misskey.svg (100%) rename {app/Resources => resources}/icons/social/mobilizon.svg (100%) rename {app/Resources => resources}/icons/social/peertube.svg (100%) rename {app/Resources => resources}/icons/social/pixelfed.svg (100%) rename {app/Resources => resources}/icons/social/pleroma.svg (100%) rename {app/Resources => resources}/icons/social/plume.svg (100%) rename {app/Resources => resources}/icons/social/reddit.svg (100%) rename {app/Resources => resources}/icons/social/slack.svg (100%) rename {app/Resources => resources}/icons/social/telegram.svg (100%) rename {app/Resources => resources}/icons/social/threads.svg (100%) rename {app/Resources => resources}/icons/social/tiktok.svg (100%) rename {app/Resources => resources}/icons/social/twitch.svg (100%) rename {app/Resources => resources}/icons/social/twitter.svg (100%) rename {app/Resources => resources}/icons/social/writefreely.svg (100%) rename {app/Resources => resources}/icons/social/x.svg (100%) rename {app/Resources => resources}/icons/social/youtube.svg (100%) rename {app/Resources/js/modules => resources/js/_modules}/Charts.ts (100%) rename {app/Resources/js/modules => resources/js/_modules}/ClientTimezone.ts (100%) rename {app/Resources/js/modules => resources/js/_modules}/Clipboard.ts (100%) rename {app/Resources/js/modules => resources/js/_modules}/DateTimePicker.ts (100%) rename {app/Resources/js/modules => resources/js/_modules}/Dropdown.ts (100%) rename {app/Resources/js/modules => resources/js/_modules}/EpisodesMap.ts (91%) rename {app/Resources/js/modules => resources/js/_modules}/HotKeys.ts (100%) rename {app/Resources/js/modules => resources/js/_modules}/Modal.ts (100%) rename {app/Resources/js/modules => resources/js/_modules}/MultiSelect.ts (100%) rename {app/Resources/js/modules => resources/js/_modules}/PublishMessageWarning.ts (100%) rename {app/Resources/js/modules => resources/js/_modules}/Select.ts (100%) rename {app/Resources/js/modules => resources/js/_modules}/SidebarToggler.ts (100%) rename {app/Resources/js/modules => resources/js/_modules}/Slugify.ts (100%) rename {app/Resources/js/modules => resources/js/_modules}/ThemePicker.ts (100%) rename {app/Resources/js/modules => resources/js/_modules}/Time.ts (100%) rename {app/Resources/js/modules => resources/js/_modules}/Toggler.ts (100%) rename {app/Resources/js/modules => resources/js/_modules}/Tooltip.ts (100%) rename {app/Resources/js/modules => resources/js/_modules}/ValidateFileSize.ts (100%) rename {app/Resources/js/modules => resources/js/_modules}/VideoClipBuilder.ts (100%) rename {app/Resources/js/modules => resources/js/_modules}/audio-clipper.ts (100%) rename {app/Resources/js/modules => resources/js/_modules}/markdown-preview.ts (100%) rename {app/Resources/js/modules => resources/js/_modules}/markdown-write-preview.ts (100%) rename {app/Resources/js/modules => resources/js/_modules}/permalink-edit.ts (100%) rename {app/Resources/js/modules => resources/js/_modules}/play-episode-button.ts (100%) rename {app/Resources/js/modules => resources/js/_modules}/play-soundbite.ts (100%) rename {app/Resources/js/modules => resources/js/_modules}/video-clip-previewer.ts (100%) rename {app/Resources/js/modules => resources/js/_modules}/xml-editor.ts (100%) rename {app/Resources => resources}/js/admin-audio-player.ts (88%) create mode 100644 resources/js/admin.ts create mode 100644 resources/js/app.ts rename {app/Resources => resources}/js/audio-player.ts (90%) create mode 100644 resources/js/charts.ts rename {app/Resources => resources}/js/embed.ts (89%) rename {app/Resources => resources}/js/error.ts (100%) create mode 100644 resources/js/install.ts create mode 100644 resources/js/map.ts create mode 100644 resources/js/podcast.ts rename {app/Resources => resources}/js/typings.d.ts (100%) rename {app/Resources => resources}/js/vite-env.d.ts (100%) rename {app/Resources => resources/static}/fonts/inter-600.woff2 (100%) rename {app/Resources => resources/static}/fonts/inter-regular.woff2 (100%) rename {app/Resources => resources/static}/fonts/kumbh-sans-700.woff2 (100%) rename {app/Resources => resources/static}/fonts/kumbh-sans-regular.woff2 (100%) rename {app/Resources => resources/static}/fonts/noto-sans-mono-regular.woff2 (100%) rename {public => resources/static/images}/castopod-avatar.jpg (100%) rename {public => resources/static/images}/castopod-banner-amber.jpg (100%) rename {public => resources/static/images}/castopod-banner-crimson.jpg (100%) rename {public => resources/static/images}/castopod-banner-jacaranda.jpg (100%) rename {public => resources/static/images}/castopod-banner-lake.jpg (100%) rename {public => resources/static/images}/castopod-banner-onyx.jpg (100%) rename {public => resources/static/images}/castopod-banner-pine.jpg (100%) create mode 100644 resources/static/images/castopod-logo-base.svg create mode 100644 resources/static/images/castopod-logo.svg create mode 100644 resources/static/images/castopod-mascot_confused.svg rename {app/Resources => resources/static}/images/marker/marker-icon-2x.png (100%) rename {app/Resources => resources/static}/images/marker/marker-icon.png (100%) rename {app/Resources => resources/static}/images/marker/marker-shadow.png (100%) create mode 100644 resources/static/vm-player-icons/check.svg create mode 100644 resources/static/vm-player-icons/pause.svg create mode 100644 resources/static/vm-player-icons/play.svg create mode 100644 resources/static/vm-player-icons/settings.svg create mode 100644 resources/static/vm-player-icons/volume-high.svg create mode 100644 resources/static/vm-player-icons/volume-low.svg create mode 100644 resources/static/vm-player-icons/volume-mute.svg rename {app/Resources/styles => resources/styles/_modules}/breadcrumb.css (100%) rename {app/Resources/styles => resources/styles/_modules}/choices.css (100%) rename {app/Resources/styles => resources/styles/_modules}/colorRadioBtn.css (100%) rename {app/Resources/styles => resources/styles/_modules}/colors.css (100%) rename {app/Resources/styles => resources/styles/_modules}/custom.css (100%) rename {app/Resources/styles => resources/styles/_modules}/dropdown.css (100%) rename {app/Resources/styles => resources/styles/_modules}/fonts.css (67%) rename {app/Resources/styles => resources/styles/_modules}/formInputTabs.css (100%) rename {app/Resources/styles => resources/styles/_modules}/inputRange.css (100%) rename {app/Resources/styles => resources/styles/_modules}/radioBtn.css (100%) rename {app/Resources/styles => resources/styles/_modules}/radioToggler.css (100%) rename {app/Resources/styles => resources/styles/_modules}/readMore.css (100%) rename {app/Resources/styles => resources/styles/_modules}/seeMore.css (100%) rename {app/Resources/styles => resources/styles/_modules}/stickyHeader.css (100%) rename {app/Resources/styles => resources/styles/_modules}/switch.css (100%) rename {app/Resources/styles => resources/styles/_modules}/tailwind.css (100%) create mode 100644 resources/styles/index.css diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index ab7d958c..b10a5b9b 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -83,6 +83,7 @@ lint-js: - pnpm run format - pnpm run typecheck - pnpm run lint + - pnpm run lint:css dependencies: - js-dependencies rules: diff --git a/.rsync-filter b/.rsync-filter index 576403e0..683ffa60 100644 --- a/.rsync-filter +++ b/.rsync-filter @@ -1,7 +1,7 @@ # rsync filter rules to copy required files for Castopod's bundle -+ app/Resources/icons/*** -- app/Resources/** ++ resources/icons/*** +- resources/** + app/*** + modules/*** + public/*** diff --git a/app/Config/Images.php b/app/Config/Images.php index 7d3ca529..6e872a0b 100644 --- a/app/Config/Images.php +++ b/app/Config/Images.php @@ -130,7 +130,7 @@ class Images extends BaseConfig ], ]; - public string $avatarDefaultPath = 'castopod-avatar.jpg'; + public string $avatarDefaultPath = 'assets/images/castopod-avatar.jpg'; public string $avatarDefaultMimeType = 'image/jpg'; @@ -139,31 +139,31 @@ class Images extends BaseConfig */ public array $podcastBannerDefaultPaths = [ 'default' => [ - 'path' => 'castopod-banner-pine.jpg', + 'path' => 'assets/images/castopod-banner-pine.jpg', 'mimetype' => 'image/jpeg', ], 'pine' => [ - 'path' => 'castopod-banner-pine.jpg', + 'path' => 'assets/images/castopod-banner-pine.jpg', 'mimetype' => 'image/jpeg', ], 'crimson' => [ - 'path' => 'castopod-banner-crimson.jpg', + 'path' => 'assets/images/castopod-banner-crimson.jpg', 'mimetype' => 'image/jpeg', ], 'amber' => [ - 'path' => 'castopod-banner-amber.jpg', + 'path' => 'assets/images/castopod-banner-amber.jpg', 'mimetype' => 'image/jpeg', ], 'lake' => [ - 'path' => 'castopod-banner-lake.jpg', + 'path' => 'assets/images/castopod-banner-lake.jpg', 'mimetype' => 'image/jpeg', ], 'jacaranda' => [ - 'path' => 'castopod-banner-jacaranda.jpg', + 'path' => 'assets/images/castopod-banner-jacaranda.jpg', 'mimetype' => 'image/jpeg', ], 'onyx' => [ - 'path' => 'castopod-banner-onyx.jpg', + 'path' => 'assets/images/castopod-banner-onyx.jpg', 'mimetype' => 'image/jpeg', ], ]; diff --git a/app/Config/Vite.php b/app/Config/Vite.php new file mode 100644 index 00000000..c0d42da4 --- /dev/null +++ b/app/Config/Vite.php @@ -0,0 +1,27 @@ +,exclude?:list,assets:list}> + */ + public array $routesAssets = []; +} diff --git a/app/Helpers/components_helper.php b/app/Helpers/components_helper.php index 4c81c21a..81265862 100644 --- a/app/Helpers/components_helper.php +++ b/app/Helpers/components_helper.php @@ -382,13 +382,14 @@ if (! function_exists('audio_player')) { theme="light" language="{$language}" class="{$class} relative z-0" + icons="castopod-vm-player-icons" style="--vm-player-box-shadow:0; --vm-player-theme: hsl(var(--color-accent-base)); --vm-control-focus-color: hsl(var(--color-accent-contrast)); --vm-control-spacing: 4px; --vm-menu-item-focus-bg: hsl(var(--color-background-highlight));" > - + diff --git a/app/Libraries/Vite/Config/Services.php b/app/Libraries/Vite/Config/Services.php deleted file mode 100644 index 97364dc0..00000000 --- a/app/Libraries/Vite/Config/Services.php +++ /dev/null @@ -1,31 +0,0 @@ -|null - */ - protected ?array $manifestData = null; - - /** - * @var array|null - */ - protected ?array $manifestCSSData = null; - - public function asset(string $path, string $type): string - { - if (config('Vite')->environment !== 'production') { - return $this->loadDev($path, $type); - } - - return $this->loadProd($path, $type); - } - - private function loadDev(string $path, string $type): string - { - return $this->getHtmlTag(config('Vite') ->baseUrl . config('Vite')->assetsRoot . "/{$path}", $type); - } - - private function loadProd(string $path, string $type): string - { - if ($this->manifestData === null) { - $cacheName = 'vite-manifest'; - if (! ($cachedManifest = cache($cacheName))) { - $manifestPath = config('Vite') - ->assetsRoot . '/' . config('Vite') - ->manifestFile; - try { - if (($manifestContents = file_get_contents($manifestPath)) !== false) { - $cachedManifest = json_decode($manifestContents, true); - cache() - ->save($cacheName, $cachedManifest, DECADE); - } - } catch (ErrorException) { - // ERROR when retrieving the manifest file - die("Could not load manifest: {$manifestPath} file not found!"); - } - } - - $this->manifestData = $cachedManifest; - } - - $html = ''; - if (array_key_exists($path, $this->manifestData)) { - $manifestElement = $this->manifestData[$path]; - - // import css dependencies if any - if (array_key_exists('css', $manifestElement)) { - foreach ($manifestElement['css'] as $cssFile) { - $html .= $this->getHtmlTag('/' . config('Vite')->assetsRoot . '/' . $cssFile, 'css'); - } - } - - // import dependencies first for faster js loading - if (array_key_exists('imports', $manifestElement)) { - foreach ($manifestElement['imports'] as $importPath) { - if (array_key_exists($importPath, $this->manifestData)) { - // import css dependencies if any - if (array_key_exists('css', $this->manifestData[$importPath])) { - foreach ($this->manifestData[$importPath]['css'] as $cssFile) { - $html .= $this->getHtmlTag( - '/' . config('Vite')->assetsRoot . '/' . $cssFile, - 'css' - ); - } - } - - $html .= $this->getHtmlTag( - '/' . config('Vite')->assetsRoot . '/' . $this->manifestData[$importPath]['file'], - 'js' - ); - } - } - } - - $html .= $this->getHtmlTag('/' . config('Vite')->assetsRoot . '/' . $manifestElement['file'], $type); - } - - return $html; - } - - private function getHtmlTag(string $assetUrl, string $type): string - { - return match ($type) { - 'css' => << - HTML - , - 'js' => << - HTML - , - default => '', - }; - } -} diff --git a/app/Resources/images/castopod-logo-base.svg b/app/Resources/images/castopod-logo-base.svg deleted file mode 100644 index 482eebfe..00000000 --- a/app/Resources/images/castopod-logo-base.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/app/Resources/images/castopod-logo.svg b/app/Resources/images/castopod-logo.svg deleted file mode 100644 index 039deb74..00000000 --- a/app/Resources/images/castopod-logo.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/app/Resources/images/castopod-mascot_confused.svg b/app/Resources/images/castopod-mascot_confused.svg deleted file mode 100644 index ab32c445..00000000 --- a/app/Resources/images/castopod-mascot_confused.svg +++ /dev/null @@ -1,40 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/app/Resources/js/admin.ts b/app/Resources/js/admin.ts deleted file mode 100644 index c4fe7dea..00000000 --- a/app/Resources/js/admin.ts +++ /dev/null @@ -1,40 +0,0 @@ -import "@github/markdown-toolbar-element"; -import "@github/relative-time-element"; -import "./modules/audio-clipper"; -import ClientTimezone from "./modules/ClientTimezone"; -import Clipboard from "./modules/Clipboard"; -import DateTimePicker from "./modules/DateTimePicker"; -import Dropdown from "./modules/Dropdown"; -import HotKeys from "./modules/HotKeys"; -import "./modules/markdown-preview"; -import "./modules/markdown-write-preview"; -import MultiSelect from "./modules/MultiSelect"; -import "./modules/permalink-edit"; -import "./modules/play-soundbite"; -import PublishMessageWarning from "./modules/PublishMessageWarning"; -import Select from "./modules/Select"; -import SidebarToggler from "./modules/SidebarToggler"; -import Slugify from "./modules/Slugify"; -import ThemePicker from "./modules/ThemePicker"; -import Time from "./modules/Time"; -import Tooltip from "./modules/Tooltip"; -import ValidateFileSize from "./modules/ValidateFileSize"; -import "./modules/video-clip-previewer"; -import VideoClipBuilder from "./modules/VideoClipBuilder"; -import "./modules/xml-editor"; - -Dropdown(); -Tooltip(); -Select(); -MultiSelect(); -Slugify(); -SidebarToggler(); -ClientTimezone(); -DateTimePicker(); -Time(); -Clipboard(); -ThemePicker(); -PublishMessageWarning(); -HotKeys(); -ValidateFileSize(); -VideoClipBuilder(); diff --git a/app/Resources/js/app.ts b/app/Resources/js/app.ts deleted file mode 100644 index 7b944f47..00000000 --- a/app/Resources/js/app.ts +++ /dev/null @@ -1,5 +0,0 @@ -import Dropdown from "./modules/Dropdown"; -import Tooltip from "./modules/Tooltip"; - -Dropdown(); -Tooltip(); diff --git a/app/Resources/js/charts.ts b/app/Resources/js/charts.ts deleted file mode 100644 index 97b2c4d9..00000000 --- a/app/Resources/js/charts.ts +++ /dev/null @@ -1,3 +0,0 @@ -import DrawCharts from "./modules/Charts"; - -DrawCharts(); diff --git a/app/Resources/js/install.ts b/app/Resources/js/install.ts deleted file mode 100644 index e3bb9d53..00000000 --- a/app/Resources/js/install.ts +++ /dev/null @@ -1,3 +0,0 @@ -import Tooltip from "./modules/Tooltip"; - -Tooltip(); diff --git a/app/Resources/js/map.ts b/app/Resources/js/map.ts deleted file mode 100644 index 195a97d0..00000000 --- a/app/Resources/js/map.ts +++ /dev/null @@ -1,3 +0,0 @@ -import DrawEpisodesMaps from "./modules/EpisodesMap"; - -DrawEpisodesMaps(); diff --git a/app/Resources/js/podcast.ts b/app/Resources/js/podcast.ts deleted file mode 100644 index 1d53a99f..00000000 --- a/app/Resources/js/podcast.ts +++ /dev/null @@ -1,10 +0,0 @@ -import "@github/relative-time-element"; -import SidebarToggler from "./modules/SidebarToggler"; -import Time from "./modules/Time"; -import Toggler from "./modules/Toggler"; -import Tooltip from "./modules/Tooltip"; - -Time(); -Toggler(); -Tooltip(); -SidebarToggler(); diff --git a/app/Resources/styles/index.css b/app/Resources/styles/index.css deleted file mode 100644 index b894e7a3..00000000 --- a/app/Resources/styles/index.css +++ /dev/null @@ -1,15 +0,0 @@ -@import url("./tailwind.css"); -@import url("./custom.css"); -@import url("./fonts.css"); -@import url("./colors.css"); -@import url("./breadcrumb.css"); -@import url("./dropdown.css"); -@import url("./choices.css"); -@import url("./radioBtn.css"); -@import url("./colorRadioBtn.css"); -@import url("./switch.css"); -@import url("./radioToggler.css"); -@import url("./formInputTabs.css"); -@import url("./stickyHeader.css"); -@import url("./readMore.css"); -@import url("./seeMore.css"); diff --git a/app/Views/errors/html/error_400.php b/app/Views/errors/html/error_400.php index 7c4d37a8..ae25b5c0 100644 --- a/app/Views/errors/html/error_400.php +++ b/app/Views/errors/html/error_400.php @@ -8,7 +8,7 @@ <?= lang('Errors.pageNotFound') ?> ' /> - asset('styles/index.css', 'css') ?> + asset('styles/index.css') ?> ' /> - asset('styles/index.css', 'css') ?> + asset('styles/index.css') ?> =8.1" + }, + "require-dev": { + "codeigniter/phpstan-codeigniter": "^1.5.4", + "codeigniter4/framework": "^v4.6.0", + "pestphp/pest": "^3.8.4", + "pestphp/pest-plugin-type-coverage": "^3.6.1", + "phpstan/extension-installer": "^1.4.3", + "phpstan/phpstan": "^2.1.22", + "rector/rector": "^2.1.4", + "symplify/coding-standard": "^12.4.3", + "symplify/easy-coding-standard": "^12.5.24" + }, + "type": "library", + "autoload": { + "psr-4": { + "CodeIgniterVite\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Yassine Doghri", + "homepage": "https://yassinedoghri.com/" + } + ], + "description": "An opinionated Vite integration for CodeIgniter4 projects.", + "keywords": [ + "codeigniter", + "codeigniter4", + "iconify", + "icons", + "php-icons" + ], + "support": { + "issues": "https://github.com/yassinedoghri/codeigniter-vite/issues", + "source": "https://github.com/yassinedoghri/codeigniter-vite/tree/v2.1.0" + }, + "time": "2025-09-09T18:36:45+00:00" + }, { "name": "yassinedoghri/php-icons", "version": "v1.3.0", @@ -3783,16 +3841,16 @@ "packages-dev": [ { "name": "captainhook/captainhook", - "version": "5.28.2", + "version": "5.28.3", "source": { "type": "git", "url": "https://github.com/captainhook-git/captainhook.git", - "reference": "2adbc8fea26823ecf52578998de5daf57846872f" + "reference": "5d35b249f3843ef36ead119f4347e649278ad6d8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/captainhook-git/captainhook/zipball/2adbc8fea26823ecf52578998de5daf57846872f", - "reference": "2adbc8fea26823ecf52578998de5daf57846872f", + "url": "https://api.github.com/repos/captainhook-git/captainhook/zipball/5d35b249f3843ef36ead119f4347e649278ad6d8", + "reference": "5d35b249f3843ef36ead119f4347e649278ad6d8", "shasum": "" }, "require": { @@ -3855,7 +3913,7 @@ ], "support": { "issues": "https://github.com/captainhook-git/captainhook/issues", - "source": "https://github.com/captainhook-git/captainhook/tree/5.28.2" + "source": "https://github.com/captainhook-git/captainhook/tree/5.28.3" }, "funding": [ { @@ -3863,7 +3921,7 @@ "type": "github" } ], - "time": "2026-02-15T14:36:43+00:00" + "time": "2026-02-16T14:08:58+00:00" }, { "name": "captainhook/secrets", @@ -4389,16 +4447,16 @@ }, { "name": "friendsofphp/php-cs-fixer", - "version": "v3.94.0", + "version": "v3.94.1", "source": { "type": "git", "url": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer.git", - "reference": "883b20fb38c7866de9844ab6d0a205c423bde2d4" + "reference": "d1a3634e29916367b885250e1fc4dfd5ffe3b091" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/883b20fb38c7866de9844ab6d0a205c423bde2d4", - "reference": "883b20fb38c7866de9844ab6d0a205c423bde2d4", + "url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/d1a3634e29916367b885250e1fc4dfd5ffe3b091", + "reference": "d1a3634e29916367b885250e1fc4dfd5ffe3b091", "shasum": "" }, "require": { @@ -4481,7 +4539,7 @@ ], "support": { "issues": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/issues", - "source": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/tree/v3.94.0" + "source": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/tree/v3.94.1" }, "funding": [ { @@ -4489,7 +4547,7 @@ "type": "github" } ], - "time": "2026-02-11T16:44:33+00:00" + "time": "2026-02-18T12:24:42+00:00" }, { "name": "mikey179/vfsstream", diff --git a/package.json b/package.json index 2ec7772e..ae813795 100644 --- a/package.json +++ b/package.json @@ -11,15 +11,17 @@ }, "scripts": { "dev": "vite", - "build": "tsc && vite build && pnpm run build:static", + "build": "tsc && pnpm run build:static && vite build", "serve": "vite preview", "build:static": "pnpm run build:icons && pnpm run build:svg", - "build:icons": "svgo -f app/Resources/icons -o app/Resources/icons -r --config=./.svgo.icons.cjs", - "build:svg": "svgo -f app/Resources/images -o public/assets/images -r --config=./.svgo.cjs", - "lint": "stylelint -f verbose --fix \"app/Resources/**/*.css\" && eslint", - "lint:fix": "stylelint -f verbose --fix \"app/Resources/**/*.css\" && eslint --fix", - "format": "prettier --check .", - "format:fix": "prettier --write .", + "build:icons": "svgo -f resources/icons -o resources/icons -r --config=./.svgo.icons.cjs", + "build:svg": "svgo -f resources/static/images -o resources/static/images -r --config=./.svgo.cjs", + "lint": "eslint", + "lint:fix": "eslint --fix", + "lint:css": "stylelint -f verbose \"resources/**/*.css\"", + "lint:css:fix": "stylelint -f verbose --fix \"resources/**/*.css\"", + "prettier": "prettier --check . --ignore-path ./.gitignore --ignore-path ./docs/.gitignore", + "format": "prettier --write . --ignore-path ./.gitignore --ignore-path ./docs/.gitignore", "typecheck": "tsc", "commit": "cz", "release": "semantic-release", @@ -46,7 +48,7 @@ "leaflet": "^1.9.4", "leaflet.markercluster": "^1.5.3", "lit": "^3.3.2", - "marked": "^17.0.2", + "marked": "^17.0.3", "wavesurfer.js": "^7.12.1", "xml-formatter": "^3.6.7" }, @@ -62,8 +64,8 @@ "@tailwindcss/forms": "^0.5.11", "@tailwindcss/typography": "^0.5.19", "@types/leaflet": "^1.9.21", - "@typescript-eslint/eslint-plugin": "^8.55.0", - "@typescript-eslint/parser": "^8.55.0", + "@typescript-eslint/eslint-plugin": "^8.56.0", + "@typescript-eslint/parser": "^8.56.0", "all-contributors-cli": "^6.26.1", "commitizen": "^4.3.1", "cross-env": "^10.1.0", @@ -89,8 +91,9 @@ "svgo": "^4.0.0", "tailwindcss": "^3.4.19", "typescript": "~5.9.3", - "typescript-eslint": "^8.55.0", + "typescript-eslint": "^8.56.0", "vite": "^7.3.1", + "vite-plugin-codeigniter": "^2.0.0", "vite-plugin-pwa": "^1.2.0", "workbox-build": "^7.4.0", "workbox-core": "^7.4.0", diff --git a/php-icons.php b/php-icons.php index ac499d60..afcb4588 100644 --- a/php-icons.php +++ b/php-icons.php @@ -5,12 +5,12 @@ declare(strict_types=1); use PHPIcons\Config\PHPIconsConfig; return PHPIconsConfig::configure() - ->withPaths([__DIR__ . '/app', __DIR__ . '/themes']) + ->withPaths([__DIR__ . '/app', __DIR__ . '/themes', __DIR__ . '/resources']) ->withLocalIconSets([ - 'funding' => __DIR__ . '/app/Resources/icons/funding', - 'podcasting' => __DIR__ . '/app/Resources/icons/podcasting', - 'social' => __DIR__ . '/app/Resources/icons/social', - 'custom' => __DIR__ . '/app/Resources/icons/custom', + 'funding' => __DIR__ . '/resources/icons/funding', + 'podcasting' => __DIR__ . '/resources/icons/podcasting', + 'social' => __DIR__ . '/resources/icons/social', + 'custom' => __DIR__ . '/resources/icons/custom', ]) ->withDefaultIconPerSet([ 'funding' => 'funding:default', diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 7ed8ffb3..5b4b4fd4 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -68,8 +68,8 @@ importers: specifier: ^3.3.2 version: 3.3.2 marked: - specifier: ^17.0.2 - version: 17.0.2 + specifier: ^17.0.3 + version: 17.0.3 wavesurfer.js: specifier: ^7.12.1 version: 7.12.1 @@ -111,11 +111,11 @@ importers: specifier: ^1.9.21 version: 1.9.21 "@typescript-eslint/eslint-plugin": - specifier: ^8.55.0 - version: 8.55.0(@typescript-eslint/parser@8.55.0(eslint@10.0.0(jiti@2.5.1))(typescript@5.9.3))(eslint@10.0.0(jiti@2.5.1))(typescript@5.9.3) + specifier: ^8.56.0 + version: 8.56.0(@typescript-eslint/parser@8.56.0(eslint@10.0.0(jiti@2.5.1))(typescript@5.9.3))(eslint@10.0.0(jiti@2.5.1))(typescript@5.9.3) "@typescript-eslint/parser": - specifier: ^8.55.0 - version: 8.55.0(eslint@10.0.0(jiti@2.5.1))(typescript@5.9.3) + specifier: ^8.56.0 + version: 8.56.0(eslint@10.0.0(jiti@2.5.1))(typescript@5.9.3) all-contributors-cli: specifier: ^6.26.1 version: 6.26.1 @@ -192,11 +192,14 @@ importers: specifier: ~5.9.3 version: 5.9.3 typescript-eslint: - specifier: ^8.55.0 - version: 8.55.0(eslint@10.0.0(jiti@2.5.1))(typescript@5.9.3) + specifier: ^8.56.0 + version: 8.56.0(eslint@10.0.0(jiti@2.5.1))(typescript@5.9.3) vite: specifier: ^7.3.1 version: 7.3.1(@types/node@24.3.0)(jiti@2.5.1)(terser@5.43.1)(yaml@2.8.1) + vite-plugin-codeigniter: + specifier: ^2.0.0 + version: 2.0.0(vite@7.3.1(@types/node@24.3.0)(jiti@2.5.1)(terser@5.43.1)(yaml@2.8.1)) vite-plugin-pwa: specifier: ^1.2.0 version: 1.2.0(vite@7.3.1(@types/node@24.3.0)(jiti@2.5.1)(terser@5.43.1)(yaml@2.8.1))(workbox-build@7.4.0)(workbox-window@7.4.0) @@ -1735,6 +1738,12 @@ packages: peerDependencies: postcss: ^8.4 + "@emnapi/runtime@1.8.1": + resolution: + { + integrity: sha512-mehfKSMWjjNol8659Z8KxEMrdSJDDot5SXMq00dM8BN4o+CLNXQ0xH2V7EchNHV4RmbZLmmPdEaXZc5H2FXmDg==, + } + "@epic-web/invariant@1.0.0": resolution: { @@ -2155,6 +2164,234 @@ packages: } engines: { node: ">=18.18" } + "@img/colour@1.0.0": + resolution: + { + integrity: sha512-A5P/LfWGFSl6nsckYtjw9da+19jB8hkJ6ACTGcDfEJ0aE+l2n2El7dsVM7UVHZQ9s2lmYMWlrS21YLy2IR1LUw==, + } + engines: { node: ">=18" } + + "@img/sharp-darwin-arm64@0.34.5": + resolution: + { + integrity: sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w==, + } + engines: { node: ^18.17.0 || ^20.3.0 || >=21.0.0 } + cpu: [arm64] + os: [darwin] + + "@img/sharp-darwin-x64@0.34.5": + resolution: + { + integrity: sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw==, + } + engines: { node: ^18.17.0 || ^20.3.0 || >=21.0.0 } + cpu: [x64] + os: [darwin] + + "@img/sharp-libvips-darwin-arm64@1.2.4": + resolution: + { + integrity: sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g==, + } + cpu: [arm64] + os: [darwin] + + "@img/sharp-libvips-darwin-x64@1.2.4": + resolution: + { + integrity: sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg==, + } + cpu: [x64] + os: [darwin] + + "@img/sharp-libvips-linux-arm64@1.2.4": + resolution: + { + integrity: sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==, + } + cpu: [arm64] + os: [linux] + libc: [glibc] + + "@img/sharp-libvips-linux-arm@1.2.4": + resolution: + { + integrity: sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==, + } + cpu: [arm] + os: [linux] + libc: [glibc] + + "@img/sharp-libvips-linux-ppc64@1.2.4": + resolution: + { + integrity: sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==, + } + cpu: [ppc64] + os: [linux] + libc: [glibc] + + "@img/sharp-libvips-linux-riscv64@1.2.4": + resolution: + { + integrity: sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==, + } + cpu: [riscv64] + os: [linux] + libc: [glibc] + + "@img/sharp-libvips-linux-s390x@1.2.4": + resolution: + { + integrity: sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==, + } + cpu: [s390x] + os: [linux] + libc: [glibc] + + "@img/sharp-libvips-linux-x64@1.2.4": + resolution: + { + integrity: sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==, + } + cpu: [x64] + os: [linux] + libc: [glibc] + + "@img/sharp-libvips-linuxmusl-arm64@1.2.4": + resolution: + { + integrity: sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==, + } + cpu: [arm64] + os: [linux] + libc: [musl] + + "@img/sharp-libvips-linuxmusl-x64@1.2.4": + resolution: + { + integrity: sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==, + } + cpu: [x64] + os: [linux] + libc: [musl] + + "@img/sharp-linux-arm64@0.34.5": + resolution: + { + integrity: sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==, + } + engines: { node: ^18.17.0 || ^20.3.0 || >=21.0.0 } + cpu: [arm64] + os: [linux] + libc: [glibc] + + "@img/sharp-linux-arm@0.34.5": + resolution: + { + integrity: sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==, + } + engines: { node: ^18.17.0 || ^20.3.0 || >=21.0.0 } + cpu: [arm] + os: [linux] + libc: [glibc] + + "@img/sharp-linux-ppc64@0.34.5": + resolution: + { + integrity: sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==, + } + engines: { node: ^18.17.0 || ^20.3.0 || >=21.0.0 } + cpu: [ppc64] + os: [linux] + libc: [glibc] + + "@img/sharp-linux-riscv64@0.34.5": + resolution: + { + integrity: sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==, + } + engines: { node: ^18.17.0 || ^20.3.0 || >=21.0.0 } + cpu: [riscv64] + os: [linux] + libc: [glibc] + + "@img/sharp-linux-s390x@0.34.5": + resolution: + { + integrity: sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==, + } + engines: { node: ^18.17.0 || ^20.3.0 || >=21.0.0 } + cpu: [s390x] + os: [linux] + libc: [glibc] + + "@img/sharp-linux-x64@0.34.5": + resolution: + { + integrity: sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==, + } + engines: { node: ^18.17.0 || ^20.3.0 || >=21.0.0 } + cpu: [x64] + os: [linux] + libc: [glibc] + + "@img/sharp-linuxmusl-arm64@0.34.5": + resolution: + { + integrity: sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==, + } + engines: { node: ^18.17.0 || ^20.3.0 || >=21.0.0 } + cpu: [arm64] + os: [linux] + libc: [musl] + + "@img/sharp-linuxmusl-x64@0.34.5": + resolution: + { + integrity: sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==, + } + engines: { node: ^18.17.0 || ^20.3.0 || >=21.0.0 } + cpu: [x64] + os: [linux] + libc: [musl] + + "@img/sharp-wasm32@0.34.5": + resolution: + { + integrity: sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==, + } + engines: { node: ^18.17.0 || ^20.3.0 || >=21.0.0 } + cpu: [wasm32] + + "@img/sharp-win32-arm64@0.34.5": + resolution: + { + integrity: sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g==, + } + engines: { node: ^18.17.0 || ^20.3.0 || >=21.0.0 } + cpu: [arm64] + os: [win32] + + "@img/sharp-win32-ia32@0.34.5": + resolution: + { + integrity: sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg==, + } + engines: { node: ^18.17.0 || ^20.3.0 || >=21.0.0 } + cpu: [ia32] + os: [win32] + + "@img/sharp-win32-x64@0.34.5": + resolution: + { + integrity: sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw==, + } + engines: { node: ^18.17.0 || ^20.3.0 || >=21.0.0 } + cpu: [x64] + os: [win32] + "@isaacs/balanced-match@4.0.1": resolution: { @@ -2900,92 +3137,92 @@ packages: integrity: sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==, } - "@typescript-eslint/eslint-plugin@8.55.0": + "@typescript-eslint/eslint-plugin@8.56.0": resolution: { - integrity: sha512-1y/MVSz0NglV1ijHC8OT49mPJ4qhPYjiK08YUQVbIOyu+5k862LKUHFkpKHWu//zmr7hDR2rhwUm6gnCGNmGBQ==, + integrity: sha512-lRyPDLzNCuae71A3t9NEINBiTn7swyOhvUj3MyUOxb8x6g6vPEFoOU+ZRmGMusNC3X3YMhqMIX7i8ShqhT74Pw==, } engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } peerDependencies: - "@typescript-eslint/parser": ^8.55.0 - eslint: ^8.57.0 || ^9.0.0 + "@typescript-eslint/parser": ^8.56.0 + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: ">=4.8.4 <6.0.0" - "@typescript-eslint/parser@8.55.0": + "@typescript-eslint/parser@8.56.0": resolution: { - integrity: sha512-4z2nCSBfVIMnbuu8uinj+f0o4qOeggYJLbjpPHka3KH1om7e+H9yLKTYgksTaHcGco+NClhhY2vyO3HsMH1RGw==, + integrity: sha512-IgSWvLobTDOjnaxAfDTIHaECbkNlAlKv2j5SjpB2v7QHKv1FIfjwMy8FsDbVfDX/KjmCmYICcw7uGaXLhtsLNg==, } engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } peerDependencies: - eslint: ^8.57.0 || ^9.0.0 + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: ">=4.8.4 <6.0.0" - "@typescript-eslint/project-service@8.55.0": + "@typescript-eslint/project-service@8.56.0": resolution: { - integrity: sha512-zRcVVPFUYWa3kNnjaZGXSu3xkKV1zXy8M4nO/pElzQhFweb7PPtluDLQtKArEOGmjXoRjnUZ29NjOiF0eCDkcQ==, + integrity: sha512-M3rnyL1vIQOMeWxTWIW096/TtVP+8W3p/XnaFflhmcFp+U4zlxUxWj4XwNs6HbDeTtN4yun0GNTTDBw/SvufKg==, } engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } peerDependencies: typescript: ">=4.8.4 <6.0.0" - "@typescript-eslint/scope-manager@8.55.0": + "@typescript-eslint/scope-manager@8.56.0": resolution: { - integrity: sha512-fVu5Omrd3jeqeQLiB9f1YsuK/iHFOwb04bCtY4BSCLgjNbOD33ZdV6KyEqplHr+IlpgT0QTZ/iJ+wT7hvTx49Q==, + integrity: sha512-7UiO/XwMHquH+ZzfVCfUNkIXlp/yQjjnlYUyYz7pfvlK3/EyyN6BK+emDmGNyQLBtLGaYrTAI6KOw8tFucWL2w==, } engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } - "@typescript-eslint/tsconfig-utils@8.55.0": + "@typescript-eslint/tsconfig-utils@8.56.0": resolution: { - integrity: sha512-1R9cXqY7RQd7WuqSN47PK9EDpgFUK3VqdmbYrvWJZYDd0cavROGn+74ktWBlmJ13NXUQKlZ/iAEQHI/V0kKe0Q==, + integrity: sha512-bSJoIIt4o3lKXD3xmDh9chZcjCz5Lk8xS7Rxn+6l5/pKrDpkCwtQNQQwZ2qRPk7TkUYhrq3WPIHXOXlbXP0itg==, } engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } peerDependencies: typescript: ">=4.8.4 <6.0.0" - "@typescript-eslint/type-utils@8.55.0": + "@typescript-eslint/type-utils@8.56.0": resolution: { - integrity: sha512-x1iH2unH4qAt6I37I2CGlsNs+B9WGxurP2uyZLRz6UJoZWDBx9cJL1xVN/FiOmHEONEg6RIufdvyT0TEYIgC5g==, + integrity: sha512-qX2L3HWOU2nuDs6GzglBeuFXviDODreS58tLY/BALPC7iu3Fa+J7EOTwnX9PdNBxUI7Uh0ntP0YWGnxCkXzmfA==, } engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } peerDependencies: - eslint: ^8.57.0 || ^9.0.0 + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: ">=4.8.4 <6.0.0" - "@typescript-eslint/types@8.55.0": + "@typescript-eslint/types@8.56.0": resolution: { - integrity: sha512-ujT0Je8GI5BJWi+/mMoR0wxwVEQaxM+pi30xuMiJETlX80OPovb2p9E8ss87gnSVtYXtJoU9U1Cowcr6w2FE0w==, + integrity: sha512-DBsLPs3GsWhX5HylbP9HNG15U0bnwut55Lx12bHB9MpXxQ+R5GC8MwQe+N1UFXxAeQDvEsEDY6ZYwX03K7Z6HQ==, } engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } - "@typescript-eslint/typescript-estree@8.55.0": + "@typescript-eslint/typescript-estree@8.56.0": resolution: { - integrity: sha512-EwrH67bSWdx/3aRQhCoxDaHM+CrZjotc2UCCpEDVqfCE+7OjKAGWNY2HsCSTEVvWH2clYQK8pdeLp42EVs+xQw==, + integrity: sha512-ex1nTUMWrseMltXUHmR2GAQ4d+WjkZCT4f+4bVsps8QEdh0vlBsaCokKTPlnqBFqqGaxilDNJG7b8dolW2m43Q==, } engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } peerDependencies: typescript: ">=4.8.4 <6.0.0" - "@typescript-eslint/utils@8.55.0": + "@typescript-eslint/utils@8.56.0": resolution: { - integrity: sha512-BqZEsnPGdYpgyEIkDC1BadNY8oMwckftxBT+C8W0g1iKPdeqKZBtTfnvcq0nf60u7MkjFO8RBvpRGZBPw4L2ow==, + integrity: sha512-RZ3Qsmi2nFGsS+n+kjLAYDPVlrzf7UhTffrDIKr+h2yzAlYP/y5ZulU0yeDEPItos2Ph46JAL5P/On3pe7kDIQ==, } engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } peerDependencies: - eslint: ^8.57.0 || ^9.0.0 + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: ">=4.8.4 <6.0.0" - "@typescript-eslint/visitor-keys@8.55.0": + "@typescript-eslint/visitor-keys@8.56.0": resolution: { - integrity: sha512-AxNRwEie8Nn4eFS1FzDMJWIISMGoXMb037sgCBJ3UR6o0fQTzr2tqN9WT+DkWJPhIdQCfV7T6D387566VtnCJA==, + integrity: sha512-q+SL+b+05Ud6LbEE35qe4A99P+htKTKVbyiNEe45eCbJFyh/HVK9QXwlrbz+Q4L8SOW4roxSVwXYj4DMBT7Ieg==, } engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } @@ -4189,6 +4426,13 @@ packages: } engines: { node: ">=8" } + detect-libc@2.1.2: + resolution: + { + integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==, + } + engines: { node: ">=8" } + dfa@1.2.0: resolution: { @@ -4461,13 +4705,6 @@ packages: } engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } - eslint-visitor-keys@4.2.1: - resolution: - { - integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==, - } - engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } - eslint-visitor-keys@5.0.0: resolution: { @@ -4986,6 +5223,7 @@ packages: { integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==, } + deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me hasBin: true glob@11.1.0: @@ -4994,6 +5232,7 @@ packages: integrity: sha512-vuNwKSaKiqm7g0THUBu2x7ckSs3XJLXE+2ssL7/MfTGPLLcrJQ/4Uq1CjPTtO5cCIiRxqvN6Twy1qOwhL0Xjcw==, } engines: { node: 20 || >=22 } + deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me hasBin: true glob@7.2.3: @@ -6248,10 +6487,10 @@ packages: engines: { node: ">= 18" } hasBin: true - marked@17.0.2: + marked@17.0.3: resolution: { - integrity: sha512-s5HZGFQea7Huv5zZcAGhJLT3qLpAfnY7v7GWkICUr0+Wd5TFEtdlRR2XUL5Gg+RH7u2Df595ifrxR03mBaw7gA==, + integrity: sha512-jt1v2ObpyOKR8p4XaUJVk3YWRJ5n+i4+rjQopxvV32rSndTJXvIzuUdWWIy/1pFQMkQmvTXawzDNqOH/CUmx6A==, } engines: { node: ">= 20" } hasBin: true @@ -6816,6 +7055,13 @@ packages: } engines: { node: ">=18" } + p-map@7.0.4: + resolution: + { + integrity: sha512-tkAQEw8ysMzmkhgw8k+1U/iPhWNhykKnSk4Rd5zLoPJCuJaGRPo6YposrZgaxHKzDHdDWWZvE/Sk7hsL2X/CpQ==, + } + engines: { node: ">=18" } + p-reduce@2.1.0: resolution: { @@ -8190,6 +8436,13 @@ packages: } engines: { node: ">= 0.4" } + sharp@0.34.5: + resolution: + { + integrity: sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==, + } + engines: { node: ^18.17.0 || ^20.3.0 || >=21.0.0 } + shebang-command@2.0.0: resolution: { @@ -8940,14 +9193,14 @@ packages: } engines: { node: ">= 0.4" } - typescript-eslint@8.55.0: + typescript-eslint@8.56.0: resolution: { - integrity: sha512-HE4wj+r5lmDVS9gdaN0/+iqNvPZwGfnJ5lZuz7s5vLlg9ODw0bIiiETaios9LvFI1U94/VBXGm3CB2Y5cNFMpw==, + integrity: sha512-c7toRLrotJ9oixgdW7liukZpsnq5CZ7PuKztubGYlNppuTqhIoWfhgHo/7EU0v06gS2l/x0i2NEFK1qMIf0rIg==, } engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } peerDependencies: - eslint: ^8.57.0 || ^9.0.0 + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: ">=4.8.4 <6.0.0" typescript@5.9.3: @@ -9144,6 +9397,14 @@ packages: integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==, } + vite-plugin-codeigniter@2.0.0: + resolution: + { + integrity: sha512-F4S23BlXu1Yhb2k/cHeB3DV8q1BN+GNFf63jDFRqL4vwdv12/RWK+hBhNSsUUQguklogluza6GL+U1W8t/ba0w==, + } + peerDependencies: + vite: ^7.0.0 + vite-plugin-pwa@1.2.0: resolution: { @@ -9159,6 +9420,15 @@ packages: "@vite-pwa/assets-generator": optional: true + vite-plugin-static-copy@3.2.0: + resolution: + { + integrity: sha512-g2k9z8B/1Bx7D4wnFjPLx9dyYGrqWMLTpwTtPHhcU+ElNZP2O4+4OsyaficiDClus0dzVhdGvoGFYMJxoXZ12Q==, + } + engines: { node: ^18.0.0 || >=20.0.0 } + peerDependencies: + vite: ^5.0.0 || ^6.0.0 || ^7.0.0 + vite@7.3.1: resolution: { @@ -9569,6 +9839,12 @@ packages: } engines: { node: ">=18" } + zod@4.3.6: + resolution: + { + integrity: sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==, + } + snapshots: "@actions/core@2.0.1": dependencies: @@ -10816,6 +11092,11 @@ snapshots: dependencies: postcss: 8.5.6 + "@emnapi/runtime@1.8.1": + dependencies: + tslib: 2.8.1 + optional: true + "@epic-web/invariant@1.0.0": {} "@esbuild/aix-ppc64@0.27.2": @@ -10995,6 +11276,102 @@ snapshots: "@humanwhocodes/retry@0.4.3": {} + "@img/colour@1.0.0": {} + + "@img/sharp-darwin-arm64@0.34.5": + optionalDependencies: + "@img/sharp-libvips-darwin-arm64": 1.2.4 + optional: true + + "@img/sharp-darwin-x64@0.34.5": + optionalDependencies: + "@img/sharp-libvips-darwin-x64": 1.2.4 + optional: true + + "@img/sharp-libvips-darwin-arm64@1.2.4": + optional: true + + "@img/sharp-libvips-darwin-x64@1.2.4": + optional: true + + "@img/sharp-libvips-linux-arm64@1.2.4": + optional: true + + "@img/sharp-libvips-linux-arm@1.2.4": + optional: true + + "@img/sharp-libvips-linux-ppc64@1.2.4": + optional: true + + "@img/sharp-libvips-linux-riscv64@1.2.4": + optional: true + + "@img/sharp-libvips-linux-s390x@1.2.4": + optional: true + + "@img/sharp-libvips-linux-x64@1.2.4": + optional: true + + "@img/sharp-libvips-linuxmusl-arm64@1.2.4": + optional: true + + "@img/sharp-libvips-linuxmusl-x64@1.2.4": + optional: true + + "@img/sharp-linux-arm64@0.34.5": + optionalDependencies: + "@img/sharp-libvips-linux-arm64": 1.2.4 + optional: true + + "@img/sharp-linux-arm@0.34.5": + optionalDependencies: + "@img/sharp-libvips-linux-arm": 1.2.4 + optional: true + + "@img/sharp-linux-ppc64@0.34.5": + optionalDependencies: + "@img/sharp-libvips-linux-ppc64": 1.2.4 + optional: true + + "@img/sharp-linux-riscv64@0.34.5": + optionalDependencies: + "@img/sharp-libvips-linux-riscv64": 1.2.4 + optional: true + + "@img/sharp-linux-s390x@0.34.5": + optionalDependencies: + "@img/sharp-libvips-linux-s390x": 1.2.4 + optional: true + + "@img/sharp-linux-x64@0.34.5": + optionalDependencies: + "@img/sharp-libvips-linux-x64": 1.2.4 + optional: true + + "@img/sharp-linuxmusl-arm64@0.34.5": + optionalDependencies: + "@img/sharp-libvips-linuxmusl-arm64": 1.2.4 + optional: true + + "@img/sharp-linuxmusl-x64@0.34.5": + optionalDependencies: + "@img/sharp-libvips-linuxmusl-x64": 1.2.4 + optional: true + + "@img/sharp-wasm32@0.34.5": + dependencies: + "@emnapi/runtime": 1.8.1 + optional: true + + "@img/sharp-win32-arm64@0.34.5": + optional: true + + "@img/sharp-win32-ia32@0.34.5": + optional: true + + "@img/sharp-win32-x64@0.34.5": + optional: true + "@isaacs/balanced-match@4.0.1": {} "@isaacs/brace-expansion@5.0.0": @@ -11465,14 +11842,14 @@ snapshots: "@types/trusted-types@2.0.7": {} - "@typescript-eslint/eslint-plugin@8.55.0(@typescript-eslint/parser@8.55.0(eslint@10.0.0(jiti@2.5.1))(typescript@5.9.3))(eslint@10.0.0(jiti@2.5.1))(typescript@5.9.3)": + "@typescript-eslint/eslint-plugin@8.56.0(@typescript-eslint/parser@8.56.0(eslint@10.0.0(jiti@2.5.1))(typescript@5.9.3))(eslint@10.0.0(jiti@2.5.1))(typescript@5.9.3)": dependencies: "@eslint-community/regexpp": 4.12.2 - "@typescript-eslint/parser": 8.55.0(eslint@10.0.0(jiti@2.5.1))(typescript@5.9.3) - "@typescript-eslint/scope-manager": 8.55.0 - "@typescript-eslint/type-utils": 8.55.0(eslint@10.0.0(jiti@2.5.1))(typescript@5.9.3) - "@typescript-eslint/utils": 8.55.0(eslint@10.0.0(jiti@2.5.1))(typescript@5.9.3) - "@typescript-eslint/visitor-keys": 8.55.0 + "@typescript-eslint/parser": 8.56.0(eslint@10.0.0(jiti@2.5.1))(typescript@5.9.3) + "@typescript-eslint/scope-manager": 8.56.0 + "@typescript-eslint/type-utils": 8.56.0(eslint@10.0.0(jiti@2.5.1))(typescript@5.9.3) + "@typescript-eslint/utils": 8.56.0(eslint@10.0.0(jiti@2.5.1))(typescript@5.9.3) + "@typescript-eslint/visitor-keys": 8.56.0 eslint: 10.0.0(jiti@2.5.1) ignore: 7.0.5 natural-compare: 1.4.0 @@ -11481,41 +11858,41 @@ snapshots: transitivePeerDependencies: - supports-color - "@typescript-eslint/parser@8.55.0(eslint@10.0.0(jiti@2.5.1))(typescript@5.9.3)": + "@typescript-eslint/parser@8.56.0(eslint@10.0.0(jiti@2.5.1))(typescript@5.9.3)": dependencies: - "@typescript-eslint/scope-manager": 8.55.0 - "@typescript-eslint/types": 8.55.0 - "@typescript-eslint/typescript-estree": 8.55.0(typescript@5.9.3) - "@typescript-eslint/visitor-keys": 8.55.0 + "@typescript-eslint/scope-manager": 8.56.0 + "@typescript-eslint/types": 8.56.0 + "@typescript-eslint/typescript-estree": 8.56.0(typescript@5.9.3) + "@typescript-eslint/visitor-keys": 8.56.0 debug: 4.4.3 eslint: 10.0.0(jiti@2.5.1) typescript: 5.9.3 transitivePeerDependencies: - supports-color - "@typescript-eslint/project-service@8.55.0(typescript@5.9.3)": + "@typescript-eslint/project-service@8.56.0(typescript@5.9.3)": dependencies: - "@typescript-eslint/tsconfig-utils": 8.55.0(typescript@5.9.3) - "@typescript-eslint/types": 8.55.0 + "@typescript-eslint/tsconfig-utils": 8.56.0(typescript@5.9.3) + "@typescript-eslint/types": 8.56.0 debug: 4.4.3 typescript: 5.9.3 transitivePeerDependencies: - supports-color - "@typescript-eslint/scope-manager@8.55.0": + "@typescript-eslint/scope-manager@8.56.0": dependencies: - "@typescript-eslint/types": 8.55.0 - "@typescript-eslint/visitor-keys": 8.55.0 + "@typescript-eslint/types": 8.56.0 + "@typescript-eslint/visitor-keys": 8.56.0 - "@typescript-eslint/tsconfig-utils@8.55.0(typescript@5.9.3)": + "@typescript-eslint/tsconfig-utils@8.56.0(typescript@5.9.3)": dependencies: typescript: 5.9.3 - "@typescript-eslint/type-utils@8.55.0(eslint@10.0.0(jiti@2.5.1))(typescript@5.9.3)": + "@typescript-eslint/type-utils@8.56.0(eslint@10.0.0(jiti@2.5.1))(typescript@5.9.3)": dependencies: - "@typescript-eslint/types": 8.55.0 - "@typescript-eslint/typescript-estree": 8.55.0(typescript@5.9.3) - "@typescript-eslint/utils": 8.55.0(eslint@10.0.0(jiti@2.5.1))(typescript@5.9.3) + "@typescript-eslint/types": 8.56.0 + "@typescript-eslint/typescript-estree": 8.56.0(typescript@5.9.3) + "@typescript-eslint/utils": 8.56.0(eslint@10.0.0(jiti@2.5.1))(typescript@5.9.3) debug: 4.4.3 eslint: 10.0.0(jiti@2.5.1) ts-api-utils: 2.4.0(typescript@5.9.3) @@ -11523,14 +11900,14 @@ snapshots: transitivePeerDependencies: - supports-color - "@typescript-eslint/types@8.55.0": {} + "@typescript-eslint/types@8.56.0": {} - "@typescript-eslint/typescript-estree@8.55.0(typescript@5.9.3)": + "@typescript-eslint/typescript-estree@8.56.0(typescript@5.9.3)": dependencies: - "@typescript-eslint/project-service": 8.55.0(typescript@5.9.3) - "@typescript-eslint/tsconfig-utils": 8.55.0(typescript@5.9.3) - "@typescript-eslint/types": 8.55.0 - "@typescript-eslint/visitor-keys": 8.55.0 + "@typescript-eslint/project-service": 8.56.0(typescript@5.9.3) + "@typescript-eslint/tsconfig-utils": 8.56.0(typescript@5.9.3) + "@typescript-eslint/types": 8.56.0 + "@typescript-eslint/visitor-keys": 8.56.0 debug: 4.4.3 minimatch: 9.0.5 semver: 7.7.4 @@ -11540,21 +11917,21 @@ snapshots: transitivePeerDependencies: - supports-color - "@typescript-eslint/utils@8.55.0(eslint@10.0.0(jiti@2.5.1))(typescript@5.9.3)": + "@typescript-eslint/utils@8.56.0(eslint@10.0.0(jiti@2.5.1))(typescript@5.9.3)": dependencies: "@eslint-community/eslint-utils": 4.9.1(eslint@10.0.0(jiti@2.5.1)) - "@typescript-eslint/scope-manager": 8.55.0 - "@typescript-eslint/types": 8.55.0 - "@typescript-eslint/typescript-estree": 8.55.0(typescript@5.9.3) + "@typescript-eslint/scope-manager": 8.56.0 + "@typescript-eslint/types": 8.56.0 + "@typescript-eslint/typescript-estree": 8.56.0(typescript@5.9.3) eslint: 10.0.0(jiti@2.5.1) typescript: 5.9.3 transitivePeerDependencies: - supports-color - "@typescript-eslint/visitor-keys@8.55.0": + "@typescript-eslint/visitor-keys@8.56.0": dependencies: - "@typescript-eslint/types": 8.55.0 - eslint-visitor-keys: 4.2.1 + "@typescript-eslint/types": 8.56.0 + eslint-visitor-keys: 5.0.0 "@vime/core@5.4.1": dependencies: @@ -12304,6 +12681,8 @@ snapshots: detect-indent@6.1.0: {} + detect-libc@2.1.2: {} + dfa@1.2.0: {} didyoumean@1.2.2: {} @@ -12516,8 +12895,6 @@ snapshots: eslint-visitor-keys@3.4.3: {} - eslint-visitor-keys@4.2.1: {} - eslint-visitor-keys@5.0.0: {} eslint@10.0.0(jiti@2.5.1): @@ -13554,7 +13931,7 @@ snapshots: marked@15.0.12: {} - marked@17.0.2: {} + marked@17.0.3: {} math-intrinsics@1.1.0: {} @@ -13657,7 +14034,7 @@ snapshots: normalize-package-data@6.0.2: dependencies: hosted-git-info: 7.0.2 - semver: 7.7.2 + semver: 7.7.4 validate-npm-package-license: 3.0.4 normalize-package-data@8.0.0: @@ -13792,6 +14169,8 @@ snapshots: p-map@7.0.3: {} + p-map@7.0.4: {} + p-reduce@2.1.0: {} p-reduce@3.0.0: {} @@ -14694,6 +15073,37 @@ snapshots: es-errors: 1.3.0 es-object-atoms: 1.1.1 + sharp@0.34.5: + dependencies: + "@img/colour": 1.0.0 + detect-libc: 2.1.2 + semver: 7.7.4 + optionalDependencies: + "@img/sharp-darwin-arm64": 0.34.5 + "@img/sharp-darwin-x64": 0.34.5 + "@img/sharp-libvips-darwin-arm64": 1.2.4 + "@img/sharp-libvips-darwin-x64": 1.2.4 + "@img/sharp-libvips-linux-arm": 1.2.4 + "@img/sharp-libvips-linux-arm64": 1.2.4 + "@img/sharp-libvips-linux-ppc64": 1.2.4 + "@img/sharp-libvips-linux-riscv64": 1.2.4 + "@img/sharp-libvips-linux-s390x": 1.2.4 + "@img/sharp-libvips-linux-x64": 1.2.4 + "@img/sharp-libvips-linuxmusl-arm64": 1.2.4 + "@img/sharp-libvips-linuxmusl-x64": 1.2.4 + "@img/sharp-linux-arm": 0.34.5 + "@img/sharp-linux-arm64": 0.34.5 + "@img/sharp-linux-ppc64": 0.34.5 + "@img/sharp-linux-riscv64": 0.34.5 + "@img/sharp-linux-s390x": 0.34.5 + "@img/sharp-linux-x64": 0.34.5 + "@img/sharp-linuxmusl-arm64": 0.34.5 + "@img/sharp-linuxmusl-x64": 0.34.5 + "@img/sharp-wasm32": 0.34.5 + "@img/sharp-win32-arm64": 0.34.5 + "@img/sharp-win32-ia32": 0.34.5 + "@img/sharp-win32-x64": 0.34.5 + shebang-command@2.0.0: dependencies: shebang-regex: 3.0.0 @@ -15208,12 +15618,12 @@ snapshots: possible-typed-array-names: 1.1.0 reflect.getprototypeof: 1.0.10 - typescript-eslint@8.55.0(eslint@10.0.0(jiti@2.5.1))(typescript@5.9.3): + typescript-eslint@8.56.0(eslint@10.0.0(jiti@2.5.1))(typescript@5.9.3): dependencies: - "@typescript-eslint/eslint-plugin": 8.55.0(@typescript-eslint/parser@8.55.0(eslint@10.0.0(jiti@2.5.1))(typescript@5.9.3))(eslint@10.0.0(jiti@2.5.1))(typescript@5.9.3) - "@typescript-eslint/parser": 8.55.0(eslint@10.0.0(jiti@2.5.1))(typescript@5.9.3) - "@typescript-eslint/typescript-estree": 8.55.0(typescript@5.9.3) - "@typescript-eslint/utils": 8.55.0(eslint@10.0.0(jiti@2.5.1))(typescript@5.9.3) + "@typescript-eslint/eslint-plugin": 8.56.0(@typescript-eslint/parser@8.56.0(eslint@10.0.0(jiti@2.5.1))(typescript@5.9.3))(eslint@10.0.0(jiti@2.5.1))(typescript@5.9.3) + "@typescript-eslint/parser": 8.56.0(eslint@10.0.0(jiti@2.5.1))(typescript@5.9.3) + "@typescript-eslint/typescript-estree": 8.56.0(typescript@5.9.3) + "@typescript-eslint/utils": 8.56.0(eslint@10.0.0(jiti@2.5.1))(typescript@5.9.3) eslint: 10.0.0(jiti@2.5.1) typescript: 5.9.3 transitivePeerDependencies: @@ -15309,6 +15719,15 @@ snapshots: spdx-correct: 3.2.0 spdx-expression-parse: 3.0.1 + vite-plugin-codeigniter@2.0.0(vite@7.3.1(@types/node@24.3.0)(jiti@2.5.1)(terser@5.43.1)(yaml@2.8.1)): + dependencies: + glob: 11.1.0 + picocolors: 1.1.1 + sharp: 0.34.5 + vite: 7.3.1(@types/node@24.3.0)(jiti@2.5.1)(terser@5.43.1)(yaml@2.8.1) + vite-plugin-static-copy: 3.2.0(vite@7.3.1(@types/node@24.3.0)(jiti@2.5.1)(terser@5.43.1)(yaml@2.8.1)) + zod: 4.3.6 + vite-plugin-pwa@1.2.0(vite@7.3.1(@types/node@24.3.0)(jiti@2.5.1)(terser@5.43.1)(yaml@2.8.1))(workbox-build@7.4.0)(workbox-window@7.4.0): dependencies: debug: 4.4.1 @@ -15320,6 +15739,14 @@ snapshots: transitivePeerDependencies: - supports-color + vite-plugin-static-copy@3.2.0(vite@7.3.1(@types/node@24.3.0)(jiti@2.5.1)(terser@5.43.1)(yaml@2.8.1)): + dependencies: + chokidar: 3.6.0 + p-map: 7.0.4 + picocolors: 1.1.1 + tinyglobby: 0.2.15 + vite: 7.3.1(@types/node@24.3.0)(jiti@2.5.1)(terser@5.43.1)(yaml@2.8.1) + vite@7.3.1(@types/node@24.3.0)(jiti@2.5.1)(terser@5.43.1)(yaml@2.8.1): dependencies: esbuild: 0.27.2 @@ -15634,3 +16061,5 @@ snapshots: yocto-queue@0.1.0: {} yoctocolors@2.1.2: {} + + zod@4.3.6: {} diff --git a/public/castopod-avatar_medium.webp b/public/castopod-avatar_medium.webp deleted file mode 100644 index 910a2b35897be74bd0033302f526ee8ed077802e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10163 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 Vg=_AN??}4bI;960J2uw${|01N^XC8n diff --git a/public/castopod-avatar_thumbnail.webp b/public/castopod-avatar_thumbnail.webp deleted file mode 100644 index b0625dc01a1ecf4bb7cfc5668943ae4edee9cf61..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4879 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 diff --git a/public/castopod-banner-amber_medium.webp b/public/castopod-banner-amber_medium.webp deleted file mode 100644 index 234ec5321256f258ddb767995b21db1e8ede1dde..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6764 zcmeH|SyWR=8h|SsOIReBghhp5KoLP@RY8nM2O5x_7)1f2Ae%ym)u1^+6a_ps0@4Vr zB4HgCfhH`1h#-r0qcn;va@f@d1leRsAi0xt&vA}@=3!>~%}(9=UvB;NpZe;4w+iZo zhJk{um5mjE!C>Ho@Bxqjm|41zE!-SkObNc;dI8`0_!1)YckCi)hllzH`4VhwtqHbH zWNSi%iNQ8q0zI5|#y^ZfFemKYg@*cpB|yO8qAqMmVMj@!P)H;SEh#A>C5x7ol|jqM z$jK`z$jM{mWn>ia3Yhg+91bVDPDvS$RaV5}u%aR`gm4ZLC5=K!W94Mzu>W&|9s`UN z>;U310=5~zF)#!M1~mh90AMH~s)+Vq4F(skQ9@Em8Z9GCs8j%O7yj=G=n_BrkA=N}Ln79J6KjuCa~a_p6>aq$VsDK}GpNV}Du z!OqUf&C4(NN8wKuoXV=|ng_K_Pnug=+nzrA`Q@vw*WEq6eQ!oa$KJks|J(S)o*%*l)@fN z$|`S^CK|fT;!cKiqVbwWBU*DJwBO18JFuAli|jMlzq#H3Sp-b@@emk50<*T->;@#M z*e#2a=W7+8W1AUuUUayq-OO4{b!@U*mUjoy%FZBpr}N z_UdgIP*2^Uv??0J{)NFY)yxs~R7wU(uV&m2ZmP|WMt?=Im9zT%Q<1UztC`&|i+`24 zdzD>PzVF8z{8HI{ZhlZ)!`R`{%qJht>PD1%8V%F7L@1w{w9Y-H)m+}9X+tayITeM7 z?wv>)tXn6)W|l0_tm)cRGD=I0-_KRcSt=P(B1LR>O)k#1U+79r`-UDyz27!$jyFb3 z<<|H0X8z^?fy*1n5XjVr0JD0fd&n&_ER^NvGSxv~*Ruo)XO#pO+W1RDW7cbgH#^t3 ziL28Mt%-$>wdF?Z`9BP_BwnsW}LwIT9U{`P-c1lVuhv!{8WmJ_MtA4bAjxF=&3?}9Gbhdk zv^+@}$l%`5FPdiZ90XQA)Vj&alSKoI?vFog?<8Y^^VbtF^Zdc!+@povnT$uNr=v}S z!T7VnKu_o=s2uG*o;lu%B;B48%YoeX#5*n3u9&BT8AOShQD!j}b%MiSORCY%KH#AzIQAhu zo}7j0TeIIi9b!1vGmh_<>-N3cZYOO50nWk9r?-2YXNMdfmOt!5HSa{nQgp`DO&mWJ zbQn|F}IwdMOfUiU?+rvrG4m5pU6?-~p$C20f4CtUln3r>~E!@AwcWDM!T zu9N%O*()iu$nz$*^+p*tKYA1xF3^t`Ka%Uty4D^jjpl7b3J$!l(Rp2%*M*N;EL(|E z%*%D2T(5+ZZMRAPoN7pW!_6BsPlmot(& z+q^v-L2n5i!fASBgs||(1sf?n%i{}%x_T3%jPl39n|EY?<>nc$?JT(?N&SBK zZPSouG%E}OSKXJ)&c}VsvZ2v6gA9uE2??|A-JKU4Sy>y8+1-kNmf+wd*wlcY%JS-4 zEj{(3g=St|zp2BI{cxU?5E85A6N6toDy9B&CIn>c8^+a0GcyoyuX|Ks_uwtxwqagi zeUEC+9MS8U_ncUMInkrIu%+?A5#DGSX~e&pk7(obA@ITZi^+MEf?p!JX|g-E$j^Bt z)%%ZZ4rbSN1;6X^iFPb>Gc5I8Ug0Tzqb#cFyL%#%!9U4=k5+qj_3 zmwS1(H+{`+-W;Cr=iHu^d=1wMN2kFO4I-DqJe?M@Ki7-PB0jo%ZkopMp>OmvXm11P zxfy(5X8)VI_H+e8p8{!M69iO)sz>iwdYA=i^~;B7B*qGtE-+3yZv0`@F~Ur(N=bUk zYhN|GH1c&oi^!?gD6Ock=q421>R;Z5Ff!KZKL+I^ujEMKGV^fsSNA{ZDoPFAy_!%Z zMI>f);i9I#%^_YP@&h_`dDQ#k6!?RFiMm*yzNcmGFd%B{7!4p z8!9_mmnq6|W!DV$5>*O0P7<*=%dK6VDU*J1?w$`VZg(w+^k3Z=TkEv|)|o60@g9gB R5IZ1tK_1P|rX?qqI0P zFI~aY%U!`Mz|~!$%*;qrN1?DZF(6Oj-S5fuR$!pIEN!@|nR z%E~Fi%grl7GWdUhL6C!?fzg4PQHg;`kdaxC@&6G9c?JeXR-jiwzJ&rtCZHSH*f}`4 zxPc0`3NSD+GBY!=FoRqTR9y>{XJ8Rz6;d>GWD^cdWLGK_F>0K+kVDyN<3Z7&iyu^s zlZu)+xx~aJB&Af<)HO7@(s#)lOnKGb1qam<1W^89sPvEZWavzt*WsV*%4BhJ?ZLtqjvtLPV1; zudWkeT(+xxt`v9ecXJ+dlYnCp8sC-oZ?l&w|0cKaKZC>X`M*Eie;9jhZqYr753N(K znbl|Q+NH2fWS)omoZ(={SaeX&GyIAQbuT}rVU2R|1{YZSQD}CitR-?|ryZ!g4`wz|90l>WND`IS|}rpxcv3D$gT^wd~B z$>HUn)l>KFt{48{_AmOi{iZv&CY_$D%)(G{-lk7unw;T9Tc>$O#aEA=`ew811w%+< zKxp^A)jzIQJ+Mt!)TO~d30^HWH~Pb>uSpj^9p1}O_D}5N^KYsXHt%X(-pXmXNpNTJ z?Rkr~>Dj4dmKRDq-L#{`!a}j0`P!blGc-Qo! E02IkvfdBvi diff --git a/public/castopod-banner-crimson_federation.jpg b/public/castopod-banner-crimson_federation.jpg deleted file mode 100644 index a016c399eb9457e524450d431a2aa2e77e89705d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14859 zcmeI1do+~$8pq#ZkQs*2jIhPH6e+pnQtr{XRi<%mldPKLGL=gq#3W)jyPAq2iU~1E zNV&@;5y}0|CQ`X=5k?rsoKfer&%XT8Id#@qd#(5PzR&OdW1ip4^L^gWZ#~a%4ZDXu z1PEK2T9^V52m~tNiDDSLXmx?%j)wyRH0ynqe#t zV9hZ8TIyT2VSN0KobWgkh|$OFQiZX90ZagHF0QqkGoYNCXB`g@6v_kRrrSlT0m%nm?%n21cgSeeF=n{vj)n;&%?uy5`+t){^P-} z1d!_>44!^&h%CT`gm5Dv>}o(703bXZscUNgIUrn|7H?cJr>sAK{brL8*sbPhKZyock1Q-TFa($5G!4{4miCV&W2;HY+G@ zQPR-V(%!jC$7B!I)Xdz%(#F=#-r?Ynj)Y^b$KBjLJWrqT^A9*17!)3HF*53>OXM5T zG1S<&oAC)Lsdv-T>Gv}3KYE;(Ur<<7TvGL{y5@Op-HZCR_Kwc3?w;Ph*TZk#z8e`G z8=sh&ony>@Tv%LUuIYjR+@EEAQT7L2NRBQpD3lw@x26li6~HlWB$P)+jaOthp6`gy zdRg_bbtvQO$+=JY<#t$qKp*vOg^9{*yxugkChe25uM>9Rzf$%^*l)V}00C|Y=jCxD z0YhMEf~=TBGt4n2E8gJ(4a@<^0LTEy0LTEy0LTEy0LTEy0LTEy0LTEy0LZ}Kf&uj2 z0^o)I#eKYJaqu{MJtofRZXOYIpq7j5g>>8)1mFk)!a(WzMAV_(~TcZraxXLQh6 zwXWbM#l2DGqhI&R@_sfD+88{54sCe5+D>}0n8eRY^kV}C?WDoSX8-Pi3ReApIN)EN z)Bwa~&(5Fp??MKPz_|1{3XaW^7kg<@LUdS_F<{3|0v2iAed0w~bFIR_pls~Ls^DCRN4iD*_U?haQ; zMbxUKGvNU7R>UCDtEs(p@F5dXLG`6hhC&~S9u~{1TuS4$Hz?K%y_rca-Km!EtaNy4 z+T>0OdCp6EvB3XH^uD}nHK=p@#=M;?N@=^Dv6f*GH z9zEHctrEqEKUE(U9dQL`TuWbEMcvBv`T2GXp;W^)VdsW3kG2t6qZpWMl5WHR>XIxo z^_WA%gaoxI)3<$KU%UChi=kjh51u}ut>awZOx$6DnWE?9Zme-_3YPAr#0_^W+;5mc zM2S|Uzc`73Fl%KbQ~eF!?ECP%s2tNKS5j#K>6N`27Ul9Rd4=ehKOluGGYv^FASLnT zCz-oi-!QEa#~noos+UlH>N0Mx&YnhO#P|DQkx57Rge?Nl4v=r2Hstm+msgaM`py2m4(XQGMBBMdBnN* zo23&iwiD{Ah7EEyzYk85V})ld9d`TZ*VQ~7s7!f>A1|0~yzf{=uCk}v3iu+h!8H!i zxPsUzU3!?rh+afYPQ#8`$EzmA$M>hFiPWI*PEs;4dRR}txx2!{W1Byi|9}&(9Nkr` znR&?J$`kz{uc59pm5rx`A*}`r8^sW-5q7~|$ysR_+C6%$Q& z<&<<5=5?Kxd-8tWm3>?uD-wHDr$a|83sFq33FInyzQpDQcJM45zhJ`SJspS~n96;=J6%`*XL$2|rM*Nh16C`^kBB5=7dtmzV5&9~vq- zpjG+pVZ6c*WseX-OY_-H$t8J_%z>dK%~*xk*Q0oEIoPYE+VtAmOrG7JP4hcvUQiJ0 ztMk*f!dberN1Q(plHNu14iYD9r8SlHiOCgSB9Jx7nquq1fl$=w6<6b{$(@m~hjp4X znF%)FQM#fNbla<{M}EK5h$&P)`dsn!d392Anm-j?mS^w%;J}`T)n!OtU}ekXQ`^VF zD1jS65XVi&0{!j>J6;WGR#{BLoD3Q;vnv#51LX-t6YVov_cRkvO^sU-j#rUNc1pk0 zj6d{#fM#cmK&5Wz`ThQ^2P@9^skndIpV=M~518AN(F4UxEwl7g#89V>;(ANVhJ}qn zE_pLNcM^J6k5JU*7OpX+XR?$&Y}FlSEMH9ObGu+SHs(#tZ7<()*eKacnNVE0Jm#svk?n&8~Qgmd-zFD%@O6ak&%8Ig+%F=AnN>^sQB*`Xch3 zMzMj5nXa7X&Oth%l?}k{U#_0ZHq=awhfi=?zL+V+Z0S|ethkk>L!m^oFQHsLCjI9~ z$Ru*hMFXp($w5Y&5#N}gWF3*unHBv+0XOJPAGtCHL*|)w_4JU1?r|gZ zy)RYuU)2?S{?=)HeJqu|2q5B&t_7smZx*t&Tr+MCIQgC zIR}t5A?95+aK>i*8f`$K#b)fQ57wWWF{*Ed3+aJN8sGq)$G`bJzLt8f&a6s&?p1w3 zrzWCOjIN5YSxXCV8ajT&aN*WmY6EFnd(=qcO!pCqSbZM1KniPQWgMO>w#|G&10r{* zt~#+g7>3KUV9nuMjYL9HaMK9}tqKc`W>~=D<0Zp#_vJmbLCuXQh(e$I>Qd@^5z@Ji zGY6nF_vqyj%I}ut61@*m3DG^BIuOk0P7O#V_V}k?8=I3}Zd_{NP5eVhLQ2nz2^7!f z8zx(0HQG*hCw!M|d^L<9ePF&p20#Wt20#Wt20#Wt20#Wt20#Wt20#Wt20#Wt2L6@| IaI<^=0TdoX0{{R3 diff --git a/public/castopod-banner-crimson_medium.webp b/public/castopod-banner-crimson_medium.webp deleted file mode 100644 index 4858928320164ed12fc6146d0043008e6d98b3d1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6759 zcmeH{c~nzZ9>;G;LV&OZ6GWvXf?_~W*^w$?3kWD{lqRB%MMOYQ5Cjy6D2qfXA_OWf zVNs9$hH)BFDpX85yPO9{sDy3Mq9QKh>@oPLjwrTE=~j& z53&>Cw7IdK0U<2%@bSQi7{X4%_H7DKAFu~-8JXo)x$K~WK{ zfJQ4RtEnm}W0cWoRdrR&Dl86%Q&d^4p^nv1!{V^Z4}rlYdk{!@BvKx$gjT}-=>dHY zFmf;(`1f#_Hju%<;20S69N+C7&V9=?E$kS2LF=s9$CMBm_Ol4fn%wlHe ze0wdops?uno#K+xvVT-n*W7>b@X_P?hUbk<&779jmtEbjc&~fj^bWos`Y_BFjEs&6 zr+%9LJTp5tzp%^&1Mq)g{Yv&bE{udr27!PhP|I8}nJ7u%7zA>?k*u1nC+cw6DsAHg zIjmhq{=H}NIwoF|xUa*x3hEn72R90r(S9cTV_@h1FS1|3{>{}36yY$*$Ae=43Cxc% zh?Oi-r5%HqCnJsY45SW79gsR8b>J`Iz}2@~&39{E$n;4h7Q#@&HfyT)v9ekHhg#DO zNsrk~aMY6)PoqcD^>3`Mig$KdyMVc-CjCu+9BbrDS{7 z|J<%|jcbmISq@BIY(oxZwBLrd&y?4G{-mXcje(z<-P1=ewX3PvF!yX{Y685@CHh6uSuC%T$!Ng z)8j(pvO|&XO%<WijrtJb#dC3my5$wA8xM5$ zscgH@c|RKeda{z5O*wC#(W6alGkOO*NT1B_wk}{b*(Ls+z0gj#2w{BnK33k{Li^Vtk&7hjH|Z$FwArkM zwNn>kS6BGj^L1Ie12c@$rPLRZBqh`FHgvy@ul)uE9Hsnn>>CKE2waS#y8AFG4NaL$ zi?W}-Tp)fY!c#BM7y*gK-`+lU6JMfTy(3b+D>y%&958OxZuLc3hviYl@wH`<8(s-* zEUPm|Ja{#=A+nqw`i;;x^eYXTJADj8gl;_7b5+z9tiw>dqDFd2iCA}ZHmWPI{_Un~ zZl8NEkSy>oA2~}(Y*5MVjlCYm$|}cmGt8dub_6d+o#KvLkE{q`>! z2Y0gBUvz{NJmHfVFOx+4TS-s%*`cP2AyEJN!~#lXaS;N%itXGFagOXMF>%^Tu=UCM zT952mx4N7?4|A@WE42!`83IWw3VtAhr-(!l825w#`T%=GlQb~_0a|7j^<@3~z}m)m zM^SO2#z13C>7lk#S4?}*P>|l|#t5c>HCfXqPG}H|A@I2b0!eoVrj_xtvk<7T%kpqX zriISJyCiMg&wHg0U~d|%j>o--Hy2I&hBNb}=`GpC&@6YI~a#Gg%~)Qz#y z_Lt@Kdkeqo*tNp_!FrOxe+%w6f6+O8E*T3vS59Dt)dhOnN21FI6V@Ow)QBVBOvB1^ zO{i4sJC|ABHmh}Orv`$~g>`pX|1i*xqcK3$3|~A_`0<5^ySF3{O$t5niSZv(#SKw> z%Y7Oh_LPx4C0}lCYs+WTBMZ5p+W_TF3B9e>(rnulq?!4a0f+_CNY6m(fYbr015yY6 JIu1Z@{t3TtO2z;H diff --git a/public/castopod-banner-crimson_small.webp b/public/castopod-banner-crimson_small.webp deleted file mode 100644 index 1291f73b30bf3ca227cb8665a89064dee801c99f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1675 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 Ao&W#< diff --git a/public/castopod-banner-jacaranda_medium.webp b/public/castopod-banner-jacaranda_medium.webp deleted file mode 100644 index ffca50ee8a1371bbddd3d89799c5f2c568c7bd24..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6716 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 diff --git a/public/castopod-banner-lake_small.webp b/public/castopod-banner-lake_small.webp deleted file mode 100644 index b3e5c539456d6d178f69bea99c27b3b9a6c8ed3a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1630 zcmex=_1P|rX?qqI0P zFI~aY%U!`Mz|~!$%*;qrN1?DZF(6Oj-S5fuR$!pIEN!@|nR z%E~Fi%grl7GWdUhL6C!?fzg4PQHg;`kdaxC@&6G9c?JeXR-jiwzJ&rtCZHSH*f}`4 zxPc0`3NSD+GBY!=FoRqTR9y>{XJ8Rz6;d>GWD^cdWLGK_F>0K+kVDyN<3Z7&iyu^s zlZu)+xx~aJB&Af<)HO7@(s#)lOnKGb1qam<1W^8Gd?oX{^6={@|f5jRj1j7!n3+U!LN&R90aO z)p|Djn*X5&(`m=gx(c+-OEOCCHP4lgkBWaYd;iZ*^Z)&o|FCY;xv~p;EVFf&Zoj3z z!!n1d*5Bd_v*?A$IPTRJYNelM1=zX0snr%Y>zi@Of913Ko96YOpW6TZW&hA)SINA@ zK9^4^$3j(umhNpAeYt&l)2(xlQsPY)u|J8A_d2k9M{fDy?M1QCwezZryq*YNNbmU< zqPdN4Qmnt#l@M)3W|rrsLF-<{CjZHrnp4aw66in?j=5ZQ@<*uE&SeuMk5wuJuqQA0 zvH7>&jc9*iZ=v}Ur+l(q?UgTeBgQSrJ94gna{tG5s&|y8B{x`KiO*^O{rHpV?53(& zt2TKZFX!*g(S6J*yXM5=IXv~f>Dl*m|6Sf{cI~4{;P(6JHuJNd*4^a)e*8&RNWm*f zKgajJj_L)aDObCyrbql|kXjmUs>H2uUfI-d%?XV~T?~|BV^@&?Mz@Sb4O|*SAKU-G F2>{6DJ7@p^ diff --git a/public/castopod-banner-onyx_federation.jpg b/public/castopod-banner-onyx_federation.jpg deleted file mode 100644 index 73e4423a2518e41bd71912fd63cf5d8f86c06efa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14734 zcmeI0dpy)xAIHz!41*YEgeS(eL`pUl#UxF_ZbNceDI2wvRWa_;$SuaYcA?9Ywu47JpB~(6?C<5P$w_~C?s;>=3i+3jS<9P&}a+}ixm(Q!HI|n z;y;7N2w^Zn1W{p8!hd~1 zw*g)dF@br4LMQ00P68x}f&=3xVXXQ2;9_gcIg>C=>@s1PX;jqZU@p z?;Xf*2WUJ-LUFaBfTYDlYFiU7{%2B5{4Goz3!4q z+Q$V6o8!~+tAv!l*)d9V^k~9KsjTT%9b1t0o3hUn7W_XcdoS$Yx;lUe3c=qz6dsTP zr$ogxdA;{Hy065C$BZb~%hj+0z?sD;-AD zd3e{@*`dWlJOU!>Z$6RL`~!(sb!G)83?Ii05H|P@@J9L4+^WMkG{0&7N# zoJFd?<|RzNw!7|dzsgOqE~7Z#R9uS%1rR=J*5Qf14%=K{SQ?LHh zW_w0m?HsfdIby53jwae%p=;U2!O%R-k=LbE@>OG1&Vfc`*>3C|G5;w2ZkM!;IZki1 zCZ~w(jsrzSIH_moD7o8xT&f)yM;y@YGg6eVcbQ)Tf$=-k`RDBHrcLq|Q@Ris2u+!; zN`Fm*K%)@(O~{@+3h*;-8{o$-33``6YBzdnz!7KHI&FJNn5PE^n0BV&L0OekPq~mv&04s!zTqXd|O&MY&C;Eo+IZ zQk?`qZc7~-OfF;}JVwlKv0&6__Up^9j&1PNxqGne+c`=V!|OShEhimdE--RcM3xul zW#-Gtj)+-m*v0112JNrzxz@Vu(Qxh$v3p~@)T_eXYqZIF>6PC5=)u;g%j#Ye$@- z*TNmHqdUi~2q zsmBy%MJrPio<}!MTTs3A$*j>-;e>7RD+jzNlTOFCcwD?+DrfJXRhy?#ek++rTk%$A z$+Z5h6PKhCuiG{hR4H%mEt{U3dx*`p(sVM5wJGpj0-jnxpseMo*iPAsY1g%Hqli!o2^cy5$d0goz5(7eHwK8G!X*wDb3e1L9S~xd2CW_KBcwH4vwCG z*ru=Z_V~-_>3=M^=R2v|m|#^>T(w`AkAYwddTNymYap~w%!ELH_s~bT(i(h3GYaex@m_c3~+|85=ZV7m$Mz5*=z8$omKDqD_Q-PJv(wD>ZFg< zB}buiTI;lAV@TikfkMiV>{$0AE*J_)#>1kiE zF?Q~~8PTHIAY`!qNyY(wZ3Bi~a)0oB+qIJt#~q}$cDaHxS*P(YPn!7qtm`%)js z)qI$?=rJxP<8e#KpEY5TyZ+=Z+Q7NgyYz9lngCH<#8{Mztt6E{Bq0%WnBFH?n6Iu}=tk52sF@>ov|Iq9>Z-?F{}m zf_L4G|6`!mUqiC%JcrT4rDLZK4Yb(kY`1Y~)6Tb+6I{<<|Eo`|KQnjna4~88nZx|+ zrm4=@**B}WQ!c0*H_OB8wcnOlwE2(??cKPY4!bu#sPPvw95lav{X+f`y`w?aUW&maYW&maYW&maYW&maYW&maYW&maYX5jD4fEd*NPgTJuZU6uP diff --git a/public/castopod-banner-onyx_medium.webp b/public/castopod-banner-onyx_medium.webp deleted file mode 100644 index 189f77f596862221062fe22a305577fe11bfa6a2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6742 zcmeH~c~nzZ9>?#?Lf9dYAPABaP$Ekq3W6I;X-L7bEENP%*;F=_eFwv$LSume1h)zp z%m~OLRt!)}1VjW>3bG4C76pozTC<(s=RsfAct#+hgkd76{Vlf!3Bn~GgE-fi7 zEhQ->B_pdKFC&YWm6DQIlE*6&h(w~a+y-SOg0cdENLYOdghs|-uo76T1VKhhhVWlE z_#wcHLl)?VXh;K~@DLgg!H)n500@hquG0RaK`3O7VmNULNh!pkN*EUqAoQu<(e;sOXsFv**sIq<+oJ%D$MB zd+G9(tE|GC?7!S9DlWPE-My;&oa&m|hQ>!tkDH&gw06Ge>h9_7>mL{y9UFiBW@2*c zr|H6ewxKJ1j8iQNqf>4o&q45~(CsZ*7O9z~1u%gDc zL~+7rnKvryB{a7?@`+v{9g<2~MkAYNR?+@W_Md?z{UNen!9H>g0BJOYBoB=T=0M0{ zF?AkNSWK{P>ua#Cfprb6YhYai{}&p#Jz$+@ELHYR@W!-f8Ly8x`t?*6IdL-3-IfKi z>dbd_O@T1jqXC0DEXj)lgFHNghe|L#q+7d83wA|m^kY`|FA$-=?_F0nO$}z+;(eD zo-8=1Upm!jS37WpTHQLqsRH&aCIze^Lx(nSXJ*Wo3m1EB4)e}2#zqaR;YZxJ4o5R!AYOh624;<-CG#=*zaO49vRD5S$>-%e;Yia1ER_@2u6Ch;tI%KTtWyeq)xgvoO)geZS)rh}j5P<*sV-#$F7?Z=EAtD=o*6hLJ97jc+UY88 zCHXP0y!k!1^kRED=3sEo!aURXhgY|CukE{5Z*)o_q2Rpon}l7hl#<#Awh~({OzQj!ibSxZRcQT!boT7uU1hRBoM=O{6=UCEf9u8I&`0)gLx( zS+4&sqv6U}?7j=dCm&JoT@c8WY;PwfYM-w%EgbI2;PfRi$e|YMnQ9mG0yGSddH$Im ze3CTs`MJlGHfh5zHC%8?y<|zcIxp((y z#fMxNSgq)?$|IZHr}afCOZH+i1P2T38Zy;9A`CLVhQSc&d9Cdmp)L$aiZG}(zaDlG zDlGUZ#iq;AJ6mP(u$f$$ z6VC+DwEJgPwlYS{0v83Oc>xT{EH<6<9*T+$e>vnjWOH2a+q#Y%@7Yqug55PyT=R+$ z2Gb5OkPtB1FT;SFzv2&iIs7S;;KAXcmRKzxin8Z{rP2EVNZB~M$enn~;I)gYNc?;g z;bO+}A`E&8WE+@cF!)WtFNV!RZk=K!zgrYtgnHX_ELCkZF*FrDJJbW-qm31Fb*#?v zIJT-i$?nkU;)-Ga!TnqMki+F_5O*c!c>$`1M`V<8mPk`ah#yNuf}!sk`_UWZR|w|5&-CoP`^ z8QtiQp^~gDHqFtC3N?GG4X7}9z`L&Q4TEUzE-)2tAit76-bC=)&yC9Fb(Sz1oD76~ zyQe)WJB{qcCWM_a||6a~g9G;sQ#ULD8|IKUOun{Rgs`>nUzi#V&f zwoK{D)VBB@+z+7yboxbzHy*>>wwD%k^q1Isnni*$VbHJ_1P|rX?qqI0P zFI~aY%U!`Mz|~!$%*;qrN1?DZF(6Oj-S5fuR$!pIEN!@|nR z%E~Fi%grl7GWdUhL6C!?fzg4PQHg;`kdaxC@&6G9c?JeXR-jiwzJ&rtCZHSH*f}`4 zxPc0`3NSD+GBY!=FoRqTR9y>{XJ8Rz6;d>GWD^cdWLGK_F>0K+kVDyN<3Z7&iyu^s zlZu)+xx~aJB&Af<)HO7@(s#)lOnKGb1qam<1W^8UAcv)TMPmV^J5wD29ZAcJZMPOD3H=v#_gy z&E4nOhS&9n=GQ%cvHx0wRq5qPA%R?#p9Lq&6u!G;9%a;$a0oub-MMsOi1&D}a4webSx(4Ch<+e}D3y zp;hT+?lXxe9nNY-E44&*-&m~o-?K+-Te+~(&t(dJN53BTdj9U6bnJ(>ccz!!PoH<^ zT}+cT^Rap@hEMsxRCO}%)WXPSCWqHO^}UJL{xfv_y7iyo!2YEP0gSF9l;P-qBEP@e zyZ+nS7`;z)Vpw#m3R?n)+>WyhRc6hP&cE56m}}#!<5lP8eB#?$$vxSLg_54SX{ELu z@{eO|E+5aA_EctdedQba@6N{m4D%cRGt|uguz=sG{n$3Kk1c)IQUcGh*&o}y^}X1C zhRj>Dvnyt4+$uQt>6 uJt40yMXylUz~k}doc*B<84QcMG$_U=zk*CztbUCOW>LdE6q>>O|0V#&qFK8D diff --git a/public/castopod-banner-pine_federation.jpg b/public/castopod-banner-pine_federation.jpg deleted file mode 100644 index 9e9df5cb0a81f62b6b0e45e487f671bd07c1adf3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14521 zcmeI0eLU3J9>>p^8PCON$jVbF(ylxvkF(NXv|*NhzsStL0=@t;VdDl9E-B#jL@~%gam4tW{LND#~HyvCD%Xkiy@f&=P301a_6w zD(s&w&|`oRN6esmkq8YSfI**g#%Np9|BkKKDb{q|E1_y;9od@pN7*}v$*2z7~|P)L;6vMz*3q|lHU6nedZsGJQ^ z%qMt_hGD!oc6(}W@e>J6BiBiJ-;h>G1uf%&4R4pFy;JtbgeCk}%2tH^s;dV`BN4(s z4~YRdFt5tcxwUW6QYViAV1s=CGXOIHGXOIHGXOIHGXOIHGXOIHGXOIHGXOL2f58BI z2USrwIj!5B-A>Uw$LfjGC3@gWv;_RtrA+O)uDDID|07>XP5xS%TB2VNU0e`&ENp*) z4@B9=HMZH(*MyR(7a%aE34t)WZY;nO$ze<8L!@u;hd+v#h(U}wA<8`&Tu!22@*yVa z#HN(VeRNkD?rx5e(UL9eX{ii1Ul>m zuLN#~oQJZA71WEZ>D;?||!R?N(o;l-4}hua&r4at3+ngcWo zETjEzgl936iteI(i%%b|Bq(x5%#{XsPP#)5_YHPEP^%bX$po6NuXE|>>&z{CR+?Do zRi{y&Jh)$FiO#W3|IU3}#W&WvXGHwo#nHV*ivG%en$v~Gt%i{un=MEX@MJo+7QJ>} z3XI)!j+DpH0kD0r50HWVOFQTjDZ|cJy&zDKvedeGZ3d7baJ-b#5!6G?2$O|?#H*%m zGCJBc=?4Dhsl#92L9VwhhrqaRnsGvTJ!GB zrG1ape6sX~>qO7U_1QTO`~Y3{J6gEPmFE3rXOs4FHpm=|A^MrPPBcygxw?;MH8Q;}8{Sjkx9cm)^jf-^VveRk38Novl53CQ?Ni~- zg6q>>q-SrWIgN#dk3{$CWi<`zZ%8h(R|yHhWk*x=y=t_L#M_%R(QoTjGq2Eerd26R z=`khr?$PJt!{5+#Dd+X(zPHOcCCvacX17QMSvDPl)lkR9{ zF4so6E5d(gc&JKtY1&fZ?J=1ZN0TY&W(hp zI8t|vhsV|Ko0t4n-BCX7?cc%Ep3VvMh(5UcW+=y?gnRq`Fqv36WzyQN_sLLsQeHYL zwah)}#KoS9;^Et#&SAmQhK}}gSmrRkHof+$<*N;+`@T;Z{rno1D($1`a`FM17`JJ! ze8+Xr5T%}+h;MwDk=Y!jVCrNZX(rkBWmViq!jXLvETU?HHR=-c3LfVhpulrV|_=R?l#^_ zlkiE+I~zvXc9YS> z3FSk*+=83_f;E+g=Vvpf|Dh>vG$r)vmHlL#;R!xtq-wz89t4n$TX ztE1-3k0m1G3EnL$b;4*e@mvtgUaUp5sE#_}LvfSY&*?3tRTo(+&k(bW$u^O1guu!) zSQ(t+q@_NV0R#@c6&Npf_+pn+h^p>e-KQy(fG6>Td)DSJu=rhe>_OUVf}_z%Un^HV zBc9dx#^cGu7OxT*I)w(3%^eWv%5N*B{hUF7{FNvJpL#yzk^+BL1_7el0&AZ1 z>JR5+?-RMrb|rUlylXQ#l3_%=@T3IWhx*{qN*c#gDR0C;paPdp_~SwP{SNMFl6`Hc z$wtrw;5_@UIcJFQ&UCv^^}dMMc#Bu0dn7f3g_$u%l;M5n+vu@X=9XOCqyB7gh_pXg zPQeQ8_rBIvQ~!yteXcQL^WPd9cTGL2zBF52HOg{xb3s+nE(xMd)ZX3kc(C(b1M$x_ zdly$w3HD}IHbr9y^_OxoH$YJ9?nhzF{=>~F=FV@*Mn7HWM&6RGJ@JY0A>JY0A>JY0A>JY0A>JY0A>JY R0A>JY0A}DnG9U*1@OOtcNL>H` diff --git a/public/castopod-banner-pine_medium.webp b/public/castopod-banner-pine_medium.webp deleted file mode 100644 index 6371a5e52294304955eb43ac60fc06829b461702..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6594 zcmeH|X;f3!7RS%c03?7Um_Wp534RbKL_de2`d;aTwIA`y5e*6CK zKJX*>8Nj(Zxi|p`g1}+f17IoG;mD-hd+lXzCkF+XhJG3tM2Kb*N>KgnSWo4WO4!@Q_BobBBG)Wo+k~)D%SV;mQWico;293rLRFzc;|MP%v z1H2MshrEr1bO8bnA@LA=7ia?jp=GEmw7(4qAv>djq7nwHEZb0r0|*F-M4*r>r3z~`OxrBFGfaRj*U;h zmdwn)nR`3Gu)+laP)L;G3KxXn%7nzD&^l%c>h=spf6iK6^F$?r zLsn6B3r5d^IYm4Y*^SlEr#{~}y@K{D*roR{o|^-rNE!DQK*aC(SLg)2yx7 zJkGpzz!Bvbo!vm!9`<}4+Gm)=>lz--r865FHsd82B-bpU{L4}1D^JD$sd!X)C65* z97=sJ%<;IVTa37G`e#!2r*Fcag+JS!nv~&^_e9Ny6o9Q01z-2RQ*)*I@qpRwJiW7O zMKcvVc1!xP_3i&xvtOtI!(;TFqXT zw$)N9g|zIJ{rTtX+ikjzNhS|Y+-OVt z-r-tWc06>TFd?6NXwx*VY-*(81f7r*+~9)ScrQbdX>PILRa2_vG~zDKIGk~$+OM|y z)Lci~NkRQgCsWmTuruM()<7Gt#a>123lF``6_&kp?&?0ZnRmHH){ zI+^$bWnBCN>mMKNNE|`z=4P0moC+VF5-ml9aAG!|7g}ZQd7iXxRM?W!>U)9lOPKS( zD|_16ZKZ5O7aKJvAwADBi)6mJU9YiHvrQ|sFI3mNO`X$(tl?Icw3@lBITM~OsOV@J zSJ-2$Ev{@b>3w@$JT)XJ`|4;U(b024dwBnNa@j*#n`mUUyMr2S>M^!m;1=Yp%63e z;GQHHOgxOCrj^-7;P$ER{feLd@o!z?6S@|qI03tg^wGPk!Dk_8kbgDU1ELfDT)(zQ z%afu|9(ySmkxpRPp;wVKOv-S(CA^-N3cHqMd(>yF4HW%oD)dc(h4*Kfc0U{s{w4Xf6TbF1o{@vG)CC=D^_mbyT48rPHhk z0@U<}jP>4>4zgPOcQ-G%Z~E?D)w)>`#-RMlWrUC-m%IjY56C?r_ki33e;W^|!F~S* DT!#QO diff --git a/public/castopod-banner-pine_small.webp b/public/castopod-banner-pine_small.webp deleted file mode 100644 index ac43b616ebd2acfa7b1572316e5e7165396bc863..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1627 zcmex=_1P|rX?qqI0P zFI~aY%U!`Mz|~!$%*;qrN1?DZF(6Oj-S5fuR$!pIEN!@|nR z%E~Fi%grl7GWdUhL6C!?fzg4PQHg;`kdaxC@&6G9c?JeXR-jiwzJ&rtCZHSH*f}`4 zxPc0`3NSD+GBY!=FoRqTR9y>{XJ8Rz6;d>GWD^cdWLGK_F>0K+kVDyN<3Z7&iyu^s zlZu)+xx~aJB&Af<)HO7@(s#)lOnKGb1qam<1W^8Gg!jX{=B9W23RCi(wQ)!a(cYtj4(~878n9 zhphTG{hI%w2GeWD&$tS*%}X*$?ls<0Tbo(GDephS^K<#XztkVvwcGNx^M|)5X5O7KgI@nwR@`a`}G-yW;x$i~osqFZX;V z@x))vCp9QkEBZ!Z-1N!{-L>j7#m^dQT8m$o)n|wSzufh|+p1R=2 z`rk%3qR&fv3;jLjeB#?$$vv5gg_54SX{ELu@{ePpcO6?g;{o4S@!N_28Rj*AGFcNf z+v|8Sf3J@2V@}yMrxwp)us^o>>wB^K%v-ZFlrt9R?>kp%clC7bHu;|~?3IHSuj!KX ybA0dGcy?=2AJiYaS8mXiIInEED&z#0#-avFG0#O;5r)878Vi`ZhCb&1e-i*gL_7ch diff --git a/app/Resources/icons/custom/_index.php b/resources/icons/custom/_index.php similarity index 100% rename from app/Resources/icons/custom/_index.php rename to resources/icons/custom/_index.php diff --git a/app/Resources/icons/custom/repeat-off.svg b/resources/icons/custom/repeat-off.svg similarity index 100% rename from app/Resources/icons/custom/repeat-off.svg rename to resources/icons/custom/repeat-off.svg diff --git a/app/Resources/icons/funding/_index.php b/resources/icons/funding/_index.php similarity index 100% rename from app/Resources/icons/funding/_index.php rename to resources/icons/funding/_index.php diff --git a/app/Resources/icons/funding/buymeacoffee.svg b/resources/icons/funding/buymeacoffee.svg similarity index 100% rename from app/Resources/icons/funding/buymeacoffee.svg rename to resources/icons/funding/buymeacoffee.svg diff --git a/app/Resources/icons/funding/default.svg b/resources/icons/funding/default.svg similarity index 100% rename from app/Resources/icons/funding/default.svg rename to resources/icons/funding/default.svg diff --git a/app/Resources/icons/funding/donorbox.svg b/resources/icons/funding/donorbox.svg similarity index 100% rename from app/Resources/icons/funding/donorbox.svg rename to resources/icons/funding/donorbox.svg diff --git a/app/Resources/icons/funding/gofundme.svg b/resources/icons/funding/gofundme.svg similarity index 100% rename from app/Resources/icons/funding/gofundme.svg rename to resources/icons/funding/gofundme.svg diff --git a/app/Resources/icons/funding/helloasso.svg b/resources/icons/funding/helloasso.svg similarity index 100% rename from app/Resources/icons/funding/helloasso.svg rename to resources/icons/funding/helloasso.svg diff --git a/app/Resources/icons/funding/indiegogo.svg b/resources/icons/funding/indiegogo.svg similarity index 100% rename from app/Resources/icons/funding/indiegogo.svg rename to resources/icons/funding/indiegogo.svg diff --git a/app/Resources/icons/funding/kickstarter.svg b/resources/icons/funding/kickstarter.svg similarity index 100% rename from app/Resources/icons/funding/kickstarter.svg rename to resources/icons/funding/kickstarter.svg diff --git a/app/Resources/icons/funding/kisskissbankbank.svg b/resources/icons/funding/kisskissbankbank.svg similarity index 100% rename from app/Resources/icons/funding/kisskissbankbank.svg rename to resources/icons/funding/kisskissbankbank.svg diff --git a/app/Resources/icons/funding/kofi.svg b/resources/icons/funding/kofi.svg similarity index 100% rename from app/Resources/icons/funding/kofi.svg rename to resources/icons/funding/kofi.svg diff --git a/app/Resources/icons/funding/liberapay.svg b/resources/icons/funding/liberapay.svg similarity index 100% rename from app/Resources/icons/funding/liberapay.svg rename to resources/icons/funding/liberapay.svg diff --git a/app/Resources/icons/funding/patreon.svg b/resources/icons/funding/patreon.svg similarity index 100% rename from app/Resources/icons/funding/patreon.svg rename to resources/icons/funding/patreon.svg diff --git a/app/Resources/icons/funding/paypal.svg b/resources/icons/funding/paypal.svg similarity index 100% rename from app/Resources/icons/funding/paypal.svg rename to resources/icons/funding/paypal.svg diff --git a/app/Resources/icons/funding/tipeee.svg b/resources/icons/funding/tipeee.svg similarity index 100% rename from app/Resources/icons/funding/tipeee.svg rename to resources/icons/funding/tipeee.svg diff --git a/app/Resources/icons/funding/ulule.svg b/resources/icons/funding/ulule.svg similarity index 100% rename from app/Resources/icons/funding/ulule.svg rename to resources/icons/funding/ulule.svg diff --git a/app/Resources/icons/podcasting/_index.php b/resources/icons/podcasting/_index.php similarity index 100% rename from app/Resources/icons/podcasting/_index.php rename to resources/icons/podcasting/_index.php diff --git a/app/Resources/icons/podcasting/amazon.svg b/resources/icons/podcasting/amazon.svg similarity index 100% rename from app/Resources/icons/podcasting/amazon.svg rename to resources/icons/podcasting/amazon.svg diff --git a/app/Resources/icons/podcasting/antennapod.svg b/resources/icons/podcasting/antennapod.svg similarity index 100% rename from app/Resources/icons/podcasting/antennapod.svg rename to resources/icons/podcasting/antennapod.svg diff --git a/app/Resources/icons/podcasting/anytime.svg b/resources/icons/podcasting/anytime.svg similarity index 100% rename from app/Resources/icons/podcasting/anytime.svg rename to resources/icons/podcasting/anytime.svg diff --git a/app/Resources/icons/podcasting/apple.svg b/resources/icons/podcasting/apple.svg similarity index 100% rename from app/Resources/icons/podcasting/apple.svg rename to resources/icons/podcasting/apple.svg diff --git a/app/Resources/icons/podcasting/blubrry.svg b/resources/icons/podcasting/blubrry.svg similarity index 100% rename from app/Resources/icons/podcasting/blubrry.svg rename to resources/icons/podcasting/blubrry.svg diff --git a/app/Resources/icons/podcasting/breaker.svg b/resources/icons/podcasting/breaker.svg similarity index 100% rename from app/Resources/icons/podcasting/breaker.svg rename to resources/icons/podcasting/breaker.svg diff --git a/app/Resources/icons/podcasting/breez.svg b/resources/icons/podcasting/breez.svg similarity index 100% rename from app/Resources/icons/podcasting/breez.svg rename to resources/icons/podcasting/breez.svg diff --git a/app/Resources/icons/podcasting/castamatic.svg b/resources/icons/podcasting/castamatic.svg similarity index 100% rename from app/Resources/icons/podcasting/castamatic.svg rename to resources/icons/podcasting/castamatic.svg diff --git a/app/Resources/icons/podcasting/castbox.svg b/resources/icons/podcasting/castbox.svg similarity index 100% rename from app/Resources/icons/podcasting/castbox.svg rename to resources/icons/podcasting/castbox.svg diff --git a/app/Resources/icons/podcasting/castopod.svg b/resources/icons/podcasting/castopod.svg similarity index 100% rename from app/Resources/icons/podcasting/castopod.svg rename to resources/icons/podcasting/castopod.svg diff --git a/app/Resources/icons/podcasting/castro.svg b/resources/icons/podcasting/castro.svg similarity index 100% rename from app/Resources/icons/podcasting/castro.svg rename to resources/icons/podcasting/castro.svg diff --git a/app/Resources/icons/podcasting/deezer.svg b/resources/icons/podcasting/deezer.svg similarity index 100% rename from app/Resources/icons/podcasting/deezer.svg rename to resources/icons/podcasting/deezer.svg diff --git a/app/Resources/icons/podcasting/default.svg b/resources/icons/podcasting/default.svg similarity index 100% rename from app/Resources/icons/podcasting/default.svg rename to resources/icons/podcasting/default.svg diff --git a/app/Resources/icons/podcasting/episodes-fm.svg b/resources/icons/podcasting/episodes-fm.svg similarity index 100% rename from app/Resources/icons/podcasting/episodes-fm.svg rename to resources/icons/podcasting/episodes-fm.svg diff --git a/app/Resources/icons/podcasting/fountain.svg b/resources/icons/podcasting/fountain.svg similarity index 100% rename from app/Resources/icons/podcasting/fountain.svg rename to resources/icons/podcasting/fountain.svg diff --git a/app/Resources/icons/podcasting/fyyd.svg b/resources/icons/podcasting/fyyd.svg similarity index 100% rename from app/Resources/icons/podcasting/fyyd.svg rename to resources/icons/podcasting/fyyd.svg diff --git a/app/Resources/icons/podcasting/google.svg b/resources/icons/podcasting/google.svg similarity index 100% rename from app/Resources/icons/podcasting/google.svg rename to resources/icons/podcasting/google.svg diff --git a/app/Resources/icons/podcasting/gpodder.svg b/resources/icons/podcasting/gpodder.svg similarity index 100% rename from app/Resources/icons/podcasting/gpodder.svg rename to resources/icons/podcasting/gpodder.svg diff --git a/app/Resources/icons/podcasting/ivoox.svg b/resources/icons/podcasting/ivoox.svg similarity index 100% rename from app/Resources/icons/podcasting/ivoox.svg rename to resources/icons/podcasting/ivoox.svg diff --git a/app/Resources/icons/podcasting/listennotes.svg b/resources/icons/podcasting/listennotes.svg similarity index 100% rename from app/Resources/icons/podcasting/listennotes.svg rename to resources/icons/podcasting/listennotes.svg diff --git a/app/Resources/icons/podcasting/overcast.svg b/resources/icons/podcasting/overcast.svg similarity index 100% rename from app/Resources/icons/podcasting/overcast.svg rename to resources/icons/podcasting/overcast.svg diff --git a/app/Resources/icons/podcasting/playerfm.svg b/resources/icons/podcasting/playerfm.svg similarity index 100% rename from app/Resources/icons/podcasting/playerfm.svg rename to resources/icons/podcasting/playerfm.svg diff --git a/app/Resources/icons/podcasting/plink.svg b/resources/icons/podcasting/plink.svg similarity index 100% rename from app/Resources/icons/podcasting/plink.svg rename to resources/icons/podcasting/plink.svg diff --git a/app/Resources/icons/podcasting/pocketcasts.svg b/resources/icons/podcasting/pocketcasts.svg similarity index 100% rename from app/Resources/icons/podcasting/pocketcasts.svg rename to resources/icons/podcasting/pocketcasts.svg diff --git a/app/Resources/icons/podcasting/podbean.svg b/resources/icons/podcasting/podbean.svg similarity index 100% rename from app/Resources/icons/podcasting/podbean.svg rename to resources/icons/podcasting/podbean.svg diff --git a/app/Resources/icons/podcasting/podcastaddict.svg b/resources/icons/podcasting/podcastaddict.svg similarity index 100% rename from app/Resources/icons/podcasting/podcastaddict.svg rename to resources/icons/podcasting/podcastaddict.svg diff --git a/app/Resources/icons/podcasting/podcastguru.svg b/resources/icons/podcasting/podcastguru.svg similarity index 100% rename from app/Resources/icons/podcasting/podcastguru.svg rename to resources/icons/podcasting/podcastguru.svg diff --git a/app/Resources/icons/podcasting/podcastindex.svg b/resources/icons/podcasting/podcastindex.svg similarity index 100% rename from app/Resources/icons/podcasting/podcastindex.svg rename to resources/icons/podcasting/podcastindex.svg diff --git a/app/Resources/icons/podcasting/podchaser.svg b/resources/icons/podcasting/podchaser.svg similarity index 100% rename from app/Resources/icons/podcasting/podchaser.svg rename to resources/icons/podcasting/podchaser.svg diff --git a/app/Resources/icons/podcasting/podcloud.svg b/resources/icons/podcasting/podcloud.svg similarity index 100% rename from app/Resources/icons/podcasting/podcloud.svg rename to resources/icons/podcasting/podcloud.svg diff --git a/app/Resources/icons/podcasting/podfriend.svg b/resources/icons/podcasting/podfriend.svg similarity index 100% rename from app/Resources/icons/podcasting/podfriend.svg rename to resources/icons/podcasting/podfriend.svg diff --git a/app/Resources/icons/podcasting/podinstall.svg b/resources/icons/podcasting/podinstall.svg similarity index 100% rename from app/Resources/icons/podcasting/podinstall.svg rename to resources/icons/podcasting/podinstall.svg diff --git a/app/Resources/icons/podcasting/podlink.svg b/resources/icons/podcasting/podlink.svg similarity index 100% rename from app/Resources/icons/podcasting/podlink.svg rename to resources/icons/podcasting/podlink.svg diff --git a/app/Resources/icons/podcasting/podlp.svg b/resources/icons/podcasting/podlp.svg similarity index 100% rename from app/Resources/icons/podcasting/podlp.svg rename to resources/icons/podcasting/podlp.svg diff --git a/app/Resources/icons/podcasting/podnews.svg b/resources/icons/podcasting/podnews.svg similarity index 100% rename from app/Resources/icons/podcasting/podnews.svg rename to resources/icons/podcasting/podnews.svg diff --git a/app/Resources/icons/podcasting/podtail.svg b/resources/icons/podcasting/podtail.svg similarity index 100% rename from app/Resources/icons/podcasting/podtail.svg rename to resources/icons/podcasting/podtail.svg diff --git a/app/Resources/icons/podcasting/podverse.svg b/resources/icons/podcasting/podverse.svg similarity index 100% rename from app/Resources/icons/podcasting/podverse.svg rename to resources/icons/podcasting/podverse.svg diff --git a/app/Resources/icons/podcasting/radiopublic.svg b/resources/icons/podcasting/radiopublic.svg similarity index 100% rename from app/Resources/icons/podcasting/radiopublic.svg rename to resources/icons/podcasting/radiopublic.svg diff --git a/app/Resources/icons/podcasting/sphinxchat.svg b/resources/icons/podcasting/sphinxchat.svg similarity index 100% rename from app/Resources/icons/podcasting/sphinxchat.svg rename to resources/icons/podcasting/sphinxchat.svg diff --git a/app/Resources/icons/podcasting/spotify.svg b/resources/icons/podcasting/spotify.svg similarity index 100% rename from app/Resources/icons/podcasting/spotify.svg rename to resources/icons/podcasting/spotify.svg diff --git a/app/Resources/icons/podcasting/spreaker.svg b/resources/icons/podcasting/spreaker.svg similarity index 100% rename from app/Resources/icons/podcasting/spreaker.svg rename to resources/icons/podcasting/spreaker.svg diff --git a/app/Resources/icons/podcasting/stitcher.svg b/resources/icons/podcasting/stitcher.svg similarity index 100% rename from app/Resources/icons/podcasting/stitcher.svg rename to resources/icons/podcasting/stitcher.svg diff --git a/app/Resources/icons/podcasting/truefans.svg b/resources/icons/podcasting/truefans.svg similarity index 100% rename from app/Resources/icons/podcasting/truefans.svg rename to resources/icons/podcasting/truefans.svg diff --git a/app/Resources/icons/podcasting/tsacdop.svg b/resources/icons/podcasting/tsacdop.svg similarity index 100% rename from app/Resources/icons/podcasting/tsacdop.svg rename to resources/icons/podcasting/tsacdop.svg diff --git a/app/Resources/icons/podcasting/tunein.svg b/resources/icons/podcasting/tunein.svg similarity index 100% rename from app/Resources/icons/podcasting/tunein.svg rename to resources/icons/podcasting/tunein.svg diff --git a/app/Resources/icons/podcasting/youtube-music.svg b/resources/icons/podcasting/youtube-music.svg similarity index 100% rename from app/Resources/icons/podcasting/youtube-music.svg rename to resources/icons/podcasting/youtube-music.svg diff --git a/app/Resources/icons/social/_index.php b/resources/icons/social/_index.php similarity index 100% rename from app/Resources/icons/social/_index.php rename to resources/icons/social/_index.php diff --git a/app/Resources/icons/social/bluesky.svg b/resources/icons/social/bluesky.svg similarity index 100% rename from app/Resources/icons/social/bluesky.svg rename to resources/icons/social/bluesky.svg diff --git a/app/Resources/icons/social/castopod.svg b/resources/icons/social/castopod.svg similarity index 100% rename from app/Resources/icons/social/castopod.svg rename to resources/icons/social/castopod.svg diff --git a/app/Resources/icons/social/default.svg b/resources/icons/social/default.svg similarity index 100% rename from app/Resources/icons/social/default.svg rename to resources/icons/social/default.svg diff --git a/app/Resources/icons/social/discord.svg b/resources/icons/social/discord.svg similarity index 100% rename from app/Resources/icons/social/discord.svg rename to resources/icons/social/discord.svg diff --git a/app/Resources/icons/social/discourse.svg b/resources/icons/social/discourse.svg similarity index 100% rename from app/Resources/icons/social/discourse.svg rename to resources/icons/social/discourse.svg diff --git a/app/Resources/icons/social/facebook.svg b/resources/icons/social/facebook.svg similarity index 100% rename from app/Resources/icons/social/facebook.svg rename to resources/icons/social/facebook.svg diff --git a/app/Resources/icons/social/funkwhale.svg b/resources/icons/social/funkwhale.svg similarity index 100% rename from app/Resources/icons/social/funkwhale.svg rename to resources/icons/social/funkwhale.svg diff --git a/app/Resources/icons/social/instagram.svg b/resources/icons/social/instagram.svg similarity index 100% rename from app/Resources/icons/social/instagram.svg rename to resources/icons/social/instagram.svg diff --git a/app/Resources/icons/social/linkedin.svg b/resources/icons/social/linkedin.svg similarity index 100% rename from app/Resources/icons/social/linkedin.svg rename to resources/icons/social/linkedin.svg diff --git a/app/Resources/icons/social/mastodon.svg b/resources/icons/social/mastodon.svg similarity index 100% rename from app/Resources/icons/social/mastodon.svg rename to resources/icons/social/mastodon.svg diff --git a/app/Resources/icons/social/matrix.svg b/resources/icons/social/matrix.svg similarity index 100% rename from app/Resources/icons/social/matrix.svg rename to resources/icons/social/matrix.svg diff --git a/app/Resources/icons/social/misskey.svg b/resources/icons/social/misskey.svg similarity index 100% rename from app/Resources/icons/social/misskey.svg rename to resources/icons/social/misskey.svg diff --git a/app/Resources/icons/social/mobilizon.svg b/resources/icons/social/mobilizon.svg similarity index 100% rename from app/Resources/icons/social/mobilizon.svg rename to resources/icons/social/mobilizon.svg diff --git a/app/Resources/icons/social/peertube.svg b/resources/icons/social/peertube.svg similarity index 100% rename from app/Resources/icons/social/peertube.svg rename to resources/icons/social/peertube.svg diff --git a/app/Resources/icons/social/pixelfed.svg b/resources/icons/social/pixelfed.svg similarity index 100% rename from app/Resources/icons/social/pixelfed.svg rename to resources/icons/social/pixelfed.svg diff --git a/app/Resources/icons/social/pleroma.svg b/resources/icons/social/pleroma.svg similarity index 100% rename from app/Resources/icons/social/pleroma.svg rename to resources/icons/social/pleroma.svg diff --git a/app/Resources/icons/social/plume.svg b/resources/icons/social/plume.svg similarity index 100% rename from app/Resources/icons/social/plume.svg rename to resources/icons/social/plume.svg diff --git a/app/Resources/icons/social/reddit.svg b/resources/icons/social/reddit.svg similarity index 100% rename from app/Resources/icons/social/reddit.svg rename to resources/icons/social/reddit.svg diff --git a/app/Resources/icons/social/slack.svg b/resources/icons/social/slack.svg similarity index 100% rename from app/Resources/icons/social/slack.svg rename to resources/icons/social/slack.svg diff --git a/app/Resources/icons/social/telegram.svg b/resources/icons/social/telegram.svg similarity index 100% rename from app/Resources/icons/social/telegram.svg rename to resources/icons/social/telegram.svg diff --git a/app/Resources/icons/social/threads.svg b/resources/icons/social/threads.svg similarity index 100% rename from app/Resources/icons/social/threads.svg rename to resources/icons/social/threads.svg diff --git a/app/Resources/icons/social/tiktok.svg b/resources/icons/social/tiktok.svg similarity index 100% rename from app/Resources/icons/social/tiktok.svg rename to resources/icons/social/tiktok.svg diff --git a/app/Resources/icons/social/twitch.svg b/resources/icons/social/twitch.svg similarity index 100% rename from app/Resources/icons/social/twitch.svg rename to resources/icons/social/twitch.svg diff --git a/app/Resources/icons/social/twitter.svg b/resources/icons/social/twitter.svg similarity index 100% rename from app/Resources/icons/social/twitter.svg rename to resources/icons/social/twitter.svg diff --git a/app/Resources/icons/social/writefreely.svg b/resources/icons/social/writefreely.svg similarity index 100% rename from app/Resources/icons/social/writefreely.svg rename to resources/icons/social/writefreely.svg diff --git a/app/Resources/icons/social/x.svg b/resources/icons/social/x.svg similarity index 100% rename from app/Resources/icons/social/x.svg rename to resources/icons/social/x.svg diff --git a/app/Resources/icons/social/youtube.svg b/resources/icons/social/youtube.svg similarity index 100% rename from app/Resources/icons/social/youtube.svg rename to resources/icons/social/youtube.svg diff --git a/app/Resources/js/modules/Charts.ts b/resources/js/_modules/Charts.ts similarity index 100% rename from app/Resources/js/modules/Charts.ts rename to resources/js/_modules/Charts.ts diff --git a/app/Resources/js/modules/ClientTimezone.ts b/resources/js/_modules/ClientTimezone.ts similarity index 100% rename from app/Resources/js/modules/ClientTimezone.ts rename to resources/js/_modules/ClientTimezone.ts diff --git a/app/Resources/js/modules/Clipboard.ts b/resources/js/_modules/Clipboard.ts similarity index 100% rename from app/Resources/js/modules/Clipboard.ts rename to resources/js/_modules/Clipboard.ts diff --git a/app/Resources/js/modules/DateTimePicker.ts b/resources/js/_modules/DateTimePicker.ts similarity index 100% rename from app/Resources/js/modules/DateTimePicker.ts rename to resources/js/_modules/DateTimePicker.ts diff --git a/app/Resources/js/modules/Dropdown.ts b/resources/js/_modules/Dropdown.ts similarity index 100% rename from app/Resources/js/modules/Dropdown.ts rename to resources/js/_modules/Dropdown.ts diff --git a/app/Resources/js/modules/EpisodesMap.ts b/resources/js/_modules/EpisodesMap.ts similarity index 91% rename from app/Resources/js/modules/EpisodesMap.ts rename to resources/js/_modules/EpisodesMap.ts index 390564f9..bc0b2ed5 100644 --- a/app/Resources/js/modules/EpisodesMap.ts +++ b/resources/js/_modules/EpisodesMap.ts @@ -11,14 +11,11 @@ import { MarkerClusterGroup } from "leaflet.markercluster"; import "leaflet.markercluster/dist/MarkerCluster.css"; import "leaflet.markercluster/dist/MarkerCluster.Default.css"; import "leaflet/dist/leaflet.css"; -import markerIconRetina from "../../images/marker/marker-icon-2x.png"; -import markerIcon from "../../images/marker/marker-icon.png"; -import markerShadow from "../../images/marker/marker-shadow.png"; Marker.prototype.options.icon = icon({ - iconRetinaUrl: markerIconRetina, - iconUrl: markerIcon, - shadowUrl: markerShadow, + iconRetinaUrl: "/assets/images/marker/marker-icon-2x.png", + iconUrl: "/assets/images/marker/marker-icon.png", + shadowUrl: "/assets/images/marker/marker-shadow.png", iconSize: [25, 41], iconAnchor: [12, 41], popupAnchor: [1, -34], diff --git a/app/Resources/js/modules/HotKeys.ts b/resources/js/_modules/HotKeys.ts similarity index 100% rename from app/Resources/js/modules/HotKeys.ts rename to resources/js/_modules/HotKeys.ts diff --git a/app/Resources/js/modules/Modal.ts b/resources/js/_modules/Modal.ts similarity index 100% rename from app/Resources/js/modules/Modal.ts rename to resources/js/_modules/Modal.ts diff --git a/app/Resources/js/modules/MultiSelect.ts b/resources/js/_modules/MultiSelect.ts similarity index 100% rename from app/Resources/js/modules/MultiSelect.ts rename to resources/js/_modules/MultiSelect.ts diff --git a/app/Resources/js/modules/PublishMessageWarning.ts b/resources/js/_modules/PublishMessageWarning.ts similarity index 100% rename from app/Resources/js/modules/PublishMessageWarning.ts rename to resources/js/_modules/PublishMessageWarning.ts diff --git a/app/Resources/js/modules/Select.ts b/resources/js/_modules/Select.ts similarity index 100% rename from app/Resources/js/modules/Select.ts rename to resources/js/_modules/Select.ts diff --git a/app/Resources/js/modules/SidebarToggler.ts b/resources/js/_modules/SidebarToggler.ts similarity index 100% rename from app/Resources/js/modules/SidebarToggler.ts rename to resources/js/_modules/SidebarToggler.ts diff --git a/app/Resources/js/modules/Slugify.ts b/resources/js/_modules/Slugify.ts similarity index 100% rename from app/Resources/js/modules/Slugify.ts rename to resources/js/_modules/Slugify.ts diff --git a/app/Resources/js/modules/ThemePicker.ts b/resources/js/_modules/ThemePicker.ts similarity index 100% rename from app/Resources/js/modules/ThemePicker.ts rename to resources/js/_modules/ThemePicker.ts diff --git a/app/Resources/js/modules/Time.ts b/resources/js/_modules/Time.ts similarity index 100% rename from app/Resources/js/modules/Time.ts rename to resources/js/_modules/Time.ts diff --git a/app/Resources/js/modules/Toggler.ts b/resources/js/_modules/Toggler.ts similarity index 100% rename from app/Resources/js/modules/Toggler.ts rename to resources/js/_modules/Toggler.ts diff --git a/app/Resources/js/modules/Tooltip.ts b/resources/js/_modules/Tooltip.ts similarity index 100% rename from app/Resources/js/modules/Tooltip.ts rename to resources/js/_modules/Tooltip.ts diff --git a/app/Resources/js/modules/ValidateFileSize.ts b/resources/js/_modules/ValidateFileSize.ts similarity index 100% rename from app/Resources/js/modules/ValidateFileSize.ts rename to resources/js/_modules/ValidateFileSize.ts diff --git a/app/Resources/js/modules/VideoClipBuilder.ts b/resources/js/_modules/VideoClipBuilder.ts similarity index 100% rename from app/Resources/js/modules/VideoClipBuilder.ts rename to resources/js/_modules/VideoClipBuilder.ts diff --git a/app/Resources/js/modules/audio-clipper.ts b/resources/js/_modules/audio-clipper.ts similarity index 100% rename from app/Resources/js/modules/audio-clipper.ts rename to resources/js/_modules/audio-clipper.ts diff --git a/app/Resources/js/modules/markdown-preview.ts b/resources/js/_modules/markdown-preview.ts similarity index 100% rename from app/Resources/js/modules/markdown-preview.ts rename to resources/js/_modules/markdown-preview.ts diff --git a/app/Resources/js/modules/markdown-write-preview.ts b/resources/js/_modules/markdown-write-preview.ts similarity index 100% rename from app/Resources/js/modules/markdown-write-preview.ts rename to resources/js/_modules/markdown-write-preview.ts diff --git a/app/Resources/js/modules/permalink-edit.ts b/resources/js/_modules/permalink-edit.ts similarity index 100% rename from app/Resources/js/modules/permalink-edit.ts rename to resources/js/_modules/permalink-edit.ts diff --git a/app/Resources/js/modules/play-episode-button.ts b/resources/js/_modules/play-episode-button.ts similarity index 100% rename from app/Resources/js/modules/play-episode-button.ts rename to resources/js/_modules/play-episode-button.ts diff --git a/app/Resources/js/modules/play-soundbite.ts b/resources/js/_modules/play-soundbite.ts similarity index 100% rename from app/Resources/js/modules/play-soundbite.ts rename to resources/js/_modules/play-soundbite.ts diff --git a/app/Resources/js/modules/video-clip-previewer.ts b/resources/js/_modules/video-clip-previewer.ts similarity index 100% rename from app/Resources/js/modules/video-clip-previewer.ts rename to resources/js/_modules/video-clip-previewer.ts diff --git a/app/Resources/js/modules/xml-editor.ts b/resources/js/_modules/xml-editor.ts similarity index 100% rename from app/Resources/js/modules/xml-editor.ts rename to resources/js/_modules/xml-editor.ts diff --git a/app/Resources/js/admin-audio-player.ts b/resources/js/admin-audio-player.ts similarity index 88% rename from app/Resources/js/admin-audio-player.ts rename to resources/js/admin-audio-player.ts index 994803a7..7fa61b86 100644 --- a/app/Resources/js/admin-audio-player.ts +++ b/resources/js/admin-audio-player.ts @@ -34,7 +34,15 @@ import { } from "@vime/core"; import "@vime/core/themes/default.css"; import "@vime/core/themes/light.css"; -import "./modules/play-episode-button"; +import "./_modules/play-episode-button"; + +// Register Castopod's vm player icons library +const library: HTMLVmIconLibraryElement | null = document.querySelector( + 'vm-icon-library[name="castopod-vm-player-icons"]' +); +if (library) { + library.resolver = (iconName) => `/assets/vm-player-icons/${iconName}.svg`; +} // Vime elements for audio player customElements.define("vm-player", VmPlayer); diff --git a/resources/js/admin.ts b/resources/js/admin.ts new file mode 100644 index 00000000..d3917328 --- /dev/null +++ b/resources/js/admin.ts @@ -0,0 +1,40 @@ +import "@github/markdown-toolbar-element"; +import "@github/relative-time-element"; +import "./_modules/audio-clipper"; +import ClientTimezone from "./_modules/ClientTimezone"; +import Clipboard from "./_modules/Clipboard"; +import DateTimePicker from "./_modules/DateTimePicker"; +import Dropdown from "./_modules/Dropdown"; +import HotKeys from "./_modules/HotKeys"; +import "./_modules/markdown-preview"; +import "./_modules/markdown-write-preview"; +import MultiSelect from "./_modules/MultiSelect"; +import "./_modules/permalink-edit"; +import "./_modules/play-soundbite"; +import PublishMessageWarning from "./_modules/PublishMessageWarning"; +import Select from "./_modules/Select"; +import SidebarToggler from "./_modules/SidebarToggler"; +import Slugify from "./_modules/Slugify"; +import ThemePicker from "./_modules/ThemePicker"; +import Time from "./_modules/Time"; +import Tooltip from "./_modules/Tooltip"; +import ValidateFileSize from "./_modules/ValidateFileSize"; +import "./_modules/video-clip-previewer"; +import VideoClipBuilder from "./_modules/VideoClipBuilder"; +import "./_modules/xml-editor"; + +Dropdown(); +Tooltip(); +Select(); +MultiSelect(); +Slugify(); +SidebarToggler(); +ClientTimezone(); +DateTimePicker(); +Time(); +Clipboard(); +ThemePicker(); +PublishMessageWarning(); +HotKeys(); +ValidateFileSize(); +VideoClipBuilder(); diff --git a/resources/js/app.ts b/resources/js/app.ts new file mode 100644 index 00000000..65bf64d4 --- /dev/null +++ b/resources/js/app.ts @@ -0,0 +1,5 @@ +import Dropdown from "./_modules/Dropdown"; +import Tooltip from "./_modules/Tooltip"; + +Dropdown(); +Tooltip(); diff --git a/app/Resources/js/audio-player.ts b/resources/js/audio-player.ts similarity index 90% rename from app/Resources/js/audio-player.ts rename to resources/js/audio-player.ts index 01e27470..7c15480f 100644 --- a/app/Resources/js/audio-player.ts +++ b/resources/js/audio-player.ts @@ -35,7 +35,7 @@ import { import "@vime/core/themes/default.css"; import "@vime/core/themes/light.css"; import { html, render } from "lit"; -import "./modules/play-episode-button"; +import "./_modules/play-episode-button"; const player = html`
- + @@ -85,6 +86,14 @@ const player = html`
`/assets/vm-player-icons/${iconName}.svg`; +} + // Vime elements for audio player customElements.define("vm-player", VmPlayer); customElements.define("vm-file", VmFile); diff --git a/resources/js/charts.ts b/resources/js/charts.ts new file mode 100644 index 00000000..9b09ccaa --- /dev/null +++ b/resources/js/charts.ts @@ -0,0 +1,3 @@ +import DrawCharts from "./_modules/Charts"; + +DrawCharts(); diff --git a/app/Resources/js/embed.ts b/resources/js/embed.ts similarity index 89% rename from app/Resources/js/embed.ts rename to resources/js/embed.ts index c0da411d..d587cb7b 100644 --- a/app/Resources/js/embed.ts +++ b/resources/js/embed.ts @@ -35,6 +35,14 @@ import { import "@vime/core/themes/default.css"; import "@vime/core/themes/light.css"; +// Register Castopod's vm player icons library +const library: HTMLVmIconLibraryElement | null = document.querySelector( + 'vm-icon-library[name="castopod-vm-player-icons"]' +); +if (library) { + library.resolver = (iconName) => `/assets/vm-player-icons/${iconName}.svg`; +} + // Vime elements for audio player customElements.define("vm-player", VmPlayer); customElements.define("vm-file", VmFile); diff --git a/app/Resources/js/error.ts b/resources/js/error.ts similarity index 100% rename from app/Resources/js/error.ts rename to resources/js/error.ts diff --git a/resources/js/install.ts b/resources/js/install.ts new file mode 100644 index 00000000..5f57a192 --- /dev/null +++ b/resources/js/install.ts @@ -0,0 +1,3 @@ +import Tooltip from "./_modules/Tooltip"; + +Tooltip(); diff --git a/resources/js/map.ts b/resources/js/map.ts new file mode 100644 index 00000000..2f3785e7 --- /dev/null +++ b/resources/js/map.ts @@ -0,0 +1,3 @@ +import DrawEpisodesMaps from "./_modules/EpisodesMap"; + +DrawEpisodesMaps(); diff --git a/resources/js/podcast.ts b/resources/js/podcast.ts new file mode 100644 index 00000000..f16c5618 --- /dev/null +++ b/resources/js/podcast.ts @@ -0,0 +1,10 @@ +import "@github/relative-time-element"; +import SidebarToggler from "./_modules/SidebarToggler"; +import Time from "./_modules/Time"; +import Toggler from "./_modules/Toggler"; +import Tooltip from "./_modules/Tooltip"; + +Time(); +Toggler(); +Tooltip(); +SidebarToggler(); diff --git a/app/Resources/js/typings.d.ts b/resources/js/typings.d.ts similarity index 100% rename from app/Resources/js/typings.d.ts rename to resources/js/typings.d.ts diff --git a/app/Resources/js/vite-env.d.ts b/resources/js/vite-env.d.ts similarity index 100% rename from app/Resources/js/vite-env.d.ts rename to resources/js/vite-env.d.ts diff --git a/app/Resources/fonts/inter-600.woff2 b/resources/static/fonts/inter-600.woff2 similarity index 100% rename from app/Resources/fonts/inter-600.woff2 rename to resources/static/fonts/inter-600.woff2 diff --git a/app/Resources/fonts/inter-regular.woff2 b/resources/static/fonts/inter-regular.woff2 similarity index 100% rename from app/Resources/fonts/inter-regular.woff2 rename to resources/static/fonts/inter-regular.woff2 diff --git a/app/Resources/fonts/kumbh-sans-700.woff2 b/resources/static/fonts/kumbh-sans-700.woff2 similarity index 100% rename from app/Resources/fonts/kumbh-sans-700.woff2 rename to resources/static/fonts/kumbh-sans-700.woff2 diff --git a/app/Resources/fonts/kumbh-sans-regular.woff2 b/resources/static/fonts/kumbh-sans-regular.woff2 similarity index 100% rename from app/Resources/fonts/kumbh-sans-regular.woff2 rename to resources/static/fonts/kumbh-sans-regular.woff2 diff --git a/app/Resources/fonts/noto-sans-mono-regular.woff2 b/resources/static/fonts/noto-sans-mono-regular.woff2 similarity index 100% rename from app/Resources/fonts/noto-sans-mono-regular.woff2 rename to resources/static/fonts/noto-sans-mono-regular.woff2 diff --git a/public/castopod-avatar.jpg b/resources/static/images/castopod-avatar.jpg similarity index 100% rename from public/castopod-avatar.jpg rename to resources/static/images/castopod-avatar.jpg diff --git a/public/castopod-banner-amber.jpg b/resources/static/images/castopod-banner-amber.jpg similarity index 100% rename from public/castopod-banner-amber.jpg rename to resources/static/images/castopod-banner-amber.jpg diff --git a/public/castopod-banner-crimson.jpg b/resources/static/images/castopod-banner-crimson.jpg similarity index 100% rename from public/castopod-banner-crimson.jpg rename to resources/static/images/castopod-banner-crimson.jpg diff --git a/public/castopod-banner-jacaranda.jpg b/resources/static/images/castopod-banner-jacaranda.jpg similarity index 100% rename from public/castopod-banner-jacaranda.jpg rename to resources/static/images/castopod-banner-jacaranda.jpg diff --git a/public/castopod-banner-lake.jpg b/resources/static/images/castopod-banner-lake.jpg similarity index 100% rename from public/castopod-banner-lake.jpg rename to resources/static/images/castopod-banner-lake.jpg diff --git a/public/castopod-banner-onyx.jpg b/resources/static/images/castopod-banner-onyx.jpg similarity index 100% rename from public/castopod-banner-onyx.jpg rename to resources/static/images/castopod-banner-onyx.jpg diff --git a/public/castopod-banner-pine.jpg b/resources/static/images/castopod-banner-pine.jpg similarity index 100% rename from public/castopod-banner-pine.jpg rename to resources/static/images/castopod-banner-pine.jpg diff --git a/resources/static/images/castopod-logo-base.svg b/resources/static/images/castopod-logo-base.svg new file mode 100644 index 00000000..72221cfa --- /dev/null +++ b/resources/static/images/castopod-logo-base.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/resources/static/images/castopod-logo.svg b/resources/static/images/castopod-logo.svg new file mode 100644 index 00000000..55f4b22b --- /dev/null +++ b/resources/static/images/castopod-logo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/resources/static/images/castopod-mascot_confused.svg b/resources/static/images/castopod-mascot_confused.svg new file mode 100644 index 00000000..89d51627 --- /dev/null +++ b/resources/static/images/castopod-mascot_confused.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/app/Resources/images/marker/marker-icon-2x.png b/resources/static/images/marker/marker-icon-2x.png similarity index 100% rename from app/Resources/images/marker/marker-icon-2x.png rename to resources/static/images/marker/marker-icon-2x.png diff --git a/app/Resources/images/marker/marker-icon.png b/resources/static/images/marker/marker-icon.png similarity index 100% rename from app/Resources/images/marker/marker-icon.png rename to resources/static/images/marker/marker-icon.png diff --git a/app/Resources/images/marker/marker-shadow.png b/resources/static/images/marker/marker-shadow.png similarity index 100% rename from app/Resources/images/marker/marker-shadow.png rename to resources/static/images/marker/marker-shadow.png diff --git a/resources/static/vm-player-icons/check.svg b/resources/static/vm-player-icons/check.svg new file mode 100644 index 00000000..bf36197d --- /dev/null +++ b/resources/static/vm-player-icons/check.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/resources/static/vm-player-icons/pause.svg b/resources/static/vm-player-icons/pause.svg new file mode 100644 index 00000000..ea2847b9 --- /dev/null +++ b/resources/static/vm-player-icons/pause.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/resources/static/vm-player-icons/play.svg b/resources/static/vm-player-icons/play.svg new file mode 100644 index 00000000..75ad8b10 --- /dev/null +++ b/resources/static/vm-player-icons/play.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/resources/static/vm-player-icons/settings.svg b/resources/static/vm-player-icons/settings.svg new file mode 100644 index 00000000..a8cd5895 --- /dev/null +++ b/resources/static/vm-player-icons/settings.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/resources/static/vm-player-icons/volume-high.svg b/resources/static/vm-player-icons/volume-high.svg new file mode 100644 index 00000000..f352c50a --- /dev/null +++ b/resources/static/vm-player-icons/volume-high.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/resources/static/vm-player-icons/volume-low.svg b/resources/static/vm-player-icons/volume-low.svg new file mode 100644 index 00000000..999e6126 --- /dev/null +++ b/resources/static/vm-player-icons/volume-low.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/resources/static/vm-player-icons/volume-mute.svg b/resources/static/vm-player-icons/volume-mute.svg new file mode 100644 index 00000000..44f6c50c --- /dev/null +++ b/resources/static/vm-player-icons/volume-mute.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/app/Resources/styles/breadcrumb.css b/resources/styles/_modules/breadcrumb.css similarity index 100% rename from app/Resources/styles/breadcrumb.css rename to resources/styles/_modules/breadcrumb.css diff --git a/app/Resources/styles/choices.css b/resources/styles/_modules/choices.css similarity index 100% rename from app/Resources/styles/choices.css rename to resources/styles/_modules/choices.css diff --git a/app/Resources/styles/colorRadioBtn.css b/resources/styles/_modules/colorRadioBtn.css similarity index 100% rename from app/Resources/styles/colorRadioBtn.css rename to resources/styles/_modules/colorRadioBtn.css diff --git a/app/Resources/styles/colors.css b/resources/styles/_modules/colors.css similarity index 100% rename from app/Resources/styles/colors.css rename to resources/styles/_modules/colors.css diff --git a/app/Resources/styles/custom.css b/resources/styles/_modules/custom.css similarity index 100% rename from app/Resources/styles/custom.css rename to resources/styles/_modules/custom.css diff --git a/app/Resources/styles/dropdown.css b/resources/styles/_modules/dropdown.css similarity index 100% rename from app/Resources/styles/dropdown.css rename to resources/styles/_modules/dropdown.css diff --git a/app/Resources/styles/fonts.css b/resources/styles/_modules/fonts.css similarity index 67% rename from app/Resources/styles/fonts.css rename to resources/styles/_modules/fonts.css index 68695229..f2d9aa00 100644 --- a/app/Resources/styles/fonts.css +++ b/resources/styles/_modules/fonts.css @@ -5,7 +5,7 @@ font-style: normal; font-weight: 400; font-display: swap; - src: url("/fonts/kumbh-sans-regular.woff2") format("woff2"); + src: url("/assets/fonts/kumbh-sans-regular.woff2") format("woff2"); } /* kumbh-sans-700 */ @@ -14,7 +14,7 @@ font-style: normal; font-weight: 700; font-display: swap; - src: url("/fonts/kumbh-sans-700.woff2") format("woff2"); + src: url("/assets/fonts/kumbh-sans-700.woff2") format("woff2"); } /* inter-regular */ @@ -23,7 +23,7 @@ font-style: normal; font-weight: 400; font-display: swap; - src: url("/fonts/inter-regular.woff2") format("woff2"); + src: url("/assets/fonts/inter-regular.woff2") format("woff2"); } /* inter-600 */ @@ -32,7 +32,7 @@ font-style: normal; font-weight: 600; font-display: swap; - src: url("/fonts/inter-600.woff2") format("woff2"); + src: url("/assets/fonts/inter-600.woff2") format("woff2"); } /* noto-sans-mono-regular */ @@ -41,6 +41,6 @@ font-style: normal; font-weight: 400; font-display: swap; - src: url("/fonts/noto-sans-mono-regular.woff2") format("woff2"); + src: url("/assets/fonts/noto-sans-mono-regular.woff2") format("woff2"); } } diff --git a/app/Resources/styles/formInputTabs.css b/resources/styles/_modules/formInputTabs.css similarity index 100% rename from app/Resources/styles/formInputTabs.css rename to resources/styles/_modules/formInputTabs.css diff --git a/app/Resources/styles/inputRange.css b/resources/styles/_modules/inputRange.css similarity index 100% rename from app/Resources/styles/inputRange.css rename to resources/styles/_modules/inputRange.css diff --git a/app/Resources/styles/radioBtn.css b/resources/styles/_modules/radioBtn.css similarity index 100% rename from app/Resources/styles/radioBtn.css rename to resources/styles/_modules/radioBtn.css diff --git a/app/Resources/styles/radioToggler.css b/resources/styles/_modules/radioToggler.css similarity index 100% rename from app/Resources/styles/radioToggler.css rename to resources/styles/_modules/radioToggler.css diff --git a/app/Resources/styles/readMore.css b/resources/styles/_modules/readMore.css similarity index 100% rename from app/Resources/styles/readMore.css rename to resources/styles/_modules/readMore.css diff --git a/app/Resources/styles/seeMore.css b/resources/styles/_modules/seeMore.css similarity index 100% rename from app/Resources/styles/seeMore.css rename to resources/styles/_modules/seeMore.css diff --git a/app/Resources/styles/stickyHeader.css b/resources/styles/_modules/stickyHeader.css similarity index 100% rename from app/Resources/styles/stickyHeader.css rename to resources/styles/_modules/stickyHeader.css diff --git a/app/Resources/styles/switch.css b/resources/styles/_modules/switch.css similarity index 100% rename from app/Resources/styles/switch.css rename to resources/styles/_modules/switch.css diff --git a/app/Resources/styles/tailwind.css b/resources/styles/_modules/tailwind.css similarity index 100% rename from app/Resources/styles/tailwind.css rename to resources/styles/_modules/tailwind.css diff --git a/resources/styles/index.css b/resources/styles/index.css new file mode 100644 index 00000000..1837cd21 --- /dev/null +++ b/resources/styles/index.css @@ -0,0 +1,15 @@ +@import url("./_modules/tailwind.css"); +@import url("./_modules/custom.css"); +@import url("./_modules/fonts.css"); +@import url("./_modules/colors.css"); +@import url("./_modules/breadcrumb.css"); +@import url("./_modules/dropdown.css"); +@import url("./_modules/choices.css"); +@import url("./_modules/radioBtn.css"); +@import url("./_modules/colorRadioBtn.css"); +@import url("./_modules/switch.css"); +@import url("./_modules/radioToggler.css"); +@import url("./_modules/formInputTabs.css"); +@import url("./_modules/stickyHeader.css"); +@import url("./_modules/readMore.css"); +@import url("./_modules/seeMore.css"); diff --git a/tailwind.config.cjs b/tailwind.config.cjs index 717a152c..6c401d7a 100644 --- a/tailwind.config.cjs +++ b/tailwind.config.cjs @@ -8,7 +8,7 @@ module.exports = { "./modules/**/Views/**/*.php", "./themes/**/*.php", "./app/Helpers/*.php", - "./app/Resources/**/*.ts", + "./resources/**/*.ts", ], theme: { extend: { diff --git a/themes/cp_admin/_layout.php b/themes/cp_admin/_layout.php index 783bd9d1..5a3ebb54 100644 --- a/themes/cp_admin/_layout.php +++ b/themes/cp_admin/_layout.php @@ -21,11 +21,11 @@ $isEpisodeArea = isset($podcast) && isset($episode); ' /> asset('styles/index.css', 'css') ?> + ->asset('styles/index.css') ?> asset('js/admin.ts', 'js') ?> + ->asset('js/admin.ts') ?> asset('js/admin-audio-player.ts', 'js') ?> + ->asset('js/admin-audio-player.ts') ?> diff --git a/themes/cp_admin/dashboard.php b/themes/cp_admin/dashboard.php index 2b03d522..27b8e966 100644 --- a/themes/cp_admin/dashboard.php +++ b/themes/cp_admin/dashboard.php @@ -44,5 +44,5 @@ asset('js/charts.ts', 'js') ?> + ->asset('js/charts.ts') ?> endsection() ?> diff --git a/themes/cp_admin/episode/view.php b/themes/cp_admin/episode/view.php index 8579b20e..c637f9e0 100644 --- a/themes/cp_admin/episode/view.php +++ b/themes/cp_admin/episode/view.php @@ -60,5 +60,5 @@ asset('js/charts.ts', 'js') ?> + ->asset('js/charts.ts') ?> endSection() ?> diff --git a/themes/cp_admin/podcast/analytics/index.php b/themes/cp_admin/podcast/analytics/index.php index c625586d..12ac9a4c 100644 --- a/themes/cp_admin/podcast/analytics/index.php +++ b/themes/cp_admin/podcast/analytics/index.php @@ -34,5 +34,5 @@
asset('js/charts.ts', 'js') ?> + ->asset('js/charts.ts') ?> endSection() ?> diff --git a/themes/cp_admin/podcast/analytics/listening_time.php b/themes/cp_admin/podcast/analytics/listening_time.php index 488ad464..3b429701 100644 --- a/themes/cp_admin/podcast/analytics/listening_time.php +++ b/themes/cp_admin/podcast/analytics/listening_time.php @@ -27,5 +27,5 @@
asset('js/charts.ts', 'js') ?> + ->asset('js/charts.ts') ?> endSection() ?> diff --git a/themes/cp_admin/podcast/analytics/locations.php b/themes/cp_admin/podcast/analytics/locations.php index b5544184..4f5493a8 100644 --- a/themes/cp_admin/podcast/analytics/locations.php +++ b/themes/cp_admin/podcast/analytics/locations.php @@ -32,5 +32,5 @@ asset('js/charts.ts', 'js') ?> + ->asset('js/charts.ts') ?> endSection() ?> diff --git a/themes/cp_admin/podcast/analytics/players.php b/themes/cp_admin/podcast/analytics/players.php index f728ca78..ec8fce09 100644 --- a/themes/cp_admin/podcast/analytics/players.php +++ b/themes/cp_admin/podcast/analytics/players.php @@ -44,5 +44,5 @@ asset('js/charts.ts', 'js') ?> + ->asset('js/charts.ts') ?> endSection() ?> diff --git a/themes/cp_admin/podcast/analytics/time_periods.php b/themes/cp_admin/podcast/analytics/time_periods.php index bd656741..6d8a1e45 100644 --- a/themes/cp_admin/podcast/analytics/time_periods.php +++ b/themes/cp_admin/podcast/analytics/time_periods.php @@ -25,5 +25,5 @@ asset('js/charts.ts', 'js') ?> + ->asset('js/charts.ts') ?> endSection() ?> diff --git a/themes/cp_admin/podcast/analytics/unique_listeners.php b/themes/cp_admin/podcast/analytics/unique_listeners.php index 29b40cab..6cc31aeb 100644 --- a/themes/cp_admin/podcast/analytics/unique_listeners.php +++ b/themes/cp_admin/podcast/analytics/unique_listeners.php @@ -27,5 +27,5 @@ asset('js/charts.ts', 'js') ?> + ->asset('js/charts.ts') ?> endSection() ?> diff --git a/themes/cp_admin/podcast/analytics/webpages.php b/themes/cp_admin/podcast/analytics/webpages.php index 82acfd5c..a2379079 100644 --- a/themes/cp_admin/podcast/analytics/webpages.php +++ b/themes/cp_admin/podcast/analytics/webpages.php @@ -38,5 +38,5 @@ asset('js/charts.ts', 'js') ?> + ->asset('js/charts.ts') ?> endSection() ?> diff --git a/themes/cp_app/embed.php b/themes/cp_app/embed.php index 31ad1557..40b448af 100644 --- a/themes/cp_app/embed.php +++ b/themes/cp_app/embed.php @@ -13,9 +13,9 @@ ' /> asset('styles/index.css', 'css') ?> + ->asset('styles/index.css') ?> asset('js/embed.ts', 'js') ?> + ->asset('js/embed.ts') ?> " language="getLocale() ?>" class="w-full mt-auto" + icons="castopod-vm-player-icons" style="--vm-player-box-shadow:0; --vm-player-theme: hsl(var(--color-accent-base)); --vm-control-focus-color: hsl(var(--color-accent-contrast)); --vm-control-spacing: 4px; --vm-menu-item-focus-bg: hsl(var(--color-background-highlight)); --vm-control-icon-size: 24px; " > @@ -54,7 +55,7 @@ - + diff --git a/themes/cp_app/episode/_layout-preview.php b/themes/cp_app/episode/_layout-preview.php index 48676f24..d4661aa1 100644 --- a/themes/cp_app/episode/_layout-preview.php +++ b/themes/cp_app/episode/_layout-preview.php @@ -28,13 +28,13 @@ ' /> asset('styles/index.css', 'css') ?> + ->asset('styles/index.css') ?> asset('js/app.ts', 'js') ?> + ->asset('js/app.ts') ?> asset('js/podcast.ts', 'js') ?> + ->asset('js/podcast.ts') ?> asset('js/audio-player.ts', 'js') ?> + ->asset('js/audio-player.ts') ?> ' /> asset('styles/index.css', 'css') ?> + ->asset('styles/index.css') ?> asset('js/app.ts', 'js') ?> + ->asset('js/app.ts') ?> diff --git a/themes/cp_app/pages/_layout.php b/themes/cp_app/pages/_layout.php index ed496c03..d2dbff4e 100644 --- a/themes/cp_app/pages/_layout.php +++ b/themes/cp_app/pages/_layout.php @@ -24,11 +24,11 @@ ' /> asset('styles/index.css', 'css') ?> + ->asset('styles/index.css') ?> asset('js/app.ts', 'js') ?> + ->asset('js/app.ts') ?> asset('js/audio-player.ts', 'js') ?> + ->asset('js/audio-player.ts') ?> ' /> asset('styles/index.css', 'css') ?> + ->asset('styles/index.css') ?> asset('js/app.ts', 'js') ?> + ->asset('js/app.ts') ?> asset('js/podcast.ts', 'js') ?> + ->asset('js/podcast.ts') ?> asset('js/audio-player.ts', 'js') ?> + ->asset('js/audio-player.ts') ?> ' /> asset('styles/index.css', 'css') ?> + ->asset('styles/index.css') ?> asset('js/app.ts', 'js') ?> + ->asset('js/app.ts') ?> asset('js/podcast.ts', 'js') ?> + ->asset('js/podcast.ts') ?> ' /> asset('styles/index.css', 'css') ?> + ->asset('styles/index.css') ?> asset('js/podcast.ts', 'js') ?> + ->asset('js/podcast.ts') ?> asset('styles/index.css', 'css') ?> + ->asset('styles/index.css') ?> diff --git a/themes/cp_install/_layout.php b/themes/cp_install/_layout.php index 7e15d0d9..2bc42bfb 100644 --- a/themes/cp_install/_layout.php +++ b/themes/cp_install/_layout.php @@ -12,9 +12,9 @@ asset('styles/index.css', 'css') ?> + ->asset('styles/index.css') ?> asset('js/install.ts', 'js') ?> + ->asset('js/install.ts') ?> diff --git a/tsconfig.json b/tsconfig.json index b56093e0..1929331b 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -19,8 +19,8 @@ /* Module Resolution Options */ "moduleResolution": "node", - "baseUrl": "app/Resources/js" /* Base directory to resolve non-absolute module names. */ + "baseUrl": "resources/js" /* Base directory to resolve non-absolute module names. */ }, - "include": ["app/Resources/js/**/*.ts"], + "include": ["resources/js/**/*.ts"], "exclude": [] } diff --git a/vite.config.ts b/vite.config.ts index e7dc9856..e5af5de4 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -1,38 +1,40 @@ +import path from "path"; import { defineConfig } from "vite"; +import codeigniter from "vite-plugin-codeigniter"; import { VitePWA } from "vite-plugin-pwa"; // https://vitejs.dev/config/ export default defineConfig({ - root: "./app/Resources", - base: "/assets/", - build: { - outDir: "../../public/assets", - assetsDir: "", - manifest: true, - sourcemap: true, - rollupOptions: { - input: { - "admin-audio-player.ts": "app/Resources/js/admin-audio-player.ts", - "admin.ts": "app/Resources/js/admin.ts", - "app.ts": "app/Resources/js/app.ts", - "audio-player.ts": "app/Resources/js/audio-player.ts", - "charts.ts": "app/Resources/js/charts.ts", - "embed.ts": "app/Resources/js/embed.ts", - "error.ts": "app/Resources/js/error.ts", - "install.ts": "app/Resources/js/install.ts", - "map.ts": "app/Resources/js/map.ts", - "podcast.ts": "app/Resources/js/podcast.ts", - "styles/index.css": "app/Resources/styles/index.css", - }, - }, - }, - plugins: [ - VitePWA({ - manifest: false, - outDir: "../../public", - }), - ], server: { host: true, + port: 5173, + strictPort: true, }, + plugins: [ + codeigniter({ + imageVariants: [ + { + src: "images/castopod-banner-*.jpg", + sizes: { + "%NAME%_small.webp": 320, + "%NAME%_medium.webp": 960, + "%NAME%_federation.jpg": 1500, + }, + }, + { + src: "images/castopod-avatar.jpg", + sizes: { + "%NAME%_tiny.webp": 40, + "%NAME%_thumbnail.webp": 150, + "%NAME%_medium.webp": 320, + "%NAME%_federation.jpg": 400, + }, + }, + ], + }), + VitePWA({ + manifest: false, + outDir: path.resolve(__dirname, "public/assets"), + }), + ], });