feat(plugins): add html field type + CodeEditor component + rework html head generation

update php and js packages to latest
This commit is contained in:
Yassine Doghri 2024-12-17 15:06:08 +00:00
commit 8cf9c6dc83
227 changed files with 2991 additions and 2988 deletions

View file

@ -37,7 +37,7 @@ if (! function_exists('view')) {
$renderer = single_service('renderer', $path); $renderer = single_service('renderer', $path);
$saveData = config('View') $saveData = config('View')
->saveData; ->saveData;
if (array_key_exists('saveData', $options)) { if (array_key_exists('saveData', $options)) {
$saveData = (bool) $options['saveData']; $saveData = (bool) $options['saveData'];

View file

@ -67,7 +67,7 @@ class Filters extends BaseConfig
/** /**
* List of filter aliases that are always applied before and after every request. * List of filter aliases that are always applied before and after every request.
* *
* @var array<string, array<string, array<string, string|array<string>>>>>|array<string, list<string>> * @var array<string, array<string, array<string, string|array<string>>>>|array<string, list<string>>
*/ */
public array $globals = [ public array $globals = [
'before' => [ 'before' => [

View file

@ -25,7 +25,7 @@ class Generators extends BaseConfig
* *
* YOU HAVE BEEN WARNED! * YOU HAVE BEEN WARNED!
* *
* @var array<string, string> * @var array<string, string|array<string,string>>
*/ */
public array $views = [ public array $views = [
'make:cell' => [ 'make:cell' => [

View file

@ -5,6 +5,7 @@ declare(strict_types=1);
namespace Config; namespace Config;
use App\Libraries\Breadcrumb; use App\Libraries\Breadcrumb;
use App\Libraries\HtmlHead;
use App\Libraries\Negotiate; use App\Libraries\Negotiate;
use App\Libraries\Router; use App\Libraries\Router;
use CodeIgniter\Config\BaseService; use CodeIgniter\Config\BaseService;
@ -66,4 +67,13 @@ class Services extends BaseService
return new Breadcrumb(); return new Breadcrumb();
} }
public static function html_head(bool $getShared = true): HtmlHead
{
if ($getShared) {
return self::getSharedInstance('html_head');
}
return new HtmlHead();
}
} }

View file

@ -4,7 +4,6 @@ declare(strict_types=1);
namespace Config; namespace Config;
use App\Views\Decorators\SiteHead;
use CodeIgniter\Config\View as BaseView; use CodeIgniter\Config\View as BaseView;
use CodeIgniter\View\ViewDecoratorInterface; use CodeIgniter\View\ViewDecoratorInterface;
use ViewComponents\Decorator; use ViewComponents\Decorator;
@ -54,5 +53,5 @@ class View extends BaseView
* *
* @var list<class-string<ViewDecoratorInterface>> * @var list<class-string<ViewDecoratorInterface>>
*/ */
public array $decorators = [Decorator::class, SiteHead::class]; public array $decorators = [Decorator::class];
} }

View file

@ -31,10 +31,10 @@ class ActorController extends FediverseActorController
} }
helper(['form', 'components', 'svg']); helper(['form', 'components', 'svg']);
// @phpstan-ignore-next-line
set_follow_metatags($this->actor);
$data = [ $data = [
// @phpstan-ignore-next-line 'actor' => $this->actor,
'metatags' => get_follow_metatags($this->actor),
'actor' => $this->actor,
]; ];
return view('podcast/follow', $data); return view('podcast/follow', $data);

View file

@ -164,10 +164,10 @@ class CreditsController extends BaseController
} }
} }
set_page_metatags($page);
$data = [ $data = [
'metatags' => get_page_metatags($page), 'page' => $page,
'page' => $page, 'credits' => $credits,
'credits' => $credits,
]; ];
$found = view('pages/credits', $data); $found = view('pages/credits', $data);

View file

@ -96,12 +96,12 @@ class EpisodeCommentController extends BaseController
); );
if (! ($cachedView = cache($cacheName))) { if (! ($cachedView = cache($cacheName))) {
set_episode_comment_metatags($this->comment);
$data = [ $data = [
'metatags' => get_episode_comment_metatags($this->comment), 'podcast' => $this->podcast,
'podcast' => $this->podcast, 'actor' => $this->actor,
'actor' => $this->actor, 'episode' => $this->episode,
'episode' => $this->episode, 'comment' => $this->comment,
'comment' => $this->comment,
]; ];
// if user is logged in then send to the authenticated activity view // if user is logged in then send to the authenticated activity view

View file

@ -86,10 +86,10 @@ class EpisodeController extends BaseController
); );
if (! ($cachedView = cache($cacheName))) { if (! ($cachedView = cache($cacheName))) {
set_episode_metatags($this->episode);
$data = [ $data = [
'metatags' => get_episode_metatags($this->episode), 'podcast' => $this->podcast,
'podcast' => $this->podcast, 'episode' => $this->episode,
'episode' => $this->episode,
]; ];
$secondsToNextUnpublishedEpisode = (new EpisodeModel())->getSecondsToNextUnpublishedEpisode( $secondsToNextUnpublishedEpisode = (new EpisodeModel())->getSecondsToNextUnpublishedEpisode(
@ -135,10 +135,10 @@ class EpisodeController extends BaseController
); );
if (! ($cachedView = cache($cacheName))) { if (! ($cachedView = cache($cacheName))) {
set_episode_metatags($this->episode);
$data = [ $data = [
'metatags' => get_episode_metatags($this->episode), 'podcast' => $this->podcast,
'podcast' => $this->podcast, 'episode' => $this->episode,
'episode' => $this->episode,
]; ];
$secondsToNextUnpublishedEpisode = (new EpisodeModel())->getSecondsToNextUnpublishedEpisode( $secondsToNextUnpublishedEpisode = (new EpisodeModel())->getSecondsToNextUnpublishedEpisode(
@ -184,13 +184,13 @@ class EpisodeController extends BaseController
); );
if (! ($cachedView = cache($cacheName))) { if (! ($cachedView = cache($cacheName))) {
// get chapters from json file set_episode_metatags($this->episode);
$data = [ $data = [
'metatags' => get_episode_metatags($this->episode), 'podcast' => $this->podcast,
'podcast' => $this->podcast, 'episode' => $this->episode,
'episode' => $this->episode,
]; ];
// get chapters from json file
if (isset($this->episode->chapters->file_key)) { if (isset($this->episode->chapters->file_key)) {
/** @var FileManagerInterface $fileManager */ /** @var FileManagerInterface $fileManager */
$fileManager = service('file_manager'); $fileManager = service('file_manager');
@ -243,13 +243,13 @@ class EpisodeController extends BaseController
); );
if (! ($cachedView = cache($cacheName))) { if (! ($cachedView = cache($cacheName))) {
// get transcript from json file set_episode_metatags($this->episode);
$data = [ $data = [
'metatags' => get_episode_metatags($this->episode), 'podcast' => $this->podcast,
'podcast' => $this->podcast, 'episode' => $this->episode,
'episode' => $this->episode,
]; ];
// get transcript from json file
if ($this->episode->transcript !== null) { if ($this->episode->transcript !== null) {
$data['transcript'] = $this->episode->transcript; $data['transcript'] = $this->episode->transcript;

View file

@ -32,9 +32,9 @@ class HomeController extends BaseController
return redirect()->route('podcast-activity', [$allPodcasts[0]->handle]); return redirect()->route('podcast-activity', [$allPodcasts[0]->handle]);
} }
set_home_metatags();
// default behavior: list all podcasts on home page // default behavior: list all podcasts on home page
$data = [ $data = [
'metatags' => get_home_metatags(),
'podcasts' => $allPodcasts, 'podcasts' => $allPodcasts,
'sortBy' => $sortBy, 'sortBy' => $sortBy,
]; ];

View file

@ -49,9 +49,9 @@ class PageController extends BaseController
); );
if (! ($found = cache($cacheName))) { if (! ($found = cache($cacheName))) {
set_page_metatags($this->page);
$data = [ $data = [
'metatags' => get_page_metatags($this->page), 'page' => $this->page,
'page' => $this->page,
]; ];
$found = view('pages/page', $data); $found = view('pages/page', $data);

View file

@ -78,10 +78,10 @@ class PodcastController extends BaseController
); );
if (! ($cachedView = cache($cacheName))) { if (! ($cachedView = cache($cacheName))) {
set_podcast_metatags($this->podcast, 'activity');
$data = [ $data = [
'metatags' => get_podcast_metatags($this->podcast, 'activity'), 'podcast' => $this->podcast,
'podcast' => $this->podcast, 'posts' => (new PostModel())->getActorPublishedPosts($this->podcast->actor_id),
'posts' => (new PostModel())->getActorPublishedPosts($this->podcast->actor_id),
]; ];
// if user is logged in then send to the authenticated activity view // if user is logged in then send to the authenticated activity view
@ -128,10 +128,10 @@ class PodcastController extends BaseController
if (! ($cachedView = cache($cacheName))) { if (! ($cachedView = cache($cacheName))) {
$stats = (new EpisodeModel())->getPodcastStats($this->podcast->id); $stats = (new EpisodeModel())->getPodcastStats($this->podcast->id);
set_podcast_metatags($this->podcast, 'about');
$data = [ $data = [
'metatags' => get_podcast_metatags($this->podcast, 'about'), 'podcast' => $this->podcast,
'podcast' => $this->podcast, 'stats' => $stats,
'stats' => $stats,
]; ];
// // if user is logged in then send to the authenticated activity view // // if user is logged in then send to the authenticated activity view
@ -245,8 +245,8 @@ class PodcastController extends BaseController
]; ];
} }
set_podcast_metatags($this->podcast, 'episodes');
$data = [ $data = [
'metatags' => get_podcast_metatags($this->podcast, 'episodes'),
'podcast' => $this->podcast, 'podcast' => $this->podcast,
'episodesNav' => $episodesNavigation, 'episodesNav' => $episodesNavigation,
'activeQuery' => $activeQuery, 'activeQuery' => $activeQuery,
@ -315,9 +315,9 @@ class PodcastController extends BaseController
public function links(): string public function links(): string
{ {
set_podcast_metatags($this->podcast, 'links');
return view('podcast/links', [ return view('podcast/links', [
'metatags' => get_podcast_metatags($this->podcast, 'links'), 'podcast' => $this->podcast,
'podcast' => $this->podcast,
]); ]);
} }
} }

View file

@ -45,6 +45,7 @@ class PostController extends FediversePostController
#[Override] #[Override]
public function _remap(string $method, string ...$params): mixed public function _remap(string $method, string ...$params): mixed
{ {
if ( if (
! ($podcast = (new PodcastModel())->getPodcastByHandle($params[0])) instanceof Podcast ! ($podcast = (new PodcastModel())->getPodcastByHandle($params[0])) instanceof Podcast
) { ) {
@ -54,16 +55,21 @@ class PostController extends FediversePostController
$this->podcast = $podcast; $this->podcast = $podcast;
$this->actor = $this->podcast->actor; $this->actor = $this->podcast->actor;
if ( if (count($params) <= 1) {
count($params) > 1 && throw PageNotFoundException::forPageNotFound();
($post = (new PostModel())->getPostById($params[1])) instanceof CastopodPost
) {
$this->post = $post;
unset($params[0]);
unset($params[1]);
} }
if (
! ($post = (new PostModel())->getPostById($params[1])) instanceof CastopodPost
) {
throw PageNotFoundException::forPageNotFound();
}
$this->post = $post;
unset($params[0]);
unset($params[1]);
return $this->{$method}(...$params); return $this->{$method}(...$params);
} }
@ -74,10 +80,6 @@ class PostController extends FediversePostController
$this->registerPodcastWebpageHit($this->podcast->id); $this->registerPodcastWebpageHit($this->podcast->id);
} }
if (! $this->post instanceof CastopodPost) {
throw PageNotFoundException::forPageNotFound();
}
$cacheName = implode( $cacheName = implode(
'_', '_',
array_filter([ array_filter([
@ -91,10 +93,10 @@ class PostController extends FediversePostController
); );
if (! ($cachedView = cache($cacheName))) { if (! ($cachedView = cache($cacheName))) {
set_post_metatags($this->post);
$data = [ $data = [
'metatags' => get_post_metatags($this->post), 'post' => $this->post,
'post' => $this->post, 'podcast' => $this->podcast,
'podcast' => $this->podcast,
]; ];
// if user is logged in then send to the authenticated activity view // if user is logged in then send to the authenticated activity view
@ -254,12 +256,12 @@ class PostController extends FediversePostController
$this->registerPodcastWebpageHit($this->podcast->id); $this->registerPodcastWebpageHit($this->podcast->id);
} }
set_remote_actions_metatags($this->post, $action);
$data = [ $data = [
'metatags' => get_remote_actions_metatags($this->post, $action), 'podcast' => $this->podcast,
'podcast' => $this->podcast, 'actor' => $this->actor,
'actor' => $this->actor, 'post' => $this->post,
'post' => $this->post, 'action' => $action,
'action' => $action,
]; ];
helper('form'); helper('form');

View file

@ -36,7 +36,7 @@ use Modules\Media\Models\MediaModel;
* @property string $type * @property string $type
* @property int|null $media_id * @property int|null $media_id
* @property Video|Audio|null $media * @property Video|Audio|null $media
* @property array|null $metadata * @property array<mixed>|null $metadata
* @property string $status * @property string $status
* @property string $logs * @property string $logs
* @property User $user * @property User $user
@ -136,7 +136,7 @@ class BaseClip extends Entity
$media = new Audio([ $media = new Audio([
'file_key' => $fileKey, 'file_key' => $fileKey,
'language_code' => $this->getPodcast() 'language_code' => $this->getPodcast()
->language_code, ->language_code,
'uploaded_by' => $this->attributes['updated_by'], 'uploaded_by' => $this->attributes['updated_by'],
'updated_by' => $this->attributes['updated_by'], 'updated_by' => $this->attributes['updated_by'],
]); ]);

View file

@ -16,7 +16,7 @@ use Modules\Media\Models\MediaModel;
use Override; use Override;
/** /**
* @property array $theme * @property array{name:string,preview:string} $theme
* @property string $format * @property string $format
*/ */
class VideoClip extends BaseClip class VideoClip extends BaseClip
@ -37,7 +37,7 @@ class VideoClip extends BaseClip
} }
/** /**
* @param array<string, string> $theme * @param array{name:string,preview:string} $theme
*/ */
public function setTheme(array $theme): self public function setTheme(array $theme): self
{ {
@ -75,7 +75,7 @@ class VideoClip extends BaseClip
$video = new Video([ $video = new Video([
'file_key' => $fileKey, 'file_key' => $fileKey,
'language_code' => $this->getPodcast() 'language_code' => $this->getPodcast()
->language_code, ->language_code,
'uploaded_by' => $this->attributes['created_by'], 'uploaded_by' => $this->attributes['created_by'],
'updated_by' => $this->attributes['created_by'], 'updated_by' => $this->attributes['created_by'],
]); ]);

View file

@ -191,10 +191,10 @@ class Episode extends Entity
$this->audio_url = url_to( $this->audio_url = url_to(
'episode-audio', 'episode-audio',
$this->getPodcast() $this->getPodcast()
->handle, ->handle,
$this->slug, $this->slug,
$this->getAudio() $this->getAudio()
->file_extension ->file_extension
); );
$this->audio_opengraph_url = $this->audio_url . '?_from=-+Open+Graph+-'; $this->audio_opengraph_url = $this->audio_url . '?_from=-+Open+Graph+-';
@ -219,7 +219,7 @@ class Episode extends Entity
$cover = new Image([ $cover = new Image([
'file_key' => 'podcasts/' . $this->getPodcast()->handle . '/' . $this->attributes['slug'] . '.' . $file->getExtension(), 'file_key' => 'podcasts/' . $this->getPodcast()->handle . '/' . $this->attributes['slug'] . '.' . $file->getExtension(),
'sizes' => config('Images') 'sizes' => config('Images')
->podcastCoverSizes, ->podcastCoverSizes,
'uploaded_by' => $this->attributes['updated_by'], 'uploaded_by' => $this->attributes['updated_by'],
'updated_by' => $this->attributes['updated_by'], 'updated_by' => $this->attributes['updated_by'],
]); ]);
@ -302,7 +302,7 @@ class Episode extends Entity
$transcript = new Transcript([ $transcript = new Transcript([
'file_key' => 'podcasts/' . $this->getPodcast()->handle . '/' . $this->attributes['slug'] . '-transcript.' . $file->getExtension(), 'file_key' => 'podcasts/' . $this->getPodcast()->handle . '/' . $this->attributes['slug'] . '-transcript.' . $file->getExtension(),
'language_code' => $this->getPodcast() 'language_code' => $this->getPodcast()
->language_code, ->language_code,
'uploaded_by' => $this->attributes['updated_by'], 'uploaded_by' => $this->attributes['updated_by'],
'updated_by' => $this->attributes['updated_by'], 'updated_by' => $this->attributes['updated_by'],
]); ]);
@ -339,7 +339,7 @@ class Episode extends Entity
$chapters = new Chapters([ $chapters = new Chapters([
'file_key' => 'podcasts/' . $this->getPodcast()->handle . '/' . $this->attributes['slug'] . '-chapters' . '.' . $file->getExtension(), 'file_key' => 'podcasts/' . $this->getPodcast()->handle . '/' . $this->attributes['slug'] . '-chapters' . '.' . $file->getExtension(),
'language_code' => $this->getPodcast() 'language_code' => $this->getPodcast()
->language_code, ->language_code,
'uploaded_by' => $this->attributes['updated_by'], 'uploaded_by' => $this->attributes['updated_by'],
'updated_by' => $this->attributes['updated_by'], 'updated_by' => $this->attributes['updated_by'],
]); ]);

View file

@ -72,7 +72,7 @@ class Person extends Entity
$avatar = new Image([ $avatar = new Image([
'file_key' => 'persons/' . $this->attributes['unique_name'] . '.' . $file->getExtension(), 'file_key' => 'persons/' . $this->attributes['unique_name'] . '.' . $file->getExtension(),
'sizes' => config('Images') 'sizes' => config('Images')
->personAvatarSizes, ->personAvatarSizes,
'uploaded_by' => $this->attributes['updated_by'], 'uploaded_by' => $this->attributes['updated_by'],
'updated_by' => $this->attributes['updated_by'], 'updated_by' => $this->attributes['updated_by'],
]); ]);

View file

@ -231,7 +231,7 @@ class Podcast extends Entity
$cover = new Image([ $cover = new Image([
'file_key' => 'podcasts/' . $this->attributes['handle'] . '/cover.' . $file->getExtension(), 'file_key' => 'podcasts/' . $this->attributes['handle'] . '/cover.' . $file->getExtension(),
'sizes' => config('Images') 'sizes' => config('Images')
->podcastCoverSizes, ->podcastCoverSizes,
'uploaded_by' => $this->attributes['updated_by'], 'uploaded_by' => $this->attributes['updated_by'],
'updated_by' => $this->attributes['updated_by'], 'updated_by' => $this->attributes['updated_by'],
]); ]);
@ -274,7 +274,7 @@ class Podcast extends Entity
$banner = new Image([ $banner = new Image([
'file_key' => 'podcasts/' . $this->attributes['handle'] . '/banner.' . $file->getExtension(), 'file_key' => 'podcasts/' . $this->attributes['handle'] . '/banner.' . $file->getExtension(),
'sizes' => config('Images') 'sizes' => config('Images')
->podcastBannerSizes, ->podcastBannerSizes,
'uploaded_by' => $this->attributes['updated_by'], 'uploaded_by' => $this->attributes['updated_by'],
'updated_by' => $this->attributes['updated_by'], 'updated_by' => $this->attributes['updated_by'],
]); ]);

View file

@ -105,7 +105,7 @@ if (! function_exists('publication_pill')) {
$label = lang('Episode.publication_status.' . $publicationStatus); $label = lang('Episode.publication_status.' . $publicationStatus);
// @icon('error-warning-fill') // @icon("error-warning-fill")
return '<x-Pill ' . ($title === '' ? '' : 'title="' . $title . '"') . ' variant="' . $variant . '" class="' . $customClass . return '<x-Pill ' . ($title === '' ? '' : 'title="' . $title . '"') . ' variant="' . $variant . '" class="' . $customClass .
'">' . $label . ($publicationStatus === 'with_podcast' ? icon('error-warning-fill', [ '">' . $label . ($publicationStatus === 'with_podcast' ? icon('error-warning-fill', [
'class' => 'flex-shrink-0 ml-1 text-lg', 'class' => 'flex-shrink-0 ml-1 text-lg',
@ -129,20 +129,20 @@ if (! function_exists('publication_button')) {
$label = lang('Episode.publish'); $label = lang('Episode.publish');
$route = route_to('episode-publish', $podcastId, $episodeId); $route = route_to('episode-publish', $podcastId, $episodeId);
$variant = 'primary'; $variant = 'primary';
$iconLeft = 'upload-cloud-fill'; // @icon('upload-cloud-fill') $iconLeft = 'upload-cloud-fill'; // @icon("upload-cloud-fill")
break; break;
case 'with_podcast': case 'with_podcast':
case 'scheduled': case 'scheduled':
$label = lang('Episode.publish_edit'); $label = lang('Episode.publish_edit');
$route = route_to('episode-publish_edit', $podcastId, $episodeId); $route = route_to('episode-publish_edit', $podcastId, $episodeId);
$variant = 'warning'; $variant = 'warning';
$iconLeft = 'upload-cloud-fill'; // @icon('upload-cloud-fill') $iconLeft = 'upload-cloud-fill'; // @icon("upload-cloud-fill")
break; break;
case 'published': case 'published':
$label = lang('Episode.unpublish'); $label = lang('Episode.unpublish');
$route = route_to('episode-unpublish', $podcastId, $episodeId); $route = route_to('episode-unpublish', $podcastId, $episodeId);
$variant = 'danger'; $variant = 'danger';
$iconLeft = 'cloud-off-fill'; // @icon('cloud-off-fill') $iconLeft = 'cloud-off-fill'; // @icon("cloud-off-fill")
break; break;
default: default:
$label = ''; $label = '';

View file

@ -210,7 +210,7 @@ if (! function_exists('get_podcast_banner')) {
)->podcastBannerDefaultPaths['default']; )->podcastBannerDefaultPaths['default'];
$sizes = config('Images') $sizes = config('Images')
->podcastBannerSizes; ->podcastBannerSizes;
$sizeConfig = $sizes[$size]; $sizeConfig = $sizes[$size];
helper('filesystem'); helper('filesystem');
@ -231,7 +231,7 @@ if (! function_exists('get_podcast_banner_mimetype')) {
{ {
if (! $podcast->banner instanceof Image) { if (! $podcast->banner instanceof Image) {
$sizes = config('Images') $sizes = config('Images')
->podcastBannerSizes; ->podcastBannerSizes;
$sizeConfig = $sizes[$size]; $sizeConfig = $sizes[$size];
helper('filesystem'); helper('filesystem');
@ -252,10 +252,10 @@ if (! function_exists('get_avatar_url')) {
{ {
if (! $person->avatar instanceof Image) { if (! $person->avatar instanceof Image) {
$defaultAvatarPath = config('Images') $defaultAvatarPath = config('Images')
->avatarDefaultPath; ->avatarDefaultPath;
$sizes = config('Images') $sizes = config('Images')
->personAvatarSizes; ->personAvatarSizes;
$sizeConfig = $sizes[$size]; $sizeConfig = $sizes[$size];

View file

@ -422,7 +422,7 @@ if (! function_exists('add_category_tag')) {
/** /**
* Adds <itunes:category> and <category> tags to node for a given category * Adds <itunes:category> and <category> tags to node for a given category
*/ */
function add_category_tag(SimpleXMLElement $node, Category $category): void function add_category_tag(RssFeed $node, Category $category): void
{ {
$itunesCategory = $node->addChild('category', null, RssFeed::ITUNES_NAMESPACE); $itunesCategory = $node->addChild('category', null, RssFeed::ITUNES_NAMESPACE);
$itunesCategory->addAttribute( $itunesCategory->addAttribute(
@ -441,70 +441,3 @@ if (! function_exists('add_category_tag')) {
$node->addChild('category', $category->apple_category); $node->addChild('category', $category->apple_category);
} }
} }
if (! function_exists('rss_to_array')) {
/**
* Converts XML to array
*
* FIXME: param should be SimpleRSSElement
*
* @return array<string, mixed>
*/
function rss_to_array(SimpleXMLElement $rssNode): array
{
$nameSpaces = ['', 'http://www.itunes.com/dtds/podcast-1.0.dtd', 'https://podcastindex.org/namespace/1.0'];
$arrayNode = [];
$arrayNode['name'] = $rssNode->getName();
$arrayNode['namespace'] = $rssNode->getNamespaces(false);
foreach ($rssNode->attributes() as $key => $value) {
$arrayNode['attributes'][$key] = (string) $value;
}
$textcontent = trim((string) $rssNode);
if (strlen($textcontent) > 0) {
$arrayNode['content'] = $textcontent;
}
foreach ($nameSpaces as $currentNameSpace) {
foreach ($rssNode->children($currentNameSpace) as $childXmlNode) {
$arrayNode['elements'][] = rss_to_array($childXmlNode);
}
}
return $arrayNode;
}
}
if (! function_exists('array_to_rss')) {
/**
* Inserts array (converted to XML node) in XML node
*
* @param array<string, mixed> $arrayNode
* @param RssFeed $xmlNode The XML parent node where this arrayNode should be attached
*/
function array_to_rss(array $arrayNode, RssFeed &$xmlNode): RssFeed
{
if (array_key_exists('elements', $arrayNode)) {
foreach ($arrayNode['elements'] as $childArrayNode) {
$childXmlNode = $xmlNode->addChild(
$childArrayNode['name'],
$childArrayNode['content'] ?? null,
$childArrayNode['namespace'] === []
? null
: current($childArrayNode['namespace'])
);
if (array_key_exists('attributes', $childArrayNode)) {
foreach (
$childArrayNode['attributes'] as $attributeKey => $attributeValue
) {
$childXmlNode->addAttribute($attributeKey, $attributeValue);
}
}
array_to_rss($childArrayNode, $childXmlNode);
}
}
return $xmlNode;
}
}

View file

@ -8,19 +8,19 @@ use App\Entities\EpisodeComment;
use App\Entities\Page; use App\Entities\Page;
use App\Entities\Podcast; use App\Entities\Podcast;
use App\Entities\Post; use App\Entities\Post;
use Melbahja\Seo\MetaTags; use App\Libraries\HtmlHead;
use Melbahja\Seo\Schema; use Melbahja\Seo\Schema;
use Melbahja\Seo\Schema\Thing; use Melbahja\Seo\Schema\Thing;
use Modules\Fediverse\Entities\PreviewCard; use Modules\Fediverse\Entities\PreviewCard;
/** /**
* @copyright 2021 Ad Aures * @copyright 2024 Ad Aures
* @license https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3 * @license https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
* @link https://castopod.org/ * @link https://castopod.org/
*/ */
if (! function_exists('get_podcast_metatags')) { if (! function_exists('set_podcast_metatags')) {
function get_podcast_metatags(Podcast $podcast, string $page): string function set_podcast_metatags(Podcast $podcast, string $page): void
{ {
$category = ''; $category = '';
if ($podcast->category->parent_id !== null) { if ($podcast->category->parent_id !== null) {
@ -48,10 +48,11 @@ if (! function_exists('get_podcast_metatags')) {
]) ])
); );
$metatags = new MetaTags(); /** @var HtmlHead $head */
$head = service('html_head');
$metatags $head
->title($podcast->title . ' (@' . $podcast->handle . ') • ' . lang('Podcast.' . $page)) ->title(sprintf('%s (@%s) • %s', $podcast->title, $podcast->handle, lang('Podcast.' . $page)))
->description(esc($podcast->description)) ->description(esc($podcast->description))
->image((string) $podcast->cover->og_url) ->image((string) $podcast->cover->og_url)
->canonical((string) current_url()) ->canonical((string) current_url())
@ -59,20 +60,18 @@ if (! function_exists('get_podcast_metatags')) {
->og('image:height', (string) config('Images')->podcastCoverSizes['og']['height']) ->og('image:height', (string) config('Images')->podcastCoverSizes['og']['height'])
->og('locale', $podcast->language_code) ->og('locale', $podcast->language_code)
->og('site_name', esc(service('settings')->get('App.siteName'))) ->og('site_name', esc(service('settings')->get('App.siteName')))
->push('link', [ ->tag('link', null, [
'rel' => 'alternate', 'rel' => 'alternate',
'type' => 'application/activity+json', 'type' => 'application/activity+json',
'href' => url_to('podcast-activity', esc($podcast->handle)), 'href' => url_to('podcast-activity', esc($podcast->handle)),
]); ])->appendRawContent('<link type="application/rss+xml" rel="alternate" title="' . esc(
$podcast->title
return '<link type="application/rss+xml" rel="alternate" title="' . esc( ) . '" href="' . $podcast->feed_url . '" />' . $schema);
$podcast->title
) . '" href="' . $podcast->feed_url . '" />' . PHP_EOL . $metatags->__toString() . PHP_EOL . $schema->__toString();
} }
} }
if (! function_exists('get_episode_metatags')) { if (! function_exists('set_episode_metatags')) {
function get_episode_metatags(Episode $episode): string function set_episode_metatags(Episode $episode): void
{ {
$schema = new Schema( $schema = new Schema(
new Thing('PodcastEpisode', [ new Thing('PodcastEpisode', [
@ -80,7 +79,7 @@ if (! function_exists('get_episode_metatags')) {
'name' => $episode->title, 'name' => $episode->title,
'image' => $episode->cover->feed_url, 'image' => $episode->cover->feed_url,
'description' => $episode->description, 'description' => $episode->description,
'datePublished' => $episode->published_at->format(DATE_ISO8601), 'datePublished' => $episode->published_at->format(DATE_ATOM),
'timeRequired' => iso8601_duration($episode->audio->duration), 'timeRequired' => iso8601_duration($episode->audio->duration),
'duration' => iso8601_duration($episode->audio->duration), 'duration' => iso8601_duration($episode->audio->duration),
'associatedMedia' => new Thing('MediaObject', [ 'associatedMedia' => new Thing('MediaObject', [
@ -93,9 +92,10 @@ if (! function_exists('get_episode_metatags')) {
]) ])
); );
$metatags = new MetaTags(); /** @var HtmlHead $head */
$head = service('html_head');
$metatags $head
->title($episode->title) ->title($episode->title)
->description(esc($episode->description)) ->description(esc($episode->description))
->image((string) $episode->cover->og_url, 'player') ->image((string) $episode->cover->og_url, 'player')
@ -106,35 +106,34 @@ if (! function_exists('get_episode_metatags')) {
->og('locale', $episode->podcast->language_code) ->og('locale', $episode->podcast->language_code)
->og('audio', $episode->audio_opengraph_url) ->og('audio', $episode->audio_opengraph_url)
->og('audio:type', $episode->audio->file_mimetype) ->og('audio:type', $episode->audio->file_mimetype)
->meta('article:published_time', $episode->published_at->format(DATE_ISO8601)) ->meta('article:published_time', $episode->published_at->format(DATE_ATOM))
->meta('article:modified_time', $episode->updated_at->format(DATE_ISO8601)) ->meta('article:modified_time', $episode->updated_at->format(DATE_ATOM))
->twitter('audio:partner', $episode->podcast->publisher ?? '') ->twitter('audio:partner', $episode->podcast->publisher ?? '')
->twitter('audio:artist_name', esc($episode->podcast->owner_name)) ->twitter('audio:artist_name', esc($episode->podcast->owner_name))
->twitter('player', $episode->getEmbedUrl('light')) ->twitter('player', $episode->getEmbedUrl('light'))
->twitter('player:width', (string) config('Embed')->width) ->twitter('player:width', (string) config('Embed')->width)
->twitter('player:height', (string) config('Embed')->height) ->twitter('player:height', (string) config('Embed')->height)
->push('link', [ ->tag('link', null, [
'rel' => 'alternate', 'rel' => 'alternate',
'type' => 'application/activity+json', 'type' => 'application/activity+json',
'href' => url_to('episode', $episode->podcast->handle, $episode->slug), 'href' => $episode->link,
]); ])
->appendRawContent('<link rel="alternate" type="application/json+oembed" href="' . base_url(
return $metatags->__toString() . PHP_EOL . '<link rel="alternate" type="application/json+oembed" href="' . base_url( route_to('episode-oembed-json', $episode->podcast->handle, $episode->slug)
route_to('episode-oembed-json', $episode->podcast->handle, $episode->slug) ) . '" title="' . esc(
) . '" title="' . esc( $episode->title
$episode->title ) . ' oEmbed json" />' . '<link rel="alternate" type="text/xml+oembed" href="' . base_url(
) . ' oEmbed json" />' . PHP_EOL . '<link rel="alternate" type="text/xml+oembed" href="' . base_url( route_to('episode-oembed-xml', $episode->podcast->handle, $episode->slug)
route_to('episode-oembed-xml', $episode->podcast->handle, $episode->slug) ) . '" title="' . esc($episode->title) . ' oEmbed xml" />' . $schema);
) . '" title="' . esc($episode->title) . ' oEmbed xml" />' . PHP_EOL . $schema->__toString();
} }
} }
if (! function_exists('get_post_metatags')) { if (! function_exists('set_post_metatags')) {
function get_post_metatags(Post $post): string function set_post_metatags(Post $post): void
{ {
$socialMediaPosting = new Thing('SocialMediaPosting', [ $socialMediaPosting = new Thing('SocialMediaPosting', [
'@id' => url_to('post', esc($post->actor->username), $post->id), '@id' => url_to('post', esc($post->actor->username), $post->id),
'datePublished' => $post->published_at->format(DATE_ISO8601), 'datePublished' => $post->published_at->format(DATE_ATOM),
'author' => new Thing('Person', [ 'author' => new Thing('Person', [
'name' => $post->actor->display_name, 'name' => $post->actor->display_name,
'url' => $post->actor->uri, 'url' => $post->actor->uri,
@ -162,8 +161,10 @@ if (! function_exists('get_post_metatags')) {
$schema = new Schema($socialMediaPosting); $schema = new Schema($socialMediaPosting);
$metatags = new MetaTags(); /** @var HtmlHead $head */
$metatags $head = service('html_head');
$head
->title(lang('Post.title', [ ->title(lang('Post.title', [
'actorDisplayName' => $post->actor->display_name, 'actorDisplayName' => $post->actor->display_name,
])) ]))
@ -171,18 +172,16 @@ if (! function_exists('get_post_metatags')) {
->image($post->actor->avatar_image_url) ->image($post->actor->avatar_image_url)
->canonical((string) current_url()) ->canonical((string) current_url())
->og('site_name', esc(service('settings')->get('App.siteName'))) ->og('site_name', esc(service('settings')->get('App.siteName')))
->push('link', [ ->tag('link', null, [
'rel' => 'alternate', 'rel' => 'alternate',
'type' => 'application/activity+json', 'type' => 'application/activity+json',
'href' => url_to('post', esc($post->actor->username), $post->id), 'href' => url_to('post', esc($post->actor->username), $post->id),
]); ])->appendRawContent((string) $schema);
return $metatags->__toString() . PHP_EOL . $schema->__toString();
} }
} }
if (! function_exists('get_episode_comment_metatags')) { if (! function_exists('set_episode_comment_metatags')) {
function get_episode_comment_metatags(EpisodeComment $episodeComment): string function set_episode_comment_metatags(EpisodeComment $episodeComment): void
{ {
$schema = new Schema(new Thing('SocialMediaPosting', [ $schema = new Schema(new Thing('SocialMediaPosting', [
'@id' => url_to( '@id' => url_to(
@ -191,7 +190,7 @@ if (! function_exists('get_episode_comment_metatags')) {
$episodeComment->episode->slug, $episodeComment->episode->slug,
$episodeComment->id $episodeComment->id
), ),
'datePublished' => $episodeComment->created_at->format(DATE_ISO8601), 'datePublished' => $episodeComment->created_at->format(DATE_ATOM),
'author' => new Thing('Person', [ 'author' => new Thing('Person', [
'name' => $episodeComment->actor->display_name, 'name' => $episodeComment->actor->display_name,
'url' => $episodeComment->actor->uri, 'url' => $episodeComment->actor->uri,
@ -200,8 +199,10 @@ if (! function_exists('get_episode_comment_metatags')) {
'upvoteCount' => $episodeComment->likes_count, 'upvoteCount' => $episodeComment->likes_count,
])); ]));
$metatags = new MetaTags(); /** @var HtmlHead $head */
$metatags $head = service('html_head');
$head
->title(lang('Comment.title', [ ->title(lang('Comment.title', [
'actorDisplayName' => $episodeComment->actor->display_name, 'actorDisplayName' => $episodeComment->actor->display_name,
'episodeTitle' => $episodeComment->episode->title, 'episodeTitle' => $episodeComment->episode->title,
@ -210,7 +211,7 @@ if (! function_exists('get_episode_comment_metatags')) {
->image($episodeComment->actor->avatar_image_url) ->image($episodeComment->actor->avatar_image_url)
->canonical((string) current_url()) ->canonical((string) current_url())
->og('site_name', esc(service('settings')->get('App.siteName'))) ->og('site_name', esc(service('settings')->get('App.siteName')))
->push('link', [ ->tag('link', null, [
'rel' => 'alternate', 'rel' => 'alternate',
'type' => 'application/activity+json', 'type' => 'application/activity+json',
'href' => url_to( 'href' => url_to(
@ -219,17 +220,16 @@ if (! function_exists('get_episode_comment_metatags')) {
$episodeComment->episode->slug, $episodeComment->episode->slug,
$episodeComment->id $episodeComment->id
), ),
]); ])->appendRawContent((string) $schema);
return $metatags->__toString() . PHP_EOL . $schema->__toString();
} }
} }
if (! function_exists('get_follow_metatags')) { if (! function_exists('set_follow_metatags')) {
function get_follow_metatags(Actor $actor): string function set_follow_metatags(Actor $actor): void
{ {
$metatags = new MetaTags(); /** @var HtmlHead $head */
$metatags $head = service('html_head');
$head
->title(lang('Podcast.followTitle', [ ->title(lang('Podcast.followTitle', [
'actorDisplayName' => $actor->display_name, 'actorDisplayName' => $actor->display_name,
])) ]))
@ -237,16 +237,15 @@ if (! function_exists('get_follow_metatags')) {
->image($actor->avatar_image_url) ->image($actor->avatar_image_url)
->canonical((string) current_url()) ->canonical((string) current_url())
->og('site_name', esc(service('settings')->get('App.siteName'))); ->og('site_name', esc(service('settings')->get('App.siteName')));
return $metatags->__toString();
} }
} }
if (! function_exists('get_remote_actions_metatags')) { if (! function_exists('set_remote_actions_metatags')) {
function get_remote_actions_metatags(Post $post, string $action): string function set_remote_actions_metatags(Post $post, string $action): void
{ {
$metatags = new MetaTags(); /** @var HtmlHead $head */
$metatags $head = service('html_head');
$head
->title(lang('Fediverse.' . $action . '.title', [ ->title(lang('Fediverse.' . $action . '.title', [
'actorDisplayName' => $post->actor->display_name, 'actorDisplayName' => $post->actor->display_name,
],)) ],))
@ -254,31 +253,30 @@ if (! function_exists('get_remote_actions_metatags')) {
->image($post->actor->avatar_image_url) ->image($post->actor->avatar_image_url)
->canonical((string) current_url()) ->canonical((string) current_url())
->og('site_name', esc(service('settings')->get('App.siteName'))); ->og('site_name', esc(service('settings')->get('App.siteName')));
return $metatags->__toString();
} }
} }
if (! function_exists('get_home_metatags')) { if (! function_exists('set_home_metatags')) {
function get_home_metatags(): string function set_home_metatags(): void
{ {
$metatags = new MetaTags(); /** @var HtmlHead $head */
$metatags $head = service('html_head');
$head
->title(service('settings')->get('App.siteName')) ->title(service('settings')->get('App.siteName'))
->description(esc(service('settings')->get('App.siteDescription'))) ->description(esc(service('settings')->get('App.siteDescription')))
->image(get_site_icon_url('512')) ->image(get_site_icon_url('512'))
->canonical((string) current_url()) ->canonical((string) current_url())
->og('site_name', esc(service('settings')->get('App.siteName'))); ->og('site_name', esc(service('settings')->get('App.siteName')));
return $metatags->__toString();
} }
} }
if (! function_exists('get_page_metatags')) { if (! function_exists('set_page_metatags')) {
function get_page_metatags(Page $page): string function set_page_metatags(Page $page): void
{ {
$metatags = new MetaTags(); /** @var HtmlHead $head */
$metatags $head = service('html_head');
$head
->title( ->title(
$page->title . service('settings')->get('App.siteTitleSeparator') . service( $page->title . service('settings')->get('App.siteTitleSeparator') . service(
'settings' 'settings'
@ -289,7 +287,6 @@ if (! function_exists('get_page_metatags')) {
->canonical((string) current_url()) ->canonical((string) current_url())
->og('site_name', esc(service('settings')->get('App.siteName'))); ->og('site_name', esc(service('settings')->get('App.siteName')));
return $metatags->__toString();
} }
} }

188
app/Libraries/HtmlHead.php Normal file
View file

@ -0,0 +1,188 @@
<?php
declare(strict_types=1);
namespace App\Libraries;
use App\Controllers\WebmanifestController;
use Override;
use Stringable;
/**
* Inspired by https://github.com/melbahja/seo
*/
class HtmlHead implements Stringable
{
protected ?string $title = null;
/**
* @var array{name:string,value:string|null,attributes:array<string,string|null>}[]
*/
protected array $tags = [];
protected string $rawContent = '';
#[Override]
public function __toString(): string
{
helper('misc');
$this
->tag('meta', null, [
'charset' => 'UTF-8',
])
->meta('viewport', 'width=device-width, initial-scale=1.0')
->tag('link', null, [
'rel' => 'icon',
'type' => 'image/x-icon',
'href' => get_site_icon_url('ico'),
])
->tag('link', null, [
'rel' => 'apple-touch-icon',
'href' => get_site_icon_url('180'),
])
->tag('link', null, [
'rel' => 'manifest',
// @phpstan-ignore-next-line
'href' => isset($podcast) ? route_to('podcast-webmanifest', esc($podcast->handle)) : route_to(
'webmanifest'
),
])
->meta(
'theme-color',
WebmanifestController::THEME_COLORS[service('settings')->get('App.theme')]['theme']
)
->tag('link', null, [
'rel' => 'stylesheet',
'type' => 'text/css',
'href' => route_to('themes-colors-css'),
])
->appendRawContent(<<<HTML
<script>
// Check that service workers are supported
if ('serviceWorker' in navigator) {
// Use the window load event to keep the page load performant
window.addEventListener('load', () => {
navigator.serviceWorker.register('/sw.js');
});
}
</script>
HTML);
if ($this->title) {
$this->tag('title', esc($this->title));
}
if (url_is(route_to('admin') . '*') || url_is(base_url(config('Auth')->gateway) . '*')) {
// restricted admin and auth areas, do not index
$this->meta('robots', 'noindex');
} else {
// public website, set siteHead hook only there
service('plugins')
->siteHead($this);
}
$head = '<head>';
foreach ($this->tags as $tag) {
if ($tag['value'] === null) {
$head .= <<<HTML
<{$tag['name']}{$this->stringify_attributes($tag['attributes'])}/>
HTML;
} else {
$head .= <<<HTML
<{$tag['name']} {$this->stringify_attributes($tag['attributes'])}>{$tag['value']}</{$tag['name']}>
HTML;
}
}
$head .= $this->rawContent . '</head>';
// reset head for next render
$this->title = null;
$this->tags = [];
$this->rawContent = '';
return $head;
}
public function title(string $title): self
{
$this->title = $title;
return $this->meta('title', $title)
->og('title', $title)
->twitter('title', $title);
}
public function description(string $desc): self
{
return $this->meta('description', $desc)
->og('description', $desc)
->twitter('description', $desc);
}
public function image(string $url, string $card = 'summary_large_image'): self
{
return $this->og('image', $url)
->twitter('card', $card)
->twitter('image', $url);
}
public function canonical(string $url): self
{
return $this->tag('link', null, [
'rel' => 'canonical',
'href' => $url,
]);
}
public function twitter(string $name, string $value): self
{
$this->meta("twitter:{$name}", $value);
return $this;
}
/**
* @param array<string,string|null> $attributes
*/
public function tag(string $name, ?string $value = null, array $attributes = []): self
{
$this->tags[] = [
'name' => $name,
'value' => $value,
'attributes' => $attributes,
];
return $this;
}
public function meta(string $name, string $content): self
{
$this->tag('meta', null, [
'name' => $name,
'content' => $content,
]);
return $this;
}
public function og(string $name, string $content): self
{
$this->meta('og:' . $name, $content);
return $this;
}
public function appendRawContent(string $content): self
{
$this->rawContent .= $content;
return $this;
}
/**
* @param array<string, string|null> $attributes
*/
private function stringify_attributes(array $attributes): string
{
return stringify_attributes($attributes);
}
}

View file

@ -229,8 +229,6 @@ class EpisodeCommentModel extends UuidModel
$episodeComments . ' UNION ' . $episodePostsReplies . ' ORDER BY created_at ASC' $episodeComments . ' UNION ' . $episodePostsReplies . ' ORDER BY created_at ASC'
); );
// FIXME:?
// @phpstan-ignore-next-line
return $this->convertUuidFieldsToStrings( return $this->convertUuidFieldsToStrings(
$allEpisodeComments->getCustomResultObject($this->tempReturnType), $allEpisodeComments->getCustomResultObject($this->tempReturnType),
$this->tempReturnType $this->tempReturnType

View file

@ -3,17 +3,17 @@
declare(strict_types=1); declare(strict_types=1);
/** /**
* @icon('funding:buymeacoffee') * @icon("funding:buymeacoffee")
* @icon('funding:donorbox') * @icon("funding:donorbox")
* @icon('funding:gofundme') * @icon("funding:gofundme")
* @icon('funding:helloasso') * @icon("funding:helloasso")
* @icon('funding:indiegogo') * @icon("funding:indiegogo")
* @icon('funding:kickstarter') * @icon("funding:kickstarter")
* @icon('funding:kisskissbankbank') * @icon("funding:kisskissbankbank")
* @icon('funding:kofi') * @icon("funding:kofi")
* @icon('funding:liberapay') * @icon("funding:liberapay")
* @icon('funding:patreon') * @icon("funding:patreon")
* @icon('funding:paypal') * @icon("funding:paypal")
* @icon('funding:tipeee') * @icon("funding:tipeee")
* @icon('funding:ulule') * @icon("funding:ulule")
*/ */

View file

@ -3,46 +3,46 @@
declare(strict_types=1); declare(strict_types=1);
/** /**
* @icon('podcasting:amazon') * @icon("podcasting:amazon")
* @icon('podcasting:antennapod') * @icon("podcasting:antennapod")
* @icon('podcasting:anytime') * @icon("podcasting:anytime")
* @icon('podcasting:apple') * @icon("podcasting:apple")
* @icon('podcasting:blubrry') * @icon("podcasting:blubrry")
* @icon('podcasting:breez') * @icon("podcasting:breez")
* @icon('podcasting:castamatic') * @icon("podcasting:castamatic")
* @icon('podcasting:castbox') * @icon("podcasting:castbox")
* @icon('podcasting:castopod') * @icon("podcasting:castopod")
* @icon('podcasting:castro') * @icon("podcasting:castro")
* @icon('podcasting:deezer') * @icon("podcasting:deezer")
* @icon('podcasting:episodes-fm') * @icon("podcasting:episodes-fm")
* @icon('podcasting:fountain') * @icon("podcasting:fountain")
* @icon('podcasting:fyyd') * @icon("podcasting:fyyd")
* @icon('podcasting:gpodder') * @icon("podcasting:gpodder")
* @icon('podcasting:ivoox') * @icon("podcasting:ivoox")
* @icon('podcasting:listennotes') * @icon("podcasting:listennotes")
* @icon('podcasting:overcast') * @icon("podcasting:overcast")
* @icon('podcasting:playerfm') * @icon("podcasting:playerfm")
* @icon('podcasting:plink') * @icon("podcasting:plink")
* @icon('podcasting:pocketcasts') * @icon("podcasting:pocketcasts")
* @icon('podcasting:podbean') * @icon("podcasting:podbean")
* @icon('podcasting:podcastaddict') * @icon("podcasting:podcastaddict")
* @icon('podcasting:podcastguru') * @icon("podcasting:podcastguru")
* @icon('podcasting:podcastindex') * @icon("podcasting:podcastindex")
* @icon('podcasting:podchaser') * @icon("podcasting:podchaser")
* @icon('podcasting:podcloud') * @icon("podcasting:podcloud")
* @icon('podcasting:podfriend') * @icon("podcasting:podfriend")
* @icon('podcasting:podinstall') * @icon("podcasting:podinstall")
* @icon('podcasting:podlink') * @icon("podcasting:podlink")
* @icon('podcasting:podlp') * @icon("podcasting:podlp")
* @icon('podcasting:podnews') * @icon("podcasting:podnews")
* @icon('podcasting:podtail') * @icon("podcasting:podtail")
* @icon('podcasting:podverse') * @icon("podcasting:podverse")
* @icon('podcasting:radiopublic') * @icon("podcasting:radiopublic")
* @icon('podcasting:sphinxchat') * @icon("podcasting:sphinxchat")
* @icon('podcasting:spotify') * @icon("podcasting:spotify")
* @icon('podcasting:spreaker') * @icon("podcasting:spreaker")
* @icon('podcasting:truefans') * @icon("podcasting:truefans")
* @icon('podcasting:tsacdop') * @icon("podcasting:tsacdop")
* @icon('podcasting:tunein') * @icon("podcasting:tunein")
* @icon('podcasting:youtube-music') * @icon("podcasting:youtube-music")
*/ */

View file

@ -3,26 +3,26 @@
declare(strict_types=1); declare(strict_types=1);
/** /**
* @icon('social:bluesky') * @icon("social:bluesky")
* @icon('social:discord') * @icon("social:discord")
* @icon('social:facebook') * @icon("social:facebook")
* @icon('social:funkwhale') * @icon("social:funkwhale")
* @icon('social:instagram') * @icon("social:instagram")
* @icon('social:linkedin') * @icon("social:linkedin")
* @icon('social:mastodon') * @icon("social:mastodon")
* @icon('social:matrix') * @icon("social:matrix")
* @icon('social:misskey') * @icon("social:misskey")
* @icon('social:mobilizon') * @icon("social:mobilizon")
* @icon('social:peertube') * @icon("social:peertube")
* @icon('social:pixelfed') * @icon("social:pixelfed")
* @icon('social:pleroma') * @icon("social:pleroma")
* @icon('social:plume') * @icon("social:plume")
* @icon('social:slack') * @icon("social:slack")
* @icon('social:telegram') * @icon("social:telegram")
* @icon('social:threads') * @icon("social:threads")
* @icon('social:tiktok') * @icon("social:tiktok")
* @icon('social:twitch') * @icon("social:twitch")
* @icon('social:writefreely') * @icon("social:writefreely")
* @icon('social:x') * @icon("social:x")
* @icon('social:youtube') * @icon("social:youtube")
*/ */

View file

@ -21,7 +21,7 @@ import Tooltip from "./modules/Tooltip";
import ValidateFileSize from "./modules/ValidateFileSize"; import ValidateFileSize from "./modules/ValidateFileSize";
import "./modules/video-clip-previewer"; import "./modules/video-clip-previewer";
import VideoClipBuilder from "./modules/VideoClipBuilder"; import VideoClipBuilder from "./modules/VideoClipBuilder";
import "./modules/xml-editor"; import "./modules/code-editor";
import "@patternfly/elements/pf-tabs/pf-tabs.js"; import "@patternfly/elements/pf-tabs/pf-tabs.js";
import FieldArray from "./modules/FieldArray"; import FieldArray from "./modules/FieldArray";

View file

@ -0,0 +1,222 @@
import { indentWithTab } from "@codemirror/commands";
import { html as htmlLang } from "@codemirror/lang-html";
import { xml } from "@codemirror/lang-xml";
import {
defaultHighlightStyle,
syntaxHighlighting,
} from "@codemirror/language";
import { Compartment, EditorState, Extension } from "@codemirror/state";
import { keymap, ViewUpdate } from "@codemirror/view";
import { basicSetup, EditorView } from "codemirror";
import { prettify as prettifyHTML, minify as minifyHTML } from "htmlfy";
import { css, html, LitElement, TemplateResult } from "lit";
import {
customElement,
property,
queryAssignedNodes,
state,
} from "lit/decorators.js";
import xmlFormat from "xml-formatter";
const language = new Compartment();
@customElement("code-editor")
export class XMLEditor extends LitElement {
@queryAssignedNodes({ slot: "textarea" })
_textarea!: NodeListOf<HTMLTextAreaElement>;
@property()
lang = "html";
@state()
editorState!: EditorState;
@state()
editorView!: EditorView;
_textareaEvents = [
{
events: ["focus", "invalid"],
onEvent: (_: Event, editor: EditorView) => {
// focus editor when textarea is focused or invalid
editor.focus();
},
},
];
firstUpdated(): void {
const minHeightEditor = EditorView.baseTheme({
".cm-content, .cm-gutter": {
minHeight: this._textarea[0].clientHeight + "px",
},
});
const extensions: Extension[] = [
basicSetup,
keymap.of([indentWithTab]),
minHeightEditor,
syntaxHighlighting(defaultHighlightStyle),
EditorView.updateListener.of((viewUpdate: ViewUpdate) => {
if (viewUpdate.docChanged) {
// Document changed, minify and update textarea value
switch (this.lang) {
case "xml":
this._textarea[0].value = minifyXML(
viewUpdate.state.doc.toString()
);
break;
case "html":
this._textarea[0].value = minifyHTML(
viewUpdate.state.doc.toString()
);
break;
default:
this._textarea[0].value = viewUpdate.state.doc.toString();
break;
}
}
}),
];
let editorContents = "";
switch (this.lang) {
case "xml":
editorContents = formatXML(this._textarea[0].value);
extensions.push(language.of(xml()));
break;
case "html":
editorContents = prettifyHTML(this._textarea[0].value);
extensions.push(language.of(htmlLang()));
break;
default:
break;
}
this.editorState = EditorState.create({
doc: editorContents,
extensions: extensions,
});
this.editorView = new EditorView({
state: this.editorState,
root: this.shadowRoot as ShadowRoot,
parent: this.shadowRoot as ShadowRoot,
});
// hide textarea
this._textarea[0].style.position = "absolute";
this._textarea[0].style.opacity = "0";
this._textarea[0].style.zIndex = "-9999";
this._textarea[0].style.pointerEvents = "none";
for (const event of this._textareaEvents) {
event.events.forEach((name) => {
this._textarea[0].addEventListener(name, (e) =>
event.onEvent(e, this.editorView)
);
});
}
}
disconnectedCallback(): void {
super.disconnectedCallback();
for (const event of this._textareaEvents) {
event.events.forEach((name) => {
this._textarea[0].removeEventListener(name, (e) =>
event.onEvent(e, this.editorView)
);
});
}
}
static styles = css`
.cm-editor {
border-radius: 0.5rem;
overflow: hidden;
border: 3px solid hsl(var(--color-border-contrast));
background-color: hsl(var(--color-background-elevated));
}
.cm-editor.cm-focused {
outline: 2px solid transparent;
box-shadow:
0 0 0 2px hsl(var(--color-background-elevated)),
0 0 0 calc(4px) hsl(var(--color-accent-base));
}
.cm-gutters {
background-color: hsl(var(--color-background-elevated)) !important;
}
.cm-activeLine {
background-color: hsla(
var(--color-background-highlight) / 0.25
) !important;
}
.cm-activeLineGutter {
background-color: hsl(var(--color-background-highlight)) !important;
}
.ͼ4 .cm-line {
caret-color: hsl(var(--color-text-base)) !important;
}
.ͼ1 .cm-cursor {
border: none;
}
`;
render(): TemplateResult<1> {
return html`<slot name="textarea"></slot>`;
}
}
function formatXML(contents: string) {
if (contents === "") {
return contents;
}
let editorContents = "";
try {
editorContents = xmlFormat(contents, {
indentation: " ",
});
} catch {
// xml doesn't have a root node
editorContents = xmlFormat("<root>" + contents + "</root>", {
indentation: " ",
});
// remove root, unnecessary lines and indents
editorContents = editorContents
.replace(/^<root>/, "")
.replace(/<\/root>$/, "")
.replace(/^\s*[\r\n]/gm, "")
.replace(/[\r\n] {2}/gm, "\r\n")
.trim();
}
return editorContents;
}
function minifyXML(contents: string) {
if (contents === "") {
return contents;
}
let minifiedContent = "";
try {
minifiedContent = xmlFormat.minify(contents, {
collapseContent: true,
});
} catch {
minifiedContent = xmlFormat.minify(`<root>${contents}</root>`, {
collapseContent: true,
});
// remove root
minifiedContent = minifiedContent
.replace(/^<root>/, "")
.replace(/<\/root>$/, "");
}
return minifiedContent;
}

View file

@ -1,125 +0,0 @@
import { indentWithTab } from "@codemirror/commands";
import { xml } from "@codemirror/lang-xml";
import {
defaultHighlightStyle,
syntaxHighlighting,
} from "@codemirror/language";
import { Compartment, EditorState } from "@codemirror/state";
import { keymap, ViewUpdate } from "@codemirror/view";
import { basicSetup, EditorView } from "codemirror";
import { css, html, LitElement, TemplateResult } from "lit";
import { customElement, queryAssignedNodes, state } from "lit/decorators.js";
import prettifyXML from "xml-formatter";
const language = new Compartment();
@customElement("xml-editor")
export class XMLEditor extends LitElement {
@queryAssignedNodes({ slot: "textarea" })
_textarea!: NodeListOf<HTMLTextAreaElement>;
@state()
editorState!: EditorState;
@state()
editorView!: EditorView;
firstUpdated(): void {
const minHeightEditor = EditorView.theme({
".cm-content, .cm-gutter": {
minHeight: this._textarea[0].clientHeight + "px",
},
});
let editorContents = "";
if (this._textarea[0].value) {
try {
editorContents = prettifyXML(this._textarea[0].value, {
indentation: " ",
});
} catch {
// xml doesn't have a root node
editorContents = prettifyXML(
"<root>" + this._textarea[0].value + "</root>",
{
indentation: " ",
}
);
// remove root, unnecessary lines and indents
editorContents = editorContents
.replace(/^<root>/, "")
.replace(/<\/root>$/, "")
.replace(/^\s*[\r\n]/gm, "")
.replace(/[\r\n] {2}/gm, "\r\n")
.trim();
}
}
this.editorState = EditorState.create({
doc: editorContents,
extensions: [
basicSetup,
keymap.of([indentWithTab]),
language.of(xml()),
minHeightEditor,
syntaxHighlighting(defaultHighlightStyle),
EditorView.updateListener.of((viewUpdate: ViewUpdate) => {
if (viewUpdate.docChanged) {
// Document changed, update textarea value
this._textarea[0].value = viewUpdate.state.doc.toString();
}
}),
],
});
this.editorView = new EditorView({
state: this.editorState,
root: this.shadowRoot as ShadowRoot,
parent: this.shadowRoot as ShadowRoot,
});
// hide textarea
this._textarea[0].style.position = "absolute";
this._textarea[0].style.opacity = "0";
this._textarea[0].style.zIndex = "-9999";
this._textarea[0].style.pointerEvents = "none";
}
static styles = css`
.cm-editor {
border-radius: 0.5rem;
overflow: hidden;
border: 3px solid hsl(var(--color-border-contrast));
background-color: hsl(var(--color-background-elevated));
}
.cm-editor.cm-focused {
outline: 2px solid transparent;
box-shadow:
0 0 0 2px hsl(var(--color-background-elevated)),
0 0 0 calc(4px) hsl(var(--color-accent-base));
}
.cm-gutters {
background-color: hsl(var(--color-background-elevated)) !important;
}
.cm-activeLine {
background-color: hsl(var(--color-background-highlight)) !important;
}
.cm-activeLineGutter {
background-color: hsl(var(--color-background-highlight)) !important;
}
.ͼ4 .cm-line {
caret-color: hsl(var(--color-text-base)) !important;
}
.ͼ1 .cm-cursor {
border: none;
}
`;
render(): TemplateResult<1> {
return html`<slot name="textarea"></slot>`;
}
}

View file

@ -30,19 +30,19 @@ class Alert extends Component
$variantData = match ($this->variant) { $variantData = match ($this->variant) {
'success' => [ 'success' => [
'class' => 'text-pine-900 bg-pine-100 border-pine-300', 'class' => 'text-pine-900 bg-pine-100 border-pine-300',
'glyph' => 'check-fill', // @icon('check-fill') 'glyph' => 'check-fill', // @icon("check-fill")
], ],
'danger' => [ 'danger' => [
'class' => 'text-red-900 bg-red-100 border-red-300', 'class' => 'text-red-900 bg-red-100 border-red-300',
'glyph' => 'close-fill', // @icon('close-fill') 'glyph' => 'close-fill', // @icon("close-fill")
], ],
'warning' => [ 'warning' => [
'class' => 'text-yellow-900 bg-yellow-100 border-yellow-300', 'class' => 'text-yellow-900 bg-yellow-100 border-yellow-300',
'glyph' => 'alert-fill', // @icon('alert-fill') 'glyph' => 'alert-fill', // @icon("alert-fill")
], ],
default => [ default => [
'class' => 'text-blue-900 bg-blue-100 border-blue-300', 'class' => 'text-blue-900 bg-blue-100 border-blue-300',
'glyph' => 'error-warning-fill', // @icon('error-warning-fill') 'glyph' => 'error-warning-fill', // @icon("error-warning-fill")
], ],
}; };

View file

@ -6,20 +6,22 @@ namespace App\Views\Components\Forms;
use Override; use Override;
class XMLEditor extends FormComponent class CodeEditor extends FormComponent
{ {
protected array $props = ['content']; protected array $props = ['content', 'lang'];
/** /**
* @var array<string, string> * @var array<string, string>
*/ */
protected array $attributes = [ protected array $attributes = [
'rows' => '5', 'rows' => '6',
'class' => 'textarea', 'class' => 'textarea',
]; ];
protected string $content = ''; protected string $content = '';
protected string $lang = '';
public function setContent(string $value): void public function setContent(string $value): void
{ {
$this->content = htmlspecialchars_decode($value); $this->content = htmlspecialchars_decode($value);
@ -32,7 +34,7 @@ class XMLEditor extends FormComponent
$textarea = form_textarea($this->attributes, $this->content); $textarea = form_textarea($this->attributes, $this->content);
return <<<HTML return <<<HTML
<xml-editor>{$textarea}</xml-editor> <code-editor lang="{$this->lang}">{$textarea}</code-editor>
HTML; HTML;
} }
} }

View file

@ -1,38 +0,0 @@
<?php
declare(strict_types=1);
namespace App\Views\Decorators;
use CodeIgniter\View\ViewDecoratorInterface;
use Override;
class SiteHead implements ViewDecoratorInterface
{
private static int $renderedCount = 0;
#[Override]
public static function decorate(string $html): string
{
if (url_is(config('Admin')->gateway . '*') || url_is(config('Install')->gateway)) {
return $html;
}
if (static::$renderedCount > 0) {
return $html;
}
ob_start(); // Start output buffering
// run hook to add tags to <head>
service('plugins')->siteHead();
$metaTags = ob_get_contents(); // Store buffer in variable
ob_end_clean();
if (str_contains($html, '</head>')) {
$html = str_replace('</head>', "\n\t{$metaTags}\n</head>", $html);
++static::$renderedCount;
}
return $html;
}
}

View file

@ -9,37 +9,37 @@
"php": "^8.3", "php": "^8.3",
"adaures/ipcat-php": "^v1.0.0", "adaures/ipcat-php": "^v1.0.0",
"adaures/podcast-persons-taxonomy": "^v1.0.1", "adaures/podcast-persons-taxonomy": "^v1.0.1",
"aws/aws-sdk-php": "^3.325.2", "aws/aws-sdk-php": "^3.334.7",
"chrisjean/php-ico": "^1.0.4", "chrisjean/php-ico": "^1.0.4",
"cocur/slugify": "^v4.6.0", "cocur/slugify": "^v4.6.0",
"codeigniter4/framework": "v4.5.5", "codeigniter4/framework": "v4.5.5",
"codeigniter4/settings": "v2.2.0", "codeigniter4/settings": "v2.2.0",
"codeigniter4/shield": "v1.1.0", "codeigniter4/shield": "v1.1.0",
"codeigniter4/tasks": "dev-develop", "codeigniter4/tasks": "dev-develop",
"geoip2/geoip2": "v3.0.0", "geoip2/geoip2": "v3.1.0",
"james-heinrich/getid3": "^2.0.0-beta6", "james-heinrich/getid3": "^2.0.0-beta6",
"league/commonmark": "^2.5.3", "league/commonmark": "^2.6.0",
"league/html-to-markdown": "5.1.1", "league/html-to-markdown": "5.1.1",
"melbahja/seo": "^v2.1.1", "melbahja/seo": "^v2.1.1",
"michalsn/codeigniter4-uuid": "v1.1.0", "michalsn/codeigniter4-uuid": "v1.1.0",
"mpratt/embera": "^2.0.41", "mpratt/embera": "^2.0.41",
"opawg/user-agents-v2-php": "dev-main", "opawg/user-agents-v2-php": "dev-main",
"phpseclib/phpseclib": "~2.0.47", "phpseclib/phpseclib": "~2.0.48",
"vlucas/phpdotenv": "v5.6.1", "vlucas/phpdotenv": "v5.6.1",
"whichbrowser/parser": "^v2.1.8", "whichbrowser/parser": "^v2.1.8",
"yassinedoghri/php-icons": "^v1.2.0", "yassinedoghri/php-icons": "^v1.2.0",
"yassinedoghri/podcast-feed": "dev-main" "yassinedoghri/podcast-feed": "dev-main"
}, },
"require-dev": { "require-dev": {
"captainhook/captainhook": "^5.23.6", "captainhook/captainhook": "^5.24.1",
"codeigniter/phpstan-codeigniter": "v1.4.3", "codeigniter/phpstan-codeigniter": "v1.5.1",
"mikey179/vfsstream": "^v1.6.12", "mikey179/vfsstream": "^v1.6.12",
"phpstan/extension-installer": "^1.4.3", "phpstan/extension-installer": "^1.4.3",
"phpstan/phpstan": "^1.12.7", "phpstan/phpstan": "^2.0.3",
"phpunit/phpunit": "^10.5.38", "phpunit/phpunit": "^11.5.1",
"rector/rector": "^1.2.9", "rector/rector": "^2.0.3",
"symplify/coding-standard": "^12.2.3", "symplify/coding-standard": "^12.2.3",
"symplify/easy-coding-standard": "^12.3.6" "symplify/easy-coding-standard": "^12.5.4"
}, },
"autoload": { "autoload": {
"psr-4": { "psr-4": {

961
composer.lock generated
View file

@ -4,7 +4,7 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically" "This file is @generated automatically"
], ],
"content-hash": "580247d059f13d464f012b442c0c8d5d", "content-hash": "8bdf144f383531caa188f1c211ec092a",
"packages": [ "packages": [
{ {
"name": "adaures/ipcat-php", "name": "adaures/ipcat-php",
@ -75,16 +75,16 @@
}, },
{ {
"name": "adhocore/cli", "name": "adhocore/cli",
"version": "v1.7.2", "version": "v1.9.3",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/adhocore/php-cli.git", "url": "https://github.com/adhocore/php-cli.git",
"reference": "57834cbaa4fb68cda849417ab86577fba2b15298" "reference": "86be16e3c3b42d76fcdb32529bcded0fedb925d3"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/adhocore/php-cli/zipball/57834cbaa4fb68cda849417ab86577fba2b15298", "url": "https://api.github.com/repos/adhocore/php-cli/zipball/86be16e3c3b42d76fcdb32529bcded0fedb925d3",
"reference": "57834cbaa4fb68cda849417ab86577fba2b15298", "reference": "86be16e3c3b42d76fcdb32529bcded0fedb925d3",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -95,6 +95,7 @@
}, },
"type": "library", "type": "library",
"autoload": { "autoload": {
"files": ["src/functions.php"],
"psr-4": { "psr-4": {
"Ahc\\Cli\\": "src/" "Ahc\\Cli\\": "src/"
} }
@ -127,7 +128,7 @@
], ],
"support": { "support": {
"issues": "https://github.com/adhocore/php-cli/issues", "issues": "https://github.com/adhocore/php-cli/issues",
"source": "https://github.com/adhocore/php-cli/tree/v1.7.2" "source": "https://github.com/adhocore/php-cli/tree/v1.9.3"
}, },
"funding": [ "funding": [
{ {
@ -139,7 +140,7 @@
"type": "github" "type": "github"
} }
], ],
"time": "2024-09-05T00:08:47+00:00" "time": "2024-12-04T03:40:29+00:00"
}, },
{ {
"name": "aws/aws-crt-php", "name": "aws/aws-crt-php",
@ -188,16 +189,16 @@
}, },
{ {
"name": "aws/aws-sdk-php", "name": "aws/aws-sdk-php",
"version": "3.325.2", "version": "3.334.7",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/aws/aws-sdk-php.git", "url": "https://github.com/aws/aws-sdk-php.git",
"reference": "9e354a5e0cd1d563ec85245e3000e98e16a44fce" "reference": "8e0104e95a1edba209e077e6c4212b8cca04686f"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/9e354a5e0cd1d563ec85245e3000e98e16a44fce", "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/8e0104e95a1edba209e077e6c4212b8cca04686f",
"reference": "9e354a5e0cd1d563ec85245e3000e98e16a44fce", "reference": "8e0104e95a1edba209e077e6c4212b8cca04686f",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -226,8 +227,8 @@
"nette/neon": "^2.3", "nette/neon": "^2.3",
"paragonie/random_compat": ">= 2", "paragonie/random_compat": ">= 2",
"phpunit/phpunit": "^5.6.3 || ^8.5 || ^9.5", "phpunit/phpunit": "^5.6.3 || ^8.5 || ^9.5",
"psr/cache": "^1.0", "psr/cache": "^1.0 || ^2.0 || ^3.0",
"psr/simple-cache": "^1.0", "psr/simple-cache": "^1.0 || ^2.0 || ^3.0",
"sebastian/comparator": "^1.2.3 || ^4.0", "sebastian/comparator": "^1.2.3 || ^4.0",
"yoast/phpunit-polyfills": "^1.0" "yoast/phpunit-polyfills": "^1.0"
}, },
@ -274,9 +275,9 @@
"support": { "support": {
"forum": "https://forums.aws.amazon.com/forum.jspa?forumID=80", "forum": "https://forums.aws.amazon.com/forum.jspa?forumID=80",
"issues": "https://github.com/aws/aws-sdk-php/issues", "issues": "https://github.com/aws/aws-sdk-php/issues",
"source": "https://github.com/aws/aws-sdk-php/tree/3.325.2" "source": "https://github.com/aws/aws-sdk-php/tree/3.334.7"
}, },
"time": "2024-11-01T18:08:38+00:00" "time": "2024-12-16T19:09:36+00:00"
}, },
{ {
"name": "brick/math", "name": "brick/math",
@ -638,12 +639,12 @@
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/codeigniter4/tasks.git", "url": "https://github.com/codeigniter4/tasks.git",
"reference": "8767036adfef764f0623ba9cde2998320b948b3b" "reference": "ec717c428c6f0e8e216e5dfbf18966a26a4f821f"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/codeigniter4/tasks/zipball/8767036adfef764f0623ba9cde2998320b948b3b", "url": "https://api.github.com/repos/codeigniter4/tasks/zipball/ec717c428c6f0e8e216e5dfbf18966a26a4f821f",
"reference": "8767036adfef764f0623ba9cde2998320b948b3b", "reference": "ec717c428c6f0e8e216e5dfbf18966a26a4f821f",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -656,7 +657,7 @@
"codeigniter4/devkit": "^1.0", "codeigniter4/devkit": "^1.0",
"codeigniter4/framework": "^4.1", "codeigniter4/framework": "^4.1",
"phpunit/phpunit": "^9.6", "phpunit/phpunit": "^9.6",
"rector/rector": "1.2.8" "rector/rector": "1.2.10"
}, },
"default-branch": true, "default-branch": true,
"type": "library", "type": "library",
@ -714,20 +715,20 @@
"source": "https://github.com/codeigniter4/tasks/tree/develop", "source": "https://github.com/codeigniter4/tasks/tree/develop",
"issues": "https://github.com/codeigniter4/tasks/issues" "issues": "https://github.com/codeigniter4/tasks/issues"
}, },
"time": "2024-10-21T18:02:22+00:00" "time": "2024-11-11T12:05:47+00:00"
}, },
{ {
"name": "composer/ca-bundle", "name": "composer/ca-bundle",
"version": "1.5.3", "version": "1.5.4",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/composer/ca-bundle.git", "url": "https://github.com/composer/ca-bundle.git",
"reference": "3b1fc3f0be055baa7c6258b1467849c3e8204eb2" "reference": "bc0593537a463e55cadf45fd938d23b75095b7e1"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/composer/ca-bundle/zipball/3b1fc3f0be055baa7c6258b1467849c3e8204eb2", "url": "https://api.github.com/repos/composer/ca-bundle/zipball/bc0593537a463e55cadf45fd938d23b75095b7e1",
"reference": "3b1fc3f0be055baa7c6258b1467849c3e8204eb2", "reference": "bc0593537a463e55cadf45fd938d23b75095b7e1",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -766,7 +767,7 @@
"support": { "support": {
"irc": "irc://irc.freenode.org/composer", "irc": "irc://irc.freenode.org/composer",
"issues": "https://github.com/composer/ca-bundle/issues", "issues": "https://github.com/composer/ca-bundle/issues",
"source": "https://github.com/composer/ca-bundle/tree/1.5.3" "source": "https://github.com/composer/ca-bundle/tree/1.5.4"
}, },
"funding": [ "funding": [
{ {
@ -782,7 +783,7 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2024-11-04T10:15:26+00:00" "time": "2024-11-27T15:35:25+00:00"
}, },
{ {
"name": "dflydev/dot-access-data", "name": "dflydev/dot-access-data",
@ -854,22 +855,22 @@
}, },
{ {
"name": "geoip2/geoip2", "name": "geoip2/geoip2",
"version": "v3.0.0", "version": "v3.1.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/maxmind/GeoIP2-php.git", "url": "https://github.com/maxmind/GeoIP2-php.git",
"reference": "1a802ce9356cdd1c6b681c030fd9563750e11e6a" "reference": "c86fbeaa7e42279dd9e7af0b015384e721832b88"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/maxmind/GeoIP2-php/zipball/1a802ce9356cdd1c6b681c030fd9563750e11e6a", "url": "https://api.github.com/repos/maxmind/GeoIP2-php/zipball/c86fbeaa7e42279dd9e7af0b015384e721832b88",
"reference": "1a802ce9356cdd1c6b681c030fd9563750e11e6a", "reference": "c86fbeaa7e42279dd9e7af0b015384e721832b88",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"ext-json": "*", "ext-json": "*",
"maxmind-db/reader": "^1.11.1", "maxmind-db/reader": "^1.12.0",
"maxmind/web-service-common": "~0.8", "maxmind/web-service-common": "~0.10",
"php": ">=8.1" "php": ">=8.1"
}, },
"require-dev": { "require-dev": {
@ -898,9 +899,9 @@
"keywords": ["IP", "geoip", "geoip2", "geolocation", "maxmind"], "keywords": ["IP", "geoip", "geoip2", "geolocation", "maxmind"],
"support": { "support": {
"issues": "https://github.com/maxmind/GeoIP2-php/issues", "issues": "https://github.com/maxmind/GeoIP2-php/issues",
"source": "https://github.com/maxmind/GeoIP2-php/tree/v3.0.0" "source": "https://github.com/maxmind/GeoIP2-php/tree/v3.1.0"
}, },
"time": "2023-12-04T17:16:34+00:00" "time": "2024-11-15T16:33:31+00:00"
}, },
{ {
"name": "graham-campbell/result-type", "name": "graham-campbell/result-type",
@ -1410,16 +1411,16 @@
}, },
{ {
"name": "league/commonmark", "name": "league/commonmark",
"version": "2.5.3", "version": "2.6.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/thephpleague/commonmark.git", "url": "https://github.com/thephpleague/commonmark.git",
"reference": "b650144166dfa7703e62a22e493b853b58d874b0" "reference": "d150f911e0079e90ae3c106734c93137c184f932"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/thephpleague/commonmark/zipball/b650144166dfa7703e62a22e493b853b58d874b0", "url": "https://api.github.com/repos/thephpleague/commonmark/zipball/d150f911e0079e90ae3c106734c93137c184f932",
"reference": "b650144166dfa7703e62a22e493b853b58d874b0", "reference": "d150f911e0079e90ae3c106734c93137c184f932",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -1444,8 +1445,9 @@
"phpstan/phpstan": "^1.8.2", "phpstan/phpstan": "^1.8.2",
"phpunit/phpunit": "^9.5.21 || ^10.5.9 || ^11.0.0", "phpunit/phpunit": "^9.5.21 || ^10.5.9 || ^11.0.0",
"scrutinizer/ocular": "^1.8.1", "scrutinizer/ocular": "^1.8.1",
"symfony/finder": "^5.3 | ^6.0 || ^7.0", "symfony/finder": "^5.3 | ^6.0 | ^7.0",
"symfony/yaml": "^2.3 | ^3.0 | ^4.0 | ^5.0 | ^6.0 || ^7.0", "symfony/process": "^5.4 | ^6.0 | ^7.0",
"symfony/yaml": "^2.3 | ^3.0 | ^4.0 | ^5.0 | ^6.0 | ^7.0",
"unleashedtech/php-coding-standard": "^3.1.1", "unleashedtech/php-coding-standard": "^3.1.1",
"vimeo/psalm": "^4.24.0 || ^5.0.0" "vimeo/psalm": "^4.24.0 || ^5.0.0"
}, },
@ -1455,7 +1457,7 @@
"type": "library", "type": "library",
"extra": { "extra": {
"branch-alias": { "branch-alias": {
"dev-main": "2.6-dev" "dev-main": "2.7-dev"
} }
}, },
"autoload": { "autoload": {
@ -1510,7 +1512,7 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2024-08-16T11:46:16+00:00" "time": "2024-12-07T15:34:16+00:00"
}, },
{ {
"name": "league/config", "name": "league/config",
@ -1676,29 +1678,27 @@
}, },
{ {
"name": "maxmind-db/reader", "name": "maxmind-db/reader",
"version": "v1.11.1", "version": "v1.12.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/maxmind/MaxMind-DB-Reader-php.git", "url": "https://github.com/maxmind/MaxMind-DB-Reader-php.git",
"reference": "1e66f73ffcf25e17c7a910a1317e9720a95497c7" "reference": "5b2d7a721dedfaef9dc20822c5fe7d26f9f8eb90"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/maxmind/MaxMind-DB-Reader-php/zipball/1e66f73ffcf25e17c7a910a1317e9720a95497c7", "url": "https://api.github.com/repos/maxmind/MaxMind-DB-Reader-php/zipball/5b2d7a721dedfaef9dc20822c5fe7d26f9f8eb90",
"reference": "1e66f73ffcf25e17c7a910a1317e9720a95497c7", "reference": "5b2d7a721dedfaef9dc20822c5fe7d26f9f8eb90",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"php": ">=7.2" "php": ">=7.2"
}, },
"conflict": { "conflict": {
"ext-maxminddb": "<1.11.1,>=2.0.0" "ext-maxminddb": "<1.11.1 || >=2.0.0"
}, },
"require-dev": { "require-dev": {
"friendsofphp/php-cs-fixer": "3.*", "friendsofphp/php-cs-fixer": "3.*",
"php-coveralls/php-coveralls": "^2.1",
"phpstan/phpstan": "*", "phpstan/phpstan": "*",
"phpunit/phpcov": ">=6.0.0",
"phpunit/phpunit": ">=8.0.0,<10.0.0", "phpunit/phpunit": ">=8.0.0,<10.0.0",
"squizlabs/php_codesniffer": "3.*" "squizlabs/php_codesniffer": "3.*"
}, },
@ -1727,29 +1727,29 @@
"keywords": ["database", "geoip", "geoip2", "geolocation", "maxmind"], "keywords": ["database", "geoip", "geoip2", "geolocation", "maxmind"],
"support": { "support": {
"issues": "https://github.com/maxmind/MaxMind-DB-Reader-php/issues", "issues": "https://github.com/maxmind/MaxMind-DB-Reader-php/issues",
"source": "https://github.com/maxmind/MaxMind-DB-Reader-php/tree/v1.11.1" "source": "https://github.com/maxmind/MaxMind-DB-Reader-php/tree/v1.12.0"
}, },
"time": "2023-12-02T00:09:23+00:00" "time": "2024-11-14T22:43:47+00:00"
}, },
{ {
"name": "maxmind/web-service-common", "name": "maxmind/web-service-common",
"version": "v0.9.0", "version": "v0.10.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/maxmind/web-service-common-php.git", "url": "https://github.com/maxmind/web-service-common-php.git",
"reference": "4dc5a3e8df38aea4ca3b1096cee3a038094e9b53" "reference": "d7c7c42fc31bff26e0ded73a6e187bcfb193f9c4"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/maxmind/web-service-common-php/zipball/4dc5a3e8df38aea4ca3b1096cee3a038094e9b53", "url": "https://api.github.com/repos/maxmind/web-service-common-php/zipball/d7c7c42fc31bff26e0ded73a6e187bcfb193f9c4",
"reference": "4dc5a3e8df38aea4ca3b1096cee3a038094e9b53", "reference": "d7c7c42fc31bff26e0ded73a6e187bcfb193f9c4",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"composer/ca-bundle": "^1.0.3", "composer/ca-bundle": "^1.0.3",
"ext-curl": "*", "ext-curl": "*",
"ext-json": "*", "ext-json": "*",
"php": ">=7.2" "php": ">=8.1"
}, },
"require-dev": { "require-dev": {
"friendsofphp/php-cs-fixer": "3.*", "friendsofphp/php-cs-fixer": "3.*",
@ -1776,9 +1776,9 @@
"homepage": "https://github.com/maxmind/web-service-common-php", "homepage": "https://github.com/maxmind/web-service-common-php",
"support": { "support": {
"issues": "https://github.com/maxmind/web-service-common-php/issues", "issues": "https://github.com/maxmind/web-service-common-php/issues",
"source": "https://github.com/maxmind/web-service-common-php/tree/v0.9.0" "source": "https://github.com/maxmind/web-service-common-php/tree/v0.10.0"
}, },
"time": "2022-03-28T17:43:20+00:00" "time": "2024-11-14T23:14:52+00:00"
}, },
{ {
"name": "melbahja/seo", "name": "melbahja/seo",
@ -2250,16 +2250,16 @@
}, },
{ {
"name": "phpseclib/phpseclib", "name": "phpseclib/phpseclib",
"version": "2.0.47", "version": "2.0.48",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/phpseclib/phpseclib.git", "url": "https://github.com/phpseclib/phpseclib.git",
"reference": "b7d7d90ee7df7f33a664b4aea32d50a305d35adb" "reference": "eaa7be704b8b93a6913b69eb7f645a59d7731b61"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/phpseclib/phpseclib/zipball/b7d7d90ee7df7f33a664b4aea32d50a305d35adb", "url": "https://api.github.com/repos/phpseclib/phpseclib/zipball/eaa7be704b8b93a6913b69eb7f645a59d7731b61",
"reference": "b7d7d90ee7df7f33a664b4aea32d50a305d35adb", "reference": "eaa7be704b8b93a6913b69eb7f645a59d7731b61",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -2336,7 +2336,7 @@
], ],
"support": { "support": {
"issues": "https://github.com/phpseclib/phpseclib/issues", "issues": "https://github.com/phpseclib/phpseclib/issues",
"source": "https://github.com/phpseclib/phpseclib/tree/2.0.47" "source": "https://github.com/phpseclib/phpseclib/tree/2.0.48"
}, },
"funding": [ "funding": [
{ {
@ -2352,7 +2352,7 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2024-02-26T04:55:38+00:00" "time": "2024-12-14T21:03:54+00:00"
}, },
{ {
"name": "psr/cache", "name": "psr/cache",
@ -2840,16 +2840,16 @@
}, },
{ {
"name": "symfony/deprecation-contracts", "name": "symfony/deprecation-contracts",
"version": "v3.5.0", "version": "v3.5.1",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/deprecation-contracts.git", "url": "https://github.com/symfony/deprecation-contracts.git",
"reference": "0e0d29ce1f20deffb4ab1b016a7257c4f1e789a1" "reference": "74c71c939a79f7d5bf3c1ce9f5ea37ba0114c6f6"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/0e0d29ce1f20deffb4ab1b016a7257c4f1e789a1", "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/74c71c939a79f7d5bf3c1ce9f5ea37ba0114c6f6",
"reference": "0e0d29ce1f20deffb4ab1b016a7257c4f1e789a1", "reference": "74c71c939a79f7d5bf3c1ce9f5ea37ba0114c6f6",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -2883,7 +2883,7 @@
"description": "A generic function and convention to trigger deprecation notices", "description": "A generic function and convention to trigger deprecation notices",
"homepage": "https://symfony.com", "homepage": "https://symfony.com",
"support": { "support": {
"source": "https://github.com/symfony/deprecation-contracts/tree/v3.5.0" "source": "https://github.com/symfony/deprecation-contracts/tree/v3.5.1"
}, },
"funding": [ "funding": [
{ {
@ -2899,7 +2899,7 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2024-04-18T09:32:20+00:00" "time": "2024-09-25T14:20:29+00:00"
}, },
{ {
"name": "symfony/polyfill-ctype", "name": "symfony/polyfill-ctype",
@ -2927,8 +2927,8 @@
"type": "library", "type": "library",
"extra": { "extra": {
"thanks": { "thanks": {
"name": "symfony/polyfill", "url": "https://github.com/symfony/polyfill",
"url": "https://github.com/symfony/polyfill" "name": "symfony/polyfill"
} }
}, },
"autoload": { "autoload": {
@ -2997,8 +2997,8 @@
"type": "library", "type": "library",
"extra": { "extra": {
"thanks": { "thanks": {
"name": "symfony/polyfill", "url": "https://github.com/symfony/polyfill",
"url": "https://github.com/symfony/polyfill" "name": "symfony/polyfill"
} }
}, },
"autoload": { "autoload": {
@ -3061,8 +3061,8 @@
"type": "library", "type": "library",
"extra": { "extra": {
"thanks": { "thanks": {
"name": "symfony/polyfill", "url": "https://github.com/symfony/polyfill",
"url": "https://github.com/symfony/polyfill" "name": "symfony/polyfill"
} }
}, },
"autoload": { "autoload": {
@ -3348,16 +3348,16 @@
"packages-dev": [ "packages-dev": [
{ {
"name": "captainhook/captainhook", "name": "captainhook/captainhook",
"version": "5.23.6", "version": "5.24.1",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/captainhookphp/captainhook.git", "url": "https://github.com/captainhookphp/captainhook.git",
"reference": "6c9a60f5771581f3788f98d7b4aa9a61156cfebb" "reference": "1e56452fd7a7e486e5955ab72dc9ea34bb52a184"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/captainhookphp/captainhook/zipball/6c9a60f5771581f3788f98d7b4aa9a61156cfebb", "url": "https://api.github.com/repos/captainhookphp/captainhook/zipball/1e56452fd7a7e486e5955ab72dc9ea34bb52a184",
"reference": "6c9a60f5771581f3788f98d7b4aa9a61156cfebb", "reference": "1e56452fd7a7e486e5955ab72dc9ea34bb52a184",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -3416,7 +3416,7 @@
], ],
"support": { "support": {
"issues": "https://github.com/captainhookphp/captainhook/issues", "issues": "https://github.com/captainhookphp/captainhook/issues",
"source": "https://github.com/captainhookphp/captainhook/tree/5.23.6" "source": "https://github.com/captainhookphp/captainhook/tree/5.24.1"
}, },
"funding": [ "funding": [
{ {
@ -3424,20 +3424,20 @@
"type": "github" "type": "github"
} }
], ],
"time": "2024-10-30T14:15:58+00:00" "time": "2024-11-26T18:42:37+00:00"
}, },
{ {
"name": "captainhook/secrets", "name": "captainhook/secrets",
"version": "0.9.5", "version": "0.9.6",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/captainhookphp/secrets.git", "url": "https://github.com/captainhookphp/secrets.git",
"reference": "8aa90d5b9b7892abd11b9da2fc172a7b32b90cbe" "reference": "0232c67019e11c4bee4ee9bfec9575b67e0854e5"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/captainhookphp/secrets/zipball/8aa90d5b9b7892abd11b9da2fc172a7b32b90cbe", "url": "https://api.github.com/repos/captainhookphp/secrets/zipball/0232c67019e11c4bee4ee9bfec9575b67e0854e5",
"reference": "8aa90d5b9b7892abd11b9da2fc172a7b32b90cbe", "reference": "0232c67019e11c4bee4ee9bfec9575b67e0854e5",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -3470,7 +3470,7 @@
], ],
"support": { "support": {
"issues": "https://github.com/captainhookphp/secrets/issues", "issues": "https://github.com/captainhookphp/secrets/issues",
"source": "https://github.com/captainhookphp/secrets/tree/0.9.5" "source": "https://github.com/captainhookphp/secrets/tree/0.9.6"
}, },
"funding": [ "funding": [
{ {
@ -3478,7 +3478,7 @@
"type": "github" "type": "github"
} }
], ],
"time": "2023-11-30T18:10:18+00:00" "time": "2024-11-26T09:24:19+00:00"
}, },
{ {
"name": "clue/ndjson-react", "name": "clue/ndjson-react",
@ -3544,38 +3544,36 @@
}, },
{ {
"name": "codeigniter/phpstan-codeigniter", "name": "codeigniter/phpstan-codeigniter",
"version": "v1.4.3", "version": "v1.5.1",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/CodeIgniter/phpstan-codeigniter.git", "url": "https://github.com/CodeIgniter/phpstan-codeigniter.git",
"reference": "bff4a7cfe251bb288223e95d6f588e956dfc0a93" "reference": "4bfaba879007c7dfb9c3b687713bd5d45524f067"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/CodeIgniter/phpstan-codeigniter/zipball/bff4a7cfe251bb288223e95d6f588e956dfc0a93", "url": "https://api.github.com/repos/CodeIgniter/phpstan-codeigniter/zipball/4bfaba879007c7dfb9c3b687713bd5d45524f067",
"reference": "bff4a7cfe251bb288223e95d6f588e956dfc0a93", "reference": "4bfaba879007c7dfb9c3b687713bd5d45524f067",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"codeigniter4/framework": "^4.4", "codeigniter4/framework": "^4.5",
"php": "^8.1", "php": "^8.1",
"phpstan/phpstan": "^1.10" "phpstan/phpstan": "^2.0"
}, },
"conflict": { "conflict": {
"codeigniter/framework": "*" "codeigniter/framework": "*"
}, },
"require-dev": { "require-dev": {
"codeigniter/coding-standard": "^1.7", "codeigniter/coding-standard": "^1.7",
"codeigniter4/shield": "^1.0@beta", "codeigniter4/shield": "^1.0",
"friendsofphp/php-cs-fixer": "^3.20", "friendsofphp/php-cs-fixer": "^3.49",
"nexusphp/cs-config": "^3.12", "nexusphp/cs-config": "^3.21",
"php-parallel-lint/php-parallel-lint": "^1.3",
"phpstan/extension-installer": "^1.3", "phpstan/extension-installer": "^1.3",
"phpstan/phpstan-deprecation-rules": "^1.1", "phpstan/phpstan-deprecation-rules": "^2.0",
"phpstan/phpstan-phpunit": "^1.3", "phpstan/phpstan-phpunit": "^2.0",
"phpstan/phpstan-strict-rules": "^1.5", "phpstan/phpstan-strict-rules": "^2.0",
"phpunit/phpunit": "^10.2", "phpunit/phpunit": "^10.5 || ^11.4"
"rector/rector": "^0.18.2"
}, },
"type": "phpstan-extension", "type": "phpstan-extension",
"extra": { "extra": {
@ -3610,20 +3608,20 @@
"slack": "https://codeigniterchat.slack.com", "slack": "https://codeigniterchat.slack.com",
"source": "https://github.com/CodeIgniter/phpstan-codeigniter" "source": "https://github.com/CodeIgniter/phpstan-codeigniter"
}, },
"time": "2023-12-21T03:39:48+00:00" "time": "2024-12-02T15:33:25+00:00"
}, },
{ {
"name": "composer/pcre", "name": "composer/pcre",
"version": "3.3.1", "version": "3.3.2",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/composer/pcre.git", "url": "https://github.com/composer/pcre.git",
"reference": "63aaeac21d7e775ff9bc9d45021e1745c97521c4" "reference": "b2bed4734f0cc156ee1fe9c0da2550420d99a21e"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/composer/pcre/zipball/63aaeac21d7e775ff9bc9d45021e1745c97521c4", "url": "https://api.github.com/repos/composer/pcre/zipball/b2bed4734f0cc156ee1fe9c0da2550420d99a21e",
"reference": "63aaeac21d7e775ff9bc9d45021e1745c97521c4", "reference": "b2bed4734f0cc156ee1fe9c0da2550420d99a21e",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -3633,8 +3631,8 @@
"phpstan/phpstan": "<1.11.10" "phpstan/phpstan": "<1.11.10"
}, },
"require-dev": { "require-dev": {
"phpstan/phpstan": "^1.11.10", "phpstan/phpstan": "^1.12 || ^2",
"phpstan/phpstan-strict-rules": "^1.1", "phpstan/phpstan-strict-rules": "^1 || ^2",
"phpunit/phpunit": "^8 || ^9" "phpunit/phpunit": "^8 || ^9"
}, },
"type": "library", "type": "library",
@ -3664,7 +3662,7 @@
"keywords": ["PCRE", "preg", "regex", "regular expression"], "keywords": ["PCRE", "preg", "regex", "regular expression"],
"support": { "support": {
"issues": "https://github.com/composer/pcre/issues", "issues": "https://github.com/composer/pcre/issues",
"source": "https://github.com/composer/pcre/tree/3.3.1" "source": "https://github.com/composer/pcre/tree/3.3.2"
}, },
"funding": [ "funding": [
{ {
@ -3680,7 +3678,7 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2024-08-27T18:44:43+00:00" "time": "2024-11-12T16:29:46+00:00"
}, },
{ {
"name": "composer/semver", "name": "composer/semver",
@ -3917,16 +3915,16 @@
}, },
{ {
"name": "friendsofphp/php-cs-fixer", "name": "friendsofphp/php-cs-fixer",
"version": "v3.64.0", "version": "v3.65.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer.git", "url": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer.git",
"reference": "58dd9c931c785a79739310aef5178928305ffa67" "reference": "79d4f3e77b250a7d8043d76c6af8f0695e8a469f"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/58dd9c931c785a79739310aef5178928305ffa67", "url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/79d4f3e77b250a7d8043d76c6af8f0695e8a469f",
"reference": "58dd9c931c785a79739310aef5178928305ffa67", "reference": "79d4f3e77b250a7d8043d76c6af8f0695e8a469f",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -3936,7 +3934,7 @@
"ext-filter": "*", "ext-filter": "*",
"ext-json": "*", "ext-json": "*",
"ext-tokenizer": "*", "ext-tokenizer": "*",
"fidry/cpu-core-counter": "^1.0", "fidry/cpu-core-counter": "^1.2",
"php": "^7.4 || ^8.0", "php": "^7.4 || ^8.0",
"react/child-process": "^0.6.5", "react/child-process": "^0.6.5",
"react/event-loop": "^1.0", "react/event-loop": "^1.0",
@ -3956,18 +3954,18 @@
"symfony/stopwatch": "^5.4 || ^6.0 || ^7.0" "symfony/stopwatch": "^5.4 || ^6.0 || ^7.0"
}, },
"require-dev": { "require-dev": {
"facile-it/paraunit": "^1.3 || ^2.3", "facile-it/paraunit": "^1.3.1 || ^2.4",
"infection/infection": "^0.29.5", "infection/infection": "^0.29.8",
"justinrainbow/json-schema": "^5.2", "justinrainbow/json-schema": "^5.3 || ^6.0",
"keradus/cli-executor": "^2.1", "keradus/cli-executor": "^2.1",
"mikey179/vfsstream": "^1.6.11", "mikey179/vfsstream": "^1.6.12",
"php-coveralls/php-coveralls": "^2.7", "php-coveralls/php-coveralls": "^2.7",
"php-cs-fixer/accessible-object": "^1.1", "php-cs-fixer/accessible-object": "^1.1",
"php-cs-fixer/phpunit-constraint-isidenticalstring": "^1.5", "php-cs-fixer/phpunit-constraint-isidenticalstring": "^1.5",
"php-cs-fixer/phpunit-constraint-xmlmatchesxsd": "^1.5", "php-cs-fixer/phpunit-constraint-xmlmatchesxsd": "^1.5",
"phpunit/phpunit": "^9.6.19 || ^10.5.21 || ^11.2", "phpunit/phpunit": "^9.6.21 || ^10.5.38 || ^11.4.3",
"symfony/var-dumper": "^5.4 || ^6.0 || ^7.0", "symfony/var-dumper": "^5.4.47 || ^6.4.15 || ^7.1.8",
"symfony/yaml": "^5.4 || ^6.0 || ^7.0" "symfony/yaml": "^5.4.45 || ^6.4.13 || ^7.1.6"
}, },
"suggest": { "suggest": {
"ext-dom": "For handling output formats in XML", "ext-dom": "For handling output formats in XML",
@ -4002,7 +4000,7 @@
], ],
"support": { "support": {
"issues": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/issues", "issues": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/issues",
"source": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/tree/v3.64.0" "source": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/tree/v3.65.0"
}, },
"funding": [ "funding": [
{ {
@ -4010,7 +4008,7 @@
"type": "github" "type": "github"
} }
], ],
"time": "2024-08-30T23:09:38+00:00" "time": "2024-11-25T00:39:24+00:00"
}, },
{ {
"name": "mikey179/vfsstream", "name": "mikey179/vfsstream",
@ -4064,16 +4062,16 @@
}, },
{ {
"name": "myclabs/deep-copy", "name": "myclabs/deep-copy",
"version": "1.12.0", "version": "1.12.1",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/myclabs/DeepCopy.git", "url": "https://github.com/myclabs/DeepCopy.git",
"reference": "3a6b9a42cd8f8771bd4295d13e1423fa7f3d942c" "reference": "123267b2c49fbf30d78a7b2d333f6be754b94845"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/3a6b9a42cd8f8771bd4295d13e1423fa7f3d942c", "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/123267b2c49fbf30d78a7b2d333f6be754b94845",
"reference": "3a6b9a42cd8f8771bd4295d13e1423fa7f3d942c", "reference": "123267b2c49fbf30d78a7b2d333f6be754b94845",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -4102,7 +4100,7 @@
"keywords": ["clone", "copy", "duplicate", "object", "object graph"], "keywords": ["clone", "copy", "duplicate", "object", "object graph"],
"support": { "support": {
"issues": "https://github.com/myclabs/DeepCopy/issues", "issues": "https://github.com/myclabs/DeepCopy/issues",
"source": "https://github.com/myclabs/DeepCopy/tree/1.12.0" "source": "https://github.com/myclabs/DeepCopy/tree/1.12.1"
}, },
"funding": [ "funding": [
{ {
@ -4110,7 +4108,7 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2024-06-12T14:39:25+00:00" "time": "2024-11-08T17:47:46+00:00"
}, },
{ {
"name": "nikic/php-parser", "name": "nikic/php-parser",
@ -4318,20 +4316,20 @@
}, },
{ {
"name": "phpstan/phpstan", "name": "phpstan/phpstan",
"version": "1.12.7", "version": "2.0.3",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/phpstan/phpstan.git", "url": "https://github.com/phpstan/phpstan.git",
"reference": "dc2b9976bd8b0f84ec9b0e50cc35378551de7af0" "reference": "46b4d3529b12178112d9008337beda0cc2a1a6b4"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/phpstan/phpstan/zipball/dc2b9976bd8b0f84ec9b0e50cc35378551de7af0", "url": "https://api.github.com/repos/phpstan/phpstan/zipball/46b4d3529b12178112d9008337beda0cc2a1a6b4",
"reference": "dc2b9976bd8b0f84ec9b0e50cc35378551de7af0", "reference": "46b4d3529b12178112d9008337beda0cc2a1a6b4",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"php": "^7.2|^8.0" "php": "^7.4|^8.0"
}, },
"conflict": { "conflict": {
"phpstan/phpstan-shim": "*" "phpstan/phpstan-shim": "*"
@ -4362,39 +4360,39 @@
"type": "github" "type": "github"
} }
], ],
"time": "2024-10-18T11:12:07+00:00" "time": "2024-11-28T22:19:37+00:00"
}, },
{ {
"name": "phpunit/php-code-coverage", "name": "phpunit/php-code-coverage",
"version": "10.1.16", "version": "11.0.8",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/sebastianbergmann/php-code-coverage.git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git",
"reference": "7e308268858ed6baedc8704a304727d20bc07c77" "reference": "418c59fd080954f8c4aa5631d9502ecda2387118"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/7e308268858ed6baedc8704a304727d20bc07c77", "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/418c59fd080954f8c4aa5631d9502ecda2387118",
"reference": "7e308268858ed6baedc8704a304727d20bc07c77", "reference": "418c59fd080954f8c4aa5631d9502ecda2387118",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"ext-dom": "*", "ext-dom": "*",
"ext-libxml": "*", "ext-libxml": "*",
"ext-xmlwriter": "*", "ext-xmlwriter": "*",
"nikic/php-parser": "^4.19.1 || ^5.1.0", "nikic/php-parser": "^5.3.1",
"php": ">=8.1", "php": ">=8.2",
"phpunit/php-file-iterator": "^4.1.0", "phpunit/php-file-iterator": "^5.1.0",
"phpunit/php-text-template": "^3.0.1", "phpunit/php-text-template": "^4.0.1",
"sebastian/code-unit-reverse-lookup": "^3.0.0", "sebastian/code-unit-reverse-lookup": "^4.0.1",
"sebastian/complexity": "^3.2.0", "sebastian/complexity": "^4.0.1",
"sebastian/environment": "^6.1.0", "sebastian/environment": "^7.2.0",
"sebastian/lines-of-code": "^2.0.2", "sebastian/lines-of-code": "^3.0.1",
"sebastian/version": "^4.0.1", "sebastian/version": "^5.0.2",
"theseer/tokenizer": "^1.2.3" "theseer/tokenizer": "^1.2.3"
}, },
"require-dev": { "require-dev": {
"phpunit/phpunit": "^10.1" "phpunit/phpunit": "^11.5.0"
}, },
"suggest": { "suggest": {
"ext-pcov": "PHP extension that provides line coverage", "ext-pcov": "PHP extension that provides line coverage",
@ -4403,7 +4401,7 @@
"type": "library", "type": "library",
"extra": { "extra": {
"branch-alias": { "branch-alias": {
"dev-main": "10.1.x-dev" "dev-main": "11.0.x-dev"
} }
}, },
"autoload": { "autoload": {
@ -4424,7 +4422,7 @@
"support": { "support": {
"issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues",
"security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy", "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy",
"source": "https://github.com/sebastianbergmann/php-code-coverage/tree/10.1.16" "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/11.0.8"
}, },
"funding": [ "funding": [
{ {
@ -4432,32 +4430,32 @@
"type": "github" "type": "github"
} }
], ],
"time": "2024-08-22T04:31:57+00:00" "time": "2024-12-11T12:34:27+00:00"
}, },
{ {
"name": "phpunit/php-file-iterator", "name": "phpunit/php-file-iterator",
"version": "4.1.0", "version": "5.1.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/sebastianbergmann/php-file-iterator.git", "url": "https://github.com/sebastianbergmann/php-file-iterator.git",
"reference": "a95037b6d9e608ba092da1b23931e537cadc3c3c" "reference": "118cfaaa8bc5aef3287bf315b6060b1174754af6"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/a95037b6d9e608ba092da1b23931e537cadc3c3c", "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/118cfaaa8bc5aef3287bf315b6060b1174754af6",
"reference": "a95037b6d9e608ba092da1b23931e537cadc3c3c", "reference": "118cfaaa8bc5aef3287bf315b6060b1174754af6",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"php": ">=8.1" "php": ">=8.2"
}, },
"require-dev": { "require-dev": {
"phpunit/phpunit": "^10.0" "phpunit/phpunit": "^11.0"
}, },
"type": "library", "type": "library",
"extra": { "extra": {
"branch-alias": { "branch-alias": {
"dev-main": "4.0-dev" "dev-main": "5.0-dev"
} }
}, },
"autoload": { "autoload": {
@ -4478,7 +4476,7 @@
"support": { "support": {
"issues": "https://github.com/sebastianbergmann/php-file-iterator/issues", "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues",
"security": "https://github.com/sebastianbergmann/php-file-iterator/security/policy", "security": "https://github.com/sebastianbergmann/php-file-iterator/security/policy",
"source": "https://github.com/sebastianbergmann/php-file-iterator/tree/4.1.0" "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/5.1.0"
}, },
"funding": [ "funding": [
{ {
@ -4486,28 +4484,28 @@
"type": "github" "type": "github"
} }
], ],
"time": "2023-08-31T06:24:48+00:00" "time": "2024-08-27T05:02:59+00:00"
}, },
{ {
"name": "phpunit/php-invoker", "name": "phpunit/php-invoker",
"version": "4.0.0", "version": "5.0.1",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/sebastianbergmann/php-invoker.git", "url": "https://github.com/sebastianbergmann/php-invoker.git",
"reference": "f5e568ba02fa5ba0ddd0f618391d5a9ea50b06d7" "reference": "c1ca3814734c07492b3d4c5f794f4b0995333da2"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/f5e568ba02fa5ba0ddd0f618391d5a9ea50b06d7", "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/c1ca3814734c07492b3d4c5f794f4b0995333da2",
"reference": "f5e568ba02fa5ba0ddd0f618391d5a9ea50b06d7", "reference": "c1ca3814734c07492b3d4c5f794f4b0995333da2",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"php": ">=8.1" "php": ">=8.2"
}, },
"require-dev": { "require-dev": {
"ext-pcntl": "*", "ext-pcntl": "*",
"phpunit/phpunit": "^10.0" "phpunit/phpunit": "^11.0"
}, },
"suggest": { "suggest": {
"ext-pcntl": "*" "ext-pcntl": "*"
@ -4515,7 +4513,7 @@
"type": "library", "type": "library",
"extra": { "extra": {
"branch-alias": { "branch-alias": {
"dev-main": "4.0-dev" "dev-main": "5.0-dev"
} }
}, },
"autoload": { "autoload": {
@ -4535,7 +4533,8 @@
"keywords": ["process"], "keywords": ["process"],
"support": { "support": {
"issues": "https://github.com/sebastianbergmann/php-invoker/issues", "issues": "https://github.com/sebastianbergmann/php-invoker/issues",
"source": "https://github.com/sebastianbergmann/php-invoker/tree/4.0.0" "security": "https://github.com/sebastianbergmann/php-invoker/security/policy",
"source": "https://github.com/sebastianbergmann/php-invoker/tree/5.0.1"
}, },
"funding": [ "funding": [
{ {
@ -4543,32 +4542,32 @@
"type": "github" "type": "github"
} }
], ],
"time": "2023-02-03T06:56:09+00:00" "time": "2024-07-03T05:07:44+00:00"
}, },
{ {
"name": "phpunit/php-text-template", "name": "phpunit/php-text-template",
"version": "3.0.1", "version": "4.0.1",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/sebastianbergmann/php-text-template.git", "url": "https://github.com/sebastianbergmann/php-text-template.git",
"reference": "0c7b06ff49e3d5072f057eb1fa59258bf287a748" "reference": "3e0404dc6b300e6bf56415467ebcb3fe4f33e964"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/0c7b06ff49e3d5072f057eb1fa59258bf287a748", "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/3e0404dc6b300e6bf56415467ebcb3fe4f33e964",
"reference": "0c7b06ff49e3d5072f057eb1fa59258bf287a748", "reference": "3e0404dc6b300e6bf56415467ebcb3fe4f33e964",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"php": ">=8.1" "php": ">=8.2"
}, },
"require-dev": { "require-dev": {
"phpunit/phpunit": "^10.0" "phpunit/phpunit": "^11.0"
}, },
"type": "library", "type": "library",
"extra": { "extra": {
"branch-alias": { "branch-alias": {
"dev-main": "3.0-dev" "dev-main": "4.0-dev"
} }
}, },
"autoload": { "autoload": {
@ -4589,7 +4588,7 @@
"support": { "support": {
"issues": "https://github.com/sebastianbergmann/php-text-template/issues", "issues": "https://github.com/sebastianbergmann/php-text-template/issues",
"security": "https://github.com/sebastianbergmann/php-text-template/security/policy", "security": "https://github.com/sebastianbergmann/php-text-template/security/policy",
"source": "https://github.com/sebastianbergmann/php-text-template/tree/3.0.1" "source": "https://github.com/sebastianbergmann/php-text-template/tree/4.0.1"
}, },
"funding": [ "funding": [
{ {
@ -4597,32 +4596,32 @@
"type": "github" "type": "github"
} }
], ],
"time": "2023-08-31T14:07:24+00:00" "time": "2024-07-03T05:08:43+00:00"
}, },
{ {
"name": "phpunit/php-timer", "name": "phpunit/php-timer",
"version": "6.0.0", "version": "7.0.1",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/sebastianbergmann/php-timer.git", "url": "https://github.com/sebastianbergmann/php-timer.git",
"reference": "e2a2d67966e740530f4a3343fe2e030ffdc1161d" "reference": "3b415def83fbcb41f991d9ebf16ae4ad8b7837b3"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/e2a2d67966e740530f4a3343fe2e030ffdc1161d", "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/3b415def83fbcb41f991d9ebf16ae4ad8b7837b3",
"reference": "e2a2d67966e740530f4a3343fe2e030ffdc1161d", "reference": "3b415def83fbcb41f991d9ebf16ae4ad8b7837b3",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"php": ">=8.1" "php": ">=8.2"
}, },
"require-dev": { "require-dev": {
"phpunit/phpunit": "^10.0" "phpunit/phpunit": "^11.0"
}, },
"type": "library", "type": "library",
"extra": { "extra": {
"branch-alias": { "branch-alias": {
"dev-main": "6.0-dev" "dev-main": "7.0-dev"
} }
}, },
"autoload": { "autoload": {
@ -4642,7 +4641,8 @@
"keywords": ["timer"], "keywords": ["timer"],
"support": { "support": {
"issues": "https://github.com/sebastianbergmann/php-timer/issues", "issues": "https://github.com/sebastianbergmann/php-timer/issues",
"source": "https://github.com/sebastianbergmann/php-timer/tree/6.0.0" "security": "https://github.com/sebastianbergmann/php-timer/security/policy",
"source": "https://github.com/sebastianbergmann/php-timer/tree/7.0.1"
}, },
"funding": [ "funding": [
{ {
@ -4650,20 +4650,20 @@
"type": "github" "type": "github"
} }
], ],
"time": "2023-02-03T06:57:52+00:00" "time": "2024-07-03T05:09:35+00:00"
}, },
{ {
"name": "phpunit/phpunit", "name": "phpunit/phpunit",
"version": "10.5.38", "version": "11.5.1",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/sebastianbergmann/phpunit.git", "url": "https://github.com/sebastianbergmann/phpunit.git",
"reference": "a86773b9e887a67bc53efa9da9ad6e3f2498c132" "reference": "2b94d4f2450b9869fa64a46fd8a6a41997aef56a"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/a86773b9e887a67bc53efa9da9ad6e3f2498c132", "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/2b94d4f2450b9869fa64a46fd8a6a41997aef56a",
"reference": "a86773b9e887a67bc53efa9da9ad6e3f2498c132", "reference": "2b94d4f2450b9869fa64a46fd8a6a41997aef56a",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -4673,26 +4673,26 @@
"ext-mbstring": "*", "ext-mbstring": "*",
"ext-xml": "*", "ext-xml": "*",
"ext-xmlwriter": "*", "ext-xmlwriter": "*",
"myclabs/deep-copy": "^1.12.0", "myclabs/deep-copy": "^1.12.1",
"phar-io/manifest": "^2.0.4", "phar-io/manifest": "^2.0.4",
"phar-io/version": "^3.2.1", "phar-io/version": "^3.2.1",
"php": ">=8.1", "php": ">=8.2",
"phpunit/php-code-coverage": "^10.1.16", "phpunit/php-code-coverage": "^11.0.7",
"phpunit/php-file-iterator": "^4.1.0", "phpunit/php-file-iterator": "^5.1.0",
"phpunit/php-invoker": "^4.0.0", "phpunit/php-invoker": "^5.0.1",
"phpunit/php-text-template": "^3.0.1", "phpunit/php-text-template": "^4.0.1",
"phpunit/php-timer": "^6.0.0", "phpunit/php-timer": "^7.0.1",
"sebastian/cli-parser": "^2.0.1", "sebastian/cli-parser": "^3.0.2",
"sebastian/code-unit": "^2.0.0", "sebastian/code-unit": "^3.0.1",
"sebastian/comparator": "^5.0.3", "sebastian/comparator": "^6.2.1",
"sebastian/diff": "^5.1.1", "sebastian/diff": "^6.0.2",
"sebastian/environment": "^6.1.0", "sebastian/environment": "^7.2.0",
"sebastian/exporter": "^5.1.2", "sebastian/exporter": "^6.3.0",
"sebastian/global-state": "^6.0.2", "sebastian/global-state": "^7.0.2",
"sebastian/object-enumerator": "^5.0.0", "sebastian/object-enumerator": "^6.0.1",
"sebastian/recursion-context": "^5.0.0", "sebastian/type": "^5.1.0",
"sebastian/type": "^4.0.0", "sebastian/version": "^5.0.2",
"sebastian/version": "^4.0.1" "staabm/side-effects-detector": "^1.0.5"
}, },
"suggest": { "suggest": {
"ext-soap": "To be able to generate mocks based on WSDL files" "ext-soap": "To be able to generate mocks based on WSDL files"
@ -4701,7 +4701,7 @@
"type": "library", "type": "library",
"extra": { "extra": {
"branch-alias": { "branch-alias": {
"dev-main": "10.5-dev" "dev-main": "11.5-dev"
} }
}, },
"autoload": { "autoload": {
@ -4723,7 +4723,7 @@
"support": { "support": {
"issues": "https://github.com/sebastianbergmann/phpunit/issues", "issues": "https://github.com/sebastianbergmann/phpunit/issues",
"security": "https://github.com/sebastianbergmann/phpunit/security/policy", "security": "https://github.com/sebastianbergmann/phpunit/security/policy",
"source": "https://github.com/sebastianbergmann/phpunit/tree/10.5.38" "source": "https://github.com/sebastianbergmann/phpunit/tree/11.5.1"
}, },
"funding": [ "funding": [
{ {
@ -4739,7 +4739,7 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2024-10-28T13:06:21+00:00" "time": "2024-12-11T10:52:48+00:00"
}, },
{ {
"name": "psr/container", "name": "psr/container",
@ -5282,21 +5282,21 @@
}, },
{ {
"name": "rector/rector", "name": "rector/rector",
"version": "1.2.9", "version": "2.0.3",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/rectorphp/rector.git", "url": "https://github.com/rectorphp/rector.git",
"reference": "7923bd5e48f8c26a922df91f7174f5bca2b3671d" "reference": "3f27091368bd935dbbaa8387099792fb20f65f68"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/rectorphp/rector/zipball/7923bd5e48f8c26a922df91f7174f5bca2b3671d", "url": "https://api.github.com/repos/rectorphp/rector/zipball/3f27091368bd935dbbaa8387099792fb20f65f68",
"reference": "7923bd5e48f8c26a922df91f7174f5bca2b3671d", "reference": "3f27091368bd935dbbaa8387099792fb20f65f68",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"php": "^7.2|^8.0", "php": "^7.4|^8.0",
"phpstan/phpstan": "^1.12.5" "phpstan/phpstan": "^2.0.1"
}, },
"conflict": { "conflict": {
"rector/rector-doctrine": "*", "rector/rector-doctrine": "*",
@ -5318,7 +5318,7 @@
"keywords": ["automation", "dev", "migration", "refactoring"], "keywords": ["automation", "dev", "migration", "refactoring"],
"support": { "support": {
"issues": "https://github.com/rectorphp/rector/issues", "issues": "https://github.com/rectorphp/rector/issues",
"source": "https://github.com/rectorphp/rector/tree/1.2.9" "source": "https://github.com/rectorphp/rector/tree/2.0.3"
}, },
"funding": [ "funding": [
{ {
@ -5326,32 +5326,32 @@
"type": "github" "type": "github"
} }
], ],
"time": "2024-11-04T18:26:57+00:00" "time": "2024-12-12T15:22:19+00:00"
}, },
{ {
"name": "sebastian/cli-parser", "name": "sebastian/cli-parser",
"version": "2.0.1", "version": "3.0.2",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/sebastianbergmann/cli-parser.git", "url": "https://github.com/sebastianbergmann/cli-parser.git",
"reference": "c34583b87e7b7a8055bf6c450c2c77ce32a24084" "reference": "15c5dd40dc4f38794d383bb95465193f5e0ae180"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/c34583b87e7b7a8055bf6c450c2c77ce32a24084", "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/15c5dd40dc4f38794d383bb95465193f5e0ae180",
"reference": "c34583b87e7b7a8055bf6c450c2c77ce32a24084", "reference": "15c5dd40dc4f38794d383bb95465193f5e0ae180",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"php": ">=8.1" "php": ">=8.2"
}, },
"require-dev": { "require-dev": {
"phpunit/phpunit": "^10.0" "phpunit/phpunit": "^11.0"
}, },
"type": "library", "type": "library",
"extra": { "extra": {
"branch-alias": { "branch-alias": {
"dev-main": "2.0-dev" "dev-main": "3.0-dev"
} }
}, },
"autoload": { "autoload": {
@ -5371,7 +5371,7 @@
"support": { "support": {
"issues": "https://github.com/sebastianbergmann/cli-parser/issues", "issues": "https://github.com/sebastianbergmann/cli-parser/issues",
"security": "https://github.com/sebastianbergmann/cli-parser/security/policy", "security": "https://github.com/sebastianbergmann/cli-parser/security/policy",
"source": "https://github.com/sebastianbergmann/cli-parser/tree/2.0.1" "source": "https://github.com/sebastianbergmann/cli-parser/tree/3.0.2"
}, },
"funding": [ "funding": [
{ {
@ -5379,32 +5379,32 @@
"type": "github" "type": "github"
} }
], ],
"time": "2024-03-02T07:12:49+00:00" "time": "2024-07-03T04:41:36+00:00"
}, },
{ {
"name": "sebastian/code-unit", "name": "sebastian/code-unit",
"version": "2.0.0", "version": "3.0.2",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/sebastianbergmann/code-unit.git", "url": "https://github.com/sebastianbergmann/code-unit.git",
"reference": "a81fee9eef0b7a76af11d121767abc44c104e503" "reference": "ee88b0cdbe74cf8dd3b54940ff17643c0d6543ca"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/code-unit/zipball/a81fee9eef0b7a76af11d121767abc44c104e503", "url": "https://api.github.com/repos/sebastianbergmann/code-unit/zipball/ee88b0cdbe74cf8dd3b54940ff17643c0d6543ca",
"reference": "a81fee9eef0b7a76af11d121767abc44c104e503", "reference": "ee88b0cdbe74cf8dd3b54940ff17643c0d6543ca",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"php": ">=8.1" "php": ">=8.2"
}, },
"require-dev": { "require-dev": {
"phpunit/phpunit": "^10.0" "phpunit/phpunit": "^11.5"
}, },
"type": "library", "type": "library",
"extra": { "extra": {
"branch-alias": { "branch-alias": {
"dev-main": "2.0-dev" "dev-main": "3.0-dev"
} }
}, },
"autoload": { "autoload": {
@ -5423,7 +5423,8 @@
"homepage": "https://github.com/sebastianbergmann/code-unit", "homepage": "https://github.com/sebastianbergmann/code-unit",
"support": { "support": {
"issues": "https://github.com/sebastianbergmann/code-unit/issues", "issues": "https://github.com/sebastianbergmann/code-unit/issues",
"source": "https://github.com/sebastianbergmann/code-unit/tree/2.0.0" "security": "https://github.com/sebastianbergmann/code-unit/security/policy",
"source": "https://github.com/sebastianbergmann/code-unit/tree/3.0.2"
}, },
"funding": [ "funding": [
{ {
@ -5431,32 +5432,32 @@
"type": "github" "type": "github"
} }
], ],
"time": "2023-02-03T06:58:43+00:00" "time": "2024-12-12T09:59:06+00:00"
}, },
{ {
"name": "sebastian/code-unit-reverse-lookup", "name": "sebastian/code-unit-reverse-lookup",
"version": "3.0.0", "version": "4.0.1",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git",
"reference": "5e3a687f7d8ae33fb362c5c0743794bbb2420a1d" "reference": "183a9b2632194febd219bb9246eee421dad8d45e"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/5e3a687f7d8ae33fb362c5c0743794bbb2420a1d", "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/183a9b2632194febd219bb9246eee421dad8d45e",
"reference": "5e3a687f7d8ae33fb362c5c0743794bbb2420a1d", "reference": "183a9b2632194febd219bb9246eee421dad8d45e",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"php": ">=8.1" "php": ">=8.2"
}, },
"require-dev": { "require-dev": {
"phpunit/phpunit": "^10.0" "phpunit/phpunit": "^11.0"
}, },
"type": "library", "type": "library",
"extra": { "extra": {
"branch-alias": { "branch-alias": {
"dev-main": "3.0-dev" "dev-main": "4.0-dev"
} }
}, },
"autoload": { "autoload": {
@ -5474,7 +5475,8 @@
"homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/", "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/",
"support": { "support": {
"issues": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/issues", "issues": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/issues",
"source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/3.0.0" "security": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/security/policy",
"source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/4.0.1"
}, },
"funding": [ "funding": [
{ {
@ -5482,36 +5484,36 @@
"type": "github" "type": "github"
} }
], ],
"time": "2023-02-03T06:59:15+00:00" "time": "2024-07-03T04:45:54+00:00"
}, },
{ {
"name": "sebastian/comparator", "name": "sebastian/comparator",
"version": "5.0.3", "version": "6.2.1",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/sebastianbergmann/comparator.git", "url": "https://github.com/sebastianbergmann/comparator.git",
"reference": "a18251eb0b7a2dcd2f7aa3d6078b18545ef0558e" "reference": "43d129d6a0f81c78bee378b46688293eb7ea3739"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/a18251eb0b7a2dcd2f7aa3d6078b18545ef0558e", "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/43d129d6a0f81c78bee378b46688293eb7ea3739",
"reference": "a18251eb0b7a2dcd2f7aa3d6078b18545ef0558e", "reference": "43d129d6a0f81c78bee378b46688293eb7ea3739",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"ext-dom": "*", "ext-dom": "*",
"ext-mbstring": "*", "ext-mbstring": "*",
"php": ">=8.1", "php": ">=8.2",
"sebastian/diff": "^5.0", "sebastian/diff": "^6.0",
"sebastian/exporter": "^5.0" "sebastian/exporter": "^6.0"
}, },
"require-dev": { "require-dev": {
"phpunit/phpunit": "^10.5" "phpunit/phpunit": "^11.4"
}, },
"type": "library", "type": "library",
"extra": { "extra": {
"branch-alias": { "branch-alias": {
"dev-main": "5.0-dev" "dev-main": "6.2-dev"
} }
}, },
"autoload": { "autoload": {
@ -5543,7 +5545,7 @@
"support": { "support": {
"issues": "https://github.com/sebastianbergmann/comparator/issues", "issues": "https://github.com/sebastianbergmann/comparator/issues",
"security": "https://github.com/sebastianbergmann/comparator/security/policy", "security": "https://github.com/sebastianbergmann/comparator/security/policy",
"source": "https://github.com/sebastianbergmann/comparator/tree/5.0.3" "source": "https://github.com/sebastianbergmann/comparator/tree/6.2.1"
}, },
"funding": [ "funding": [
{ {
@ -5551,33 +5553,33 @@
"type": "github" "type": "github"
} }
], ],
"time": "2024-10-18T14:56:07+00:00" "time": "2024-10-31T05:30:08+00:00"
}, },
{ {
"name": "sebastian/complexity", "name": "sebastian/complexity",
"version": "3.2.0", "version": "4.0.1",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/sebastianbergmann/complexity.git", "url": "https://github.com/sebastianbergmann/complexity.git",
"reference": "68ff824baeae169ec9f2137158ee529584553799" "reference": "ee41d384ab1906c68852636b6de493846e13e5a0"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/68ff824baeae169ec9f2137158ee529584553799", "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/ee41d384ab1906c68852636b6de493846e13e5a0",
"reference": "68ff824baeae169ec9f2137158ee529584553799", "reference": "ee41d384ab1906c68852636b6de493846e13e5a0",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"nikic/php-parser": "^4.18 || ^5.0", "nikic/php-parser": "^5.0",
"php": ">=8.1" "php": ">=8.2"
}, },
"require-dev": { "require-dev": {
"phpunit/phpunit": "^10.0" "phpunit/phpunit": "^11.0"
}, },
"type": "library", "type": "library",
"extra": { "extra": {
"branch-alias": { "branch-alias": {
"dev-main": "3.2-dev" "dev-main": "4.0-dev"
} }
}, },
"autoload": { "autoload": {
@ -5597,7 +5599,7 @@
"support": { "support": {
"issues": "https://github.com/sebastianbergmann/complexity/issues", "issues": "https://github.com/sebastianbergmann/complexity/issues",
"security": "https://github.com/sebastianbergmann/complexity/security/policy", "security": "https://github.com/sebastianbergmann/complexity/security/policy",
"source": "https://github.com/sebastianbergmann/complexity/tree/3.2.0" "source": "https://github.com/sebastianbergmann/complexity/tree/4.0.1"
}, },
"funding": [ "funding": [
{ {
@ -5605,33 +5607,33 @@
"type": "github" "type": "github"
} }
], ],
"time": "2023-12-21T08:37:17+00:00" "time": "2024-07-03T04:49:50+00:00"
}, },
{ {
"name": "sebastian/diff", "name": "sebastian/diff",
"version": "5.1.1", "version": "6.0.2",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/sebastianbergmann/diff.git", "url": "https://github.com/sebastianbergmann/diff.git",
"reference": "c41e007b4b62af48218231d6c2275e4c9b975b2e" "reference": "b4ccd857127db5d41a5b676f24b51371d76d8544"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/c41e007b4b62af48218231d6c2275e4c9b975b2e", "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/b4ccd857127db5d41a5b676f24b51371d76d8544",
"reference": "c41e007b4b62af48218231d6c2275e4c9b975b2e", "reference": "b4ccd857127db5d41a5b676f24b51371d76d8544",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"php": ">=8.1" "php": ">=8.2"
}, },
"require-dev": { "require-dev": {
"phpunit/phpunit": "^10.0", "phpunit/phpunit": "^11.0",
"symfony/process": "^6.4" "symfony/process": "^4.2 || ^5"
}, },
"type": "library", "type": "library",
"extra": { "extra": {
"branch-alias": { "branch-alias": {
"dev-main": "5.1-dev" "dev-main": "6.0-dev"
} }
}, },
"autoload": { "autoload": {
@ -5655,7 +5657,7 @@
"support": { "support": {
"issues": "https://github.com/sebastianbergmann/diff/issues", "issues": "https://github.com/sebastianbergmann/diff/issues",
"security": "https://github.com/sebastianbergmann/diff/security/policy", "security": "https://github.com/sebastianbergmann/diff/security/policy",
"source": "https://github.com/sebastianbergmann/diff/tree/5.1.1" "source": "https://github.com/sebastianbergmann/diff/tree/6.0.2"
}, },
"funding": [ "funding": [
{ {
@ -5663,27 +5665,27 @@
"type": "github" "type": "github"
} }
], ],
"time": "2024-03-02T07:15:17+00:00" "time": "2024-07-03T04:53:05+00:00"
}, },
{ {
"name": "sebastian/environment", "name": "sebastian/environment",
"version": "6.1.0", "version": "7.2.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/sebastianbergmann/environment.git", "url": "https://github.com/sebastianbergmann/environment.git",
"reference": "8074dbcd93529b357029f5cc5058fd3e43666984" "reference": "855f3ae0ab316bbafe1ba4e16e9f3c078d24a0c5"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/8074dbcd93529b357029f5cc5058fd3e43666984", "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/855f3ae0ab316bbafe1ba4e16e9f3c078d24a0c5",
"reference": "8074dbcd93529b357029f5cc5058fd3e43666984", "reference": "855f3ae0ab316bbafe1ba4e16e9f3c078d24a0c5",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"php": ">=8.1" "php": ">=8.2"
}, },
"require-dev": { "require-dev": {
"phpunit/phpunit": "^10.0" "phpunit/phpunit": "^11.0"
}, },
"suggest": { "suggest": {
"ext-posix": "*" "ext-posix": "*"
@ -5691,7 +5693,7 @@
"type": "library", "type": "library",
"extra": { "extra": {
"branch-alias": { "branch-alias": {
"dev-main": "6.1-dev" "dev-main": "7.2-dev"
} }
}, },
"autoload": { "autoload": {
@ -5711,7 +5713,7 @@
"support": { "support": {
"issues": "https://github.com/sebastianbergmann/environment/issues", "issues": "https://github.com/sebastianbergmann/environment/issues",
"security": "https://github.com/sebastianbergmann/environment/security/policy", "security": "https://github.com/sebastianbergmann/environment/security/policy",
"source": "https://github.com/sebastianbergmann/environment/tree/6.1.0" "source": "https://github.com/sebastianbergmann/environment/tree/7.2.0"
}, },
"funding": [ "funding": [
{ {
@ -5719,34 +5721,34 @@
"type": "github" "type": "github"
} }
], ],
"time": "2024-03-23T08:47:14+00:00" "time": "2024-07-03T04:54:44+00:00"
}, },
{ {
"name": "sebastian/exporter", "name": "sebastian/exporter",
"version": "5.1.2", "version": "6.3.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/sebastianbergmann/exporter.git", "url": "https://github.com/sebastianbergmann/exporter.git",
"reference": "955288482d97c19a372d3f31006ab3f37da47adf" "reference": "3473f61172093b2da7de1fb5782e1f24cc036dc3"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/955288482d97c19a372d3f31006ab3f37da47adf", "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/3473f61172093b2da7de1fb5782e1f24cc036dc3",
"reference": "955288482d97c19a372d3f31006ab3f37da47adf", "reference": "3473f61172093b2da7de1fb5782e1f24cc036dc3",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"ext-mbstring": "*", "ext-mbstring": "*",
"php": ">=8.1", "php": ">=8.2",
"sebastian/recursion-context": "^5.0" "sebastian/recursion-context": "^6.0"
}, },
"require-dev": { "require-dev": {
"phpunit/phpunit": "^10.0" "phpunit/phpunit": "^11.3"
}, },
"type": "library", "type": "library",
"extra": { "extra": {
"branch-alias": { "branch-alias": {
"dev-main": "5.1-dev" "dev-main": "6.1-dev"
} }
}, },
"autoload": { "autoload": {
@ -5782,7 +5784,7 @@
"support": { "support": {
"issues": "https://github.com/sebastianbergmann/exporter/issues", "issues": "https://github.com/sebastianbergmann/exporter/issues",
"security": "https://github.com/sebastianbergmann/exporter/security/policy", "security": "https://github.com/sebastianbergmann/exporter/security/policy",
"source": "https://github.com/sebastianbergmann/exporter/tree/5.1.2" "source": "https://github.com/sebastianbergmann/exporter/tree/6.3.0"
}, },
"funding": [ "funding": [
{ {
@ -5790,35 +5792,35 @@
"type": "github" "type": "github"
} }
], ],
"time": "2024-03-02T07:17:12+00:00" "time": "2024-12-05T09:17:50+00:00"
}, },
{ {
"name": "sebastian/global-state", "name": "sebastian/global-state",
"version": "6.0.2", "version": "7.0.2",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/sebastianbergmann/global-state.git", "url": "https://github.com/sebastianbergmann/global-state.git",
"reference": "987bafff24ecc4c9ac418cab1145b96dd6e9cbd9" "reference": "3be331570a721f9a4b5917f4209773de17f747d7"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/987bafff24ecc4c9ac418cab1145b96dd6e9cbd9", "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/3be331570a721f9a4b5917f4209773de17f747d7",
"reference": "987bafff24ecc4c9ac418cab1145b96dd6e9cbd9", "reference": "3be331570a721f9a4b5917f4209773de17f747d7",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"php": ">=8.1", "php": ">=8.2",
"sebastian/object-reflector": "^3.0", "sebastian/object-reflector": "^4.0",
"sebastian/recursion-context": "^5.0" "sebastian/recursion-context": "^6.0"
}, },
"require-dev": { "require-dev": {
"ext-dom": "*", "ext-dom": "*",
"phpunit/phpunit": "^10.0" "phpunit/phpunit": "^11.0"
}, },
"type": "library", "type": "library",
"extra": { "extra": {
"branch-alias": { "branch-alias": {
"dev-main": "6.0-dev" "dev-main": "7.0-dev"
} }
}, },
"autoload": { "autoload": {
@ -5838,7 +5840,7 @@
"support": { "support": {
"issues": "https://github.com/sebastianbergmann/global-state/issues", "issues": "https://github.com/sebastianbergmann/global-state/issues",
"security": "https://github.com/sebastianbergmann/global-state/security/policy", "security": "https://github.com/sebastianbergmann/global-state/security/policy",
"source": "https://github.com/sebastianbergmann/global-state/tree/6.0.2" "source": "https://github.com/sebastianbergmann/global-state/tree/7.0.2"
}, },
"funding": [ "funding": [
{ {
@ -5846,33 +5848,33 @@
"type": "github" "type": "github"
} }
], ],
"time": "2024-03-02T07:19:19+00:00" "time": "2024-07-03T04:57:36+00:00"
}, },
{ {
"name": "sebastian/lines-of-code", "name": "sebastian/lines-of-code",
"version": "2.0.2", "version": "3.0.1",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/sebastianbergmann/lines-of-code.git", "url": "https://github.com/sebastianbergmann/lines-of-code.git",
"reference": "856e7f6a75a84e339195d48c556f23be2ebf75d0" "reference": "d36ad0d782e5756913e42ad87cb2890f4ffe467a"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/856e7f6a75a84e339195d48c556f23be2ebf75d0", "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/d36ad0d782e5756913e42ad87cb2890f4ffe467a",
"reference": "856e7f6a75a84e339195d48c556f23be2ebf75d0", "reference": "d36ad0d782e5756913e42ad87cb2890f4ffe467a",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"nikic/php-parser": "^4.18 || ^5.0", "nikic/php-parser": "^5.0",
"php": ">=8.1" "php": ">=8.2"
}, },
"require-dev": { "require-dev": {
"phpunit/phpunit": "^10.0" "phpunit/phpunit": "^11.0"
}, },
"type": "library", "type": "library",
"extra": { "extra": {
"branch-alias": { "branch-alias": {
"dev-main": "2.0-dev" "dev-main": "3.0-dev"
} }
}, },
"autoload": { "autoload": {
@ -5892,7 +5894,7 @@
"support": { "support": {
"issues": "https://github.com/sebastianbergmann/lines-of-code/issues", "issues": "https://github.com/sebastianbergmann/lines-of-code/issues",
"security": "https://github.com/sebastianbergmann/lines-of-code/security/policy", "security": "https://github.com/sebastianbergmann/lines-of-code/security/policy",
"source": "https://github.com/sebastianbergmann/lines-of-code/tree/2.0.2" "source": "https://github.com/sebastianbergmann/lines-of-code/tree/3.0.1"
}, },
"funding": [ "funding": [
{ {
@ -5900,34 +5902,34 @@
"type": "github" "type": "github"
} }
], ],
"time": "2023-12-21T08:38:20+00:00" "time": "2024-07-03T04:58:38+00:00"
}, },
{ {
"name": "sebastian/object-enumerator", "name": "sebastian/object-enumerator",
"version": "5.0.0", "version": "6.0.1",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/sebastianbergmann/object-enumerator.git", "url": "https://github.com/sebastianbergmann/object-enumerator.git",
"reference": "202d0e344a580d7f7d04b3fafce6933e59dae906" "reference": "f5b498e631a74204185071eb41f33f38d64608aa"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/202d0e344a580d7f7d04b3fafce6933e59dae906", "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/f5b498e631a74204185071eb41f33f38d64608aa",
"reference": "202d0e344a580d7f7d04b3fafce6933e59dae906", "reference": "f5b498e631a74204185071eb41f33f38d64608aa",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"php": ">=8.1", "php": ">=8.2",
"sebastian/object-reflector": "^3.0", "sebastian/object-reflector": "^4.0",
"sebastian/recursion-context": "^5.0" "sebastian/recursion-context": "^6.0"
}, },
"require-dev": { "require-dev": {
"phpunit/phpunit": "^10.0" "phpunit/phpunit": "^11.0"
}, },
"type": "library", "type": "library",
"extra": { "extra": {
"branch-alias": { "branch-alias": {
"dev-main": "5.0-dev" "dev-main": "6.0-dev"
} }
}, },
"autoload": { "autoload": {
@ -5945,7 +5947,8 @@
"homepage": "https://github.com/sebastianbergmann/object-enumerator/", "homepage": "https://github.com/sebastianbergmann/object-enumerator/",
"support": { "support": {
"issues": "https://github.com/sebastianbergmann/object-enumerator/issues", "issues": "https://github.com/sebastianbergmann/object-enumerator/issues",
"source": "https://github.com/sebastianbergmann/object-enumerator/tree/5.0.0" "security": "https://github.com/sebastianbergmann/object-enumerator/security/policy",
"source": "https://github.com/sebastianbergmann/object-enumerator/tree/6.0.1"
}, },
"funding": [ "funding": [
{ {
@ -5953,32 +5956,32 @@
"type": "github" "type": "github"
} }
], ],
"time": "2023-02-03T07:08:32+00:00" "time": "2024-07-03T05:00:13+00:00"
}, },
{ {
"name": "sebastian/object-reflector", "name": "sebastian/object-reflector",
"version": "3.0.0", "version": "4.0.1",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/sebastianbergmann/object-reflector.git", "url": "https://github.com/sebastianbergmann/object-reflector.git",
"reference": "24ed13d98130f0e7122df55d06c5c4942a577957" "reference": "6e1a43b411b2ad34146dee7524cb13a068bb35f9"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/24ed13d98130f0e7122df55d06c5c4942a577957", "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/6e1a43b411b2ad34146dee7524cb13a068bb35f9",
"reference": "24ed13d98130f0e7122df55d06c5c4942a577957", "reference": "6e1a43b411b2ad34146dee7524cb13a068bb35f9",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"php": ">=8.1" "php": ">=8.2"
}, },
"require-dev": { "require-dev": {
"phpunit/phpunit": "^10.0" "phpunit/phpunit": "^11.0"
}, },
"type": "library", "type": "library",
"extra": { "extra": {
"branch-alias": { "branch-alias": {
"dev-main": "3.0-dev" "dev-main": "4.0-dev"
} }
}, },
"autoload": { "autoload": {
@ -5996,7 +5999,8 @@
"homepage": "https://github.com/sebastianbergmann/object-reflector/", "homepage": "https://github.com/sebastianbergmann/object-reflector/",
"support": { "support": {
"issues": "https://github.com/sebastianbergmann/object-reflector/issues", "issues": "https://github.com/sebastianbergmann/object-reflector/issues",
"source": "https://github.com/sebastianbergmann/object-reflector/tree/3.0.0" "security": "https://github.com/sebastianbergmann/object-reflector/security/policy",
"source": "https://github.com/sebastianbergmann/object-reflector/tree/4.0.1"
}, },
"funding": [ "funding": [
{ {
@ -6004,32 +6008,32 @@
"type": "github" "type": "github"
} }
], ],
"time": "2023-02-03T07:06:18+00:00" "time": "2024-07-03T05:01:32+00:00"
}, },
{ {
"name": "sebastian/recursion-context", "name": "sebastian/recursion-context",
"version": "5.0.0", "version": "6.0.2",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/sebastianbergmann/recursion-context.git", "url": "https://github.com/sebastianbergmann/recursion-context.git",
"reference": "05909fb5bc7df4c52992396d0116aed689f93712" "reference": "694d156164372abbd149a4b85ccda2e4670c0e16"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/05909fb5bc7df4c52992396d0116aed689f93712", "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/694d156164372abbd149a4b85ccda2e4670c0e16",
"reference": "05909fb5bc7df4c52992396d0116aed689f93712", "reference": "694d156164372abbd149a4b85ccda2e4670c0e16",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"php": ">=8.1" "php": ">=8.2"
}, },
"require-dev": { "require-dev": {
"phpunit/phpunit": "^10.0" "phpunit/phpunit": "^11.0"
}, },
"type": "library", "type": "library",
"extra": { "extra": {
"branch-alias": { "branch-alias": {
"dev-main": "5.0-dev" "dev-main": "6.0-dev"
} }
}, },
"autoload": { "autoload": {
@ -6055,7 +6059,8 @@
"homepage": "https://github.com/sebastianbergmann/recursion-context", "homepage": "https://github.com/sebastianbergmann/recursion-context",
"support": { "support": {
"issues": "https://github.com/sebastianbergmann/recursion-context/issues", "issues": "https://github.com/sebastianbergmann/recursion-context/issues",
"source": "https://github.com/sebastianbergmann/recursion-context/tree/5.0.0" "security": "https://github.com/sebastianbergmann/recursion-context/security/policy",
"source": "https://github.com/sebastianbergmann/recursion-context/tree/6.0.2"
}, },
"funding": [ "funding": [
{ {
@ -6063,32 +6068,32 @@
"type": "github" "type": "github"
} }
], ],
"time": "2023-02-03T07:05:40+00:00" "time": "2024-07-03T05:10:34+00:00"
}, },
{ {
"name": "sebastian/type", "name": "sebastian/type",
"version": "4.0.0", "version": "5.1.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/sebastianbergmann/type.git", "url": "https://github.com/sebastianbergmann/type.git",
"reference": "462699a16464c3944eefc02ebdd77882bd3925bf" "reference": "461b9c5da241511a2a0e8f240814fb23ce5c0aac"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/type/zipball/462699a16464c3944eefc02ebdd77882bd3925bf", "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/461b9c5da241511a2a0e8f240814fb23ce5c0aac",
"reference": "462699a16464c3944eefc02ebdd77882bd3925bf", "reference": "461b9c5da241511a2a0e8f240814fb23ce5c0aac",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"php": ">=8.1" "php": ">=8.2"
}, },
"require-dev": { "require-dev": {
"phpunit/phpunit": "^10.0" "phpunit/phpunit": "^11.3"
}, },
"type": "library", "type": "library",
"extra": { "extra": {
"branch-alias": { "branch-alias": {
"dev-main": "4.0-dev" "dev-main": "5.1-dev"
} }
}, },
"autoload": { "autoload": {
@ -6107,7 +6112,8 @@
"homepage": "https://github.com/sebastianbergmann/type", "homepage": "https://github.com/sebastianbergmann/type",
"support": { "support": {
"issues": "https://github.com/sebastianbergmann/type/issues", "issues": "https://github.com/sebastianbergmann/type/issues",
"source": "https://github.com/sebastianbergmann/type/tree/4.0.0" "security": "https://github.com/sebastianbergmann/type/security/policy",
"source": "https://github.com/sebastianbergmann/type/tree/5.1.0"
}, },
"funding": [ "funding": [
{ {
@ -6115,29 +6121,29 @@
"type": "github" "type": "github"
} }
], ],
"time": "2023-02-03T07:10:45+00:00" "time": "2024-09-17T13:12:04+00:00"
}, },
{ {
"name": "sebastian/version", "name": "sebastian/version",
"version": "4.0.1", "version": "5.0.2",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/sebastianbergmann/version.git", "url": "https://github.com/sebastianbergmann/version.git",
"reference": "c51fa83a5d8f43f1402e3f32a005e6262244ef17" "reference": "c687e3387b99f5b03b6caa64c74b63e2936ff874"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/version/zipball/c51fa83a5d8f43f1402e3f32a005e6262244ef17", "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/c687e3387b99f5b03b6caa64c74b63e2936ff874",
"reference": "c51fa83a5d8f43f1402e3f32a005e6262244ef17", "reference": "c687e3387b99f5b03b6caa64c74b63e2936ff874",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"php": ">=8.1" "php": ">=8.2"
}, },
"type": "library", "type": "library",
"extra": { "extra": {
"branch-alias": { "branch-alias": {
"dev-main": "4.0-dev" "dev-main": "5.0-dev"
} }
}, },
"autoload": { "autoload": {
@ -6156,7 +6162,8 @@
"homepage": "https://github.com/sebastianbergmann/version", "homepage": "https://github.com/sebastianbergmann/version",
"support": { "support": {
"issues": "https://github.com/sebastianbergmann/version/issues", "issues": "https://github.com/sebastianbergmann/version/issues",
"source": "https://github.com/sebastianbergmann/version/tree/4.0.1" "security": "https://github.com/sebastianbergmann/version/security/policy",
"source": "https://github.com/sebastianbergmann/version/tree/5.0.2"
}, },
"funding": [ "funding": [
{ {
@ -6164,7 +6171,7 @@
"type": "github" "type": "github"
} }
], ],
"time": "2023-02-07T11:34:05+00:00" "time": "2024-10-09T05:16:32+00:00"
}, },
{ {
"name": "sebastianfeldmann/camino", "name": "sebastianfeldmann/camino",
@ -6219,16 +6226,16 @@
}, },
{ {
"name": "sebastianfeldmann/cli", "name": "sebastianfeldmann/cli",
"version": "3.4.1", "version": "3.4.2",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/sebastianfeldmann/cli.git", "url": "https://github.com/sebastianfeldmann/cli.git",
"reference": "8a932e99e9455981fb32fa6c085492462fe8f8cf" "reference": "6fa122afd528dae7d7ec988a604aa6c600f5d9b5"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/sebastianfeldmann/cli/zipball/8a932e99e9455981fb32fa6c085492462fe8f8cf", "url": "https://api.github.com/repos/sebastianfeldmann/cli/zipball/6fa122afd528dae7d7ec988a604aa6c600f5d9b5",
"reference": "8a932e99e9455981fb32fa6c085492462fe8f8cf", "reference": "6fa122afd528dae7d7ec988a604aa6c600f5d9b5",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -6261,7 +6268,7 @@
"keywords": ["cli"], "keywords": ["cli"],
"support": { "support": {
"issues": "https://github.com/sebastianfeldmann/cli/issues", "issues": "https://github.com/sebastianfeldmann/cli/issues",
"source": "https://github.com/sebastianfeldmann/cli/tree/3.4.1" "source": "https://github.com/sebastianfeldmann/cli/tree/3.4.2"
}, },
"funding": [ "funding": [
{ {
@ -6269,20 +6276,20 @@
"type": "github" "type": "github"
} }
], ],
"time": "2021-12-20T14:59:49+00:00" "time": "2024-11-26T10:19:01+00:00"
}, },
{ {
"name": "sebastianfeldmann/git", "name": "sebastianfeldmann/git",
"version": "3.11.0", "version": "3.11.1",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/sebastianfeldmann/git.git", "url": "https://github.com/sebastianfeldmann/git.git",
"reference": "5cb1ea94f65c7420419abe8f12c45cc7eb094790" "reference": "96b9f384d45106f757df98a74c11b42b393ff18f"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/sebastianfeldmann/git/zipball/5cb1ea94f65c7420419abe8f12c45cc7eb094790", "url": "https://api.github.com/repos/sebastianfeldmann/git/zipball/96b9f384d45106f757df98a74c11b42b393ff18f",
"reference": "5cb1ea94f65c7420419abe8f12c45cc7eb094790", "reference": "96b9f384d45106f757df98a74c11b42b393ff18f",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -6319,7 +6326,7 @@
"keywords": ["git"], "keywords": ["git"],
"support": { "support": {
"issues": "https://github.com/sebastianfeldmann/git/issues", "issues": "https://github.com/sebastianfeldmann/git/issues",
"source": "https://github.com/sebastianfeldmann/git/tree/3.11.0" "source": "https://github.com/sebastianfeldmann/git/tree/3.11.1"
}, },
"funding": [ "funding": [
{ {
@ -6327,20 +6334,66 @@
"type": "github" "type": "github"
} }
], ],
"time": "2024-01-23T09:11:14+00:00" "time": "2024-11-26T18:37:20+00:00"
}, },
{ {
"name": "symfony/console", "name": "staabm/side-effects-detector",
"version": "v7.1.7", "version": "1.0.5",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/console.git", "url": "https://github.com/staabm/side-effects-detector.git",
"reference": "3284aafcac338b6e86fd955ee4d794cbe434151a" "reference": "d8334211a140ce329c13726d4a715adbddd0a163"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/console/zipball/3284aafcac338b6e86fd955ee4d794cbe434151a", "url": "https://api.github.com/repos/staabm/side-effects-detector/zipball/d8334211a140ce329c13726d4a715adbddd0a163",
"reference": "3284aafcac338b6e86fd955ee4d794cbe434151a", "reference": "d8334211a140ce329c13726d4a715adbddd0a163",
"shasum": ""
},
"require": {
"ext-tokenizer": "*",
"php": "^7.4 || ^8.0"
},
"require-dev": {
"phpstan/extension-installer": "^1.4.3",
"phpstan/phpstan": "^1.12.6",
"phpunit/phpunit": "^9.6.21",
"symfony/var-dumper": "^5.4.43",
"tomasvotruba/type-coverage": "1.0.0",
"tomasvotruba/unused-public": "1.0.0"
},
"type": "library",
"autoload": {
"classmap": ["lib/"]
},
"notification-url": "https://packagist.org/downloads/",
"license": ["MIT"],
"description": "A static analysis tool to detect side effects in PHP code",
"keywords": ["static analysis"],
"support": {
"issues": "https://github.com/staabm/side-effects-detector/issues",
"source": "https://github.com/staabm/side-effects-detector/tree/1.0.5"
},
"funding": [
{
"url": "https://github.com/staabm",
"type": "github"
}
],
"time": "2024-10-20T05:08:20+00:00"
},
{
"name": "symfony/console",
"version": "v7.2.1",
"source": {
"type": "git",
"url": "https://github.com/symfony/console.git",
"reference": "fefcc18c0f5d0efe3ab3152f15857298868dc2c3"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/console/zipball/fefcc18c0f5d0efe3ab3152f15857298868dc2c3",
"reference": "fefcc18c0f5d0efe3ab3152f15857298868dc2c3",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -6395,7 +6448,7 @@
"homepage": "https://symfony.com", "homepage": "https://symfony.com",
"keywords": ["cli", "command-line", "console", "terminal"], "keywords": ["cli", "command-line", "console", "terminal"],
"support": { "support": {
"source": "https://github.com/symfony/console/tree/v7.1.7" "source": "https://github.com/symfony/console/tree/v7.2.1"
}, },
"funding": [ "funding": [
{ {
@ -6411,20 +6464,20 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2024-11-05T15:34:55+00:00" "time": "2024-12-11T03:49:26+00:00"
}, },
{ {
"name": "symfony/event-dispatcher", "name": "symfony/event-dispatcher",
"version": "v7.1.6", "version": "v7.2.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/event-dispatcher.git", "url": "https://github.com/symfony/event-dispatcher.git",
"reference": "87254c78dd50721cfd015b62277a8281c5589702" "reference": "910c5db85a5356d0fea57680defec4e99eb9c8c1"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/87254c78dd50721cfd015b62277a8281c5589702", "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/910c5db85a5356d0fea57680defec4e99eb9c8c1",
"reference": "87254c78dd50721cfd015b62277a8281c5589702", "reference": "910c5db85a5356d0fea57680defec4e99eb9c8c1",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -6471,7 +6524,7 @@
"description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them", "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them",
"homepage": "https://symfony.com", "homepage": "https://symfony.com",
"support": { "support": {
"source": "https://github.com/symfony/event-dispatcher/tree/v7.1.6" "source": "https://github.com/symfony/event-dispatcher/tree/v7.2.0"
}, },
"funding": [ "funding": [
{ {
@ -6487,20 +6540,20 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2024-09-25T14:20:29+00:00" "time": "2024-09-25T14:21:43+00:00"
}, },
{ {
"name": "symfony/event-dispatcher-contracts", "name": "symfony/event-dispatcher-contracts",
"version": "v3.5.0", "version": "v3.5.1",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/event-dispatcher-contracts.git", "url": "https://github.com/symfony/event-dispatcher-contracts.git",
"reference": "8f93aec25d41b72493c6ddff14e916177c9efc50" "reference": "7642f5e970b672283b7823222ae8ef8bbc160b9f"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/8f93aec25d41b72493c6ddff14e916177c9efc50", "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/7642f5e970b672283b7823222ae8ef8bbc160b9f",
"reference": "8f93aec25d41b72493c6ddff14e916177c9efc50", "reference": "7642f5e970b672283b7823222ae8ef8bbc160b9f",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -6545,7 +6598,7 @@
"standards" "standards"
], ],
"support": { "support": {
"source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.5.0" "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.5.1"
}, },
"funding": [ "funding": [
{ {
@ -6561,20 +6614,20 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2024-04-18T09:32:20+00:00" "time": "2024-09-25T14:20:29+00:00"
}, },
{ {
"name": "symfony/filesystem", "name": "symfony/filesystem",
"version": "v7.1.6", "version": "v7.2.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/filesystem.git", "url": "https://github.com/symfony/filesystem.git",
"reference": "c835867b3c62bb05c7fe3d637c871c7ae52024d4" "reference": "b8dce482de9d7c9fe2891155035a7248ab5c7fdb"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/filesystem/zipball/c835867b3c62bb05c7fe3d637c871c7ae52024d4", "url": "https://api.github.com/repos/symfony/filesystem/zipball/b8dce482de9d7c9fe2891155035a7248ab5c7fdb",
"reference": "c835867b3c62bb05c7fe3d637c871c7ae52024d4", "reference": "b8dce482de9d7c9fe2891155035a7248ab5c7fdb",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -6607,7 +6660,7 @@
"description": "Provides basic utilities for the filesystem", "description": "Provides basic utilities for the filesystem",
"homepage": "https://symfony.com", "homepage": "https://symfony.com",
"support": { "support": {
"source": "https://github.com/symfony/filesystem/tree/v7.1.6" "source": "https://github.com/symfony/filesystem/tree/v7.2.0"
}, },
"funding": [ "funding": [
{ {
@ -6623,20 +6676,20 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2024-10-25T15:11:02+00:00" "time": "2024-10-25T15:15:23+00:00"
}, },
{ {
"name": "symfony/finder", "name": "symfony/finder",
"version": "v7.1.6", "version": "v7.2.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/finder.git", "url": "https://github.com/symfony/finder.git",
"reference": "2cb89664897be33f78c65d3d2845954c8d7a43b8" "reference": "6de263e5868b9a137602dd1e33e4d48bfae99c49"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/finder/zipball/2cb89664897be33f78c65d3d2845954c8d7a43b8", "url": "https://api.github.com/repos/symfony/finder/zipball/6de263e5868b9a137602dd1e33e4d48bfae99c49",
"reference": "2cb89664897be33f78c65d3d2845954c8d7a43b8", "reference": "6de263e5868b9a137602dd1e33e4d48bfae99c49",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -6667,7 +6720,7 @@
"description": "Finds files and directories via an intuitive fluent interface", "description": "Finds files and directories via an intuitive fluent interface",
"homepage": "https://symfony.com", "homepage": "https://symfony.com",
"support": { "support": {
"source": "https://github.com/symfony/finder/tree/v7.1.6" "source": "https://github.com/symfony/finder/tree/v7.2.0"
}, },
"funding": [ "funding": [
{ {
@ -6683,20 +6736,20 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2024-10-01T08:31:23+00:00" "time": "2024-10-23T06:56:12+00:00"
}, },
{ {
"name": "symfony/options-resolver", "name": "symfony/options-resolver",
"version": "v7.1.6", "version": "v7.2.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/options-resolver.git", "url": "https://github.com/symfony/options-resolver.git",
"reference": "85e95eeede2d41cd146146e98c9c81d9214cae85" "reference": "7da8fbac9dcfef75ffc212235d76b2754ce0cf50"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/options-resolver/zipball/85e95eeede2d41cd146146e98c9c81d9214cae85", "url": "https://api.github.com/repos/symfony/options-resolver/zipball/7da8fbac9dcfef75ffc212235d76b2754ce0cf50",
"reference": "85e95eeede2d41cd146146e98c9c81d9214cae85", "reference": "7da8fbac9dcfef75ffc212235d76b2754ce0cf50",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -6726,7 +6779,7 @@
"homepage": "https://symfony.com", "homepage": "https://symfony.com",
"keywords": ["config", "configuration", "options"], "keywords": ["config", "configuration", "options"],
"support": { "support": {
"source": "https://github.com/symfony/options-resolver/tree/v7.1.6" "source": "https://github.com/symfony/options-resolver/tree/v7.2.0"
}, },
"funding": [ "funding": [
{ {
@ -6742,7 +6795,7 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2024-09-25T14:20:29+00:00" "time": "2024-11-20T11:17:29+00:00"
}, },
{ {
"name": "symfony/polyfill-intl-grapheme", "name": "symfony/polyfill-intl-grapheme",
@ -6767,8 +6820,8 @@
"type": "library", "type": "library",
"extra": { "extra": {
"thanks": { "thanks": {
"name": "symfony/polyfill", "url": "https://github.com/symfony/polyfill",
"url": "https://github.com/symfony/polyfill" "name": "symfony/polyfill"
} }
}, },
"autoload": { "autoload": {
@ -6841,8 +6894,8 @@
"type": "library", "type": "library",
"extra": { "extra": {
"thanks": { "thanks": {
"name": "symfony/polyfill", "url": "https://github.com/symfony/polyfill",
"url": "https://github.com/symfony/polyfill" "name": "symfony/polyfill"
} }
}, },
"autoload": { "autoload": {
@ -6913,8 +6966,8 @@
"type": "library", "type": "library",
"extra": { "extra": {
"thanks": { "thanks": {
"name": "symfony/polyfill", "url": "https://github.com/symfony/polyfill",
"url": "https://github.com/symfony/polyfill" "name": "symfony/polyfill"
} }
}, },
"autoload": { "autoload": {
@ -6960,16 +7013,16 @@
}, },
{ {
"name": "symfony/process", "name": "symfony/process",
"version": "v7.1.7", "version": "v7.2.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/process.git", "url": "https://github.com/symfony/process.git",
"reference": "9b8a40b7289767aa7117e957573c2a535efe6585" "reference": "d34b22ba9390ec19d2dd966c40aa9e8462f27a7e"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/process/zipball/9b8a40b7289767aa7117e957573c2a535efe6585", "url": "https://api.github.com/repos/symfony/process/zipball/d34b22ba9390ec19d2dd966c40aa9e8462f27a7e",
"reference": "9b8a40b7289767aa7117e957573c2a535efe6585", "reference": "d34b22ba9390ec19d2dd966c40aa9e8462f27a7e",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -6997,7 +7050,7 @@
"description": "Executes commands in sub-processes", "description": "Executes commands in sub-processes",
"homepage": "https://symfony.com", "homepage": "https://symfony.com",
"support": { "support": {
"source": "https://github.com/symfony/process/tree/v7.1.7" "source": "https://github.com/symfony/process/tree/v7.2.0"
}, },
"funding": [ "funding": [
{ {
@ -7013,20 +7066,20 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2024-11-06T09:25:12+00:00" "time": "2024-11-06T14:24:19+00:00"
}, },
{ {
"name": "symfony/service-contracts", "name": "symfony/service-contracts",
"version": "v3.5.0", "version": "v3.5.1",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/service-contracts.git", "url": "https://github.com/symfony/service-contracts.git",
"reference": "bd1d9e59a81d8fa4acdcea3f617c581f7475a80f" "reference": "e53260aabf78fb3d63f8d79d69ece59f80d5eda0"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/service-contracts/zipball/bd1d9e59a81d8fa4acdcea3f617c581f7475a80f", "url": "https://api.github.com/repos/symfony/service-contracts/zipball/e53260aabf78fb3d63f8d79d69ece59f80d5eda0",
"reference": "bd1d9e59a81d8fa4acdcea3f617c581f7475a80f", "reference": "e53260aabf78fb3d63f8d79d69ece59f80d5eda0",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -7076,7 +7129,7 @@
"standards" "standards"
], ],
"support": { "support": {
"source": "https://github.com/symfony/service-contracts/tree/v3.5.0" "source": "https://github.com/symfony/service-contracts/tree/v3.5.1"
}, },
"funding": [ "funding": [
{ {
@ -7092,20 +7145,20 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2024-04-18T09:32:20+00:00" "time": "2024-09-25T14:20:29+00:00"
}, },
{ {
"name": "symfony/stopwatch", "name": "symfony/stopwatch",
"version": "v7.1.6", "version": "v7.2.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/stopwatch.git", "url": "https://github.com/symfony/stopwatch.git",
"reference": "8b4a434e6e7faf6adedffb48783a5c75409a1a05" "reference": "696f418b0d722a4225e1c3d95489d262971ca924"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/stopwatch/zipball/8b4a434e6e7faf6adedffb48783a5c75409a1a05", "url": "https://api.github.com/repos/symfony/stopwatch/zipball/696f418b0d722a4225e1c3d95489d262971ca924",
"reference": "8b4a434e6e7faf6adedffb48783a5c75409a1a05", "reference": "696f418b0d722a4225e1c3d95489d262971ca924",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -7134,7 +7187,7 @@
"description": "Provides a way to profile code", "description": "Provides a way to profile code",
"homepage": "https://symfony.com", "homepage": "https://symfony.com",
"support": { "support": {
"source": "https://github.com/symfony/stopwatch/tree/v7.1.6" "source": "https://github.com/symfony/stopwatch/tree/v7.2.0"
}, },
"funding": [ "funding": [
{ {
@ -7150,20 +7203,20 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2024-09-25T14:20:29+00:00" "time": "2024-09-25T14:21:43+00:00"
}, },
{ {
"name": "symfony/string", "name": "symfony/string",
"version": "v7.1.6", "version": "v7.2.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/string.git", "url": "https://github.com/symfony/string.git",
"reference": "61b72d66bf96c360a727ae6232df5ac83c71f626" "reference": "446e0d146f991dde3e73f45f2c97a9faad773c82"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/string/zipball/61b72d66bf96c360a727ae6232df5ac83c71f626", "url": "https://api.github.com/repos/symfony/string/zipball/446e0d146f991dde3e73f45f2c97a9faad773c82",
"reference": "61b72d66bf96c360a727ae6232df5ac83c71f626", "reference": "446e0d146f991dde3e73f45f2c97a9faad773c82",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -7208,7 +7261,7 @@
"homepage": "https://symfony.com", "homepage": "https://symfony.com",
"keywords": ["grapheme", "i18n", "string", "unicode", "utf-8", "utf8"], "keywords": ["grapheme", "i18n", "string", "unicode", "utf-8", "utf8"],
"support": { "support": {
"source": "https://github.com/symfony/string/tree/v7.1.6" "source": "https://github.com/symfony/string/tree/v7.2.0"
}, },
"funding": [ "funding": [
{ {
@ -7224,7 +7277,7 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2024-09-25T14:20:29+00:00" "time": "2024-11-13T13:31:26+00:00"
}, },
{ {
"name": "symplify/coding-standard", "name": "symplify/coding-standard",
@ -7285,16 +7338,16 @@
}, },
{ {
"name": "symplify/easy-coding-standard", "name": "symplify/easy-coding-standard",
"version": "12.3.6", "version": "12.5.4",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/easy-coding-standard/easy-coding-standard.git", "url": "https://github.com/easy-coding-standard/easy-coding-standard.git",
"reference": "c0f378782d06dfd21c66c3024e9d28f4e737645e" "reference": "5673ecbc03eef9d7b2f563819c80e8e1ce0161be"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/easy-coding-standard/easy-coding-standard/zipball/c0f378782d06dfd21c66c3024e9d28f4e737645e", "url": "https://api.github.com/repos/easy-coding-standard/easy-coding-standard/zipball/5673ecbc03eef9d7b2f563819c80e8e1ce0161be",
"reference": "c0f378782d06dfd21c66c3024e9d28f4e737645e", "reference": "5673ecbc03eef9d7b2f563819c80e8e1ce0161be",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -7319,7 +7372,7 @@
"keywords": ["Code style", "automation", "fixer", "static analysis"], "keywords": ["Code style", "automation", "fixer", "static analysis"],
"support": { "support": {
"issues": "https://github.com/easy-coding-standard/easy-coding-standard/issues", "issues": "https://github.com/easy-coding-standard/easy-coding-standard/issues",
"source": "https://github.com/easy-coding-standard/easy-coding-standard/tree/12.3.6" "source": "https://github.com/easy-coding-standard/easy-coding-standard/tree/12.5.4"
}, },
"funding": [ "funding": [
{ {
@ -7331,7 +7384,7 @@
"type": "github" "type": "github"
} }
], ],
"time": "2024-10-06T08:27:28+00:00" "time": "2024-12-12T15:36:04+00:00"
}, },
{ {
"name": "symplify/rule-doc-generator-contracts", "name": "symplify/rule-doc-generator-contracts",

View file

@ -37,7 +37,7 @@ RSS feed.
Here is a good place to add new tags to the generated channel. Here is a good place to add new tags to the generated channel.
```php ```php
public function rssAfterChannel(Podcast $podcast, SimpleRSSElement $channel): void public function rssAfterChannel(Podcast $podcast, RssFeed $channel): void
{ {
// … // …
} }
@ -65,7 +65,7 @@ feed.
Here is a good place to add new tags to the generated item. Here is a good place to add new tags to the generated item.
```php ```php
public function rssAfterItem(Epsiode $episode, SimpleRSSElement $item): void public function rssAfterItem(Epsiode $episode, RssFeed $item): void
{ {
// … // …
} }
@ -75,11 +75,11 @@ public function rssAfterItem(Epsiode $episode, SimpleRSSElement $item): void
This hook is executed in the public pages' `<head>` tag. This hook is executed in the public pages' `<head>` tag.
This is a good place to add meta tags and third-party scripts to Castopod's This is a good place to add meta tags, custom styles, and third-party scripts to
public pages. Castopod's public pages.
```php ```php
public function siteHead(): void public function siteHead(HtmlHead $head): void
{ {
// … // …
} }

View file

@ -101,16 +101,16 @@ each property being a field key and the value being a `Field` object.
A field is a form element: A field is a form element:
| Property | Type | Note | | Property | Type | Note |
| ------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------ | | ------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------ |
| `type` | `checkbox` \| `datetime` \| `email` \| `group` \| `markdown` \| `number` \| `radio-group` \| `select-multiple` \| `select` \| `text` \| `textarea` \| `toggler` \| `url` | Default is `text` | | `type` | `checkbox` \| `datetime` \| `email` \| `group` \| `html` \| `markdown` \| `number` \| `radio-group` \| `rss` \| `select-multiple` \| `select` \| `text` \| `textarea` \| `toggler` \| `url` | Default is `text` |
| `label` (required) | `string` | Can be translated (see i18n) | | `label` (required) | `string` | Can be translated (see i18n) |
| `hint` | `string` | Can be translated (see i18n) | | `hint` | `string` | Can be translated (see i18n) |
| `helper` | `string` | Can be translated (see i18n) | | `helper` | `string` | Can be translated (see i18n) |
| `optional` | `boolean` | Default is `false` | | `optional` | `boolean` | Default is `false` |
| `options` | `Options` | Required for `radio-group`, `select-multiple`, and `select` types. | | `options` | `Options` | Required for `radio-group`, `select-multiple`, and `select` types. |
| `multiple` | `boolean` | Default is `false` | | `multiple` | `boolean` | Default is `false` |
| `fields` | `Array<string, Field>` | Required for `group` type | | `fields` | `Array<string, Field>` | Required for `group` type |
#### Options object #### Options object

View file

@ -2,8 +2,9 @@
title: 验证 & 授权 title: 验证 & 授权
--- ---
Castopod 使用 `codeigniter/shield` 处理身份验证和授权 与自定义规则。 角色和权限 Castopod 使用 `codeigniter/shield`
在两个级别上定义: Roles and permissions are defined at two levels: 处理身份验证和授权 与自定义规则。 角色和权限在两个级别上定义: Roles and
permissions are defined at two levels:
1. [实例范围](#1-instance-wide-roles-and-permissions) 1. [实例范围](#1-instance-wide-roles-and-permissions)
2. [每个播客](#2-per-podcast-roles-and-permissions) 2. [每个播客](#2-per-podcast-roles-and-permissions)

View file

@ -4,15 +4,12 @@ title: 官方 Docker 镜像
Castopod 在其自动构建期间会将 3 个 Docker 映像推送到 Docker Hub Castopod 在其自动构建期间会将 3 个 Docker 映像推送到 Docker Hub
- [**`castopod/castopod`**](https://hub.docker.com/r/castopod/castopod);一个使 - [**`castopod/castopod`**](https://hub.docker.com/r/castopod/castopod);一个使用 nginx 单元的整合 Castopod 镜像
用 nginx 单元的整合 Castopod 镜像 - [**`castopod/app`**](https://hub.docker.com/r/castopod/app):应用程序包,包含所有 Castopod 依赖关系
- [**`castopod/app`**](https://hub.docker.com/r/castopod/app):应用程序包,包含 - [**`castopod/web-server`**](https://hub.docker.com/r/castopod/web-server)Castopod 的 Nginx 配置
所有 Castopod 依赖关系
- [**`castopod/web-server`**](https://hub.docker.com/r/castopod/web-server)Castopod
的 Nginx 配置
此外Castopod 需要一个与 MySQL 兼容的数据库。 Redis 数据库 可以添加为缓存处理 此外Castopod 需要一个与 MySQL 兼容的数据库。 Redis 数据库 可以添加为缓存处理器。 A
器。 A Redis database can be added as a cache handler. Redis database can be added as a cache handler.
## 目前支持的标签 ## 目前支持的标签

View file

@ -35,9 +35,8 @@ PHP version 8.3 or higher is required, with the following extensions installed:
> 我们建议使用 [MariaDB](https://mariadb.org)。 > 我们建议使用 [MariaDB](https://mariadb.org)。
你需要填写服务器主机名、数据库名称、用户名和密码才能完成安装过程。 如果没有这 你需要填写服务器主机名、数据库名称、用户名和密码才能完成安装过程。 如果没有这些,请与你的服务器管理员联系。 If
些,请与你的服务器管理员联系。 If you do not have these, please contact your you do not have these, please contact your server administrator.
server administrator.
#### 权限 #### 权限
@ -46,8 +45,8 @@ server administrator.
### 可选FFmpeg v4.1.8 或更高版本,用于视频素材 ### 可选FFmpeg v4.1.8 或更高版本,用于视频素材
如果你需要视频素材,则需要 [FFFmpeg](https://www.ffmpeg.org/) 4.1.8 或更高版本。 如果你需要视频素材,则需要 [FFFmpeg](https://www.ffmpeg.org/)
必须安装以下扩展: The following extensions must be installed: 4.1.8 或更高版本。必须安装以下扩展: The following extensions must be installed:
- **FreeType 2** 来自库 - **FreeType 2** 来自库
[gd](https://www.php.net/manual/en/image.installation.php) [gd](https://www.php.net/manual/en/image.installation.php)
@ -63,11 +62,11 @@ server administrator.
### Pre-requisites ### Pre-requisites
0. 需要一台已经实现 [环境要求](#requirements)的 Web 服务器 0. 需要一台已经实现 [环境要求](#requirements)的 Web 服务器
1. 为 Castopod 创建一个 MySQL 数据库,其中用户具有访问和修改权限(有关详细信息, 1. 为 Castopod 创建一个 MySQL 数据库,其中用户具有访问和修改权限(有关详细信息,请参阅
请参阅 [MySQL 兼容数据库](#mysql-compatible-database))。 [MySQL 兼容数据库](#mysql-compatible-database))。
2. 使用 _SSL 证书_ 在您的域激活 HTTPS。 2. 使用 _SSL 证书_ 在您的域激活 HTTPS。
3. 下载最新的 [Castopod](https://castopod.org/) 到 web 服务器并解压(如果尚未下 3. 下载最新的 [Castopod](https://castopod.org/)
载)。 到 web 服务器并解压(如果尚未下载)。
- ⚠️ 将 web 服务器根目录设置为 `castopod` 文件夹中的 `public/` 子文件夹。 - ⚠️ 将 web 服务器根目录设置为 `castopod` 文件夹中的 `public/` 子文件夹。
4. 在 Web 服务器上为各种后台进程添加 **cron 任务** (相应地替换路径): 4. 在 Web 服务器上为各种后台进程添加 **cron 任务** (相应地替换路径):
@ -85,16 +84,16 @@ server administrator.
### (推荐) 安装向导 ### (推荐) 安装向导
1. 前往你最喜欢的浏览器并跳转至安装向导页面 1. 前往你最喜欢的浏览器并跳转至安装向导页面 (`https://your_domain_name.com/cp-install`)运行 Castopod 安装脚本。
(`https://your_domain_name.com/cp-install`)运行 Castopod 安装脚本。
2. 请按照屏幕上的说明进行操作。 2. 请按照屏幕上的说明进行操作。
3. 开始播客! 3. 开始播客!
<Aside> <Aside>
The install script writes a `.env` file in the package root. 安装脚本将会在根目 The install script writes a `.env` file in the package
录中创建一个 `.env` 文件并写入数据。 如果你不能执行安装向导,那么可以基于 root. 安装脚本将会在根目录中创建一个 `.env`
`.env.example` 文件手动创建和编辑 `.env` 文件。 文件并写入数据。 如果你不能执行安装向导,那么可以基于 `.env.example`
文件手动创建和编辑 `.env` 文件。
</Aside> </Aside>
@ -147,9 +146,9 @@ email.SMTPPass="你的邮件密码"
### 媒体存储 ### 媒体存储
By default, files are saved to the `public/media` folder using the file system. By default, files are saved to the `public/media` folder using the file
默认情况下,文件使用文件系统保存到 `公共/媒体` 文件夹中。 如果您需要将 `media` system. 默认情况下,文件使用文件系统保存到 `公共/媒体` 文件夹中。 如果您需要将
文件夹重新定位到其他位置,您可以在您的 `.env` 文件中指定它,如下所示: `media` 文件夹重新定位到其他位置,您可以在您的 `.env` 文件中指定它,如下所示:
```ini ```ini
# […] # […]
@ -194,9 +193,9 @@ media.s3.region="your_s3_region"
### 使用 YunoHost 安装 ### 使用 YunoHost 安装
[YunoHost](https://yunohost.org/) 是一个基于 Debian GNU/Linux 的发行版,由免费和 [YunoHost](https://yunohost.org/) 是一个基于 Debian
开源软件包组成。 它可以为你解决自托管的困难。 It manages the hardships of GNU/Linux 的发行版,由免费和开源软件包组成。 它可以为你解决自托管的困难。 It
self-hosting for you. manages the hardships of self-hosting for you.
<div class="flex flex-wrap items-center gap-4"> <div class="flex flex-wrap items-center gap-4">

View file

@ -5,8 +5,7 @@ title: 安全问题
Castopod 构建于 [CodeIgniter4](https://codeigniter.com/), PHP 框架上,鼓励 Castopod 构建于 [CodeIgniter4](https://codeigniter.com/), PHP 框架上,鼓励
[更好的安全实践](https://codeigniter.com/user_guide/concepts/security.html)。 [更好的安全实践](https://codeigniter.com/user_guide/concepts/security.html)。
为了最大限度地提高你实例的安全性并防止任何恶意攻击。 我们 建议你在安装或更新后检 为了最大限度地提高你实例的安全性并防止任何恶意攻击。 我们 建议你在安装或更新后检查所有的 Castopod 文件权限(避免任何之前的权限错误)
查所有的 Castopod 文件权限(避免任何之前的权限错误)
- `writable/` 文件夹权限为 **可读** 和 **可写**。 - `writable/` 文件夹权限为 **可读** 和 **可写**。
- `public/media/` 文件夹权限为 **可读** 和 **可写**。 - `public/media/` 文件夹权限为 **可读** 和 **可写**。

View file

@ -4,8 +4,7 @@ title: 如何更新 Castopod
import { Aside } from "@astrojs/starlight/components"; import { Aside } from "@astrojs/starlight/components";
安装 Castopod 后,你可能希望将实例更新到最新版本 版本以享受最新功能 ✨, 修复错误 安装 Castopod 后,你可能希望将实例更新到最新版本 版本以享受最新功能 ✨, 修复错误 🐛 和性能提升 ⚡。
🐛 和性能提升 ⚡。
## 更新说明 ## 更新说明
@ -13,14 +12,14 @@ import { Aside } from "@astrojs/starlight/components";
- 参看. [我应该在更新前进行备份吗?](#should-i-make-a-backup-before-updating) - 参看. [我应该在更新前进行备份吗?](#should-i-make-a-backup-before-updating)
1. 前往 [发布页面](https://code.castopod.org/adaures/castopod/-/releases) 和 查 1. 前往 [发布页面](https://code.castopod.org/adaures/castopod/-/releases)
看您的实例是否是最新的 Castopod 版本 和 查看您的实例是否是最新的 Castopod 版本
- 参看 - 参看
[我在哪里可以找到我的 Castopod 版本?](#where-can-i-find-my-castopod-version) [我在哪里可以找到我的 Castopod 版本?](#where-can-i-find-my-castopod-version)
2. 下载名为`Castopod Package`的最新发布包,你可以在 `zip` 或 `tar.gz` 压缩包之间 2. 下载名为`Castopod Package`的最新发布包,你可以在 `zip` 或 `tar.gz`
选择 压缩包之间选择
- ⚠️ 请确保你下载的是 Castopod 软件包而 **不是** 源代码 - ⚠️ 请确保你下载的是 Castopod 软件包而 **不是** 源代码
- 请注意,你还可以从 [castopod.org](https://castopod.org/) - 请注意,你还可以从 [castopod.org](https://castopod.org/)
@ -83,8 +82,9 @@ them sequentially, from the oldest to the newest.
1. 下载最新版本,覆盖您的文件,同时保留 `.env` 文件和 `public/media` 文件夹。 1. 下载最新版本,覆盖您的文件,同时保留 `.env` 文件和 `public/media` 文件夹。
2. 从 `v1.0.0-alpha.43` 开始,按顺序执行每个版本更新指令(从老版本到 最新版本) 2. 从 `v1.0.0-alpha.43`
然后是 `v1.0.0-alpha.44``v1.0.0-alpha.45`,…,直到 `v1.0.0-beta.1`。 开始,按顺序执行每个版本更新指令(从老版本到 最新版本),然后是
`v1.0.0-alpha.44``v1.0.0-alpha.45`,…,直到 `v1.0.0-beta.1`。
3. ✨ 享受你的新实例, 你已经更新完毕! 3. ✨ 享受你的新实例, 你已经更新完毕!

View file

@ -4,11 +4,10 @@ title: 欢迎 👋
import { LinkCard } from "@astrojs/starlight/components"; import { LinkCard } from "@astrojs/starlight/components";
Castopod 是一个免费的开源播客托管平台,为那些想要和听众接触与互动的播客们制作 Castopod 是一个免费的开源播客托管平台,为那些想要和听众接触与互动的播客们制作的。
的。
Castopod 易于安装,并使用 [CodeIgniter4](https://codeigniter.com/) 构建, 这是一 Castopod 易于安装,并使用 [CodeIgniter4](https://codeigniter.com/)
个强大的 PHP 框架,并且占用极小。 构建, 这是一个强大的 PHP 框架,并且占用极小。
<LinkCard title="安装" href="./getting-started/install" /> <LinkCard title="安装" href="./getting-started/install" />
@ -44,28 +43,24 @@ Castopod 易于安装,并使用 [CodeIgniter4](https://codeigniter.com/) 构
- 📤  也支持将播客移出 Castopod - 📤  也支持将播客移出 Castopod
- 🔀  多租户:根据需要托管任意数量的播客 - 🔀  多租户:根据需要托管任意数量的播客
- 👥  多用户:添加贡献者并设置角色 - 👥  多用户:添加贡献者并设置角色
- 🌎  i18n 支持:翻译成英语,法语,波兰语,德语,巴西葡萄牙语和西班牙语 - 🌎
...[还有更多](https://translate.castopod.org) and  i18n 支持:翻译成英语,法语,波兰语,德语,巴西葡萄牙语和西班牙语 ...[还有更多](https://translate.castopod.org) and
[many more](https://translate.castopod.org)! [many more](https://translate.castopod.org)!
## 创作动机 ## 创作动机
播客生态系统本质上是去中心化的:你可以创建自己的播客 RSS 文件,将其发布到网络上 播客生态系统本质上是去中心化的:你可以创建自己的播客 RSS 文件,将其发布到网络上并在线共享。
并在线共享。
事实上,它是唯一长期保持这种状态的媒体之一。 事实上,它是唯一长期保持这种状态的媒体之一。
随着习惯的发展,越来越多的人开始接触播客:允许创作者寻找新的方式来分享他们的想 随着习惯的发展,越来越多的人开始接触播客:允许创作者寻找新的方式来分享他们的想法,或是让听众获得更好的内容。
法,或是让听众获得更好的内容。
随着播客的使用越来越广泛,一些公司正试图控制播客与集中化。 随着播客的使用越来越广泛,一些公司正试图控制播客与集中化。
Castopod 的创建旨在提供一种开放且可持续的替代方案来托管你的播客,促进权力下放, Castopod 的创建旨在提供一种开放且可持续的替代方案来托管你的播客,促进权力下放,确保播客可以用创造力表达自己。
确保播客可以用创造力表达自己。
此项目由开源社区推动的,特别是 此项目由开源社区推动的,特别是由[联邦宇宙](https://fediverse.party/en/fediverse/)
由[联邦宇宙](https://fediverse.party/en/fediverse/) 和 和 [播客 2.0](https://podcastindex.org/) 推动。
[播客 2.0](https://podcastindex.org/) 推动。
## 与其他解决方案的对比 ## 与其他解决方案的对比
@ -75,51 +70,42 @@ gauge whether Castopod is the right fit for you.
### Castopod 对比 Wordpress ### Castopod 对比 Wordpress
Castopod 经常被称为 “播客中的 Wordpress”因为两者有很多相似之处。 在某些方面, Castopod 经常被称为 “播客中的 Wordpress”因为两者有很多相似之处。 在某些方面,确实如此。 实际上Castopod 受到 WordPress 生态的极大启发,看到了采用社区的易用性以及运行它的网站数量。 In
确实如此。 实际上Castopod 受到 WordPress 生态的极大启发,看到了采用社区的易用 some ways this is true. And actually, Castopod was greatly inspired by the
性以及运行它的网站数量。 In some ways this is true. And actually, Castopod was Wordpress ecosystem, seeing the ease of adoption from the community and the
greatly inspired by the Wordpress ecosystem, seeing the ease of adoption from number of websites running it.
the community and the number of websites running it.
就像 Wordpress 一样Castopod 是免费 & 开源的PHP 构建并使用 MySQL 数据库,可以 就像 Wordpress 一样Castopod 是免费 & 开源的PHP 构建并使用 MySQL 数据库,可以在大多数 Web 服务器上轻松安装。
在大多数 Web 服务器上轻松安装。
Wordpress 是创建你的网站,并使用插件扩展以获得想要内容的好办法。 这是一个成熟的 Wordpress 是创建你的网站,并使用插件扩展以获得想要内容的好办法。 这是一个成熟的 CMS可以帮助你在线访问任何类型的网站。 It
CMS可以帮助你在线访问任何类型的网站。 It is a full fledged CMS that helps you is a full fledged CMS that helps you get any type of website online.
get any type of website online.
另一方面Castopod 旨在专门满足播客的需求,专注于播客,而不是其他。 你不需要任何 另一方面Castopod 旨在专门满足播客的需求,专注于播客,而不是其他。 你不需要任何插件即可轻松开始播客之旅。 You
插件即可轻松开始播客之旅。 You don't need any plugin to get you started on your don't need any plugin to get you started on your podcasting journey.
podcasting journey.
还拥有对播客的独特优化:从播客的创建和新剧集的发布一直到广播,营销和分析。 还拥有对播客的独特优化:从播客的创建和新剧集的发布一直到广播,营销和分析。
最后根据你的需要Wordpress 和 Castopod 甚至可以共存,因为他们有相同的配置环 最后根据你的需要Wordpress 和 Castopod 甚至可以共存,因为他们有相同的配置环境!
境!
### Castopod 对比 Funkwhale ### Castopod 对比 Funkwhale
Funkwhale 是一个自托管、现代界面、免费开源的音乐服务器。 就像 Castopod 一 Funkwhale 是一个自托管、现代界面、免费开源的音乐服务器。 就像 Castopod 一样Funkwhale 也位于联邦宇宙中这是一个去中心化的社交网络允许两者的互联。Just
Funkwhale 也位于联邦宇宙中这是一个去中心化的社交网络允许两者的互联。Just
as Castopod, Funkwhale is on the fediverse, a decentralized social network as Castopod, Funkwhale is on the fediverse, a decentralized social network
allowing interoperability between the two. allowing interoperability between the two.
Funkwhale 最初是围绕音乐制作的。 后来随着项目的发展引入了托管播客的能力。And Funkwhale 最初是围绕音乐制作的。 后来随着项目的发展引入了托管播客的能力。And
later on, as the project evolved, the ability to host podcasts was introduced. later on, as the project evolved, the ability to host podcasts was introduced.
与 Funkwhale 不同Castopod 是只围绕播客设计和构建的。 这样可以更简单地实现与播 与 Funkwhale 不同Castopod 是只围绕播客设计和构建的。 这样可以更简单地实现与播客相关的生态系统,例如播客 2.0 功能(报表、 章节、地点、人员…)。 This
客相关的生态系统,例如播客 2.0 功能(报表、 章节、地点、人员…)。 This allows allows easier implementation for features related to the podcasting ecosystem,
easier implementation for features related to the podcasting ecosystem, such as such as the podcasting 2.0 features (transcripts, chapters, locations, persons,
the podcasting 2.0 features (transcripts, chapters, locations, persons, …). …).
因此,如果你想托管你的音乐库,你可能应该使用 Funkwhale如果您想主持一个播客 因此,如果你想托管你的音乐库,你可能应该使用 Funkwhale如果您想主持一个播客请使用 Castopod。
使用 Castopod。
### Castopod 与其他播客 ### Castopod 与其他播客
有许多非常棒地解决方案可供你托管播客,并 有许多非常棒地解决方案可供你托管播客,并且[很多](https://podcastindex.org/apps)正在搭上播客 2.0 的便车,就像 Castopod 一样!
且[很多](https://podcastindex.org/apps)正在搭上播客 2.0 的便车,就像 Castopod 一
样!
这些解决方案各不相同,你可以对比 [功能列表](#features)。 这些解决方案各不相同,你可以对比 [功能列表](#features)。
@ -129,34 +115,30 @@ the podcasting 2.0 features (transcripts, chapters, locations, persons, …).
full control over what you produce. Also, as it is open-source, you can even full control over what you produce. Also, as it is open-source, you can even
customize it as you wish. customize it as you wish.
- Castopod 是目前唯一一个同时集成去中心化的,带有 ActivePub 的社交网络以及很多播 - Castopod 是目前唯一一个同时集成去中心化的,带有 ActivePub 的社交网络以及很多播客 2.0 功能集成的解决方案,希望弥合两者之间的差距。
客 2.0 功能集成的解决方案,希望弥合两者之间的差距。
## 贡献 ## 贡献
喜欢 Castopod 并且想帮忙吗? 请查看以下文档以帮助你入门。 请查看以下文档以帮助你 喜欢 Castopod 并且想帮忙吗? 请查看以下文档以帮助你入门。 请查看以下文档以帮助你入门。
入门。
### 行为准则 ### 行为准则
Castopod has adopted a Code of Conduct that we expect project participants to Castopod has adopted a Code of Conduct that we expect project participants to
adhere to. Castopod 已经通过了一项行为准则,并希望所有的参与者都能够遵循本行为准 adhere to.
则。 请阅 Castopod 已经通过了一项行为准则,并希望所有的参与者都能够遵循本行为准则。 请阅读[行为准则](https://code.castopod.org/adaures/castopod/-/blob/beta/CODE_OF_CONDUCT.md)
读[行为准则](https://code.castopod.org/adaures/castopod/-/blob/beta/CODE_OF_CONDUCT.md)
以便了解哪些行为被允许,哪些行为不会被容忍。 以便了解哪些行为被允许,哪些行为不会被容忍。
### 贡献指南 ### 贡献指南
阅读我们的 [贡献指南](../contributing/guidelines.md) ,了解我们的开发过程。 提出 阅读我们的 [贡献指南](../contributing/guidelines.md)
错 误修正和改进想法,以及如何构建和测试 Castopod 。 ,了解我们的开发过程。 提出错 误修正和改进想法,以及如何构建和测试 Castopod 。
## 联系 ## 联系
你可以联系我们寻求帮助或提出任何问题: 你可以联系我们寻求帮助或提出任何问题:
- [Discord](https://castopod.org/discord) (用于与开发人员和社区直接互动) - [Discord](https://castopod.org/discord) (用于与开发人员和社区直接互动)
- [问题跟踪器](https://code.castopod.org/adaures/castopod/-/issues)(用于功能请 - [问题跟踪器](https://code.castopod.org/adaures/castopod/-/issues)(用于功能请求和错误报告)
求和错误报告)
或者,你可以在社交媒体上关注我们,以获取有关 Castopod 的新闻: 或者,你可以在社交媒体上关注我们,以获取有关 Castopod 的新闻:
@ -168,8 +150,8 @@ adhere to. Castopod 已经通过了一项行为准则,并希望所有的参与
## 赞助商 ## 赞助商
The ongoing development of Castopod is made possible with the support of its The ongoing development of Castopod is made possible with the support of its
backers. Castopod 的发展离不开赞助商的支持。 如果你想要帮助我们,请考 backers.
虑[赞助 Castopod 的开发](https://opencollective.com/castopod/contribute). Castopod 的发展离不开赞助商的支持。 如果你想要帮助我们,请考虑[赞助 Castopod 的开发](https://opencollective.com/castopod/contribute).
[![Ad Aures Logo](../../../assets/images/sponsors/adaures.svg)](https://adaures.com/) [![Ad Aures Logo](../../../assets/images/sponsors/adaures.svg)](https://adaures.com/)

View file

@ -2,8 +2,9 @@
title: 認證 & 授權 title: 認證 & 授權
--- ---
Castopod 使用 `codeigniter/shield` 處理身分認證和授權 與自定義規則。 腳色和權限 Castopod 使用 `codeigniter/shield`
在定義為兩個層級: Roles and permissions are defined at two levels: 處理身分認證和授權 與自定義規則。 腳色和權限在定義為兩個層級: Roles and
permissions are defined at two levels:
1. [實例範圍](#1-instance-wide-roles-and-permissions) 1. [實例範圍](#1-instance-wide-roles-and-permissions)
2. [每個播客](#2-per-podcast-roles-and-permissions) 2. [每個播客](#2-per-podcast-roles-and-permissions)

View file

@ -16,7 +16,7 @@ $routes->add('scheduled-video-clips', 'SchedulerController::generateVideoClips',
// Admin area routes // Admin area routes
$routes->group( $routes->group(
config('Admin') config('Admin')
->gateway, ->gateway,
[ [
'namespace' => 'Modules\Admin\Controllers', 'namespace' => 'Modules\Admin\Controllers',
], ],

View file

@ -25,6 +25,7 @@ class AboutController extends BaseController
'languages' => implode(', ', config('App')->supportedLocales), 'languages' => implode(', ', config('App')->supportedLocales),
]; ];
$this->setHtmlHead(lang('AboutCastopod.title'));
return view('settings/about', [ return view('settings/about', [
'info' => $instanceInfo, 'info' => $instanceInfo,
]); ]);

View file

@ -4,6 +4,7 @@ declare(strict_types=1);
namespace Modules\Admin\Controllers; namespace Modules\Admin\Controllers;
use App\Libraries\HtmlHead;
use CodeIgniter\Controller; use CodeIgniter\Controller;
use CodeIgniter\HTTP\IncomingRequest; use CodeIgniter\HTTP\IncomingRequest;
use CodeIgniter\HTTP\RequestInterface; use CodeIgniter\HTTP\RequestInterface;
@ -41,4 +42,16 @@ abstract class BaseController extends Controller
Theme::setTheme('admin'); Theme::setTheme('admin');
} }
protected function setHtmlHead(string $title): void
{
/** @var HtmlHead $head */
$head = service('html_head');
$head
->title($title . ' | Castopod Admin')
->description(
'Castopod is an open-source hosting platform made for podcasters who want engage and interact with their audience.'
);
}
} }

View file

@ -81,6 +81,7 @@ class DashboardController extends BaseController
'onlyPodcastId' => $onlyPodcastId, 'onlyPodcastId' => $onlyPodcastId,
]; ];
$this->setHtmlHead(lang('Dashboard.home'));
return view('dashboard', $data); return view('dashboard', $data);
} }
} }

View file

@ -115,6 +115,7 @@ class EpisodeController extends BaseController
'query' => $query, 'query' => $query,
]; ];
$this->setHtmlHead(lang('Episode.all_podcast_episodes'));
replace_breadcrumb_params([ replace_breadcrumb_params([
0 => $this->podcast->at_handle, 0 => $this->podcast->at_handle,
]); ]);
@ -128,6 +129,7 @@ class EpisodeController extends BaseController
'episode' => $this->episode, 'episode' => $this->episode,
]; ];
$this->setHtmlHead($this->episode->title);
replace_breadcrumb_params([ replace_breadcrumb_params([
0 => $this->podcast->at_handle, 0 => $this->podcast->at_handle,
1 => $this->episode->title, 1 => $this->episode->title,
@ -148,6 +150,8 @@ class EpisodeController extends BaseController
$currentSeasonNumber $currentSeasonNumber
), ),
]; ];
$this->setHtmlHead(lang('Episode.create'));
replace_breadcrumb_params([ replace_breadcrumb_params([
0 => $this->podcast->at_handle, 0 => $this->podcast->at_handle,
]); ]);
@ -261,6 +265,7 @@ class EpisodeController extends BaseController
'episode' => $this->episode, 'episode' => $this->episode,
]; ];
$this->setHtmlHead(lang('Episode.edit'));
replace_breadcrumb_params([ replace_breadcrumb_params([
0 => $this->podcast->at_handle, 0 => $this->podcast->at_handle,
1 => $this->episode->title, 1 => $this->episode->title,
@ -409,6 +414,7 @@ class EpisodeController extends BaseController
'episode' => $this->episode, 'episode' => $this->episode,
]; ];
$this->setHtmlHead(lang('Episode.publish'));
replace_breadcrumb_params([ replace_breadcrumb_params([
0 => $this->podcast->at_handle, 0 => $this->podcast->at_handle,
1 => $this->episode->title, 1 => $this->episode->title,
@ -521,6 +527,7 @@ class EpisodeController extends BaseController
->first(), ->first(),
]; ];
$this->setHtmlHead(lang('Episode.publish_edit'));
replace_breadcrumb_params([ replace_breadcrumb_params([
0 => $this->podcast->at_handle, 0 => $this->podcast->at_handle,
1 => $this->episode->title, 1 => $this->episode->title,
@ -670,11 +677,11 @@ class EpisodeController extends BaseController
'episode' => $this->episode, 'episode' => $this->episode,
]; ];
$this->setHtmlHead(lang('Episode.publish_date_edit'));
replace_breadcrumb_params([ replace_breadcrumb_params([
0 => $this->podcast->title, 0 => $this->podcast->title,
1 => $this->episode->title, 1 => $this->episode->title,
]); ]);
return view('episode/publish_date_edit', $data); return view('episode/publish_date_edit', $data);
} }
@ -746,6 +753,7 @@ class EpisodeController extends BaseController
'episode' => $this->episode, 'episode' => $this->episode,
]; ];
$this->setHtmlHead(lang('Episode.unpublish'));
replace_breadcrumb_params([ replace_breadcrumb_params([
0 => $this->podcast->title, 0 => $this->podcast->title,
1 => $this->episode->title, 1 => $this->episode->title,
@ -822,6 +830,7 @@ class EpisodeController extends BaseController
'episode' => $this->episode, 'episode' => $this->episode,
]; ];
$this->setHtmlHead(lang('Episode.delete'));
replace_breadcrumb_params([ replace_breadcrumb_params([
0 => $this->podcast->at_handle, 0 => $this->podcast->at_handle,
1 => $this->episode->title, 1 => $this->episode->title,
@ -928,6 +937,7 @@ class EpisodeController extends BaseController
'themes' => EpisodeModel::$themes, 'themes' => EpisodeModel::$themes,
]; ];
$this->setHtmlHead(lang('Episode.embed.title'));
replace_breadcrumb_params([ replace_breadcrumb_params([
0 => $this->podcast->at_handle, 0 => $this->podcast->at_handle,
1 => $this->episode->title, 1 => $this->episode->title,

View file

@ -58,6 +58,8 @@ class EpisodePersonController extends BaseController
'personOptions' => (new PersonModel())->getPersonOptions(), 'personOptions' => (new PersonModel())->getPersonOptions(),
'taxonomyOptions' => (new PersonModel())->getTaxonomyOptions(), 'taxonomyOptions' => (new PersonModel())->getTaxonomyOptions(),
]; ];
$this->setHtmlHead(lang('Person.episode_form.title'));
replace_breadcrumb_params([ replace_breadcrumb_params([
0 => $this->podcast->at_handle, 0 => $this->podcast->at_handle,
1 => $this->episode->title, 1 => $this->episode->title,

View file

@ -26,6 +26,7 @@ class FediverseController extends BaseController
$blockedActors = model('ActorModel', false) $blockedActors = model('ActorModel', false)
->getBlockedActors(); ->getBlockedActors();
$this->setHtmlHead(lang('Fediverse.blocked_actors'));
return view('fediverse/blocked_actors', [ return view('fediverse/blocked_actors', [
'blockedActors' => $blockedActors, 'blockedActors' => $blockedActors,
]); ]);
@ -38,6 +39,7 @@ class FediverseController extends BaseController
$blockedDomains = model('BlockedDomainModel', false) $blockedDomains = model('BlockedDomainModel', false)
->getBlockedDomains(); ->getBlockedDomains();
$this->setHtmlHead(lang('Fediverse.blocked_domains'));
return view('fediverse/blocked_domains', [ return view('fediverse/blocked_domains', [
'blockedDomains' => $blockedDomains, 'blockedDomains' => $blockedDomains,
]); ]);

View file

@ -66,10 +66,10 @@ class NotificationController extends BaseController
'pager' => $notifications->pager, 'pager' => $notifications->pager,
]; ];
$this->setHtmlHead(lang('Notifications.title'));
replace_breadcrumb_params([ replace_breadcrumb_params([
0 => $this->podcast->at_handle, 0 => $this->podcast->at_handle,
]); ]);
return view('podcast/notifications', $data); return view('podcast/notifications', $data);
} }

View file

@ -34,6 +34,7 @@ class PageController extends BaseController
public function list(): string public function list(): string
{ {
$this->setHtmlHead(lang('Page.all_pages'));
$data = [ $data = [
'pages' => (new PageModel())->findAll(), 'pages' => (new PageModel())->findAll(),
]; ];
@ -43,6 +44,7 @@ class PageController extends BaseController
public function view(): string public function view(): string
{ {
$this->setHtmlHead($this->page->title);
return view('page/view', [ return view('page/view', [
'page' => $this->page, 'page' => $this->page,
]); ]);
@ -52,6 +54,7 @@ class PageController extends BaseController
{ {
helper('form'); helper('form');
$this->setHtmlHead(lang('Page.create'));
return view('page/create'); return view('page/create');
} }
@ -83,6 +86,7 @@ class PageController extends BaseController
{ {
helper('form'); helper('form');
$this->setHtmlHead(lang('Page.edit'));
replace_breadcrumb_params([ replace_breadcrumb_params([
0 => $this->page->title, 0 => $this->page->title,
]); ]);

View file

@ -42,6 +42,7 @@ class PersonController extends BaseController
->findAll(), ->findAll(),
]; ];
$this->setHtmlHead(lang('Person.all_persons'));
return view('person/list', $data); return view('person/list', $data);
} }
@ -51,6 +52,7 @@ class PersonController extends BaseController
'person' => $this->person, 'person' => $this->person,
]; ];
$this->setHtmlHead($this->person->full_name);
replace_breadcrumb_params([ replace_breadcrumb_params([
0 => $this->person->full_name, 0 => $this->person->full_name,
]); ]);
@ -61,6 +63,7 @@ class PersonController extends BaseController
{ {
helper(['form']); helper(['form']);
$this->setHtmlHead(lang('Person.create'));
return view('person/create'); return view('person/create');
} }
@ -112,6 +115,7 @@ class PersonController extends BaseController
'person' => $this->person, 'person' => $this->person,
]; ];
$this->setHtmlHead(lang('Person.edit'));
replace_breadcrumb_params([ replace_breadcrumb_params([
0 => $this->person->full_name, 0 => $this->person->full_name,
]); ]);

View file

@ -68,6 +68,7 @@ class PodcastController extends BaseController
]; ];
} }
$this->setHtmlHead(lang('Podcast.all_podcasts'));
return view('podcast/list', $data); return view('podcast/list', $data);
} }
@ -77,6 +78,7 @@ class PodcastController extends BaseController
'podcast' => $this->podcast, 'podcast' => $this->podcast,
]; ];
$this->setHtmlHead($this->podcast->title);
replace_breadcrumb_params([ replace_breadcrumb_params([
0 => $this->podcast->at_handle, 0 => $this->podcast->at_handle,
]); ]);
@ -89,6 +91,7 @@ class PodcastController extends BaseController
'podcast' => $this->podcast, 'podcast' => $this->podcast,
]; ];
$this->setHtmlHead($this->podcast->title);
replace_breadcrumb_params([ replace_breadcrumb_params([
0 => $this->podcast->at_handle, 0 => $this->podcast->at_handle,
]); ]);
@ -101,6 +104,7 @@ class PodcastController extends BaseController
'podcast' => $this->podcast, 'podcast' => $this->podcast,
]; ];
$this->setHtmlHead($this->podcast->title);
replace_breadcrumb_params([ replace_breadcrumb_params([
0 => $this->podcast->at_handle, 0 => $this->podcast->at_handle,
]); ]);
@ -113,6 +117,7 @@ class PodcastController extends BaseController
'podcast' => $this->podcast, 'podcast' => $this->podcast,
]; ];
$this->setHtmlHead($this->podcast->title);
replace_breadcrumb_params([ replace_breadcrumb_params([
0 => $this->podcast->at_handle, 0 => $this->podcast->at_handle,
]); ]);
@ -125,6 +130,7 @@ class PodcastController extends BaseController
'podcast' => $this->podcast, 'podcast' => $this->podcast,
]; ];
$this->setHtmlHead($this->podcast->title);
replace_breadcrumb_params([ replace_breadcrumb_params([
0 => $this->podcast->at_handle, 0 => $this->podcast->at_handle,
]); ]);
@ -137,6 +143,7 @@ class PodcastController extends BaseController
'podcast' => $this->podcast, 'podcast' => $this->podcast,
]; ];
$this->setHtmlHead($this->podcast->title);
replace_breadcrumb_params([ replace_breadcrumb_params([
0 => $this->podcast->at_handle, 0 => $this->podcast->at_handle,
]); ]);
@ -149,6 +156,7 @@ class PodcastController extends BaseController
'podcast' => $this->podcast, 'podcast' => $this->podcast,
]; ];
$this->setHtmlHead($this->podcast->title);
replace_breadcrumb_params([ replace_breadcrumb_params([
0 => $this->podcast->at_handle, 0 => $this->podcast->at_handle,
]); ]);
@ -161,6 +169,7 @@ class PodcastController extends BaseController
'podcast' => $this->podcast, 'podcast' => $this->podcast,
]; ];
$this->setHtmlHead($this->podcast->title);
replace_breadcrumb_params([ replace_breadcrumb_params([
0 => $this->podcast->at_handle, 0 => $this->podcast->at_handle,
]); ]);
@ -180,6 +189,7 @@ class PodcastController extends BaseController
'browserLang' => get_browser_language($this->request->getServer('HTTP_ACCEPT_LANGUAGE')), 'browserLang' => get_browser_language($this->request->getServer('HTTP_ACCEPT_LANGUAGE')),
]; ];
$this->setHtmlHead(lang('Podcast.create'));
return view('podcast/create', $data); return view('podcast/create', $data);
} }
@ -270,6 +280,7 @@ class PodcastController extends BaseController
'categoryOptions' => $categoryOptions, 'categoryOptions' => $categoryOptions,
]; ];
$this->setHtmlHead(lang('Podcast.edit'));
replace_breadcrumb_params([ replace_breadcrumb_params([
0 => $this->podcast->at_handle, 0 => $this->podcast->at_handle,
]); ]);
@ -410,6 +421,7 @@ class PodcastController extends BaseController
'podcast' => $this->podcast, 'podcast' => $this->podcast,
]; ];
$this->setHtmlHead(lang('Podcast.delete'));
replace_breadcrumb_params([ replace_breadcrumb_params([
0 => $this->podcast->at_handle, 0 => $this->podcast->at_handle,
]); ]);
@ -578,10 +590,10 @@ class PodcastController extends BaseController
'podcast' => $this->podcast, 'podcast' => $this->podcast,
]; ];
$this->setHtmlHead(lang('Podcast.publish'));
replace_breadcrumb_params([ replace_breadcrumb_params([
0 => $this->podcast->at_handle, 0 => $this->podcast->at_handle,
]); ]);
return view('podcast/publish', $data); return view('podcast/publish', $data);
} }
@ -713,10 +725,10 @@ class PodcastController extends BaseController
->first(), ->first(),
]; ];
$this->setHtmlHead(lang('Podcast.publish_edit'));
replace_breadcrumb_params([ replace_breadcrumb_params([
0 => $this->podcast->at_handle, 0 => $this->podcast->at_handle,
]); ]);
return view('podcast/publish_edit', $data); return view('podcast/publish_edit', $data);
} }

View file

@ -46,6 +46,8 @@ class PodcastPersonController extends BaseController
'personOptions' => (new PersonModel())->getPersonOptions(), 'personOptions' => (new PersonModel())->getPersonOptions(),
'taxonomyOptions' => (new PersonModel())->getTaxonomyOptions(), 'taxonomyOptions' => (new PersonModel())->getTaxonomyOptions(),
]; ];
$this->setHtmlHead(lang('Person.podcast_form.title'));
replace_breadcrumb_params([ replace_breadcrumb_params([
0 => $this->podcast->at_handle, 0 => $this->podcast->at_handle,
]); ]);

View file

@ -30,6 +30,7 @@ class SettingsController extends BaseController
public function index(): string public function index(): string
{ {
helper('form'); helper('form');
$this->setHtmlHead(lang('Settings.title'));
return view('settings/general'); return view('settings/general');
} }
@ -202,6 +203,7 @@ class SettingsController extends BaseController
public function theme(): string public function theme(): string
{ {
helper('form'); helper('form');
$this->setHtmlHead(lang('Settings.theme.title'));
return view('settings/theme'); return view('settings/theme');
} }

View file

@ -76,6 +76,7 @@ class SoundbiteController extends BaseController
'pager' => $soundbitesBuilder->pager, 'pager' => $soundbitesBuilder->pager,
]; ];
$this->setHtmlHead(lang('Soundbite.list.title'));
replace_breadcrumb_params([ replace_breadcrumb_params([
0 => $this->podcast->at_handle, 0 => $this->podcast->at_handle,
1 => $this->episode->title, 1 => $this->episode->title,
@ -92,6 +93,7 @@ class SoundbiteController extends BaseController
'episode' => $this->episode, 'episode' => $this->episode,
]; ];
$this->setHtmlHead(lang('Soundbite.form.title'));
replace_breadcrumb_params([ replace_breadcrumb_params([
0 => $this->podcast->at_handle, 0 => $this->podcast->at_handle,
1 => $this->episode->title, 1 => $this->episode->title,

View file

@ -82,6 +82,7 @@ class VideoClipsController extends BaseController
'pager' => $videoClipsBuilder->pager, 'pager' => $videoClipsBuilder->pager,
]; ];
$this->setHtmlHead(lang('VideoClip.list.title'));
replace_breadcrumb_params([ replace_breadcrumb_params([
0 => $this->podcast->at_handle, 0 => $this->podcast->at_handle,
1 => $this->episode->title, 1 => $this->episode->title,
@ -99,6 +100,9 @@ class VideoClipsController extends BaseController
'videoClip' => $videoClip, 'videoClip' => $videoClip,
]; ];
$this->setHtmlHead(lang('VideoClip.title', [
'videoClipLabel' => esc($videoClip->title),
]));
replace_breadcrumb_params([ replace_breadcrumb_params([
0 => $this->podcast->at_handle, 0 => $this->podcast->at_handle,
1 => $this->episode->title, 1 => $this->episode->title,
@ -128,9 +132,10 @@ class VideoClipsController extends BaseController
'transcript' => $this->episode->transcript instanceof Transcript, 'transcript' => $this->episode->transcript instanceof Transcript,
]; ];
$this->setHtmlHead(lang('VideoClip.form.title'));
if (in_array(false, $checks, true)) { if (in_array(false, $checks, true)) {
$data['checks'] = $checks; $data['checks'] = $checks;
return view('episode/video_clips_requirements', $data); return view('episode/video_clips_requirements', $data);
} }

View file

@ -2,15 +2,13 @@
declare(strict_types=1); declare(strict_types=1);
use CodeIgniter\Router\RouteCollection;
/** /**
* @copyright 2021 Ad Aures * @copyright 2021 Ad Aures
* @license https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3 * @license https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
* @link https://castopod.org/ * @link https://castopod.org/
*/ */
/** @var RouteCollection $routes */ /** @var \CodeIgniter\Router\RouteCollection $routes */
/** /**
* Analytics routes file * Analytics routes file

View file

@ -13,6 +13,7 @@ declare(strict_types=1);
namespace Modules\Analytics\Entities; namespace Modules\Analytics\Entities;
use CodeIgniter\Entity\Entity; use CodeIgniter\Entity\Entity;
use CodeIgniter\I18n\Time;
/** /**
* @property int $podcast_id * @property int $podcast_id

View file

@ -13,6 +13,7 @@ declare(strict_types=1);
namespace Modules\Analytics\Entities; namespace Modules\Analytics\Entities;
use CodeIgniter\Entity\Entity; use CodeIgniter\Entity\Entity;
use CodeIgniter\I18n\Time;
/** /**
* @property int $podcast_id * @property int $podcast_id

View file

@ -13,6 +13,7 @@ declare(strict_types=1);
namespace Modules\Analytics\Entities; namespace Modules\Analytics\Entities;
use CodeIgniter\Entity\Entity; use CodeIgniter\Entity\Entity;
use CodeIgniter\I18n\Time;
/** /**
* @property int $podcast_id * @property int $podcast_id

View file

@ -13,6 +13,7 @@ declare(strict_types=1);
namespace Modules\Analytics\Entities; namespace Modules\Analytics\Entities;
use CodeIgniter\Entity\Entity; use CodeIgniter\Entity\Entity;
use CodeIgniter\I18n\Time;
/** /**
* @property int $podcast_id * @property int $podcast_id

View file

@ -13,6 +13,7 @@ declare(strict_types=1);
namespace Modules\Analytics\Entities; namespace Modules\Analytics\Entities;
use CodeIgniter\Entity\Entity; use CodeIgniter\Entity\Entity;
use CodeIgniter\I18n\Time;
/** /**
* @property int $podcast_id * @property int $podcast_id

View file

@ -13,6 +13,7 @@ declare(strict_types=1);
namespace Modules\Analytics\Entities; namespace Modules\Analytics\Entities;
use CodeIgniter\Entity\Entity; use CodeIgniter\Entity\Entity;
use CodeIgniter\I18n\Time;
/** /**
* @property int $podcast_id * @property int $podcast_id

View file

@ -13,6 +13,7 @@ declare(strict_types=1);
namespace Modules\Analytics\Entities; namespace Modules\Analytics\Entities;
use CodeIgniter\Entity\Entity; use CodeIgniter\Entity\Entity;
use CodeIgniter\I18n\Time;
use Opawg\UserAgentsV2Php\UserAgentsRSS; use Opawg\UserAgentsV2Php\UserAgentsRSS;
/** /**

View file

@ -11,6 +11,7 @@ declare(strict_types=1);
namespace Modules\Analytics\Entities; namespace Modules\Analytics\Entities;
use CodeIgniter\Entity\Entity; use CodeIgniter\Entity\Entity;
use CodeIgniter\I18n\Time;
/** /**
* @property int $podcast_id * @property int $podcast_id

View file

@ -13,6 +13,7 @@ declare(strict_types=1);
namespace Modules\Analytics\Entities; namespace Modules\Analytics\Entities;
use CodeIgniter\Entity\Entity; use CodeIgniter\Entity\Entity;
use CodeIgniter\I18n\Time;
/** /**
* @property int $id * @property int $id

View file

@ -13,6 +13,7 @@ declare(strict_types=1);
namespace Modules\Analytics\Entities; namespace Modules\Analytics\Entities;
use CodeIgniter\Entity\Entity; use CodeIgniter\Entity\Entity;
use CodeIgniter\I18n\Time;
/** /**
* @property int $podcast_id * @property int $podcast_id

View file

@ -13,6 +13,7 @@ declare(strict_types=1);
namespace Modules\Analytics\Entities; namespace Modules\Analytics\Entities;
use CodeIgniter\Entity\Entity; use CodeIgniter\Entity\Entity;
use CodeIgniter\I18n\Time;
/** /**
* @property int $podcast_id * @property int $podcast_id

View file

@ -13,6 +13,7 @@ declare(strict_types=1);
namespace Modules\Analytics\Entities; namespace Modules\Analytics\Entities;
use CodeIgniter\Entity\Entity; use CodeIgniter\Entity\Entity;
use CodeIgniter\I18n\Time;
/** /**
* @property int $podcast_id * @property int $podcast_id

View file

@ -286,8 +286,7 @@ if (! function_exists('podcast_hit')) {
$parts = explode('-', $range); $parts = explode('-', $range);
$downloadedBytes += array_key_exists(1, $parts) $downloadedBytes += array_key_exists(1, $parts)
? $fileSize ? $fileSize
: (int) $parts[1] - : (int) $parts[1] - (int) $parts[0];
(array_key_exists(0, $parts) ? 0 : (int) $parts[0]);
} }
} }

View file

@ -71,7 +71,7 @@ class EpisodeController extends Controller
protected static function mapEpisode(Episode $episode): Episode protected static function mapEpisode(Episode $episode): Episode
{ {
$episode->cover_url = $episode->getCover() $episode->cover_url = $episode->getCover()
->file_url; ->file_url;
$episode->duration = round($episode->audio->duration); $episode->duration = round($episode->audio->duration);
return $episode; return $episode;

View file

@ -44,9 +44,9 @@ class PodcastController extends Controller
{ {
$podcast->feed_url = $podcast->getFeedUrl(); $podcast->feed_url = $podcast->getFeedUrl();
$podcast->actor_display_name = $podcast->getActor() $podcast->actor_display_name = $podcast->getActor()
->display_name; ->display_name;
$podcast->cover_url = $podcast->getCover() $podcast->cover_url = $podcast->getCover()
->file_url; ->file_url;
$categories = [$podcast->getCategory(), ...$podcast->getOtherCategories()]; $categories = [$podcast->getCategory(), ...$podcast->getOtherCategories()];

View file

@ -56,6 +56,7 @@ class ContributorController extends BaseController
'podcast' => $this->podcast, 'podcast' => $this->podcast,
]; ];
$this->setHtmlHead(lang('Contributor.podcast_contributors'));
replace_breadcrumb_params([ replace_breadcrumb_params([
0 => $this->podcast->at_handle, 0 => $this->podcast->at_handle,
]); ]);
@ -69,6 +70,10 @@ class ContributorController extends BaseController
'contributor' => (new UserModel())->getPodcastContributor($this->contributor->id, $this->podcast->id), 'contributor' => (new UserModel())->getPodcastContributor($this->contributor->id, $this->podcast->id),
]; ];
$this->setHtmlHead(lang('Contributor.view', [
'username' => esc($this->contributor->username),
'podcastTitle' => esc($this->podcast->title),
]));
replace_breadcrumb_params([ replace_breadcrumb_params([
0 => $this->podcast->at_handle, 0 => $this->podcast->at_handle,
1 => $this->contributor->username, 1 => $this->contributor->username,
@ -113,6 +118,7 @@ class ContributorController extends BaseController
'roleOptions' => $roleOptions, 'roleOptions' => $roleOptions,
]; ];
$this->setHtmlHead(lang('Contributor.add_contributor', [esc($this->podcast->title)]));
replace_breadcrumb_params([ replace_breadcrumb_params([
0 => $this->podcast->at_handle, 0 => $this->podcast->at_handle,
]); ]);
@ -170,6 +176,7 @@ class ContributorController extends BaseController
'roleOptions' => $roleOptions, 'roleOptions' => $roleOptions,
]; ];
$this->setHtmlHead(lang('Contributor.edit_role', [esc($this->contributor->username)]));
replace_breadcrumb_params([ replace_breadcrumb_params([
0 => $this->podcast->at_handle, 0 => $this->podcast->at_handle,
1 => $this->contributor->username, 1 => $this->contributor->username,
@ -208,6 +215,9 @@ class ContributorController extends BaseController
'contributor' => $this->contributor, 'contributor' => $this->contributor,
]; ];
$this->setHtmlHead(lang('Contributor.delete_form.title', [
'contributor' => $this->contributor->username,
]));
replace_breadcrumb_params([ replace_breadcrumb_params([
0 => $this->podcast->at_handle, 0 => $this->podcast->at_handle,
1 => $this->contributor->username, 1 => $this->contributor->username,

View file

@ -18,6 +18,7 @@ class MyAccountController extends BaseController
{ {
public function index(): string public function index(): string
{ {
$this->setHtmlHead(lang('MyAccount.info'));
return view('my_account/view'); return view('my_account/view');
} }
@ -25,6 +26,7 @@ class MyAccountController extends BaseController
{ {
helper('form'); helper('form');
$this->setHtmlHead(lang('MyAccount.changePassword'));
return view('my_account/change_password'); return view('my_account/change_password');
} }

View file

@ -42,6 +42,7 @@ class UserController extends BaseController
'users' => (new UserModel())->findAll(), 'users' => (new UserModel())->findAll(),
]; ];
$this->setHtmlHead(lang('User.all_users'));
return view('user/list', $data); return view('user/list', $data);
} }
@ -51,6 +52,9 @@ class UserController extends BaseController
'user' => $this->user, 'user' => $this->user,
]; ];
$this->setHtmlHead(lang('User.view', [
'username' => esc($this->user->username),
]));
replace_breadcrumb_params([ replace_breadcrumb_params([
0 => $this->user->username, 0 => $this->user->username,
]); ]);
@ -76,6 +80,7 @@ class UserController extends BaseController
'roleOptions' => $roleOptions, 'roleOptions' => $roleOptions,
]; ];
$this->setHtmlHead(lang('User.create'));
return view('user/create', $data); return view('user/create', $data);
} }
@ -182,6 +187,9 @@ class UserController extends BaseController
'roleOptions' => $roleOptions, 'roleOptions' => $roleOptions,
]; ];
$this->setHtmlHead(lang('User.edit_role', [
'username' => esc($this->user->username),
]));
replace_breadcrumb_params([ replace_breadcrumb_params([
0 => $this->user->username, 0 => $this->user->username,
]); ]);
@ -221,6 +229,9 @@ class UserController extends BaseController
'user' => $this->user, 'user' => $this->user,
]; ];
$this->setHtmlHead(lang('User.delete_form.title', [
'user' => $this->user->username,
]));
replace_breadcrumb_params([ replace_breadcrumb_params([
0 => $this->user->username, 0 => $this->user->username,
]); ]);

View file

@ -10,6 +10,7 @@ declare(strict_types=1);
namespace Modules\Fediverse\Entities; namespace Modules\Fediverse\Entities;
use CodeIgniter\I18n\Time;
use Michalsn\Uuid\UuidEntity; use Michalsn\Uuid\UuidEntity;
use RuntimeException; use RuntimeException;

View file

@ -41,7 +41,7 @@ if (! function_exists('split_handle')) {
/** /**
* Splits handle into its parts (username, host and port) * Splits handle into its parts (username, host and port)
* *
* @return array<string, string>|false * @return array{0:string,username:non-empty-string,1:non-empty-string,domain:non-empty-string,2:non-empty-string,port?:non-falsy-string,3?:non-falsy-string}
*/ */
function split_handle(string $handle): array | false function split_handle(string $handle): array | false
{ {

View file

@ -101,7 +101,7 @@ class WebFinger
/** /**
* Split resource into its parts (username, domain) * Split resource into its parts (username, domain)
* *
* @return array<string, string>|false * @return array{0:string,username:non-empty-string,1:non-empty-string,2:non-empty-string,domain:non-falsy-string,3:non-falsy-string,4:non-falsy-string,5?:non-falsy-string}
*/ */
private function splitResource(string $resource): bool|array private function splitResource(string $resource): bool|array
{ {

View file

@ -25,7 +25,7 @@ use RuntimeException;
* @property string $file_extension * @property string $file_extension
* @property int $file_size * @property int $file_size
* @property string $file_mimetype * @property string $file_mimetype
* @property array|null $file_metadata * @property array<mixed>|null $file_metadata
* @property 'image'|'audio'|'video'|'document' $type * @property 'image'|'audio'|'video'|'document' $type
* @property string|null $description * @property string|null $description
* @property string|null $language_code * @property string|null $language_code

View file

@ -16,7 +16,7 @@ use GdImage;
use Override; use Override;
/** /**
* @property array $sizes * @property array<string, array<string, int|string>> $sizes
*/ */
class Image extends BaseMedia class Image extends BaseMedia
{ {

View file

@ -34,7 +34,7 @@ if (! function_exists('download_file')) {
curl_setopt($ch, CURLOPT_HTTPHEADER, ['User-Agent: Castopod/' . CP_VERSION]); curl_setopt($ch, CURLOPT_HTTPHEADER, ['User-Agent: Castopod/' . CP_VERSION]);
// follow redirects up to 20, like Apple Podcasts // follow redirects up to 20, like Apple Podcasts
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_MAXREDIRS, 20); curl_setopt($ch, CURLOPT_MAXREDIRS, 20);
curl_exec($ch); curl_exec($ch);

View file

@ -55,10 +55,10 @@ class PlatformController extends BaseController
'platforms' => (new PlatformModel())->getPlatformsWithData($this->podcast->id, $platformType), 'platforms' => (new PlatformModel())->getPlatformsWithData($this->podcast->id, $platformType),
]; ];
$this->setHtmlHead(lang("Platforms.title.{$platformType}"));
replace_breadcrumb_params([ replace_breadcrumb_params([
0 => $this->podcast->at_handle, 0 => $this->podcast->at_handle,
]); ]);
return view('podcast/platforms', $data); return view('podcast/platforms', $data);
} }

View file

@ -127,7 +127,7 @@ class PlatformModel extends Model
} }
/** /**
* @param array<array<string, string|int>> $data * @param array<array<string, bool|int|string|null>> $data
* *
* @return int|false Number of rows inserted or FALSE on failure * @return int|false Number of rows inserted or FALSE on failure
*/ */

View file

@ -458,7 +458,7 @@ class Platforms
} }
/** /**
* @return null|array{label:string,home_url:string,submit_url:?string}> * @return null|array{label:string,home_url:string,submit_url:?string}
*/ */
public function findPlatformBySlug(string $type, string $slug): ?array public function findPlatformBySlug(string $type, string $slug): ?array
{ {

View file

@ -16,10 +16,10 @@ class CreatePlugin extends BaseCommand
{ {
protected const HOOKS_IMPORTS = [ protected const HOOKS_IMPORTS = [
'rssBeforeChannel' => ['use App\Entities\Podcast;'], 'rssBeforeChannel' => ['use App\Entities\Podcast;'],
'rssAfterChannel' => ['use App\Entities\Podcast;', 'use App\Libraries\SimpleRSSElement;'], 'rssAfterChannel' => ['use App\Entities\Podcast;', 'use App\Libraries\RssFeed;'],
'rssBeforeItem' => ['use App\Entities\Episode;'], 'rssBeforeItem' => ['use App\Entities\Episode;'],
'rssAfterItem' => ['use App\Entities\Episode;', 'use App\Libraries\SimpleRSSElement;'], 'rssAfterItem' => ['use App\Entities\Episode;', 'use App\Libraries\RssFeed;'],
'siteHead' => [], 'siteHead' => ['use use App\Libraries\HtmlHead'],
]; ];
protected const HOOKS_METHODS = [ protected const HOOKS_METHODS = [
@ -27,7 +27,7 @@ class CreatePlugin extends BaseCommand
{ {
// YOUR CODE HERE // YOUR CODE HERE
}', }',
'rssAfterChannel' => ' public function rssAfterChannel(Podcast $podcast, SimpleRSSElement $channel): void 'rssAfterChannel' => ' public function rssAfterChannel(Podcast $podcast, RssFeed $channel): void
{ {
// YOUR CODE HERE // YOUR CODE HERE
}', }',
@ -35,11 +35,11 @@ class CreatePlugin extends BaseCommand
{ {
// YOUR CODE HERE // YOUR CODE HERE
}', }',
'rssAfterItem' => ' public function rssAfterItem(Episode $episode, SimpleRSSElement $item): void 'rssAfterItem' => ' public function rssAfterItem(Episode $episode, RssFeed $item): void
{ {
// YOUR CODE HERE // YOUR CODE HERE
}', }',
'siteHead' => ' public function siteHead(): void 'siteHead' => ' public function siteHead(HtmlHead $head): void
{ {
// YOUR CODE HERE // YOUR CODE HERE
}', }',

View file

@ -8,7 +8,7 @@ use CodeIgniter\Router\RouteCollection;
$routes->group( $routes->group(
config('Admin') config('Admin')
->gateway, ->gateway,
[ [
'namespace' => 'Modules\Plugins\Controllers', 'namespace' => 'Modules\Plugins\Controllers',
], ],

View file

@ -38,6 +38,7 @@ class PluginController extends BaseController
$pager_links = $pager->makeLinks($page, $perPage, $total); $pager_links = $pager->makeLinks($page, $perPage, $total);
$this->setHtmlHead(lang('Plugins.installed'));
return view('plugins/installed', [ return view('plugins/installed', [
'total' => $total, 'total' => $total,
'plugins' => $this->plugins->getPlugins($page, $perPage), 'plugins' => $this->plugins->getPlugins($page, $perPage),
@ -47,8 +48,9 @@ class PluginController extends BaseController
public function vendor(string $vendor): string public function vendor(string $vendor): string
{ {
$vendorPlugins = $this->plugins->getVendorPlugins($vendor); $vendorPlugins = $this->plugins->getVendorPlugins($vendor);
$this->setHtmlHead(lang('Plugins.installed'));
replace_breadcrumb_params([ replace_breadcrumb_params([
$vendor => $vendor, $vendor => $vendor,
]); ]);
@ -68,6 +70,7 @@ class PluginController extends BaseController
throw PageNotFoundException::forPageNotFound(); throw PageNotFoundException::forPageNotFound();
} }
$this->setHtmlHead($plugin->getTitle());
replace_breadcrumb_params([ replace_breadcrumb_params([
$vendor => $vendor, $vendor => $vendor,
$package => $package, $package => $package,
@ -137,6 +140,10 @@ class PluginController extends BaseController
$data['fields'] = $fields; $data['fields'] = $fields;
helper('form'); helper('form');
$this->setHtmlHead(lang('Plugins.settingsTitle', [
'pluginTitle' => $plugin->getTitle(),
'type' => $type,
]));
replace_breadcrumb_params($breadcrumbReplacements); replace_breadcrumb_params($breadcrumbReplacements);
return view('plugins/settings', $data); return view('plugins/settings', $data);
} }

View file

@ -6,6 +6,7 @@ namespace Modules\Plugins\Core;
use App\Entities\Episode; use App\Entities\Episode;
use App\Entities\Podcast; use App\Entities\Podcast;
use App\Libraries\HtmlHead;
use App\Libraries\RssFeed; use App\Libraries\RssFeed;
use CodeIgniter\HTTP\URI; use CodeIgniter\HTTP\URI;
use League\CommonMark\Environment\Environment; use League\CommonMark\Environment\Environment;
@ -101,7 +102,7 @@ abstract class BasePlugin implements PluginInterface
} }
#[Override] #[Override]
public function siteHead(): void public function siteHead(HtmlHead $head): void
{ {
} }
@ -264,7 +265,7 @@ abstract class BasePlugin implements PluginInterface
return $title; return $title;
} }
final public function getDescription(): ?string final public function getDescription(): string
{ {
$key = sprintf('Plugin.%s.description', $this->key); $key = sprintf('Plugin.%s.description', $this->key);

View file

@ -6,6 +6,7 @@ namespace Modules\Plugins\Core;
use App\Entities\Episode; use App\Entities\Episode;
use App\Entities\Podcast; use App\Entities\Podcast;
use App\Libraries\HtmlHead;
use App\Libraries\RssFeed; use App\Libraries\RssFeed;
interface PluginInterface interface PluginInterface
@ -18,5 +19,5 @@ interface PluginInterface
public function rssAfterItem(Episode $episode, RssFeed $item): void; public function rssAfterItem(Episode $episode, RssFeed $item): void;
public function siteHead(): void; public function siteHead(HtmlHead $head): void;
} }

View file

@ -6,6 +6,7 @@ namespace Modules\Plugins\Core;
use App\Entities\Episode; use App\Entities\Episode;
use App\Entities\Podcast; use App\Entities\Podcast;
use App\Libraries\HtmlHead;
use App\Libraries\RssFeed; use App\Libraries\RssFeed;
use Config\Database; use Config\Database;
use Modules\Plugins\Config\Plugins as PluginsConfig; use Modules\Plugins\Config\Plugins as PluginsConfig;
@ -15,7 +16,7 @@ use Modules\Plugins\Config\Plugins as PluginsConfig;
* @method void rssAfterChannel(Podcast $podcast, RssFeed $channel) * @method void rssAfterChannel(Podcast $podcast, RssFeed $channel)
* @method void rssBeforeItem(Episode $episode) * @method void rssBeforeItem(Episode $episode)
* @method void rssAfterItem(Episode $episode, RssFeed $item) * @method void rssAfterItem(Episode $episode, RssFeed $item)
* @method void siteHead() * @method void siteHead(HtmlHead $head)
*/ */
class Plugins class Plugins
{ {
@ -29,6 +30,7 @@ class Plugins
'datetime' => ['valid_date[Y-m-d H:i]'], 'datetime' => ['valid_date[Y-m-d H:i]'],
'email' => ['valid_email'], 'email' => ['valid_email'],
'group' => ['permit_empty', 'is_list'], 'group' => ['permit_empty', 'is_list'],
'html' => ['string'],
'markdown' => ['string'], 'markdown' => ['string'],
'number' => ['integer'], 'number' => ['integer'],
'radio-group' => ['string'], 'radio-group' => ['string'],

View file

@ -7,7 +7,7 @@ namespace Modules\Plugins\Manifest;
use Override; use Override;
/** /**
* @property 'checkbox'|'datetime'|'email'|'group'|'markdown'|'number'|'radio-group'|'rss'|'select-multiple'|'select'|'text'|'textarea'|'toggler'|'url' $type * @property 'checkbox'|'datetime'|'email'|'group'|'html'|'markdown'|'number'|'radio-group'|'rss'|'select-multiple'|'select'|'text'|'textarea'|'toggler'|'url' $type
* @property string $key * @property string $key
* @property string $label * @property string $label
* @property string $hint * @property string $hint
@ -20,7 +20,7 @@ use Override;
class Field extends ManifestObject class Field extends ManifestObject
{ {
protected const VALIDATION_RULES = [ protected const VALIDATION_RULES = [
'type' => 'permit_empty|in_list[checkbox,datetime,email,group,markdown,number,radio-group,rss,select-multiple,select,text,textarea,toggler,url]', 'type' => 'permit_empty|in_list[checkbox,datetime,email,group,html,markdown,number,radio-group,rss,select-multiple,select,text,textarea,toggler,url]',
'key' => 'required|alpha_dash', 'key' => 'required|alpha_dash',
'label' => 'required|string', 'label' => 'required|string',
'hint' => 'permit_empty|string', 'hint' => 'permit_empty|string',

View file

@ -178,6 +178,7 @@
"datetime", "datetime",
"email", "email",
"group", "group",
"html",
"markdown", "markdown",
"number", "number",
"radio-group", "radio-group",

View file

@ -160,7 +160,7 @@ class PodcastImport extends BaseCommand
$podcastModel = new PodcastModel(); $podcastModel = new PodcastModel();
if (! $podcastModel->update($this->podcast->id, $this->podcast)) { if (! $podcastModel->update($this->podcast->id, $this->podcast)) {
throw new Exception((string) print_r($podcastModel->errors())); throw new Exception(print_r($podcastModel->errors(), true));
} }
CLI::showProgress(false); CLI::showProgress(false);
@ -260,7 +260,7 @@ class PodcastImport extends BaseCommand
$podcastModel = new PodcastModel(); $podcastModel = new PodcastModel();
if (! ($podcastId = $podcastModel->insert($podcast, true))) { if (! ($podcastId = $podcastModel->insert($podcast, true))) {
$db->transRollback(); $db->transRollback();
throw new Exception((string) print_r($podcastModel->errors())); throw new Exception(print_r($podcastModel->errors(), true));
} }
$podcast->id = $podcastId; $podcast->id = $podcastId;
@ -326,7 +326,7 @@ class PodcastImport extends BaseCommand
]); ]);
if (! $newPersonId = $personModel->insert($newPodcastPerson)) { if (! $newPersonId = $personModel->insert($newPodcastPerson)) {
throw new Exception((string) print_r($personModel->errors())); throw new Exception(print_r($personModel->errors(), true));
} }
} }
@ -353,7 +353,7 @@ class PodcastImport extends BaseCommand
$personGroupSlug, $personGroupSlug,
$personRoleSlug $personRoleSlug
)) { )) {
throw new Exception((string) print_r($podcastPersonModel->errors())); throw new Exception(print_r($podcastPersonModel->errors(), true));
} }
} }
@ -498,7 +498,7 @@ class PodcastImport extends BaseCommand
if (! ($episodeId = $episodeModel->insert($episode, true))) { if (! ($episodeId = $episodeModel->insert($episode, true))) {
$db->transRollback(); $db->transRollback();
throw new Exception((string) print_r($episodeModel->errors())); throw new Exception(print_r($episodeModel->errors(), true));
} }
$this->importEpisodePersons($episodeId, $item->podcast_persons); $this->importEpisodePersons($episodeId, $item->podcast_persons);
@ -546,7 +546,7 @@ class PodcastImport extends BaseCommand
]); ]);
if (! ($newPersonId = $personModel->insert($newPerson))) { if (! ($newPersonId = $personModel->insert($newPerson))) {
throw new Exception((string) print_r($personModel->errors())); throw new Exception(print_r($personModel->errors(), true));
} }
} }
@ -574,7 +574,7 @@ class PodcastImport extends BaseCommand
$personGroupSlug, $personGroupSlug,
$personRoleSlug $personRoleSlug
)) { )) {
throw new Exception((string) print_r($episodePersonModel->errors())); throw new Exception(print_r($episodePersonModel->errors(), true));
} }
} }
} }

View file

@ -28,6 +28,7 @@ class PodcastImportController extends BaseController
{ {
helper('podcast_import'); helper('podcast_import');
$this->setHtmlHead(lang('Podcast.all_imports'));
return view('import/queue', [ return view('import/queue', [
'podcastImportsQueue' => get_import_tasks(), 'podcastImportsQueue' => get_import_tasks(),
]); ]);
@ -41,6 +42,7 @@ class PodcastImportController extends BaseController
helper('podcast_import'); helper('podcast_import');
$this->setHtmlHead(lang('Podcast.all_imports'));
replace_breadcrumb_params([ replace_breadcrumb_params([
0 => $podcast->at_handle, 0 => $podcast->at_handle,
]); ]);
@ -63,6 +65,7 @@ class PodcastImportController extends BaseController
'browserLang' => get_browser_language($this->request->getServer('HTTP_ACCEPT_LANGUAGE')), 'browserLang' => get_browser_language($this->request->getServer('HTTP_ACCEPT_LANGUAGE')),
]; ];
$this->setHtmlHead(lang('Podcast.import'));
return view('import/add_to_queue', $data); return view('import/add_to_queue', $data);
} }
@ -112,6 +115,7 @@ class PodcastImportController extends BaseController
helper('form'); helper('form');
$this->setHtmlHead(lang('PodcastImport.syncForm.title'));
replace_breadcrumb_params([ replace_breadcrumb_params([
0 => $podcast->at_handle, 0 => $podcast->at_handle,
]); ]);

View file

@ -21,10 +21,6 @@ if (! function_exists('get_import_tasks')) {
$podcastImportsQueue = service('settings') $podcastImportsQueue = service('settings')
->get('Import.queue') ?? []; ->get('Import.queue') ?? [];
if (! is_array($podcastImportsQueue)) {
return [];
}
if ($podcastHandle !== null) { if ($podcastHandle !== null) {
$podcastImportsQueue = array_filter( $podcastImportsQueue = array_filter(
$podcastImportsQueue, $podcastImportsQueue,
@ -48,6 +44,6 @@ if (! function_exists('get_import_tasks')) {
return $a->created_at->isAfter($b->created_at) ? -1 : 1; return $a->created_at->isAfter($b->created_at) ? -1 : 1;
}); });
return array_values($podcastImportsQueue); return $podcastImportsQueue;
} }
} }

View file

@ -59,6 +59,7 @@ class SubscriptionController extends BaseController
helper('form'); helper('form');
$this->setHtmlHead(lang('Subscription.podcast_subscriptions'));
replace_breadcrumb_params([ replace_breadcrumb_params([
0 => $this->podcast->at_handle, 0 => $this->podcast->at_handle,
]); ]);
@ -109,6 +110,7 @@ class SubscriptionController extends BaseController
'subscription' => $this->subscription, 'subscription' => $this->subscription,
]; ];
$this->setHtmlHead(lang('Subscription.view', [$this->subscription->id]));
replace_breadcrumb_params([ replace_breadcrumb_params([
0 => $this->podcast->at_handle, 0 => $this->podcast->at_handle,
1 => '#' . $this->subscription->id, 1 => '#' . $this->subscription->id,
@ -124,6 +126,7 @@ class SubscriptionController extends BaseController
'podcast' => $this->podcast, 'podcast' => $this->podcast,
]; ];
$this->setHtmlHead(lang('Subscription.add', [esc($this->podcast->title)]));
replace_breadcrumb_params([ replace_breadcrumb_params([
0 => $this->podcast->at_handle, 0 => $this->podcast->at_handle,
]); ]);
@ -250,6 +253,7 @@ class SubscriptionController extends BaseController
'subscription' => $this->subscription, 'subscription' => $this->subscription,
]; ];
$this->setHtmlHead(lang('Subscription.edit', [esc($this->podcast->title)]));
replace_breadcrumb_params([ replace_breadcrumb_params([
0 => $this->podcast->at_handle, 0 => $this->podcast->at_handle,
1 => '#' . $this->subscription->id, 1 => '#' . $this->subscription->id,
@ -318,6 +322,7 @@ class SubscriptionController extends BaseController
'subscription' => $this->subscription, 'subscription' => $this->subscription,
]; ];
$this->setHtmlHead(lang('Subscription.suspend'));
replace_breadcrumb_params([ replace_breadcrumb_params([
0 => $this->podcast->at_handle, 0 => $this->podcast->at_handle,
1 => '#' . $this->subscription->id, 1 => '#' . $this->subscription->id,
@ -413,6 +418,7 @@ class SubscriptionController extends BaseController
'subscription' => $this->subscription, 'subscription' => $this->subscription,
]; ];
$this->setHtmlHead(lang('Subscription.delete'));
replace_breadcrumb_params([ replace_breadcrumb_params([
0 => $this->podcast->at_handle, 0 => $this->podcast->at_handle,
1 => '#' . $this->subscription->id, 1 => '#' . $this->subscription->id,

View file

@ -58,9 +58,7 @@ class Subscription extends Entity
public function getStatus(): string public function getStatus(): string
{ {
return ($this->expires_at instanceof Time && $this->expires_at->isBefore( return $this->expires_at->isBefore(Time::now()) ? 'expired' : $this->attributes['status'];
Time::now()
)) ? 'expired' : $this->attributes['status'];
} }
/** /**

View file

@ -31,70 +31,71 @@
"@amcharts/amcharts4": "^4.10.39", "@amcharts/amcharts4": "^4.10.39",
"@amcharts/amcharts4-geodata": "^4.1.30", "@amcharts/amcharts4-geodata": "^4.1.30",
"@codemirror/commands": "^6.7.1", "@codemirror/commands": "^6.7.1",
"@codemirror/lang-html": "^6.4.9",
"@codemirror/lang-xml": "^6.1.0", "@codemirror/lang-xml": "^6.1.0",
"@codemirror/language": "^6.10.3", "@codemirror/language": "^6.10.7",
"@codemirror/state": "^6.4.1", "@codemirror/state": "^6.5.0",
"@codemirror/view": "^6.34.2", "@codemirror/view": "^6.35.3",
"@floating-ui/dom": "^1.6.12", "@floating-ui/dom": "^1.6.12",
"@github/clipboard-copy-element": "^1.3.0", "@github/clipboard-copy-element": "^1.3.0",
"@github/hotkey": "^3.1.1", "@github/hotkey": "^3.1.1",
"@github/markdown-toolbar-element": "^2.2.3", "@github/markdown-toolbar-element": "^2.2.3",
"@github/relative-time-element": "^4.4.3", "@github/relative-time-element": "^4.4.4",
"@patternfly/elements": "^4.0.2", "@patternfly/elements": "^4.0.2",
"@tailwindcss/nesting": "0.0.0-insiders.565cd3e",
"@vime/core": "^5.4.1", "@vime/core": "^5.4.1",
"choices.js": "^11.0.2", "choices.js": "^11.0.2",
"codemirror": "^6.0.1", "codemirror": "^6.0.1",
"flatpickr": "^4.6.13", "flatpickr": "^4.6.13",
"htmlfy": "^0.5.0",
"leaflet": "^1.9.4", "leaflet": "^1.9.4",
"leaflet.markercluster": "^1.5.3", "leaflet.markercluster": "^1.5.3",
"lit": "^3.2.1", "lit": "^3.2.1",
"marked": "^14.1.3", "marked": "^15.0.4",
"wavesurfer.js": "^7.8.8", "wavesurfer.js": "^7.8.11",
"xml-formatter": "^3.6.3" "xml-formatter": "^3.6.3"
}, },
"devDependencies": { "devDependencies": {
"@commitlint/cli": "^19.5.0", "@commitlint/cli": "^19.6.1",
"@commitlint/config-conventional": "^19.5.0", "@commitlint/config-conventional": "^19.6.0",
"@csstools/css-tokenizer": "^3.0.3", "@csstools/css-tokenizer": "^3.0.3",
"@eslint/eslintrc": "^3.1.0", "@eslint/eslintrc": "^3.2.0",
"@eslint/js": "^9.14.0", "@eslint/js": "^9.17.0",
"@semantic-release/changelog": "^6.0.3", "@semantic-release/changelog": "^6.0.3",
"@semantic-release/exec": "^6.0.3", "@semantic-release/exec": "^6.0.3",
"@semantic-release/git": "^10.0.1", "@semantic-release/git": "^10.0.1",
"@semantic-release/gitlab": "^13.2.1", "@semantic-release/gitlab": "^13.2.3",
"@tailwindcss/forms": "^0.5.9", "@tailwindcss/forms": "^0.5.9",
"@tailwindcss/typography": "^0.5.15", "@tailwindcss/typography": "^0.5.15",
"@types/eslint__js": "^8.42.3", "@types/eslint__js": "^8.42.3",
"@types/leaflet": "^1.9.14", "@types/leaflet": "^1.9.15",
"all-contributors-cli": "^6.26.1", "all-contributors-cli": "^6.26.1",
"commitizen": "^4.3.1", "commitizen": "^4.3.1",
"cross-env": "^7.0.3", "cross-env": "^7.0.3",
"cssnano": "^7.0.6", "cssnano": "^7.0.6",
"cz-conventional-changelog": "^3.3.0", "cz-conventional-changelog": "^3.3.0",
"eslint": "^9.14.0", "eslint": "^9.17.0",
"eslint-config-prettier": "^9.1.0", "eslint-config-prettier": "^9.1.0",
"eslint-plugin-prettier": "^5.2.1", "eslint-plugin-prettier": "^5.2.1",
"globals": "^15.12.0", "globals": "^15.13.0",
"husky": "^9.1.6", "husky": "^9.1.7",
"is-ci": "^3.0.1", "is-ci": "^4.1.0",
"lint-staged": "^15.2.10", "lint-staged": "^15.2.11",
"postcss": "^8.4.47", "postcss": "^8.4.49",
"postcss-import": "^16.1.0", "postcss-import": "^16.1.0",
"postcss-nesting": "^13.0.1", "postcss-nesting": "^13.0.1",
"postcss-preset-env": "^10.0.9", "postcss-preset-env": "^10.1.2",
"postcss-reporter": "^7.1.0", "postcss-reporter": "^7.1.0",
"prettier": "3.3.3", "prettier": "3.4.2",
"prettier-plugin-organize-imports": "^4.1.0", "prettier-plugin-organize-imports": "^4.1.0",
"semantic-release": "^24.2.0", "semantic-release": "^24.2.0",
"stylelint": "^16.10.0", "stylelint": "^16.12.0",
"stylelint-config-standard": "^36.0.1", "stylelint-config-standard": "^36.0.1",
"svgo": "^3.3.2", "svgo": "^3.3.2",
"tailwindcss": "^3.4.14", "tailwindcss": "^3.4.16",
"typescript": "~5.5.4", "typescript": "~5.7.2",
"typescript-eslint": "^8.13.0", "typescript-eslint": "^8.18.1",
"vite": "^5.4.10", "vite": "^6.0.3",
"vite-plugin-pwa": "^0.20.5", "vite-plugin-pwa": "^0.21.1",
"workbox-build": "^7.3.0", "workbox-build": "^7.3.0",
"workbox-core": "^7.3.0", "workbox-core": "^7.3.0",
"workbox-routing": "^7.3.0", "workbox-routing": "^7.3.0",

View file

@ -50,3 +50,4 @@ parameters:
ignoreErrors: ignoreErrors:
- '#^Call to an undefined method CodeIgniter\\Cache\\CacheInterface\:\:deleteMatching\(\)#' - '#^Call to an undefined method CodeIgniter\\Cache\\CacheInterface\:\:deleteMatching\(\)#'
- identifier: missingType.generics - identifier: missingType.generics
- identifier: property.readOnlyByPhpDocDefaultValue

View file

@ -1,24 +1,30 @@
<?xml version="1.0"?>
<phpunit <phpunit
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="https://schema.phpunit.de/10.5/phpunit.xsd" xsi:noNamespaceSchemaLocation="https://schema.phpunit.de/11.5/phpunit.xsd"
bootstrap="vendor/codeigniter4/framework/system/Test/bootstrap.php" bootstrap="vendor/codeigniter4/framework/system/Test/bootstrap.php"
backupGlobals="false" backupGlobals="false"
beStrictAboutOutputDuringTests="true" beStrictAboutOutputDuringTests="true"
colors="true" colors="true"
columns="max" columns="max"
failOnRisky="true" failOnRisky="true"
failOnWarning="true" failOnWarning="true"
cacheDirectory="build/.phpunit.cache"> displayDetailsOnTestsThatTriggerDeprecations="true"
<coverage displayDetailsOnTestsThatTriggerErrors="true"
includeUncoveredFiles="true" displayDetailsOnTestsThatTriggerNotices="true"
pathCoverage="false" displayDetailsOnTestsThatTriggerWarnings="true"
ignoreDeprecatedCodeUnits="true" displayDetailsOnPhpunitDeprecations="true"
disableCodeCoverageIgnore="true"> cacheDirectory="build/.phpunit.cache"
>
<coverage
pathCoverage="false"
ignoreDeprecatedCodeUnits="true"
disableCodeCoverageIgnore="true">
<report> <report>
<clover outputFile="build/logs/clover.xml"/> <clover outputFile="build/logs/clover.xml" />
<html outputDirectory="build/logs/html"/> <html outputDirectory="build/logs/html" />
<php outputFile="build/logs/coverage.serialized"/> <php outputFile="build/logs/coverage.serialized" />
<text outputFile="php://stdout" showUncoveredFiles="false"/> <text outputFile="php://stdout" showUncoveredFiles="false" />
</report> </report>
</coverage> </coverage>
<testsuites> <testsuites>
@ -27,34 +33,34 @@
</testsuite> </testsuite>
</testsuites> </testsuites>
<logging> <logging>
<testdoxHtml outputFile="build/logs/testdox.html"/> <testdoxHtml outputFile="build/logs/testdox.html" />
<testdoxText outputFile="build/logs/testdox.txt"/> <testdoxText outputFile="build/logs/testdox.txt" />
<junit outputFile="build/logs/logfile.xml"/> <junit outputFile="build/logs/logfile.xml" />
</logging> </logging>
<source> <source>
<include> <include>
<directory suffix=".php">./app</directory> <directory suffix=".php">./app</directory>
</include> </include>
<exclude> <exclude>
<directory suffix=".php">./app/Views</directory> <directory suffix=".php">./app/Views</directory>
<file>./app/Config/Routes.php</file> <file>./app/Config/Routes.php</file>
</exclude> </exclude>
</source> </source>
<php> <php>
<server name="app.baseURL" value="http://example.com/"/> <server name="app.baseURL" value="http://example.com/" />
<!-- Directory containing phpunit.xml --> <!-- Directory containing phpunit.xml -->
<const name="HOMEPATH" value="./"/> <const name="HOMEPATH" value="./" />
<!-- Directory containing the Paths config file --> <!-- Directory containing the Paths config file -->
<const name="CONFIGPATH" value="./app/Config/"/> <const name="CONFIGPATH" value="./app/Config/" />
<!-- Directory containing the front controller (index.php) --> <!-- Directory containing the front controller (index.php) -->
<const name="PUBLICPATH" value="./public/"/> <const name="PUBLICPATH" value="./public/" />
<!-- Database configuration --> <!-- Database configuration -->
<env name="database.tests.hostname" value="mariadb"/> <env name="database.tests.hostname" value="mariadb" />
<env name="database.tests.database" value="test"/> <env name="database.tests.database" value="test" />
<env name="database.tests.username" value="castopod"/> <env name="database.tests.username" value="castopod" />
<env name="database.tests.password" value="castopod"/> <env name="database.tests.password" value="castopod" />
<env name="database.tests.DBDriver" value="MySQLi"/> <env name="database.tests.DBDriver" value="MySQLi" />
<env name="database.tests.DBPrefix" value="tests_"/> <env name="database.tests.DBPrefix" value="tests_" />
<env name="restapi.enabled" value="true"/> <env name="restapi.enabled" value="true" />
</php> </php>
</phpunit> </phpunit>

2135
pnpm-lock.yaml generated
View file

@ -16,18 +16,21 @@ importers:
"@codemirror/commands": "@codemirror/commands":
specifier: ^6.7.1 specifier: ^6.7.1
version: 6.7.1 version: 6.7.1
"@codemirror/lang-html":
specifier: ^6.4.9
version: 6.4.9
"@codemirror/lang-xml": "@codemirror/lang-xml":
specifier: ^6.1.0 specifier: ^6.1.0
version: 6.1.0 version: 6.1.0
"@codemirror/language": "@codemirror/language":
specifier: ^6.10.3 specifier: ^6.10.7
version: 6.10.3 version: 6.10.7
"@codemirror/state": "@codemirror/state":
specifier: ^6.4.1 specifier: ^6.5.0
version: 6.4.1 version: 6.5.0
"@codemirror/view": "@codemirror/view":
specifier: ^6.34.2 specifier: ^6.35.3
version: 6.34.2 version: 6.35.3
"@floating-ui/dom": "@floating-ui/dom":
specifier: ^1.6.12 specifier: ^1.6.12
version: 1.6.12 version: 1.6.12
@ -41,14 +44,11 @@ importers:
specifier: ^2.2.3 specifier: ^2.2.3
version: 2.2.3 version: 2.2.3
"@github/relative-time-element": "@github/relative-time-element":
specifier: ^4.4.3 specifier: ^4.4.4
version: 4.4.3 version: 4.4.4
"@patternfly/elements": "@patternfly/elements":
specifier: ^4.0.2 specifier: ^4.0.2
version: 4.0.2 version: 4.0.2
"@tailwindcss/nesting":
specifier: 0.0.0-insiders.565cd3e
version: 0.0.0-insiders.565cd3e(postcss@8.4.47)
"@vime/core": "@vime/core":
specifier: ^5.4.1 specifier: ^5.4.1
version: 5.4.1 version: 5.4.1
@ -61,6 +61,9 @@ importers:
flatpickr: flatpickr:
specifier: ^4.6.13 specifier: ^4.6.13
version: 4.6.13 version: 4.6.13
htmlfy:
specifier: ^0.5.0
version: 0.5.0
leaflet: leaflet:
specifier: ^1.9.4 specifier: ^1.9.4
version: 1.9.4 version: 1.9.4
@ -71,138 +74,138 @@ importers:
specifier: ^3.2.1 specifier: ^3.2.1
version: 3.2.1 version: 3.2.1
marked: marked:
specifier: ^14.1.3 specifier: ^15.0.4
version: 14.1.3 version: 15.0.4
wavesurfer.js: wavesurfer.js:
specifier: ^7.8.8 specifier: ^7.8.11
version: 7.8.8 version: 7.8.11
xml-formatter: xml-formatter:
specifier: ^3.6.3 specifier: ^3.6.3
version: 3.6.3 version: 3.6.3
devDependencies: devDependencies:
"@commitlint/cli": "@commitlint/cli":
specifier: ^19.5.0 specifier: ^19.6.1
version: 19.5.0(@types/node@22.9.0)(typescript@5.5.4) version: 19.6.1(@types/node@22.9.0)(typescript@5.7.2)
"@commitlint/config-conventional": "@commitlint/config-conventional":
specifier: ^19.5.0 specifier: ^19.6.0
version: 19.5.0 version: 19.6.0
"@csstools/css-tokenizer": "@csstools/css-tokenizer":
specifier: ^3.0.3 specifier: ^3.0.3
version: 3.0.3 version: 3.0.3
"@eslint/eslintrc": "@eslint/eslintrc":
specifier: ^3.1.0 specifier: ^3.2.0
version: 3.1.0 version: 3.2.0
"@eslint/js": "@eslint/js":
specifier: ^9.14.0 specifier: ^9.17.0
version: 9.14.0 version: 9.17.0
"@semantic-release/changelog": "@semantic-release/changelog":
specifier: ^6.0.3 specifier: ^6.0.3
version: 6.0.3(semantic-release@24.2.0(typescript@5.5.4)) version: 6.0.3(semantic-release@24.2.0(typescript@5.7.2))
"@semantic-release/exec": "@semantic-release/exec":
specifier: ^6.0.3 specifier: ^6.0.3
version: 6.0.3(semantic-release@24.2.0(typescript@5.5.4)) version: 6.0.3(semantic-release@24.2.0(typescript@5.7.2))
"@semantic-release/git": "@semantic-release/git":
specifier: ^10.0.1 specifier: ^10.0.1
version: 10.0.1(semantic-release@24.2.0(typescript@5.5.4)) version: 10.0.1(semantic-release@24.2.0(typescript@5.7.2))
"@semantic-release/gitlab": "@semantic-release/gitlab":
specifier: ^13.2.1 specifier: ^13.2.3
version: 13.2.1(semantic-release@24.2.0(typescript@5.5.4)) version: 13.2.3(semantic-release@24.2.0(typescript@5.7.2))
"@tailwindcss/forms": "@tailwindcss/forms":
specifier: ^0.5.9 specifier: ^0.5.9
version: 0.5.9(tailwindcss@3.4.14) version: 0.5.9(tailwindcss@3.4.16)
"@tailwindcss/typography": "@tailwindcss/typography":
specifier: ^0.5.15 specifier: ^0.5.15
version: 0.5.15(tailwindcss@3.4.14) version: 0.5.15(tailwindcss@3.4.16)
"@types/eslint__js": "@types/eslint__js":
specifier: ^8.42.3 specifier: ^8.42.3
version: 8.42.3 version: 8.42.3
"@types/leaflet": "@types/leaflet":
specifier: ^1.9.14 specifier: ^1.9.15
version: 1.9.14 version: 1.9.15
all-contributors-cli: all-contributors-cli:
specifier: ^6.26.1 specifier: ^6.26.1
version: 6.26.1 version: 6.26.1
commitizen: commitizen:
specifier: ^4.3.1 specifier: ^4.3.1
version: 4.3.1(@types/node@22.9.0)(typescript@5.5.4) version: 4.3.1(@types/node@22.9.0)(typescript@5.7.2)
cross-env: cross-env:
specifier: ^7.0.3 specifier: ^7.0.3
version: 7.0.3 version: 7.0.3
cssnano: cssnano:
specifier: ^7.0.6 specifier: ^7.0.6
version: 7.0.6(postcss@8.4.47) version: 7.0.6(postcss@8.4.49)
cz-conventional-changelog: cz-conventional-changelog:
specifier: ^3.3.0 specifier: ^3.3.0
version: 3.3.0(@types/node@22.9.0)(typescript@5.5.4) version: 3.3.0(@types/node@22.9.0)(typescript@5.7.2)
eslint: eslint:
specifier: ^9.14.0 specifier: ^9.17.0
version: 9.14.0(jiti@1.21.6) version: 9.17.0(jiti@2.4.1)
eslint-config-prettier: eslint-config-prettier:
specifier: ^9.1.0 specifier: ^9.1.0
version: 9.1.0(eslint@9.14.0(jiti@1.21.6)) version: 9.1.0(eslint@9.17.0(jiti@2.4.1))
eslint-plugin-prettier: eslint-plugin-prettier:
specifier: ^5.2.1 specifier: ^5.2.1
version: 5.2.1(@types/eslint@9.6.1)(eslint-config-prettier@9.1.0(eslint@9.14.0(jiti@1.21.6)))(eslint@9.14.0(jiti@1.21.6))(prettier@3.3.3) version: 5.2.1(@types/eslint@9.6.1)(eslint-config-prettier@9.1.0(eslint@9.17.0(jiti@2.4.1)))(eslint@9.17.0(jiti@2.4.1))(prettier@3.4.2)
globals: globals:
specifier: ^15.12.0 specifier: ^15.13.0
version: 15.12.0 version: 15.13.0
husky: husky:
specifier: ^9.1.6 specifier: ^9.1.7
version: 9.1.6 version: 9.1.7
is-ci: is-ci:
specifier: ^3.0.1 specifier: ^4.1.0
version: 3.0.1 version: 4.1.0
lint-staged: lint-staged:
specifier: ^15.2.10 specifier: ^15.2.11
version: 15.2.10 version: 15.2.11
postcss: postcss:
specifier: ^8.4.47 specifier: ^8.4.49
version: 8.4.47 version: 8.4.49
postcss-import: postcss-import:
specifier: ^16.1.0 specifier: ^16.1.0
version: 16.1.0(postcss@8.4.47) version: 16.1.0(postcss@8.4.49)
postcss-nesting: postcss-nesting:
specifier: ^13.0.1 specifier: ^13.0.1
version: 13.0.1(postcss@8.4.47) version: 13.0.1(postcss@8.4.49)
postcss-preset-env: postcss-preset-env:
specifier: ^10.0.9 specifier: ^10.1.2
version: 10.0.9(postcss@8.4.47) version: 10.1.2(postcss@8.4.49)
postcss-reporter: postcss-reporter:
specifier: ^7.1.0 specifier: ^7.1.0
version: 7.1.0(postcss@8.4.47) version: 7.1.0(postcss@8.4.49)
prettier: prettier:
specifier: 3.3.3 specifier: 3.4.2
version: 3.3.3 version: 3.4.2
prettier-plugin-organize-imports: prettier-plugin-organize-imports:
specifier: ^4.1.0 specifier: ^4.1.0
version: 4.1.0(prettier@3.3.3)(typescript@5.5.4) version: 4.1.0(prettier@3.4.2)(typescript@5.7.2)
semantic-release: semantic-release:
specifier: ^24.2.0 specifier: ^24.2.0
version: 24.2.0(typescript@5.5.4) version: 24.2.0(typescript@5.7.2)
stylelint: stylelint:
specifier: ^16.10.0 specifier: ^16.12.0
version: 16.10.0(typescript@5.5.4) version: 16.12.0(typescript@5.7.2)
stylelint-config-standard: stylelint-config-standard:
specifier: ^36.0.1 specifier: ^36.0.1
version: 36.0.1(stylelint@16.10.0(typescript@5.5.4)) version: 36.0.1(stylelint@16.12.0(typescript@5.7.2))
svgo: svgo:
specifier: ^3.3.2 specifier: ^3.3.2
version: 3.3.2 version: 3.3.2
tailwindcss: tailwindcss:
specifier: ^3.4.14 specifier: ^3.4.16
version: 3.4.14 version: 3.4.16
typescript: typescript:
specifier: ~5.5.4 specifier: ~5.7.2
version: 5.5.4 version: 5.7.2
typescript-eslint: typescript-eslint:
specifier: ^8.13.0 specifier: ^8.18.1
version: 8.13.0(eslint@9.14.0(jiti@1.21.6))(typescript@5.5.4) version: 8.18.1(eslint@9.17.0(jiti@2.4.1))(typescript@5.7.2)
vite: vite:
specifier: ^5.4.10 specifier: ^6.0.3
version: 5.4.10(@types/node@22.9.0)(terser@5.36.0) version: 6.0.3(@types/node@22.9.0)(jiti@2.4.1)(terser@5.36.0)(yaml@2.6.1)
vite-plugin-pwa: vite-plugin-pwa:
specifier: ^0.20.5 specifier: ^0.21.1
version: 0.20.5(vite@5.4.10(@types/node@22.9.0)(terser@5.36.0))(workbox-build@7.3.0)(workbox-window@7.3.0) version: 0.21.1(vite@6.0.3(@types/node@22.9.0)(jiti@2.4.1)(terser@5.36.0)(yaml@2.6.1))(workbox-build@7.3.0)(workbox-window@7.3.0)
workbox-build: workbox-build:
specifier: ^7.3.0 specifier: ^7.3.0
version: 7.3.0 version: 7.3.0
@ -1032,16 +1035,34 @@ packages:
integrity: sha512-llTrboQYw5H4THfhN4U3qCnSZ1SOJ60ohhz+SzU0ADGtwlc533DtklQP0vSFaQuCPDn3BPpOd1GbbnUtwNjsrw==, integrity: sha512-llTrboQYw5H4THfhN4U3qCnSZ1SOJ60ohhz+SzU0ADGtwlc533DtklQP0vSFaQuCPDn3BPpOd1GbbnUtwNjsrw==,
} }
"@codemirror/lang-css@6.3.1":
resolution:
{
integrity: sha512-kr5fwBGiGtmz6l0LSJIbno9QrifNMUusivHbnA1H6Dmqy4HZFte3UAICix1VuKo0lMPKQr2rqB+0BkKi/S3Ejg==,
}
"@codemirror/lang-html@6.4.9":
resolution:
{
integrity: sha512-aQv37pIMSlueybId/2PVSP6NPnmurFDVmZwzc7jszd2KAF8qd4VBbvNYPXWQq90WIARjsdVkPbw29pszmHws3Q==,
}
"@codemirror/lang-javascript@6.2.2":
resolution:
{
integrity: sha512-VGQfY+FCc285AhWuwjYxQyUQcYurWlxdKYT4bqwr3Twnd5wP5WSeu52t4tvvuWmljT4EmgEgZCqSieokhtY8hg==,
}
"@codemirror/lang-xml@6.1.0": "@codemirror/lang-xml@6.1.0":
resolution: resolution:
{ {
integrity: sha512-3z0blhicHLfwi2UgkZYRPioSgVTo9PV5GP5ducFH6FaHy0IAJRg+ixj5gTR1gnT/glAIC8xv4w2VL1LoZfs+Jg==, integrity: sha512-3z0blhicHLfwi2UgkZYRPioSgVTo9PV5GP5ducFH6FaHy0IAJRg+ixj5gTR1gnT/glAIC8xv4w2VL1LoZfs+Jg==,
} }
"@codemirror/language@6.10.3": "@codemirror/language@6.10.7":
resolution: resolution:
{ {
integrity: sha512-kDqEU5sCP55Oabl6E7m5N+vZRoc0iWqgDVhEKifcHzPzjqCegcO4amfrYVL9PmPZpl4G0yjkpTpUO/Ui8CzO8A==, integrity: sha512-aOswhVOLYhMNeqykt4P7+ukQSpGL0ynZYaEyFDVHE7fl2xgluU3yuE9MdgYNfw6EmaNidoFMIQ2iTh1ADrnT6A==,
} }
"@codemirror/lint@6.8.2": "@codemirror/lint@6.8.2":
@ -1056,16 +1077,16 @@ packages:
integrity: sha512-6+iLsXvITWKHYlkgHPCs/qiX4dNzn8N78YfhOFvPtPYCkuXqZq10rAfsUMhOq7O/1VjJqdXRflyExlfVcu/9VQ==, integrity: sha512-6+iLsXvITWKHYlkgHPCs/qiX4dNzn8N78YfhOFvPtPYCkuXqZq10rAfsUMhOq7O/1VjJqdXRflyExlfVcu/9VQ==,
} }
"@codemirror/state@6.4.1": "@codemirror/state@6.5.0":
resolution: resolution:
{ {
integrity: sha512-QkEyUiLhsJoZkbumGZlswmAhA7CBU02Wrz7zvH4SrcifbsqwlXShVXg65f3v/ts57W3dqyamEriMhij1Z3Zz4A==, integrity: sha512-MwBHVK60IiIHDcoMet78lxt6iw5gJOGSbNbOIVBHWVXIH4/Nq1+GQgLLGgI1KlnN86WDXsPudVaqYHKBIx7Eyw==,
} }
"@codemirror/view@6.34.2": "@codemirror/view@6.35.3":
resolution: resolution:
{ {
integrity: sha512-d6n0WFvL970A9Z+l9N2dO+Hk9ev4hDYQzIx+B9tCyBP0W5wPEszi1rhuyFesNSkLZzXbQE5FPH7F/z/TMJfoPA==, integrity: sha512-ScY7L8+EGdPl4QtoBiOzE4FELp7JmNUsBvgBcCakXWM2uiv/K89VAzU3BMDscf0DsACLvTKePbd5+cFDTcei6g==,
} }
"@colors/colors@1.5.0": "@colors/colors@1.5.0":
@ -1075,18 +1096,18 @@ packages:
} }
engines: { node: ">=0.1.90" } engines: { node: ">=0.1.90" }
"@commitlint/cli@19.5.0": "@commitlint/cli@19.6.1":
resolution: resolution:
{ {
integrity: sha512-gaGqSliGwB86MDmAAKAtV9SV1SHdmN8pnGq4EJU4+hLisQ7IFfx4jvU4s+pk6tl0+9bv6yT+CaZkufOinkSJIQ==, integrity: sha512-8hcyA6ZoHwWXC76BoC8qVOSr8xHy00LZhZpauiD0iO0VYbVhMnED0da85lTfIULxl7Lj4c6vZgF0Wu/ed1+jlQ==,
} }
engines: { node: ">=v18" } engines: { node: ">=v18" }
hasBin: true hasBin: true
"@commitlint/config-conventional@19.5.0": "@commitlint/config-conventional@19.6.0":
resolution: resolution:
{ {
integrity: sha512-OBhdtJyHNPryZKg0fFpZNOBM1ZDbntMvqMuSmpfyP86XSfwzGw4CaoYRG4RutUPg0BTK07VMRIkNJT6wi2zthg==, integrity: sha512-DJT40iMnTYtBtUfw9ApbsLZFke1zKh6llITVJ+x9mtpHD08gsNXaIRqHTmwTZL3dNX5+WoyK7pCN/5zswvkBCQ==,
} }
engines: { node: ">=v18" } engines: { node: ">=v18" }
@ -1118,17 +1139,17 @@ packages:
} }
engines: { node: ">=v18" } engines: { node: ">=v18" }
"@commitlint/is-ignored@19.5.0": "@commitlint/is-ignored@19.6.0":
resolution: resolution:
{ {
integrity: sha512-0XQ7Llsf9iL/ANtwyZ6G0NGp5Y3EQ8eDQSxv/SRcfJ0awlBY4tHFAvwWbw66FVUaWICH7iE5en+FD9TQsokZ5w==, integrity: sha512-Ov6iBgxJQFR9koOupDPHvcHU9keFupDgtB3lObdEZDroiG4jj1rzky60fbQozFKVYRTUdrBGICHG0YVmRuAJmw==,
} }
engines: { node: ">=v18" } engines: { node: ">=v18" }
"@commitlint/lint@19.5.0": "@commitlint/lint@19.6.0":
resolution: resolution:
{ {
integrity: sha512-cAAQwJcRtiBxQWO0eprrAbOurtJz8U6MgYqLz+p9kLElirzSCc0vGMcyCaA1O7AqBuxo11l1XsY3FhOFowLAAg==, integrity: sha512-LRo7zDkXtcIrpco9RnfhOKeg8PAnE3oDDoalnrVU/EVaKHYBWYL1DlRR7+3AWn0JiBqD8yKOfetVxJGdEtZ0tg==,
} }
engines: { node: ">=v18" } engines: { node: ">=v18" }
@ -1139,6 +1160,13 @@ packages:
} }
engines: { node: ">=v18" } engines: { node: ">=v18" }
"@commitlint/load@19.6.1":
resolution:
{
integrity: sha512-kE4mRKWWNju2QpsCWt428XBvUH55OET2N4QKQ0bF85qS/XbsRGG1MiTByDNlEVpEPceMkDr46LNH95DtRwcsfA==,
}
engines: { node: ">=v18" }
"@commitlint/message@19.5.0": "@commitlint/message@19.5.0":
resolution: resolution:
{ {
@ -1167,10 +1195,10 @@ packages:
} }
engines: { node: ">=v18" } engines: { node: ">=v18" }
"@commitlint/rules@19.5.0": "@commitlint/rules@19.6.0":
resolution: resolution:
{ {
integrity: sha512-hDW5TPyf/h1/EufSHEKSp6Hs+YVsDMHazfJ2azIk9tHPXS6UqSz1dIRs1gpqS3eMXgtkT7JH6TW4IShdqOwhAw==, integrity: sha512-1f2reW7lbrI0X0ozZMesS/WZxgPa4/wi56vFuJENBmed6mWq5KsheN/nxqnl/C23ioxpPO/PL6tXpiiFy5Bhjw==,
} }
engines: { node: ">=v18" } engines: { node: ">=v18" }
@ -1212,20 +1240,20 @@ packages:
} }
engines: { node: ">=18" } engines: { node: ">=18" }
"@csstools/css-calc@2.0.4": "@csstools/css-calc@2.1.0":
resolution: resolution:
{ {
integrity: sha512-8/iCd8lH10gKNsq5detnbGWiFd6PXK2wB8wjE6fHNNhtqvshyMrIJgffwRcw6yl/gzGTH+N1i+KRhjqHxqYTmg==, integrity: sha512-X69PmFOrjTZfN5ijxtI8hZ9kRADFSLrmmQ6hgDJ272Il049WGKpDY64KhrFm/7rbWve0z81QepawzjkKlqkNGw==,
} }
engines: { node: ">=18" } engines: { node: ">=18" }
peerDependencies: peerDependencies:
"@csstools/css-parser-algorithms": ^3.0.4 "@csstools/css-parser-algorithms": ^3.0.4
"@csstools/css-tokenizer": ^3.0.3 "@csstools/css-tokenizer": ^3.0.3
"@csstools/css-color-parser@3.0.5": "@csstools/css-color-parser@3.0.6":
resolution: resolution:
{ {
integrity: sha512-4Wo8raj9YF3PnZ5iGrAl+BSsk2MYBOEUS/X4k1HL9mInhyCVftEG02MywdvelXlwZGUF2XTQ0qj9Jd398mhqrw==, integrity: sha512-S/IjXqTHdpI4EtzGoNCHfqraXF37x12ZZHA1Lk7zoT5pm2lMjFuqhX/89L7dqX4CcMacKK+6ZCs5TmEGb/+wKw==,
} }
engines: { node: ">=18" } engines: { node: ">=18" }
peerDependencies: peerDependencies:
@ -1248,16 +1276,6 @@ packages:
} }
engines: { node: ">=18" } engines: { node: ">=18" }
"@csstools/media-query-list-parser@3.0.1":
resolution:
{
integrity: sha512-HNo8gGD02kHmcbX6PvCoUuOQvn4szyB9ca63vZHKX5A81QytgDG4oxG4IaEfHTlEZSZ6MjPEMWIVU+zF2PZcgw==,
}
engines: { node: ">=18" }
peerDependencies:
"@csstools/css-parser-algorithms": ^3.0.1
"@csstools/css-tokenizer": ^3.0.1
"@csstools/media-query-list-parser@4.0.2": "@csstools/media-query-list-parser@4.0.2":
resolution: resolution:
{ {
@ -1277,19 +1295,19 @@ packages:
peerDependencies: peerDependencies:
postcss: ^8.4 postcss: ^8.4
"@csstools/postcss-color-function@4.0.5": "@csstools/postcss-color-function@4.0.6":
resolution: resolution:
{ {
integrity: sha512-6dHr2NDsBMiZCPkGDi2qMfIbzV2kWV8Dh7SVb1FZGnN/r2TI4TSAkVF8rCG5L70yQZHMcQGB84yp8Zm+RGhoHA==, integrity: sha512-EcvXfC60cTIumzpsxWuvVjb7rsJEHPvqn3jeMEBUaE3JSc4FRuP7mEQ+1eicxWmIrs3FtzMH9gR3sgA5TH+ebQ==,
} }
engines: { node: ">=18" } engines: { node: ">=18" }
peerDependencies: peerDependencies:
postcss: ^8.4 postcss: ^8.4
"@csstools/postcss-color-mix-function@3.0.5": "@csstools/postcss-color-mix-function@3.0.6":
resolution: resolution:
{ {
integrity: sha512-jgq0oGbit7TxWYP8y2hWWfV64xzcAgJk54PBYZ2fDrRgEDy1l5YMCrFawnn+5JETh/E1jjXPDFhFEYhwr3vA3g==, integrity: sha512-jVKdJn4+JkASYGhyPO+Wa5WXSx1+oUgaXb3JsjJn/BlrtFh5zjocCY7pwWi0nuP24V1fY7glQsxEYcYNy0dMFg==,
} }
engines: { node: ">=18" } engines: { node: ">=18" }
peerDependencies: peerDependencies:
@ -1304,10 +1322,10 @@ packages:
peerDependencies: peerDependencies:
postcss: ^8.4 postcss: ^8.4
"@csstools/postcss-exponential-functions@2.0.4": "@csstools/postcss-exponential-functions@2.0.5":
resolution: resolution:
{ {
integrity: sha512-xmzFCGTkkLDs7q9vVaRGlnu8s51lRRJzHsaJ/nXmkQuyg0q7gh7rTbJ0bY5sSVet+KB7MTIxRXRUCl2tm7RODA==, integrity: sha512-mi8R6dVfA2nDoKM3wcEi64I8vOYEgQVtVKCfmLHXupeLpACfGAided5ddMt5f+CnEodNu4DifuVwb0I6fQDGGQ==,
} }
engines: { node: ">=18" } engines: { node: ">=18" }
peerDependencies: peerDependencies:
@ -1322,28 +1340,28 @@ packages:
peerDependencies: peerDependencies:
postcss: ^8.4 postcss: ^8.4
"@csstools/postcss-gamut-mapping@2.0.5": "@csstools/postcss-gamut-mapping@2.0.6":
resolution: resolution:
{ {
integrity: sha512-VQDayRhC/Mg1fuo8/4F43La5aROgvVyqtCqdNyGvRKi6L1+zXfwQ583nImi7k/gn2GNJH82Bf9mutTuT1GtXzA==, integrity: sha512-0ke7fmXfc8H+kysZz246yjirAH6JFhyX9GTlyRnM0exHO80XcA9zeJpy5pOp5zo/AZiC/q5Pf+Hw7Pd6/uAoYA==,
} }
engines: { node: ">=18" } engines: { node: ">=18" }
peerDependencies: peerDependencies:
postcss: ^8.4 postcss: ^8.4
"@csstools/postcss-gradients-interpolation-method@5.0.5": "@csstools/postcss-gradients-interpolation-method@5.0.6":
resolution: resolution:
{ {
integrity: sha512-l3ShDdAt/szbyBh3Jz27MRFt5WPAbnVCMsU7Vs7EbBxJQNgVDrcu1APBB2nPagDJOyhI6/IahuW7nb6grWVTpA==, integrity: sha512-Itrbx6SLUzsZ6Mz3VuOlxhbfuyLTogG5DwEF1V8dAi24iMuvQPIHd7Ti+pNDp7j6WixndJGZaoNR0f9VSzwuTg==,
} }
engines: { node: ">=18" } engines: { node: ">=18" }
peerDependencies: peerDependencies:
postcss: ^8.4 postcss: ^8.4
"@csstools/postcss-hwb-function@4.0.5": "@csstools/postcss-hwb-function@4.0.6":
resolution: resolution:
{ {
integrity: sha512-bPn/SQyiiYjWkwK2ykc7O9LliMR50YfUGukd6jQI2okHzB7NxNt/IS45tS1Muk7Hhf3B9Lbmg1Ofq36tBmM92Q==, integrity: sha512-927Pqy3a1uBP7U8sTfaNdZVB0mNXzIrJO/GZ8us9219q9n06gOqCdfZ0E6d1P66Fm0fYHvxfDbfcUuwAn5UwhQ==,
} }
engines: { node: ">=18" } engines: { node: ">=18" }
peerDependencies: peerDependencies:
@ -1430,10 +1448,10 @@ packages:
peerDependencies: peerDependencies:
postcss: ^8.4 postcss: ^8.4
"@csstools/postcss-media-minmax@2.0.4": "@csstools/postcss-media-minmax@2.0.5":
resolution: resolution:
{ {
integrity: sha512-zgdBOCI9aKoy5GK9tb/3ve0pl7vH0HJg7rfQEWT3TZiIKh7XEWucDSTSwnwgdgtgz50UxrOfbK+C59M+u2fE2Q==, integrity: sha512-sdh5i5GToZOIAiwhdntRWv77QDtsxP2r2gXW/WbLSCoLr00KTq/yiF1qlQ5XX2+lmiFa8rATKMcbwl3oXDMNew==,
} }
engines: { node: ">=18" } engines: { node: ">=18" }
peerDependencies: peerDependencies:
@ -1466,10 +1484,10 @@ packages:
peerDependencies: peerDependencies:
postcss: ^8.4 postcss: ^8.4
"@csstools/postcss-oklab-function@4.0.5": "@csstools/postcss-oklab-function@4.0.6":
resolution: resolution:
{ {
integrity: sha512-19bsJQFyJNSEhpaVq0Mq1E0HDXfx8qMHa/bR1MaHr1UD4DWvM2/J6YXb9OVGS7eFl92Y3c84Yggn9uFv13vsiQ==, integrity: sha512-Hptoa0uX+XsNacFBCIQKTUBrFKDiplHan42X73EklG6XmQLG7/aIvxoNhvZ7PvOWMt67Pw3bIlUY2nD6p5vL8A==,
} }
engines: { node: ">=18" } engines: { node: ">=18" }
peerDependencies: peerDependencies:
@ -1484,10 +1502,19 @@ packages:
peerDependencies: peerDependencies:
postcss: ^8.4 postcss: ^8.4
"@csstools/postcss-relative-color-syntax@3.0.5": "@csstools/postcss-random-function@1.0.1":
resolution: resolution:
{ {
integrity: sha512-5VrE4hAwv/ZpuL1Yo0ZGGFi1QPpIikp/rzz7LnpQ31ACQVRIA5/M9qZmJbRlZVsJ4bUFSQ3dq6kHSHrCt2uM6Q==, integrity: sha512-Ab/tF8/RXktQlFwVhiC70UNfpFQRhtE5fQQoP2pO+KCPGLsLdWFiOuHgSRtBOqEshCVAzR4H6o38nhvRZq8deA==,
}
engines: { node: ">=18" }
peerDependencies:
postcss: ^8.4
"@csstools/postcss-relative-color-syntax@3.0.6":
resolution:
{
integrity: sha512-yxP618Xb+ji1I624jILaYM62uEmZcmbdmFoZHoaThw896sq0vU39kqTTF+ZNic9XyPtPMvq0vyvbgmHaszq8xg==,
} }
engines: { node: ">=18" } engines: { node: ">=18" }
peerDependencies: peerDependencies:
@ -1502,10 +1529,19 @@ packages:
peerDependencies: peerDependencies:
postcss: ^8.4 postcss: ^8.4
"@csstools/postcss-stepped-value-functions@4.0.4": "@csstools/postcss-sign-functions@1.1.0":
resolution: resolution:
{ {
integrity: sha512-JjShuWZkmIOT8EfI7lYjl7V5qM29LNDdnnSo5O7v/InJJHfeiQjtxyAaZzKGXzpkghPrCAcgLfJ+IyqTdXo7IA==, integrity: sha512-SLcc20Nujx/kqbSwDmj6oaXgpy3UjFhBy1sfcqPgDkHfOIfUtUVH7OXO+j7BU4v/At5s61N5ZX6shvgPwluhsA==,
}
engines: { node: ">=18" }
peerDependencies:
postcss: ^8.4
"@csstools/postcss-stepped-value-functions@4.0.5":
resolution:
{
integrity: sha512-G6SJ6hZJkhxo6UZojVlLo14MohH4J5J7z8CRBrxxUYy9JuZiIqUo5TBYyDGcE0PLdzpg63a7mHSJz3VD+gMwqw==,
} }
engines: { node: ">=18" } engines: { node: ">=18" }
peerDependencies: peerDependencies:
@ -1520,10 +1556,10 @@ packages:
peerDependencies: peerDependencies:
postcss: ^8.4 postcss: ^8.4
"@csstools/postcss-trigonometric-functions@4.0.4": "@csstools/postcss-trigonometric-functions@4.0.5":
resolution: resolution:
{ {
integrity: sha512-nn+gWTZZlSnwbyUtGQCnvBXIx1TX+HVStvIm3221dWGQvp47bB5giMBbuAK4a/UJGBbfDQhGKEbYq++WWM1i1A==, integrity: sha512-/YQThYkt5MLvAmVu7zxjhceCYlKrYddK6LEmK5I4ojlS6BmO9u2yO4+xjXzu2+NPYmHSTtP4NFSamBCMmJ1NJA==,
} }
engines: { node: ">=18" } engines: { node: ">=18" }
peerDependencies: peerDependencies:
@ -1547,15 +1583,6 @@ packages:
peerDependencies: peerDependencies:
postcss-selector-parser: ^7.0.0 postcss-selector-parser: ^7.0.0
"@csstools/selector-specificity@4.0.0":
resolution:
{
integrity: sha512-189nelqtPd8++phaHNwYovKZI0FOzH1vQEE3QhHHkNIGrg5fSs9CbYP3RvfEH5geztnIA9Jwq91wyOIwAW5JIQ==,
}
engines: { node: ">=18" }
peerDependencies:
postcss-selector-parser: ^6.1.0
"@csstools/selector-specificity@5.0.0": "@csstools/selector-specificity@5.0.0":
resolution: resolution:
{ {
@ -1580,210 +1607,219 @@ packages:
integrity: sha512-+nxncfwHM5SgAtrVzgpzJOI1ol0PkumhVo469KCf9lUi21IGcY90G98VuHm9VRrUypmAzawAHO9bs6hqeADaVg==, integrity: sha512-+nxncfwHM5SgAtrVzgpzJOI1ol0PkumhVo469KCf9lUi21IGcY90G98VuHm9VRrUypmAzawAHO9bs6hqeADaVg==,
} }
"@esbuild/aix-ppc64@0.21.5": "@esbuild/aix-ppc64@0.24.0":
resolution: resolution:
{ {
integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==, integrity: sha512-WtKdFM7ls47zkKHFVzMz8opM7LkcsIp9amDUBIAWirg70RM71WRSjdILPsY5Uv1D42ZpUfaPILDlfactHgsRkw==,
} }
engines: { node: ">=12" } engines: { node: ">=18" }
cpu: [ppc64] cpu: [ppc64]
os: [aix] os: [aix]
"@esbuild/android-arm64@0.21.5": "@esbuild/android-arm64@0.24.0":
resolution: resolution:
{ {
integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==, integrity: sha512-Vsm497xFM7tTIPYK9bNTYJyF/lsP590Qc1WxJdlB6ljCbdZKU9SY8i7+Iin4kyhV/KV5J2rOKsBQbB77Ab7L/w==,
} }
engines: { node: ">=12" } engines: { node: ">=18" }
cpu: [arm64] cpu: [arm64]
os: [android] os: [android]
"@esbuild/android-arm@0.21.5": "@esbuild/android-arm@0.24.0":
resolution: resolution:
{ {
integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==, integrity: sha512-arAtTPo76fJ/ICkXWetLCc9EwEHKaeya4vMrReVlEIUCAUncH7M4bhMQ+M9Vf+FFOZJdTNMXNBrWwW+OXWpSew==,
} }
engines: { node: ">=12" } engines: { node: ">=18" }
cpu: [arm] cpu: [arm]
os: [android] os: [android]
"@esbuild/android-x64@0.21.5": "@esbuild/android-x64@0.24.0":
resolution: resolution:
{ {
integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==, integrity: sha512-t8GrvnFkiIY7pa7mMgJd7p8p8qqYIz1NYiAoKc75Zyv73L3DZW++oYMSHPRarcotTKuSs6m3hTOa5CKHaS02TQ==,
} }
engines: { node: ">=12" } engines: { node: ">=18" }
cpu: [x64] cpu: [x64]
os: [android] os: [android]
"@esbuild/darwin-arm64@0.21.5": "@esbuild/darwin-arm64@0.24.0":
resolution: resolution:
{ {
integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==, integrity: sha512-CKyDpRbK1hXwv79soeTJNHb5EiG6ct3efd/FTPdzOWdbZZfGhpbcqIpiD0+vwmpu0wTIL97ZRPZu8vUt46nBSw==,
} }
engines: { node: ">=12" } engines: { node: ">=18" }
cpu: [arm64] cpu: [arm64]
os: [darwin] os: [darwin]
"@esbuild/darwin-x64@0.21.5": "@esbuild/darwin-x64@0.24.0":
resolution: resolution:
{ {
integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==, integrity: sha512-rgtz6flkVkh58od4PwTRqxbKH9cOjaXCMZgWD905JOzjFKW+7EiUObfd/Kav+A6Gyud6WZk9w+xu6QLytdi2OA==,
} }
engines: { node: ">=12" } engines: { node: ">=18" }
cpu: [x64] cpu: [x64]
os: [darwin] os: [darwin]
"@esbuild/freebsd-arm64@0.21.5": "@esbuild/freebsd-arm64@0.24.0":
resolution: resolution:
{ {
integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==, integrity: sha512-6Mtdq5nHggwfDNLAHkPlyLBpE5L6hwsuXZX8XNmHno9JuL2+bg2BX5tRkwjyfn6sKbxZTq68suOjgWqCicvPXA==,
} }
engines: { node: ">=12" } engines: { node: ">=18" }
cpu: [arm64] cpu: [arm64]
os: [freebsd] os: [freebsd]
"@esbuild/freebsd-x64@0.21.5": "@esbuild/freebsd-x64@0.24.0":
resolution: resolution:
{ {
integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==, integrity: sha512-D3H+xh3/zphoX8ck4S2RxKR6gHlHDXXzOf6f/9dbFt/NRBDIE33+cVa49Kil4WUjxMGW0ZIYBYtaGCa2+OsQwQ==,
} }
engines: { node: ">=12" } engines: { node: ">=18" }
cpu: [x64] cpu: [x64]
os: [freebsd] os: [freebsd]
"@esbuild/linux-arm64@0.21.5": "@esbuild/linux-arm64@0.24.0":
resolution: resolution:
{ {
integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==, integrity: sha512-TDijPXTOeE3eaMkRYpcy3LarIg13dS9wWHRdwYRnzlwlA370rNdZqbcp0WTyyV/k2zSxfko52+C7jU5F9Tfj1g==,
} }
engines: { node: ">=12" } engines: { node: ">=18" }
cpu: [arm64] cpu: [arm64]
os: [linux] os: [linux]
"@esbuild/linux-arm@0.21.5": "@esbuild/linux-arm@0.24.0":
resolution: resolution:
{ {
integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==, integrity: sha512-gJKIi2IjRo5G6Glxb8d3DzYXlxdEj2NlkixPsqePSZMhLudqPhtZ4BUrpIuTjJYXxvF9njql+vRjB2oaC9XpBw==,
} }
engines: { node: ">=12" } engines: { node: ">=18" }
cpu: [arm] cpu: [arm]
os: [linux] os: [linux]
"@esbuild/linux-ia32@0.21.5": "@esbuild/linux-ia32@0.24.0":
resolution: resolution:
{ {
integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==, integrity: sha512-K40ip1LAcA0byL05TbCQ4yJ4swvnbzHscRmUilrmP9Am7//0UjPreh4lpYzvThT2Quw66MhjG//20mrufm40mA==,
} }
engines: { node: ">=12" } engines: { node: ">=18" }
cpu: [ia32] cpu: [ia32]
os: [linux] os: [linux]
"@esbuild/linux-loong64@0.21.5": "@esbuild/linux-loong64@0.24.0":
resolution: resolution:
{ {
integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==, integrity: sha512-0mswrYP/9ai+CU0BzBfPMZ8RVm3RGAN/lmOMgW4aFUSOQBjA31UP8Mr6DDhWSuMwj7jaWOT0p0WoZ6jeHhrD7g==,
} }
engines: { node: ">=12" } engines: { node: ">=18" }
cpu: [loong64] cpu: [loong64]
os: [linux] os: [linux]
"@esbuild/linux-mips64el@0.21.5": "@esbuild/linux-mips64el@0.24.0":
resolution: resolution:
{ {
integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==, integrity: sha512-hIKvXm0/3w/5+RDtCJeXqMZGkI2s4oMUGj3/jM0QzhgIASWrGO5/RlzAzm5nNh/awHE0A19h/CvHQe6FaBNrRA==,
} }
engines: { node: ">=12" } engines: { node: ">=18" }
cpu: [mips64el] cpu: [mips64el]
os: [linux] os: [linux]
"@esbuild/linux-ppc64@0.21.5": "@esbuild/linux-ppc64@0.24.0":
resolution: resolution:
{ {
integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==, integrity: sha512-HcZh5BNq0aC52UoocJxaKORfFODWXZxtBaaZNuN3PUX3MoDsChsZqopzi5UupRhPHSEHotoiptqikjN/B77mYQ==,
} }
engines: { node: ">=12" } engines: { node: ">=18" }
cpu: [ppc64] cpu: [ppc64]
os: [linux] os: [linux]
"@esbuild/linux-riscv64@0.21.5": "@esbuild/linux-riscv64@0.24.0":
resolution: resolution:
{ {
integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==, integrity: sha512-bEh7dMn/h3QxeR2KTy1DUszQjUrIHPZKyO6aN1X4BCnhfYhuQqedHaa5MxSQA/06j3GpiIlFGSsy1c7Gf9padw==,
} }
engines: { node: ">=12" } engines: { node: ">=18" }
cpu: [riscv64] cpu: [riscv64]
os: [linux] os: [linux]
"@esbuild/linux-s390x@0.21.5": "@esbuild/linux-s390x@0.24.0":
resolution: resolution:
{ {
integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==, integrity: sha512-ZcQ6+qRkw1UcZGPyrCiHHkmBaj9SiCD8Oqd556HldP+QlpUIe2Wgn3ehQGVoPOvZvtHm8HPx+bH20c9pvbkX3g==,
} }
engines: { node: ">=12" } engines: { node: ">=18" }
cpu: [s390x] cpu: [s390x]
os: [linux] os: [linux]
"@esbuild/linux-x64@0.21.5": "@esbuild/linux-x64@0.24.0":
resolution: resolution:
{ {
integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==, integrity: sha512-vbutsFqQ+foy3wSSbmjBXXIJ6PL3scghJoM8zCL142cGaZKAdCZHyf+Bpu/MmX9zT9Q0zFBVKb36Ma5Fzfa8xA==,
} }
engines: { node: ">=12" } engines: { node: ">=18" }
cpu: [x64] cpu: [x64]
os: [linux] os: [linux]
"@esbuild/netbsd-x64@0.21.5": "@esbuild/netbsd-x64@0.24.0":
resolution: resolution:
{ {
integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==, integrity: sha512-hjQ0R/ulkO8fCYFsG0FZoH+pWgTTDreqpqY7UnQntnaKv95uP5iW3+dChxnx7C3trQQU40S+OgWhUVwCjVFLvg==,
} }
engines: { node: ">=12" } engines: { node: ">=18" }
cpu: [x64] cpu: [x64]
os: [netbsd] os: [netbsd]
"@esbuild/openbsd-x64@0.21.5": "@esbuild/openbsd-arm64@0.24.0":
resolution: resolution:
{ {
integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==, integrity: sha512-MD9uzzkPQbYehwcN583yx3Tu5M8EIoTD+tUgKF982WYL9Pf5rKy9ltgD0eUgs8pvKnmizxjXZyLt0z6DC3rRXg==,
} }
engines: { node: ">=12" } engines: { node: ">=18" }
cpu: [arm64]
os: [openbsd]
"@esbuild/openbsd-x64@0.24.0":
resolution:
{
integrity: sha512-4ir0aY1NGUhIC1hdoCzr1+5b43mw99uNwVzhIq1OY3QcEwPDO3B7WNXBzaKY5Nsf1+N11i1eOfFcq+D/gOS15Q==,
}
engines: { node: ">=18" }
cpu: [x64] cpu: [x64]
os: [openbsd] os: [openbsd]
"@esbuild/sunos-x64@0.21.5": "@esbuild/sunos-x64@0.24.0":
resolution: resolution:
{ {
integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==, integrity: sha512-jVzdzsbM5xrotH+W5f1s+JtUy1UWgjU0Cf4wMvffTB8m6wP5/kx0KiaLHlbJO+dMgtxKV8RQ/JvtlFcdZ1zCPA==,
} }
engines: { node: ">=12" } engines: { node: ">=18" }
cpu: [x64] cpu: [x64]
os: [sunos] os: [sunos]
"@esbuild/win32-arm64@0.21.5": "@esbuild/win32-arm64@0.24.0":
resolution: resolution:
{ {
integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==, integrity: sha512-iKc8GAslzRpBytO2/aN3d2yb2z8XTVfNV0PjGlCxKo5SgWmNXx82I/Q3aG1tFfS+A2igVCY97TJ8tnYwpUWLCA==,
} }
engines: { node: ">=12" } engines: { node: ">=18" }
cpu: [arm64] cpu: [arm64]
os: [win32] os: [win32]
"@esbuild/win32-ia32@0.21.5": "@esbuild/win32-ia32@0.24.0":
resolution: resolution:
{ {
integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==, integrity: sha512-vQW36KZolfIudCcTnaTpmLQ24Ha1RjygBo39/aLkM2kmjkWmZGEJ5Gn9l5/7tzXA42QGIoWbICfg6KLLkIw6yw==,
} }
engines: { node: ">=12" } engines: { node: ">=18" }
cpu: [ia32] cpu: [ia32]
os: [win32] os: [win32]
"@esbuild/win32-x64@0.21.5": "@esbuild/win32-x64@0.24.0":
resolution: resolution:
{ {
integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==, integrity: sha512-7IAFPrjSQIJrGsK6flwg7NFmwBoSTyF3rl7If0hNUFQU4ilTsEPL6GuMuU9BfIWVVGuRnuIidkSMC+c0Otu8IA==,
} }
engines: { node: ">=12" } engines: { node: ">=18" }
cpu: [x64] cpu: [x64]
os: [win32] os: [win32]
@ -1803,45 +1839,45 @@ packages:
} }
engines: { node: ^12.0.0 || ^14.0.0 || >=16.0.0 } engines: { node: ^12.0.0 || ^14.0.0 || >=16.0.0 }
"@eslint/config-array@0.18.0": "@eslint/config-array@0.19.1":
resolution: resolution:
{ {
integrity: sha512-fTxvnS1sRMu3+JjXwJG0j/i4RT9u4qJ+lqS/yCGap4lH4zZGzQ7tu+xZqQmcMZq5OBZDL4QRxQzRjkWcGt8IVw==, integrity: sha512-fo6Mtm5mWyKjA/Chy1BYTdn5mGJoDNjC7C64ug20ADsRDGrA85bN3uK3MaKbeRkRuuIEAR5N33Jr1pbm411/PA==,
} }
engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 }
"@eslint/core@0.7.0": "@eslint/core@0.9.1":
resolution: resolution:
{ {
integrity: sha512-xp5Jirz5DyPYlPiKat8jaq0EmYvDXKKpzTbxXMpT9eqlRJkRKIz9AGMdlvYjih+im+QlhWrpvVjl8IPC/lHlUw==, integrity: sha512-GuUdqkyyzQI5RMIWkHhvTWLCyLo1jNK3vzkSyaExH5kHPDHcuL2VOpHjmMY+y3+NC69qAKToBqldTBgYeLSr9Q==,
} }
engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 }
"@eslint/eslintrc@3.1.0": "@eslint/eslintrc@3.2.0":
resolution: resolution:
{ {
integrity: sha512-4Bfj15dVJdoy3RfZmmo86RK1Fwzn6SstsvK9JS+BaVKqC6QQQQyXekNaC+g+LKNgkQ+2VhGAzm6hO40AhMR3zQ==, integrity: sha512-grOjVNN8P3hjJn/eIETF1wwd12DdnwFDoyceUJLYYdkpbwq3nLi+4fqrTAONx7XDALqlL220wC/RHSC/QTI/0w==,
} }
engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 }
"@eslint/js@9.14.0": "@eslint/js@9.17.0":
resolution: resolution:
{ {
integrity: sha512-pFoEtFWCPyDOl+C6Ift+wC7Ro89otjigCf5vcuWqWgqNSQbRrpjSvdeE6ofLz4dHmyxD5f7gIdGT4+p36L6Twg==, integrity: sha512-Sxc4hqcs1kTu0iID3kcZDW3JHq2a77HO9P8CP6YEA/FpH3Ll8UXE2r/86Rz9YJLKme39S9vU5OWNjC6Xl0Cr3w==,
} }
engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 }
"@eslint/object-schema@2.1.4": "@eslint/object-schema@2.1.5":
resolution: resolution:
{ {
integrity: sha512-BsWiH1yFGjXXS2yvrf5LyuoSIIbPrGUWob917o+BTKuZ7qJdxX8aJLRxs1fS9n6r7vESrq1OUqb68dANcFXuQQ==, integrity: sha512-o0bhxnL89h5Bae5T318nFoFzGy+YE5i/gGkoPAgkmTVdRKTiv3p8JHevPiPaMwoloKfEiiaHlawCqaZMqRm+XQ==,
} }
engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 }
"@eslint/plugin-kit@0.2.2": "@eslint/plugin-kit@0.2.4":
resolution: resolution:
{ {
integrity: sha512-CXtq5nR4Su+2I47WPOlWud98Y5Lv8Kyxp2ukhgFx/eW6Blm18VXJO5WuQylPugRo8nbluoi6GvvxBLqHcvqUUw==, integrity: sha512-zSkKow6H5Kdm0ZUQUB2kV5JIXqoG0+uH5YADhaEHswm664N9Db8dXSi0nMJpacpMf+MyyglF1vnZohpEg5yUtg==,
} }
engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 }
@ -1905,10 +1941,10 @@ packages:
integrity: sha512-AlquKGee+IWiAMYVB0xyHFZRMnu4n3X4HTvJHu79GiVJ1ojTukCWyxMlF5NMsecoLcBKsuBhx3QPv2vkE/zQ0A==, integrity: sha512-AlquKGee+IWiAMYVB0xyHFZRMnu4n3X4HTvJHu79GiVJ1ojTukCWyxMlF5NMsecoLcBKsuBhx3QPv2vkE/zQ0A==,
} }
"@github/relative-time-element@4.4.3": "@github/relative-time-element@4.4.4":
resolution: resolution:
{ {
integrity: sha512-EVKokqx9/DdUAZ2l9WVyY51EtRCO2gQWWMvsRIn7r4glJ91q9CXcnILVHZVCpfD52ucXUhUvtYsAjNJ4qP4uIg==, integrity: sha512-Oi8uOL8O+ZWLD7dHRWCkm2cudcTYtB3VyOYf9BtzCgDGm+OKomyOREtItNMtWl1dxvec62BTKErq36uy+RYxQg==,
} }
"@humanfs/core@0.19.1": "@humanfs/core@0.19.1":
@ -1998,12 +2034,30 @@ packages:
integrity: sha512-w7ojc8ejBqr2REPsWxJjrMFsA/ysDCFICn8zEOR9mrqzOu2amhITYuLD8ag6XZf0CFXDrhKqw7+tW8cX66NaDA==, integrity: sha512-w7ojc8ejBqr2REPsWxJjrMFsA/ysDCFICn8zEOR9mrqzOu2amhITYuLD8ag6XZf0CFXDrhKqw7+tW8cX66NaDA==,
} }
"@lezer/css@1.1.9":
resolution:
{
integrity: sha512-TYwgljcDv+YrV0MZFFvYFQHCfGgbPMR6nuqLabBdmZoFH3EP1gvw8t0vae326Ne3PszQkbXfVBjCnf3ZVCr0bA==,
}
"@lezer/highlight@1.2.1": "@lezer/highlight@1.2.1":
resolution: resolution:
{ {
integrity: sha512-Z5duk4RN/3zuVO7Jq0pGLJ3qynpxUVsh7IbUbGj88+uV2ApSAn6kWg2au3iJb+0Zi7kKtqffIESgNcRXWZWmSA==, integrity: sha512-Z5duk4RN/3zuVO7Jq0pGLJ3qynpxUVsh7IbUbGj88+uV2ApSAn6kWg2au3iJb+0Zi7kKtqffIESgNcRXWZWmSA==,
} }
"@lezer/html@1.3.10":
resolution:
{
integrity: sha512-dqpT8nISx/p9Do3AchvYGV3qYc4/rKr3IBZxlHmpIKam56P47RSHkSF5f13Vu9hebS1jM0HmtJIwLbWz1VIY6w==,
}
"@lezer/javascript@1.4.21":
resolution:
{
integrity: sha512-lL+1fcuxWYPURMM/oFZLEDm0XuLN128QPV+VuGtKpeaOGdcl9F2LYC3nh1S9LkPqx9M0mndZFdXCipNAZpzIkQ==,
}
"@lezer/lr@1.4.2": "@lezer/lr@1.4.2":
resolution: resolution:
{ {
@ -2034,6 +2088,12 @@ packages:
integrity: sha512-GFn91inaUa2oHLak8awSIigYz0cU0Payr1rcFsrkf5OJ5eSPxElyZfKh0f2p9FsTiZWXQdWGJeXZICEfXXYSXQ==, integrity: sha512-GFn91inaUa2oHLak8awSIigYz0cU0Payr1rcFsrkf5OJ5eSPxElyZfKh0f2p9FsTiZWXQdWGJeXZICEfXXYSXQ==,
} }
"@marijn/find-cluster-break@1.0.2":
resolution:
{
integrity: sha512-l0h88YhZFyKdXIFNfSWpyjStDjGHwZ/U7iobcK1cQQD8sejsONdQtTVU+1wVN1PBw40PiiHB1vA5S7VTfQiP9g==,
}
"@nodelib/fs.scandir@2.1.5": "@nodelib/fs.scandir@2.1.5":
resolution: resolution:
{ {
@ -2465,10 +2525,10 @@ packages:
peerDependencies: peerDependencies:
semantic-release: ">=24.1.0" semantic-release: ">=24.1.0"
"@semantic-release/gitlab@13.2.1": "@semantic-release/gitlab@13.2.3":
resolution: resolution:
{ {
integrity: sha512-uvajKL3RbvouunvF6rWCEWmvYFW5tCq8irXvb2tW40cdI5rK22q9Uma1m/PxPtUTjggqfap86G0gst1hgeFuow==, integrity: sha512-AzH/s7r8CLDN8dnbkrXnC+Gy9NYG/qRIIKMalaqNFAorgR+goGcqMb/6vIY9aVvwaoT1bo8xr1A+eeuuL4dGEQ==,
} }
engines: { node: ">=20.8.1" } engines: { node: ">=20.8.1" }
peerDependencies: peerDependencies:
@ -2549,14 +2609,6 @@ packages:
peerDependencies: peerDependencies:
tailwindcss: ">=3.0.0 || >= 3.0.0-alpha.1 || >= 4.0.0-alpha.20" tailwindcss: ">=3.0.0 || >= 3.0.0-alpha.1 || >= 4.0.0-alpha.20"
"@tailwindcss/nesting@0.0.0-insiders.565cd3e":
resolution:
{
integrity: sha512-WhHoFBx19TnH/c+xLwT/sxei6+4RpdfiyG3MYXfmLaMsADmVqBkF7B6lDalgZD9YdM459MF7DtxVbWkOrV7IaQ==,
}
peerDependencies:
postcss: ^8.2.15
"@tailwindcss/typography@0.5.15": "@tailwindcss/typography@0.5.15":
resolution: resolution:
{ {
@ -2626,10 +2678,10 @@ packages:
integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==, integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==,
} }
"@types/leaflet@1.9.14": "@types/leaflet@1.9.15":
resolution: resolution:
{ {
integrity: sha512-sx2q6MDJaajwhKeVgPSvqXd8rhNJSTA3tMidQGduZn9S6WBYxDkCpSpV5xXEmSg7Cgdk/5vJGhVF1kMYLzauBg==, integrity: sha512-7UuggAuAs+mva66gtf2OTB1nEhzU/9JED93TIaOEgvFMvG/dIGQaukHE7izHo1Zd+Ko1L4ETUw7TBc8yUxevpg==,
} }
"@types/node@22.9.0": "@types/node@22.9.0":
@ -2668,84 +2720,74 @@ packages:
integrity: sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==, integrity: sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==,
} }
"@typescript-eslint/eslint-plugin@8.13.0": "@typescript-eslint/eslint-plugin@8.18.1":
resolution: resolution:
{ {
integrity: sha512-nQtBLiZYMUPkclSeC3id+x4uVd1SGtHuElTxL++SfP47jR0zfkZBJHc+gL4qPsgTuypz0k8Y2GheaDYn6Gy3rg==, integrity: sha512-Ncvsq5CT3Gvh+uJG0Lwlho6suwDfUXH0HztslDf5I+F2wAFAZMRwYLEorumpKLzmO2suAXZ/td1tBg4NZIi9CQ==,
} }
engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 }
peerDependencies: peerDependencies:
"@typescript-eslint/parser": ^8.0.0 || ^8.0.0-alpha.0 "@typescript-eslint/parser": ^8.0.0 || ^8.0.0-alpha.0
eslint: ^8.57.0 || ^9.0.0 eslint: ^8.57.0 || ^9.0.0
typescript: "*" typescript: ">=4.8.4 <5.8.0"
peerDependenciesMeta:
typescript:
optional: true
"@typescript-eslint/parser@8.13.0": "@typescript-eslint/parser@8.18.1":
resolution: resolution:
{ {
integrity: sha512-w0xp+xGg8u/nONcGw1UXAr6cjCPU1w0XVyBs6Zqaj5eLmxkKQAByTdV/uGgNN5tVvN/kKpoQlP2cL7R+ajZZIQ==, integrity: sha512-rBnTWHCdbYM2lh7hjyXqxk70wvon3p2FyaniZuey5TrcGBpfhVp0OxOa6gxr9Q9YhZFKyfbEnxc24ZnVbbUkCA==,
} }
engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 }
peerDependencies: peerDependencies:
eslint: ^8.57.0 || ^9.0.0 eslint: ^8.57.0 || ^9.0.0
typescript: "*" typescript: ">=4.8.4 <5.8.0"
peerDependenciesMeta:
typescript:
optional: true
"@typescript-eslint/scope-manager@8.13.0": "@typescript-eslint/scope-manager@8.18.1":
resolution: resolution:
{ {
integrity: sha512-XsGWww0odcUT0gJoBZ1DeulY1+jkaHUciUq4jKNv4cpInbvvrtDoyBH9rE/n2V29wQJPk8iCH1wipra9BhmiMA==, integrity: sha512-HxfHo2b090M5s2+/9Z3gkBhI6xBH8OJCFjH9MhQ+nnoZqxU3wNxkLT+VWXWSFWc3UF3Z+CfPAyqdCTdoXtDPCQ==,
} }
engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 }
"@typescript-eslint/type-utils@8.13.0": "@typescript-eslint/type-utils@8.18.1":
resolution: resolution:
{ {
integrity: sha512-Rqnn6xXTR316fP4D2pohZenJnp+NwQ1mo7/JM+J1LWZENSLkJI8ID8QNtlvFeb0HnFSK94D6q0cnMX6SbE5/vA==, integrity: sha512-jAhTdK/Qx2NJPNOTxXpMwlOiSymtR2j283TtPqXkKBdH8OAMmhiUfP0kJjc/qSE51Xrq02Gj9NY7MwK+UxVwHQ==,
}
engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 }
peerDependencies:
typescript: "*"
peerDependenciesMeta:
typescript:
optional: true
"@typescript-eslint/types@8.13.0":
resolution:
{
integrity: sha512-4cyFErJetFLckcThRUFdReWJjVsPCqyBlJTi6IDEpc1GWCIIZRFxVppjWLIMcQhNGhdWJJRYFHpHoDWvMlDzng==,
}
engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 }
"@typescript-eslint/typescript-estree@8.13.0":
resolution:
{
integrity: sha512-v7SCIGmVsRK2Cy/LTLGN22uea6SaUIlpBcO/gnMGT/7zPtxp90bphcGf4fyrCQl3ZtiBKqVTG32hb668oIYy1g==,
}
engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 }
peerDependencies:
typescript: "*"
peerDependenciesMeta:
typescript:
optional: true
"@typescript-eslint/utils@8.13.0":
resolution:
{
integrity: sha512-A1EeYOND6Uv250nybnLZapeXpYMl8tkzYUxqmoKAWnI4sei3ihf2XdZVd+vVOmHGcp3t+P7yRrNsyyiXTvShFQ==,
} }
engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 }
peerDependencies: peerDependencies:
eslint: ^8.57.0 || ^9.0.0 eslint: ^8.57.0 || ^9.0.0
typescript: ">=4.8.4 <5.8.0"
"@typescript-eslint/visitor-keys@8.13.0": "@typescript-eslint/types@8.18.1":
resolution: resolution:
{ {
integrity: sha512-7N/+lztJqH4Mrf0lb10R/CbI1EaAMMGyF5y0oJvFoAhafwgiRA7TXyd8TFn8FC8k5y2dTsYogg238qavRGNnlw==, integrity: sha512-7uoAUsCj66qdNQNpH2G8MyTFlgerum8ubf21s3TSM3XmKXuIn+H2Sifh/ES2nPOPiYSRJWAk0fDkW0APBWcpfw==,
}
engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 }
"@typescript-eslint/typescript-estree@8.18.1":
resolution:
{
integrity: sha512-z8U21WI5txzl2XYOW7i9hJhxoKKNG1kcU4RzyNvKrdZDmbjkmLBo8bgeiOJmA06kizLI76/CCBAAGlTlEeUfyg==,
}
engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 }
peerDependencies:
typescript: ">=4.8.4 <5.8.0"
"@typescript-eslint/utils@8.18.1":
resolution:
{
integrity: sha512-8vikiIj2ebrC4WRdcAdDcmnu9Q/MXXwg+STf40BVfT8exDqBCUPdypvzcUPxEqRGKg9ALagZ0UWcYCtn+4W2iQ==,
}
engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 }
peerDependencies:
eslint: ^8.57.0 || ^9.0.0
typescript: ">=4.8.4 <5.8.0"
"@typescript-eslint/visitor-keys@8.18.1":
resolution:
{
integrity: sha512-Vj0WLm5/ZsD013YeUKn+K0y8p1M0jPpxOkKdbD1wB0ns53a5piVY02zjf072TblEweAbcYiFiPoSMF3kp+VhhQ==,
} }
engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 }
@ -3195,10 +3237,10 @@ packages:
} }
engines: { node: ">= 8.10.0" } engines: { node: ">= 8.10.0" }
ci-info@3.9.0: ci-info@4.1.0:
resolution: resolution:
{ {
integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==, integrity: sha512-HutrvTNsF48wnxkzERIXOe5/mlcfFcbfCmwcg6CJnizbSue78AbDt+1cgl26zwn61WFxhcPykPfZrbqjGmBb4A==,
} }
engines: { node: ">=8" } engines: { node: ">=8" }
@ -3495,6 +3537,17 @@ packages:
cosmiconfig: ">=8.2" cosmiconfig: ">=8.2"
typescript: ">=4" typescript: ">=4"
cosmiconfig-typescript-loader@6.1.0:
resolution:
{
integrity: sha512-tJ1w35ZRUiM5FeTzT7DtYWAFFv37ZLqSRkGi2oeCK1gPhvaWjkAtfXvLmvE1pRfxxp9aQo6ba/Pvg1dKj05D4g==,
}
engines: { node: ">=v18" }
peerDependencies:
"@types/node": "*"
cosmiconfig: ">=9"
typescript: ">=5"
cosmiconfig@9.0.0: cosmiconfig@9.0.0:
resolution: resolution:
{ {
@ -3528,6 +3581,13 @@ packages:
} }
engines: { node: ">= 8" } engines: { node: ">= 8" }
cross-spawn@7.0.6:
resolution:
{
integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==,
}
engines: { node: ">= 8" }
crypto-js@4.2.0: crypto-js@4.2.0:
resolution: resolution:
{ {
@ -3573,10 +3633,10 @@ packages:
} }
engines: { node: ">=12 || >=16" } engines: { node: ">=12 || >=16" }
css-has-pseudo@7.0.1: css-has-pseudo@7.0.2:
resolution: resolution:
{ {
integrity: sha512-EOcoyJt+OsuKfCADgLT7gADZI5jMzIe/AeI6MeAYKiFBDmNmM7kk46DtSfMj5AohUJisqVzopBpnQTlvbyaBWg==, integrity: sha512-nzol/h+E0bId46Kn2dQH5VElaknX2Sr0hFuB/1EomdC7j+OISt2ZzK7EHX9DZDY53WbIVAR7FYKSO2XnSf07MQ==,
} }
engines: { node: ">=18" } engines: { node: ">=18" }
peerDependencies: peerDependencies:
@ -3625,10 +3685,10 @@ packages:
} }
engines: { node: ">= 6" } engines: { node: ">= 6" }
cssdb@8.1.2: cssdb@8.2.3:
resolution: resolution:
{ {
integrity: sha512-ba3HmHU/lxy9nfz/fQLA/Ul+/oSdSOXqoR53BDmRvXTfRbkGqHKqr2rSxADYMRF4uD8vZhMlCQ6c5TEfLLkkVA==, integrity: sha512-9BDG5XmJrJQQnJ51VFxXCAtpZ5ebDlAREmO8sxMOVU0aSxN/gocbctjIG5LMh3WBUq+xTlb/jw2LoljBEqraTA==,
} }
cssesc@3.0.0: cssesc@3.0.0:
@ -3807,6 +3867,18 @@ packages:
supports-color: supports-color:
optional: true optional: true
debug@4.4.0:
resolution:
{
integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==,
}
engines: { node: ">=6.0" }
peerDependencies:
supports-color: "*"
peerDependenciesMeta:
supports-color:
optional: true
decamelize@1.2.0: decamelize@1.2.0:
resolution: resolution:
{ {
@ -4078,12 +4150,12 @@ packages:
} }
engines: { node: ">= 0.4" } engines: { node: ">= 0.4" }
esbuild@0.21.5: esbuild@0.24.0:
resolution: resolution:
{ {
integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==, integrity: sha512-FuLPevChGDshgSicjisSooU0cemp/sGXR841D5LHMB7mTVOmsEHcAxaH3irL53+8YDIeVNQEySh4DaYU/iuPqQ==,
} }
engines: { node: ">=12" } engines: { node: ">=18" }
hasBin: true hasBin: true
escalade@3.2.0: escalade@3.2.0:
@ -4161,10 +4233,10 @@ packages:
} }
engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 }
eslint@9.14.0: eslint@9.17.0:
resolution: resolution:
{ {
integrity: sha512-c2FHsVBr87lnUtjP4Yhvk4yEhKrQavGafRA/Se1ouse8PfbfC/Qh9Mxa00yWsZRlqeUB9raXip0aiiUZkgnr9g==, integrity: sha512-evtlNcpJg+cZLcnVKwsai8fExnqjGPicK7gnUtlNuzu+Fv9bI0aLpND5T44VLQtoMEnI57LoXO9XAkIXwohKrA==,
} }
engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 }
hasBin: true hasBin: true
@ -4724,10 +4796,10 @@ packages:
} }
engines: { node: ">=18" } engines: { node: ">=18" }
globals@15.12.0: globals@15.13.0:
resolution: resolution:
{ {
integrity: sha512-1+gLErljJFhbOVyaetcwJiJ4+eLe45S2E7P5UiZ9xGfeq3ATQf5DOv9G7MH3gGbKQLkzmNh2DxfZwLdw+j6oTQ==, integrity: sha512-49TewVEz0UxZjr1WYYsWpPrhyC/B/pA8Bq0fUmet2n+eR7yn0IvNzNaoBwnK6mdkzcN+se7Ez9zUgULTz2QH4g==,
} }
engines: { node: ">=18" } engines: { node: ">=18" }
@ -4899,6 +4971,12 @@ packages:
} }
engines: { node: ">=8" } engines: { node: ">=8" }
htmlfy@0.5.0:
resolution:
{
integrity: sha512-/g4imybF9k7eJT+VEsjtpx1i3BHYxFxv6/RS0Lf8veh1+pw0HzAEndGTdjvrlVRqUSu7YurJZkfnLXpVZ2yrEw==,
}
http-cache-semantics@4.1.1: http-cache-semantics@4.1.1:
resolution: resolution:
{ {
@ -4947,10 +5025,10 @@ packages:
} }
engines: { node: ">=18.18.0" } engines: { node: ">=18.18.0" }
husky@9.1.6: husky@9.1.7:
resolution: resolution:
{ {
integrity: sha512-sqbjZKK7kf44hfdE94EoX8MZNk0n7HeW37O4YrVGCF4wzgQjp+akPAkfUK5LZ6KuR/6sqeAVuXHji+RzQgOn5A==, integrity: sha512-5gs5ytaNjBrh5Ow3zrvdUUY+0VxIuWVL4i9irt6friV+BqdCfmV11CQTWMiBYWHbXhco+J1kHfTOUkePhCDvMA==,
} }
engines: { node: ">=18" } engines: { node: ">=18" }
hasBin: true hasBin: true
@ -5151,10 +5229,10 @@ packages:
} }
engines: { node: ">= 0.4" } engines: { node: ">= 0.4" }
is-ci@3.0.1: is-ci@4.1.0:
resolution: resolution:
{ {
integrity: sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==, integrity: sha512-Ab9bQDQ11lWootZUI5qxgN2ZXwxNI5hTwnsvOc1wyxQ7zQ8OkEDw79mI0+9jI3x432NfwbVRru+3noJfXF6lSQ==,
} }
hasBin: true hasBin: true
@ -5432,6 +5510,13 @@ packages:
} }
hasBin: true hasBin: true
jiti@2.4.1:
resolution:
{
integrity: sha512-yPBThwecp1wS9DmoA4x4KR2h3QoslacnDR8ypuFM962kI4/456Iy1oHx2RAgh4jfZNdn0bctsdadceiBUgpU1g==,
}
hasBin: true
jpeg-exif@1.1.4: jpeg-exif@1.1.4:
resolution: resolution:
{ {
@ -5549,10 +5634,10 @@ packages:
} }
engines: { node: ">=0.10.0" } engines: { node: ">=0.10.0" }
known-css-properties@0.34.0: known-css-properties@0.35.0:
resolution: resolution:
{ {
integrity: sha512-tBECoUqNFbyAY4RrbqsBQqDFpGXAEbdD5QKr8kACx3+rnArmuuR22nKQWKazvp07N9yjTyDZaw/20UIH8tL9DQ==, integrity: sha512-a/RAk2BfKk+WFGhhOCAYqSiFLc34k8Mt/6NWRI4joER0EYUzXIcFivjjnoD3+XU1DggLn/tZc3DOAgke7l8a4A==,
} }
leaflet.markercluster@1.5.3: leaflet.markercluster@1.5.3:
@ -5583,13 +5668,6 @@ packages:
} }
engines: { node: ">= 0.8.0" } engines: { node: ">= 0.8.0" }
lilconfig@2.1.0:
resolution:
{
integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==,
}
engines: { node: ">=10" }
lilconfig@3.1.2: lilconfig@3.1.2:
resolution: resolution:
{ {
@ -5597,16 +5675,23 @@ packages:
} }
engines: { node: ">=14" } engines: { node: ">=14" }
lilconfig@3.1.3:
resolution:
{
integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==,
}
engines: { node: ">=14" }
lines-and-columns@1.2.4: lines-and-columns@1.2.4:
resolution: resolution:
{ {
integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==, integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==,
} }
lint-staged@15.2.10: lint-staged@15.2.11:
resolution: resolution:
{ {
integrity: sha512-5dY5t743e1byO19P9I4b3x8HJwalIznL5E1FWYnU6OWw33KxNBSLAc6Cy7F2PsFEO8FKnLwjwm5hx7aMF0jzZg==, integrity: sha512-Ev6ivCTYRTGs9ychvpVw35m/bcNDuBN+mnTeObCL5h+boS5WzBEC6LHI4I9F/++sZm1m+J2LEiy0gxL/R9TBqQ==,
} }
engines: { node: ">=18.12.0" } engines: { node: ">=18.12.0" }
hasBin: true hasBin: true
@ -5860,10 +5945,10 @@ packages:
engines: { node: ">= 18" } engines: { node: ">= 18" }
hasBin: true hasBin: true
marked@14.1.3: marked@15.0.4:
resolution: resolution:
{ {
integrity: sha512-ZibJqTULGlt9g5k4VMARAktMAjXoVnnr+Y3aCqW1oDftcV4BA3UmrBifzXoZyenHRk75csiPu9iwsTj4VNBT0g==, integrity: sha512-TCHvDqmb3ZJ4PWG7VEGVgtefA5/euFmsIhxtD0XsBxI39gUSKL81mIRFdt0AiNQozUahd4ke98ZdirExd/vSEw==,
} }
engines: { node: ">= 18" } engines: { node: ">= 18" }
hasBin: true hasBin: true
@ -6721,10 +6806,10 @@ packages:
peerDependencies: peerDependencies:
postcss: ^8.4.6 postcss: ^8.4.6
postcss-color-functional-notation@7.0.5: postcss-color-functional-notation@7.0.6:
resolution: resolution:
{ {
integrity: sha512-zW97tq5t2sSSSZQcIS4y6NDZj79zVv8hrBIJ4PSFZFmMBcjYqCt8sRXFGIYZohCpfFHmimMNqJje2Qd3qqMNdg==, integrity: sha512-wLXvm8RmLs14Z2nVpB4CWlnvaWPRcOZFltJSlcbYwSJ1EDZKsKDhPKIMecCnuU054KSmlmubkqczmm6qBPCBhA==,
} }
engines: { node: ">=18" } engines: { node: ">=18" }
peerDependencies: peerDependencies:
@ -6918,10 +7003,10 @@ packages:
peerDependencies: peerDependencies:
postcss: ^8.4.21 postcss: ^8.4.21
postcss-lab-function@7.0.5: postcss-lab-function@7.0.6:
resolution: resolution:
{ {
integrity: sha512-q2M8CfQbjHxbwv1GPAny05EVuj0WByUgq/OWKgpfbTHnMchtUqsVQgaW1mztjSZ4UPufwuTLB14fmFGsoTE/VQ==, integrity: sha512-HPwvsoK7C949vBZ+eMyvH2cQeMr3UREoHvbtra76/UhDuiViZH6pir+z71UaJQohd7VDSVUdR6TkWYKExEc9aQ==,
} }
engines: { node: ">=18" } engines: { node: ">=18" }
peerDependencies: peerDependencies:
@ -7005,15 +7090,6 @@ packages:
peerDependencies: peerDependencies:
postcss: ^8.4.31 postcss: ^8.4.31
postcss-nested@5.0.6:
resolution:
{
integrity: sha512-rKqm2Fk0KbA8Vt3AdGN0FB9OBOMDVajMG6ZCf/GoHgdxUJ4sBFp0A/uMIRm+MJUdo33YXEtjqIz8u7DAp8B7DA==,
}
engines: { node: ">=12.0" }
peerDependencies:
postcss: ^8.2.14
postcss-nested@6.2.0: postcss-nested@6.2.0:
resolution: resolution:
{ {
@ -7157,10 +7233,10 @@ packages:
peerDependencies: peerDependencies:
postcss: ^8.4 postcss: ^8.4
postcss-preset-env@10.0.9: postcss-preset-env@10.1.2:
resolution: resolution:
{ {
integrity: sha512-mpfJWMAW6szov+ifW9HpNUUZE3BoXoHc4CDzNQHdH2I4CwsqulQ3bpFNUR6zh4tg0BUcqM7UUAbzG4UTel8QYw==, integrity: sha512-OqUBZ9ByVfngWhMNuBEMy52Izj07oIFA6K/EOGBlaSv+P12MiE1+S2cqXtS1VuW82demQ/Tzc7typYk3uHunkA==,
} }
engines: { node: ">=18" } engines: { node: ">=18" }
peerDependencies: peerDependencies:
@ -7279,10 +7355,10 @@ packages:
integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==, integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==,
} }
postcss@8.4.47: postcss@8.4.49:
resolution: resolution:
{ {
integrity: sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==, integrity: sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==,
} }
engines: { node: ^10 || ^12 || >=14 } engines: { node: ^10 || ^12 || >=14 }
@ -7321,10 +7397,10 @@ packages:
engines: { node: ">=10.13.0" } engines: { node: ">=10.13.0" }
hasBin: true hasBin: true
prettier@3.3.3: prettier@3.4.2:
resolution: resolution:
{ {
integrity: sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==, integrity: sha512-e9MewbtFo+Fevyuxn/4rrcDAaq0IYxPGLvObpQjiZBMAzB9IGmzlnG9RZy3FFas+eBMu2vA0CszMeduow5dIuQ==,
} }
engines: { node: ">=14" } engines: { node: ">=14" }
hasBin: true hasBin: true
@ -8112,10 +8188,10 @@ packages:
peerDependencies: peerDependencies:
stylelint: ^16.1.0 stylelint: ^16.1.0
stylelint@16.10.0: stylelint@16.12.0:
resolution: resolution:
{ {
integrity: sha512-z/8X2rZ52dt2c0stVwI9QL2AFJhLhbPkyfpDFcizs200V/g7v+UYY6SNcB9hKOLcDDX/yGLDsY/pX08sLkz9xQ==, integrity: sha512-F8zZ3L/rBpuoBZRvI4JVT20ZanPLXfQLzMOZg1tzPflRVh9mKpOZ8qcSIhh1my3FjAjZWG4T2POwGnmn6a6hbg==,
} }
engines: { node: ">=18.12.0" } engines: { node: ">=18.12.0" }
hasBin: true hasBin: true
@ -8184,17 +8260,17 @@ packages:
} }
engines: { node: ^14.18.0 || >=16.0.0 } engines: { node: ^14.18.0 || >=16.0.0 }
table@6.8.2: table@6.9.0:
resolution: resolution:
{ {
integrity: sha512-w2sfv80nrAh2VCbqR5AK27wswXhqcck2AhfnNW76beQXskGZ1V12GwS//yYVa3d3fcvAip2OUnbDAjW2k3v9fA==, integrity: sha512-9kY+CygyYM6j02t5YFHbNz2FN5QmYGv9zAjVp4lCDjlCw7amdckXlEt/bjMhUIfj4ThGRE4gCUH5+yGnNuPo5A==,
} }
engines: { node: ">=10.0.0" } engines: { node: ">=10.0.0" }
tailwindcss@3.4.14: tailwindcss@3.4.16:
resolution: resolution:
{ {
integrity: sha512-IcSvOcTRcUtQQ7ILQL5quRDg7Xs93PdJEk1ZLbhhvJc7uj/OAhYOnruEiwnGgBvUtaUAJ8/mhSw1o8L2jCiENA==, integrity: sha512-TI4Cyx7gDiZ6r44ewaJmt0o6BrMCT5aK5e0rmJ/G9Xq3w7CX/5VXl/zIPEJZFUK5VEqwByyhqNPycPlvcK4ZNw==,
} }
engines: { node: ">=14.0.0" } engines: { node: ">=14.0.0" }
hasBin: true hasBin: true
@ -8242,12 +8318,6 @@ packages:
} }
engines: { node: ">=8" } engines: { node: ">=8" }
text-table@0.2.0:
resolution:
{
integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==,
}
thenby@1.3.4: thenby@1.3.4:
resolution: resolution:
{ {
@ -8441,22 +8511,20 @@ packages:
} }
engines: { node: ">= 0.4" } engines: { node: ">= 0.4" }
typescript-eslint@8.13.0: typescript-eslint@8.18.1:
resolution: resolution:
{ {
integrity: sha512-vIMpDRJrQd70au2G8w34mPps0ezFSPMEX4pXkTzUkrNbRX+36ais2ksGWN0esZL+ZMaFJEneOBHzCgSqle7DHw==, integrity: sha512-Mlaw6yxuaDEPQvb/2Qwu3/TfgeBHy9iTJ3mTwe7OvpPmF6KPQjVOfGyEJpPv6Ez2C34OODChhXrzYw/9phI0MQ==,
} }
engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 }
peerDependencies: peerDependencies:
typescript: "*" eslint: ^8.57.0 || ^9.0.0
peerDependenciesMeta: typescript: ">=4.8.4 <5.8.0"
typescript:
optional: true
typescript@5.5.4: typescript@5.7.2:
resolution: resolution:
{ {
integrity: sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==, integrity: sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg==,
} }
engines: { node: ">=14.17" } engines: { node: ">=14.17" }
hasBin: true hasBin: true
@ -8616,40 +8684,45 @@ packages:
integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==, integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==,
} }
vite-plugin-pwa@0.20.5: vite-plugin-pwa@0.21.1:
resolution: resolution:
{ {
integrity: sha512-aweuI/6G6n4C5Inn0vwHumElU/UEpNuO+9iZzwPZGTCH87TeZ6YFMrEY6ZUBQdIHHlhTsbMDryFARcSuOdsz9Q==, integrity: sha512-rkTbKFbd232WdiRJ9R3u+hZmf5SfQljX1b45NF6oLA6DSktEKpYllgTo1l2lkiZWMWV78pABJtFjNXfBef3/3Q==,
} }
engines: { node: ">=16.0.0" } engines: { node: ">=16.0.0" }
peerDependencies: peerDependencies:
"@vite-pwa/assets-generator": ^0.2.6 "@vite-pwa/assets-generator": ^0.2.6
vite: ^3.1.0 || ^4.0.0 || ^5.0.0 vite: ^3.1.0 || ^4.0.0 || ^5.0.0 || ^6.0.0
workbox-build: ^7.1.0 workbox-build: ^7.3.0
workbox-window: ^7.1.0 workbox-window: ^7.3.0
peerDependenciesMeta: peerDependenciesMeta:
"@vite-pwa/assets-generator": "@vite-pwa/assets-generator":
optional: true optional: true
vite@5.4.10: vite@6.0.3:
resolution: resolution:
{ {
integrity: sha512-1hvaPshuPUtxeQ0hsVH3Mud0ZanOLwVTneA1EgbAM5LhaZEqyPWGRQ7BtaMvUrTDeEaC8pxtj6a6jku3x4z6SQ==, integrity: sha512-Cmuo5P0ENTN6HxLSo6IHsjCLn/81Vgrp81oaiFFMRa8gGDj5xEjIcEpf2ZymZtZR8oU0P2JX5WuUp/rlXcHkAw==,
} }
engines: { node: ^18.0.0 || >=20.0.0 } engines: { node: ^18.0.0 || ^20.0.0 || >=22.0.0 }
hasBin: true hasBin: true
peerDependencies: peerDependencies:
"@types/node": ^18.0.0 || >=20.0.0 "@types/node": ^18.0.0 || ^20.0.0 || >=22.0.0
jiti: ">=1.21.0"
less: "*" less: "*"
lightningcss: ^1.21.0 lightningcss: ^1.21.0
sass: "*" sass: "*"
sass-embedded: "*" sass-embedded: "*"
stylus: "*" stylus: "*"
sugarss: "*" sugarss: "*"
terser: ^5.4.0 terser: ^5.16.0
tsx: ^4.8.1
yaml: ^2.4.2
peerDependenciesMeta: peerDependenciesMeta:
"@types/node": "@types/node":
optional: true optional: true
jiti:
optional: true
less: less:
optional: true optional: true
lightningcss: lightningcss:
@ -8664,6 +8737,10 @@ packages:
optional: true optional: true
terser: terser:
optional: true optional: true
tsx:
optional: true
yaml:
optional: true
w3c-keyname@2.2.8: w3c-keyname@2.2.8:
resolution: resolution:
@ -8671,10 +8748,10 @@ packages:
integrity: sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==, integrity: sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==,
} }
wavesurfer.js@7.8.8: wavesurfer.js@7.8.11:
resolution: resolution:
{ {
integrity: sha512-FNiJ6RCAu4TijRcwdaqlN19+Y+Hhqb7Nfo2P4LudzhNnQRMKvF3QmXd9+KHlQZrSjexeK3WbY4COsxgGJkxMag==, integrity: sha512-bZs7A0vtTVOhuPoDGOXVevAIm+KVYBGwddjL9AeOS7kp/oPcVH9hQWQyR2rBAAfN6s0BKI+EdPEalkNaOmkA6A==,
} }
wcwidth@1.0.1: wcwidth@1.0.1:
@ -8938,14 +9015,6 @@ packages:
integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==, integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==,
} }
yaml@2.5.1:
resolution:
{
integrity: sha512-bLQOjaX/ADgQ20isPJRvF0iRUHIxVhYvr53Of7wGcWlO2jvtUlH5m87DsmulFVxRpNLOnI4tB6p/oh8D7kpn9Q==,
}
engines: { node: ">= 14" }
hasBin: true
yaml@2.6.0: yaml@2.6.0:
resolution: resolution:
{ {
@ -8954,6 +9023,14 @@ packages:
engines: { node: ">= 14" } engines: { node: ">= 14" }
hasBin: true hasBin: true
yaml@2.6.1:
resolution:
{
integrity: sha512-7r0XPzioN/Q9kXBro/XPnA6kznR73DHq+GXh5ON7ZozRO6aMjbmiBuKste2wslTFkC5d1dw0GooOCepZXJ2SAg==,
}
engines: { node: ">= 14" }
hasBin: true
yargs-parser@18.1.3: yargs-parser@18.1.3:
resolution: resolution:
{ {
@ -9708,33 +9785,65 @@ snapshots:
"@babel/helper-string-parser": 7.25.9 "@babel/helper-string-parser": 7.25.9
"@babel/helper-validator-identifier": 7.25.9 "@babel/helper-validator-identifier": 7.25.9
"@codemirror/autocomplete@6.18.2(@codemirror/language@6.10.3)(@codemirror/state@6.4.1)(@codemirror/view@6.34.2)(@lezer/common@1.2.3)": "@codemirror/autocomplete@6.18.2(@codemirror/language@6.10.7)(@codemirror/state@6.5.0)(@codemirror/view@6.35.3)(@lezer/common@1.2.3)":
dependencies: dependencies:
"@codemirror/language": 6.10.3 "@codemirror/language": 6.10.7
"@codemirror/state": 6.4.1 "@codemirror/state": 6.5.0
"@codemirror/view": 6.34.2 "@codemirror/view": 6.35.3
"@lezer/common": 1.2.3 "@lezer/common": 1.2.3
"@codemirror/commands@6.7.1": "@codemirror/commands@6.7.1":
dependencies: dependencies:
"@codemirror/language": 6.10.3 "@codemirror/language": 6.10.7
"@codemirror/state": 6.4.1 "@codemirror/state": 6.5.0
"@codemirror/view": 6.34.2 "@codemirror/view": 6.35.3
"@lezer/common": 1.2.3 "@lezer/common": 1.2.3
"@codemirror/lang-css@6.3.1(@codemirror/view@6.35.3)":
dependencies:
"@codemirror/autocomplete": 6.18.2(@codemirror/language@6.10.7)(@codemirror/state@6.5.0)(@codemirror/view@6.35.3)(@lezer/common@1.2.3)
"@codemirror/language": 6.10.7
"@codemirror/state": 6.5.0
"@lezer/common": 1.2.3
"@lezer/css": 1.1.9
transitivePeerDependencies:
- "@codemirror/view"
"@codemirror/lang-html@6.4.9":
dependencies:
"@codemirror/autocomplete": 6.18.2(@codemirror/language@6.10.7)(@codemirror/state@6.5.0)(@codemirror/view@6.35.3)(@lezer/common@1.2.3)
"@codemirror/lang-css": 6.3.1(@codemirror/view@6.35.3)
"@codemirror/lang-javascript": 6.2.2
"@codemirror/language": 6.10.7
"@codemirror/state": 6.5.0
"@codemirror/view": 6.35.3
"@lezer/common": 1.2.3
"@lezer/css": 1.1.9
"@lezer/html": 1.3.10
"@codemirror/lang-javascript@6.2.2":
dependencies:
"@codemirror/autocomplete": 6.18.2(@codemirror/language@6.10.7)(@codemirror/state@6.5.0)(@codemirror/view@6.35.3)(@lezer/common@1.2.3)
"@codemirror/language": 6.10.7
"@codemirror/lint": 6.8.2
"@codemirror/state": 6.5.0
"@codemirror/view": 6.35.3
"@lezer/common": 1.2.3
"@lezer/javascript": 1.4.21
"@codemirror/lang-xml@6.1.0": "@codemirror/lang-xml@6.1.0":
dependencies: dependencies:
"@codemirror/autocomplete": 6.18.2(@codemirror/language@6.10.3)(@codemirror/state@6.4.1)(@codemirror/view@6.34.2)(@lezer/common@1.2.3) "@codemirror/autocomplete": 6.18.2(@codemirror/language@6.10.7)(@codemirror/state@6.5.0)(@codemirror/view@6.35.3)(@lezer/common@1.2.3)
"@codemirror/language": 6.10.3 "@codemirror/language": 6.10.7
"@codemirror/state": 6.4.1 "@codemirror/state": 6.5.0
"@codemirror/view": 6.34.2 "@codemirror/view": 6.35.3
"@lezer/common": 1.2.3 "@lezer/common": 1.2.3
"@lezer/xml": 1.0.5 "@lezer/xml": 1.0.5
"@codemirror/language@6.10.3": "@codemirror/language@6.10.7":
dependencies: dependencies:
"@codemirror/state": 6.4.1 "@codemirror/state": 6.5.0
"@codemirror/view": 6.34.2 "@codemirror/view": 6.35.3
"@lezer/common": 1.2.3 "@lezer/common": 1.2.3
"@lezer/highlight": 1.2.1 "@lezer/highlight": 1.2.1
"@lezer/lr": 1.4.2 "@lezer/lr": 1.4.2
@ -9742,32 +9851,34 @@ snapshots:
"@codemirror/lint@6.8.2": "@codemirror/lint@6.8.2":
dependencies: dependencies:
"@codemirror/state": 6.4.1 "@codemirror/state": 6.5.0
"@codemirror/view": 6.34.2 "@codemirror/view": 6.35.3
crelt: 1.0.6 crelt: 1.0.6
"@codemirror/search@6.5.7": "@codemirror/search@6.5.7":
dependencies: dependencies:
"@codemirror/state": 6.4.1 "@codemirror/state": 6.5.0
"@codemirror/view": 6.34.2 "@codemirror/view": 6.35.3
crelt: 1.0.6 crelt: 1.0.6
"@codemirror/state@6.4.1": {} "@codemirror/state@6.5.0":
"@codemirror/view@6.34.2":
dependencies: dependencies:
"@codemirror/state": 6.4.1 "@marijn/find-cluster-break": 1.0.2
"@codemirror/view@6.35.3":
dependencies:
"@codemirror/state": 6.5.0
style-mod: 4.1.2 style-mod: 4.1.2
w3c-keyname: 2.2.8 w3c-keyname: 2.2.8
"@colors/colors@1.5.0": "@colors/colors@1.5.0":
optional: true optional: true
"@commitlint/cli@19.5.0(@types/node@22.9.0)(typescript@5.5.4)": "@commitlint/cli@19.6.1(@types/node@22.9.0)(typescript@5.7.2)":
dependencies: dependencies:
"@commitlint/format": 19.5.0 "@commitlint/format": 19.5.0
"@commitlint/lint": 19.5.0 "@commitlint/lint": 19.6.0
"@commitlint/load": 19.5.0(@types/node@22.9.0)(typescript@5.5.4) "@commitlint/load": 19.6.1(@types/node@22.9.0)(typescript@5.7.2)
"@commitlint/read": 19.5.0 "@commitlint/read": 19.5.0
"@commitlint/types": 19.5.0 "@commitlint/types": 19.5.0
tinyexec: 0.3.1 tinyexec: 0.3.1
@ -9776,7 +9887,7 @@ snapshots:
- "@types/node" - "@types/node"
- typescript - typescript
"@commitlint/config-conventional@19.5.0": "@commitlint/config-conventional@19.6.0":
dependencies: dependencies:
"@commitlint/types": 19.5.0 "@commitlint/types": 19.5.0
conventional-changelog-conventionalcommits: 7.0.2 conventional-changelog-conventionalcommits: 7.0.2
@ -9802,27 +9913,44 @@ snapshots:
"@commitlint/types": 19.5.0 "@commitlint/types": 19.5.0
chalk: 5.3.0 chalk: 5.3.0
"@commitlint/is-ignored@19.5.0": "@commitlint/is-ignored@19.6.0":
dependencies: dependencies:
"@commitlint/types": 19.5.0 "@commitlint/types": 19.5.0
semver: 7.6.3 semver: 7.6.3
"@commitlint/lint@19.5.0": "@commitlint/lint@19.6.0":
dependencies: dependencies:
"@commitlint/is-ignored": 19.5.0 "@commitlint/is-ignored": 19.6.0
"@commitlint/parse": 19.5.0 "@commitlint/parse": 19.5.0
"@commitlint/rules": 19.5.0 "@commitlint/rules": 19.6.0
"@commitlint/types": 19.5.0 "@commitlint/types": 19.5.0
"@commitlint/load@19.5.0(@types/node@22.9.0)(typescript@5.5.4)": "@commitlint/load@19.5.0(@types/node@22.9.0)(typescript@5.7.2)":
dependencies: dependencies:
"@commitlint/config-validator": 19.5.0 "@commitlint/config-validator": 19.5.0
"@commitlint/execute-rule": 19.5.0 "@commitlint/execute-rule": 19.5.0
"@commitlint/resolve-extends": 19.5.0 "@commitlint/resolve-extends": 19.5.0
"@commitlint/types": 19.5.0 "@commitlint/types": 19.5.0
chalk: 5.3.0 chalk: 5.3.0
cosmiconfig: 9.0.0(typescript@5.5.4) cosmiconfig: 9.0.0(typescript@5.7.2)
cosmiconfig-typescript-loader: 5.1.0(@types/node@22.9.0)(cosmiconfig@9.0.0(typescript@5.5.4))(typescript@5.5.4) cosmiconfig-typescript-loader: 5.1.0(@types/node@22.9.0)(cosmiconfig@9.0.0(typescript@5.7.2))(typescript@5.7.2)
lodash.isplainobject: 4.0.6
lodash.merge: 4.6.2
lodash.uniq: 4.5.0
transitivePeerDependencies:
- "@types/node"
- typescript
optional: true
"@commitlint/load@19.6.1(@types/node@22.9.0)(typescript@5.7.2)":
dependencies:
"@commitlint/config-validator": 19.5.0
"@commitlint/execute-rule": 19.5.0
"@commitlint/resolve-extends": 19.5.0
"@commitlint/types": 19.5.0
chalk: 5.3.0
cosmiconfig: 9.0.0(typescript@5.7.2)
cosmiconfig-typescript-loader: 6.1.0(@types/node@22.9.0)(cosmiconfig@9.0.0(typescript@5.7.2))(typescript@5.7.2)
lodash.isplainobject: 4.0.6 lodash.isplainobject: 4.0.6
lodash.merge: 4.6.2 lodash.merge: 4.6.2
lodash.uniq: 4.5.0 lodash.uniq: 4.5.0
@ -9855,7 +9983,7 @@ snapshots:
lodash.mergewith: 4.6.2 lodash.mergewith: 4.6.2
resolve-from: 5.0.0 resolve-from: 5.0.0
"@commitlint/rules@19.5.0": "@commitlint/rules@19.6.0":
dependencies: dependencies:
"@commitlint/ensure": 19.5.0 "@commitlint/ensure": 19.5.0
"@commitlint/message": 19.5.0 "@commitlint/message": 19.5.0
@ -9880,15 +10008,15 @@ snapshots:
"@csstools/color-helpers@5.0.1": {} "@csstools/color-helpers@5.0.1": {}
"@csstools/css-calc@2.0.4(@csstools/css-parser-algorithms@3.0.4(@csstools/css-tokenizer@3.0.3))(@csstools/css-tokenizer@3.0.3)": "@csstools/css-calc@2.1.0(@csstools/css-parser-algorithms@3.0.4(@csstools/css-tokenizer@3.0.3))(@csstools/css-tokenizer@3.0.3)":
dependencies: dependencies:
"@csstools/css-parser-algorithms": 3.0.4(@csstools/css-tokenizer@3.0.3) "@csstools/css-parser-algorithms": 3.0.4(@csstools/css-tokenizer@3.0.3)
"@csstools/css-tokenizer": 3.0.3 "@csstools/css-tokenizer": 3.0.3
"@csstools/css-color-parser@3.0.5(@csstools/css-parser-algorithms@3.0.4(@csstools/css-tokenizer@3.0.3))(@csstools/css-tokenizer@3.0.3)": "@csstools/css-color-parser@3.0.6(@csstools/css-parser-algorithms@3.0.4(@csstools/css-tokenizer@3.0.3))(@csstools/css-tokenizer@3.0.3)":
dependencies: dependencies:
"@csstools/color-helpers": 5.0.1 "@csstools/color-helpers": 5.0.1
"@csstools/css-calc": 2.0.4(@csstools/css-parser-algorithms@3.0.4(@csstools/css-tokenizer@3.0.3))(@csstools/css-tokenizer@3.0.3) "@csstools/css-calc": 2.1.0(@csstools/css-parser-algorithms@3.0.4(@csstools/css-tokenizer@3.0.3))(@csstools/css-tokenizer@3.0.3)
"@csstools/css-parser-algorithms": 3.0.4(@csstools/css-tokenizer@3.0.3) "@csstools/css-parser-algorithms": 3.0.4(@csstools/css-tokenizer@3.0.3)
"@csstools/css-tokenizer": 3.0.3 "@csstools/css-tokenizer": 3.0.3
@ -9898,317 +10026,327 @@ snapshots:
"@csstools/css-tokenizer@3.0.3": {} "@csstools/css-tokenizer@3.0.3": {}
"@csstools/media-query-list-parser@3.0.1(@csstools/css-parser-algorithms@3.0.4(@csstools/css-tokenizer@3.0.3))(@csstools/css-tokenizer@3.0.3)":
dependencies:
"@csstools/css-parser-algorithms": 3.0.4(@csstools/css-tokenizer@3.0.3)
"@csstools/css-tokenizer": 3.0.3
"@csstools/media-query-list-parser@4.0.2(@csstools/css-parser-algorithms@3.0.4(@csstools/css-tokenizer@3.0.3))(@csstools/css-tokenizer@3.0.3)": "@csstools/media-query-list-parser@4.0.2(@csstools/css-parser-algorithms@3.0.4(@csstools/css-tokenizer@3.0.3))(@csstools/css-tokenizer@3.0.3)":
dependencies: dependencies:
"@csstools/css-parser-algorithms": 3.0.4(@csstools/css-tokenizer@3.0.3) "@csstools/css-parser-algorithms": 3.0.4(@csstools/css-tokenizer@3.0.3)
"@csstools/css-tokenizer": 3.0.3 "@csstools/css-tokenizer": 3.0.3
"@csstools/postcss-cascade-layers@5.0.1(postcss@8.4.47)": "@csstools/postcss-cascade-layers@5.0.1(postcss@8.4.49)":
dependencies: dependencies:
"@csstools/selector-specificity": 5.0.0(postcss-selector-parser@7.0.0) "@csstools/selector-specificity": 5.0.0(postcss-selector-parser@7.0.0)
postcss: 8.4.47 postcss: 8.4.49
postcss-selector-parser: 7.0.0 postcss-selector-parser: 7.0.0
"@csstools/postcss-color-function@4.0.5(postcss@8.4.47)": "@csstools/postcss-color-function@4.0.6(postcss@8.4.49)":
dependencies: dependencies:
"@csstools/css-color-parser": 3.0.5(@csstools/css-parser-algorithms@3.0.4(@csstools/css-tokenizer@3.0.3))(@csstools/css-tokenizer@3.0.3) "@csstools/css-color-parser": 3.0.6(@csstools/css-parser-algorithms@3.0.4(@csstools/css-tokenizer@3.0.3))(@csstools/css-tokenizer@3.0.3)
"@csstools/css-parser-algorithms": 3.0.4(@csstools/css-tokenizer@3.0.3) "@csstools/css-parser-algorithms": 3.0.4(@csstools/css-tokenizer@3.0.3)
"@csstools/css-tokenizer": 3.0.3 "@csstools/css-tokenizer": 3.0.3
"@csstools/postcss-progressive-custom-properties": 4.0.0(postcss@8.4.47) "@csstools/postcss-progressive-custom-properties": 4.0.0(postcss@8.4.49)
"@csstools/utilities": 2.0.0(postcss@8.4.47) "@csstools/utilities": 2.0.0(postcss@8.4.49)
postcss: 8.4.47 postcss: 8.4.49
"@csstools/postcss-color-mix-function@3.0.5(postcss@8.4.47)": "@csstools/postcss-color-mix-function@3.0.6(postcss@8.4.49)":
dependencies: dependencies:
"@csstools/css-color-parser": 3.0.5(@csstools/css-parser-algorithms@3.0.4(@csstools/css-tokenizer@3.0.3))(@csstools/css-tokenizer@3.0.3) "@csstools/css-color-parser": 3.0.6(@csstools/css-parser-algorithms@3.0.4(@csstools/css-tokenizer@3.0.3))(@csstools/css-tokenizer@3.0.3)
"@csstools/css-parser-algorithms": 3.0.4(@csstools/css-tokenizer@3.0.3) "@csstools/css-parser-algorithms": 3.0.4(@csstools/css-tokenizer@3.0.3)
"@csstools/css-tokenizer": 3.0.3 "@csstools/css-tokenizer": 3.0.3
"@csstools/postcss-progressive-custom-properties": 4.0.0(postcss@8.4.47) "@csstools/postcss-progressive-custom-properties": 4.0.0(postcss@8.4.49)
"@csstools/utilities": 2.0.0(postcss@8.4.47) "@csstools/utilities": 2.0.0(postcss@8.4.49)
postcss: 8.4.47 postcss: 8.4.49
"@csstools/postcss-content-alt-text@2.0.4(postcss@8.4.47)": "@csstools/postcss-content-alt-text@2.0.4(postcss@8.4.49)":
dependencies: dependencies:
"@csstools/css-parser-algorithms": 3.0.4(@csstools/css-tokenizer@3.0.3) "@csstools/css-parser-algorithms": 3.0.4(@csstools/css-tokenizer@3.0.3)
"@csstools/css-tokenizer": 3.0.3 "@csstools/css-tokenizer": 3.0.3
"@csstools/postcss-progressive-custom-properties": 4.0.0(postcss@8.4.47) "@csstools/postcss-progressive-custom-properties": 4.0.0(postcss@8.4.49)
"@csstools/utilities": 2.0.0(postcss@8.4.47) "@csstools/utilities": 2.0.0(postcss@8.4.49)
postcss: 8.4.47 postcss: 8.4.49
"@csstools/postcss-exponential-functions@2.0.4(postcss@8.4.47)": "@csstools/postcss-exponential-functions@2.0.5(postcss@8.4.49)":
dependencies: dependencies:
"@csstools/css-calc": 2.0.4(@csstools/css-parser-algorithms@3.0.4(@csstools/css-tokenizer@3.0.3))(@csstools/css-tokenizer@3.0.3) "@csstools/css-calc": 2.1.0(@csstools/css-parser-algorithms@3.0.4(@csstools/css-tokenizer@3.0.3))(@csstools/css-tokenizer@3.0.3)
"@csstools/css-parser-algorithms": 3.0.4(@csstools/css-tokenizer@3.0.3) "@csstools/css-parser-algorithms": 3.0.4(@csstools/css-tokenizer@3.0.3)
"@csstools/css-tokenizer": 3.0.3 "@csstools/css-tokenizer": 3.0.3
postcss: 8.4.47 postcss: 8.4.49
"@csstools/postcss-font-format-keywords@4.0.0(postcss@8.4.47)": "@csstools/postcss-font-format-keywords@4.0.0(postcss@8.4.49)":
dependencies: dependencies:
"@csstools/utilities": 2.0.0(postcss@8.4.47) "@csstools/utilities": 2.0.0(postcss@8.4.49)
postcss: 8.4.47 postcss: 8.4.49
postcss-value-parser: 4.2.0 postcss-value-parser: 4.2.0
"@csstools/postcss-gamut-mapping@2.0.5(postcss@8.4.47)": "@csstools/postcss-gamut-mapping@2.0.6(postcss@8.4.49)":
dependencies: dependencies:
"@csstools/css-color-parser": 3.0.5(@csstools/css-parser-algorithms@3.0.4(@csstools/css-tokenizer@3.0.3))(@csstools/css-tokenizer@3.0.3) "@csstools/css-color-parser": 3.0.6(@csstools/css-parser-algorithms@3.0.4(@csstools/css-tokenizer@3.0.3))(@csstools/css-tokenizer@3.0.3)
"@csstools/css-parser-algorithms": 3.0.4(@csstools/css-tokenizer@3.0.3) "@csstools/css-parser-algorithms": 3.0.4(@csstools/css-tokenizer@3.0.3)
"@csstools/css-tokenizer": 3.0.3 "@csstools/css-tokenizer": 3.0.3
postcss: 8.4.47 postcss: 8.4.49
"@csstools/postcss-gradients-interpolation-method@5.0.5(postcss@8.4.47)": "@csstools/postcss-gradients-interpolation-method@5.0.6(postcss@8.4.49)":
dependencies: dependencies:
"@csstools/css-color-parser": 3.0.5(@csstools/css-parser-algorithms@3.0.4(@csstools/css-tokenizer@3.0.3))(@csstools/css-tokenizer@3.0.3) "@csstools/css-color-parser": 3.0.6(@csstools/css-parser-algorithms@3.0.4(@csstools/css-tokenizer@3.0.3))(@csstools/css-tokenizer@3.0.3)
"@csstools/css-parser-algorithms": 3.0.4(@csstools/css-tokenizer@3.0.3) "@csstools/css-parser-algorithms": 3.0.4(@csstools/css-tokenizer@3.0.3)
"@csstools/css-tokenizer": 3.0.3 "@csstools/css-tokenizer": 3.0.3
"@csstools/postcss-progressive-custom-properties": 4.0.0(postcss@8.4.47) "@csstools/postcss-progressive-custom-properties": 4.0.0(postcss@8.4.49)
"@csstools/utilities": 2.0.0(postcss@8.4.47) "@csstools/utilities": 2.0.0(postcss@8.4.49)
postcss: 8.4.47 postcss: 8.4.49
"@csstools/postcss-hwb-function@4.0.5(postcss@8.4.47)": "@csstools/postcss-hwb-function@4.0.6(postcss@8.4.49)":
dependencies: dependencies:
"@csstools/css-color-parser": 3.0.5(@csstools/css-parser-algorithms@3.0.4(@csstools/css-tokenizer@3.0.3))(@csstools/css-tokenizer@3.0.3) "@csstools/css-color-parser": 3.0.6(@csstools/css-parser-algorithms@3.0.4(@csstools/css-tokenizer@3.0.3))(@csstools/css-tokenizer@3.0.3)
"@csstools/css-parser-algorithms": 3.0.4(@csstools/css-tokenizer@3.0.3) "@csstools/css-parser-algorithms": 3.0.4(@csstools/css-tokenizer@3.0.3)
"@csstools/css-tokenizer": 3.0.3 "@csstools/css-tokenizer": 3.0.3
"@csstools/postcss-progressive-custom-properties": 4.0.0(postcss@8.4.47) "@csstools/postcss-progressive-custom-properties": 4.0.0(postcss@8.4.49)
"@csstools/utilities": 2.0.0(postcss@8.4.47) "@csstools/utilities": 2.0.0(postcss@8.4.49)
postcss: 8.4.47 postcss: 8.4.49
"@csstools/postcss-ic-unit@4.0.0(postcss@8.4.47)": "@csstools/postcss-ic-unit@4.0.0(postcss@8.4.49)":
dependencies: dependencies:
"@csstools/postcss-progressive-custom-properties": 4.0.0(postcss@8.4.47) "@csstools/postcss-progressive-custom-properties": 4.0.0(postcss@8.4.49)
"@csstools/utilities": 2.0.0(postcss@8.4.47) "@csstools/utilities": 2.0.0(postcss@8.4.49)
postcss: 8.4.47 postcss: 8.4.49
postcss-value-parser: 4.2.0 postcss-value-parser: 4.2.0
"@csstools/postcss-initial@2.0.0(postcss@8.4.47)": "@csstools/postcss-initial@2.0.0(postcss@8.4.49)":
dependencies: dependencies:
postcss: 8.4.47 postcss: 8.4.49
"@csstools/postcss-is-pseudo-class@5.0.1(postcss@8.4.47)": "@csstools/postcss-is-pseudo-class@5.0.1(postcss@8.4.49)":
dependencies: dependencies:
"@csstools/selector-specificity": 5.0.0(postcss-selector-parser@7.0.0) "@csstools/selector-specificity": 5.0.0(postcss-selector-parser@7.0.0)
postcss: 8.4.47 postcss: 8.4.49
postcss-selector-parser: 7.0.0 postcss-selector-parser: 7.0.0
"@csstools/postcss-light-dark-function@2.0.7(postcss@8.4.47)": "@csstools/postcss-light-dark-function@2.0.7(postcss@8.4.49)":
dependencies: dependencies:
"@csstools/css-parser-algorithms": 3.0.4(@csstools/css-tokenizer@3.0.3) "@csstools/css-parser-algorithms": 3.0.4(@csstools/css-tokenizer@3.0.3)
"@csstools/css-tokenizer": 3.0.3 "@csstools/css-tokenizer": 3.0.3
"@csstools/postcss-progressive-custom-properties": 4.0.0(postcss@8.4.47) "@csstools/postcss-progressive-custom-properties": 4.0.0(postcss@8.4.49)
"@csstools/utilities": 2.0.0(postcss@8.4.47) "@csstools/utilities": 2.0.0(postcss@8.4.49)
postcss: 8.4.47 postcss: 8.4.49
"@csstools/postcss-logical-float-and-clear@3.0.0(postcss@8.4.47)": "@csstools/postcss-logical-float-and-clear@3.0.0(postcss@8.4.49)":
dependencies: dependencies:
postcss: 8.4.47 postcss: 8.4.49
"@csstools/postcss-logical-overflow@2.0.0(postcss@8.4.47)": "@csstools/postcss-logical-overflow@2.0.0(postcss@8.4.49)":
dependencies: dependencies:
postcss: 8.4.47 postcss: 8.4.49
"@csstools/postcss-logical-overscroll-behavior@2.0.0(postcss@8.4.47)": "@csstools/postcss-logical-overscroll-behavior@2.0.0(postcss@8.4.49)":
dependencies: dependencies:
postcss: 8.4.47 postcss: 8.4.49
"@csstools/postcss-logical-resize@3.0.0(postcss@8.4.47)": "@csstools/postcss-logical-resize@3.0.0(postcss@8.4.49)":
dependencies: dependencies:
postcss: 8.4.47 postcss: 8.4.49
postcss-value-parser: 4.2.0 postcss-value-parser: 4.2.0
"@csstools/postcss-logical-viewport-units@3.0.3(postcss@8.4.47)": "@csstools/postcss-logical-viewport-units@3.0.3(postcss@8.4.49)":
dependencies: dependencies:
"@csstools/css-tokenizer": 3.0.3 "@csstools/css-tokenizer": 3.0.3
"@csstools/utilities": 2.0.0(postcss@8.4.47) "@csstools/utilities": 2.0.0(postcss@8.4.49)
postcss: 8.4.47 postcss: 8.4.49
"@csstools/postcss-media-minmax@2.0.4(postcss@8.4.47)": "@csstools/postcss-media-minmax@2.0.5(postcss@8.4.49)":
dependencies: dependencies:
"@csstools/css-calc": 2.0.4(@csstools/css-parser-algorithms@3.0.4(@csstools/css-tokenizer@3.0.3))(@csstools/css-tokenizer@3.0.3) "@csstools/css-calc": 2.1.0(@csstools/css-parser-algorithms@3.0.4(@csstools/css-tokenizer@3.0.3))(@csstools/css-tokenizer@3.0.3)
"@csstools/css-parser-algorithms": 3.0.4(@csstools/css-tokenizer@3.0.3) "@csstools/css-parser-algorithms": 3.0.4(@csstools/css-tokenizer@3.0.3)
"@csstools/css-tokenizer": 3.0.3 "@csstools/css-tokenizer": 3.0.3
"@csstools/media-query-list-parser": 4.0.2(@csstools/css-parser-algorithms@3.0.4(@csstools/css-tokenizer@3.0.3))(@csstools/css-tokenizer@3.0.3) "@csstools/media-query-list-parser": 4.0.2(@csstools/css-parser-algorithms@3.0.4(@csstools/css-tokenizer@3.0.3))(@csstools/css-tokenizer@3.0.3)
postcss: 8.4.47 postcss: 8.4.49
"@csstools/postcss-media-queries-aspect-ratio-number-values@3.0.4(postcss@8.4.47)": "@csstools/postcss-media-queries-aspect-ratio-number-values@3.0.4(postcss@8.4.49)":
dependencies: dependencies:
"@csstools/css-parser-algorithms": 3.0.4(@csstools/css-tokenizer@3.0.3) "@csstools/css-parser-algorithms": 3.0.4(@csstools/css-tokenizer@3.0.3)
"@csstools/css-tokenizer": 3.0.3 "@csstools/css-tokenizer": 3.0.3
"@csstools/media-query-list-parser": 4.0.2(@csstools/css-parser-algorithms@3.0.4(@csstools/css-tokenizer@3.0.3))(@csstools/css-tokenizer@3.0.3) "@csstools/media-query-list-parser": 4.0.2(@csstools/css-parser-algorithms@3.0.4(@csstools/css-tokenizer@3.0.3))(@csstools/css-tokenizer@3.0.3)
postcss: 8.4.47 postcss: 8.4.49
"@csstools/postcss-nested-calc@4.0.0(postcss@8.4.47)": "@csstools/postcss-nested-calc@4.0.0(postcss@8.4.49)":
dependencies: dependencies:
"@csstools/utilities": 2.0.0(postcss@8.4.47) "@csstools/utilities": 2.0.0(postcss@8.4.49)
postcss: 8.4.47 postcss: 8.4.49
postcss-value-parser: 4.2.0 postcss-value-parser: 4.2.0
"@csstools/postcss-normalize-display-values@4.0.0(postcss@8.4.47)": "@csstools/postcss-normalize-display-values@4.0.0(postcss@8.4.49)":
dependencies: dependencies:
postcss: 8.4.47 postcss: 8.4.49
postcss-value-parser: 4.2.0 postcss-value-parser: 4.2.0
"@csstools/postcss-oklab-function@4.0.5(postcss@8.4.47)": "@csstools/postcss-oklab-function@4.0.6(postcss@8.4.49)":
dependencies: dependencies:
"@csstools/css-color-parser": 3.0.5(@csstools/css-parser-algorithms@3.0.4(@csstools/css-tokenizer@3.0.3))(@csstools/css-tokenizer@3.0.3) "@csstools/css-color-parser": 3.0.6(@csstools/css-parser-algorithms@3.0.4(@csstools/css-tokenizer@3.0.3))(@csstools/css-tokenizer@3.0.3)
"@csstools/css-parser-algorithms": 3.0.4(@csstools/css-tokenizer@3.0.3) "@csstools/css-parser-algorithms": 3.0.4(@csstools/css-tokenizer@3.0.3)
"@csstools/css-tokenizer": 3.0.3 "@csstools/css-tokenizer": 3.0.3
"@csstools/postcss-progressive-custom-properties": 4.0.0(postcss@8.4.47) "@csstools/postcss-progressive-custom-properties": 4.0.0(postcss@8.4.49)
"@csstools/utilities": 2.0.0(postcss@8.4.47) "@csstools/utilities": 2.0.0(postcss@8.4.49)
postcss: 8.4.47 postcss: 8.4.49
"@csstools/postcss-progressive-custom-properties@4.0.0(postcss@8.4.47)": "@csstools/postcss-progressive-custom-properties@4.0.0(postcss@8.4.49)":
dependencies: dependencies:
postcss: 8.4.47 postcss: 8.4.49
postcss-value-parser: 4.2.0 postcss-value-parser: 4.2.0
"@csstools/postcss-relative-color-syntax@3.0.5(postcss@8.4.47)": "@csstools/postcss-random-function@1.0.1(postcss@8.4.49)":
dependencies: dependencies:
"@csstools/css-color-parser": 3.0.5(@csstools/css-parser-algorithms@3.0.4(@csstools/css-tokenizer@3.0.3))(@csstools/css-tokenizer@3.0.3) "@csstools/css-calc": 2.1.0(@csstools/css-parser-algorithms@3.0.4(@csstools/css-tokenizer@3.0.3))(@csstools/css-tokenizer@3.0.3)
"@csstools/css-parser-algorithms": 3.0.4(@csstools/css-tokenizer@3.0.3) "@csstools/css-parser-algorithms": 3.0.4(@csstools/css-tokenizer@3.0.3)
"@csstools/css-tokenizer": 3.0.3 "@csstools/css-tokenizer": 3.0.3
"@csstools/postcss-progressive-custom-properties": 4.0.0(postcss@8.4.47) postcss: 8.4.49
"@csstools/utilities": 2.0.0(postcss@8.4.47)
postcss: 8.4.47
"@csstools/postcss-scope-pseudo-class@4.0.1(postcss@8.4.47)": "@csstools/postcss-relative-color-syntax@3.0.6(postcss@8.4.49)":
dependencies: dependencies:
postcss: 8.4.47 "@csstools/css-color-parser": 3.0.6(@csstools/css-parser-algorithms@3.0.4(@csstools/css-tokenizer@3.0.3))(@csstools/css-tokenizer@3.0.3)
"@csstools/css-parser-algorithms": 3.0.4(@csstools/css-tokenizer@3.0.3)
"@csstools/css-tokenizer": 3.0.3
"@csstools/postcss-progressive-custom-properties": 4.0.0(postcss@8.4.49)
"@csstools/utilities": 2.0.0(postcss@8.4.49)
postcss: 8.4.49
"@csstools/postcss-scope-pseudo-class@4.0.1(postcss@8.4.49)":
dependencies:
postcss: 8.4.49
postcss-selector-parser: 7.0.0 postcss-selector-parser: 7.0.0
"@csstools/postcss-stepped-value-functions@4.0.4(postcss@8.4.47)": "@csstools/postcss-sign-functions@1.1.0(postcss@8.4.49)":
dependencies: dependencies:
"@csstools/css-calc": 2.0.4(@csstools/css-parser-algorithms@3.0.4(@csstools/css-tokenizer@3.0.3))(@csstools/css-tokenizer@3.0.3) "@csstools/css-calc": 2.1.0(@csstools/css-parser-algorithms@3.0.4(@csstools/css-tokenizer@3.0.3))(@csstools/css-tokenizer@3.0.3)
"@csstools/css-parser-algorithms": 3.0.4(@csstools/css-tokenizer@3.0.3) "@csstools/css-parser-algorithms": 3.0.4(@csstools/css-tokenizer@3.0.3)
"@csstools/css-tokenizer": 3.0.3 "@csstools/css-tokenizer": 3.0.3
postcss: 8.4.47 postcss: 8.4.49
"@csstools/postcss-text-decoration-shorthand@4.0.1(postcss@8.4.47)": "@csstools/postcss-stepped-value-functions@4.0.5(postcss@8.4.49)":
dependencies:
"@csstools/css-calc": 2.1.0(@csstools/css-parser-algorithms@3.0.4(@csstools/css-tokenizer@3.0.3))(@csstools/css-tokenizer@3.0.3)
"@csstools/css-parser-algorithms": 3.0.4(@csstools/css-tokenizer@3.0.3)
"@csstools/css-tokenizer": 3.0.3
postcss: 8.4.49
"@csstools/postcss-text-decoration-shorthand@4.0.1(postcss@8.4.49)":
dependencies: dependencies:
"@csstools/color-helpers": 5.0.1 "@csstools/color-helpers": 5.0.1
postcss: 8.4.47 postcss: 8.4.49
postcss-value-parser: 4.2.0 postcss-value-parser: 4.2.0
"@csstools/postcss-trigonometric-functions@4.0.4(postcss@8.4.47)": "@csstools/postcss-trigonometric-functions@4.0.5(postcss@8.4.49)":
dependencies: dependencies:
"@csstools/css-calc": 2.0.4(@csstools/css-parser-algorithms@3.0.4(@csstools/css-tokenizer@3.0.3))(@csstools/css-tokenizer@3.0.3) "@csstools/css-calc": 2.1.0(@csstools/css-parser-algorithms@3.0.4(@csstools/css-tokenizer@3.0.3))(@csstools/css-tokenizer@3.0.3)
"@csstools/css-parser-algorithms": 3.0.4(@csstools/css-tokenizer@3.0.3) "@csstools/css-parser-algorithms": 3.0.4(@csstools/css-tokenizer@3.0.3)
"@csstools/css-tokenizer": 3.0.3 "@csstools/css-tokenizer": 3.0.3
postcss: 8.4.47 postcss: 8.4.49
"@csstools/postcss-unset-value@4.0.0(postcss@8.4.47)": "@csstools/postcss-unset-value@4.0.0(postcss@8.4.49)":
dependencies: dependencies:
postcss: 8.4.47 postcss: 8.4.49
"@csstools/selector-resolve-nested@3.0.0(postcss-selector-parser@7.0.0)": "@csstools/selector-resolve-nested@3.0.0(postcss-selector-parser@7.0.0)":
dependencies: dependencies:
postcss-selector-parser: 7.0.0 postcss-selector-parser: 7.0.0
"@csstools/selector-specificity@4.0.0(postcss-selector-parser@6.1.2)":
dependencies:
postcss-selector-parser: 6.1.2
"@csstools/selector-specificity@5.0.0(postcss-selector-parser@7.0.0)": "@csstools/selector-specificity@5.0.0(postcss-selector-parser@7.0.0)":
dependencies: dependencies:
postcss-selector-parser: 7.0.0 postcss-selector-parser: 7.0.0
"@csstools/utilities@2.0.0(postcss@8.4.47)": "@csstools/utilities@2.0.0(postcss@8.4.49)":
dependencies: dependencies:
postcss: 8.4.47 postcss: 8.4.49
"@dual-bundle/import-meta-resolve@4.1.0": {} "@dual-bundle/import-meta-resolve@4.1.0": {}
"@esbuild/aix-ppc64@0.21.5": "@esbuild/aix-ppc64@0.24.0":
optional: true optional: true
"@esbuild/android-arm64@0.21.5": "@esbuild/android-arm64@0.24.0":
optional: true optional: true
"@esbuild/android-arm@0.21.5": "@esbuild/android-arm@0.24.0":
optional: true optional: true
"@esbuild/android-x64@0.21.5": "@esbuild/android-x64@0.24.0":
optional: true optional: true
"@esbuild/darwin-arm64@0.21.5": "@esbuild/darwin-arm64@0.24.0":
optional: true optional: true
"@esbuild/darwin-x64@0.21.5": "@esbuild/darwin-x64@0.24.0":
optional: true optional: true
"@esbuild/freebsd-arm64@0.21.5": "@esbuild/freebsd-arm64@0.24.0":
optional: true optional: true
"@esbuild/freebsd-x64@0.21.5": "@esbuild/freebsd-x64@0.24.0":
optional: true optional: true
"@esbuild/linux-arm64@0.21.5": "@esbuild/linux-arm64@0.24.0":
optional: true optional: true
"@esbuild/linux-arm@0.21.5": "@esbuild/linux-arm@0.24.0":
optional: true optional: true
"@esbuild/linux-ia32@0.21.5": "@esbuild/linux-ia32@0.24.0":
optional: true optional: true
"@esbuild/linux-loong64@0.21.5": "@esbuild/linux-loong64@0.24.0":
optional: true optional: true
"@esbuild/linux-mips64el@0.21.5": "@esbuild/linux-mips64el@0.24.0":
optional: true optional: true
"@esbuild/linux-ppc64@0.21.5": "@esbuild/linux-ppc64@0.24.0":
optional: true optional: true
"@esbuild/linux-riscv64@0.21.5": "@esbuild/linux-riscv64@0.24.0":
optional: true optional: true
"@esbuild/linux-s390x@0.21.5": "@esbuild/linux-s390x@0.24.0":
optional: true optional: true
"@esbuild/linux-x64@0.21.5": "@esbuild/linux-x64@0.24.0":
optional: true optional: true
"@esbuild/netbsd-x64@0.21.5": "@esbuild/netbsd-x64@0.24.0":
optional: true optional: true
"@esbuild/openbsd-x64@0.21.5": "@esbuild/openbsd-arm64@0.24.0":
optional: true optional: true
"@esbuild/sunos-x64@0.21.5": "@esbuild/openbsd-x64@0.24.0":
optional: true optional: true
"@esbuild/win32-arm64@0.21.5": "@esbuild/sunos-x64@0.24.0":
optional: true optional: true
"@esbuild/win32-ia32@0.21.5": "@esbuild/win32-arm64@0.24.0":
optional: true optional: true
"@esbuild/win32-x64@0.21.5": "@esbuild/win32-ia32@0.24.0":
optional: true optional: true
"@eslint-community/eslint-utils@4.4.1(eslint@9.14.0(jiti@1.21.6))": "@esbuild/win32-x64@0.24.0":
optional: true
"@eslint-community/eslint-utils@4.4.1(eslint@9.17.0(jiti@2.4.1))":
dependencies: dependencies:
eslint: 9.14.0(jiti@1.21.6) eslint: 9.17.0(jiti@2.4.1)
eslint-visitor-keys: 3.4.3 eslint-visitor-keys: 3.4.3
"@eslint-community/regexpp@4.12.1": {} "@eslint-community/regexpp@4.12.1": {}
"@eslint/config-array@0.18.0": "@eslint/config-array@0.19.1":
dependencies: dependencies:
"@eslint/object-schema": 2.1.4 "@eslint/object-schema": 2.1.5
debug: 4.3.7 debug: 4.3.7
minimatch: 3.1.2 minimatch: 3.1.2
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
"@eslint/core@0.7.0": {} "@eslint/core@0.9.1":
dependencies:
"@types/json-schema": 7.0.15
"@eslint/eslintrc@3.1.0": "@eslint/eslintrc@3.2.0":
dependencies: dependencies:
ajv: 6.12.6 ajv: 6.12.6
debug: 4.3.7 debug: 4.3.7
@ -10222,11 +10360,11 @@ snapshots:
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
"@eslint/js@9.14.0": {} "@eslint/js@9.17.0": {}
"@eslint/object-schema@2.1.4": {} "@eslint/object-schema@2.1.5": {}
"@eslint/plugin-kit@0.2.2": "@eslint/plugin-kit@0.2.4":
dependencies: dependencies:
levn: 0.4.1 levn: 0.4.1
@ -10273,7 +10411,7 @@ snapshots:
"@github/markdown-toolbar-element@2.2.3": {} "@github/markdown-toolbar-element@2.2.3": {}
"@github/relative-time-element@4.4.3": {} "@github/relative-time-element@4.4.4": {}
"@humanfs/core@0.19.1": {} "@humanfs/core@0.19.1": {}
@ -10321,10 +10459,28 @@ snapshots:
"@lezer/common@1.2.3": {} "@lezer/common@1.2.3": {}
"@lezer/css@1.1.9":
dependencies:
"@lezer/common": 1.2.3
"@lezer/highlight": 1.2.1
"@lezer/lr": 1.4.2
"@lezer/highlight@1.2.1": "@lezer/highlight@1.2.1":
dependencies: dependencies:
"@lezer/common": 1.2.3 "@lezer/common": 1.2.3
"@lezer/html@1.3.10":
dependencies:
"@lezer/common": 1.2.3
"@lezer/highlight": 1.2.1
"@lezer/lr": 1.4.2
"@lezer/javascript@1.4.21":
dependencies:
"@lezer/common": 1.2.3
"@lezer/highlight": 1.2.1
"@lezer/lr": 1.4.2
"@lezer/lr@1.4.2": "@lezer/lr@1.4.2":
dependencies: dependencies:
"@lezer/common": 1.2.3 "@lezer/common": 1.2.3
@ -10345,6 +10501,8 @@ snapshots:
dependencies: dependencies:
"@lit-labs/ssr-dom-shim": 1.2.1 "@lit-labs/ssr-dom-shim": 1.2.1
"@marijn/find-cluster-break@1.0.2": {}
"@nodelib/fs.scandir@2.1.5": "@nodelib/fs.scandir@2.1.5":
dependencies: dependencies:
"@nodelib/fs.stat": 2.0.5 "@nodelib/fs.stat": 2.0.5
@ -10552,15 +10710,15 @@ snapshots:
"@sec-ant/readable-stream@0.4.1": {} "@sec-ant/readable-stream@0.4.1": {}
"@semantic-release/changelog@6.0.3(semantic-release@24.2.0(typescript@5.5.4))": "@semantic-release/changelog@6.0.3(semantic-release@24.2.0(typescript@5.7.2))":
dependencies: dependencies:
"@semantic-release/error": 3.0.0 "@semantic-release/error": 3.0.0
aggregate-error: 3.1.0 aggregate-error: 3.1.0
fs-extra: 11.2.0 fs-extra: 11.2.0
lodash: 4.17.21 lodash: 4.17.21
semantic-release: 24.2.0(typescript@5.5.4) semantic-release: 24.2.0(typescript@5.7.2)
"@semantic-release/commit-analyzer@13.0.0(semantic-release@24.2.0(typescript@5.5.4))": "@semantic-release/commit-analyzer@13.0.0(semantic-release@24.2.0(typescript@5.7.2))":
dependencies: dependencies:
conventional-changelog-angular: 8.0.0 conventional-changelog-angular: 8.0.0
conventional-changelog-writer: 8.0.0 conventional-changelog-writer: 8.0.0
@ -10570,7 +10728,7 @@ snapshots:
import-from-esm: 1.3.4 import-from-esm: 1.3.4
lodash-es: 4.17.21 lodash-es: 4.17.21
micromatch: 4.0.8 micromatch: 4.0.8
semantic-release: 24.2.0(typescript@5.5.4) semantic-release: 24.2.0(typescript@5.7.2)
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
@ -10578,7 +10736,7 @@ snapshots:
"@semantic-release/error@4.0.0": {} "@semantic-release/error@4.0.0": {}
"@semantic-release/exec@6.0.3(semantic-release@24.2.0(typescript@5.5.4))": "@semantic-release/exec@6.0.3(semantic-release@24.2.0(typescript@5.7.2))":
dependencies: dependencies:
"@semantic-release/error": 3.0.0 "@semantic-release/error": 3.0.0
aggregate-error: 3.1.0 aggregate-error: 3.1.0
@ -10586,11 +10744,11 @@ snapshots:
execa: 5.1.1 execa: 5.1.1
lodash: 4.17.21 lodash: 4.17.21
parse-json: 5.2.0 parse-json: 5.2.0
semantic-release: 24.2.0(typescript@5.5.4) semantic-release: 24.2.0(typescript@5.7.2)
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
"@semantic-release/git@10.0.1(semantic-release@24.2.0(typescript@5.5.4))": "@semantic-release/git@10.0.1(semantic-release@24.2.0(typescript@5.7.2))":
dependencies: dependencies:
"@semantic-release/error": 3.0.0 "@semantic-release/error": 3.0.0
aggregate-error: 3.1.0 aggregate-error: 3.1.0
@ -10600,11 +10758,11 @@ snapshots:
lodash: 4.17.21 lodash: 4.17.21
micromatch: 4.0.8 micromatch: 4.0.8
p-reduce: 2.1.0 p-reduce: 2.1.0
semantic-release: 24.2.0(typescript@5.5.4) semantic-release: 24.2.0(typescript@5.7.2)
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
"@semantic-release/github@11.0.0(semantic-release@24.2.0(typescript@5.5.4))": "@semantic-release/github@11.0.0(semantic-release@24.2.0(typescript@5.7.2))":
dependencies: dependencies:
"@octokit/core": 6.1.2 "@octokit/core": 6.1.2
"@octokit/plugin-paginate-rest": 11.3.5(@octokit/core@6.1.2) "@octokit/plugin-paginate-rest": 11.3.5(@octokit/core@6.1.2)
@ -10621,12 +10779,12 @@ snapshots:
lodash-es: 4.17.21 lodash-es: 4.17.21
mime: 4.0.4 mime: 4.0.4
p-filter: 4.1.0 p-filter: 4.1.0
semantic-release: 24.2.0(typescript@5.5.4) semantic-release: 24.2.0(typescript@5.7.2)
url-join: 5.0.0 url-join: 5.0.0
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
"@semantic-release/gitlab@13.2.1(semantic-release@24.2.0(typescript@5.5.4))": "@semantic-release/gitlab@13.2.3(semantic-release@24.2.0(typescript@5.7.2))":
dependencies: dependencies:
"@semantic-release/error": 4.0.0 "@semantic-release/error": 4.0.0
aggregate-error: 5.0.0 aggregate-error: 5.0.0
@ -10640,12 +10798,12 @@ snapshots:
hpagent: 1.2.0 hpagent: 1.2.0
lodash-es: 4.17.21 lodash-es: 4.17.21
parse-url: 9.2.0 parse-url: 9.2.0
semantic-release: 24.2.0(typescript@5.5.4) semantic-release: 24.2.0(typescript@5.7.2)
url-join: 4.0.1 url-join: 4.0.1
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
"@semantic-release/npm@12.0.1(semantic-release@24.2.0(typescript@5.5.4))": "@semantic-release/npm@12.0.1(semantic-release@24.2.0(typescript@5.7.2))":
dependencies: dependencies:
"@semantic-release/error": 4.0.0 "@semantic-release/error": 4.0.0
aggregate-error: 5.0.0 aggregate-error: 5.0.0
@ -10658,11 +10816,11 @@ snapshots:
rc: 1.2.8 rc: 1.2.8
read-pkg: 9.0.1 read-pkg: 9.0.1
registry-auth-token: 5.0.2 registry-auth-token: 5.0.2
semantic-release: 24.2.0(typescript@5.5.4) semantic-release: 24.2.0(typescript@5.7.2)
semver: 7.6.3 semver: 7.6.3
tempy: 3.1.0 tempy: 3.1.0
"@semantic-release/release-notes-generator@14.0.1(semantic-release@24.2.0(typescript@5.5.4))": "@semantic-release/release-notes-generator@14.0.1(semantic-release@24.2.0(typescript@5.7.2))":
dependencies: dependencies:
conventional-changelog-angular: 8.0.0 conventional-changelog-angular: 8.0.0
conventional-changelog-writer: 8.0.0 conventional-changelog-writer: 8.0.0
@ -10674,7 +10832,7 @@ snapshots:
into-stream: 7.0.0 into-stream: 7.0.0
lodash-es: 4.17.21 lodash-es: 4.17.21
read-package-up: 11.0.0 read-package-up: 11.0.0
semantic-release: 24.2.0(typescript@5.5.4) semantic-release: 24.2.0(typescript@5.7.2)
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
@ -10699,23 +10857,18 @@ snapshots:
dependencies: dependencies:
defer-to-connect: 2.0.1 defer-to-connect: 2.0.1
"@tailwindcss/forms@0.5.9(tailwindcss@3.4.14)": "@tailwindcss/forms@0.5.9(tailwindcss@3.4.16)":
dependencies: dependencies:
mini-svg-data-uri: 1.4.4 mini-svg-data-uri: 1.4.4
tailwindcss: 3.4.14 tailwindcss: 3.4.16
"@tailwindcss/nesting@0.0.0-insiders.565cd3e(postcss@8.4.47)": "@tailwindcss/typography@0.5.15(tailwindcss@3.4.16)":
dependencies:
postcss: 8.4.47
postcss-nested: 5.0.6(postcss@8.4.47)
"@tailwindcss/typography@0.5.15(tailwindcss@3.4.14)":
dependencies: dependencies:
lodash.castarray: 4.4.0 lodash.castarray: 4.4.0
lodash.isplainobject: 4.0.6 lodash.isplainobject: 4.0.6
lodash.merge: 4.6.2 lodash.merge: 4.6.2
postcss-selector-parser: 6.0.10 postcss-selector-parser: 6.0.10
tailwindcss: 3.4.14 tailwindcss: 3.4.16
"@trysound/sax@0.2.0": {} "@trysound/sax@0.2.0": {}
@ -10744,7 +10897,7 @@ snapshots:
"@types/json-schema@7.0.15": {} "@types/json-schema@7.0.15": {}
"@types/leaflet@1.9.14": "@types/leaflet@1.9.15":
dependencies: dependencies:
"@types/geojson": 7946.0.14 "@types/geojson": 7946.0.14
@ -10762,86 +10915,82 @@ snapshots:
"@types/trusted-types@2.0.7": {} "@types/trusted-types@2.0.7": {}
"@typescript-eslint/eslint-plugin@8.13.0(@typescript-eslint/parser@8.13.0(eslint@9.14.0(jiti@1.21.6))(typescript@5.5.4))(eslint@9.14.0(jiti@1.21.6))(typescript@5.5.4)": "@typescript-eslint/eslint-plugin@8.18.1(@typescript-eslint/parser@8.18.1(eslint@9.17.0(jiti@2.4.1))(typescript@5.7.2))(eslint@9.17.0(jiti@2.4.1))(typescript@5.7.2)":
dependencies: dependencies:
"@eslint-community/regexpp": 4.12.1 "@eslint-community/regexpp": 4.12.1
"@typescript-eslint/parser": 8.13.0(eslint@9.14.0(jiti@1.21.6))(typescript@5.5.4) "@typescript-eslint/parser": 8.18.1(eslint@9.17.0(jiti@2.4.1))(typescript@5.7.2)
"@typescript-eslint/scope-manager": 8.13.0 "@typescript-eslint/scope-manager": 8.18.1
"@typescript-eslint/type-utils": 8.13.0(eslint@9.14.0(jiti@1.21.6))(typescript@5.5.4) "@typescript-eslint/type-utils": 8.18.1(eslint@9.17.0(jiti@2.4.1))(typescript@5.7.2)
"@typescript-eslint/utils": 8.13.0(eslint@9.14.0(jiti@1.21.6))(typescript@5.5.4) "@typescript-eslint/utils": 8.18.1(eslint@9.17.0(jiti@2.4.1))(typescript@5.7.2)
"@typescript-eslint/visitor-keys": 8.13.0 "@typescript-eslint/visitor-keys": 8.18.1
eslint: 9.14.0(jiti@1.21.6) eslint: 9.17.0(jiti@2.4.1)
graphemer: 1.4.0 graphemer: 1.4.0
ignore: 5.3.2 ignore: 5.3.2
natural-compare: 1.4.0 natural-compare: 1.4.0
ts-api-utils: 1.4.0(typescript@5.5.4) ts-api-utils: 1.4.0(typescript@5.7.2)
optionalDependencies: typescript: 5.7.2
typescript: 5.5.4
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
"@typescript-eslint/parser@8.13.0(eslint@9.14.0(jiti@1.21.6))(typescript@5.5.4)": "@typescript-eslint/parser@8.18.1(eslint@9.17.0(jiti@2.4.1))(typescript@5.7.2)":
dependencies: dependencies:
"@typescript-eslint/scope-manager": 8.13.0 "@typescript-eslint/scope-manager": 8.18.1
"@typescript-eslint/types": 8.13.0 "@typescript-eslint/types": 8.18.1
"@typescript-eslint/typescript-estree": 8.13.0(typescript@5.5.4) "@typescript-eslint/typescript-estree": 8.18.1(typescript@5.7.2)
"@typescript-eslint/visitor-keys": 8.13.0 "@typescript-eslint/visitor-keys": 8.18.1
debug: 4.3.7 debug: 4.4.0
eslint: 9.14.0(jiti@1.21.6) eslint: 9.17.0(jiti@2.4.1)
optionalDependencies: typescript: 5.7.2
typescript: 5.5.4
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
"@typescript-eslint/scope-manager@8.13.0": "@typescript-eslint/scope-manager@8.18.1":
dependencies: dependencies:
"@typescript-eslint/types": 8.13.0 "@typescript-eslint/types": 8.18.1
"@typescript-eslint/visitor-keys": 8.13.0 "@typescript-eslint/visitor-keys": 8.18.1
"@typescript-eslint/type-utils@8.13.0(eslint@9.14.0(jiti@1.21.6))(typescript@5.5.4)": "@typescript-eslint/type-utils@8.18.1(eslint@9.17.0(jiti@2.4.1))(typescript@5.7.2)":
dependencies: dependencies:
"@typescript-eslint/typescript-estree": 8.13.0(typescript@5.5.4) "@typescript-eslint/typescript-estree": 8.18.1(typescript@5.7.2)
"@typescript-eslint/utils": 8.13.0(eslint@9.14.0(jiti@1.21.6))(typescript@5.5.4) "@typescript-eslint/utils": 8.18.1(eslint@9.17.0(jiti@2.4.1))(typescript@5.7.2)
debug: 4.3.7 debug: 4.4.0
ts-api-utils: 1.4.0(typescript@5.5.4) eslint: 9.17.0(jiti@2.4.1)
optionalDependencies: ts-api-utils: 1.4.0(typescript@5.7.2)
typescript: 5.5.4 typescript: 5.7.2
transitivePeerDependencies: transitivePeerDependencies:
- eslint
- supports-color - supports-color
"@typescript-eslint/types@8.13.0": {} "@typescript-eslint/types@8.18.1": {}
"@typescript-eslint/typescript-estree@8.13.0(typescript@5.5.4)": "@typescript-eslint/typescript-estree@8.18.1(typescript@5.7.2)":
dependencies: dependencies:
"@typescript-eslint/types": 8.13.0 "@typescript-eslint/types": 8.18.1
"@typescript-eslint/visitor-keys": 8.13.0 "@typescript-eslint/visitor-keys": 8.18.1
debug: 4.3.7 debug: 4.4.0
fast-glob: 3.3.2 fast-glob: 3.3.2
is-glob: 4.0.3 is-glob: 4.0.3
minimatch: 9.0.5 minimatch: 9.0.5
semver: 7.6.3 semver: 7.6.3
ts-api-utils: 1.4.0(typescript@5.5.4) ts-api-utils: 1.4.0(typescript@5.7.2)
optionalDependencies: typescript: 5.7.2
typescript: 5.5.4
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
"@typescript-eslint/utils@8.13.0(eslint@9.14.0(jiti@1.21.6))(typescript@5.5.4)": "@typescript-eslint/utils@8.18.1(eslint@9.17.0(jiti@2.4.1))(typescript@5.7.2)":
dependencies: dependencies:
"@eslint-community/eslint-utils": 4.4.1(eslint@9.14.0(jiti@1.21.6)) "@eslint-community/eslint-utils": 4.4.1(eslint@9.17.0(jiti@2.4.1))
"@typescript-eslint/scope-manager": 8.13.0 "@typescript-eslint/scope-manager": 8.18.1
"@typescript-eslint/types": 8.13.0 "@typescript-eslint/types": 8.18.1
"@typescript-eslint/typescript-estree": 8.13.0(typescript@5.5.4) "@typescript-eslint/typescript-estree": 8.18.1(typescript@5.7.2)
eslint: 9.14.0(jiti@1.21.6) eslint: 9.17.0(jiti@2.4.1)
typescript: 5.7.2
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
- typescript
"@typescript-eslint/visitor-keys@8.13.0": "@typescript-eslint/visitor-keys@8.18.1":
dependencies: dependencies:
"@typescript-eslint/types": 8.13.0 "@typescript-eslint/types": 8.18.1
eslint-visitor-keys: 3.4.3 eslint-visitor-keys: 4.2.0
"@vime/core@5.4.1": "@vime/core@5.4.1":
dependencies: dependencies:
@ -10970,14 +11119,14 @@ snapshots:
at-least-node@1.0.0: {} at-least-node@1.0.0: {}
autoprefixer@10.4.20(postcss@8.4.47): autoprefixer@10.4.20(postcss@8.4.49):
dependencies: dependencies:
browserslist: 4.24.2 browserslist: 4.24.2
caniuse-lite: 1.0.30001677 caniuse-lite: 1.0.30001677
fraction.js: 4.3.7 fraction.js: 4.3.7
normalize-range: 0.1.2 normalize-range: 0.1.2
picocolors: 1.1.1 picocolors: 1.1.1
postcss: 8.4.47 postcss: 8.4.49
postcss-value-parser: 4.2.0 postcss-value-parser: 4.2.0
available-typed-arrays@1.0.7: available-typed-arrays@1.0.7:
@ -11131,7 +11280,7 @@ snapshots:
optionalDependencies: optionalDependencies:
fsevents: 2.3.3 fsevents: 2.3.3
ci-info@3.9.0: {} ci-info@4.1.0: {}
clean-stack@2.2.0: {} clean-stack@2.2.0: {}
@ -11193,13 +11342,13 @@ snapshots:
codemirror@6.0.1(@lezer/common@1.2.3): codemirror@6.0.1(@lezer/common@1.2.3):
dependencies: dependencies:
"@codemirror/autocomplete": 6.18.2(@codemirror/language@6.10.3)(@codemirror/state@6.4.1)(@codemirror/view@6.34.2)(@lezer/common@1.2.3) "@codemirror/autocomplete": 6.18.2(@codemirror/language@6.10.7)(@codemirror/state@6.5.0)(@codemirror/view@6.35.3)(@lezer/common@1.2.3)
"@codemirror/commands": 6.7.1 "@codemirror/commands": 6.7.1
"@codemirror/language": 6.10.3 "@codemirror/language": 6.10.7
"@codemirror/lint": 6.8.2 "@codemirror/lint": 6.8.2
"@codemirror/search": 6.5.7 "@codemirror/search": 6.5.7
"@codemirror/state": 6.4.1 "@codemirror/state": 6.5.0
"@codemirror/view": 6.34.2 "@codemirror/view": 6.35.3
transitivePeerDependencies: transitivePeerDependencies:
- "@lezer/common" - "@lezer/common"
@ -11227,10 +11376,10 @@ snapshots:
commander@7.2.0: {} commander@7.2.0: {}
commitizen@4.3.1(@types/node@22.9.0)(typescript@5.5.4): commitizen@4.3.1(@types/node@22.9.0)(typescript@5.7.2):
dependencies: dependencies:
cachedir: 2.3.0 cachedir: 2.3.0
cz-conventional-changelog: 3.3.0(@types/node@22.9.0)(typescript@5.5.4) cz-conventional-changelog: 3.3.0(@types/node@22.9.0)(typescript@5.7.2)
dedent: 0.7.0 dedent: 0.7.0
detect-indent: 6.1.0 detect-indent: 6.1.0
find-node-modules: 2.1.3 find-node-modules: 2.1.3
@ -11308,21 +11457,29 @@ snapshots:
core-util-is@1.0.3: {} core-util-is@1.0.3: {}
cosmiconfig-typescript-loader@5.1.0(@types/node@22.9.0)(cosmiconfig@9.0.0(typescript@5.5.4))(typescript@5.5.4): cosmiconfig-typescript-loader@5.1.0(@types/node@22.9.0)(cosmiconfig@9.0.0(typescript@5.7.2))(typescript@5.7.2):
dependencies: dependencies:
"@types/node": 22.9.0 "@types/node": 22.9.0
cosmiconfig: 9.0.0(typescript@5.5.4) cosmiconfig: 9.0.0(typescript@5.7.2)
jiti: 1.21.6 jiti: 1.21.6
typescript: 5.5.4 typescript: 5.7.2
optional: true
cosmiconfig@9.0.0(typescript@5.5.4): cosmiconfig-typescript-loader@6.1.0(@types/node@22.9.0)(cosmiconfig@9.0.0(typescript@5.7.2))(typescript@5.7.2):
dependencies:
"@types/node": 22.9.0
cosmiconfig: 9.0.0(typescript@5.7.2)
jiti: 2.4.1
typescript: 5.7.2
cosmiconfig@9.0.0(typescript@5.7.2):
dependencies: dependencies:
env-paths: 2.2.1 env-paths: 2.2.1
import-fresh: 3.3.0 import-fresh: 3.3.0
js-yaml: 4.1.0 js-yaml: 4.1.0
parse-json: 5.2.0 parse-json: 5.2.0
optionalDependencies: optionalDependencies:
typescript: 5.5.4 typescript: 5.7.2
crelt@1.0.6: {} crelt@1.0.6: {}
@ -11336,6 +11493,12 @@ snapshots:
shebang-command: 2.0.0 shebang-command: 2.0.0
which: 2.0.2 which: 2.0.2
cross-spawn@7.0.6:
dependencies:
path-key: 3.1.1
shebang-command: 2.0.0
which: 2.0.2
crypto-js@4.2.0: {} crypto-js@4.2.0: {}
crypto-random-string@2.0.0: {} crypto-random-string@2.0.0: {}
@ -11344,27 +11507,27 @@ snapshots:
dependencies: dependencies:
type-fest: 1.4.0 type-fest: 1.4.0
css-blank-pseudo@7.0.1(postcss@8.4.47): css-blank-pseudo@7.0.1(postcss@8.4.49):
dependencies: dependencies:
postcss: 8.4.47 postcss: 8.4.49
postcss-selector-parser: 7.0.0 postcss-selector-parser: 7.0.0
css-declaration-sorter@7.2.0(postcss@8.4.47): css-declaration-sorter@7.2.0(postcss@8.4.49):
dependencies: dependencies:
postcss: 8.4.47 postcss: 8.4.49
css-functions-list@3.2.3: {} css-functions-list@3.2.3: {}
css-has-pseudo@7.0.1(postcss@8.4.47): css-has-pseudo@7.0.2(postcss@8.4.49):
dependencies: dependencies:
"@csstools/selector-specificity": 5.0.0(postcss-selector-parser@7.0.0) "@csstools/selector-specificity": 5.0.0(postcss-selector-parser@7.0.0)
postcss: 8.4.47 postcss: 8.4.49
postcss-selector-parser: 7.0.0 postcss-selector-parser: 7.0.0
postcss-value-parser: 4.2.0 postcss-value-parser: 4.2.0
css-prefers-color-scheme@10.0.0(postcss@8.4.47): css-prefers-color-scheme@10.0.0(postcss@8.4.49):
dependencies: dependencies:
postcss: 8.4.47 postcss: 8.4.49
css-select@5.1.0: css-select@5.1.0:
dependencies: dependencies:
@ -11391,68 +11554,68 @@ snapshots:
css-what@6.1.0: {} css-what@6.1.0: {}
cssdb@8.1.2: {} cssdb@8.2.3: {}
cssesc@3.0.0: {} cssesc@3.0.0: {}
cssnano-preset-default@7.0.6(postcss@8.4.47): cssnano-preset-default@7.0.6(postcss@8.4.49):
dependencies: dependencies:
browserslist: 4.24.2 browserslist: 4.24.2
css-declaration-sorter: 7.2.0(postcss@8.4.47) css-declaration-sorter: 7.2.0(postcss@8.4.49)
cssnano-utils: 5.0.0(postcss@8.4.47) cssnano-utils: 5.0.0(postcss@8.4.49)
postcss: 8.4.47 postcss: 8.4.49
postcss-calc: 10.0.2(postcss@8.4.47) postcss-calc: 10.0.2(postcss@8.4.49)
postcss-colormin: 7.0.2(postcss@8.4.47) postcss-colormin: 7.0.2(postcss@8.4.49)
postcss-convert-values: 7.0.4(postcss@8.4.47) postcss-convert-values: 7.0.4(postcss@8.4.49)
postcss-discard-comments: 7.0.3(postcss@8.4.47) postcss-discard-comments: 7.0.3(postcss@8.4.49)
postcss-discard-duplicates: 7.0.1(postcss@8.4.47) postcss-discard-duplicates: 7.0.1(postcss@8.4.49)
postcss-discard-empty: 7.0.0(postcss@8.4.47) postcss-discard-empty: 7.0.0(postcss@8.4.49)
postcss-discard-overridden: 7.0.0(postcss@8.4.47) postcss-discard-overridden: 7.0.0(postcss@8.4.49)
postcss-merge-longhand: 7.0.4(postcss@8.4.47) postcss-merge-longhand: 7.0.4(postcss@8.4.49)
postcss-merge-rules: 7.0.4(postcss@8.4.47) postcss-merge-rules: 7.0.4(postcss@8.4.49)
postcss-minify-font-values: 7.0.0(postcss@8.4.47) postcss-minify-font-values: 7.0.0(postcss@8.4.49)
postcss-minify-gradients: 7.0.0(postcss@8.4.47) postcss-minify-gradients: 7.0.0(postcss@8.4.49)
postcss-minify-params: 7.0.2(postcss@8.4.47) postcss-minify-params: 7.0.2(postcss@8.4.49)
postcss-minify-selectors: 7.0.4(postcss@8.4.47) postcss-minify-selectors: 7.0.4(postcss@8.4.49)
postcss-normalize-charset: 7.0.0(postcss@8.4.47) postcss-normalize-charset: 7.0.0(postcss@8.4.49)
postcss-normalize-display-values: 7.0.0(postcss@8.4.47) postcss-normalize-display-values: 7.0.0(postcss@8.4.49)
postcss-normalize-positions: 7.0.0(postcss@8.4.47) postcss-normalize-positions: 7.0.0(postcss@8.4.49)
postcss-normalize-repeat-style: 7.0.0(postcss@8.4.47) postcss-normalize-repeat-style: 7.0.0(postcss@8.4.49)
postcss-normalize-string: 7.0.0(postcss@8.4.47) postcss-normalize-string: 7.0.0(postcss@8.4.49)
postcss-normalize-timing-functions: 7.0.0(postcss@8.4.47) postcss-normalize-timing-functions: 7.0.0(postcss@8.4.49)
postcss-normalize-unicode: 7.0.2(postcss@8.4.47) postcss-normalize-unicode: 7.0.2(postcss@8.4.49)
postcss-normalize-url: 7.0.0(postcss@8.4.47) postcss-normalize-url: 7.0.0(postcss@8.4.49)
postcss-normalize-whitespace: 7.0.0(postcss@8.4.47) postcss-normalize-whitespace: 7.0.0(postcss@8.4.49)
postcss-ordered-values: 7.0.1(postcss@8.4.47) postcss-ordered-values: 7.0.1(postcss@8.4.49)
postcss-reduce-initial: 7.0.2(postcss@8.4.47) postcss-reduce-initial: 7.0.2(postcss@8.4.49)
postcss-reduce-transforms: 7.0.0(postcss@8.4.47) postcss-reduce-transforms: 7.0.0(postcss@8.4.49)
postcss-svgo: 7.0.1(postcss@8.4.47) postcss-svgo: 7.0.1(postcss@8.4.49)
postcss-unique-selectors: 7.0.3(postcss@8.4.47) postcss-unique-selectors: 7.0.3(postcss@8.4.49)
cssnano-utils@5.0.0(postcss@8.4.47): cssnano-utils@5.0.0(postcss@8.4.49):
dependencies: dependencies:
postcss: 8.4.47 postcss: 8.4.49
cssnano@7.0.6(postcss@8.4.47): cssnano@7.0.6(postcss@8.4.49):
dependencies: dependencies:
cssnano-preset-default: 7.0.6(postcss@8.4.47) cssnano-preset-default: 7.0.6(postcss@8.4.49)
lilconfig: 3.1.2 lilconfig: 3.1.2
postcss: 8.4.47 postcss: 8.4.49
csso@5.0.5: csso@5.0.5:
dependencies: dependencies:
css-tree: 2.2.1 css-tree: 2.2.1
cz-conventional-changelog@3.3.0(@types/node@22.9.0)(typescript@5.5.4): cz-conventional-changelog@3.3.0(@types/node@22.9.0)(typescript@5.7.2):
dependencies: dependencies:
chalk: 2.4.2 chalk: 2.4.2
commitizen: 4.3.1(@types/node@22.9.0)(typescript@5.5.4) commitizen: 4.3.1(@types/node@22.9.0)(typescript@5.7.2)
conventional-commit-types: 3.0.0 conventional-commit-types: 3.0.0
lodash.map: 4.6.0 lodash.map: 4.6.0
longest: 2.0.1 longest: 2.0.1
word-wrap: 1.2.5 word-wrap: 1.2.5
optionalDependencies: optionalDependencies:
"@commitlint/load": 19.5.0(@types/node@22.9.0)(typescript@5.5.4) "@commitlint/load": 19.5.0(@types/node@22.9.0)(typescript@5.7.2)
transitivePeerDependencies: transitivePeerDependencies:
- "@types/node" - "@types/node"
- typescript - typescript
@ -11526,6 +11689,10 @@ snapshots:
dependencies: dependencies:
ms: 2.1.3 ms: 2.1.3
debug@4.4.0:
dependencies:
ms: 2.1.3
decamelize@1.2.0: {} decamelize@1.2.0: {}
decompress-response@6.0.0: decompress-response@6.0.0:
@ -11709,31 +11876,32 @@ snapshots:
is-date-object: 1.0.5 is-date-object: 1.0.5
is-symbol: 1.0.4 is-symbol: 1.0.4
esbuild@0.21.5: esbuild@0.24.0:
optionalDependencies: optionalDependencies:
"@esbuild/aix-ppc64": 0.21.5 "@esbuild/aix-ppc64": 0.24.0
"@esbuild/android-arm": 0.21.5 "@esbuild/android-arm": 0.24.0
"@esbuild/android-arm64": 0.21.5 "@esbuild/android-arm64": 0.24.0
"@esbuild/android-x64": 0.21.5 "@esbuild/android-x64": 0.24.0
"@esbuild/darwin-arm64": 0.21.5 "@esbuild/darwin-arm64": 0.24.0
"@esbuild/darwin-x64": 0.21.5 "@esbuild/darwin-x64": 0.24.0
"@esbuild/freebsd-arm64": 0.21.5 "@esbuild/freebsd-arm64": 0.24.0
"@esbuild/freebsd-x64": 0.21.5 "@esbuild/freebsd-x64": 0.24.0
"@esbuild/linux-arm": 0.21.5 "@esbuild/linux-arm": 0.24.0
"@esbuild/linux-arm64": 0.21.5 "@esbuild/linux-arm64": 0.24.0
"@esbuild/linux-ia32": 0.21.5 "@esbuild/linux-ia32": 0.24.0
"@esbuild/linux-loong64": 0.21.5 "@esbuild/linux-loong64": 0.24.0
"@esbuild/linux-mips64el": 0.21.5 "@esbuild/linux-mips64el": 0.24.0
"@esbuild/linux-ppc64": 0.21.5 "@esbuild/linux-ppc64": 0.24.0
"@esbuild/linux-riscv64": 0.21.5 "@esbuild/linux-riscv64": 0.24.0
"@esbuild/linux-s390x": 0.21.5 "@esbuild/linux-s390x": 0.24.0
"@esbuild/linux-x64": 0.21.5 "@esbuild/linux-x64": 0.24.0
"@esbuild/netbsd-x64": 0.21.5 "@esbuild/netbsd-x64": 0.24.0
"@esbuild/openbsd-x64": 0.21.5 "@esbuild/openbsd-arm64": 0.24.0
"@esbuild/sunos-x64": 0.21.5 "@esbuild/openbsd-x64": 0.24.0
"@esbuild/win32-arm64": 0.21.5 "@esbuild/sunos-x64": 0.24.0
"@esbuild/win32-ia32": 0.21.5 "@esbuild/win32-arm64": 0.24.0
"@esbuild/win32-x64": 0.21.5 "@esbuild/win32-ia32": 0.24.0
"@esbuild/win32-x64": 0.24.0
escalade@3.2.0: {} escalade@3.2.0: {}
@ -11743,19 +11911,19 @@ snapshots:
escape-string-regexp@5.0.0: {} escape-string-regexp@5.0.0: {}
eslint-config-prettier@9.1.0(eslint@9.14.0(jiti@1.21.6)): eslint-config-prettier@9.1.0(eslint@9.17.0(jiti@2.4.1)):
dependencies: dependencies:
eslint: 9.14.0(jiti@1.21.6) eslint: 9.17.0(jiti@2.4.1)
eslint-plugin-prettier@5.2.1(@types/eslint@9.6.1)(eslint-config-prettier@9.1.0(eslint@9.14.0(jiti@1.21.6)))(eslint@9.14.0(jiti@1.21.6))(prettier@3.3.3): eslint-plugin-prettier@5.2.1(@types/eslint@9.6.1)(eslint-config-prettier@9.1.0(eslint@9.17.0(jiti@2.4.1)))(eslint@9.17.0(jiti@2.4.1))(prettier@3.4.2):
dependencies: dependencies:
eslint: 9.14.0(jiti@1.21.6) eslint: 9.17.0(jiti@2.4.1)
prettier: 3.3.3 prettier: 3.4.2
prettier-linter-helpers: 1.0.0 prettier-linter-helpers: 1.0.0
synckit: 0.9.2 synckit: 0.9.2
optionalDependencies: optionalDependencies:
"@types/eslint": 9.6.1 "@types/eslint": 9.6.1
eslint-config-prettier: 9.1.0(eslint@9.14.0(jiti@1.21.6)) eslint-config-prettier: 9.1.0(eslint@9.17.0(jiti@2.4.1))
eslint-scope@8.2.0: eslint-scope@8.2.0:
dependencies: dependencies:
@ -11766,15 +11934,15 @@ snapshots:
eslint-visitor-keys@4.2.0: {} eslint-visitor-keys@4.2.0: {}
eslint@9.14.0(jiti@1.21.6): eslint@9.17.0(jiti@2.4.1):
dependencies: dependencies:
"@eslint-community/eslint-utils": 4.4.1(eslint@9.14.0(jiti@1.21.6)) "@eslint-community/eslint-utils": 4.4.1(eslint@9.17.0(jiti@2.4.1))
"@eslint-community/regexpp": 4.12.1 "@eslint-community/regexpp": 4.12.1
"@eslint/config-array": 0.18.0 "@eslint/config-array": 0.19.1
"@eslint/core": 0.7.0 "@eslint/core": 0.9.1
"@eslint/eslintrc": 3.1.0 "@eslint/eslintrc": 3.2.0
"@eslint/js": 9.14.0 "@eslint/js": 9.17.0
"@eslint/plugin-kit": 0.2.2 "@eslint/plugin-kit": 0.2.4
"@humanfs/node": 0.16.6 "@humanfs/node": 0.16.6
"@humanwhocodes/module-importer": 1.0.1 "@humanwhocodes/module-importer": 1.0.1
"@humanwhocodes/retry": 0.4.1 "@humanwhocodes/retry": 0.4.1
@ -11782,7 +11950,7 @@ snapshots:
"@types/json-schema": 7.0.15 "@types/json-schema": 7.0.15
ajv: 6.12.6 ajv: 6.12.6
chalk: 4.1.2 chalk: 4.1.2
cross-spawn: 7.0.3 cross-spawn: 7.0.6
debug: 4.3.7 debug: 4.3.7
escape-string-regexp: 4.0.0 escape-string-regexp: 4.0.0
eslint-scope: 8.2.0 eslint-scope: 8.2.0
@ -11802,9 +11970,8 @@ snapshots:
minimatch: 3.1.2 minimatch: 3.1.2
natural-compare: 1.4.0 natural-compare: 1.4.0
optionator: 0.9.4 optionator: 0.9.4
text-table: 0.2.0
optionalDependencies: optionalDependencies:
jiti: 1.21.6 jiti: 2.4.1
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
@ -12153,7 +12320,7 @@ snapshots:
globals@14.0.0: {} globals@14.0.0: {}
globals@15.12.0: {} globals@15.13.0: {}
globalthis@1.0.4: globalthis@1.0.4:
dependencies: dependencies:
@ -12255,6 +12422,8 @@ snapshots:
html-tags@3.3.1: {} html-tags@3.3.1: {}
htmlfy@0.5.0: {}
http-cache-semantics@4.1.1: {} http-cache-semantics@4.1.1: {}
http-proxy-agent@7.0.2: http-proxy-agent@7.0.2:
@ -12282,7 +12451,7 @@ snapshots:
human-signals@8.0.0: {} human-signals@8.0.0: {}
husky@9.1.6: {} husky@9.1.7: {}
iconv-lite@0.4.24: iconv-lite@0.4.24:
dependencies: dependencies:
@ -12407,9 +12576,9 @@ snapshots:
is-callable@1.2.7: {} is-callable@1.2.7: {}
is-ci@3.0.1: is-ci@4.1.0:
dependencies: dependencies:
ci-info: 3.9.0 ci-info: 4.1.0
is-core-module@2.15.1: is-core-module@2.15.1:
dependencies: dependencies:
@ -12533,6 +12702,8 @@ snapshots:
jiti@1.21.6: {} jiti@1.21.6: {}
jiti@2.4.1: {}
jpeg-exif@1.1.4: {} jpeg-exif@1.1.4: {}
js-tokens@4.0.0: {} js-tokens@4.0.0: {}
@ -12581,7 +12752,7 @@ snapshots:
kind-of@6.0.3: {} kind-of@6.0.3: {}
known-css-properties@0.34.0: {} known-css-properties@0.35.0: {}
leaflet.markercluster@1.5.3(leaflet@1.9.4): leaflet.markercluster@1.5.3(leaflet@1.9.4):
dependencies: dependencies:
@ -12596,24 +12767,24 @@ snapshots:
prelude-ls: 1.2.1 prelude-ls: 1.2.1
type-check: 0.4.0 type-check: 0.4.0
lilconfig@2.1.0: {}
lilconfig@3.1.2: {} lilconfig@3.1.2: {}
lilconfig@3.1.3: {}
lines-and-columns@1.2.4: {} lines-and-columns@1.2.4: {}
lint-staged@15.2.10: lint-staged@15.2.11:
dependencies: dependencies:
chalk: 5.3.0 chalk: 5.3.0
commander: 12.1.0 commander: 12.1.0
debug: 4.3.7 debug: 4.4.0
execa: 8.0.1 execa: 8.0.1
lilconfig: 3.1.2 lilconfig: 3.1.3
listr2: 8.2.5 listr2: 8.2.5
micromatch: 4.0.8 micromatch: 4.0.8
pidtree: 0.6.0 pidtree: 0.6.0
string-argv: 0.3.2 string-argv: 0.3.2
yaml: 2.5.1 yaml: 2.6.1
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
@ -12748,7 +12919,7 @@ snapshots:
marked@12.0.2: {} marked@12.0.2: {}
marked@14.1.3: {} marked@15.0.4: {}
mathml-tag-names@2.1.3: {} mathml-tag-names@2.1.3: {}
@ -13090,400 +13261,397 @@ snapshots:
possible-typed-array-names@1.0.0: {} possible-typed-array-names@1.0.0: {}
postcss-attribute-case-insensitive@7.0.1(postcss@8.4.47): postcss-attribute-case-insensitive@7.0.1(postcss@8.4.49):
dependencies: dependencies:
postcss: 8.4.47 postcss: 8.4.49
postcss-selector-parser: 7.0.0 postcss-selector-parser: 7.0.0
postcss-calc@10.0.2(postcss@8.4.47): postcss-calc@10.0.2(postcss@8.4.49):
dependencies: dependencies:
postcss: 8.4.47 postcss: 8.4.49
postcss-selector-parser: 6.1.2 postcss-selector-parser: 6.1.2
postcss-value-parser: 4.2.0 postcss-value-parser: 4.2.0
postcss-clamp@4.1.0(postcss@8.4.47): postcss-clamp@4.1.0(postcss@8.4.49):
dependencies: dependencies:
postcss: 8.4.47 postcss: 8.4.49
postcss-value-parser: 4.2.0 postcss-value-parser: 4.2.0
postcss-color-functional-notation@7.0.5(postcss@8.4.47): postcss-color-functional-notation@7.0.6(postcss@8.4.49):
dependencies: dependencies:
"@csstools/css-color-parser": 3.0.5(@csstools/css-parser-algorithms@3.0.4(@csstools/css-tokenizer@3.0.3))(@csstools/css-tokenizer@3.0.3) "@csstools/css-color-parser": 3.0.6(@csstools/css-parser-algorithms@3.0.4(@csstools/css-tokenizer@3.0.3))(@csstools/css-tokenizer@3.0.3)
"@csstools/css-parser-algorithms": 3.0.4(@csstools/css-tokenizer@3.0.3) "@csstools/css-parser-algorithms": 3.0.4(@csstools/css-tokenizer@3.0.3)
"@csstools/css-tokenizer": 3.0.3 "@csstools/css-tokenizer": 3.0.3
"@csstools/postcss-progressive-custom-properties": 4.0.0(postcss@8.4.47) "@csstools/postcss-progressive-custom-properties": 4.0.0(postcss@8.4.49)
"@csstools/utilities": 2.0.0(postcss@8.4.47) "@csstools/utilities": 2.0.0(postcss@8.4.49)
postcss: 8.4.47 postcss: 8.4.49
postcss-color-hex-alpha@10.0.0(postcss@8.4.47): postcss-color-hex-alpha@10.0.0(postcss@8.4.49):
dependencies: dependencies:
"@csstools/utilities": 2.0.0(postcss@8.4.47) "@csstools/utilities": 2.0.0(postcss@8.4.49)
postcss: 8.4.47 postcss: 8.4.49
postcss-value-parser: 4.2.0 postcss-value-parser: 4.2.0
postcss-color-rebeccapurple@10.0.0(postcss@8.4.47): postcss-color-rebeccapurple@10.0.0(postcss@8.4.49):
dependencies: dependencies:
"@csstools/utilities": 2.0.0(postcss@8.4.47) "@csstools/utilities": 2.0.0(postcss@8.4.49)
postcss: 8.4.47 postcss: 8.4.49
postcss-value-parser: 4.2.0 postcss-value-parser: 4.2.0
postcss-colormin@7.0.2(postcss@8.4.47): postcss-colormin@7.0.2(postcss@8.4.49):
dependencies: dependencies:
browserslist: 4.24.2 browserslist: 4.24.2
caniuse-api: 3.0.0 caniuse-api: 3.0.0
colord: 2.9.3 colord: 2.9.3
postcss: 8.4.47 postcss: 8.4.49
postcss-value-parser: 4.2.0 postcss-value-parser: 4.2.0
postcss-convert-values@7.0.4(postcss@8.4.47): postcss-convert-values@7.0.4(postcss@8.4.49):
dependencies: dependencies:
browserslist: 4.24.2 browserslist: 4.24.2
postcss: 8.4.47 postcss: 8.4.49
postcss-value-parser: 4.2.0 postcss-value-parser: 4.2.0
postcss-custom-media@11.0.5(postcss@8.4.47): postcss-custom-media@11.0.5(postcss@8.4.49):
dependencies: dependencies:
"@csstools/cascade-layer-name-parser": 2.0.4(@csstools/css-parser-algorithms@3.0.4(@csstools/css-tokenizer@3.0.3))(@csstools/css-tokenizer@3.0.3) "@csstools/cascade-layer-name-parser": 2.0.4(@csstools/css-parser-algorithms@3.0.4(@csstools/css-tokenizer@3.0.3))(@csstools/css-tokenizer@3.0.3)
"@csstools/css-parser-algorithms": 3.0.4(@csstools/css-tokenizer@3.0.3) "@csstools/css-parser-algorithms": 3.0.4(@csstools/css-tokenizer@3.0.3)
"@csstools/css-tokenizer": 3.0.3 "@csstools/css-tokenizer": 3.0.3
"@csstools/media-query-list-parser": 4.0.2(@csstools/css-parser-algorithms@3.0.4(@csstools/css-tokenizer@3.0.3))(@csstools/css-tokenizer@3.0.3) "@csstools/media-query-list-parser": 4.0.2(@csstools/css-parser-algorithms@3.0.4(@csstools/css-tokenizer@3.0.3))(@csstools/css-tokenizer@3.0.3)
postcss: 8.4.47 postcss: 8.4.49
postcss-custom-properties@14.0.4(postcss@8.4.47): postcss-custom-properties@14.0.4(postcss@8.4.49):
dependencies: dependencies:
"@csstools/cascade-layer-name-parser": 2.0.4(@csstools/css-parser-algorithms@3.0.4(@csstools/css-tokenizer@3.0.3))(@csstools/css-tokenizer@3.0.3) "@csstools/cascade-layer-name-parser": 2.0.4(@csstools/css-parser-algorithms@3.0.4(@csstools/css-tokenizer@3.0.3))(@csstools/css-tokenizer@3.0.3)
"@csstools/css-parser-algorithms": 3.0.4(@csstools/css-tokenizer@3.0.3) "@csstools/css-parser-algorithms": 3.0.4(@csstools/css-tokenizer@3.0.3)
"@csstools/css-tokenizer": 3.0.3 "@csstools/css-tokenizer": 3.0.3
"@csstools/utilities": 2.0.0(postcss@8.4.47) "@csstools/utilities": 2.0.0(postcss@8.4.49)
postcss: 8.4.47 postcss: 8.4.49
postcss-value-parser: 4.2.0 postcss-value-parser: 4.2.0
postcss-custom-selectors@8.0.4(postcss@8.4.47): postcss-custom-selectors@8.0.4(postcss@8.4.49):
dependencies: dependencies:
"@csstools/cascade-layer-name-parser": 2.0.4(@csstools/css-parser-algorithms@3.0.4(@csstools/css-tokenizer@3.0.3))(@csstools/css-tokenizer@3.0.3) "@csstools/cascade-layer-name-parser": 2.0.4(@csstools/css-parser-algorithms@3.0.4(@csstools/css-tokenizer@3.0.3))(@csstools/css-tokenizer@3.0.3)
"@csstools/css-parser-algorithms": 3.0.4(@csstools/css-tokenizer@3.0.3) "@csstools/css-parser-algorithms": 3.0.4(@csstools/css-tokenizer@3.0.3)
"@csstools/css-tokenizer": 3.0.3 "@csstools/css-tokenizer": 3.0.3
postcss: 8.4.47 postcss: 8.4.49
postcss-selector-parser: 7.0.0 postcss-selector-parser: 7.0.0
postcss-dir-pseudo-class@9.0.1(postcss@8.4.47): postcss-dir-pseudo-class@9.0.1(postcss@8.4.49):
dependencies: dependencies:
postcss: 8.4.47 postcss: 8.4.49
postcss-selector-parser: 7.0.0 postcss-selector-parser: 7.0.0
postcss-discard-comments@7.0.3(postcss@8.4.47): postcss-discard-comments@7.0.3(postcss@8.4.49):
dependencies: dependencies:
postcss: 8.4.47 postcss: 8.4.49
postcss-selector-parser: 6.1.2 postcss-selector-parser: 6.1.2
postcss-discard-duplicates@7.0.1(postcss@8.4.47): postcss-discard-duplicates@7.0.1(postcss@8.4.49):
dependencies: dependencies:
postcss: 8.4.47 postcss: 8.4.49
postcss-discard-empty@7.0.0(postcss@8.4.47): postcss-discard-empty@7.0.0(postcss@8.4.49):
dependencies: dependencies:
postcss: 8.4.47 postcss: 8.4.49
postcss-discard-overridden@7.0.0(postcss@8.4.47): postcss-discard-overridden@7.0.0(postcss@8.4.49):
dependencies: dependencies:
postcss: 8.4.47 postcss: 8.4.49
postcss-double-position-gradients@6.0.0(postcss@8.4.47): postcss-double-position-gradients@6.0.0(postcss@8.4.49):
dependencies: dependencies:
"@csstools/postcss-progressive-custom-properties": 4.0.0(postcss@8.4.47) "@csstools/postcss-progressive-custom-properties": 4.0.0(postcss@8.4.49)
"@csstools/utilities": 2.0.0(postcss@8.4.47) "@csstools/utilities": 2.0.0(postcss@8.4.49)
postcss: 8.4.47 postcss: 8.4.49
postcss-value-parser: 4.2.0 postcss-value-parser: 4.2.0
postcss-focus-visible@10.0.1(postcss@8.4.47): postcss-focus-visible@10.0.1(postcss@8.4.49):
dependencies: dependencies:
postcss: 8.4.47 postcss: 8.4.49
postcss-selector-parser: 7.0.0 postcss-selector-parser: 7.0.0
postcss-focus-within@9.0.1(postcss@8.4.47): postcss-focus-within@9.0.1(postcss@8.4.49):
dependencies: dependencies:
postcss: 8.4.47 postcss: 8.4.49
postcss-selector-parser: 7.0.0 postcss-selector-parser: 7.0.0
postcss-font-variant@5.0.0(postcss@8.4.47): postcss-font-variant@5.0.0(postcss@8.4.49):
dependencies: dependencies:
postcss: 8.4.47 postcss: 8.4.49
postcss-gap-properties@6.0.0(postcss@8.4.47): postcss-gap-properties@6.0.0(postcss@8.4.49):
dependencies: dependencies:
postcss: 8.4.47 postcss: 8.4.49
postcss-image-set-function@7.0.0(postcss@8.4.47): postcss-image-set-function@7.0.0(postcss@8.4.49):
dependencies: dependencies:
"@csstools/utilities": 2.0.0(postcss@8.4.47) "@csstools/utilities": 2.0.0(postcss@8.4.49)
postcss: 8.4.47 postcss: 8.4.49
postcss-value-parser: 4.2.0 postcss-value-parser: 4.2.0
postcss-import@15.1.0(postcss@8.4.47): postcss-import@15.1.0(postcss@8.4.49):
dependencies: dependencies:
postcss: 8.4.47 postcss: 8.4.49
postcss-value-parser: 4.2.0 postcss-value-parser: 4.2.0
read-cache: 1.0.0 read-cache: 1.0.0
resolve: 1.22.8 resolve: 1.22.8
postcss-import@16.1.0(postcss@8.4.47): postcss-import@16.1.0(postcss@8.4.49):
dependencies: dependencies:
postcss: 8.4.47 postcss: 8.4.49
postcss-value-parser: 4.2.0 postcss-value-parser: 4.2.0
read-cache: 1.0.0 read-cache: 1.0.0
resolve: 1.22.8 resolve: 1.22.8
postcss-js@4.0.1(postcss@8.4.47): postcss-js@4.0.1(postcss@8.4.49):
dependencies: dependencies:
camelcase-css: 2.0.1 camelcase-css: 2.0.1
postcss: 8.4.47 postcss: 8.4.49
postcss-lab-function@7.0.5(postcss@8.4.47): postcss-lab-function@7.0.6(postcss@8.4.49):
dependencies: dependencies:
"@csstools/css-color-parser": 3.0.5(@csstools/css-parser-algorithms@3.0.4(@csstools/css-tokenizer@3.0.3))(@csstools/css-tokenizer@3.0.3) "@csstools/css-color-parser": 3.0.6(@csstools/css-parser-algorithms@3.0.4(@csstools/css-tokenizer@3.0.3))(@csstools/css-tokenizer@3.0.3)
"@csstools/css-parser-algorithms": 3.0.4(@csstools/css-tokenizer@3.0.3) "@csstools/css-parser-algorithms": 3.0.4(@csstools/css-tokenizer@3.0.3)
"@csstools/css-tokenizer": 3.0.3 "@csstools/css-tokenizer": 3.0.3
"@csstools/postcss-progressive-custom-properties": 4.0.0(postcss@8.4.47) "@csstools/postcss-progressive-custom-properties": 4.0.0(postcss@8.4.49)
"@csstools/utilities": 2.0.0(postcss@8.4.47) "@csstools/utilities": 2.0.0(postcss@8.4.49)
postcss: 8.4.47 postcss: 8.4.49
postcss-load-config@4.0.2(postcss@8.4.47): postcss-load-config@4.0.2(postcss@8.4.49):
dependencies: dependencies:
lilconfig: 3.1.2 lilconfig: 3.1.3
yaml: 2.6.0 yaml: 2.6.0
optionalDependencies: optionalDependencies:
postcss: 8.4.47 postcss: 8.4.49
postcss-logical@8.0.0(postcss@8.4.47): postcss-logical@8.0.0(postcss@8.4.49):
dependencies: dependencies:
postcss: 8.4.47 postcss: 8.4.49
postcss-value-parser: 4.2.0 postcss-value-parser: 4.2.0
postcss-merge-longhand@7.0.4(postcss@8.4.47): postcss-merge-longhand@7.0.4(postcss@8.4.49):
dependencies: dependencies:
postcss: 8.4.47 postcss: 8.4.49
postcss-value-parser: 4.2.0 postcss-value-parser: 4.2.0
stylehacks: 7.0.4(postcss@8.4.47) stylehacks: 7.0.4(postcss@8.4.49)
postcss-merge-rules@7.0.4(postcss@8.4.47): postcss-merge-rules@7.0.4(postcss@8.4.49):
dependencies: dependencies:
browserslist: 4.24.2 browserslist: 4.24.2
caniuse-api: 3.0.0 caniuse-api: 3.0.0
cssnano-utils: 5.0.0(postcss@8.4.47) cssnano-utils: 5.0.0(postcss@8.4.49)
postcss: 8.4.47 postcss: 8.4.49
postcss-selector-parser: 6.1.2 postcss-selector-parser: 6.1.2
postcss-minify-font-values@7.0.0(postcss@8.4.47): postcss-minify-font-values@7.0.0(postcss@8.4.49):
dependencies: dependencies:
postcss: 8.4.47 postcss: 8.4.49
postcss-value-parser: 4.2.0 postcss-value-parser: 4.2.0
postcss-minify-gradients@7.0.0(postcss@8.4.47): postcss-minify-gradients@7.0.0(postcss@8.4.49):
dependencies: dependencies:
colord: 2.9.3 colord: 2.9.3
cssnano-utils: 5.0.0(postcss@8.4.47) cssnano-utils: 5.0.0(postcss@8.4.49)
postcss: 8.4.47 postcss: 8.4.49
postcss-value-parser: 4.2.0 postcss-value-parser: 4.2.0
postcss-minify-params@7.0.2(postcss@8.4.47): postcss-minify-params@7.0.2(postcss@8.4.49):
dependencies: dependencies:
browserslist: 4.24.2 browserslist: 4.24.2
cssnano-utils: 5.0.0(postcss@8.4.47) cssnano-utils: 5.0.0(postcss@8.4.49)
postcss: 8.4.47 postcss: 8.4.49
postcss-value-parser: 4.2.0 postcss-value-parser: 4.2.0
postcss-minify-selectors@7.0.4(postcss@8.4.47): postcss-minify-selectors@7.0.4(postcss@8.4.49):
dependencies: dependencies:
cssesc: 3.0.0 cssesc: 3.0.0
postcss: 8.4.47 postcss: 8.4.49
postcss-selector-parser: 6.1.2 postcss-selector-parser: 6.1.2
postcss-nested@5.0.6(postcss@8.4.47): postcss-nested@6.2.0(postcss@8.4.49):
dependencies: dependencies:
postcss: 8.4.47 postcss: 8.4.49
postcss-selector-parser: 6.1.2 postcss-selector-parser: 6.1.2
postcss-nested@6.2.0(postcss@8.4.47): postcss-nesting@13.0.1(postcss@8.4.49):
dependencies:
postcss: 8.4.47
postcss-selector-parser: 6.1.2
postcss-nesting@13.0.1(postcss@8.4.47):
dependencies: dependencies:
"@csstools/selector-resolve-nested": 3.0.0(postcss-selector-parser@7.0.0) "@csstools/selector-resolve-nested": 3.0.0(postcss-selector-parser@7.0.0)
"@csstools/selector-specificity": 5.0.0(postcss-selector-parser@7.0.0) "@csstools/selector-specificity": 5.0.0(postcss-selector-parser@7.0.0)
postcss: 8.4.47 postcss: 8.4.49
postcss-selector-parser: 7.0.0 postcss-selector-parser: 7.0.0
postcss-normalize-charset@7.0.0(postcss@8.4.47): postcss-normalize-charset@7.0.0(postcss@8.4.49):
dependencies: dependencies:
postcss: 8.4.47 postcss: 8.4.49
postcss-normalize-display-values@7.0.0(postcss@8.4.47): postcss-normalize-display-values@7.0.0(postcss@8.4.49):
dependencies: dependencies:
postcss: 8.4.47 postcss: 8.4.49
postcss-value-parser: 4.2.0 postcss-value-parser: 4.2.0
postcss-normalize-positions@7.0.0(postcss@8.4.47): postcss-normalize-positions@7.0.0(postcss@8.4.49):
dependencies: dependencies:
postcss: 8.4.47 postcss: 8.4.49
postcss-value-parser: 4.2.0 postcss-value-parser: 4.2.0
postcss-normalize-repeat-style@7.0.0(postcss@8.4.47): postcss-normalize-repeat-style@7.0.0(postcss@8.4.49):
dependencies: dependencies:
postcss: 8.4.47 postcss: 8.4.49
postcss-value-parser: 4.2.0 postcss-value-parser: 4.2.0
postcss-normalize-string@7.0.0(postcss@8.4.47): postcss-normalize-string@7.0.0(postcss@8.4.49):
dependencies: dependencies:
postcss: 8.4.47 postcss: 8.4.49
postcss-value-parser: 4.2.0 postcss-value-parser: 4.2.0
postcss-normalize-timing-functions@7.0.0(postcss@8.4.47): postcss-normalize-timing-functions@7.0.0(postcss@8.4.49):
dependencies: dependencies:
postcss: 8.4.47 postcss: 8.4.49
postcss-value-parser: 4.2.0 postcss-value-parser: 4.2.0
postcss-normalize-unicode@7.0.2(postcss@8.4.47): postcss-normalize-unicode@7.0.2(postcss@8.4.49):
dependencies: dependencies:
browserslist: 4.24.2 browserslist: 4.24.2
postcss: 8.4.47 postcss: 8.4.49
postcss-value-parser: 4.2.0 postcss-value-parser: 4.2.0
postcss-normalize-url@7.0.0(postcss@8.4.47): postcss-normalize-url@7.0.0(postcss@8.4.49):
dependencies: dependencies:
postcss: 8.4.47 postcss: 8.4.49
postcss-value-parser: 4.2.0 postcss-value-parser: 4.2.0
postcss-normalize-whitespace@7.0.0(postcss@8.4.47): postcss-normalize-whitespace@7.0.0(postcss@8.4.49):
dependencies: dependencies:
postcss: 8.4.47 postcss: 8.4.49
postcss-value-parser: 4.2.0 postcss-value-parser: 4.2.0
postcss-opacity-percentage@3.0.0(postcss@8.4.47): postcss-opacity-percentage@3.0.0(postcss@8.4.49):
dependencies: dependencies:
postcss: 8.4.47 postcss: 8.4.49
postcss-ordered-values@7.0.1(postcss@8.4.47): postcss-ordered-values@7.0.1(postcss@8.4.49):
dependencies: dependencies:
cssnano-utils: 5.0.0(postcss@8.4.47) cssnano-utils: 5.0.0(postcss@8.4.49)
postcss: 8.4.47 postcss: 8.4.49
postcss-value-parser: 4.2.0 postcss-value-parser: 4.2.0
postcss-overflow-shorthand@6.0.0(postcss@8.4.47): postcss-overflow-shorthand@6.0.0(postcss@8.4.49):
dependencies: dependencies:
postcss: 8.4.47 postcss: 8.4.49
postcss-value-parser: 4.2.0 postcss-value-parser: 4.2.0
postcss-page-break@3.0.4(postcss@8.4.47): postcss-page-break@3.0.4(postcss@8.4.49):
dependencies: dependencies:
postcss: 8.4.47 postcss: 8.4.49
postcss-place@10.0.0(postcss@8.4.47): postcss-place@10.0.0(postcss@8.4.49):
dependencies: dependencies:
postcss: 8.4.47 postcss: 8.4.49
postcss-value-parser: 4.2.0 postcss-value-parser: 4.2.0
postcss-preset-env@10.0.9(postcss@8.4.47): postcss-preset-env@10.1.2(postcss@8.4.49):
dependencies: dependencies:
"@csstools/postcss-cascade-layers": 5.0.1(postcss@8.4.47) "@csstools/postcss-cascade-layers": 5.0.1(postcss@8.4.49)
"@csstools/postcss-color-function": 4.0.5(postcss@8.4.47) "@csstools/postcss-color-function": 4.0.6(postcss@8.4.49)
"@csstools/postcss-color-mix-function": 3.0.5(postcss@8.4.47) "@csstools/postcss-color-mix-function": 3.0.6(postcss@8.4.49)
"@csstools/postcss-content-alt-text": 2.0.4(postcss@8.4.47) "@csstools/postcss-content-alt-text": 2.0.4(postcss@8.4.49)
"@csstools/postcss-exponential-functions": 2.0.4(postcss@8.4.47) "@csstools/postcss-exponential-functions": 2.0.5(postcss@8.4.49)
"@csstools/postcss-font-format-keywords": 4.0.0(postcss@8.4.47) "@csstools/postcss-font-format-keywords": 4.0.0(postcss@8.4.49)
"@csstools/postcss-gamut-mapping": 2.0.5(postcss@8.4.47) "@csstools/postcss-gamut-mapping": 2.0.6(postcss@8.4.49)
"@csstools/postcss-gradients-interpolation-method": 5.0.5(postcss@8.4.47) "@csstools/postcss-gradients-interpolation-method": 5.0.6(postcss@8.4.49)
"@csstools/postcss-hwb-function": 4.0.5(postcss@8.4.47) "@csstools/postcss-hwb-function": 4.0.6(postcss@8.4.49)
"@csstools/postcss-ic-unit": 4.0.0(postcss@8.4.47) "@csstools/postcss-ic-unit": 4.0.0(postcss@8.4.49)
"@csstools/postcss-initial": 2.0.0(postcss@8.4.47) "@csstools/postcss-initial": 2.0.0(postcss@8.4.49)
"@csstools/postcss-is-pseudo-class": 5.0.1(postcss@8.4.47) "@csstools/postcss-is-pseudo-class": 5.0.1(postcss@8.4.49)
"@csstools/postcss-light-dark-function": 2.0.7(postcss@8.4.47) "@csstools/postcss-light-dark-function": 2.0.7(postcss@8.4.49)
"@csstools/postcss-logical-float-and-clear": 3.0.0(postcss@8.4.47) "@csstools/postcss-logical-float-and-clear": 3.0.0(postcss@8.4.49)
"@csstools/postcss-logical-overflow": 2.0.0(postcss@8.4.47) "@csstools/postcss-logical-overflow": 2.0.0(postcss@8.4.49)
"@csstools/postcss-logical-overscroll-behavior": 2.0.0(postcss@8.4.47) "@csstools/postcss-logical-overscroll-behavior": 2.0.0(postcss@8.4.49)
"@csstools/postcss-logical-resize": 3.0.0(postcss@8.4.47) "@csstools/postcss-logical-resize": 3.0.0(postcss@8.4.49)
"@csstools/postcss-logical-viewport-units": 3.0.3(postcss@8.4.47) "@csstools/postcss-logical-viewport-units": 3.0.3(postcss@8.4.49)
"@csstools/postcss-media-minmax": 2.0.4(postcss@8.4.47) "@csstools/postcss-media-minmax": 2.0.5(postcss@8.4.49)
"@csstools/postcss-media-queries-aspect-ratio-number-values": 3.0.4(postcss@8.4.47) "@csstools/postcss-media-queries-aspect-ratio-number-values": 3.0.4(postcss@8.4.49)
"@csstools/postcss-nested-calc": 4.0.0(postcss@8.4.47) "@csstools/postcss-nested-calc": 4.0.0(postcss@8.4.49)
"@csstools/postcss-normalize-display-values": 4.0.0(postcss@8.4.47) "@csstools/postcss-normalize-display-values": 4.0.0(postcss@8.4.49)
"@csstools/postcss-oklab-function": 4.0.5(postcss@8.4.47) "@csstools/postcss-oklab-function": 4.0.6(postcss@8.4.49)
"@csstools/postcss-progressive-custom-properties": 4.0.0(postcss@8.4.47) "@csstools/postcss-progressive-custom-properties": 4.0.0(postcss@8.4.49)
"@csstools/postcss-relative-color-syntax": 3.0.5(postcss@8.4.47) "@csstools/postcss-random-function": 1.0.1(postcss@8.4.49)
"@csstools/postcss-scope-pseudo-class": 4.0.1(postcss@8.4.47) "@csstools/postcss-relative-color-syntax": 3.0.6(postcss@8.4.49)
"@csstools/postcss-stepped-value-functions": 4.0.4(postcss@8.4.47) "@csstools/postcss-scope-pseudo-class": 4.0.1(postcss@8.4.49)
"@csstools/postcss-text-decoration-shorthand": 4.0.1(postcss@8.4.47) "@csstools/postcss-sign-functions": 1.1.0(postcss@8.4.49)
"@csstools/postcss-trigonometric-functions": 4.0.4(postcss@8.4.47) "@csstools/postcss-stepped-value-functions": 4.0.5(postcss@8.4.49)
"@csstools/postcss-unset-value": 4.0.0(postcss@8.4.47) "@csstools/postcss-text-decoration-shorthand": 4.0.1(postcss@8.4.49)
autoprefixer: 10.4.20(postcss@8.4.47) "@csstools/postcss-trigonometric-functions": 4.0.5(postcss@8.4.49)
"@csstools/postcss-unset-value": 4.0.0(postcss@8.4.49)
autoprefixer: 10.4.20(postcss@8.4.49)
browserslist: 4.24.2 browserslist: 4.24.2
css-blank-pseudo: 7.0.1(postcss@8.4.47) css-blank-pseudo: 7.0.1(postcss@8.4.49)
css-has-pseudo: 7.0.1(postcss@8.4.47) css-has-pseudo: 7.0.2(postcss@8.4.49)
css-prefers-color-scheme: 10.0.0(postcss@8.4.47) css-prefers-color-scheme: 10.0.0(postcss@8.4.49)
cssdb: 8.1.2 cssdb: 8.2.3
postcss: 8.4.47 postcss: 8.4.49
postcss-attribute-case-insensitive: 7.0.1(postcss@8.4.47) postcss-attribute-case-insensitive: 7.0.1(postcss@8.4.49)
postcss-clamp: 4.1.0(postcss@8.4.47) postcss-clamp: 4.1.0(postcss@8.4.49)
postcss-color-functional-notation: 7.0.5(postcss@8.4.47) postcss-color-functional-notation: 7.0.6(postcss@8.4.49)
postcss-color-hex-alpha: 10.0.0(postcss@8.4.47) postcss-color-hex-alpha: 10.0.0(postcss@8.4.49)
postcss-color-rebeccapurple: 10.0.0(postcss@8.4.47) postcss-color-rebeccapurple: 10.0.0(postcss@8.4.49)
postcss-custom-media: 11.0.5(postcss@8.4.47) postcss-custom-media: 11.0.5(postcss@8.4.49)
postcss-custom-properties: 14.0.4(postcss@8.4.47) postcss-custom-properties: 14.0.4(postcss@8.4.49)
postcss-custom-selectors: 8.0.4(postcss@8.4.47) postcss-custom-selectors: 8.0.4(postcss@8.4.49)
postcss-dir-pseudo-class: 9.0.1(postcss@8.4.47) postcss-dir-pseudo-class: 9.0.1(postcss@8.4.49)
postcss-double-position-gradients: 6.0.0(postcss@8.4.47) postcss-double-position-gradients: 6.0.0(postcss@8.4.49)
postcss-focus-visible: 10.0.1(postcss@8.4.47) postcss-focus-visible: 10.0.1(postcss@8.4.49)
postcss-focus-within: 9.0.1(postcss@8.4.47) postcss-focus-within: 9.0.1(postcss@8.4.49)
postcss-font-variant: 5.0.0(postcss@8.4.47) postcss-font-variant: 5.0.0(postcss@8.4.49)
postcss-gap-properties: 6.0.0(postcss@8.4.47) postcss-gap-properties: 6.0.0(postcss@8.4.49)
postcss-image-set-function: 7.0.0(postcss@8.4.47) postcss-image-set-function: 7.0.0(postcss@8.4.49)
postcss-lab-function: 7.0.5(postcss@8.4.47) postcss-lab-function: 7.0.6(postcss@8.4.49)
postcss-logical: 8.0.0(postcss@8.4.47) postcss-logical: 8.0.0(postcss@8.4.49)
postcss-nesting: 13.0.1(postcss@8.4.47) postcss-nesting: 13.0.1(postcss@8.4.49)
postcss-opacity-percentage: 3.0.0(postcss@8.4.47) postcss-opacity-percentage: 3.0.0(postcss@8.4.49)
postcss-overflow-shorthand: 6.0.0(postcss@8.4.47) postcss-overflow-shorthand: 6.0.0(postcss@8.4.49)
postcss-page-break: 3.0.4(postcss@8.4.47) postcss-page-break: 3.0.4(postcss@8.4.49)
postcss-place: 10.0.0(postcss@8.4.47) postcss-place: 10.0.0(postcss@8.4.49)
postcss-pseudo-class-any-link: 10.0.1(postcss@8.4.47) postcss-pseudo-class-any-link: 10.0.1(postcss@8.4.49)
postcss-replace-overflow-wrap: 4.0.0(postcss@8.4.47) postcss-replace-overflow-wrap: 4.0.0(postcss@8.4.49)
postcss-selector-not: 8.0.1(postcss@8.4.47) postcss-selector-not: 8.0.1(postcss@8.4.49)
postcss-pseudo-class-any-link@10.0.1(postcss@8.4.47): postcss-pseudo-class-any-link@10.0.1(postcss@8.4.49):
dependencies: dependencies:
postcss: 8.4.47 postcss: 8.4.49
postcss-selector-parser: 7.0.0 postcss-selector-parser: 7.0.0
postcss-reduce-initial@7.0.2(postcss@8.4.47): postcss-reduce-initial@7.0.2(postcss@8.4.49):
dependencies: dependencies:
browserslist: 4.24.2 browserslist: 4.24.2
caniuse-api: 3.0.0 caniuse-api: 3.0.0
postcss: 8.4.47 postcss: 8.4.49
postcss-reduce-transforms@7.0.0(postcss@8.4.47): postcss-reduce-transforms@7.0.0(postcss@8.4.49):
dependencies: dependencies:
postcss: 8.4.47 postcss: 8.4.49
postcss-value-parser: 4.2.0 postcss-value-parser: 4.2.0
postcss-replace-overflow-wrap@4.0.0(postcss@8.4.47): postcss-replace-overflow-wrap@4.0.0(postcss@8.4.49):
dependencies: dependencies:
postcss: 8.4.47 postcss: 8.4.49
postcss-reporter@7.1.0(postcss@8.4.47): postcss-reporter@7.1.0(postcss@8.4.49):
dependencies: dependencies:
picocolors: 1.1.1 picocolors: 1.1.1
postcss: 8.4.47 postcss: 8.4.49
thenby: 1.3.4 thenby: 1.3.4
postcss-resolve-nested-selector@0.1.6: {} postcss-resolve-nested-selector@0.1.6: {}
postcss-safe-parser@7.0.1(postcss@8.4.47): postcss-safe-parser@7.0.1(postcss@8.4.49):
dependencies: dependencies:
postcss: 8.4.47 postcss: 8.4.49
postcss-selector-not@8.0.1(postcss@8.4.47): postcss-selector-not@8.0.1(postcss@8.4.49):
dependencies: dependencies:
postcss: 8.4.47 postcss: 8.4.49
postcss-selector-parser: 7.0.0 postcss-selector-parser: 7.0.0
postcss-selector-parser@6.0.10: postcss-selector-parser@6.0.10:
@ -13501,20 +13669,20 @@ snapshots:
cssesc: 3.0.0 cssesc: 3.0.0
util-deprecate: 1.0.2 util-deprecate: 1.0.2
postcss-svgo@7.0.1(postcss@8.4.47): postcss-svgo@7.0.1(postcss@8.4.49):
dependencies: dependencies:
postcss: 8.4.47 postcss: 8.4.49
postcss-value-parser: 4.2.0 postcss-value-parser: 4.2.0
svgo: 3.3.2 svgo: 3.3.2
postcss-unique-selectors@7.0.3(postcss@8.4.47): postcss-unique-selectors@7.0.3(postcss@8.4.49):
dependencies: dependencies:
postcss: 8.4.47 postcss: 8.4.49
postcss-selector-parser: 6.1.2 postcss-selector-parser: 6.1.2
postcss-value-parser@4.2.0: {} postcss-value-parser@4.2.0: {}
postcss@8.4.47: postcss@8.4.49:
dependencies: dependencies:
nanoid: 3.3.7 nanoid: 3.3.7
picocolors: 1.1.1 picocolors: 1.1.1
@ -13526,15 +13694,15 @@ snapshots:
dependencies: dependencies:
fast-diff: 1.3.0 fast-diff: 1.3.0
prettier-plugin-organize-imports@4.1.0(prettier@3.3.3)(typescript@5.5.4): prettier-plugin-organize-imports@4.1.0(prettier@3.4.2)(typescript@5.7.2):
dependencies: dependencies:
prettier: 3.3.3 prettier: 3.4.2
typescript: 5.5.4 typescript: 5.7.2
prettier@2.8.8: prettier@2.8.8:
optional: true optional: true
prettier@3.3.3: {} prettier@3.4.2: {}
pretty-bytes@5.6.0: {} pretty-bytes@5.6.0: {}
@ -13755,15 +13923,15 @@ snapshots:
sax@1.4.1: {} sax@1.4.1: {}
semantic-release@24.2.0(typescript@5.5.4): semantic-release@24.2.0(typescript@5.7.2):
dependencies: dependencies:
"@semantic-release/commit-analyzer": 13.0.0(semantic-release@24.2.0(typescript@5.5.4)) "@semantic-release/commit-analyzer": 13.0.0(semantic-release@24.2.0(typescript@5.7.2))
"@semantic-release/error": 4.0.0 "@semantic-release/error": 4.0.0
"@semantic-release/github": 11.0.0(semantic-release@24.2.0(typescript@5.5.4)) "@semantic-release/github": 11.0.0(semantic-release@24.2.0(typescript@5.7.2))
"@semantic-release/npm": 12.0.1(semantic-release@24.2.0(typescript@5.5.4)) "@semantic-release/npm": 12.0.1(semantic-release@24.2.0(typescript@5.7.2))
"@semantic-release/release-notes-generator": 14.0.1(semantic-release@24.2.0(typescript@5.5.4)) "@semantic-release/release-notes-generator": 14.0.1(semantic-release@24.2.0(typescript@5.7.2))
aggregate-error: 5.0.0 aggregate-error: 5.0.0
cosmiconfig: 9.0.0(typescript@5.5.4) cosmiconfig: 9.0.0(typescript@5.7.2)
debug: 4.3.7 debug: 4.3.7
env-ci: 11.1.0 env-ci: 11.1.0
execa: 9.5.1 execa: 9.5.1
@ -14011,31 +14179,31 @@ snapshots:
style-mod@4.1.2: {} style-mod@4.1.2: {}
stylehacks@7.0.4(postcss@8.4.47): stylehacks@7.0.4(postcss@8.4.49):
dependencies: dependencies:
browserslist: 4.24.2 browserslist: 4.24.2
postcss: 8.4.47 postcss: 8.4.49
postcss-selector-parser: 6.1.2 postcss-selector-parser: 6.1.2
stylelint-config-recommended@14.0.1(stylelint@16.10.0(typescript@5.5.4)): stylelint-config-recommended@14.0.1(stylelint@16.12.0(typescript@5.7.2)):
dependencies: dependencies:
stylelint: 16.10.0(typescript@5.5.4) stylelint: 16.12.0(typescript@5.7.2)
stylelint-config-standard@36.0.1(stylelint@16.10.0(typescript@5.5.4)): stylelint-config-standard@36.0.1(stylelint@16.12.0(typescript@5.7.2)):
dependencies: dependencies:
stylelint: 16.10.0(typescript@5.5.4) stylelint: 16.12.0(typescript@5.7.2)
stylelint-config-recommended: 14.0.1(stylelint@16.10.0(typescript@5.5.4)) stylelint-config-recommended: 14.0.1(stylelint@16.12.0(typescript@5.7.2))
stylelint@16.10.0(typescript@5.5.4): stylelint@16.12.0(typescript@5.7.2):
dependencies: dependencies:
"@csstools/css-parser-algorithms": 3.0.4(@csstools/css-tokenizer@3.0.3) "@csstools/css-parser-algorithms": 3.0.4(@csstools/css-tokenizer@3.0.3)
"@csstools/css-tokenizer": 3.0.3 "@csstools/css-tokenizer": 3.0.3
"@csstools/media-query-list-parser": 3.0.1(@csstools/css-parser-algorithms@3.0.4(@csstools/css-tokenizer@3.0.3))(@csstools/css-tokenizer@3.0.3) "@csstools/media-query-list-parser": 4.0.2(@csstools/css-parser-algorithms@3.0.4(@csstools/css-tokenizer@3.0.3))(@csstools/css-tokenizer@3.0.3)
"@csstools/selector-specificity": 4.0.0(postcss-selector-parser@6.1.2) "@csstools/selector-specificity": 5.0.0(postcss-selector-parser@7.0.0)
"@dual-bundle/import-meta-resolve": 4.1.0 "@dual-bundle/import-meta-resolve": 4.1.0
balanced-match: 2.0.0 balanced-match: 2.0.0
colord: 2.9.3 colord: 2.9.3
cosmiconfig: 9.0.0(typescript@5.5.4) cosmiconfig: 9.0.0(typescript@5.7.2)
css-functions-list: 3.2.3 css-functions-list: 3.2.3
css-tree: 3.0.1 css-tree: 3.0.1
debug: 4.3.7 debug: 4.3.7
@ -14049,22 +14217,22 @@ snapshots:
ignore: 6.0.2 ignore: 6.0.2
imurmurhash: 0.1.4 imurmurhash: 0.1.4
is-plain-object: 5.0.0 is-plain-object: 5.0.0
known-css-properties: 0.34.0 known-css-properties: 0.35.0
mathml-tag-names: 2.1.3 mathml-tag-names: 2.1.3
meow: 13.2.0 meow: 13.2.0
micromatch: 4.0.8 micromatch: 4.0.8
normalize-path: 3.0.0 normalize-path: 3.0.0
picocolors: 1.1.1 picocolors: 1.1.1
postcss: 8.4.47 postcss: 8.4.49
postcss-resolve-nested-selector: 0.1.6 postcss-resolve-nested-selector: 0.1.6
postcss-safe-parser: 7.0.1(postcss@8.4.47) postcss-safe-parser: 7.0.1(postcss@8.4.49)
postcss-selector-parser: 6.1.2 postcss-selector-parser: 7.0.0
postcss-value-parser: 4.2.0 postcss-value-parser: 4.2.0
resolve-from: 5.0.0 resolve-from: 5.0.0
string-width: 4.2.3 string-width: 4.2.3
supports-hyperlinks: 3.1.0 supports-hyperlinks: 3.1.0
svg-tags: 1.0.0 svg-tags: 1.0.0
table: 6.8.2 table: 6.9.0
write-file-atomic: 5.0.1 write-file-atomic: 5.0.1
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
@ -14117,7 +14285,7 @@ snapshots:
"@pkgr/core": 0.1.1 "@pkgr/core": 0.1.1
tslib: 2.8.1 tslib: 2.8.1
table@6.8.2: table@6.9.0:
dependencies: dependencies:
ajv: 8.17.1 ajv: 8.17.1
lodash.truncate: 4.4.2 lodash.truncate: 4.4.2
@ -14125,7 +14293,7 @@ snapshots:
string-width: 4.2.3 string-width: 4.2.3
strip-ansi: 6.0.1 strip-ansi: 6.0.1
tailwindcss@3.4.14: tailwindcss@3.4.16:
dependencies: dependencies:
"@alloc/quick-lru": 5.2.0 "@alloc/quick-lru": 5.2.0
arg: 5.0.2 arg: 5.0.2
@ -14136,16 +14304,16 @@ snapshots:
glob-parent: 6.0.2 glob-parent: 6.0.2
is-glob: 4.0.3 is-glob: 4.0.3
jiti: 1.21.6 jiti: 1.21.6
lilconfig: 2.1.0 lilconfig: 3.1.3
micromatch: 4.0.8 micromatch: 4.0.8
normalize-path: 3.0.0 normalize-path: 3.0.0
object-hash: 3.0.0 object-hash: 3.0.0
picocolors: 1.1.1 picocolors: 1.1.1
postcss: 8.4.47 postcss: 8.4.49
postcss-import: 15.1.0(postcss@8.4.47) postcss-import: 15.1.0(postcss@8.4.49)
postcss-js: 4.0.1(postcss@8.4.47) postcss-js: 4.0.1(postcss@8.4.49)
postcss-load-config: 4.0.2(postcss@8.4.47) postcss-load-config: 4.0.2(postcss@8.4.49)
postcss-nested: 6.2.0(postcss@8.4.47) postcss-nested: 6.2.0(postcss@8.4.49)
postcss-selector-parser: 6.1.2 postcss-selector-parser: 6.1.2
resolve: 1.22.8 resolve: 1.22.8
sucrase: 3.35.0 sucrase: 3.35.0
@ -14179,8 +14347,6 @@ snapshots:
text-extensions@2.4.0: {} text-extensions@2.4.0: {}
text-table@0.2.0: {}
thenby@1.3.4: {} thenby@1.3.4: {}
thenify-all@1.6.0: thenify-all@1.6.0:
@ -14229,9 +14395,9 @@ snapshots:
traverse@0.6.8: {} traverse@0.6.8: {}
ts-api-utils@1.4.0(typescript@5.5.4): ts-api-utils@1.4.0(typescript@5.7.2):
dependencies: dependencies:
typescript: 5.5.4 typescript: 5.7.2
ts-interface-checker@0.1.13: {} ts-interface-checker@0.1.13: {}
@ -14285,18 +14451,17 @@ snapshots:
is-typed-array: 1.1.13 is-typed-array: 1.1.13
possible-typed-array-names: 1.0.0 possible-typed-array-names: 1.0.0
typescript-eslint@8.13.0(eslint@9.14.0(jiti@1.21.6))(typescript@5.5.4): typescript-eslint@8.18.1(eslint@9.17.0(jiti@2.4.1))(typescript@5.7.2):
dependencies: dependencies:
"@typescript-eslint/eslint-plugin": 8.13.0(@typescript-eslint/parser@8.13.0(eslint@9.14.0(jiti@1.21.6))(typescript@5.5.4))(eslint@9.14.0(jiti@1.21.6))(typescript@5.5.4) "@typescript-eslint/eslint-plugin": 8.18.1(@typescript-eslint/parser@8.18.1(eslint@9.17.0(jiti@2.4.1))(typescript@5.7.2))(eslint@9.17.0(jiti@2.4.1))(typescript@5.7.2)
"@typescript-eslint/parser": 8.13.0(eslint@9.14.0(jiti@1.21.6))(typescript@5.5.4) "@typescript-eslint/parser": 8.18.1(eslint@9.17.0(jiti@2.4.1))(typescript@5.7.2)
"@typescript-eslint/utils": 8.13.0(eslint@9.14.0(jiti@1.21.6))(typescript@5.5.4) "@typescript-eslint/utils": 8.18.1(eslint@9.17.0(jiti@2.4.1))(typescript@5.7.2)
optionalDependencies: eslint: 9.17.0(jiti@2.4.1)
typescript: 5.5.4 typescript: 5.7.2
transitivePeerDependencies: transitivePeerDependencies:
- eslint
- supports-color - supports-color
typescript@5.5.4: {} typescript@5.7.2: {}
uglify-js@3.19.3: uglify-js@3.19.3:
optional: true optional: true
@ -14372,30 +14537,32 @@ snapshots:
spdx-correct: 3.2.0 spdx-correct: 3.2.0
spdx-expression-parse: 3.0.1 spdx-expression-parse: 3.0.1
vite-plugin-pwa@0.20.5(vite@5.4.10(@types/node@22.9.0)(terser@5.36.0))(workbox-build@7.3.0)(workbox-window@7.3.0): vite-plugin-pwa@0.21.1(vite@6.0.3(@types/node@22.9.0)(jiti@2.4.1)(terser@5.36.0)(yaml@2.6.1))(workbox-build@7.3.0)(workbox-window@7.3.0):
dependencies: dependencies:
debug: 4.3.7 debug: 4.3.7
pretty-bytes: 6.1.1 pretty-bytes: 6.1.1
tinyglobby: 0.2.10 tinyglobby: 0.2.10
vite: 5.4.10(@types/node@22.9.0)(terser@5.36.0) vite: 6.0.3(@types/node@22.9.0)(jiti@2.4.1)(terser@5.36.0)(yaml@2.6.1)
workbox-build: 7.3.0 workbox-build: 7.3.0
workbox-window: 7.3.0 workbox-window: 7.3.0
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
vite@5.4.10(@types/node@22.9.0)(terser@5.36.0): vite@6.0.3(@types/node@22.9.0)(jiti@2.4.1)(terser@5.36.0)(yaml@2.6.1):
dependencies: dependencies:
esbuild: 0.21.5 esbuild: 0.24.0
postcss: 8.4.47 postcss: 8.4.49
rollup: 4.24.4 rollup: 4.24.4
optionalDependencies: optionalDependencies:
"@types/node": 22.9.0 "@types/node": 22.9.0
fsevents: 2.3.3 fsevents: 2.3.3
jiti: 2.4.1
terser: 5.36.0 terser: 5.36.0
yaml: 2.6.1
w3c-keyname@2.2.8: {} w3c-keyname@2.2.8: {}
wavesurfer.js@7.8.8: {} wavesurfer.js@7.8.11: {}
wcwidth@1.0.1: wcwidth@1.0.1:
dependencies: dependencies:
@ -14608,10 +14775,10 @@ snapshots:
yallist@3.1.1: {} yallist@3.1.1: {}
yaml@2.5.1: {}
yaml@2.6.0: {} yaml@2.6.0: {}
yaml@2.6.1: {}
yargs-parser@18.1.3: yargs-parser@18.1.3:
dependencies: dependencies:
camelcase: 5.3.1 camelcase: 5.3.1

View file

@ -3,7 +3,6 @@
module.exports = { module.exports = {
plugins: [ plugins: [
require("postcss-reporter"), require("postcss-reporter"),
require("tailwindcss/nesting")(require("postcss-nesting")),
require("tailwindcss"), require("tailwindcss"),
require("postcss-preset-env")({ require("postcss-preset-env")({
stage: 4, stage: 4,

View file

@ -45,6 +45,7 @@ class ExampleDatabaseTest extends CIUnitTestCase
$model->delete($object->id); $model->delete($object->id);
// The model should no longer find it // The model should no longer find it
// @phpstan-ignore-next-line
$this->assertNull($model->find($object->id)); $this->assertNull($model->find($object->id));
// ... but it should still be in the database // ... but it should still be in the database

View file

@ -8,6 +8,7 @@ use CodeIgniter\Database\Seeder;
use CodeIgniter\Test\CIUnitTestCase; use CodeIgniter\Test\CIUnitTestCase;
use CodeIgniter\Test\DatabaseTestTrait; use CodeIgniter\Test\DatabaseTestTrait;
use CodeIgniter\Test\FeatureTestTrait; use CodeIgniter\Test\FeatureTestTrait;
use Override;
use Tests\Support\Database\Seeds\FakeSinglePodcastApiSeeder; use Tests\Support\Database\Seeds\FakeSinglePodcastApiSeeder;
class EpisodeTest extends CIUnitTestCase class EpisodeTest extends CIUnitTestCase
@ -45,11 +46,12 @@ class EpisodeTest extends CIUnitTestCase
*/ */
private array $episode = []; private array $episode = [];
private readonly string $apiUrl; private string $apiUrl = '';
public function __construct(?string $name = null) #[Override]
protected function setUp(): void
{ {
parent::__construct($name); parent::setUp();
$this->episode = FakeSinglePodcastApiSeeder::episode(); $this->episode = FakeSinglePodcastApiSeeder::episode();
@ -59,6 +61,15 @@ class EpisodeTest extends CIUnitTestCase
->gateway; ->gateway;
} }
#[Override]
protected function tearDown(): void
{
parent::tearDown();
restore_error_handler();
restore_exception_handler();
}
public function testList(): void public function testList(): void
{ {
$result = $this->call('get', $this->apiUrl . 'episodes'); $result = $this->call('get', $this->apiUrl . 'episodes');

View file

@ -8,6 +8,7 @@ use CodeIgniter\Database\Seeder;
use CodeIgniter\Test\CIUnitTestCase; use CodeIgniter\Test\CIUnitTestCase;
use CodeIgniter\Test\DatabaseTestTrait; use CodeIgniter\Test\DatabaseTestTrait;
use CodeIgniter\Test\FeatureTestTrait; use CodeIgniter\Test\FeatureTestTrait;
use Override;
use Tests\Support\Database\Seeds\FakeSinglePodcastApiSeeder; use Tests\Support\Database\Seeds\FakeSinglePodcastApiSeeder;
class PodcastTest extends CIUnitTestCase class PodcastTest extends CIUnitTestCase
@ -45,11 +46,13 @@ class PodcastTest extends CIUnitTestCase
*/ */
private array $podcast = []; private array $podcast = [];
private readonly string $podcastApiUrl; private string $podcastApiUrl = '';
public function __construct(?string $name = null) #[Override]
protected function setUp(): void
{ {
parent::__construct($name); parent::setUp();
$this->podcast = FakeSinglePodcastApiSeeder::podcast(); $this->podcast = FakeSinglePodcastApiSeeder::podcast();
$this->podcast['created_at'] = []; $this->podcast['created_at'] = [];
$this->podcast['updated_at'] = []; $this->podcast['updated_at'] = [];
@ -57,6 +60,15 @@ class PodcastTest extends CIUnitTestCase
->gateway; ->gateway;
} }
#[Override]
protected function tearDown(): void
{
parent::tearDown();
restore_error_handler();
restore_exception_handler();
}
public function testList(): void public function testList(): void
{ {
$result = $this->call('get', $this->podcastApiUrl . 'podcasts'); $result = $this->call('get', $this->podcastApiUrl . 'podcasts');

View file

@ -6,6 +6,7 @@ namespace Tests\Modules\Plugins;
use App\Entities\Episode; use App\Entities\Episode;
use App\Entities\Podcast; use App\Entities\Podcast;
use App\Libraries\HtmlHead;
use App\Libraries\RssFeed; use App\Libraries\RssFeed;
use CodeIgniter\Test\CIUnitTestCase; use CodeIgniter\Test\CIUnitTestCase;
use CodeIgniter\Test\DatabaseTestTrait; use CodeIgniter\Test\DatabaseTestTrait;
@ -111,11 +112,21 @@ final class PluginsTest extends CIUnitTestCase
self::$plugins->runHook('rssAfterItem', [$episode, $item]); self::$plugins->runHook('rssAfterItem', [$episode, $item]);
$this->assertFalse(empty($item->efoo)); $this->assertFalse(empty($item->efoo));
ob_start(); $head = new HtmlHead();
self::$plugins->runHook('siteHead', []); self::$plugins->runHook('siteHead', [$head]);
$result = ob_get_contents();
ob_end_clean(); //Discard output buffer $this->assertEquals(
$this->assertEquals('hello', $result); (string) $head,
'<head> <title >foo</title> <meta charset="UTF-8"/> <meta name="viewport" content="width=device-width, initial-scale=1.0"/> <link rel="icon" type="image/x-icon" href="http://localhost:8080/favicon.ico"/> <link rel="apple-touch-icon" href="http://localhost:8080/icon-180.png"/> <link rel="manifest" href="/manifest.webmanifest"/> <meta name="theme-color" content="#009486"/> <link rel="stylesheet" type="text/css" href="/themes/colors"/> <title >foo</title> <script>
// Check that service workers are supported
if (\'serviceWorker\' in navigator) {
// Use the window load event to keep the page load performant
window.addEventListener(\'load\', () => {
navigator.serviceWorker.register(\'/sw.js\');
});
}
</script></head>'
);
} }
public function testRunHooksInactive(): void public function testRunHooksInactive(): void

View file

@ -4,6 +4,7 @@ declare(strict_types=1);
use App\Entities\Episode; use App\Entities\Episode;
use App\Entities\Podcast; use App\Entities\Podcast;
use App\Libraries\HtmlHead;
use App\Libraries\RssFeed; use App\Libraries\RssFeed;
use Modules\Plugins\Core\BasePlugin; use Modules\Plugins\Core\BasePlugin;
@ -34,8 +35,8 @@ class AcmeAllHooksPlugin extends BasePlugin
} }
#[Override] #[Override]
public function siteHead(): void public function siteHead(HtmlHead $head): void
{ {
echo 'hello'; $head->tag('title', 'foo');
} }
} }

View file

@ -8,25 +8,12 @@ $isEpisodeArea = isset($podcast) && isset($episode);
<html lang="<?= service('request') <html lang="<?= service('request')
->getLocale() ?>"> ->getLocale() ?>">
<head> <?=
<meta charset="UTF-8"/> service('html_head')
<meta name="robots" content="noindex"> ->appendRawContent(service('vite')->asset('styles/index.css', 'css'))
->appendRawContent(service('vite')->asset('js/admin.ts', 'js'))
<title><?= $this->renderSection('title') ?> | Castopod Admin</title> ->appendRawContent(service('vite')->asset('js/admin-audio-player.ts', 'js'))
<meta name="description" content="Castopod is an open-source hosting platform made for podcasters who want engage and interact with their audience."/> ?>
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
<link rel="icon" type="image/x-icon" href="<?= get_site_icon_url('ico') ?>" />
<link rel="apple-touch-icon" href="<?= get_site_icon_url('180') ?>">
<link rel="manifest" href="<?= route_to('webmanifest') ?>">
<link rel='stylesheet' type='text/css' href='<?= route_to('themes-colors-css') ?>' />
<?= service('vite')
->asset('styles/index.css', 'css') ?>
<?= service('vite')
->asset('js/admin.ts', 'js') ?>
<?= service('vite')
->asset('js/admin-audio-player.ts', 'js') ?>
</head>
<body class="relative grid items-start min-h-screen bg-base grid-cols-admin grid-rows-admin"> <body class="relative grid items-start min-h-screen bg-base grid-cols-admin grid-rows-admin">
<?= $this->include('_partials/_nav_header') ?> <?= $this->include('_partials/_nav_header') ?>
@ -39,7 +26,7 @@ $isEpisodeArea = isset($podcast) && isset($episode);
<div class="flex flex-wrap items-center truncate gap-x-2"> <div class="flex flex-wrap items-center truncate gap-x-2">
<?php if (($isEpisodeArea && $episode->is_premium) || ($isPodcastArea && $podcast->is_premium)): ?> <?php if (($isEpisodeArea && $episode->is_premium) || ($isPodcastArea && $podcast->is_premium)): ?>
<div class="inline-flex items-center"> <div class="inline-flex items-center">
<?php // @icon('exchange-dollar-fill')?> <?php // @icon("exchange-dollar-fill")?>
<x-IconButton uri="<?= route_to('subscription-list', $podcast->id) ?>" glyph="exchange-dollar-fill" variant="secondary" size="large" class="p-0 mr-2 border-0"><?= ($isEpisodeArea && $episode->is_premium) ? lang('PremiumPodcasts.episode_is_premium') : lang('PremiumPodcasts.podcast_is_premium') ?></x-IconButton> <x-IconButton uri="<?= route_to('subscription-list', $podcast->id) ?>" glyph="exchange-dollar-fill" variant="secondary" size="large" class="p-0 mr-2 border-0"><?= ($isEpisodeArea && $episode->is_premium) ? lang('PremiumPodcasts.episode_is_premium') : lang('PremiumPodcasts.podcast_is_premium') ?></x-IconButton>
<x-Heading tagName="h1" size="large" class="max-w-sm truncate"><?= $this->renderSection('pageTitle') ?></x-Heading> <x-Heading tagName="h1" size="large" class="max-w-sm truncate"><?= $this->renderSection('pageTitle') ?></x-Heading>
</div> </div>

View file

@ -7,11 +7,11 @@ use Modules\Auth\Models\UserModel;
$navigation = [ $navigation = [
'dashboard' => [ 'dashboard' => [
'icon' => 'dashboard-fill', // @icon('dashboard-fill') 'icon' => 'dashboard-fill', // @icon("dashboard-fill")
'items' => ['admin'], 'items' => ['admin'],
], ],
'podcasts' => [ 'podcasts' => [
'icon' => 'mic-fill', // @icon('mic-fill') 'icon' => 'mic-fill', // @icon("mic-fill")
'items' => ['podcast-list', 'podcast-create', 'all-podcast-imports', 'podcast-imports-add'], 'items' => ['podcast-list', 'podcast-create', 'all-podcast-imports', 'podcast-imports-add'],
'items-permissions' => [ 'items-permissions' => [
'podcast-create' => 'podcasts.create', 'podcast-create' => 'podcasts.create',
@ -22,7 +22,7 @@ $navigation = [
'count-route' => 'podcast-list', 'count-route' => 'podcast-list',
], ],
'plugins' => [ 'plugins' => [
'icon' => 'puzzle-fill', // @icon('puzzle-fill') 'icon' => 'puzzle-fill', // @icon("puzzle-fill")
'items' => ['plugins-installed'], 'items' => ['plugins-installed'],
'items-labels' => [ 'items-labels' => [
'plugins-installed' => lang('Navigation.plugins-installed') . ' (' . service('plugins')->getInstalledCount() . ')', 'plugins-installed' => lang('Navigation.plugins-installed') . ' (' . service('plugins')->getInstalledCount() . ')',
@ -34,7 +34,7 @@ $navigation = [
'count-route' => 'plugins-installed', 'count-route' => 'plugins-installed',
], ],
'persons' => [ 'persons' => [
'icon' => 'folder-user-fill', // @icon('folder-user-fill') 'icon' => 'folder-user-fill', // @icon("folder-user-fill")
'items' => ['person-list', 'person-create'], 'items' => ['person-list', 'person-create'],
'items-permissions' => [ 'items-permissions' => [
'person-list' => 'persons.manage', 'person-list' => 'persons.manage',
@ -45,7 +45,7 @@ $navigation = [
'count-route' => 'person-list', 'count-route' => 'person-list',
], ],
'fediverse' => [ 'fediverse' => [
'icon' => 'rocket-2-fill', // @icon('rocket-2-fill') 'icon' => 'rocket-2-fill', // @icon("rocket-2-fill")
'items' => ['fediverse-blocked-actors', 'fediverse-blocked-domains'], 'items' => ['fediverse-blocked-actors', 'fediverse-blocked-domains'],
'items-permissions' => [ 'items-permissions' => [
'fediverse-blocked-actors' => 'fediverse.manage-blocks', 'fediverse-blocked-actors' => 'fediverse.manage-blocks',
@ -53,7 +53,7 @@ $navigation = [
], ],
], ],
'users' => [ 'users' => [
'icon' => 'group-fill', // @icon('group-fill') 'icon' => 'group-fill', // @icon("group-fill")
'items' => ['user-list', 'user-create'], 'items' => ['user-list', 'user-create'],
'items-permissions' => [ 'items-permissions' => [
'user-list' => 'users.manage', 'user-list' => 'users.manage',
@ -64,7 +64,7 @@ $navigation = [
'count-route' => 'user-list', 'count-route' => 'user-list',
], ],
'pages' => [ 'pages' => [
'icon' => 'pages-fill', // @icon('pages-fill') 'icon' => 'pages-fill', // @icon("pages-fill")
'items' => ['page-list', 'page-create'], 'items' => ['page-list', 'page-create'],
'items-permissions' => [ 'items-permissions' => [
'page-list' => 'pages.manage', 'page-list' => 'pages.manage',
@ -75,7 +75,7 @@ $navigation = [
'count-route' => 'page-list', 'count-route' => 'page-list',
], ],
'settings' => [ 'settings' => [
'icon' => 'settings-3-fill', // @icon('settings-3-fill') 'icon' => 'settings-3-fill', // @icon("settings-3-fill")
'items' => ['settings-general', 'settings-theme', 'admin-about'], 'items' => ['settings-general', 'settings-theme', 'admin-about'],
'items-permissions' => [ 'items-permissions' => [
'settings-general' => 'admin.settings', 'settings-general' => 'admin.settings',

View file

@ -1,9 +1,5 @@
<?= $this->extend('_layout') ?> <?= $this->extend('_layout') ?>
<?= $this->section('title') ?>
<?= lang('Contributor.add_contributor', [esc($podcast->title)]) ?>
<?= $this->endSection() ?>
<?= $this->section('pageTitle') ?> <?= $this->section('pageTitle') ?>
<?= lang('Contributor.add_contributor', [esc($podcast->title)]) ?> <?= lang('Contributor.add_contributor', [esc($podcast->title)]) ?>
<?= $this->endSection() ?> <?= $this->endSection() ?>

View file

@ -1,11 +1,5 @@
<?= $this->extend('_layout') ?> <?= $this->extend('_layout') ?>
<?= $this->section('title') ?>
<?= lang('Contributor.delete_form.title', [
'contributor' => $contributor->username,
]) ?>
<?= $this->endSection() ?>
<?= $this->section('pageTitle') ?> <?= $this->section('pageTitle') ?>
<?= lang('Contributor.delete_form.title', [ <?= lang('Contributor.delete_form.title', [
'contributor' => $contributor->username, 'contributor' => $contributor->username,

View file

@ -1,9 +1,5 @@
<?= $this->extend('_layout') ?> <?= $this->extend('_layout') ?>
<?= $this->section('title') ?>
<?= lang('Contributor.edit_role', [esc($contributor->username)]) ?>
<?= $this->endSection() ?>
<?= $this->section('pageTitle') ?> <?= $this->section('pageTitle') ?>
<?= lang('Contributor.edit_role', [esc($contributor->username)]) ?> <?= lang('Contributor.edit_role', [esc($contributor->username)]) ?>
<?= $this->endSection() ?> <?= $this->endSection() ?>

View file

@ -1,15 +1,11 @@
<?= $this->extend('_layout') ?> <?= $this->extend('_layout') ?>
<?= $this->section('title') ?>
<?= lang('Contributor.podcast_contributors') ?>
<?= $this->endSection() ?>
<?= $this->section('pageTitle') ?> <?= $this->section('pageTitle') ?>
<?= lang('Contributor.podcast_contributors') ?> <?= lang('Contributor.podcast_contributors') ?>
<?= $this->endSection() ?> <?= $this->endSection() ?>
<?= $this->section('headerRight') ?> <?= $this->section('headerRight') ?>
<?php // @icon('add-fill')?> <?php // @icon("add-fill")?>
<x-Button uri="<?= route_to('contributor-add', $podcast->id) ?>" variant="primary" iconLeft="add-fill"><?= lang('Contributor.add') ?></x-Button> <x-Button uri="<?= route_to('contributor-add', $podcast->id) ?>" variant="primary" iconLeft="add-fill"><?= lang('Contributor.add') ?></x-Button>
<?= $this->endSection() ?> <?= $this->endSection() ?>
@ -39,8 +35,8 @@
[ [
'header' => lang('Common.actions'), 'header' => lang('Common.actions'),
'cell' => function ($contributor, $podcast) { 'cell' => function ($contributor, $podcast) {
// @icon('pencil-fill') // @icon("pencil-fill")
// @icon('delete-bin-fill') // @icon("delete-bin-fill")
return '<x-Button uri="' . route_to('contributor-edit', $podcast->id, $contributor->id) . '" variant="secondary" iconLeft="pencil-fill" size="small">' . lang('Contributor.edit') . '</x-Button>' . return '<x-Button uri="' . route_to('contributor-edit', $podcast->id, $contributor->id) . '" variant="secondary" iconLeft="pencil-fill" size="small">' . lang('Contributor.edit') . '</x-Button>' .
'<x-Button uri="' . route_to('contributor-remove', $podcast->id, $contributor->id) . '" variant="danger" iconLeft="delete-bin-fill" size="small">' . lang('Contributor.remove') . '</x-Button>'; '<x-Button uri="' . route_to('contributor-remove', $podcast->id, $contributor->id) . '" variant="danger" iconLeft="delete-bin-fill" size="small">' . lang('Contributor.remove') . '</x-Button>';
}, },

View file

@ -1,12 +1,5 @@
<?= $this->extend('_layout') ?> <?= $this->extend('_layout') ?>
<?= $this->section('title') ?>
<?= lang('Contributor.view', [
'username' => esc($contributor->username),
'podcastTitle' => esc($podcast->title),
]) ?>
<?= $this->endSection() ?>
<?= $this->section('pageTitle') ?> <?= $this->section('pageTitle') ?>
<?= lang('Contributor.view', [ <?= lang('Contributor.view', [
'username' => esc($contributor->username), 'username' => esc($contributor->username),

View file

@ -1,10 +1,5 @@
<?= helper('components') ?>
<?= $this->extend('_layout') ?> <?= $this->extend('_layout') ?>
<?= $this->section('title') ?>
<?= lang('Dashboard.home') ?>
<?= $this->endSection() ?>
<?= $this->section('pageTitle') ?> <?= $this->section('pageTitle') ?>
<?= lang('Dashboard.home') ?> <?= lang('Dashboard.home') ?>
<?= $this->endSection() ?> <?= $this->endSection() ?>
@ -12,15 +7,15 @@
<?= $this->section('content') ?> <?= $this->section('content') ?>
<div class="flex flex-col items-stretch gap-4 lg:flex-row"> <div class="flex flex-col items-stretch gap-4 lg:flex-row">
<?php // @icon('mic-fill')?> <?php // @icon("mic-fill")?>
<x-DashboardCard href="<?= $onlyPodcastId === null ? route_to('podcast-list') : route_to('podcast-view', $onlyPodcastId) ?>" glyph="mic-fill" title="<?= lang('Dashboard.podcasts.title') ?>" subtitle="<?= $podcastsData['last_published_at'] ? esc(lang('Dashboard.podcasts.last_published', [ <x-DashboardCard href="<?= $onlyPodcastId === null ? route_to('podcast-list') : route_to('podcast-view', $onlyPodcastId) ?>" glyph="mic-fill" title="<?= lang('Dashboard.podcasts.title') ?>" subtitle="<?= $podcastsData['last_published_at'] ? esc(lang('Dashboard.podcasts.last_published', [
'lastPublicationDate' => local_date($podcastsData['last_published_at']), 'lastPublicationDate' => local_date($podcastsData['last_published_at']),
], null, false)) : lang('Dashboard.podcasts.not_found') ?>"><?= $podcastsData['number_of_podcasts'] ?></x-DashboardCard> ], null, false)) : lang('Dashboard.podcasts.not_found') ?>"><?= $podcastsData['number_of_podcasts'] ?></x-DashboardCard>
<?php // @icon('play-fill')?> <?php // @icon("play-fill")?>
<x-DashboardCard href="<?= $onlyPodcastId === null ? '' : route_to('episode-list', $onlyPodcastId) ?>" glyph="play-fill" title="<?= lang('Dashboard.episodes.title') ?>" subtitle="<?= $episodesData['last_published_at'] ? esc(lang('Dashboard.episodes.last_published', [ <x-DashboardCard href="<?= $onlyPodcastId === null ? '' : route_to('episode-list', $onlyPodcastId) ?>" glyph="play-fill" title="<?= lang('Dashboard.episodes.title') ?>" subtitle="<?= $episodesData['last_published_at'] ? esc(lang('Dashboard.episodes.last_published', [
'lastPublicationDate' => local_date($episodesData['last_published_at']), 'lastPublicationDate' => local_date($episodesData['last_published_at']),
], null, false)) : lang('Dashboard.episodes.not_found') ?>"><?= $episodesData['number_of_episodes'] ?></x-DashboardCard> ], null, false)) : lang('Dashboard.episodes.not_found') ?>"><?= $episodesData['number_of_episodes'] ?></x-DashboardCard>
<?php // @icon('database-2-fill')?> <?php // @icon("database-2-fill")?>
<x-DashboardCard glyph="database-2-fill" title="<?= lang('Dashboard.storage.title') ?>" subtitle="<?= lang('Dashboard.storage.subtitle', [ <x-DashboardCard glyph="database-2-fill" title="<?= lang('Dashboard.storage.title') ?>" subtitle="<?= lang('Dashboard.storage.subtitle', [
'totalUploaded' => $storageData['total_uploaded'], 'totalUploaded' => $storageData['total_uploaded'],
'totalStorage' => $storageData['limit'], 'totalStorage' => $storageData['limit'],

View file

@ -2,7 +2,7 @@
$episodeNavigation = [ $episodeNavigation = [
'dashboard' => [ 'dashboard' => [
'icon' => 'dashboard-fill', // @icon('dashboard-fill') 'icon' => 'dashboard-fill', // @icon("dashboard-fill")
'items' => ['episode-view', 'episode-edit', 'episode-persons-manage', 'embed-add'], 'items' => ['episode-view', 'episode-edit', 'episode-persons-manage', 'embed-add'],
'items-permissions' => [ 'items-permissions' => [
'episode-view' => 'episodes.view', 'episode-view' => 'episodes.view',
@ -12,13 +12,13 @@ $episodeNavigation = [
], ],
], ],
'plugins' => [ 'plugins' => [
'icon' => 'puzzle-fill', // @icon('puzzle-fill') 'icon' => 'puzzle-fill', // @icon("puzzle-fill")
'items' => [], 'items' => [],
'items-labels' => [], 'items-labels' => [],
'items-permissions' => [], 'items-permissions' => [],
], ],
'clips' => [ 'clips' => [
'icon' => 'clapperboard-fill', // @icon('clapperboard-fill') 'icon' => 'clapperboard-fill', // @icon("clapperboard-fill")
'items' => ['video-clips-list', 'video-clips-create', 'soundbites-list', 'soundbites-create'], 'items' => ['video-clips-list', 'video-clips-create', 'soundbites-list', 'soundbites-create'],
'items-permissions' => [ 'items-permissions' => [
'video-clips-list' => 'episodes.manage-clips', 'video-clips-list' => 'episodes.manage-clips',

View file

@ -1,9 +1,5 @@
<?= $this->extend('_layout') ?> <?= $this->extend('_layout') ?>
<?= $this->section('title') ?>
<?= lang('Episode.create') ?>
<?= $this->endSection() ?>
<?= $this->section('pageTitle') ?> <?= $this->section('pageTitle') ?>
<?= lang('Episode.create') ?> <?= lang('Episode.create') ?>
<?= $this->endSection() ?> <?= $this->endSection() ?>

View file

@ -1,9 +1,5 @@
<?= $this->extend('_layout') ?> <?= $this->extend('_layout') ?>
<?= $this->section('title') ?>
<?= lang('Episode.delete') ?>
<?= $this->endSection() ?>
<?= $this->section('pageTitle') ?> <?= $this->section('pageTitle') ?>
<?= lang('Episode.delete') ?> <?= lang('Episode.delete') ?>
<?= $this->endSection() ?> <?= $this->endSection() ?>

View file

@ -1,9 +1,5 @@
<?= $this->extend('_layout') ?> <?= $this->extend('_layout') ?>
<?= $this->section('title') ?>
<?= lang('Episode.edit') ?>
<?= $this->endSection() ?>
<?= $this->section('pageTitle') ?> <?= $this->section('pageTitle') ?>
<?= lang('Episode.edit') ?> <?= lang('Episode.edit') ?>
<?= $this->endSection() ?> <?= $this->endSection() ?>
@ -279,10 +275,10 @@
</form> </form>
<?php if ($episode->published_at === null): ?> <?php if ($episode->published_at === null): ?>
<?php // @icon('delete-bin-fill')?> <?php // @icon("delete-bin-fill")?>
<x-Button class="mt-8" variant="danger" uri="<?= route_to('episode-delete', $podcast->id, $episode->id) ?>" iconLeft="delete-bin-fill"><?= lang('Episode.delete') ?></x-Button> <x-Button class="mt-8" variant="danger" uri="<?= route_to('episode-delete', $podcast->id, $episode->id) ?>" iconLeft="delete-bin-fill"><?= lang('Episode.delete') ?></x-Button>
<?php else: ?> <?php else: ?>
<?php // @icon('forbid-fill')?> <?php // @icon("forbid-fill")?>
<x-Button class="mt-8" variant="disabled" iconLeft="forbid-fill" data-tooltip="right" title="<?= lang('Episode.messages.unpublishBeforeDeleteTip') ?>"><?= lang('Episode.delete') ?></x-Button> <x-Button class="mt-8" variant="disabled" iconLeft="forbid-fill" data-tooltip="right" title="<?= lang('Episode.messages.unpublishBeforeDeleteTip') ?>"><?= lang('Episode.delete') ?></x-Button>
<?php endif ?> <?php endif ?>

View file

@ -6,10 +6,6 @@ $embedHeight = config('Embed')->height;
<?= $this->extend('_layout') ?> <?= $this->extend('_layout') ?>
<?= $this->section('title') ?>
<?= lang('Episode.embed.title') ?>
<?= $this->endSection() ?>
<?= $this->section('pageTitle') ?> <?= $this->section('pageTitle') ?>
<?= lang('Episode.embed.title') ?> <?= lang('Episode.embed.title') ?>
<?= $this->endSection() ?> <?= $this->endSection() ?>
@ -34,13 +30,13 @@ $embedHeight = config('Embed')->height;
<div class="flex items-center mt-8 gap-x-2"> <div class="flex items-center mt-8 gap-x-2">
<x-Forms.Textarea isReadonly="true" class="w-full max-w-xl" name="iframe" rows="2" value="<?= esc("<iframe width=\"100%\" height=\"{$embedHeight}\" frameborder=\"0\" scrolling=\"no\" style=\"width: 100%; height: {$embedHeight}px; overflow: hidden;\" src=\"{$episode->embed_url}\"></iframe>") ?>" /> <x-Forms.Textarea isReadonly="true" class="w-full max-w-xl" name="iframe" rows="2" value="<?= esc("<iframe width=\"100%\" height=\"{$embedHeight}\" frameborder=\"0\" scrolling=\"no\" style=\"width: 100%; height: {$embedHeight}px; overflow: hidden;\" src=\"{$episode->embed_url}\"></iframe>") ?>" />
<?php // @icon('file-copy-fill')?> <?php // @icon("file-copy-fill")?>
<x-IconButton glyph="file-copy-fill" data-type="clipboard-copy" data-clipboard-target="iframe"><?= lang('Episode.embed.clipboard_iframe') ?></x-IconButton> <x-IconButton glyph="file-copy-fill" data-type="clipboard-copy" data-clipboard-target="iframe"><?= lang('Episode.embed.clipboard_iframe') ?></x-IconButton>
</div> </div>
<div class="flex items-center mt-4 gap-x-2"> <div class="flex items-center mt-4 gap-x-2">
<x-Forms.Input isReadonly="true" class="w-full max-w-xl" name="url" value="<?= esc($episode->embed_url) ?>" /> <x-Forms.Input isReadonly="true" class="w-full max-w-xl" name="url" value="<?= esc($episode->embed_url) ?>" />
<?php // @icon('file-copy-fill')?> <?php // @icon("file-copy-fill")?>
<x-IconButton glyph="file-copy-fill" data-type="clipboard-copy" data-clipboard-target="url"><?= lang('Episode.embed.clipboard_url') ?></x-IconButton> <x-IconButton glyph="file-copy-fill" data-type="clipboard-copy" data-clipboard-target="url"><?= lang('Episode.embed.clipboard_url') ?></x-IconButton>
</div> </div>

View file

@ -1,15 +1,11 @@
<?= $this->extend('_layout') ?> <?= $this->extend('_layout') ?>
<?= $this->section('title') ?>
<?= lang('Episode.all_podcast_episodes') ?>
<?= $this->endSection() ?>
<?= $this->section('pageTitle') ?> <?= $this->section('pageTitle') ?>
<?= lang('Episode.all_podcast_episodes') ?> <?= lang('Episode.all_podcast_episodes') ?>
<?= $this->endSection() ?> <?= $this->endSection() ?>
<?= $this->section('headerRight') ?> <?= $this->section('headerRight') ?>
<?php // @icon('add-fill')?> <?php // @icon("add-fill")?>
<x-Button uri="<?= route_to('episode-create', $podcast->id) ?>" variant="primary" iconLeft="add-fill"><?= lang('Episode.create') ?></x-Button> <x-Button uri="<?= route_to('episode-create', $podcast->id) ?>" variant="primary" iconLeft="add-fill"><?= lang('Episode.create') ?></x-Button>
<?= $this->endSection() ?> <?= $this->endSection() ?>

View file

@ -1,15 +1,11 @@
<?= $this->extend('_layout') ?> <?= $this->extend('_layout') ?>
<?= $this->section('title') ?>
<?= lang('Person.episode_form.title') ?>
<?= $this->endSection() ?>
<?= $this->section('pageTitle') ?> <?= $this->section('pageTitle') ?>
<?= lang('Person.episode_form.title') ?> (<?= count($episode->persons) ?>) <?= lang('Person.episode_form.title') ?> (<?= count($episode->persons) ?>)
<?= $this->endSection() ?> <?= $this->endSection() ?>
<?= $this->section('headerRight') ?> <?= $this->section('headerRight') ?>
<?php // @icon('add-fill')?> <?php // @icon("add-fill")?>
<x-Button variant="primary" uri="<?= route_to('person-create') ?>" iconLeft="add-fill"><?= lang('Person.create') ?></x-Button> <x-Button variant="primary" uri="<?= route_to('person-create') ?>" iconLeft="add-fill"><?= lang('Person.create') ?></x-Button>
<?= $this->endSection() ?> <?= $this->endSection() ?>
@ -86,7 +82,7 @@
[ [
'header' => lang('Common.actions'), 'header' => lang('Common.actions'),
'cell' => function ($person): string { 'cell' => function ($person): string {
// @icon('delete-bin-fill') // @icon("delete-bin-fill")
return '<x-Button uri="' . route_to('episode-person-remove', $person->podcast_id, $person->episode_id, $person->id) . '" variant="danger" size="small" iconLeft="delete-bin-fill">' . lang('Person.episode_form.remove') . '</x-Button>'; return '<x-Button uri="' . route_to('episode-person-remove', $person->podcast_id, $person->episode_id, $person->id) . '" variant="danger" size="small" iconLeft="delete-bin-fill">' . lang('Person.episode_form.remove') . '</x-Button>';
}, },
], ],

View file

@ -1,9 +1,5 @@
<?= $this->extend('_layout') ?> <?= $this->extend('_layout') ?>
<?= $this->section('title') ?>
<?= lang('Episode.publish') ?>
<?= $this->endSection() ?>
<?= $this->section('pageTitle') ?> <?= $this->section('pageTitle') ?>
<?= lang('Episode.publish') ?> <?= lang('Episode.publish') ?>
<?= $this->endSection() ?> <?= $this->endSection() ?>

View file

@ -1,9 +1,5 @@
<?= $this->extend('_layout') ?> <?= $this->extend('_layout') ?>
<?= $this->section('title') ?>
<?= lang('Episode.publish_date_edit') ?>
<?= $this->endSection() ?>
<?= $this->section('pageTitle') ?> <?= $this->section('pageTitle') ?>
<?= lang('Episode.publish_date_edit') ?> <?= lang('Episode.publish_date_edit') ?>
<?= $this->endSection() ?> <?= $this->endSection() ?>

View file

@ -1,9 +1,5 @@
<?= $this->extend('_layout') ?> <?= $this->extend('_layout') ?>
<?= $this->section('title') ?>
<?= lang('Episode.publish_edit') ?>
<?= $this->endSection() ?>
<?= $this->section('pageTitle') ?> <?= $this->section('pageTitle') ?>
<?= lang('Episode.publish_edit') ?> <?= lang('Episode.publish_edit') ?>
<?= $this->endSection() ?> <?= $this->endSection() ?>

View file

@ -1,15 +1,11 @@
<?= $this->extend('_layout') ?> <?= $this->extend('_layout') ?>
<?= $this->section('title') ?>
<?= lang('Soundbite.list.title') ?>
<?= $this->endSection() ?>
<?= $this->section('pageTitle') ?> <?= $this->section('pageTitle') ?>
<?= lang('Soundbite.list.title') ?> <?= lang('Soundbite.list.title') ?>
<?= $this->endSection() ?> <?= $this->endSection() ?>
<?= $this->section('headerRight') ?> <?= $this->section('headerRight') ?>
<?php // @icon('add-fill')?> <?php // @icon("add-fill")?>
<x-Button uri="<?= route_to('soundbites-create', $podcast->id, $episode->id) ?>" variant="primary" iconLeft="add-fill"><?= lang('Soundbite.create') ?></x-Button> <x-Button uri="<?= route_to('soundbites-create', $podcast->id, $episode->id) ?>" variant="primary" iconLeft="add-fill"><?= lang('Soundbite.create') ?></x-Button>
<?= $this->endSection() ?> <?= $this->endSection() ?>

View file

@ -1,9 +1,5 @@
<?= $this->extend('_layout') ?> <?= $this->extend('_layout') ?>
<?= $this->section('title') ?>
<?= lang('Soundbite.form.title') ?>
<?= $this->endSection() ?>
<?= $this->section('pageTitle') ?> <?= $this->section('pageTitle') ?>
<?= lang('Soundbite.form.title') ?> <?= lang('Soundbite.form.title') ?>
<?= $this->endSection() ?> <?= $this->endSection() ?>
@ -28,7 +24,7 @@
<input slot="duration" type="number" name="duration" placeholder="<?= lang('VideoClip.form.duration') ?>" step="0.001" /> <input slot="duration" type="number" name="duration" placeholder="<?= lang('VideoClip.form.duration') ?>" step="0.001" />
</audio-clipper> </audio-clipper>
<?php // @icon('arrow-right-fill')?> <?php // @icon("arrow-right-fill")?>
<x-Button variant="primary" type="submit" class="self-end mt-4" iconRight="arrow-right-fill"><?= lang('Soundbite.form.submit') ?></x-Button> <x-Button variant="primary" type="submit" class="self-end mt-4" iconRight="arrow-right-fill"><?= lang('Soundbite.form.submit') ?></x-Button>
</form> </form>

View file

@ -1,9 +1,5 @@
<?= $this->extend('_layout') ?> <?= $this->extend('_layout') ?>
<?= $this->section('title') ?>
<?= lang('Episode.unpublish') ?>
<?= $this->endSection() ?>
<?= $this->section('pageTitle') ?> <?= $this->section('pageTitle') ?>
<?= lang('Episode.unpublish') ?> <?= lang('Episode.unpublish') ?>
<?= $this->endSection() ?> <?= $this->endSection() ?>

View file

@ -1,11 +1,5 @@
<?= $this->extend('_layout') ?> <?= $this->extend('_layout') ?>
<?= $this->section('title') ?>
<?= lang('VideoClip.title', [
'videoClipLabel' => esc($videoClip->title),
]) ?>
<?= $this->endSection() ?>
<?= $this->section('pageTitle') ?> <?= $this->section('pageTitle') ?>
<?= lang('VideoClip.title', [ <?= lang('VideoClip.title', [
'videoClipLabel' => esc($videoClip->title), 'videoClipLabel' => esc($videoClip->title),

View file

@ -6,16 +6,12 @@ use CodeIgniter\I18n\Time;
?> ?>
<?= $this->extend('_layout') ?> <?= $this->extend('_layout') ?>
<?= $this->section('title') ?>
<?= lang('VideoClip.list.title') ?>
<?= $this->endSection() ?>
<?= $this->section('pageTitle') ?> <?= $this->section('pageTitle') ?>
<?= lang('VideoClip.list.title') ?> <?= lang('VideoClip.list.title') ?>
<?= $this->endSection() ?> <?= $this->endSection() ?>
<?= $this->section('headerRight') ?> <?= $this->section('headerRight') ?>
<?php // @icon('add-fill')?> <?php // @icon("add-fill")?>
<x-Button uri="<?= route_to('video-clips-create', $podcast->id, $episode->id) ?>" variant="primary" iconLeft="add-fill"><?= lang('VideoClip.create') ?></x-Button> <x-Button uri="<?= route_to('video-clips-create', $podcast->id, $episode->id) ?>" variant="primary" iconLeft="add-fill"><?= lang('VideoClip.create') ?></x-Button>
<?= $this->endSection() ?> <?= $this->endSection() ?>
@ -35,12 +31,12 @@ use CodeIgniter\I18n\Time;
]; ];
$pillIconMap = [ $pillIconMap = [
'queued' => 'timer-fill', // @icon('timer-fill') 'queued' => 'timer-fill', // @icon("timer-fill")
'pending' => 'pause-fill', // @icon('pause-fill') 'pending' => 'pause-fill', // @icon("pause-fill")
'running' => 'loader-fill', // @icon('loader-fill') 'running' => 'loader-fill', // @icon("loader-fill")
'canceled' => 'forbid-fill', // @icon('forbid-fill') 'canceled' => 'forbid-fill', // @icon("forbid-fill")
'failed' => 'close-fill', // @icon('close-fill') 'failed' => 'close-fill', // @icon("close-fill")
'passed' => 'check-fill', // @icon('check-fill') 'passed' => 'check-fill', // @icon("check-fill")
]; ];
$pillIconClassMap = [ $pillIconClassMap = [
@ -97,7 +93,7 @@ use CodeIgniter\I18n\Time;
if ($videoClip->media) { if ($videoClip->media) {
helper('misc'); helper('misc');
$filename = 'clip-' . slugify($videoClip->title) . "-{$videoClip->start_time}-{$videoClip->end_time}"; $filename = 'clip-' . slugify($videoClip->title) . "-{$videoClip->start_time}-{$videoClip->end_time}";
// @icon('import-fill') // @icon("import-fill")
$downloadButton = '<x-IconButton glyph="import-fill" uri="' . $videoClip->media->file_url . '" download="' . $filename . '">' . lang('VideoClip.download_clip') . '</x-IconButton>'; $downloadButton = '<x-IconButton glyph="import-fill" uri="' . $videoClip->media->file_url . '" download="' . $filename . '">' . lang('VideoClip.download_clip') . '</x-IconButton>';
} }

View file

@ -1,13 +1,5 @@
<?php declare(strict_types=1);
?>
<?= $this->extend('_layout') ?> <?= $this->extend('_layout') ?>
<?= $this->section('title') ?>
<?= lang('VideoClip.form.title') ?>
<?= $this->endSection() ?>
<?= $this->section('pageTitle') ?> <?= $this->section('pageTitle') ?>
<?= lang('VideoClip.form.title') ?> <?= lang('VideoClip.form.title') ?>
<?= $this->endSection() ?> <?= $this->endSection() ?>
@ -71,7 +63,7 @@
</div> </div>
</fieldset> </fieldset>
</x-Forms.Section> </x-Forms.Section>
<?php // @icon('arrow-right-fill')?> <?php // @icon("arrow-right-fill")?>
<x-Button variant="primary" type="submit" iconRight="arrow-right-fill" class="self-end"><?= lang('VideoClip.form.submit') ?></x-Button> <x-Button variant="primary" type="submit" iconRight="arrow-right-fill" class="self-end"><?= lang('VideoClip.form.submit') ?></x-Button>
</div> </div>
</form> </form>

View file

@ -1,9 +1,5 @@
<?= $this->extend('_layout') ?> <?= $this->extend('_layout') ?>
<?= $this->section('title') ?>
<?= lang('VideoClip.form.title') ?>
<?= $this->endSection() ?>
<?= $this->section('pageTitle') ?> <?= $this->section('pageTitle') ?>
<?= lang('VideoClip.form.title') ?> <?= lang('VideoClip.form.title') ?>
<?= $this->endSection() ?> <?= $this->endSection() ?>

View file

@ -1,9 +1,5 @@
<?= $this->extend('_layout') ?> <?= $this->extend('_layout') ?>
<?= $this->section('title') ?>
<?= esc($episode->title) ?>
<?= $this->endSection() ?>
<?= $this->section('pageTitle') ?> <?= $this->section('pageTitle') ?>
<?= esc($episode->title) ?> <?= esc($episode->title) ?>
<?= $this->endSection() ?> <?= $this->endSection() ?>
@ -18,7 +14,7 @@
<?= $this->section('headerRight') ?> <?= $this->section('headerRight') ?>
<?php if ($episode->publication_status === 'published'): ?> <?php if ($episode->publication_status === 'published'): ?>
<?php // @icon('history-fill')?> <?php // @icon("history-fill")?>
<x-IconButton <x-IconButton
uri="<?= route_to('episode-publish_date_edit', $podcast->id, $episode->id) ?>" uri="<?= route_to('episode-publish_date_edit', $podcast->id, $episode->id) ?>"
glyph="history-fill" glyph="history-fill"

View file

@ -1,9 +1,5 @@
<?= $this->extend('_layout') ?> <?= $this->extend('_layout') ?>
<?= $this->section('title') ?>
<?= lang('Fediverse.blocked_actors') ?>
<?= $this->endSection() ?>
<?= $this->section('pageTitle') ?> <?= $this->section('pageTitle') ?>
<?= lang('Fediverse.blocked_actors') ?> <?= lang('Fediverse.blocked_actors') ?>
<?= $this->endSection() ?> <?= $this->endSection() ?>

View file

@ -1,9 +1,5 @@
<?= $this->extend('_layout') ?> <?= $this->extend('_layout') ?>
<?= $this->section('title') ?>
<?= lang('Fediverse.blocked_domains') ?>
<?= $this->endSection() ?>
<?= $this->section('pageTitle') ?> <?= $this->section('pageTitle') ?>
<?= lang('Fediverse.blocked_domains') ?> <?= lang('Fediverse.blocked_domains') ?>
<?= $this->endSection() ?> <?= $this->endSection() ?>

View file

@ -21,12 +21,12 @@ use Modules\PodcastImport\Entities\TaskStatus;
]; ];
$pillIconMap = [ $pillIconMap = [
'queued' => 'timer-fill', // @icon('timer-fill') 'queued' => 'timer-fill', // @icon("timer-fill")
'pending' => 'pause-fill', // @icon('pause-fill') 'pending' => 'pause-fill', // @icon("pause-fill")
'running' => 'loader-fill', // @icon('loader-fill') 'running' => 'loader-fill', // @icon("loader-fill")
'canceled' => 'forbid-fill', // @icon('forbid-fill') 'canceled' => 'forbid-fill', // @icon("forbid-fill")
'failed' => 'close-fill', // @icon('close-fill') 'failed' => 'close-fill', // @icon("close-fill")
'passed' => 'check-fill', // @icon('check-fill') 'passed' => 'check-fill', // @icon("check-fill")
]; ];
$pillIconClassMap = [ $pillIconClassMap = [

View file

@ -1,9 +1,5 @@
<?= $this->extend('_layout') ?> <?= $this->extend('_layout') ?>
<?= $this->section('title') ?>
<?= lang('Podcast.import') ?>
<?= $this->endSection() ?>
<?= $this->section('pageTitle') ?> <?= $this->section('pageTitle') ?>
<?= lang('Podcast.import') ?> <?= lang('Podcast.import') ?>
<?= $this->endSection() ?> <?= $this->endSection() ?>
@ -15,7 +11,7 @@
<x-Forms.Section <x-Forms.Section
title="<?= lang('PodcastImport.old_podcast_section_title') ?>"> title="<?= lang('PodcastImport.old_podcast_section_title') ?>">
<?php // @icon('scales-3-fill')?> <?php // @icon("scales-3-fill")?>
<x-Alert glyph="scales-3-fill" variant="info" title="<?= lang('PodcastImport.old_podcast_legal_disclaimer_title') ?>"><?= lang('PodcastImport.old_podcast_legal_disclaimer') ?></x-Alert> <x-Alert glyph="scales-3-fill" variant="info" title="<?= lang('PodcastImport.old_podcast_legal_disclaimer_title') ?>"><?= lang('PodcastImport.old_podcast_legal_disclaimer') ?></x-Alert>
<x-Forms.Field <x-Forms.Field
name="imported_feed_url" name="imported_feed_url"

View file

@ -1,15 +1,11 @@
<?= $this->extend('_layout') ?> <?= $this->extend('_layout') ?>
<?= $this->section('title') ?>
<?= lang('Podcast.all_imports') ?>
<?= $this->endSection() ?>
<?= $this->section('pageTitle') ?> <?= $this->section('pageTitle') ?>
<?= lang('Podcast.all_imports') ?> <?= lang('Podcast.all_imports') ?>
<?= $this->endSection() ?> <?= $this->endSection() ?>
<?= $this->section('headerRight') ?> <?= $this->section('headerRight') ?>
<?php // @icon('loop-left-fill')?> <?php // @icon("loop-left-fill")?>
<x-Button uri="<?= route_to('podcast-imports-sync', $podcast->id) ?>" variant="primary" iconLeft="loop-left-fill"><?= lang('PodcastImport.syncForm.title') ?></x-Button> <x-Button uri="<?= route_to('podcast-imports-sync', $podcast->id) ?>" variant="primary" iconLeft="loop-left-fill"><?= lang('PodcastImport.syncForm.title') ?></x-Button>
<?= $this->endSection() ?> <?= $this->endSection() ?>

View file

@ -1,9 +1,5 @@
<?= $this->extend('_layout') ?> <?= $this->extend('_layout') ?>
<?= $this->section('title') ?>
<?= lang('PodcastImport.syncForm.title') ?>
<?= $this->endSection() ?>
<?= $this->section('pageTitle') ?> <?= $this->section('pageTitle') ?>
<?= lang('PodcastImport.syncForm.title') ?> <?= lang('PodcastImport.syncForm.title') ?>
<?= $this->endSection() ?> <?= $this->endSection() ?>

View file

@ -1,18 +1,11 @@
<?php declare(strict_types=1);
?>
<?= $this->extend('_layout') ?> <?= $this->extend('_layout') ?>
<?= $this->section('title') ?>
<?= lang('Podcast.all_imports') ?>
<?= $this->endSection() ?>
<?= $this->section('pageTitle') ?> <?= $this->section('pageTitle') ?>
<?= lang('Podcast.all_imports') ?> <?= lang('Podcast.all_imports') ?>
<?= $this->endSection() ?> <?= $this->endSection() ?>
<?= $this->section('headerRight') ?> <?= $this->section('headerRight') ?>
<?php // @icon('add-fill')?> <?php // @icon("add-fill")?>
<x-Button uri="<?= route_to('podcast-imports-add') ?>" variant="primary" iconLeft="add-fill"><?= lang('Podcast.import') ?></x-Button> <x-Button uri="<?= route_to('podcast-imports-add') ?>" variant="primary" iconLeft="add-fill"><?= lang('Podcast.import') ?></x-Button>
<?= $this->endSection() ?> <?= $this->endSection() ?>

View file

@ -1,9 +1,5 @@
<?= $this->extend('_layout') ?> <?= $this->extend('_layout') ?>
<?= $this->section('title') ?>
<?= lang('MyAccount.changePassword') ?>
<?= $this->endSection() ?>
<?= $this->section('pageTitle') ?> <?= $this->section('pageTitle') ?>
<?= lang('MyAccount.changePassword') ?> <?= lang('MyAccount.changePassword') ?>
<?= $this->endSection() ?> <?= $this->endSection() ?>

View file

@ -1,9 +1,5 @@
<?= $this->extend('_layout') ?> <?= $this->extend('_layout') ?>
<?= $this->section('title') ?>
<?= lang('MyAccount.info') ?>
<?= $this->endSection() ?>
<?= $this->section('pageTitle') ?> <?= $this->section('pageTitle') ?>
<?= lang('MyAccount.info') ?> <?= lang('MyAccount.info') ?>
<?= $this->endSection() ?> <?= $this->endSection() ?>

View file

@ -1,9 +1,5 @@
<?= $this->extend('_layout') ?> <?= $this->extend('_layout') ?>
<?= $this->section('title') ?>
<?= lang('Page.create') ?>
<?= $this->endSection() ?>
<?= $this->section('pageTitle') ?> <?= $this->section('pageTitle') ?>
<?= lang('Page.create') ?> <?= lang('Page.create') ?>
<?= $this->endSection() ?> <?= $this->endSection() ?>

View file

@ -1,9 +1,5 @@
<?= $this->extend('_layout') ?> <?= $this->extend('_layout') ?>
<?= $this->section('title') ?>
<?= lang('Page.edit') ?>
<?= $this->endSection() ?>
<?= $this->section('pageTitle') ?> <?= $this->section('pageTitle') ?>
<?= lang('Page.edit') ?> <?= lang('Page.edit') ?>
<?= $this->endSection() ?> <?= $this->endSection() ?>

View file

@ -1,15 +1,11 @@
<?= $this->extend('_layout') ?> <?= $this->extend('_layout') ?>
<?= $this->section('title') ?>
<?= lang('Page.all_pages') ?>
<?= $this->endSection() ?>
<?= $this->section('pageTitle') ?> <?= $this->section('pageTitle') ?>
<?= lang('Page.all_pages') ?> (<?= count($pages) ?>) <?= lang('Page.all_pages') ?> (<?= count($pages) ?>)
<?= $this->endSection() ?> <?= $this->endSection() ?>
<?= $this->section('headerRight') ?> <?= $this->section('headerRight') ?>
<?php // @icon('add-fill')?> <?php // @icon("add-fill")?>
<x-Button uri="<?= route_to('page-create') ?>" variant="primary" iconLeft="add-fill"><?= lang('Page.create') ?></x-Button> <x-Button uri="<?= route_to('page-create') ?>" variant="primary" iconLeft="add-fill"><?= lang('Page.create') ?></x-Button>
<?= $this->endSection() ?> <?= $this->endSection() ?>

View file

@ -1,15 +1,11 @@
<?= $this->extend('_layout') ?> <?= $this->extend('_layout') ?>
<?= $this->section('title') ?>
<?= esc($page->title) ?>
<?= $this->endSection() ?>
<?= $this->section('pageTitle') ?> <?= $this->section('pageTitle') ?>
<?= esc($page->title) ?> <?= esc($page->title) ?>
<?= $this->endSection() ?> <?= $this->endSection() ?>
<?= $this->section('headerRight') ?> <?= $this->section('headerRight') ?>
<?php // @icon('add-fill')?> <?php // @icon("add-fill")?>
<x-Button variant="primary" uri="<?= route_to('page-edit', $page->id) ?>" iconLeft="add-fill"><?= lang('Page.edit') ?></x-Button> <x-Button variant="primary" uri="<?= route_to('page-edit', $page->id) ?>" iconLeft="add-fill"><?= lang('Page.edit') ?></x-Button>
<?= $this->endSection() ?> <?= $this->endSection() ?>

View file

@ -1,9 +1,5 @@
<?= $this->extend('_layout') ?> <?= $this->extend('_layout') ?>
<?= $this->section('title') ?>
<?= lang('Person.create') ?>
<?= $this->endSection() ?>
<?= $this->section('pageTitle') ?> <?= $this->section('pageTitle') ?>
<?= lang('Person.create') ?> <?= lang('Person.create') ?>
<?= $this->endSection() ?> <?= $this->endSection() ?>

View file

@ -1,9 +1,5 @@
<?= $this->extend('_layout') ?> <?= $this->extend('_layout') ?>
<?= $this->section('title') ?>
<?= lang('Person.edit') ?>
<?= $this->endSection() ?>
<?= $this->section('pageTitle') ?> <?= $this->section('pageTitle') ?>
<?= lang('Person.edit') ?> <?= lang('Person.edit') ?>
<?= $this->endSection() ?> <?= $this->endSection() ?>

View file

@ -1,15 +1,11 @@
<?= $this->extend('_layout') ?> <?= $this->extend('_layout') ?>
<?= $this->section('title') ?>
<?= lang('Person.all_persons') ?>
<?= $this->endSection() ?>
<?= $this->section('pageTitle') ?> <?= $this->section('pageTitle') ?>
<?= lang('Person.all_persons') ?> (<?= count($persons) ?>) <?= lang('Person.all_persons') ?> (<?= count($persons) ?>)
<?= $this->endSection() ?> <?= $this->endSection() ?>
<?= $this->section('headerRight') ?> <?= $this->section('headerRight') ?>
<?php // @icon('add-fill')?> <?php // @icon("add-fill")?>
<x-Button uri="<?= route_to('person-create') ?>" variant="primary" iconLeft="add-fill"><?= lang('Person.create') ?></x-Button> <x-Button uri="<?= route_to('person-create') ?>" variant="primary" iconLeft="add-fill"><?= lang('Person.create') ?></x-Button>
<?= $this->endSection() ?> <?= $this->endSection() ?>

View file

@ -1,16 +1,12 @@
<?= $this->extend('_layout') ?> <?= $this->extend('_layout') ?>
<?= $this->section('title') ?>
<?= esc($person->full_name) ?>
<?= $this->endSection() ?>
<?= $this->section('pageTitle') ?> <?= $this->section('pageTitle') ?>
<?= esc($person->full_name) ?> <?= esc($person->full_name) ?>
<?= $this->endSection() ?> <?= $this->endSection() ?>
<?= $this->section('headerRight') ?> <?= $this->section('headerRight') ?>
<?php // @icon('pencil-fill')?> <?php // @icon("pencil-fill")?>
<x-Button uri="<?= route_to('person-edit', $person->id) ?>" variant="secondary" iconLeft="pencil-fill"><?= lang('Person.edit') ?></x-Button> <x-Button uri="<?= route_to('person-edit', $person->id) ?>" variant="secondary" iconLeft="pencil-fill"><?= lang('Person.edit') ?></x-Button>
<?= $this->endSection() ?> <?= $this->endSection() ?>

View file

@ -106,6 +106,19 @@ case 'textarea': ?>
value="<?= $value ?>" value="<?= $value ?>"
/> />
<?php break; <?php break;
case 'html': ?>
<x-Forms.Field
as="CodeEditor"
lang="html"
class="<?= $class ?>"
name="<?= $name ?>"
label="<?= $label ?>"
hint="<?= $hint ?>"
helper="<?= $helper ?>"
isRequired="<?= $optional ? 'false' : 'true' ?>"
content="<?= htmlspecialchars($value) ?>"
/>
<?php break;
case 'markdown': ?> case 'markdown': ?>
<x-Forms.Field <x-Forms.Field
as="MarkdownEditor" as="MarkdownEditor"
@ -120,7 +133,8 @@ case 'markdown': ?>
<?php break; <?php break;
case 'rss': ?> case 'rss': ?>
<x-Forms.Field <x-Forms.Field
as="XMLEditor" as="CodeEditor"
lang="xml"
class="<?= $class ?>" class="<?= $class ?>"
name="<?= $name ?>" name="<?= $name ?>"
label="<?= $label ?>" label="<?= $label ?>"

View file

@ -6,16 +6,16 @@ use Modules\Plugins\Core\PluginStatus;
<article class="flex flex-col p-4 rounded-xl relative bg-elevated border-3 <?= $plugin->getStatus() === PluginStatus::ACTIVE ? 'border-accent-base' : 'border-subtle' ?>"> <article class="flex flex-col p-4 rounded-xl relative bg-elevated border-3 <?= $plugin->getStatus() === PluginStatus::ACTIVE ? 'border-accent-base' : 'border-subtle' ?>">
<div class="self-end -mb-6"> <div class="self-end -mb-6">
<?php if($plugin->getStatus() === PluginStatus::ACTIVE): ?> <?php if($plugin->getStatus() === PluginStatus::ACTIVE): ?>
<?php // @icon('check-fill')?> <?php // @icon("check-fill")?>
<x-Pill variant="success" icon="check-fill" class="lowercase" size="small"><?= lang('Plugins.active') ?></x-Pill> <x-Pill variant="success" icon="check-fill" class="lowercase" size="small"><?= lang('Plugins.active') ?></x-Pill>
<?php elseif($plugin->getStatus() === PluginStatus::INACTIVE): ?> <?php elseif($plugin->getStatus() === PluginStatus::INACTIVE): ?>
<?php // @icon('close-fill')?> <?php // @icon("close-fill")?>
<x-Pill variant="default" icon="close-fill" class="lowercase" size="small"><?= lang('Plugins.inactive') ?></x-Pill> <x-Pill variant="default" icon="close-fill" class="lowercase" size="small"><?= lang('Plugins.inactive') ?></x-Pill>
<?php elseif($plugin->getStatus() === PluginStatus::INVALID): ?> <?php elseif($plugin->getStatus() === PluginStatus::INVALID): ?>
<?php // @icon('alert-fill')?> <?php // @icon("alert-fill")?>
<x-Pill variant="warning" icon="alert-fill" class="lowercase" size="small"><?= lang('Plugins.invalid') ?></x-Pill> <x-Pill variant="warning" icon="alert-fill" class="lowercase" size="small"><?= lang('Plugins.invalid') ?></x-Pill>
<?php elseif($plugin->getStatus() === PluginStatus::INCOMPATIBLE): ?> <?php elseif($plugin->getStatus() === PluginStatus::INCOMPATIBLE): ?>
<?php // @icon('alert-fill')?> <?php // @icon("alert-fill")?>
<x-Pill variant="danger" icon="alert-fill" class="lowercase" size="small" hint="<?= lang('Plugins.incompatible_hint', [ <x-Pill variant="danger" icon="alert-fill" class="lowercase" size="small" hint="<?= lang('Plugins.incompatible_hint', [
'minCastopodVersion' => $plugin->getMinCastopodVersion(), 'minCastopodVersion' => $plugin->getMinCastopodVersion(),
]) ?>"><?= lang('Plugins.incompatible') ?></x-Pill> ]) ?>"><?= lang('Plugins.incompatible') ?></x-Pill>
@ -36,11 +36,11 @@ use Modules\Plugins\Core\PluginStatus;
<footer class="flex items-center justify-between mt-auto"> <footer class="flex items-center justify-between mt-auto">
<div class="flex gap-x-2"> <div class="flex gap-x-2">
<?php if ($plugin->getHomepage()): ?> <?php if ($plugin->getHomepage()): ?>
<?php // @icon('earth-fill')?> <?php // @icon("earth-fill")?>
<x-IconButton glyph="earth-fill" uri="<?= $plugin->getHomepage() ?>" isExternal="true"><?= lang('Plugins.website') ?></x-IconButton> <x-IconButton glyph="earth-fill" uri="<?= $plugin->getHomepage() ?>" isExternal="true"><?= lang('Plugins.website') ?></x-IconButton>
<?php endif; ?> <?php endif; ?>
<?php if ($plugin->getRepository()): ?> <?php if ($plugin->getRepository()): ?>
<?php // @icon('git-repository-fill')?> <?php // @icon("git-repository-fill")?>
<x-IconButton glyph="git-repository-fill" uri="<?= $plugin->getRepository()->url ?>" isExternal="true"><?= lang('Plugins.repository') ?></x-IconButton> <x-IconButton glyph="git-repository-fill" uri="<?= $plugin->getRepository()->url ?>" isExternal="true"><?= lang('Plugins.repository') ?></x-IconButton>
<?php endif; ?> <?php endif; ?>
</div> </div>
@ -57,7 +57,7 @@ use Modules\Plugins\Core\PluginStatus;
</form> </form>
<?php endif; ?> <?php endif; ?>
<?php if ($plugin->getSettingsFields('general') !== []): ?> <?php if ($plugin->getSettingsFields('general') !== []): ?>
<?php // @icon('equalizer-fill')?> <?php // @icon("equalizer-fill")?>
<x-IconButton uri="<?= route_to('plugins-settings-general', $plugin->getVendor(), $plugin->getPackage()) ?>" glyph="equalizer-fill"><?= lang('Plugins.settings') ?></x-IconButton> <x-IconButton uri="<?= route_to('plugins-settings-general', $plugin->getVendor(), $plugin->getPackage()) ?>" glyph="equalizer-fill"><?= lang('Plugins.settings') ?></x-IconButton>
<?php endif; ?> <?php endif; ?>
<button class="p-2 rounded-full" id="more-dropdown-<?= $plugin->getKey() ?>" data-dropdown="button" data-dropdown-target="more-dropdown-<?= $plugin->getKey() ?>-menu" aria-haspopup="true" aria-expanded="false" title="<?= lang('Common.more') ?>"><?= icon('more-2-fill') ?></button> <button class="p-2 rounded-full" id="more-dropdown-<?= $plugin->getKey() ?>" data-dropdown="button" data-dropdown-target="more-dropdown-<?= $plugin->getKey() ?>-menu" aria-haspopup="true" aria-expanded="false" title="<?= lang('Common.more') ?>"><?= icon('more-2-fill') ?></button>

View file

@ -1,9 +1,5 @@
<?= $this->extend('_layout') ?> <?= $this->extend('_layout') ?>
<?= $this->section('title') ?>
<?= lang('Plugins.installed') ?>
<?= $this->endSection() ?>
<?= $this->section('pageTitle') ?> <?= $this->section('pageTitle') ?>
<?= lang('Plugins.installed') . ' (' . $total . ')' ?> <?= lang('Plugins.installed') . ' (' . $total . ')' ?>
<?= $this->endSection() ?> <?= $this->endSection() ?>

View file

@ -1,12 +1,5 @@
<?= $this->extend('_layout') ?> <?= $this->extend('_layout') ?>
<?= $this->section('title') ?>
<?= lang('Plugins.settingsTitle', [
'pluginTitle' => $plugin->getTitle(),
'type' => $type,
]) ?>
<?= $this->endSection() ?>
<?= $this->section('pageTitle') ?> <?= $this->section('pageTitle') ?>
<?= lang('Plugins.settingsTitle', [ <?= lang('Plugins.settingsTitle', [
'pluginTitle' => $plugin->getTitle(), 'pluginTitle' => $plugin->getTitle(),

View file

@ -4,23 +4,19 @@
<?= $this->extend('_layout') ?> <?= $this->extend('_layout') ?>
<?= $this->section('title') ?>
<?= $plugin->getTitle() ?>
<?= $this->endSection() ?>
<?= $this->section('pageTitle') ?> <?= $this->section('pageTitle') ?>
<?= $plugin->getTitle() ?> <?= $plugin->getTitle() ?>
<?= $this->endSection() ?> <?= $this->endSection() ?>
<?= $this->section('headerLeft') ?> <?= $this->section('headerLeft') ?>
<?php if($plugin->getStatus() === PluginStatus::ACTIVE): ?> <?php if($plugin->getStatus() === PluginStatus::ACTIVE): ?>
<?php // @icon('check-fill')?> <?php // @icon("check-fill")?>
<x-Pill variant="success" icon="check-fill" class="lowercase"><?= lang('Plugins.active') ?></x-Pill> <x-Pill variant="success" icon="check-fill" class="lowercase"><?= lang('Plugins.active') ?></x-Pill>
<?php elseif($plugin->getStatus() === PluginStatus::INACTIVE): ?> <?php elseif($plugin->getStatus() === PluginStatus::INACTIVE): ?>
<?php // @icon('close-fill')?> <?php // @icon("close-fill")?>
<x-Pill variant="default" icon="close-fill" class="lowercase"><?= lang('Plugins.inactive') ?></x-Pill> <x-Pill variant="default" icon="close-fill" class="lowercase"><?= lang('Plugins.inactive') ?></x-Pill>
<?php elseif($plugin->getStatus() === PluginStatus::INVALID): ?> <?php elseif($plugin->getStatus() === PluginStatus::INVALID): ?>
<?php // @icon('alert-fill')?> <?php // @icon("alert-fill")?>
<x-Pill variant="warning" icon="alert-fill" class="lowercase"><?= lang('Plugins.invalid') ?></x-Pill> <x-Pill variant="warning" icon="alert-fill" class="lowercase"><?= lang('Plugins.invalid') ?></x-Pill>
<?php endif; ?> <?php endif; ?>
<?= $this->endSection() ?> <?= $this->endSection() ?>
@ -31,7 +27,7 @@
<?= csrf_field() ?> <?= csrf_field() ?>
<x-Button type="submit" variant="danger"><?= lang('Plugins.deactivate') ?></x-Button> <x-Button type="submit" variant="danger"><?= lang('Plugins.deactivate') ?></x-Button>
<?php if ($plugin->getSettingsFields('general') !== []): ?> <?php if ($plugin->getSettingsFields('general') !== []): ?>
<?php // @icon('equalizer-fill')?> <?php // @icon("equalizer-fill")?>
<x-Button class="ring-2 ring-inset ring-gray-600" iconLeft="equalizer-fill" uri="<?= route_to('plugins-settings-general', $plugin->getVendor(), $plugin->getPackage()) ?>"><?= lang('Plugins.settings') ?></x-Button> <x-Button class="ring-2 ring-inset ring-gray-600" iconLeft="equalizer-fill" uri="<?= route_to('plugins-settings-general', $plugin->getVendor(), $plugin->getPackage()) ?>"><?= lang('Plugins.settings') ?></x-Button>
<?php endif; ?> <?php endif; ?>
</form> </form>
@ -40,7 +36,7 @@
<?= csrf_field() ?> <?= csrf_field() ?>
<x-Button type="submit" variant="secondary"><?= lang('Plugins.activate') ?></x-Button> <x-Button type="submit" variant="secondary"><?= lang('Plugins.activate') ?></x-Button>
<?php if ($plugin->getSettingsFields('general') !== []): ?> <?php if ($plugin->getSettingsFields('general') !== []): ?>
<?php // @icon('equalizer-fill')?> <?php // @icon("equalizer-fill")?>
<x-Button class="ring-2 ring-inset ring-gray-600" iconLeft="equalizer-fill" uri="<?= route_to('plugins-settings-general', $plugin->getVendor(), $plugin->getPackage()) ?>"><?= lang('Plugins.settings') ?></x-Button> <x-Button class="ring-2 ring-inset ring-gray-600" iconLeft="equalizer-fill" uri="<?= route_to('plugins-settings-general', $plugin->getVendor(), $plugin->getPackage()) ?>"><?= lang('Plugins.settings') ?></x-Button>
<?php endif; ?> <?php endif; ?>
</form> </form>
@ -92,13 +88,13 @@
<li> <li>
<?= $author->name ?> <?= $author->name ?>
<?php if ($author->email): ?> <?php if ($author->email): ?>
<?php // @icon('mail-fill')?> <?php // @icon("mail-fill")?>
<x-IconButton glyph="mail-fill" uri="mailto:<?= $author->email ?>" size="small" isExternal="true"><?= lang('Plugins.author_email', [ <x-IconButton glyph="mail-fill" uri="mailto:<?= $author->email ?>" size="small" isExternal="true"><?= lang('Plugins.author_email', [
'authorName' => $author->name, 'authorName' => $author->name,
]) ?></x-IconButton> ]) ?></x-IconButton>
<?php endif; ?> <?php endif; ?>
<?php if ($author->url): ?> <?php if ($author->url): ?>
<?php // @icon('earth-fill')?> <?php // @icon("earth-fill")?>
<x-IconButton glyph="earth-fill" uri="<?= $author->url ?>" size="small" isExternal="true"><?= lang('Plugins.author_homepage', [ <x-IconButton glyph="earth-fill" uri="<?= $author->url ?>" size="small" isExternal="true"><?= lang('Plugins.author_homepage', [
'authorName' => $author->name, 'authorName' => $author->name,
]) ?></x-IconButton> ]) ?></x-IconButton>

View file

@ -2,7 +2,7 @@
$podcastNavigation = [ $podcastNavigation = [
'dashboard' => [ 'dashboard' => [
'icon' => 'dashboard-fill', // @icon('dashboard-fill') 'icon' => 'dashboard-fill', // @icon("dashboard-fill")
'items' => ['podcast-view', 'podcast-edit', 'podcast-persons-manage', 'podcast-imports', 'podcast-imports-sync'], 'items' => ['podcast-view', 'podcast-edit', 'podcast-persons-manage', 'podcast-imports', 'podcast-imports-sync'],
'items-permissions' => [ 'items-permissions' => [
'podcast-view' => 'view', 'podcast-view' => 'view',
@ -13,7 +13,7 @@ $podcastNavigation = [
], ],
], ],
'episodes' => [ 'episodes' => [
'icon' => 'play-circle-fill', // @icon('play-circle-fill') 'icon' => 'play-circle-fill', // @icon("play-circle-fill")
'items' => ['episode-list', 'episode-create'], 'items' => ['episode-list', 'episode-create'],
'items-permissions' => [ 'items-permissions' => [
'episode-list' => 'episodes.view', 'episode-list' => 'episodes.view',
@ -24,13 +24,13 @@ $podcastNavigation = [
'count-route' => 'episode-list', 'count-route' => 'episode-list',
], ],
'plugins' => [ 'plugins' => [
'icon' => 'puzzle-fill', // @icon('puzzle-fill') 'icon' => 'puzzle-fill', // @icon("puzzle-fill")
'items' => [], 'items' => [],
'items-labels' => [], 'items-labels' => [],
'items-permissions' => [], 'items-permissions' => [],
], ],
'analytics' => [ 'analytics' => [
'icon' => 'line-chart-fill', // @icon('line-chart-fill') 'icon' => 'line-chart-fill', // @icon("line-chart-fill")
'items' => [ 'items' => [
'podcast-analytics', 'podcast-analytics',
'podcast-analytics-unique-listeners', 'podcast-analytics-unique-listeners',
@ -51,7 +51,7 @@ $podcastNavigation = [
], ],
], ],
'broadcast' => [ 'broadcast' => [
'icon' => 'broadcast-fill', // @icon('broadcast-fill') 'icon' => 'broadcast-fill', // @icon("broadcast-fill")
'items' => [ 'items' => [
'platforms-podcasting', 'platforms-podcasting',
'platforms-social', 'platforms-social',
@ -62,7 +62,7 @@ $podcastNavigation = [
], ],
], ],
'monetization' => [ 'monetization' => [
'icon' => 'money-dollar-circle-fill', // @icon('money-dollar-circle-fill') 'icon' => 'money-dollar-circle-fill', // @icon("money-dollar-circle-fill")
'items' => [ 'items' => [
'subscription-list', 'subscription-list',
'subscription-create', 'subscription-create',
@ -75,7 +75,7 @@ $podcastNavigation = [
], ],
], ],
'contributors' => [ 'contributors' => [
'icon' => 'group-fill', // @icon('group-fill') 'icon' => 'group-fill', // @icon("group-fill")
'items' => ['contributor-list', 'contributor-add'], 'items' => ['contributor-list', 'contributor-add'],
'items-permissions' => [ 'items-permissions' => [
'contributor-list' => 'manage-contributors', 'contributor-list' => 'manage-contributors',

View file

@ -1,9 +1,5 @@
<?= $this->extend('_layout') ?> <?= $this->extend('_layout') ?>
<?= $this->section('title') ?>
<?= esc($podcast->title) ?>
<?= $this->endSection() ?>
<?= $this->section('pageTitle') ?> <?= $this->section('pageTitle') ?>
<?= esc($podcast->title) ?> <?= esc($podcast->title) ?>
<?= $this->endSection() ?> <?= $this->endSection() ?>

View file

@ -1,9 +1,5 @@
<?= $this->extend('_layout') ?> <?= $this->extend('_layout') ?>
<?= $this->section('title') ?>
<?= esc($podcast->title) ?>
<?= $this->endSection() ?>
<?= $this->section('pageTitle') ?> <?= $this->section('pageTitle') ?>
<?= esc($podcast->title) ?> <?= esc($podcast->title) ?>
<?= $this->endSection() ?> <?= $this->endSection() ?>

View file

@ -1,9 +1,5 @@
<?= $this->extend('_layout') ?> <?= $this->extend('_layout') ?>
<?= $this->section('title') ?>
<?= esc($podcast->title) ?>
<?= $this->endSection() ?>
<?= $this->section('pageTitle') ?> <?= $this->section('pageTitle') ?>
<?= esc($podcast->title) ?> <?= esc($podcast->title) ?>
<?= $this->endSection() ?> <?= $this->endSection() ?>

View file

@ -1,9 +1,5 @@
<?= $this->extend('_layout') ?> <?= $this->extend('_layout') ?>
<?= $this->section('title') ?>
<?= esc($podcast->title) ?>
<?= $this->endSection() ?>
<?= $this->section('pageTitle') ?> <?= $this->section('pageTitle') ?>
<?= esc($podcast->title) ?> <?= esc($podcast->title) ?>
<?= $this->endSection() ?> <?= $this->endSection() ?>

View file

@ -1,9 +1,5 @@
<?= $this->extend('_layout') ?> <?= $this->extend('_layout') ?>
<?= $this->section('title') ?>
<?= esc($podcast->title) ?>
<?= $this->endSection() ?>
<?= $this->section('pageTitle') ?> <?= $this->section('pageTitle') ?>
<?= esc($podcast->title) ?> <?= esc($podcast->title) ?>
<?= $this->endSection() ?> <?= $this->endSection() ?>

View file

@ -1,9 +1,5 @@
<?= $this->extend('_layout') ?> <?= $this->extend('_layout') ?>
<?= $this->section('title') ?>
<?= esc($podcast->title) ?>
<?= $this->endSection() ?>
<?= $this->section('pageTitle') ?> <?= $this->section('pageTitle') ?>
<?= esc($podcast->title) ?> <?= esc($podcast->title) ?>
<?= $this->endSection() ?> <?= $this->endSection() ?>

View file

@ -1,9 +1,5 @@
<?= $this->extend('_layout') ?> <?= $this->extend('_layout') ?>
<?= $this->section('title') ?>
<?= esc($podcast->title) ?>
<?= $this->endSection() ?>
<?= $this->section('pageTitle') ?> <?= $this->section('pageTitle') ?>
<?= esc($podcast->title) ?> <?= esc($podcast->title) ?>
<?= $this->endSection() ?> <?= $this->endSection() ?>

View file

@ -1,13 +1,5 @@
<?php declare(strict_types=1);
?>
<?= $this->extend('_layout') ?> <?= $this->extend('_layout') ?>
<?= $this->section('title') ?>
<?= lang('Podcast.create') ?>
<?= $this->endSection() ?>
<?= $this->section('pageTitle') ?> <?= $this->section('pageTitle') ?>
<?= lang('Podcast.create') ?> <?= lang('Podcast.create') ?>
<?= $this->endSection() ?> <?= $this->endSection() ?>

View file

@ -1,9 +1,5 @@
<?= $this->extend('_layout') ?> <?= $this->extend('_layout') ?>
<?= $this->section('title') ?>
<?= lang('Podcast.delete') ?>
<?= $this->endSection() ?>
<?= $this->section('pageTitle') ?> <?= $this->section('pageTitle') ?>
<?= lang('Podcast.delete') ?> <?= lang('Podcast.delete') ?>
<?= $this->endSection() ?> <?= $this->endSection() ?>

View file

@ -1,13 +1,5 @@
<?php declare(strict_types=1);
?>
<?= $this->extend('_layout') ?> <?= $this->extend('_layout') ?>
<?= $this->section('title') ?>
<?= lang('Podcast.edit') ?>
<?= $this->endSection() ?>
<?= $this->section('pageTitle') ?> <?= $this->section('pageTitle') ?>
<?= lang('Podcast.edit') ?> <?= lang('Podcast.edit') ?>
<?= $this->endSection() ?> <?= $this->endSection() ?>
@ -234,7 +226,7 @@ value="<?= esc($podcast->new_feed_url) ?>"
</div> </div>
</form> </form>
<?php // @icon('delete-bin-fill')?> <?php // @icon("delete-bin-fill")?>
<x-Button class="mt-8" variant="danger" uri="<?= route_to('podcast-delete', $podcast->id) ?>" iconLeft="delete-bin-fill"><?= lang('Podcast.delete') ?></x-Button> <x-Button class="mt-8" variant="danger" uri="<?= route_to('podcast-delete', $podcast->id) ?>" iconLeft="delete-bin-fill"><?= lang('Podcast.delete') ?></x-Button>
<?= $this->endSection() ?> <?= $this->endSection() ?>

View file

@ -1,17 +1,13 @@
<?= $this->extend('_layout') ?> <?= $this->extend('_layout') ?>
<?= $this->section('title') ?>
<?= lang('Podcast.all_podcasts') ?>
<?= $this->endSection() ?>
<?= $this->section('pageTitle') ?> <?= $this->section('pageTitle') ?>
<?= lang('Podcast.all_podcasts') ?> (<?= count($podcasts) ?>) <?= lang('Podcast.all_podcasts') ?> (<?= count($podcasts) ?>)
<?= $this->endSection() ?> <?= $this->endSection() ?>
<?= $this->section('headerRight') ?> <?= $this->section('headerRight') ?>
<?php <?php
// @icon('import-fill') // @icon("import-fill")
// @icon('add-fill') // @icon("add-fill")
?> ?>
<x-Button uri="<?= route_to('podcast-imports-add') ?>" variant="secondary" iconLeft="import-fill"><?= lang('Podcast.import') ?></x-Button> <x-Button uri="<?= route_to('podcast-imports-add') ?>" variant="secondary" iconLeft="import-fill"><?= lang('Podcast.import') ?></x-Button>
<x-Button uri="<?= route_to('podcast-create') ?>" variant="primary" iconLeft="add-fill"><?= lang('Podcast.create') ?></x-Button> <x-Button uri="<?= route_to('podcast-create') ?>" variant="primary" iconLeft="add-fill"><?= lang('Podcast.create') ?></x-Button>

View file

@ -1,9 +1,5 @@
<?= $this->extend('_layout') ?> <?= $this->extend('_layout') ?>
<?= $this->section('title') ?>
<?= lang('Notifications.title') ?>
<?= $this->endSection() ?>
<?= $this->section('pageTitle') ?> <?= $this->section('pageTitle') ?>
<?= lang('Notifications.title') ?> <?= lang('Notifications.title') ?>
<?= $this->endSection() ?> <?= $this->endSection() ?>

View file

@ -1,15 +1,11 @@
<?= $this->extend('_layout') ?> <?= $this->extend('_layout') ?>
<?= $this->section('title') ?>
<?= lang('Person.podcast_form.title') ?>
<?= $this->endSection() ?>
<?= $this->section('pageTitle') ?> <?= $this->section('pageTitle') ?>
<?= lang('Person.podcast_form.title') ?> (<?= count($podcast->persons) ?>) <?= lang('Person.podcast_form.title') ?> (<?= count($podcast->persons) ?>)
<?= $this->endSection() ?> <?= $this->endSection() ?>
<?= $this->section('headerRight') ?> <?= $this->section('headerRight') ?>
<?php // @icon('add-fill')?> <?php // @icon("add-fill")?>
<x-Button uri="<?= route_to('person-create') ?>" variant="primary" iconLeft="add-fill"><?= lang('Person.create') ?></x-Button> <x-Button uri="<?= route_to('person-create') ?>" variant="primary" iconLeft="add-fill"><?= lang('Person.create') ?></x-Button>
<?= $this->endSection() ?> <?= $this->endSection() ?>
@ -84,7 +80,7 @@
[ [
'header' => lang('Common.actions'), 'header' => lang('Common.actions'),
'cell' => function ($person): string { 'cell' => function ($person): string {
// @icon('delete-bin-fill') // @icon("delete-bin-fill")
return '<x-Button uri="' . route_to('podcast-person-remove', $person->podcast_id, $person->id) . '" variant="danger" size="small" iconLeft="delete-bin-fill">' . lang('Person.podcast_form.remove') . '</x-Button>'; return '<x-Button uri="' . route_to('podcast-person-remove', $person->podcast_id, $person->id) . '" variant="danger" size="small" iconLeft="delete-bin-fill">' . lang('Person.podcast_form.remove') . '</x-Button>';
}, },
], ],

View file

@ -1,9 +1,5 @@
<?= $this->extend('_layout') ?> <?= $this->extend('_layout') ?>
<?= $this->section('title') ?>
<?= lang("Platforms.title.{$platformType}") ?>
<?= $this->endSection() ?>
<?= $this->section('pageTitle') ?> <?= $this->section('pageTitle') ?>
<?= lang("Platforms.title.{$platformType}") ?> <?= lang("Platforms.title.{$platformType}") ?>
<?= $this->endSection() ?> <?= $this->endSection() ?>

View file

@ -1,9 +1,5 @@
<?= $this->extend('_layout') ?> <?= $this->extend('_layout') ?>
<?= $this->section('title') ?>
<?= lang('Podcast.publish') ?>
<?= $this->endSection() ?>
<?= $this->section('pageTitle') ?> <?= $this->section('pageTitle') ?>
<?= lang('Podcast.publish') ?> <?= lang('Podcast.publish') ?>
<?= $this->endSection() ?> <?= $this->endSection() ?>

View file

@ -1,9 +1,5 @@
<?= $this->extend('_layout') ?> <?= $this->extend('_layout') ?>
<?= $this->section('title') ?>
<?= lang('Podcast.publish_edit') ?>
<?= $this->endSection() ?>
<?= $this->section('pageTitle') ?> <?= $this->section('pageTitle') ?>
<?= lang('Podcast.publish_edit') ?> <?= lang('Podcast.publish_edit') ?>
<?= $this->endSection() ?> <?= $this->endSection() ?>

View file

@ -1,9 +1,5 @@
<?= $this->extend('_layout') ?> <?= $this->extend('_layout') ?>
<?= $this->section('title') ?>
<?= lang('Podcast.platforms.title') ?>
<?= $this->endSection() ?>
<?= $this->section('pageTitle') ?> <?= $this->section('pageTitle') ?>
<?= lang('Podcast.platforms.title') ?> <?= lang('Podcast.platforms.title') ?>
<?= $this->endSection() ?> <?= $this->endSection() ?>

View file

@ -1,17 +1,13 @@
<?= $this->extend('_layout') ?> <?= $this->extend('_layout') ?>
<?= $this->section('title') ?>
<?= esc($podcast->title) ?>
<?= $this->endSection() ?>
<?= $this->section('pageTitle') ?> <?= $this->section('pageTitle') ?>
<?= esc($podcast->title) ?> <?= esc($podcast->title) ?>
<?= $this->endSection() ?> <?= $this->endSection() ?>
<?= $this->section('headerRight') ?> <?= $this->section('headerRight') ?>
<?php <?php
// @icon('pencil-fill') // @icon("pencil-fill")
// @icon('add-fill') // @icon("add-fill")
?> ?>
<x-Button uri="<?= route_to('podcast-edit', $podcast->id) ?>" variant="secondary" class="[&>span]:hidden [&>span]:md:block py-3 md:py-2" iconLeft="pencil-fill"><?= lang('Podcast.edit') ?></x-Button> <x-Button uri="<?= route_to('podcast-edit', $podcast->id) ?>" variant="secondary" class="[&>span]:hidden [&>span]:md:block py-3 md:py-2" iconLeft="pencil-fill"><?= lang('Podcast.edit') ?></x-Button>
<x-Button uri="<?= route_to('episode-create', $podcast->id) ?>" variant="primary" class="[&>span]:hidden [&>span]:md:block py-3 md:py-2" iconLeft="add-fill"><?= lang('Episode.create') ?></x-Button> <x-Button uri="<?= route_to('episode-create', $podcast->id) ?>" variant="primary" class="[&>span]:hidden [&>span]:md:block py-3 md:py-2" iconLeft="add-fill"><?= lang('Episode.create') ?></x-Button>

View file

@ -1,9 +1,5 @@
<?= $this->extend('_layout') ?> <?= $this->extend('_layout') ?>
<?= $this->section('title') ?>
<?= lang('AboutCastopod.title') ?>
<?= $this->endSection() ?>
<?= $this->section('pageTitle') ?> <?= $this->section('pageTitle') ?>
<?= lang('AboutCastopod.title') ?> <?= lang('AboutCastopod.title') ?>
<?= $this->endSection() ?> <?= $this->endSection() ?>

View file

@ -1,13 +1,5 @@
<?php declare(strict_types=1);
?>
<?= $this->extend('_layout') ?> <?= $this->extend('_layout') ?>
<?= $this->section('title') ?>
<?= lang('Settings.title') ?>
<?= $this->endSection() ?>
<?= $this->section('pageTitle') ?> <?= $this->section('pageTitle') ?>
<?= lang('Settings.title') ?> <?= lang('Settings.title') ?>
<?= $this->endSection() ?> <?= $this->endSection() ?>
@ -67,7 +59,7 @@
<x-Forms.Section <x-Forms.Section
title="<?= lang('Settings.images.title') ?>" title="<?= lang('Settings.images.title') ?>"
subtitle="<?= lang('Settings.images.subtitle') ?>"> subtitle="<?= lang('Settings.images.subtitle') ?>">
<?php // @icon('refresh-fill')?> <?php // @icon("refresh-fill")?>
<x-Button variant="primary" type="submit" iconLeft="refresh-fill"><?= lang('Settings.images.regenerate') ?></x-Button> <x-Button variant="primary" type="submit" iconLeft="refresh-fill"><?= lang('Settings.images.regenerate') ?></x-Button>
</x-Forms.Section> </x-Forms.Section>
@ -84,7 +76,7 @@
<x-Forms.Toggler name="reset_counts" size="small" isChecked="false" hint="<?= esc(lang('Settings.housekeeping.reset_counts_helper')) ?>"><?= lang('Settings.housekeeping.reset_counts') ?></x-Forms.Toggler> <x-Forms.Toggler name="reset_counts" size="small" isChecked="false" hint="<?= esc(lang('Settings.housekeeping.reset_counts_helper')) ?>"><?= lang('Settings.housekeeping.reset_counts') ?></x-Forms.Toggler>
<x-Forms.Toggler name="rename_episodes_files" size="small" isChecked="false" hint="<?= esc(lang('Settings.housekeeping.rename_episodes_files_hint')) ?>"><?= lang('Settings.housekeeping.rename_episodes_files') ?></x-Forms.Toggler> <x-Forms.Toggler name="rename_episodes_files" size="small" isChecked="false" hint="<?= esc(lang('Settings.housekeeping.rename_episodes_files_hint')) ?>"><?= lang('Settings.housekeeping.rename_episodes_files') ?></x-Forms.Toggler>
<x-Forms.Toggler name="clear_cache" size="small" isChecked="false" hint="<?= esc(lang('Settings.housekeeping.clear_cache_helper')) ?>"><?= lang('Settings.housekeeping.clear_cache') ?></x-Forms.Toggler> <x-Forms.Toggler name="clear_cache" size="small" isChecked="false" hint="<?= esc(lang('Settings.housekeeping.clear_cache_helper')) ?>"><?= lang('Settings.housekeeping.clear_cache') ?></x-Forms.Toggler>
<?php // @icon('home-gear-fill')?> <?php // @icon("home-gear-fill")?>
<x-Button variant="primary" type="submit" iconLeft="home-gear-fill"><?= lang('Settings.housekeeping.run') ?></x-Button> <x-Button variant="primary" type="submit" iconLeft="home-gear-fill"><?= lang('Settings.housekeeping.run') ?></x-Button>
</x-Forms.Section> </x-Forms.Section>

View file

@ -1,13 +1,5 @@
<?php declare(strict_types=1);
?>
<?= $this->extend('_layout') ?> <?= $this->extend('_layout') ?>
<?= $this->section('title') ?>
<?= lang('Settings.theme.title') ?>
<?= $this->endSection() ?>
<?= $this->section('pageTitle') ?> <?= $this->section('pageTitle') ?>
<?= lang('Settings.theme.title') ?> <?= lang('Settings.theme.title') ?>
<?= $this->endSection() ?> <?= $this->endSection() ?>

View file

@ -1,9 +1,5 @@
<?= $this->extend('../cp_admin/_layout') ?> <?= $this->extend('../cp_admin/_layout') ?>
<?= $this->section('title') ?>
<?= lang('Subscription.add', [esc($podcast->title)]) ?>
<?= $this->endSection() ?>
<?= $this->section('pageTitle') ?> <?= $this->section('pageTitle') ?>
<?= lang('Subscription.add', [esc($podcast->title)]) ?> <?= lang('Subscription.add', [esc($podcast->title)]) ?>
<?= $this->endSection() ?> <?= $this->endSection() ?>

View file

@ -1,9 +1,5 @@
<?= $this->extend('_layout') ?> <?= $this->extend('_layout') ?>
<?= $this->section('title') ?>
<?= lang('Subscription.delete') ?>
<?= $this->endSection() ?>
<?= $this->section('pageTitle') ?> <?= $this->section('pageTitle') ?>
<?= lang('Subscription.delete') ?> <?= lang('Subscription.delete') ?>
<?= $this->endSection() ?> <?= $this->endSection() ?>

View file

@ -1,9 +1,5 @@
<?= $this->extend('../cp_admin/_layout') ?> <?= $this->extend('../cp_admin/_layout') ?>
<?= $this->section('title') ?>
<?= lang('Subscription.edit', [esc($podcast->title)]) ?>
<?= $this->endSection() ?>
<?= $this->section('pageTitle') ?> <?= $this->section('pageTitle') ?>
<?= lang('Subscription.edit', [esc($podcast->title)]) ?> <?= lang('Subscription.edit', [esc($podcast->title)]) ?>
<?= $this->endSection() ?> <?= $this->endSection() ?>

View file

@ -1,15 +1,11 @@
<?= $this->extend('../cp_admin/_layout') ?> <?= $this->extend('../cp_admin/_layout') ?>
<?= $this->section('title') ?>
<?= lang('Subscription.podcast_subscriptions') ?>
<?= $this->endSection() ?>
<?= $this->section('pageTitle') ?> <?= $this->section('pageTitle') ?>
<?= lang('Subscription.podcast_subscriptions') ?> <?= lang('Subscription.podcast_subscriptions') ?>
<?= $this->endSection() ?> <?= $this->endSection() ?>
<?= $this->section('headerRight') ?> <?= $this->section('headerRight') ?>
<?php // @icon('add-fill')?> <?php // @icon("add-fill")?>
<x-Button uri="<?= route_to('subscription-create', $podcast->id) ?>" variant="primary" iconLeft="add-fill"><?= lang('Subscription.add') ?></x-Button> <x-Button uri="<?= route_to('subscription-create', $podcast->id) ?>" variant="primary" iconLeft="add-fill"><?= lang('Subscription.add') ?></x-Button>
<?= $this->endSection() ?> <?= $this->endSection() ?>

View file

@ -1,9 +1,5 @@
<?= $this->extend('_layout') ?> <?= $this->extend('_layout') ?>
<?= $this->section('title') ?>
<?= lang('Subscription.suspend') ?>
<?= $this->endSection() ?>
<?= $this->section('pageTitle') ?> <?= $this->section('pageTitle') ?>
<?= lang('Subscription.suspend') ?> <?= lang('Subscription.suspend') ?>
<?= $this->endSection() ?> <?= $this->endSection() ?>
@ -28,7 +24,7 @@
<div class="flex items-center self-end mt-4 gap-x-2"> <div class="flex items-center self-end mt-4 gap-x-2">
<x-Button uri="<?= route_to('subscription-list', $podcast->id) ?>"><?= lang('Common.cancel') ?></x-Button> <x-Button uri="<?= route_to('subscription-list', $podcast->id) ?>"><?= lang('Common.cancel') ?></x-Button>
<?php // @icon('pause-fill')?> <?php // @icon("pause-fill")?>
<x-Button type="submit" variant="warning" iconLeft="pause-fill"><?= lang('Subscription.suspend_form.submit') ?></x-Button> <x-Button type="submit" variant="warning" iconLeft="pause-fill"><?= lang('Subscription.suspend_form.submit') ?></x-Button>
</div> </div>

View file

@ -1,11 +1,5 @@
<?= $this->extend('../cp_admin/_layout') ?> <?= $this->extend('../cp_admin/_layout') ?>
<?= $this->section('title') ?>
<?= lang('Subscription.view', [
esc($subscription->id),
]) ?>
<?= $this->endSection() ?>
<?= $this->section('pageTitle') ?> <?= $this->section('pageTitle') ?>
<?= lang('Subscription.view', [ <?= lang('Subscription.view', [
esc($subscription->id), esc($subscription->id),

View file

@ -1,9 +1,5 @@
<?= $this->extend('_layout') ?> <?= $this->extend('_layout') ?>
<?= $this->section('title') ?>
<?= lang('User.create') ?>
<?= $this->endSection() ?>
<?= $this->section('pageTitle') ?> <?= $this->section('pageTitle') ?>
<?= lang('User.create') ?> <?= lang('User.create') ?>
<?= $this->endSection() ?> <?= $this->endSection() ?>

View file

@ -1,11 +1,5 @@
<?= $this->extend('_layout') ?> <?= $this->extend('_layout') ?>
<?= $this->section('title') ?>
<?= lang('User.delete_form.title', [
'user' => $user->username,
]) ?>
<?= $this->endSection() ?>
<?= $this->section('pageTitle') ?> <?= $this->section('pageTitle') ?>
<?= lang('User.delete_form.title', [ <?= lang('User.delete_form.title', [
'user' => $user->username, 'user' => $user->username,

View file

@ -1,11 +1,5 @@
<?= $this->extend('_layout') ?> <?= $this->extend('_layout') ?>
<?= $this->section('title') ?>
<?= lang('User.edit_role', [
'username' => esc($user->username),
]) ?>
<?= $this->endSection() ?>
<?= $this->section('pageTitle') ?> <?= $this->section('pageTitle') ?>
<?= lang('User.edit_role', [ <?= lang('User.edit_role', [
'username' => esc($user->username), 'username' => esc($user->username),

View file

@ -1,15 +1,11 @@
<?= $this->extend('_layout') ?> <?= $this->extend('_layout') ?>
<?= $this->section('title') ?>
<?= lang('User.all_users') ?>
<?= $this->endSection() ?>
<?= $this->section('pageTitle') ?> <?= $this->section('pageTitle') ?>
<?= lang('User.all_users') ?> (<?= count($users) ?>) <?= lang('User.all_users') ?> (<?= count($users) ?>)
<?= $this->endSection() ?> <?= $this->endSection() ?>
<?= $this->section('headerRight') ?> <?= $this->section('headerRight') ?>
<?php // @icon('user-add-fill')?> <?php // @icon("user-add-fill")?>
<x-Button uri="<?= route_to('user-create') ?>" variant="primary" iconLeft="user-add-fill"><?= lang('User.create') ?></x-Button> <x-Button uri="<?= route_to('user-create') ?>" variant="primary" iconLeft="user-add-fill"><?= lang('User.create') ?></x-Button>
<?= $this->endSection() ?> <?= $this->endSection() ?>
@ -37,7 +33,7 @@
$role = '<div class="inline-flex items-center"><span class="mr-2" tabindex="0" data-tooltip="bottom" title="' . lang('Auth.instance_groups.owner.title') . '">' . icon('shield-user-fill') . '</span>' . $role . '</div>'; $role = '<div class="inline-flex items-center"><span class="mr-2" tabindex="0" data-tooltip="bottom" title="' . lang('Auth.instance_groups.owner.title') . '">' . icon('shield-user-fill') . '</span>' . $role . '</div>';
} }
// @icon('pencil-fill') // @icon("pencil-fill")
return $role . '<x-IconButton uri="' . route_to('user-edit', $user->id) . '" glyph="pencil-fill" variant="info">' . lang('User.edit_role', [ return $role . '<x-IconButton uri="' . route_to('user-edit', $user->id) . '" glyph="pencil-fill" variant="info">' . lang('User.edit_role', [
'username' => esc($user->username), 'username' => esc($user->username),
]) . '</x-IconButton>'; ]) . '</x-IconButton>';

View file

@ -1,11 +1,5 @@
<?= $this->extend('_layout') ?> <?= $this->extend('_layout') ?>
<?= $this->section('title') ?>
<?= lang('User.view', [
'username' => esc($user->username),
]) ?>
<?= $this->endSection() ?>
<?= $this->section('pageTitle') ?> <?= $this->section('pageTitle') ?>
<?= lang('User.view', [ <?= lang('User.view', [
'username' => esc($user->username), 'username' => esc($user->username),

View file

@ -33,7 +33,7 @@
<h1 class="font-semibold leading-tight opacity-100 line-clamp-2 hover:opacity-75"><?= esc($episode->title) ?></h1> <h1 class="font-semibold leading-tight opacity-100 line-clamp-2 hover:opacity-75"><?= esc($episode->title) ?></h1>
</a> </a>
<?php if ($episode->is_premium && ! is_unlocked($podcast->handle)): ?> <?php if ($episode->is_premium && ! is_unlocked($podcast->handle)): ?>
<?php // @icon('lock-fill')?> <?php // @icon("lock-fill")?>
<x-Button variant="primary" class="mt-auto mb-2" iconLeft="lock-fill" uri="<?= $episode->link ?>" target="_blank" rel="noopener noreferrer"><?= lang('PremiumPodcasts.unlock') ?></x-Button> <x-Button variant="primary" class="mt-auto mb-2" iconLeft="lock-fill" uri="<?= $episode->link ?>" target="_blank" rel="noopener noreferrer"><?= lang('PremiumPodcasts.unlock') ?></x-Button>
<?php else: ?> <?php else: ?>
<vm-player <vm-player

View file

@ -170,7 +170,7 @@
</div> </div>
<?php if (auth()->loggedIn()): ?> <?php if (auth()->loggedIn()): ?>
<?php if (in_array($episode->publication_status, ['scheduled', 'with_podcast'], true)): ?> <?php if (in_array($episode->publication_status, ['scheduled', 'with_podcast'], true)): ?>
<?php // @icon('upload-cloud-fill')?> <?php // @icon("upload-cloud-fill")?>
<x-Button <x-Button
iconLeft="upload-cloud-fill" iconLeft="upload-cloud-fill"
variant="primary" variant="primary"
@ -178,7 +178,7 @@
class="ml-auto" class="ml-auto"
uri="<?= route_to('episode-publish_edit', $episode->podcast_id, $episode->id) ?>"><?= lang('Episode.preview.publish_edit') ?></x-Button> uri="<?= route_to('episode-publish_edit', $episode->podcast_id, $episode->id) ?>"><?= lang('Episode.preview.publish_edit') ?></x-Button>
<?php else: ?> <?php else: ?>
<?php // @icon('upload-cloud-fill')?> <?php // @icon("upload-cloud-fill")?>
<x-Button <x-Button
iconLeft="upload-cloud-fill" iconLeft="upload-cloud-fill"
variant="secondary" variant="secondary"

View file

@ -4,38 +4,15 @@
<html lang="<?= service('request') <html lang="<?= service('request')
->getLocale() ?>"> ->getLocale() ?>">
<head> <?= service('html_head')
<meta charset="UTF-8"/> ->appendRawContent(service('vite')->asset('styles/index.css', 'css'))
<meta name="viewport" content="width=device-width, initial-scale=1.0"/> ->appendRawContent(service('vite')->asset('js/app.ts', 'js'))
<link rel="icon" type="image/x-icon" href="<?= get_site_icon_url('ico') ?>" /> ->appendRawContent(service('vite')->asset('js/podcast.ts', 'js'))
<link rel="apple-touch-icon" href="<?= get_site_icon_url('180') ?>"> ->appendRawContent(service('vite')->asset('js/audio-player.ts', 'js'))
<link rel="manifest" href="<?= route_to('podcast-webmanifest', esc($podcast->handle)) ?>"> ?>
<meta name="theme-color" content="<?= \App\Controllers\WebmanifestController::THEME_COLORS[service('settings')->get('App.theme')]['theme'] ?>">
<script>
// Check that service workers are supported
if ('serviceWorker' in navigator) {
// Use the window load event to keep the page load performant
window.addEventListener('load', () => {
navigator.serviceWorker.register('/sw.js');
});
}
</script>
<?= $metatags ?>
<link rel='stylesheet' type='text/css' href='<?= route_to('themes-colors-css') ?>' />
<?= service('vite')
->asset('styles/index.css', 'css') ?>
<?= service('vite')
->asset('js/app.ts', 'js') ?>
<?= service('vite')
->asset('js/podcast.ts', 'js') ?>
<?= service('vite')
->asset('js/audio-player.ts', 'js') ?>
</head>
<body class="flex flex-col min-h-screen mx-auto md:min-h-full md:grid md:grid-cols-podcast bg-base theme-<?= service('settings') <body class="flex flex-col min-h-screen mx-auto md:min-h-full md:grid md:grid-cols-podcast bg-base theme-<?= service('settings')
->get('App.theme') ?>"> ->get('App.theme') ?>">
<?php if (can_user_interact()): ?> <?php if (can_user_interact()): ?>
<div class="col-span-full"> <div class="col-span-full">
<?= $this->include('_admin_navbar') ?> <?= $this->include('_admin_navbar') ?>

View file

@ -27,7 +27,7 @@ if ($comment->in_reply_to_id): ?>
'actorUsername' => esc($comment->actor->username), 'actorUsername' => esc($comment->actor->username),
]) ?>" ]) ?>"
rows="1" /> rows="1" />
<?php // @icon('send-plane-2-fill')?> <?php // @icon("send-plane-2-fill")?>
<x-Button variant="primary" size="small" type="submit" name="action" value="reply" class="self-end" iconRight="send-plane-2-fill"><?= lang('Comment.form.submit_reply') ?></x-Button> <x-Button variant="primary" size="small" type="submit" name="action" value="reply" class="self-end" iconRight="send-plane-2-fill"><?= lang('Comment.form.submit_reply') ?></x-Button>
</div> </div>
</form> </form>

View file

@ -17,7 +17,7 @@
placeholder="<?= lang('Post.form.episode_message_placeholder') ?>" placeholder="<?= lang('Post.form.episode_message_placeholder') ?>"
isRequired="true" isRequired="true"
rows="2" /> rows="2" />
<?php // @icon('send-plane-2-fill')?> <?php // @icon("send-plane-2-fill")?>
<x-Button variant="primary" size="small" type="submit" class="self-end" iconRight="send-plane-2-fill"><?= lang('Post.form.submit') ?></x-Button> <x-Button variant="primary" size="small" type="submit" class="self-end" iconRight="send-plane-2-fill"><?= lang('Post.form.submit') ?></x-Button>
</div> </div>
</form> </form>

View file

@ -16,7 +16,7 @@
isRequired="true" isRequired="true"
placeholder="<?= lang('Comment.form.episode_message_placeholder') ?>" placeholder="<?= lang('Comment.form.episode_message_placeholder') ?>"
rows="2" /> rows="2" />
<?php // @icon('send-plane-2-fill')?> <?php // @icon("send-plane-2-fill")?>
<x-Button class="self-end" variant="primary" size="small" type="submit" iconRight="send-plane-2-fill"><?= lang('Comment.form.submit') ?></x-Button> <x-Button class="self-end" variant="primary" size="small" type="submit" iconRight="send-plane-2-fill"><?= lang('Comment.form.submit') ?></x-Button>
</div> </div>
</form> </form>

View file

@ -4,7 +4,7 @@
<?php if (isset($captions)) : ?> <?php if (isset($captions)) : ?>
<div class="flex flex-col gap-2"> <div class="flex flex-col gap-2">
<?php // @icon('download-fill')?> <?php // @icon("download-fill")?>
<x-Button uri="<?= $transcript->file_url ?>" size="small" iconLeft="download-fill" class="self-start" variant="secondary" target="_blank" download="" rel="noopener noreferrer"><?= lang('Episode.download_transcript', [ <x-Button uri="<?= $transcript->file_url ?>" size="small" iconLeft="download-fill" class="self-start" variant="secondary" target="_blank" download="" rel="noopener noreferrer"><?= lang('Episode.download_transcript', [
'extension' => '.' . $transcript->file_extension, 'extension' => '.' . $transcript->file_extension,
]) ?></x-Button> ]) ?></x-Button>

View file

@ -4,7 +4,7 @@
<?php if (isset($captions)) : ?> <?php if (isset($captions)) : ?>
<div class="flex flex-col gap-2"> <div class="flex flex-col gap-2">
<?php // @icon('download-fill')?> <?php // @icon("download-fill")?>
<x-Button uri="<?= $transcript->file_url ?>" size="small" iconLeft="download-fill" class="self-start" variant="secondary" target="_blank" download="" rel="noopener noreferrer"><?= lang('Episode.download_transcript', [ <x-Button uri="<?= $transcript->file_url ?>" size="small" iconLeft="download-fill" class="self-start" variant="secondary" target="_blank" download="" rel="noopener noreferrer"><?= lang('Episode.download_transcript', [
'extension' => '.' . $transcript->file_extension, 'extension' => '.' . $transcript->file_extension,
]) ?></x-Button> ]) ?></x-Button>

View file

@ -3,35 +3,14 @@
<html lang="<?= service('request') <html lang="<?= service('request')
->getLocale() ?>"> ->getLocale() ?>">
<head> <?= service('html_head')
<meta charset="UTF-8"/> ->appendRawContent(service('vite')->asset('styles/index.css', 'css'))
<meta name="viewport" content="width=device-width, initial-scale=1.0"/> ->appendRawContent(service('vite')->asset('js/app.ts', 'js'))
<link rel="icon" type="image/x-icon" href="<?= get_site_icon_url('ico') ?>" /> ?>
<link rel="apple-touch-icon" href="<?= get_site_icon_url('180') ?>">
<link rel="manifest" href="<?= route_to('webmanifest') ?>">
<meta name="theme-color" content="<?= \App\Controllers\WebmanifestController::THEME_COLORS[service('settings')->get('App.theme')]['theme'] ?>">
<script>
// Check that service workers are supported
if ('serviceWorker' in navigator) {
// Use the window load event to keep the page load performant
window.addEventListener('load', () => {
navigator.serviceWorker.register('/sw.js');
});
}
</script>
<?= $metatags ?>
<link rel='stylesheet' type='text/css' href='<?= route_to('themes-colors-css') ?>' />
<?= service('vite')
->asset('styles/index.css', 'css') ?>
<?= service('vite')
->asset('js/app.ts', 'js') ?>
</head>
<body class="flex flex-col min-h-screen mx-auto bg-base theme-<?= service('settings') <body class="flex flex-col min-h-screen mx-auto bg-base theme-<?= service('settings')
->get('App.theme') ?>"> ->get('App.theme') ?>">
<?php if (auth()->loggedIn()): ?> <?php if (auth()->loggedIn()): ?>
<?= $this->include('_admin_navbar') ?> <?= $this->include('_admin_navbar') ?>
<?php endif; ?> <?php endif; ?>
@ -40,10 +19,7 @@
<h1 class="container flex items-center justify-between px-2 py-4 mx-auto"> <h1 class="container flex items-center justify-between px-2 py-4 mx-auto">
<a href="<?= route_to( <a href="<?= route_to(
'home', 'home',
) ?>" class="inline-flex items-baseline text-3xl font-semibold font-display"><?= service('settings') ) ?>" class="inline-flex items-baseline text-3xl font-semibold font-display"><?= service('settings')->get('App.siteName') === 'Castopod' ? 'castopod' . svg('castopod-logo-base', 'h-6 ml-2') : esc(service('settings')->get('App.siteName')) ?></a>
->get('App.siteName') === 'Castopod' ? 'castopod' .
svg('castopod-logo-base', 'h-6 ml-2') : esc(service('settings')
->get('App.siteName')) ?></a>
</h1> </h1>
</header> </header>
<main class="container flex-1 px-4 py-10 mx-auto"> <main class="container flex-1 px-4 py-10 mx-auto">
@ -52,28 +28,30 @@
$podcasts, $podcasts,
) ?>)</x-Heading> ) ?>)</x-Heading>
<button class="inline-flex items-center px-2 py-1 text-sm font-semibold" id="sortby-dropdown" data-dropdown="button" data-dropdown-target="sortby-dropdown-menu" aria-haspopup="true" aria-expanded="false"><?= icon('material-symbols:sort', [ <button class="inline-flex items-center px-2 py-1 text-sm font-semibold" id="sortby-dropdown" data-dropdown="button" data-dropdown-target="sortby-dropdown-menu" aria-haspopup="true" aria-expanded="false"><?= icon('material-symbols:sort', [
'class' => 'mr-1 text-xl opacity-50', 'class' => 'mr-1 text-xl opacity-50',
]) . lang('Home.sort_by') ?></button> ]) . lang('Home.sort_by') ?></button>
<x-DropdownMenu id="sortby-dropdown-menu" labelledby="sortby-dropdown" items="<?= esc(json_encode([ <x-DropdownMenu id="sortby-dropdown-menu" labelledby="sortby-dropdown" items="<?= esc(
[ json_encode([
'type' => 'link', [
'title' => ($sortBy === 'activity' ? '✓ ' : '') . lang('Home.sort_options.activity'), 'type' => 'link',
'uri' => route_to('home') . '?sort=activity', 'title' => ($sortBy === 'activity' ? '✓ ' : '') . lang('Home.sort_options.activity'),
'class' => $sortBy === 'activity' ? 'font-semibold' : '', 'uri' => route_to('home') . '?sort=activity',
], 'class' => $sortBy === 'activity' ? 'font-semibold' : '',
[ ],
'type' => 'link', [
'title' => ($sortBy === 'created_desc' ? '✓ ' : '') . lang('Home.sort_options.created_desc'), 'type' => 'link',
'uri' => route_to('home') . '?sort=created_desc', 'title' => ($sortBy === 'created_desc' ? '✓ ' : '') . lang('Home.sort_options.created_desc'),
'class' => $sortBy === 'created_desc' ? 'font-semibold' : '', 'uri' => route_to('home') . '?sort=created_desc',
], 'class' => $sortBy === 'created_desc' ? 'font-semibold' : '',
[ ],
'type' => 'link', [
'title' => ($sortBy === 'created_asc' ? '✓ ' : '') . lang('Home.sort_options.created_asc'), 'type' => 'link',
'uri' => route_to('home') . '?sort=created_asc', 'title' => ($sortBy === 'created_asc' ? '✓ ' : '') . lang('Home.sort_options.created_asc'),
'class' => $sortBy === 'created_asc' ? 'font-semibold' : '', 'uri' => route_to('home') . '?sort=created_asc',
], 'class' => $sortBy === 'created_asc' ? 'font-semibold' : '',
])) ?>" /> ],
])
) ?>" />
</div> </div>
<div class="grid gap-4 mt-4 grid-cols-cards"> <div class="grid gap-4 mt-4 grid-cols-cards">
<?php if ($podcasts): ?> <?php if ($podcasts): ?>
@ -85,8 +63,8 @@
<?php if ($podcast->is_premium): ?> <?php if ($podcast->is_premium): ?>
<div class="absolute top-0 left-0 z-10 inline-flex items-center mt-2 gap-x-2"> <div class="absolute top-0 left-0 z-10 inline-flex items-center mt-2 gap-x-2">
<?= icon('exchange-dollar-fill', [ <?= icon('exchange-dollar-fill', [
'class' => 'w-8 pl-2 text-2xl rounded-r-full rounded-tl-lg text-accent-contrast bg-accent-base', 'class' => 'w-8 pl-2 text-2xl rounded-r-full rounded-tl-lg text-accent-contrast bg-accent-base',
]) ?> ]) ?>
<?= explicit_badge($podcast->parental_advisory === 'explicit', 'rounded bg-black/75') ?> <?= explicit_badge($podcast->parental_advisory === 'explicit', 'rounded bg-black/75') ?>
</div> </div>
<?php else: ?> <?php else: ?>

Some files were not shown because too many files have changed in this diff Show more