From 6024c8334186685d0f6f3692e10a73dac103ec51 Mon Sep 17 00:00:00 2001 From: Bugo Date: Mon, 6 Jan 2025 14:29:15 +0500 Subject: [PATCH 01/15] Refactor code --- src/Sources/LightPortal/Lists/IconList.php | 136 +++++++++--------- src/Sources/LightPortal/Plugins/Block.php | 13 +- .../Plugins/BoardNews/BoardNews.php | 119 +++++++-------- .../Plugins/BoardStats/BoardStats.php | 10 +- .../LightPortal/Plugins/Events/Events.php | 10 +- .../LightPortal/Plugins/Polls/Polls.php | 4 +- .../Plugins/RandomTopics/RandomTopics.php | 3 +- .../Plugins/RecentPosts/RecentPosts.php | 10 +- .../Plugins/RecentTopics/RecentTopics.php | 10 +- .../Plugins/SimpleFeeder/SimpleFeeder.php | 10 +- .../Plugins/WhosOnline/WhosOnline.php | 10 +- src/Sources/LightPortal/Utils/Cache.php | 10 +- src/Sources/LightPortal/Utils/Setting.php | 2 +- 13 files changed, 165 insertions(+), 182 deletions(-) diff --git a/src/Sources/LightPortal/Lists/IconList.php b/src/Sources/LightPortal/Lists/IconList.php index d3639f34f..18b7cf679 100644 --- a/src/Sources/LightPortal/Lists/IconList.php +++ b/src/Sources/LightPortal/Lists/IconList.php @@ -26,76 +26,76 @@ final class IconList implements ListInterface { private string $prefix = 'fa-solid fa-'; + private array $set = [ + 'access' => 'universal-access', + 'arrow_left' => 'arrow-left-long', + 'arrow_right' => 'arrow-right-long', + 'arrows' => 'up-down-left-right', + 'bold' => 'bold', + 'calendar' => 'calendar', + 'category' => 'rectangle-list', + 'chevron_right' => 'circle-chevron-right', + 'circle_dot' => 'circle-dot', + 'circle' => 'circle', + 'close' => 'xmark', + 'code' => 'code', + 'cog_spin' => 'cog fa-spin', + 'comments' => 'comments fa-fw', + 'content' => 'newspaper fa-2x', + 'copyright' => 'copyright', + 'date' => 'clock', + 'design' => 'object-group', + 'dislike' => 'arrow-down', + 'donate' => 'circle-dollar-to-slot fa-3x', + 'download' => 'download fa-3x', + 'edit' => 'pen-to-square', + 'ellipsis' => 'ellipsis', + 'export' => 'file-export', + 'gear' => '2x fa-gear', + 'home' => 'house', + 'image' => 'image', + 'import' => 'file-import', + 'italic' => 'italic', + 'like' => 'arrow-up', + 'link' => 'link', + 'list' => 'list-ul', + 'main' => 'table-list', + 'map_signs' => 'signs-post', + 'meteor' => 'meteor', + 'pager' => 'pager', + 'panels' => 'table-columns', + 'plus_circle' => 'circle-plus', + 'plus' => 'plus fa-beat', + 'preview' => 'eye', + 'quote' => 'quote-right', + 'redirect' => 'diamond-turn-right', + 'remove' => 'trash', + 'replies' => 'comment', + 'reply' => 'reply', + 'search' => 'magnifying-glass', + 'sections' => 'folder', + 'sign_in_alt' => 'right-to-bracket', + 'sign_out_alt' => 'right-from-bracket', + 'simple' => 'table-list fa-2x', + 'sort' => 'sort', + 'spider' => 'spider', + 'submit' => 'paper-plane', + 'tag' => 'tag', + 'tags' => 'tags fa-fw', + 'task' => 'list-check', + 'tile' => 'border-all fa-2x', + 'tools' => 'sliders', + 'undo' => 'rotate-left', + 'unlike' => 'heart-crack', + 'user_plus' => 'user-plus', + 'user' => 'user', + 'users' => 'users', + 'views' => 'eye', + ]; + public function __invoke(): array { - $set = [ - 'access' => 'universal-access', - 'arrow_left' => 'arrow-left-long', - 'arrow_right' => 'arrow-right-long', - 'arrows' => 'up-down-left-right', - 'bold' => 'bold', - 'calendar' => 'calendar', - 'category' => 'rectangle-list', - 'chevron_right' => 'circle-chevron-right', - 'circle_dot' => 'circle-dot', - 'circle' => 'circle', - 'close' => 'xmark', - 'code' => 'code', - 'cog_spin' => 'cog fa-spin', - 'comments' => 'comments fa-fw', - 'content' => 'newspaper fa-2x', - 'copyright' => 'copyright', - 'date' => 'clock', - 'design' => 'object-group', - 'dislike' => 'arrow-down', - 'donate' => 'circle-dollar-to-slot fa-3x', - 'download' => 'download fa-3x', - 'edit' => 'pen-to-square', - 'ellipsis' => 'ellipsis', - 'export' => 'file-export', - 'gear' => '2x fa-gear', - 'home' => 'house', - 'image' => 'image', - 'import' => 'file-import', - 'italic' => 'italic', - 'like' => 'arrow-up', - 'link' => 'link', - 'list' => 'list-ul', - 'main' => 'table-list', - 'map_signs' => 'signs-post', - 'meteor' => 'meteor', - 'pager' => 'pager', - 'panels' => 'table-columns', - 'plus_circle' => 'circle-plus', - 'plus' => 'plus fa-beat', - 'preview' => 'eye', - 'quote' => 'quote-right', - 'redirect' => 'diamond-turn-right', - 'remove' => 'trash', - 'replies' => 'comment', - 'reply' => 'reply', - 'search' => 'magnifying-glass', - 'sections' => 'folder', - 'sign_in_alt' => 'right-to-bracket', - 'sign_out_alt' => 'right-from-bracket', - 'simple' => 'table-list fa-2x', - 'sort' => 'sort', - 'spider' => 'spider', - 'submit' => 'paper-plane', - 'tag' => 'tag', - 'tags' => 'tags fa-fw', - 'task' => 'list-check', - 'tile' => 'border-all fa-2x', - 'tools' => 'sliders', - 'undo' => 'rotate-left', - 'unlike' => 'heart-crack', - 'user_plus' => 'user-plus', - 'user' => 'user', - 'users' => 'users', - 'views' => 'eye', - ]; - - $set = array_map(fn($icon): string => $this->prefix . $icon, $set); + $set = array_map(fn($icon): string => $this->prefix . $icon, $this->set); $set['youtube'] = 'fa-brands fa-youtube'; $set['save_exit'] = 'fa-solid fa-envelope-open-text'; diff --git a/src/Sources/LightPortal/Plugins/Block.php b/src/Sources/LightPortal/Plugins/Block.php index 909268c67..4026bcdfc 100644 --- a/src/Sources/LightPortal/Plugins/Block.php +++ b/src/Sources/LightPortal/Plugins/Block.php @@ -21,16 +21,15 @@ abstract class Block extends Plugin { public string $type = 'block'; - public function isInPlacements(int $block_id, array $positions): bool + public function isInPlacements(int $id, array $placements): bool { - return in_array( - (Utils::$context['lp_active_blocks'][$block_id] ?? Utils::$context['lp_block'])['placement'], - $positions - ); + $block = Utils::$context['lp_active_blocks'][$id] ?? Utils::$context['lp_block']; + + return in_array($block['placement'], $placements); } - public function isInSidebar(int $block_id): bool + public function isInSidebar(int $id): bool { - return $this->isInPlacements($block_id, ['left', 'right']); + return $this->isInPlacements($id, ['left', 'right']); } } diff --git a/src/Sources/LightPortal/Plugins/BoardNews/BoardNews.php b/src/Sources/LightPortal/Plugins/BoardNews/BoardNews.php index b4d251c15..2a00fe153 100644 --- a/src/Sources/LightPortal/Plugins/BoardNews/BoardNews.php +++ b/src/Sources/LightPortal/Plugins/BoardNews/BoardNews.php @@ -8,7 +8,7 @@ * @license https://spdx.org/licenses/GPL-3.0-or-later.html GPL-3.0-or-later * * @category plugin - * @version 05.01.25 + * @version 08.01.25 */ namespace Bugo\LightPortal\Plugins\BoardNews; @@ -25,6 +25,7 @@ use Bugo\LightPortal\UI\Fields\RangeField; use Bugo\LightPortal\Utils\MessageIndex; use Bugo\LightPortal\Utils\Str; +use Nette\Utils\Html; use WPLake\Typed\Typed; if (! defined('LP_NAME')) @@ -121,61 +122,7 @@ public function prepareContent(Event $e): void $news['link'] . ($news['locked'] ? '' : ' | ' . $news['comment_link']) ); - if (! empty($news['likes'])) { - $content->addHtml(Str::html('br')->class('clear')); - $likesList = Str::html('ul'); - - if ($news['likes']['can_like']) { - $likesList->addHtml( - Str::html('li')->class('smflikebutton')->id('msg_' . $news['message_id'] . '_likes') - ->addHtml( - Str::html('a')->href(implode('', [ - Config::$scripturl, - '?action=likes;ltype=msg;sa=like;like=', - $news['message_id'] . ';', - Utils::$context['session_var'] . '=', - Utils::$context['session_id'] - ])) - ->class('msg_like') - ->addHtml( - Str::html('span')->class($news['likes']['you'] ? 'unlike' : 'like') . - ($news['likes']['you'] ? Lang::$txt['unlike'] : Lang::$txt['like']) - ) - ) - ); - } - - if ($news['likes']['count'] > 0) { - Utils::$context['some_likes'] = true; - - $count = $news['likes']['count']; - $base = 'likes_'; - if ($news['likes']['you']) { - $base = 'you_' . $base; - $count--; - } - - $base .= (isset(Lang::$txt[$base . $count])) ? $count : 'n'; - - $likesList->addHtml( - Str::html('li')->class('like_count smalltext')->setHtml( - sprintf( - Lang::$txt[$base], - implode('', [ - Config::$scripturl, - '?action=likes;sa=view;ltype=msg;like=', - $news['message_id'] . ';', - Utils::$context['session_var'] . '=', - Utils::$context['session_id'] - ]), - Lang::numberFormat($count) - ) - ) - ); - } - - $content->addHtml($likesList); - } + $this->processLikes($news, $content); echo $content; @@ -184,4 +131,64 @@ public function prepareContent(Event $e): void } } } + + private function processLikes(array $news, Html $content): void + { + if (empty($news['likes'])) + return; + + $content->addHtml(Str::html('br')->class('clear')); + $likesList = Str::html('ul'); + + if ($news['likes']['can_like']) { + $likesList->addHtml( + Str::html('li')->class('smflikebutton')->id('msg_' . $news['message_id'] . '_likes') + ->addHtml( + Str::html('a')->href(implode('', [ + Config::$scripturl, + '?action=likes;ltype=msg;sa=like;like=', + $news['message_id'] . ';', + Utils::$context['session_var'] . '=', + Utils::$context['session_id'] + ])) + ->class('msg_like') + ->addHtml( + Str::html('span')->class($news['likes']['you'] ? 'unlike' : 'like') . + ($news['likes']['you'] ? Lang::$txt['unlike'] : Lang::$txt['like']) + ) + ) + ); + } + + if ($news['likes']['count'] > 0) { + Utils::$context['some_likes'] = true; + + $count = $news['likes']['count']; + $base = 'likes_'; + if ($news['likes']['you']) { + $base = 'you_' . $base; + $count--; + } + + $base .= (isset(Lang::$txt[$base . $count])) ? $count : 'n'; + + $likesList->addHtml( + Str::html('li')->class('like_count smalltext')->setHtml( + sprintf( + Lang::$txt[$base], + implode('', [ + Config::$scripturl, + '?action=likes;sa=view;ltype=msg;like=', + $news['message_id'] . ';', + Utils::$context['session_var'] . '=', + Utils::$context['session_id'] + ]), + Lang::numberFormat($count) + ) + ) + ); + } + + $content->addHtml($likesList); + } } diff --git a/src/Sources/LightPortal/Plugins/BoardStats/BoardStats.php b/src/Sources/LightPortal/Plugins/BoardStats/BoardStats.php index fd7792418..ab0594e02 100644 --- a/src/Sources/LightPortal/Plugins/BoardStats/BoardStats.php +++ b/src/Sources/LightPortal/Plugins/BoardStats/BoardStats.php @@ -8,7 +8,7 @@ * @license https://spdx.org/licenses/GPL-3.0-or-later.html GPL-3.0-or-later * * @category plugin - * @version 05.01.25 + * @version 06.01.25 */ namespace Bugo\LightPortal\Plugins\BoardStats; @@ -109,14 +109,8 @@ public function prepareContent(Event $e): void { $parameters = $e->args->parameters; - $cacheTime = Typed::int($parameters['update_interval']); - - if ($this->request()->has('preview')) { - $cacheTime = 0; - } - $boardStats = $this->cache($this->name . '_addon_b' . $e->args->id . '_u' . User::$info['id']) - ->setLifeTime($cacheTime) + ->setLifeTime(Typed::int($parameters['update_interval'])) ->setFallback(fn() => $this->getData($parameters)); if (empty($boardStats)) diff --git a/src/Sources/LightPortal/Plugins/Events/Events.php b/src/Sources/LightPortal/Plugins/Events/Events.php index aa0a3ba80..4770d1ab9 100644 --- a/src/Sources/LightPortal/Plugins/Events/Events.php +++ b/src/Sources/LightPortal/Plugins/Events/Events.php @@ -8,7 +8,7 @@ * @license https://spdx.org/licenses/GPL-3.0-or-later.html GPL-3.0-or-later * * @category plugin - * @version 05.01.25 + * @version 06.01.25 */ namespace Bugo\LightPortal\Plugins\Events; @@ -112,14 +112,8 @@ public function prepareContent(Event $e): void { $parameters = $e->args->parameters; - $cacheTime = Typed::int($parameters['update_interval']); - - if ($this->request()->has('preview')) { - $cacheTime = 0; - } - $data = $this->cache($this->name . '_addon_b' . $e->args->id . '_u' . User::$info['id']) - ->setLifeTime($cacheTime) + ->setLifeTime(Typed::int($parameters['update_interval'])) ->setFallback(fn() => $this->getData($parameters)); $this->setTemplate(); diff --git a/src/Sources/LightPortal/Plugins/Polls/Polls.php b/src/Sources/LightPortal/Plugins/Polls/Polls.php index 1a12d4411..b379012fc 100644 --- a/src/Sources/LightPortal/Plugins/Polls/Polls.php +++ b/src/Sources/LightPortal/Plugins/Polls/Polls.php @@ -8,7 +8,7 @@ * @license https://spdx.org/licenses/GPL-3.0-or-later.html GPL-3.0-or-later * * @category plugin - * @version 05.01.25 + * @version 08.01.25 */ namespace Bugo\LightPortal\Plugins\Polls; @@ -82,7 +82,7 @@ public function prepareContent(Event $e): void foreach ($poll['options'] as $option) { $label = Str::html('label', ['for' => $option['id']]) - ->setText($option['vote_button'] . ' ' . $option['option']); + ->addHtml($option['vote_button'] . ' ' . $option['option']); $form->addHtml($label)->addHtml('
'); } diff --git a/src/Sources/LightPortal/Plugins/RandomTopics/RandomTopics.php b/src/Sources/LightPortal/Plugins/RandomTopics/RandomTopics.php index 5f8b7c85a..15af44990 100644 --- a/src/Sources/LightPortal/Plugins/RandomTopics/RandomTopics.php +++ b/src/Sources/LightPortal/Plugins/RandomTopics/RandomTopics.php @@ -8,7 +8,7 @@ * @license https://spdx.org/licenses/GPL-3.0-or-later.html GPL-3.0-or-later * * @category plugin - * @version 05.01.25 + * @version 08.01.25 */ namespace Bugo\LightPortal\Plugins\RandomTopics; @@ -244,6 +244,7 @@ public function prepareContent(Event $e): void $li->addHtml( Str::html('span', Lang::$txt['new']) ->class('new_posts') + ->style('margin-right: 4px') ); } diff --git a/src/Sources/LightPortal/Plugins/RecentPosts/RecentPosts.php b/src/Sources/LightPortal/Plugins/RecentPosts/RecentPosts.php index eadb696b5..cb239a795 100644 --- a/src/Sources/LightPortal/Plugins/RecentPosts/RecentPosts.php +++ b/src/Sources/LightPortal/Plugins/RecentPosts/RecentPosts.php @@ -8,7 +8,7 @@ * @license https://spdx.org/licenses/GPL-3.0-or-later.html GPL-3.0-or-later * * @category plugin - * @version 05.01.25 + * @version 06.01.25 */ namespace Bugo\LightPortal\Plugins\RecentPosts; @@ -201,14 +201,8 @@ public function prepareContent(Event $e): void { $parameters = $e->args->parameters; - $cacheTime = Typed::int($parameters['update_interval']); - - if ($this->request()->has('preview')) { - $cacheTime = 0; - } - $recentPosts = $this->cache($this->name . '_addon_b' . $e->args->id . '_u' . User::$info['id']) - ->setLifeTime($cacheTime) + ->setLifeTime(Typed::int($parameters['update_interval'])) ->setFallback(fn() => $this->getData($parameters)); if (empty($recentPosts)) diff --git a/src/Sources/LightPortal/Plugins/RecentTopics/RecentTopics.php b/src/Sources/LightPortal/Plugins/RecentTopics/RecentTopics.php index 156134803..3f463bfd5 100644 --- a/src/Sources/LightPortal/Plugins/RecentTopics/RecentTopics.php +++ b/src/Sources/LightPortal/Plugins/RecentTopics/RecentTopics.php @@ -8,7 +8,7 @@ * @license https://spdx.org/licenses/GPL-3.0-or-later.html GPL-3.0-or-later * * @category plugin - * @version 05.01.25 + * @version 06.01.25 */ namespace Bugo\LightPortal\Plugins\RecentTopics; @@ -150,14 +150,8 @@ public function prepareContent(Event $e): void { $parameters = $e->args->parameters; - $cacheTime = Typed::int($parameters['update_interval']); - - if ($this->request()->has('preview')) { - $cacheTime = 0; - } - $recentTopics = $this->cache($this->name . '_addon_b' . $e->args->id . '_u' . User::$info['id']) - ->setLifeTime($cacheTime) + ->setLifeTime(Typed::int($parameters['update_interval'])) ->setFallback(fn() => $this->getData($parameters)); if (empty($recentTopics)) diff --git a/src/Sources/LightPortal/Plugins/SimpleFeeder/SimpleFeeder.php b/src/Sources/LightPortal/Plugins/SimpleFeeder/SimpleFeeder.php index c78539405..1e20a8af4 100644 --- a/src/Sources/LightPortal/Plugins/SimpleFeeder/SimpleFeeder.php +++ b/src/Sources/LightPortal/Plugins/SimpleFeeder/SimpleFeeder.php @@ -8,7 +8,7 @@ * @license https://spdx.org/licenses/GPL-3.0-or-later.html GPL-3.0-or-later * * @category plugin - * @version 05.01.25 + * @version 08.01.25 */ namespace Bugo\LightPortal\Plugins\SimpleFeeder; @@ -70,7 +70,8 @@ public function getData(string $url): array return []; $file = file_get_contents($url); - $rss = simplexml_load_string($file); + + $rss = $file === false ? false : simplexml_load_string($file); return $rss ? ['data' => $rss->channel->item] : []; } @@ -86,8 +87,9 @@ public function prepareContent(Event $e): void if (empty($feed)) return; - if (isset($feed['data'])) + if (isset($feed['data'])) { $feed = $feed['data']; + } foreach ($feed as $item) { echo Str::html('div', ['class' => 'windowbg']) @@ -97,7 +99,7 @@ public function prepareContent(Event $e): void Str::html('span', ['class' => 'floatleft']) ->addHtml( Str::html('h5') - ->addHtml(Str::html('a')->href($item->link)->setText($item->title)) + ->addHtml(Str::html('a')->href((string) $item->link)->setText($item->title)) ) ->addHtml( Str::html('em') diff --git a/src/Sources/LightPortal/Plugins/WhosOnline/WhosOnline.php b/src/Sources/LightPortal/Plugins/WhosOnline/WhosOnline.php index 7f4c484cc..af4c97982 100644 --- a/src/Sources/LightPortal/Plugins/WhosOnline/WhosOnline.php +++ b/src/Sources/LightPortal/Plugins/WhosOnline/WhosOnline.php @@ -8,7 +8,7 @@ * @license https://spdx.org/licenses/GPL-3.0-or-later.html GPL-3.0-or-later * * @category plugin - * @version 05.01.25 + * @version 06.01.25 */ namespace Bugo\LightPortal\Plugins\WhosOnline; @@ -71,14 +71,8 @@ public function prepareContent(Event $e): void { $parameters = $e->args->parameters; - $cacheTime = Typed::int($parameters['update_interval']); - - if ($this->request()->has('preview')) { - $cacheTime = 0; - } - $whoIsOnline = $this->cache($this->name . '_addon_b' . $e->args->id . '_u' . User::$info['id']) - ->setLifeTime($cacheTime) + ->setLifeTime(Typed::int($parameters['update_interval'])) ->setFallback(fn() => $this->getFromSSI('whosOnline', 'array')); if (empty($whoIsOnline)) diff --git a/src/Sources/LightPortal/Utils/Cache.php b/src/Sources/LightPortal/Utils/Cache.php index 92143f1ef..f762bb296 100644 --- a/src/Sources/LightPortal/Utils/Cache.php +++ b/src/Sources/LightPortal/Utils/Cache.php @@ -19,14 +19,18 @@ final class Cache implements CacheInterface { + use RequestTrait; + private string $prefix = 'lp_'; - public function __construct(private readonly ?string $key = null, private int $lifeTime = LP_CACHE_TIME ?? 0) - { - } + public function __construct(private readonly ?string $key = null, private int $lifeTime = LP_CACHE_TIME ?? 0) {} public function setLifeTime(int $lifeTime): self { + if ($this->request()->has('preview')) { + $lifeTime = 0; + } + $this->lifeTime = $lifeTime; return $this; diff --git a/src/Sources/LightPortal/Utils/Setting.php b/src/Sources/LightPortal/Utils/Setting.php index 51279cf42..16508fd43 100644 --- a/src/Sources/LightPortal/Utils/Setting.php +++ b/src/Sources/LightPortal/Utils/Setting.php @@ -118,7 +118,7 @@ public static function getPanelDirection(string $panel): string { $directions = self::get('lp_panel_direction', 'array', [], 'json'); - return (string) $directions[$panel]; + return $directions[$panel] ?? '0'; } public static function isSwapLeftRight(): bool From c31a02b10679cd99b5bad4db5915fe7cfe329a4f Mon Sep 17 00:00:00 2001 From: Bugo Date: Thu, 9 Jan 2025 00:13:34 +0500 Subject: [PATCH 02/15] Remove testers section --- src/Sources/LightPortal/Areas/CreditArea.php | 11 ----------- .../default/LightPortal/ViewCredits.template.php | 12 ------------ .../languages/LightPortal/LightPortal.english.php | 1 - 3 files changed, 24 deletions(-) diff --git a/src/Sources/LightPortal/Areas/CreditArea.php b/src/Sources/LightPortal/Areas/CreditArea.php index d22d2c23c..66f2cbbb3 100644 --- a/src/Sources/LightPortal/Areas/CreditArea.php +++ b/src/Sources/LightPortal/Areas/CreditArea.php @@ -109,17 +109,6 @@ private function prepareComponents(): void ] ]; - Utils::$context['testers'] = [ - [ - 'name' => 'Wylek', - 'link' => 'https://www.simplemachines.org/community/index.php?action=profile;u=608635' - ], - [ - 'name' => 'Panoulis64', - 'link' => 'https://www.simplemachines.org/community/index.php?action=profile;u=301719' - ] - ]; - Utils::$context['sponsors'] = [ [ 'name' => 'vbgamer45 $50', diff --git a/src/Themes/default/LightPortal/ViewCredits.template.php b/src/Themes/default/LightPortal/ViewCredits.template.php index b6f5c56c2..477c461d5 100644 --- a/src/Themes/default/LightPortal/ViewCredits.template.php +++ b/src/Themes/default/LightPortal/ViewCredits.template.php @@ -37,18 +37,6 @@ function template_portal_credits(): void ', $tester['name'], ''; } - echo ' - -
-

', Lang::$txt['lp_testers'], '

-
-
'; - - foreach (Utils::$context['testers'] as $tester) { - echo ' - ', $tester['name'], ''; - } - echo '
diff --git a/src/Themes/default/languages/LightPortal/LightPortal.english.php b/src/Themes/default/languages/LightPortal/LightPortal.english.php index bdc7bfd9d..420603f19 100644 --- a/src/Themes/default/languages/LightPortal/LightPortal.english.php +++ b/src/Themes/default/languages/LightPortal/LightPortal.english.php @@ -523,7 +523,6 @@ $txt['lp_contributors'] = 'Contribution to the development of the portal'; $txt['lp_translators'] = 'Translators'; $txt['lp_consultants'] = 'Consultants'; -$txt['lp_testers'] = 'Testers'; $txt['lp_sponsors'] = 'Sponsors'; $txt['lp_tools'] = 'Tools'; $txt['lp_used_components'] = 'The portal components'; From d71f81bf517cbc1f052dae61d02bae5a19bdc61b Mon Sep 17 00:00:00 2001 From: Bugo Date: Thu, 9 Jan 2025 00:14:08 +0500 Subject: [PATCH 03/15] Fix the issue with wrong sidebar width --- .../default/LightPortal/ViewBlocks.template.php | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/Themes/default/LightPortal/ViewBlocks.template.php b/src/Themes/default/LightPortal/ViewBlocks.template.php index 8562a2276..d7b745abe 100644 --- a/src/Themes/default/LightPortal/ViewBlocks.template.php +++ b/src/Themes/default/LightPortal/ViewBlocks.template.php @@ -69,15 +69,16 @@ function render_blocks_within(string $panel): void if (empty(Utils::$context['lp_blocks'][$panel])) return; + $method = 'get' . ucfirst($panel) . 'PanelWidth'; + switch ($panel) { case 'header': case 'footer': - $panelWidthMethod = 'get' . ucfirst($panel) . 'PanelWidth'; - $panelWidth = Setting::$panelWidthMethod(); + $xs = Setting::$method(); echo /** @lang text */ '
-
'; +
'; lp_show_blocks($panel); @@ -88,8 +89,8 @@ function render_blocks_within(string $panel): void case 'left': case 'right': - $lg = Setting::getLeftPanelWidth()['lg']; - $xl = Setting::getLeftPanelWidth()['xl']; + $lg = Setting::$method()['lg']; + $xl = Setting::$method()['xl']; $class = empty(Config::$modSettings['lp_' . $panel . '_panel_sticky']) ? '' : ' class="sticky_sidebar"'; echo ' From 33aeac9885e0b80bd684fdd503e93a83c60bf5ce Mon Sep 17 00:00:00 2001 From: Bugo Date: Thu, 9 Jan 2025 10:27:32 +0500 Subject: [PATCH 04/15] Check the portal version to display plugin list --- src/Sources/LightPortal/Areas/PluginArea.php | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/Sources/LightPortal/Areas/PluginArea.php b/src/Sources/LightPortal/Areas/PluginArea.php index 7c0272b0a..f8395fefa 100644 --- a/src/Sources/LightPortal/Areas/PluginArea.php +++ b/src/Sources/LightPortal/Areas/PluginArea.php @@ -49,6 +49,7 @@ use function unlink; use const LP_NAME; +use const LP_VERSION; if (! defined('SMF')) die('No direct access...'); @@ -377,6 +378,9 @@ private function extendPluginList(): void if (empty($xml) || ! is_array($xml)) return; + if (empty($xml['version']) || $xml['version'] !== LP_VERSION) + return; + foreach ($xml['donate'] as $addon) { Utils::$context['lp_plugins'][] = $addon['name']; Utils::$context['lp_donate'][$addon['name']] = $addon; From d1c52c5e0b3f62b19efd3450c05ceab94843bbba Mon Sep 17 00:00:00 2001 From: Bugo Date: Sat, 11 Jan 2025 11:46:35 +0500 Subject: [PATCH 05/15] Update PluginMaker --- .../Plugins/PluginMaker/Generator.php | 468 +++++++++--------- .../Plugins/PluginMaker/Handler.php | 3 +- .../Plugins/PluginMaker/License.php | 39 ++ .../Plugins/PluginMaker/Validator.php | 22 +- 4 files changed, 290 insertions(+), 242 deletions(-) create mode 100644 src/Sources/LightPortal/Plugins/PluginMaker/License.php diff --git a/src/Sources/LightPortal/Plugins/PluginMaker/Generator.php b/src/Sources/LightPortal/Plugins/PluginMaker/Generator.php index 30bbbd7a5..73f733838 100644 --- a/src/Sources/LightPortal/Plugins/PluginMaker/Generator.php +++ b/src/Sources/LightPortal/Plugins/PluginMaker/Generator.php @@ -8,7 +8,7 @@ * @license https://spdx.org/licenses/GPL-3.0-or-later.html GPL-3.0-or-later * * @category plugin - * @version 22.12.24 + * @version 09.01.25 */ namespace Bugo\LightPortal\Plugins\PluginMaker; @@ -32,6 +32,7 @@ use Bugo\LightPortal\UI\Fields\TextField; use Bugo\LightPortal\Utils\Setting; use Nette\PhpGenerator\ClassType; +use Nette\PhpGenerator\Method; use Nette\PhpGenerator\PhpFile; use Nette\PhpGenerator\PhpNamespace; use Nette\PhpGenerator\Printer; @@ -55,39 +56,42 @@ class Generator { + private PhpNamespace $namespace; + + private ClassType $class; + public function __construct(private array $plugin) { require_once __DIR__ . '/vendor/autoload.php'; - $this->generate(); - } + $this->namespace = $this->getNamespace(); - public function generate(): void - { - $namespace = $this->getNamespace(); - - $class = ($namespace->addClass($this->plugin['name'])) + $this->class = ($this->namespace->addClass($this->plugin['name'])) ->addComment('Generated by PluginMaker') ->setExtends($this->plugin['type'] === PluginType::BLOCK->name() ? Block::class : Plugin::class); + } - $this->addProperties($class); - $this->addFrontLayoutsMethod($class); - $this->addCustomLayoutExtensionsMethod($class); - $this->addInitMethod($class); - $this->addUpdateAdminAreasMethod($class); - $this->addPrepareBlockParamsMethod($class); - $this->addValidateBlockParamsMethod($class); - $this->addPrepareBlockFieldsMethod($class, $namespace); - $this->addPreparePageParamsMethod($class); - $this->addValidatePageParamsMethod($class); - $this->addPreparePageFieldsMethod($class); - $this->addAddSettingsMethod($class); - $this->addParseContentMethod($class); - $this->addPrepareContentMethod($class); - $this->addPrepareEditorMethod($class); - $this->addCommentsMethod($class); - $this->addCreditsMethod($class); - $this->createFile($namespace); + public function generate(): void + { + $this->addProperties(); + $this->addFrontLayoutsMethod(); + $this->addCustomLayoutExtensionsMethod(); + $this->addInitMethod(); + $this->addUpdateAdminAreasMethod(); + $this->addPrepareBlockParamsMethod(); + $this->addValidateBlockParamsMethod(); + $this->addPrepareBlockFieldsMethod(); + $this->addPreparePageParamsMethod(); + $this->addValidatePageParamsMethod(); + $this->addPreparePageFieldsMethod(); + $this->handleOptions(); + $this->addAddSettingsMethod(); + $this->addParseContentMethod(); + $this->addPrepareContentMethod(); + $this->addPrepareEditorMethod(); + $this->addCommentsMethod(); + $this->addCreditsMethod(); + $this->createFile(); } private function getNamespace(): PhpNamespace @@ -107,45 +111,7 @@ private function getNamespace(): PhpNamespace return $namespace; } - private function getSpecialParams(string $type = 'block'): array - { - $params = []; - $this->plugin[$type . '_options'] = []; - foreach ($this->plugin['options'] as $id => $option) { - if (str_contains((string) $option['name'], $type . '_')) { - $option['name'] = str_replace($type . '_', '', (string) $option['name']); - $params[] = $option; - $this->plugin[$type . '_options'][$id] = $option; - unset($this->plugin['options'][$id]); - } - } - - return $params; - } - - private function getDefaultValue(array $option): string - { - $default = match ($option['type']) { - 'int' => (int) $option['default'], - 'float' => (float) $option['default'], - default => $option['default'], - }; - - return var_export($default, true); - } - - private function getFilter(array $param): string - { - return match ($param['type']) { - 'url' => 'FILTER_VALIDATE_URL', - 'int', 'range' => 'FILTER_VALIDATE_INT', - 'float' => 'FILTER_VALIDATE_FLOAT', - 'check' => 'FILTER_VALIDATE_BOOLEAN', - default => 'FILTER_DEFAULT', - }; - } - - private function addProperties(ClassType $class): void + private function addProperties(): void { $property = $this->plugin['type']; @@ -154,35 +120,35 @@ private function addProperties(ClassType $class): void } if ($property !== PluginType::BLOCK->name()) { - $class + $this->class ->addProperty('type', $property) ->setType('string'); } if (! empty($this->plugin['icon'])) { - $class + $this->class ->addProperty('icon', $this->plugin['icon']) ->setType('string'); } if ($this->plugin['type'] === PluginType::FRONTPAGE->name()) { - $class + $this->class ->addProperty('saveable', false) ->setType('bool'); - $class + $this->class ->addProperty('extension', '.ext') ->setPrivate() ->setType('string'); } } - private function addFrontLayoutsMethod(ClassType $class): void + private function addFrontLayoutsMethod(): void { if ($this->plugin['type'] !== PluginType::FRONTPAGE->name()) return; - $class + $this->class ->addMethod(PortalHook::frontLayouts->name) ->setReturnType('void') ->addBody("if (! str_contains(Config::\$modSettings['lp_frontpage_layout'], \$this->extension))") @@ -194,12 +160,12 @@ private function addFrontLayoutsMethod(ClassType $class): void ->addBody("Config::\$modSettings['lp_frontpage_layout'] = '';" . PHP_EOL); } - private function addCustomLayoutExtensionsMethod(ClassType $class): void + private function addCustomLayoutExtensionsMethod(): void { if ($this->plugin['type'] !== PluginType::FRONTPAGE->name()) return; - $class + $this->class ->addMethod(PortalHook::layoutExtensions->name) ->setReturnType('void') ->setBody("\$e->args->extensions[] = \$this->extension;") @@ -207,32 +173,32 @@ private function addCustomLayoutExtensionsMethod(ClassType $class): void ->setType(Event::class); } - private function addInitMethod(ClassType $class): void + private function addInitMethod(): void { if ($this->plugin['type'] === PluginType::PARSER->name()) { - $class + $this->class ->addMethod(PortalHook::init->name) ->setReturnType('void') ->setBody("Utils::\$context['lp_content_types'][\$this->name] = '" . $this->plugin['name'] . "';"); } else if ($this->plugin['type'] === PluginType::COMMENT->name()) { - $class + $this->class ->addMethod(PortalHook::init->name) ->setReturnType('void') ->setBody("Lang::\$txt['lp_comment_block_set'][\$this->name] = '" . $this->plugin['name'] . "';"); } else if (! empty($this->plugin['smf_hooks'])) { - $class + $this->class ->addMethod(PortalHook::init->name) ->setReturnType('void') ->setBody("// \$this->applyHook('hook_name');"); } } - private function addUpdateAdminAreasMethod(ClassType $class): void + private function addUpdateAdminAreasMethod(): void { if ($this->plugin['type'] !== PluginType::IMPEX->name()) return; - $method = $class + $method = $this->class ->addMethod(PortalHook::updateAdminAreas->name) ->setReturnType('void'); @@ -243,12 +209,12 @@ private function addUpdateAdminAreasMethod(ClassType $class): void $method->addBody("// Check out the TinyPortalMigration plugin as an example"); } - private function addPrepareBlockParamsMethod(ClassType $class): void + private function addPrepareBlockParamsMethod(): void { if (! in_array($this->plugin['type'], [PluginType::BLOCK->name(), PluginType::BLOCK_OPTIONS->name()])) return; - $method = $class + $method = $this->class ->addMethod(PortalHook::prepareBlockParams->name) ->setReturnType('void'); @@ -270,12 +236,12 @@ private function addPrepareBlockParamsMethod(ClassType $class): void $method->addBody("];"); } - private function addValidateBlockParamsMethod(ClassType $class): void + private function addValidateBlockParamsMethod(): void { if (! in_array($this->plugin['type'], [PluginType::BLOCK->name(), PluginType::BLOCK_OPTIONS->name()])) return; - $method = $class + $method = $this->class ->addMethod(PortalHook::validateBlockParams->name) ->setReturnType('void'); @@ -297,12 +263,12 @@ private function addValidateBlockParamsMethod(ClassType $class): void $method->addBody("];"); } - private function addPrepareBlockFieldsMethod(ClassType $class, PhpNamespace $namespace): void + private function addPrepareBlockFieldsMethod(): void { if (! in_array($this->plugin['type'], [PluginType::BLOCK->name(), PluginType::BLOCK_OPTIONS->name()])) return; - $method = $class + $method = $this->class ->addMethod(PortalHook::prepareBlockFields->name) ->setReturnType('void'); @@ -312,102 +278,15 @@ private function addPrepareBlockFieldsMethod(ClassType $class, PhpNamespace $nam $method->addBody("// Your code" . PHP_EOL); - if (empty($blockParams = $this->getSpecialParams())) - return; - - foreach ($blockParams as $param) { - if ($param['type'] === 'text') { - $namespace->addUse(TextField::class); - - $method - ->addBody("TextField::make('{$param['name']}', \$this->txt['{$param['name']}'])") - ->addBody("\t->setValue(Utils::\$e->args->options['{$param['name']}']);" . PHP_EOL); - } - - if ($param['type'] === 'url') { - $namespace->addUse(TextField::class); - - $method - ->addBody("TextField::make('{$param['name']}', \$this->txt['{$param['name']}'])") - ->addBody("\t->setType('url')") - ->addBody("\t->setValue(Utils::\$e->args->options['{$param['name']}']);" . PHP_EOL); - } - - if ($param['type'] === 'check') { - $namespace->addUse(CheckboxField::class); - - $method - ->addBody("CheckboxField::make('{$param['name']}', \$this->txt['{$param['name']}'])") - ->addBody("\t->setValue(Utils::\$e->args->options['{$param['name']}']);" . PHP_EOL); - } - - if ($param['type'] === 'color') { - $namespace->addUse(ColorField::class); - - $method - ->addBody("ColorField::make('{$param['name']}', \$this->txt['{$param['name']}'])") - ->addBody("\t->setValue(Utils::\$e->args->options['{$param['name']}']);" . PHP_EOL); - } - - if ($param['type'] === 'int') { - $namespace->addUse(NumberField::class); - - $method - ->addBody("NumberField::make('{$param['name']}', \$this->txt['{$param['name']}'])") - ->addBody("\t->setValue(Utils::\$e->args->options['{$param['name']}']);" . PHP_EOL); - } - - if ($param['type'] === 'float') { - $namespace->addUse(NumberField::class); - - $method - ->addBody("NumberField::make('{$param['name']}', \$this->txt['{$param['name']}'])") - ->addBody("\t->setAttribute('step', 0.1)") - ->addBody("\t->setValue(Utils::\$e->args->options['{$param['name']}']);" . PHP_EOL); - } - - if ($param['type'] === 'select') { - $namespace->addUse(RadioField::class); - - $method - ->addBody("RadioField::make('{$param['name']}', \$this->txt['{$param['name']}'])") - ->addBody("\t->setOptions(\$this->txt['{$param['name']}_set'])") - ->addBody("\t->setValue(Utils::\$e->args->options['{$param['name']}']);" . PHP_EOL); - } - - if ($param['type'] === 'multiselect') { - $namespace->addUse(SelectField::class); - - $method - ->addBody("SelectField::make('{$param['name']}', \$this->txt['{$param['name']}'])") - ->addBody("\t->setOptions(\$this->txt['{$param['name']}_set'])") - ->addBody("\t->setValue(Utils::\$e->args->options['{$param['name']}']);" . PHP_EOL); - } - - if ($param['type'] === 'range') { - $namespace->addUse(RangeField::class); - - $method - ->addBody("RangeField::make('{$param['name']}', \$this->txt['{$param['name']}'])") - ->addBody("\t->setValue(Utils::\$e->args->options['{$param['name']}']);" . PHP_EOL); - } - - if (in_array($param['type'], ['title', 'desc', 'callback'])) { - $namespace->addUse(CustomField::class); - - $method - ->addBody("CustomField::make('{$param['name']}', \$this->txt['{$param['name']}'])") - ->addBody("\t->setValue(static fn() => '', []);" . PHP_EOL); - } - } + $this->prepareFields($method); } - private function addPreparePageParamsMethod(ClassType $class): void + private function addPreparePageParamsMethod(): void { if ($this->plugin['type'] !== PluginType::PAGE_OPTIONS->name()) return; - $method = $class + $method = $this->class ->addMethod(PortalHook::preparePageParams->name) ->setReturnType('void'); @@ -425,12 +304,12 @@ private function addPreparePageParamsMethod(ClassType $class): void } } - private function addValidatePageParamsMethod(ClassType $class): void + private function addValidatePageParamsMethod(): void { if ($this->plugin['type'] !== PluginType::PAGE_OPTIONS->name()) return; - $method = $class + $method = $this->class ->addMethod(PortalHook::validatePageParams->name) ->setReturnType('void'); @@ -452,12 +331,12 @@ private function addValidatePageParamsMethod(ClassType $class): void $method->addBody("];"); } - private function addPreparePageFieldsMethod(ClassType $class): void + private function addPreparePageFieldsMethod(): void { if ($this->plugin['type'] !== PluginType::PAGE_OPTIONS->name()) return; - $method = $class + $method = $this->class ->addMethod(PortalHook::preparePageFields->name) ->setReturnType('void'); @@ -466,14 +345,16 @@ private function addPreparePageFieldsMethod(ClassType $class): void ->setType(Event::class); $method->addBody("// Your code" . PHP_EOL); + + $this->prepareFields($method, 'page'); } - private function addAddSettingsMethod(ClassType $class): void + private function addAddSettingsMethod(): void { if (empty($this->plugin['options'])) return; - $method = $class + $method = $this->class ->addMethod(PortalHook::addSettings->name) ->setReturnType('void'); @@ -507,12 +388,12 @@ private function addAddSettingsMethod(ClassType $class): void } } - private function addParseContentMethod(ClassType $class): void + private function addParseContentMethod(): void { if ($this->plugin['type'] !== PluginType::PARSER->name()) return; - $method = $class + $method = $this->class ->addMethod(PortalHook::parseContent->name) ->setReturnType('void'); @@ -522,7 +403,7 @@ private function addParseContentMethod(ClassType $class): void $method->addBody("\$e->args->content = \$this->getParsedContent(\$e->args->content);" . PHP_EOL); - $method = $class + $method = $this->class ->addMethod('getParsedContent') ->setReturnType('string'); @@ -533,12 +414,12 @@ private function addParseContentMethod(ClassType $class): void $method->addBody("return '';"); } - private function addPrepareContentMethod(ClassType $class): void + private function addPrepareContentMethod(): void { if (! in_array($this->plugin['type'], [PluginType::BLOCK->name(), PluginType::SSI->name()])) return; - $method = $class + $method = $this->class ->addMethod(PortalHook::prepareContent->name) ->setReturnType('void'); @@ -556,12 +437,12 @@ private function addPrepareContentMethod(ClassType $class): void } } - private function addPrepareEditorMethod(ClassType $class): void + private function addPrepareEditorMethod(): void { if ($this->plugin['type'] !== PluginType::EDITOR->name()) return; - $method = $class + $method = $this->class ->addMethod(PortalHook::prepareEditor->name) ->setReturnType('void'); @@ -573,12 +454,12 @@ private function addPrepareEditorMethod(ClassType $class): void ->addBody("var_dump(\$e->args->object);"); } - private function addCommentsMethod(ClassType $class): void + private function addCommentsMethod(): void { if ($this->plugin['type'] !== PluginType::COMMENT->name()) return; - $method = $class + $method = $this->class ->addMethod(PortalHook::comments->name) ->setReturnType('void'); @@ -588,12 +469,12 @@ private function addCommentsMethod(ClassType $class): void ->addBody("// Your code"); } - private function addCreditsMethod(ClassType $class): void + private function addCreditsMethod(): void { if (empty($this->plugin['components'])) return; - $method = $class + $method = $this->class ->addMethod(PortalHook::credits->name) ->setReturnType('void'); @@ -613,27 +494,173 @@ private function addCreditsMethod(ClassType $class): void ->addBody("];"); } + private function createFile(): void + { + $file = new PhpFile; + $file->addNamespace($this->namespace); + + $this->addDocBlock($file); + + $printer = new class extends Printer {}; + $printer->linesBetweenProperties = 1; + $printer->linesBetweenMethods = 1; + + $content = $printer->printFile($file); + + $plugin = new Builder($this->plugin['name']); + $plugin->create($content); + + $this->createLanguages($plugin); + } + + private function getSpecialParams(string $type = 'block'): array + { + $params = []; + $this->plugin[$type . '_options'] = []; + foreach ($this->plugin['options'] as $id => $option) { + if (str_contains((string) $option['name'], $type . '_')) { + $option['name'] = str_replace($type . '_', '', (string) $option['name']); + $params[] = $option; + $this->plugin[$type . '_options'][$id] = $option; + } + } + + return $params; + } + + private function getDefaultValue(array $option): string + { + $default = match ($option['type']) { + 'int' => (int) $option['default'], + 'float' => (float) $option['default'], + default => $option['default'], + }; + + return var_export($default, true); + } + + private function getFilter(array $param): string + { + return match ($param['type']) { + 'url' => 'FILTER_VALIDATE_URL', + 'int', 'range' => 'FILTER_VALIDATE_INT', + 'float' => 'FILTER_VALIDATE_FLOAT', + 'check' => 'FILTER_VALIDATE_BOOLEAN', + default => 'FILTER_DEFAULT', + }; + } + + private function handleOptions(): void + { + $this->plugin['options'] = array_diff_key( + $this->plugin['options'] ?? [], + $this->plugin[PluginType::BLOCK_OPTIONS->name()] ?? [], + $this->plugin[PluginType::PAGE_OPTIONS->name()] ?? [] + ); + } + + private function prepareFields(Method $method, string $type = 'block'): void + { + if (empty($params = $this->getSpecialParams($type))) + return; + + foreach ($params as $param) { + if ($param['type'] === 'text') { + $this->namespace->addUse(TextField::class); + + $method + ->addBody("TextField::make('{$param['name']}', \$this->txt['{$param['name']}'])") + ->addBody("\t->setValue(Utils::\$e->args->options['{$param['name']}']);" . PHP_EOL); + } + + if ($param['type'] === 'url') { + $this->namespace->addUse(TextField::class); + + $method + ->addBody("TextField::make('{$param['name']}', \$this->txt['{$param['name']}'])") + ->addBody("\t->setType('url')") + ->addBody("\t->setValue(Utils::\$e->args->options['{$param['name']}']);" . PHP_EOL); + } + + if ($param['type'] === 'check') { + $this->namespace->addUse(CheckboxField::class); + + $method + ->addBody("CheckboxField::make('{$param['name']}', \$this->txt['{$param['name']}'])") + ->addBody("\t->setValue(Utils::\$e->args->options['{$param['name']}']);" . PHP_EOL); + } + + if ($param['type'] === 'color') { + $this->namespace->addUse(ColorField::class); + + $method + ->addBody("ColorField::make('{$param['name']}', \$this->txt['{$param['name']}'])") + ->addBody("\t->setValue(Utils::\$e->args->options['{$param['name']}']);" . PHP_EOL); + } + + if ($param['type'] === 'int') { + $this->namespace->addUse(NumberField::class); + + $method + ->addBody("NumberField::make('{$param['name']}', \$this->txt['{$param['name']}'])") + ->addBody("\t->setValue(Utils::\$e->args->options['{$param['name']}']);" . PHP_EOL); + } + + if ($param['type'] === 'float') { + $this->namespace->addUse(NumberField::class); + + $method + ->addBody("NumberField::make('{$param['name']}', \$this->txt['{$param['name']}'])") + ->addBody("\t->setAttribute('step', 0.1)") + ->addBody("\t->setValue(Utils::\$e->args->options['{$param['name']}']);" . PHP_EOL); + } + + if ($param['type'] === 'select') { + $this->namespace->addUse(RadioField::class); + + $method + ->addBody("RadioField::make('{$param['name']}', \$this->txt['{$param['name']}'])") + ->addBody("\t->setOptions(\$this->txt['{$param['name']}_set'])") + ->addBody("\t->setValue(Utils::\$e->args->options['{$param['name']}']);" . PHP_EOL); + } + + if ($param['type'] === 'multiselect') { + $this->namespace->addUse(SelectField::class); + + $method + ->addBody("SelectField::make('{$param['name']}', \$this->txt['{$param['name']}'])") + ->addBody("\t->setOptions(\$this->txt['{$param['name']}_set'])") + ->addBody("\t->setValue(Utils::\$e->args->options['{$param['name']}']);" . PHP_EOL); + } + + if ($param['type'] === 'range') { + $this->namespace->addUse(RangeField::class); + + $method + ->addBody("RangeField::make('{$param['name']}', \$this->txt['{$param['name']}'])") + ->addBody("\t->setValue(Utils::\$e->args->options['{$param['name']}']);" . PHP_EOL); + } + + if (in_array($param['type'], ['title', 'desc', 'callback'])) { + $this->namespace->addUse(CustomField::class); + + $method + ->addBody("CustomField::make('{$param['name']}', \$this->txt['{$param['name']}'])") + ->addBody("\t->setValue(static fn() => '', []);" . PHP_EOL); + } + } + } + private function addDocBlock(PhpFile $file): void { - switch ($this->plugin['license']) { - case 'mit': - $licenseName = 'MIT'; - $licenseLink = 'https://opensource.org/licenses/MIT'; - break; - - case 'bsd': - $licenseName = 'BSD-3-Clause'; - $licenseLink = 'https://opensource.org/licenses/BSD-3-Clause'; - break; - - case 'gpl': - $licenseName = 'GPL-3.0-or-later'; - $licenseLink = 'https://spdx.org/licenses/GPL-3.0-or-later.html'; - break; - - default: - $licenseName = Lang::$txt['lp_plugin_maker']['license_name']; - $licenseLink = Lang::$txt['lp_plugin_maker']['license_link']; + $licenseEnum = License::tryFrom($this->plugin['license']); + + if ($licenseEnum) { + $licenseName = $licenseEnum->getName(); + $licenseLink = $licenseEnum->getLink(); + } else { + $licenseName = Lang::$txt['lp_plugin_maker']['license_name']; + $licenseLink = Lang::$txt['lp_plugin_maker']['license_link']; } $file->addComment("@package " . $this->plugin['name'] . " (" . LP_NAME .')'); @@ -695,23 +722,4 @@ private function createLanguages(Builder $plugin): void $plugin->createLangs($languages); } - - private function createFile(PhpNamespace $namespace): void - { - $file = new PhpFile; - $file->addNamespace($namespace); - - $this->addDocBlock($file); - - $printer = new class extends Printer {}; - $printer->linesBetweenProperties = 1; - $printer->linesBetweenMethods = 1; - - $content = $printer->printFile($file); - - $plugin = new Builder($this->plugin['name']); - $plugin->create($content); - - $this->createLanguages($plugin); - } } diff --git a/src/Sources/LightPortal/Plugins/PluginMaker/Handler.php b/src/Sources/LightPortal/Plugins/PluginMaker/Handler.php index ba2ef7866..8085f04fb 100644 --- a/src/Sources/LightPortal/Plugins/PluginMaker/Handler.php +++ b/src/Sources/LightPortal/Plugins/PluginMaker/Handler.php @@ -328,7 +328,8 @@ private function setData(): void Security::checkSubmitOnce('check'); - new Generator(Utils::$context['lp_plugin']); + $generator = new Generator(Utils::$context['lp_plugin']); + $generator->generate(); $this->saveAuthorData(); diff --git a/src/Sources/LightPortal/Plugins/PluginMaker/License.php b/src/Sources/LightPortal/Plugins/PluginMaker/License.php new file mode 100644 index 000000000..b54373027 --- /dev/null +++ b/src/Sources/LightPortal/Plugins/PluginMaker/License.php @@ -0,0 +1,39 @@ + + * @copyright 2021-2025 Bugo + * @license https://spdx.org/licenses/GPL-3.0-or-later.html GPL-3.0-or-later + * + * @category plugin + * @version 09.01.25 + */ + +namespace Bugo\LightPortal\Plugins\PluginMaker; + +enum License: string +{ + case MIT = 'mit'; + case BSD = 'bsd'; + case GPL = 'gpl'; + + public function getName(): string + { + return match ($this) { + self::MIT => 'MIT', + self::BSD => 'BSD-3-Clause', + self::GPL => 'GPL-3.0-or-later', + }; + } + + public function getLink(): string + { + return match ($this) { + self::MIT => 'https://opensource.org/licenses/MIT', + self::BSD => 'https://opensource.org/licenses/BSD-3-Clause', + self::GPL => 'https://spdx.org/licenses/GPL-3.0-or-later.html', + }; + } +} diff --git a/src/Sources/LightPortal/Plugins/PluginMaker/Validator.php b/src/Sources/LightPortal/Plugins/PluginMaker/Validator.php index b5d0e6515..06c1e5c4f 100644 --- a/src/Sources/LightPortal/Plugins/PluginMaker/Validator.php +++ b/src/Sources/LightPortal/Plugins/PluginMaker/Validator.php @@ -8,7 +8,7 @@ * @license https://spdx.org/licenses/GPL-3.0-or-later.html GPL-3.0-or-later * * @category plugin - * @version 21.12.24 + * @version 09.01.25 */ namespace Bugo\LightPortal\Plugins\PluginMaker; @@ -86,8 +86,9 @@ private function findErrors(array $data): void { $errors = []; - if (empty($data['name'])) + if (empty($data['name'])) { $errors[] = 'no_name'; + } if ( ! empty($data['name']) @@ -98,25 +99,24 @@ private function findErrors(array $data): void $errors[] = 'no_valid_name'; } - if (! empty($data['name']) && ! $this->isUnique($data['name'])) + if (! empty($data['name']) && ! $this->isUnique($data['name'])) { $errors[] = 'no_unique_name'; + } - if (empty($data['description_english'])) + if (empty($data['description_english'])) { $errors[] = 'no_description'; + } if (! empty($errors)) { Utils::$context['post_errors'] = []; - foreach ($errors as $error) - Utils::$context['post_errors'][] = Lang::$txt['lp_post_error_' . $error] ?? Lang::$txt['lp_plugin_maker'][$error]; + foreach ($errors as $error) { + Utils::$context['post_errors'][] + = Lang::$txt['lp_post_error_' . $error] ?? Lang::$txt['lp_plugin_maker'][$error]; + } } } - /** - * Check the uniqueness of the plugin - * - * Проверяем уникальность плагина - */ private function isUnique(string $name): bool { return ! in_array($name, app('plugin_list')); From 75b29aec0d87d8026b5654b6d9bf5a24e1c7cf26 Mon Sep 17 00:00:00 2001 From: Bugo Date: Mon, 13 Jan 2025 15:07:00 +0500 Subject: [PATCH 06/15] Refactor code --- .../LightPortal/Actions/AbstractPageList.php | 5 +- src/Sources/LightPortal/Actions/CardList.php | 22 ++- src/Sources/LightPortal/Actions/Category.php | 14 +- src/Sources/LightPortal/Actions/Comment.php | 23 ++- src/Sources/LightPortal/Actions/FrontPage.php | 38 +++-- src/Sources/LightPortal/Actions/Page.php | 19 ++- .../LightPortal/Actions/PageListInterface.php | 2 +- src/Sources/LightPortal/Actions/Tag.php | 14 +- src/Sources/LightPortal/Areas/BlockArea.php | 21 ++- .../LightPortal/Areas/CategoryArea.php | 10 +- src/Sources/LightPortal/Areas/ConfigArea.php | 77 +++++----- .../LightPortal/Areas/Configs/BasicConfig.php | 10 +- .../LightPortal/Areas/Configs/ExtraConfig.php | 6 +- .../LightPortal/Areas/Configs/PanelConfig.php | 6 +- src/Sources/LightPortal/Areas/CreditArea.php | 3 +- .../LightPortal/Areas/Exports/BlockExport.php | 10 +- .../Areas/Exports/CategoryExport.php | 10 +- .../LightPortal/Areas/Exports/PageExport.php | 10 +- .../Areas/Exports/PluginExport.php | 5 +- .../LightPortal/Areas/Exports/TagExport.php | 10 +- .../Imports/AbstractCustomBlockImport.php | 3 +- .../Imports/AbstractCustomCategoryImport.php | 3 +- .../Areas/Imports/AbstractCustomImport.php | 4 +- .../Imports/AbstractCustomPageImport.php | 3 +- .../Areas/Imports/AbstractImport.php | 2 +- .../Areas/Imports/PluginImport.php | 4 +- src/Sources/LightPortal/Areas/PageArea.php | 28 ++-- src/Sources/LightPortal/Areas/PluginArea.php | 27 ++-- src/Sources/LightPortal/Areas/TagArea.php | 10 +- .../LightPortal/Areas/Traits/QueryTrait.php | 3 +- .../Areas/Validators/BlockValidator.php | 5 +- .../Areas/Validators/PageValidator.php | 5 +- .../LightPortal/Articles/BoardArticle.php | 4 +- .../LightPortal/Articles/PageArticle.php | 8 +- .../LightPortal/Articles/TopicArticle.php | 5 +- src/Sources/LightPortal/Enums/Permission.php | 5 +- .../LightPortal/EventManagerFactory.php | 5 +- src/Sources/LightPortal/Hooks/Actions.php | 14 +- .../LightPortal/Hooks/CommonChecks.php | 15 +- .../LightPortal/Hooks/CurrentAction.php | 2 +- .../LightPortal/Hooks/DefaultAction.php | 11 +- .../LightPortal/Hooks/DownloadRequest.php | 3 +- src/Sources/LightPortal/Hooks/LoadTheme.php | 8 +- src/Sources/LightPortal/Hooks/MenuButtons.php | 6 +- .../LightPortal/Hooks/PreCssOutput.php | 3 +- .../LightPortal/Hooks/ProfileAreas.php | 2 +- src/Sources/LightPortal/Hooks/WhosOnline.php | 6 +- src/Sources/LightPortal/Lists/IconList.php | 3 +- src/Sources/LightPortal/Lists/PageList.php | 7 +- .../Plugins/AdsBlock/Hooks/MenuButtons.php | 4 +- .../Plugins/ArticleList/ArticleList.php | 3 +- .../Plugins/BlogMode/BlogIndex.php | 2 +- .../LightPortal/Plugins/BlogMode/BlogMode.php | 13 +- .../Plugins/CategoryList/CategoryList.php | 7 +- .../LightPortal/Plugins/ConfigHandler.php | 3 +- .../EhPortalMigration/EhPortalMigration.php | 2 +- .../EzPortalMigration/EzPortalMigration.php | 2 +- .../Plugins/HelloPortal/HelloPortal.php | 6 +- .../LightPortal/Plugins/MainMenu/MainMenu.php | 4 +- .../LightPortal/Plugins/PageList/PageList.php | 6 +- src/Sources/LightPortal/Plugins/Plugin.php | 3 +- .../LightPortal/Plugins/PluginHandler.php | 4 +- .../Plugins/PluginMaker/Generator.php | 4 +- .../Plugins/PluginMaker/Handler.php | 3 +- .../Plugins/PluginMaker/Validator.php | 3 +- .../LightPortal/Plugins/Polls/Polls.php | 136 ++++++++++-------- .../Plugins/RandomPages/RandomPages.php | 3 +- .../LightPortal/Plugins/Search/Search.php | 2 +- .../Plugins/SimpleChat/SimpleChat.php | 4 +- .../LightPortal/Plugins/SiteList/SiteList.php | 8 +- .../LightPortal/Plugins/TagList/TagList.php | 3 +- .../TinyPortalMigration.php | 2 +- .../LightPortal/Plugins/TinySlider/style.css | 2 - .../LightPortal/Plugins/TopPages/TopPages.php | 3 +- .../Renderers/AbstractRenderer.php | 3 +- .../Repositories/BlockRepository.php | 10 +- .../Repositories/PageRepository.php | 25 ++-- src/Sources/LightPortal/ServiceProvider.php | 134 +++++++++-------- src/Sources/LightPortal/Tasks/Maintainer.php | 12 +- .../UI/Partials/CategorySelect.php | 3 +- .../LightPortal/UI/Partials/PageSelect.php | 4 +- .../UI/Partials/PageSlugSelect.php | 4 +- .../LightPortal/UI/Partials/TagSelect.php | 3 +- .../LightPortal/UI/Tables/PageButtonsRow.php | 4 +- .../UI/Tables/PageContextMenuColumn.php | 2 +- .../UI/Tables/PageTypeSelectRow.php | 2 +- src/Sources/LightPortal/Utils/Cache.php | 2 +- src/Sources/LightPortal/Utils/CacheTrait.php | 2 +- src/Sources/LightPortal/Utils/Content.php | 5 +- src/Sources/LightPortal/Utils/Icon.php | 6 +- .../LightPortal/Utils/RequestTrait.php | 12 +- .../LightPortal/Utils/SessionTrait.php | 2 +- src/Sources/LightPortal/Utils/Setting.php | 8 +- .../default/LightPortal/ViewPage.template.php | 5 +- 94 files changed, 529 insertions(+), 470 deletions(-) diff --git a/src/Sources/LightPortal/Actions/AbstractPageList.php b/src/Sources/LightPortal/Actions/AbstractPageList.php index f2daf012e..8dfc888e4 100644 --- a/src/Sources/LightPortal/Actions/AbstractPageList.php +++ b/src/Sources/LightPortal/Actions/AbstractPageList.php @@ -16,6 +16,7 @@ use Bugo\Compat\Lang; use Bugo\Compat\User; use Bugo\Compat\Utils; +use Bugo\LightPortal\Lists\CategoryList; use Bugo\LightPortal\Utils\Avatar; use Bugo\LightPortal\Utils\Content; use Bugo\LightPortal\Utils\DateTime; @@ -32,8 +33,6 @@ abstract class AbstractPageList implements PageListInterface { - abstract public function show(CardListInterface $cardList); - abstract public function showAll(); abstract public function getAll(int $start, int $limit, string $sort): array; @@ -79,7 +78,7 @@ protected function getPreparedResults(array $rows = []): array private function getSectionData(array $row): array { - if (empty($categories = app('category_list'))) + if (empty($categories = app(CategoryList::class))) return []; if (isset($row['category_id'])) { diff --git a/src/Sources/LightPortal/Actions/CardList.php b/src/Sources/LightPortal/Actions/CardList.php index 6193eea4a..adf18e0d6 100644 --- a/src/Sources/LightPortal/Actions/CardList.php +++ b/src/Sources/LightPortal/Actions/CardList.php @@ -1,4 +1,14 @@ - + * @copyright 2019-2025 Bugo + * @license https://spdx.org/licenses/GPL-3.0-or-later.html GPL-3.0-or-later + * + * @version 2.9 + */ namespace Bugo\LightPortal\Actions; @@ -14,6 +24,8 @@ use Bugo\LightPortal\Utils\RequestTrait; use Bugo\LightPortal\Utils\Setting; use Bugo\LightPortal\Utils\Str; +use Bugo\LightPortal\Utils\Weaver; +use WPLake\Typed\Typed; class CardList implements CardListInterface { @@ -24,16 +36,16 @@ public function show(PageListInterface $entity): void if (empty(Config::$modSettings['lp_show_items_as_articles'])) return; - $start = (int) $this->request('start'); + $start = Typed::int($this->request()->get('start')); $limit = Setting::get('lp_num_items_per_page', 'int', 12); $itemsCount = $entity->getTotalCount(); - $front = app('front_page'); + $front = app(FrontPage::class); $front->updateStart($itemsCount, $start, $limit); $sort = $this->getOrderBy(); - $articles = app('weaver')(static fn() => $entity->getPages($start, $limit, $sort)); + $articles = app(Weaver::class)(static fn() => $entity->getPages($start, $limit, $sort)); Utils::$context['page_index'] = new PageIndex( Utils::$context['canonical_url'], $start, $itemsCount, $limit @@ -66,7 +78,7 @@ public function getOrderBy(): string 'num_views' => 'p.num_views', ]; - Utils::$context['current_sorting'] = $this->request('sort', 'created;desc'); + Utils::$context['current_sorting'] = $this->request()->get('sort') ?? 'created;desc'; return $sortingTypes[Utils::$context['current_sorting']]; } diff --git a/src/Sources/LightPortal/Actions/Category.php b/src/Sources/LightPortal/Actions/Category.php index 462ddb638..8e403c833 100644 --- a/src/Sources/LightPortal/Actions/Category.php +++ b/src/Sources/LightPortal/Actions/Category.php @@ -25,11 +25,13 @@ use Bugo\LightPortal\Enums\EntryType; use Bugo\LightPortal\Enums\Permission; use Bugo\LightPortal\Enums\Status; +use Bugo\LightPortal\Lists\CategoryList; use Bugo\LightPortal\UI\Tables\PortalTableBuilder; use Bugo\LightPortal\Utils\Icon; use Bugo\LightPortal\Utils\RequestTrait; use Bugo\LightPortal\Utils\Setting; use Bugo\LightPortal\Utils\Str; +use WPLake\Typed\Typed; use function array_key_exists; use function count; @@ -45,17 +47,19 @@ final class Category extends AbstractPageList { use RequestTrait; - public function show(CardListInterface $cardList): void + public function __construct(private readonly CardListInterface $cardList) {} + + public function show(): void { if ($this->request()->hasNot('id')) { $this->showAll(); } $category = [ - 'id' => (int) $this->request('id', 0) + 'id' => Typed::int($this->request()->get('id')) ]; - $categories = app('category_list'); + $categories = app(CategoryList::class); if (array_key_exists($category['id'], $categories) === false) { Utils::$context['error_link'] = LP_BASE_URL . ';sa=categories'; Lang::$txt['back'] = Lang::$txt['lp_all_categories']; @@ -85,9 +89,9 @@ public function show(CardListInterface $cardList): void 'name' => $category['title'] ?? Lang::$txt['lp_no_category'], ]; - $cardList->show($this); + $this->cardList->show($this); - $builder = $cardList->getBuilder('lp_categories'); + $builder = $this->cardList->getBuilder('lp_categories'); $builder->setItems($this->getPages(...)); $builder->setCount(fn() => $this->getTotalCount()); diff --git a/src/Sources/LightPortal/Actions/Comment.php b/src/Sources/LightPortal/Actions/Comment.php index c57d6f8c6..6ec5a973d 100644 --- a/src/Sources/LightPortal/Actions/Comment.php +++ b/src/Sources/LightPortal/Actions/Comment.php @@ -18,6 +18,7 @@ use Bugo\LightPortal\Enums\AlertAction; use Bugo\LightPortal\Enums\PortalHook; use Bugo\LightPortal\Enums\VarType; +use Bugo\LightPortal\EventManagerFactory; use Bugo\LightPortal\Plugins\Event; use Bugo\LightPortal\Repositories\CommentRepository; use Bugo\LightPortal\Utils\Avatar; @@ -26,6 +27,7 @@ use Bugo\LightPortal\Utils\Notify; use Bugo\LightPortal\Utils\RequestTrait; use Bugo\LightPortal\Utils\Setting; +use WPLake\Typed\Typed; use function array_map; use function array_slice; @@ -45,11 +47,18 @@ final class Comment implements ActionInterface use CacheTrait; use RequestTrait; - private CommentRepository $repository; + private string $pageSlug; - public function __construct(private readonly string $pageSlug = '') + public function __construct(private readonly CommentRepository $repository) { - $this->repository = app('comment_repo'); + $this->setPageSlug(Utils::$context['lp_page']['slug']); + } + + public function setPageSlug(string $pageSlug): self + { + $this->pageSlug = $pageSlug; + + return $this; } public function show(): void @@ -59,7 +68,7 @@ public function show(): void header('Content-Type: application/json; charset=utf-8'); - match ($this->request('api')) { + match ($this->request()->get('api')) { 'add_comment' => $this->add(), 'update_comment' => $this->update(), 'remove_comment' => $this->remove(), @@ -70,7 +79,7 @@ public function show(): void private function get(): never { $comments = $this->cache('page_' . $this->pageSlug . '_comments') - ->setFallback(fn() => app('comment_repo')->getByPageId(Utils::$context['lp_page']['id'])); + ->setFallback(fn() => app(CommentRepository::class)->getByPageId(Utils::$context['lp_page']['id'])); $comments = array_map(function ($comment) { $comment['human_date'] = DateTime::relative($comment['created_at']); @@ -78,7 +87,7 @@ private function get(): never $comment['authorial'] = Utils::$context['lp_page']['author_id'] === $comment['poster']['id']; $comment['extra_buttons'] = []; - app('events')->dispatch( + app(EventManagerFactory::class)()->dispatch( PortalHook::commentButtons, new Event(new class ($comment, $comment['extra_buttons']) { public function __construct(public readonly array $comment, public array &$buttons) {} @@ -98,7 +107,7 @@ public function __construct(public readonly array $comment, public array &$butto $this->getPageIndexUrl(), $start, $parentsCount, $limit ); - $start = (int) $this->request('start'); + $start = Typed::int($this->request()->get('start')); http_response_code(200); diff --git a/src/Sources/LightPortal/Actions/FrontPage.php b/src/Sources/LightPortal/Actions/FrontPage.php index d21661d5d..eabdd06da 100644 --- a/src/Sources/LightPortal/Actions/FrontPage.php +++ b/src/Sources/LightPortal/Actions/FrontPage.php @@ -24,6 +24,7 @@ use Bugo\LightPortal\Articles\PageArticle; use Bugo\LightPortal\Articles\TopicArticle; use Bugo\LightPortal\Enums\PortalHook; +use Bugo\LightPortal\EventManagerFactory; use Bugo\LightPortal\Plugins\Event; use Bugo\LightPortal\Renderers\RendererInterface; use Bugo\LightPortal\Utils\CacheTrait; @@ -33,6 +34,8 @@ use Bugo\LightPortal\Utils\SessionTrait; use Bugo\LightPortal\Utils\Setting; use Bugo\LightPortal\Utils\Str; +use Bugo\LightPortal\Utils\Weaver; +use WPLake\Typed\Typed; use function abs; use function array_column; @@ -60,18 +63,13 @@ final class FrontPage implements ActionInterface 'chosen_topics' => ChosenTopicArticle::class, ]; - private RendererInterface $renderer; - - public function __construct() - { - $this->renderer = app('renderer'); - } + public function __construct(private RendererInterface $renderer) {} public function show(): void { User::mustHavePermission('light_portal_view'); - app('events')->dispatch( + app(EventManagerFactory::class)()->dispatch( PortalHook::frontModes, new Event(new class ($this->modes) { public function __construct(public array &$modes) {} @@ -81,7 +79,7 @@ public function __construct(public array &$modes) {} if (array_key_exists(Config::$modSettings['lp_frontpage_mode'], $this->modes)) { $this->prepare(new $this->modes[Config::$modSettings['lp_frontpage_mode']]); } elseif (Setting::isFrontpageMode('chosen_page')) { - app('page')->show(); + app(Page::class)->show(); return; } @@ -106,21 +104,21 @@ public function __construct(public array &$modes) {} public function prepare(ArticleInterface $article): void { - $start = (int) $this->request('start'); + $start = Typed::int($this->request()->get('start')); $limit = Setting::get('lp_num_items_per_page', 'int', 12); $article->init(); $key = 'articles_u' . User::$info['id'] . '_' . User::$info['language'] . '_' . $start . '_' . $limit; - $key = ltrim($this->request('action', '') . '_' . $key, '_'); + $key = ltrim(($this->request()->get('action') ?? '') . '_' . $key, '_'); if (($data = $this->cache()->get($key)) === null) { $data['total'] = $article->getTotalCount(); $this->updateStart($data['total'], $start, $limit); - $data['articles'] = app('weaver')(static fn() => $article->getData($start, $limit)); + $data['articles'] = app(Weaver::class)(static fn() => $article->getData($start, $limit)); $this->cache()->put($key, $data); } @@ -143,13 +141,13 @@ public function prepare(ArticleInterface $article): void Utils::$context['page_index'] = $this->simplePaginate(LP_BASE_URL, $itemsCount, $limit); } - Utils::$context['portal_next_page'] = $this->request('start') + $limit < $itemsCount - ? LP_BASE_URL . ';start=' . ($this->request('start') + $limit) + Utils::$context['portal_next_page'] = $this->request()->get('start') + $limit < $itemsCount + ? LP_BASE_URL . ';start=' . ($this->request()->get('start') + $limit) : ''; Utils::$context['lp_frontpage_articles'] = $articles; - app('events')->dispatch(PortalHook::frontAssets); + app(EventManagerFactory::class)()->dispatch(PortalHook::frontAssets); } public function getLayouts(): array @@ -180,7 +178,7 @@ public function prepareTemplates(): void ]; // You can add your own logic here - app('events')->dispatch( + app(EventManagerFactory::class)()->dispatch( PortalHook::frontLayouts, new Event(new class ($this->renderer, $currentLayout, $params) { public function __construct( @@ -202,13 +200,11 @@ public function prepareLayoutSwitcher(): void Utils::$context['template_layers'][] = 'layout_switcher'; if ($this->session('lp')->isEmpty('frontpage_layout')) { - Utils::$context['lp_current_layout'] = $this->request( - 'layout', Config::$modSettings['lp_frontpage_layout'] ?? $this->renderer::DEFAULT_TEMPLATE - ); + Utils::$context['lp_current_layout'] = $this->request()->get('layout') + ?? Config::$modSettings['lp_frontpage_layout'] ?? $this->renderer::DEFAULT_TEMPLATE; } else { - Utils::$context['lp_current_layout'] = $this->request( - 'layout', $this->session('lp')->get('frontpage_layout') - ); + Utils::$context['lp_current_layout'] = $this->request()->get('layout') + ?? $this->session('lp')->get('frontpage_layout'); } $this->session('lp')->put('frontpage_layout', Utils::$context['lp_current_layout']); diff --git a/src/Sources/LightPortal/Actions/Page.php b/src/Sources/LightPortal/Actions/Page.php index 4488443ad..2ce0ac83b 100644 --- a/src/Sources/LightPortal/Actions/Page.php +++ b/src/Sources/LightPortal/Actions/Page.php @@ -20,6 +20,8 @@ use Bugo\Compat\Utils; use Bugo\LightPortal\Enums\EntryType; use Bugo\LightPortal\Enums\PortalHook; +use Bugo\LightPortal\EventManagerFactory; +use Bugo\LightPortal\Lists\TitleList; use Bugo\LightPortal\Repositories\PageRepository; use Bugo\LightPortal\Utils\CacheTrait; use Bugo\LightPortal\Utils\Content; @@ -53,18 +55,13 @@ final class Page implements ActionInterface use RequestTrait; use SessionTrait; - private PageRepository $repository; - - public function __construct() - { - $this->repository = app('page_repo'); - } + public function __construct(private readonly PageRepository $repository) {} public function show(): void { User::mustHavePermission('light_portal_view'); - $slug = $this->request(LP_PAGE_PARAM); + $slug = $this->request()->get(LP_PAGE_PARAM); if (empty($slug)) { $this->handleEmptySlug(); @@ -117,7 +114,7 @@ public function getDataBySlug(string $slug): array return []; $data = $this->cache('page_' . $slug) - ->setFallback(fn() => app('page_repo')->getData($slug)); + ->setFallback(fn() => app(PageRepository::class)->getData($slug)); $this->repository->prepareData($data); @@ -301,7 +298,7 @@ private function prepareNavigationLinks(): void if (empty($page = Utils::$context['lp_page']) || empty(Config::$modSettings['lp_show_prev_next_links'])) return; - $titles = app('title_list'); + $titles = app(TitleList::class); [$prevId, $prevSlug, $nextId, $nextSlug] = $this->repository->getPrevNextLinks($page); @@ -341,14 +338,14 @@ private function prepareComments(): void Lang::load('Editor'); - app('events')->dispatch(PortalHook::comments); + app(EventManagerFactory::class)()->dispatch(PortalHook::comments); if (isset(Utils::$context['lp_' . Setting::getCommentBlock() . '_comment_block'])) return; $this->handleApi(); - (new Comment(Utils::$context['lp_page']['slug']))->show(); + app(Comment::class)->show(); } private function handleApi(): void diff --git a/src/Sources/LightPortal/Actions/PageListInterface.php b/src/Sources/LightPortal/Actions/PageListInterface.php index 19c0a4ef7..ef87da60b 100644 --- a/src/Sources/LightPortal/Actions/PageListInterface.php +++ b/src/Sources/LightPortal/Actions/PageListInterface.php @@ -12,7 +12,7 @@ namespace Bugo\LightPortal\Actions; -interface PageListInterface +interface PageListInterface extends ActionInterface { public function getPages(int $start, int $limit, string $sort): array; diff --git a/src/Sources/LightPortal/Actions/Tag.php b/src/Sources/LightPortal/Actions/Tag.php index 5ed7763cb..9679004d0 100644 --- a/src/Sources/LightPortal/Actions/Tag.php +++ b/src/Sources/LightPortal/Actions/Tag.php @@ -23,11 +23,13 @@ use Bugo\LightPortal\Enums\EntryType; use Bugo\LightPortal\Enums\Permission; use Bugo\LightPortal\Enums\Status; +use Bugo\LightPortal\Lists\TagList; use Bugo\LightPortal\UI\Tables\PortalTableBuilder; use Bugo\LightPortal\Utils\Icon; use Bugo\LightPortal\Utils\RequestTrait; use Bugo\LightPortal\Utils\Setting; use Bugo\LightPortal\Utils\Str; +use WPLake\Typed\Typed; use function array_key_exists; use function count; @@ -44,17 +46,19 @@ final class Tag extends AbstractPageList { use RequestTrait; - public function show(CardListInterface $cardList): void + public function __construct(private readonly CardListInterface $cardList) {} + + public function show(): void { if ($this->request()->hasNot('id')) { $this->showAll(); } $tag = [ - 'id' => (int) $this->request('id', 0) + 'id' => Typed::int($this->request()->get('id')) ]; - $tags = app('tag_list'); + $tags = app(TagList::class); if (array_key_exists($tag['id'], $tags) === false) { Utils::$context['error_link'] = LP_BASE_URL . ';sa=tags'; Lang::$txt['back'] = Lang::$txt['lp_all_page_tags']; @@ -78,9 +82,9 @@ public function show(CardListInterface $cardList): void 'name' => $tag['title'], ]; - $cardList->show($this); + $this->cardList->show($this); - $builder = $cardList->getBuilder('lp_tags'); + $builder = $this->cardList->getBuilder('lp_tags'); $builder->setItems($this->getPages(...)); $builder->setCount(fn() => $this->getTotalCount()); diff --git a/src/Sources/LightPortal/Areas/BlockArea.php b/src/Sources/LightPortal/Areas/BlockArea.php index c9c07cda7..4f47cc37b 100644 --- a/src/Sources/LightPortal/Areas/BlockArea.php +++ b/src/Sources/LightPortal/Areas/BlockArea.php @@ -26,6 +26,7 @@ use Bugo\LightPortal\Enums\ContentType; use Bugo\LightPortal\Enums\PortalHook; use Bugo\LightPortal\Enums\Tab; +use Bugo\LightPortal\EventManagerFactory; use Bugo\LightPortal\Models\BlockModel; use Bugo\LightPortal\Plugins\Event; use Bugo\LightPortal\Repositories\BlockRepository; @@ -47,6 +48,7 @@ use Bugo\LightPortal\Utils\RequestTrait; use Bugo\LightPortal\Utils\Setting; use Bugo\LightPortal\Utils\Str; +use WPLake\Typed\Typed; use function array_column; use function array_combine; @@ -73,12 +75,7 @@ final class BlockArea use CacheTrait; use RequestTrait; - private BlockRepository $repository; - - public function __construct() - { - $this->repository = app('block_repo'); - } + public function __construct(private readonly BlockRepository $repository) {} public function main(): void { @@ -116,12 +113,12 @@ public function add(): void Lang::$txt['lp_blocks_add_instruction'], Config::$scripturl . '?action=admin;area=lp_plugins' ); - Utils::$context['current_block']['placement'] = $this->request('placement', 'top'); + Utils::$context['current_block']['placement'] = $this->request()->get('placement') ?? 'top'; $this->prepareBlockList(); $json = $this->request()->json(); - $type = $json['add_block'] ?? $this->request('add_block', '') ?? ''; + $type = $json['add_block'] ?? $this->request()->get('add_block') ?? ''; if (empty($type) && empty($json['search'])) return; @@ -142,7 +139,7 @@ public function add(): void public function edit(): void { - $item = (int) ($this->request('block_id') ?: $this->request('id')); + $item = Typed::int($this->request()->get('block_id') ?: $this->request()->get('id')); Theme::loadTemplate('LightPortal/ManageBlocks'); @@ -239,7 +236,7 @@ private function getParams(): array $params = []; - app('events')->dispatch( + app(EventManagerFactory::class)()->dispatch( PortalHook::prepareBlockParams, new Event(new ParamsArgs($params, Utils::$context['current_block']['type'])) ); @@ -358,7 +355,7 @@ private function prepareFormFields(): void Utils::$context['lp_block_tab_appearance'] = true; - app('events')->dispatch( + app(EventManagerFactory::class)()->dispatch( PortalHook::prepareBlockFields, new Event(new OptionsTypeArgs(Utils::$context['lp_block']['options'], Utils::$context['current_block']['type'])) ); @@ -393,7 +390,7 @@ private function getAreasInfo(): string private function prepareEditor(): void { - app('events')->dispatch( + app(EventManagerFactory::class)()->dispatch( PortalHook::prepareEditor, new Event(new ObjectArgs(Utils::$context['lp_block'])) ); diff --git a/src/Sources/LightPortal/Areas/CategoryArea.php b/src/Sources/LightPortal/Areas/CategoryArea.php index 1a0764b85..95bbef482 100644 --- a/src/Sources/LightPortal/Areas/CategoryArea.php +++ b/src/Sources/LightPortal/Areas/CategoryArea.php @@ -39,6 +39,7 @@ use Bugo\LightPortal\Utils\Language; use Bugo\LightPortal\Utils\RequestTrait; use Bugo\LightPortal\Utils\Str; +use WPLake\Typed\Typed; use const LP_NAME; @@ -51,12 +52,7 @@ final class CategoryArea use CacheTrait; use RequestTrait; - private CategoryRepository $repository; - - public function __construct() - { - $this->repository = app('category_repo'); - } + public function __construct(private readonly CategoryRepository $repository) {} public function main(): void { @@ -127,7 +123,7 @@ public function add(): void public function edit(): void { - $item = (int) ($this->request('category_id') ?: $this->request('id')); + $item = Typed::int($this->request()->get('category_id') ?: $this->request()->get('id')); Theme::loadTemplate('LightPortal/ManageCategories'); diff --git a/src/Sources/LightPortal/Areas/ConfigArea.php b/src/Sources/LightPortal/Areas/ConfigArea.php index fd56cdbbf..9cd562d40 100644 --- a/src/Sources/LightPortal/Areas/ConfigArea.php +++ b/src/Sources/LightPortal/Areas/ConfigArea.php @@ -36,6 +36,7 @@ use Bugo\LightPortal\Args\AreasArgs; use Bugo\LightPortal\Enums\Hook; use Bugo\LightPortal\Enums\PortalHook; +use Bugo\LightPortal\EventManagerFactory; use Bugo\LightPortal\Plugins\Event; use Bugo\LightPortal\Utils\CacheTrait; use Bugo\LightPortal\Utils\Icon; @@ -211,7 +212,7 @@ public function adminAreas(array &$areas): void } } - app('events')->dispatch( + app(EventManagerFactory::class)()->dispatch( PortalHook::updateAdminAreas, new Event(new AreasArgs($areas['lp_portal']['areas'])) ); @@ -284,14 +285,17 @@ public function blockAreas(): void User::mustHavePermission('admin_forum'); $areas = [ - 'main' => [new BlockArea(), 'main'], - 'add' => [new BlockArea(), 'add'], - 'edit' => [new BlockArea(), 'edit'], - 'export' => [new BlockExport(), 'main'], - 'import' => [new BlockImport(), 'main'], + 'main' => [app(BlockArea::class), 'main'], + 'add' => [app(BlockArea::class), 'add'], + 'edit' => [app(BlockArea::class), 'edit'], + 'export' => [app(BlockExport::class), 'main'], + 'import' => [app(BlockImport::class), 'main'], ]; - app('events')->dispatch(PortalHook::updateBlockAreas, new Event(new AreasArgs($areas))); + app(EventManagerFactory::class)()->dispatch( + PortalHook::updateBlockAreas, + new Event(new AreasArgs($areas)) + ); $this->callActionFromAreas($areas); } @@ -301,14 +305,14 @@ public function pageAreas(): void User::mustHavePermission(['light_portal_manage_pages_own', 'light_portal_manage_pages_any']); $areas = [ - 'main' => [new PageArea(), 'main'], - 'add' => [new PageArea(), 'add'], - 'edit' => [new PageArea(), 'edit'], - 'export' => [new PageExport(), 'main'], - 'import' => [new PageImport(), 'main'], + 'main' => [app(PageArea::class), 'main'], + 'add' => [app(PageArea::class), 'add'], + 'edit' => [app(PageArea::class), 'edit'], + 'export' => [app(PageExport::class), 'main'], + 'import' => [app(PageImport::class), 'main'], ]; - app('events')->dispatch( + app(EventManagerFactory::class)()->dispatch( PortalHook::updatePageAreas, new Event(new AreasArgs($areas)) ); @@ -321,14 +325,14 @@ public function categoryAreas(): void User::mustHavePermission('admin_forum'); $areas = [ - 'main' => [new CategoryArea(), 'main'], - 'add' => [new CategoryArea(), 'add'], - 'edit' => [new CategoryArea(), 'edit'], - 'export' => [new CategoryExport(), 'main'], - 'import' => [new CategoryImport(), 'main'], + 'main' => [app(CategoryArea::class), 'main'], + 'add' => [app(CategoryArea::class), 'add'], + 'edit' => [app(CategoryArea::class), 'edit'], + 'export' => [app(CategoryExport::class), 'main'], + 'import' => [app(CategoryImport::class), 'main'], ]; - app('events')->dispatch( + app(EventManagerFactory::class)()->dispatch( PortalHook::updateCategoryAreas, new Event(new AreasArgs($areas)) ); @@ -341,14 +345,17 @@ public function tagAreas(): void User::mustHavePermission('admin_forum'); $areas = [ - 'main' => [new TagArea(), 'main'], - 'add' => [new TagArea(), 'add'], - 'edit' => [new TagArea(), 'edit'], - 'export' => [new TagExport(), 'main'], - 'import' => [new TagImport(), 'main'], + 'main' => [app(TagArea::class), 'main'], + 'add' => [app(TagArea::class), 'add'], + 'edit' => [app(TagArea::class), 'edit'], + 'export' => [app(TagExport::class), 'main'], + 'import' => [app(TagImport::class), 'main'], ]; - app('events')->dispatch(PortalHook::updateTagAreas, new Event(new AreasArgs($areas))); + app(EventManagerFactory::class)()->dispatch( + PortalHook::updateTagAreas, + new Event(new AreasArgs($areas)) + ); $this->callActionFromAreas($areas); } @@ -358,15 +365,18 @@ public function pluginAreas(): void User::mustHavePermission('admin_forum'); $areas = [ - 'main' => [new PluginArea(), 'main'], + 'main' => [app(PluginArea::class), 'main'], ]; if (extension_loaded('zip')) { - $areas['export'] = [new PluginExport(), 'main']; - $areas['import'] = [new PluginImport(), 'main']; + $areas['export'] = [app(PluginExport::class), 'main']; + $areas['import'] = [app(PluginImport::class), 'main']; } - app('events')->dispatch(PortalHook::updatePluginAreas, new Event(new AreasArgs($areas))); + app(EventManagerFactory::class)()->dispatch( + PortalHook::updatePluginAreas, + new Event(new AreasArgs($areas)) + ); $this->callActionFromAreas($areas); } @@ -377,18 +387,19 @@ private function callActionFromAreas(array $areas = [], string $defaultAction = Utils::$context['sub_template'] = 'show_settings'; - Utils::$context['sub_action'] = $this->request()->has('sa') && isset($areas[$this->request('sa')]) - ? $this->request('sa') : $defaultAction; + Utils::$context['sub_action'] = $this->request()->has('sa') && isset($areas[$this->request()->get('sa')]) + ? $this->request()->get('sa') + : $defaultAction; call_user_func($areas[Utils::$context['sub_action']]); } private function showDocsLink(): void { - if (empty($this->request('area')) || empty(Utils::$context['template_layers'])) + if (empty($this->request()->get('area')) || empty(Utils::$context['template_layers'])) return; - if (str_contains((string) $this->request('area'), 'lp_')) { + if (str_contains((string) $this->request()->get('area'), 'lp_')) { Theme::loadTemplate('LightPortal/ViewDebug'); Utils::$context['template_layers'][] = 'docs'; diff --git a/src/Sources/LightPortal/Areas/Configs/BasicConfig.php b/src/Sources/LightPortal/Areas/Configs/BasicConfig.php index 01b834a2c..ea0e05453 100644 --- a/src/Sources/LightPortal/Areas/Configs/BasicConfig.php +++ b/src/Sources/LightPortal/Areas/Configs/BasicConfig.php @@ -20,9 +20,11 @@ use Bugo\Compat\User; use Bugo\Compat\Utils; use Bugo\Compat\WebFetchApi; +use Bugo\LightPortal\Actions\FrontPage; use Bugo\LightPortal\Areas\Traits\QueryTrait; use Bugo\LightPortal\Enums\PortalHook; use Bugo\LightPortal\Enums\VarType; +use Bugo\LightPortal\EventManagerFactory; use Bugo\LightPortal\Plugins\Event; use Bugo\LightPortal\UI\Partials\ActionSelect; use Bugo\LightPortal\Utils\CacheTrait; @@ -150,7 +152,7 @@ public function show(): void [ 'select', 'lp_frontpage_layout', - app('front_page')->getLayouts(), + app(FrontPage::class)->getLayouts(), 'postinput' => $templateEditLink, 'tab' => self::TAB_CARDS, ], @@ -236,7 +238,7 @@ public function show(): void Utils::$context['sub_template'] = 'portal_basic_settings'; - app('events')->dispatch( + app(EventManagerFactory::class)()->dispatch( PortalHook::extendBasicConfig, new Event(new class ($configVars) { public function __construct(public array &$configVars) {} @@ -249,13 +251,13 @@ public function __construct(public array &$configVars) {} if ($this->request()->isNotEmpty('lp_image_placeholder')) { $this->post()->put( - 'lp_image_placeholder', VarType::URL->filter($this->request('lp_image_placeholder')) + 'lp_image_placeholder', VarType::URL->filter($this->request()->get('lp_image_placeholder')) ); } if ($this->request()->isNotEmpty('lp_standalone_url')) { $this->post()->put( - 'lp_standalone_url', VarType::URL->filter($this->request('lp_standalone_url')) + 'lp_standalone_url', VarType::URL->filter($this->request()->get('lp_standalone_url')) ); } diff --git a/src/Sources/LightPortal/Areas/Configs/ExtraConfig.php b/src/Sources/LightPortal/Areas/Configs/ExtraConfig.php index 4805d7ad0..43ce7adda 100644 --- a/src/Sources/LightPortal/Areas/Configs/ExtraConfig.php +++ b/src/Sources/LightPortal/Areas/Configs/ExtraConfig.php @@ -153,16 +153,16 @@ public function show(): void if ($this->request()->isNotEmpty('lp_menu_separate_subsection_href')) { $this->post()->put( 'lp_menu_separate_subsection_href', - VarType::URL->filter($this->request('lp_menu_separate_subsection_href')) + VarType::URL->filter($this->request()->get('lp_menu_separate_subsection_href')) ); } if ($this->request()->isNotEmpty('lp_fa_custom')) { - $this->post()->put('lp_fa_custom', VarType::URL->filter($this->request('lp_fa_custom'))); + $this->post()->put('lp_fa_custom', VarType::URL->filter($this->request()->get('lp_fa_custom'))); } if ($this->request()->isNotEmpty('lp_fa_kit')) { - $this->post()->put('lp_fa_kit', VarType::URL->filter($this->request('lp_fa_kit'))); + $this->post()->put('lp_fa_kit', VarType::URL->filter($this->request()->get('lp_fa_kit'))); } $saveVars = $configVars; diff --git a/src/Sources/LightPortal/Areas/Configs/PanelConfig.php b/src/Sources/LightPortal/Areas/Configs/PanelConfig.php index f2b84888e..34247bec4 100644 --- a/src/Sources/LightPortal/Areas/Configs/PanelConfig.php +++ b/src/Sources/LightPortal/Areas/Configs/PanelConfig.php @@ -69,9 +69,9 @@ public function show(): void if ($this->request()->has('save')) { User::$me->checkSession(); - $this->post()->put('lp_left_panel_width', json_encode($this->request('lp_left_panel_width'))); - $this->post()->put('lp_right_panel_width', json_encode($this->request('lp_right_panel_width'))); - $this->post()->put('lp_panel_direction', json_encode($this->request('lp_panel_direction'))); + $this->post()->put('lp_left_panel_width', json_encode($this->request()->get('lp_left_panel_width'))); + $this->post()->put('lp_right_panel_width', json_encode($this->request()->get('lp_right_panel_width'))); + $this->post()->put('lp_panel_direction', json_encode($this->request()->get('lp_panel_direction'))); $saveVars = $configVars; diff --git a/src/Sources/LightPortal/Areas/CreditArea.php b/src/Sources/LightPortal/Areas/CreditArea.php index 66f2cbbb3..e6dbc8b42 100644 --- a/src/Sources/LightPortal/Areas/CreditArea.php +++ b/src/Sources/LightPortal/Areas/CreditArea.php @@ -19,6 +19,7 @@ use Bugo\Compat\Utils; use Bugo\LightPortal\Enums\Hook; use Bugo\LightPortal\Enums\PortalHook; +use Bugo\LightPortal\EventManagerFactory; use Bugo\LightPortal\Plugins\Event; use Bugo\LightPortal\Utils\SMFHookTrait; use Bugo\LightPortal\Utils\Str; @@ -276,7 +277,7 @@ private function prepareComponents(): void ]; // Adding copyrights of used plugins - app('events')->dispatch( + app(EventManagerFactory::class)()->dispatch( PortalHook::credits, new Event(new class ($links) { public function __construct(public array &$links) {} diff --git a/src/Sources/LightPortal/Areas/Exports/BlockExport.php b/src/Sources/LightPortal/Areas/Exports/BlockExport.php index adfef4bc2..5a59f9367 100644 --- a/src/Sources/LightPortal/Areas/Exports/BlockExport.php +++ b/src/Sources/LightPortal/Areas/Exports/BlockExport.php @@ -34,12 +34,7 @@ final class BlockExport extends AbstractExport { - private readonly BlockRepository $repository; - - public function __construct() - { - $this->repository = app('block_repo'); - } + public function __construct(private readonly BlockRepository $repository) {} public function main(): void { @@ -66,7 +61,8 @@ protected function getData(): array if ($this->request()->isEmpty('blocks') && $this->request()->hasNot('export_all')) return []; - $blocks = $this->request('blocks') && $this->request()->hasNot('export_all') ? $this->request('blocks') : null; + $blocks = $this->request()->get('blocks') && $this->request()->hasNot('export_all') + ? $this->request()->get('blocks') : []; $result = Db::$db->query('', ' SELECT diff --git a/src/Sources/LightPortal/Areas/Exports/CategoryExport.php b/src/Sources/LightPortal/Areas/Exports/CategoryExport.php index 1541c795c..8922de1f2 100644 --- a/src/Sources/LightPortal/Areas/Exports/CategoryExport.php +++ b/src/Sources/LightPortal/Areas/Exports/CategoryExport.php @@ -40,12 +40,7 @@ final class CategoryExport extends AbstractExport { - private readonly CategoryRepository $repository; - - public function __construct() - { - $this->repository = app('category_repo'); - } + public function __construct(private readonly CategoryRepository $repository) {} public function main(): void { @@ -84,7 +79,8 @@ protected function getData(): array if ($this->request()->isEmpty('categories') && $this->request()->hasNot('export_all')) return []; - $categories = $this->request('categories') && $this->request()->hasNot('export_all') ? $this->request('categories') : null; + $categories = $this->request()->get('categories') && $this->request()->hasNot('export_all') + ? $this->request()->get('categories') : []; $result = Db::$db->query('', ' SELECT c.category_id, c.icon, c.description, c.priority, c.status, pt.lang, pt.value AS title diff --git a/src/Sources/LightPortal/Areas/Exports/PageExport.php b/src/Sources/LightPortal/Areas/Exports/PageExport.php index ac976cd3e..1a1e8f59c 100644 --- a/src/Sources/LightPortal/Areas/Exports/PageExport.php +++ b/src/Sources/LightPortal/Areas/Exports/PageExport.php @@ -42,12 +42,7 @@ final class PageExport extends AbstractExport { - private readonly PageRepository $repository; - - public function __construct() - { - $this->repository = app('page_repo'); - } + public function __construct(private readonly PageRepository $repository) {} public function main(): void { @@ -91,7 +86,8 @@ protected function getData(): array if ($this->request()->isEmpty('pages') && $this->request()->hasNot('export_all')) return []; - $pages = $this->request('pages') && $this->request()->hasNot('export_all') ? $this->request('pages') : null; + $pages = $this->request()->get('pages') && $this->request()->hasNot('export_all') + ? $this->request()->get('pages') : []; $result = Db::$db->query('', ' SELECT diff --git a/src/Sources/LightPortal/Areas/Exports/PluginExport.php b/src/Sources/LightPortal/Areas/Exports/PluginExport.php index 498baf20a..d0f3318d1 100644 --- a/src/Sources/LightPortal/Areas/Exports/PluginExport.php +++ b/src/Sources/LightPortal/Areas/Exports/PluginExport.php @@ -18,6 +18,7 @@ use Bugo\Compat\Sapi; use Bugo\Compat\Theme; use Bugo\Compat\Utils; +use Bugo\LightPortal\Lists\PluginList; use FilesystemIterator; use RecursiveDirectoryIterator; use RecursiveIteratorIterator; @@ -49,7 +50,7 @@ public function main(): void 'description' => Lang::$txt['lp_plugins_export_description'], ]; - Utils::$context['lp_plugins'] = app('plugin_list'); + Utils::$context['lp_plugins'] = app(PluginList::class); $this->run(); } @@ -59,7 +60,7 @@ protected function getData(): array if ($this->request()->isEmpty('plugins') && $this->request()->hasNot('export_all')) return []; - return $this->request()->has('export_all') ? Utils::$context['lp_plugins'] : $this->request('plugins'); + return $this->request()->has('export_all') ? Utils::$context['lp_plugins'] : $this->request()->get('plugins'); } protected function getFile(): string diff --git a/src/Sources/LightPortal/Areas/Exports/TagExport.php b/src/Sources/LightPortal/Areas/Exports/TagExport.php index 6ccbc13dc..1f57c1596 100644 --- a/src/Sources/LightPortal/Areas/Exports/TagExport.php +++ b/src/Sources/LightPortal/Areas/Exports/TagExport.php @@ -40,12 +40,7 @@ final class TagExport extends AbstractExport { - private readonly TagRepository $repository; - - public function __construct() - { - $this->repository = app('tag_repo'); - } + public function __construct(private readonly TagRepository $repository) {} public function main(): void { @@ -84,7 +79,8 @@ protected function getData(): array if ($this->request()->isEmpty('tags') && $this->request()->hasNot('export_all')) return []; - $tags = $this->request('tags') && $this->request()->hasNot('export_all') ? $this->request('tags') : null; + $tags = $this->request()->get('tags') && $this->request()->hasNot('export_all') + ? $this->request()->get('tags') : []; $result = Db::$db->query('', ' SELECT c.tag_id, c.icon, c.status, pt.page_id, t.lang, t.value AS title diff --git a/src/Sources/LightPortal/Areas/Imports/AbstractCustomBlockImport.php b/src/Sources/LightPortal/Areas/Imports/AbstractCustomBlockImport.php index f3972c626..15f4b0248 100644 --- a/src/Sources/LightPortal/Areas/Imports/AbstractCustomBlockImport.php +++ b/src/Sources/LightPortal/Areas/Imports/AbstractCustomBlockImport.php @@ -14,6 +14,7 @@ use Bugo\Compat\Config; use Bugo\LightPortal\Args\ItemsTitlesArgs; use Bugo\LightPortal\Enums\PortalHook; +use Bugo\LightPortal\EventManagerFactory; use Bugo\LightPortal\Plugins\Event; if (! defined('SMF')) @@ -25,7 +26,7 @@ abstract class AbstractCustomBlockImport extends AbstractCustomImport protected function importItems(array &$items, array &$titles): array { - app('events')->dispatch( + app(EventManagerFactory::class)()->dispatch( PortalHook::importBlocks, new Event(new ItemsTitlesArgs($items, $titles)) ); diff --git a/src/Sources/LightPortal/Areas/Imports/AbstractCustomCategoryImport.php b/src/Sources/LightPortal/Areas/Imports/AbstractCustomCategoryImport.php index 27fcd0a4c..d2b2ad02e 100644 --- a/src/Sources/LightPortal/Areas/Imports/AbstractCustomCategoryImport.php +++ b/src/Sources/LightPortal/Areas/Imports/AbstractCustomCategoryImport.php @@ -14,6 +14,7 @@ use Bugo\Compat\Config; use Bugo\LightPortal\Args\ItemsTitlesArgs; use Bugo\LightPortal\Enums\PortalHook; +use Bugo\LightPortal\EventManagerFactory; use Bugo\LightPortal\Plugins\Event; if (! defined('SMF')) @@ -25,7 +26,7 @@ abstract class AbstractCustomCategoryImport extends AbstractCustomImport protected function importItems(array &$items, array &$titles): array { - app('events')->dispatch( + app(EventManagerFactory::class)()->dispatch( PortalHook::importCategories, new Event(new ItemsTitlesArgs($items, $titles)) ); diff --git a/src/Sources/LightPortal/Areas/Imports/AbstractCustomImport.php b/src/Sources/LightPortal/Areas/Imports/AbstractCustomImport.php index f23662a86..ac44e214c 100644 --- a/src/Sources/LightPortal/Areas/Imports/AbstractCustomImport.php +++ b/src/Sources/LightPortal/Areas/Imports/AbstractCustomImport.php @@ -40,8 +40,8 @@ protected function run(): void Sapi::setTimeLimit(); - $data = $this->request($this->entity) && $this->request()->hasNot('import_all') - ? $this->request($this->entity) + $data = $this->request()->get($this->entity) && $this->request()->hasNot('import_all') + ? $this->request()->get($this->entity) : []; $items = $this->getItems($data); diff --git a/src/Sources/LightPortal/Areas/Imports/AbstractCustomPageImport.php b/src/Sources/LightPortal/Areas/Imports/AbstractCustomPageImport.php index fff718585..c66b97d29 100644 --- a/src/Sources/LightPortal/Areas/Imports/AbstractCustomPageImport.php +++ b/src/Sources/LightPortal/Areas/Imports/AbstractCustomPageImport.php @@ -13,6 +13,7 @@ use Bugo\LightPortal\Areas\Imports\Traits\WithCommentsTrait; use Bugo\LightPortal\Enums\PortalHook; +use Bugo\LightPortal\EventManagerFactory; use Bugo\LightPortal\Plugins\Event; if (! defined('SMF')) @@ -30,7 +31,7 @@ protected function importItems(array &$items, array &$titles): array { $params = $comments = []; - app('events')->dispatch( + app(EventManagerFactory::class)()->dispatch( PortalHook::importPages, new Event(new class ($items, $titles, $params, $comments) { public function __construct( diff --git a/src/Sources/LightPortal/Areas/Imports/AbstractImport.php b/src/Sources/LightPortal/Areas/Imports/AbstractImport.php index 72712ee75..1acab4275 100644 --- a/src/Sources/LightPortal/Areas/Imports/AbstractImport.php +++ b/src/Sources/LightPortal/Areas/Imports/AbstractImport.php @@ -41,7 +41,7 @@ public function __construct() protected function getFile(string $name = 'import_file'): SimpleXMLElement|bool { - if (empty($file = $this->files($name))) + if (empty($file = $this->files()->get($name))) return false; Sapi::setTimeLimit(); diff --git a/src/Sources/LightPortal/Areas/Imports/PluginImport.php b/src/Sources/LightPortal/Areas/Imports/PluginImport.php index 17cb70bda..6862ada81 100644 --- a/src/Sources/LightPortal/Areas/Imports/PluginImport.php +++ b/src/Sources/LightPortal/Areas/Imports/PluginImport.php @@ -64,9 +64,9 @@ protected function run(): void protected function extractPackage(): bool { - $file = $this->files('import_file'); + $file = $this->files()->get('import_file'); - if (empty($file) || $file['error'] !== UPLOAD_ERR_OK) + if ($file['error'] !== UPLOAD_ERR_OK) return false; switch ($file['type']) { diff --git a/src/Sources/LightPortal/Areas/PageArea.php b/src/Sources/LightPortal/Areas/PageArea.php index c30652fb7..edecb1f58 100644 --- a/src/Sources/LightPortal/Areas/PageArea.php +++ b/src/Sources/LightPortal/Areas/PageArea.php @@ -34,6 +34,8 @@ use Bugo\LightPortal\Enums\PortalHook; use Bugo\LightPortal\Enums\Status; use Bugo\LightPortal\Enums\Tab; +use Bugo\LightPortal\EventManagerFactory; +use Bugo\LightPortal\Lists\CategoryList; use Bugo\LightPortal\Models\PageModel; use Bugo\LightPortal\Plugins\Event; use Bugo\LightPortal\Repositories\PageRepository; @@ -66,6 +68,7 @@ use Bugo\LightPortal\Utils\RequestTrait; use Bugo\LightPortal\Utils\Setting; use Bugo\LightPortal\Utils\Str; +use WPLake\Typed\Typed; use function array_column; use function array_diff; @@ -99,12 +102,7 @@ final class PageArea private int $status; - private PageRepository $repository; - - public function __construct() - { - $this->repository = app('page_repo'); - } + public function __construct(private readonly PageRepository $repository) {} public function main(): void { @@ -215,7 +213,7 @@ public function add(): void $this->preparePageList(); $json = $this->request()->json(); - $type = $json['add_page'] ?? $this->request('add_page', '') ?? ''; + $type = $json['add_page'] ?? $this->request()->get('add_page') ?? ''; if (empty($type) && empty($json['search'])) return; @@ -236,7 +234,7 @@ public function add(): void public function edit(): void { - $item = (int) ($this->request('page_id') ?: $this->request('id')); + $item = Typed::int($this->request()->get('page_id') ?: $this->request()->get('id')); Theme::loadTemplate('LightPortal/ManagePages'); @@ -321,7 +319,7 @@ private function massActions(): void 'options' => ['default' => 'action=admin;area=lp_pages'] ]); - $items = $this->request('items'); + $items = $this->request()->get('items') ?? []; switch (filter_input(INPUT_POST, 'page_actions')) { case 'delete': $this->repository->remove($items); @@ -347,7 +345,7 @@ private function massActions(): void private function calculateParams(): void { - $searchParamString = trim((string) $this->request('search', '')); + $searchParamString = trim((string) $this->request()->get('search')); $searchParams = [ 'string' => Utils::htmlspecialchars($searchParamString), ]; @@ -385,7 +383,7 @@ private function calculateParams(): void 'search' => Utils::$smcFunc['strtolower']($searchParams['string']), 'unapproved' => Status::UNAPPROVED->value, 'statuses' => [Status::INACTIVE->value, Status::ACTIVE->value], - 'entry_type' => $this->request('type', EntryType::DEFAULT->name()), + 'entry_type' => $this->request()->get('type') ?? EntryType::DEFAULT->name(), ], ]; } @@ -485,7 +483,7 @@ private function getParams(): array $params = []; - app('events')->dispatch( + app(EventManagerFactory::class)()->dispatch( PortalHook::preparePageParams, new Event(new ParamsArgs($params, Utils::$context['lp_current_page']['type'])) ); @@ -564,7 +562,7 @@ private function prepareFormFields(): void 'id' => 'category_id', 'multiple' => false, 'wide' => false, - 'data' => app('category_list'), + 'data' => app(CategoryList::class), 'value' => Utils::$context['lp_page']['category_id'], ]); @@ -641,7 +639,7 @@ private function prepareFormFields(): void ->setValue(Utils::$context['lp_page']['options']['allow_comments']); } - app('events')->dispatch( + app(EventManagerFactory::class)()->dispatch( PortalHook::preparePageFields, new Event(new OptionsTypeArgs(Utils::$context['lp_page']['options'], Utils::$context['lp_page']['type'])) ); @@ -651,7 +649,7 @@ private function prepareFormFields(): void private function prepareEditor(): void { - app('events')->dispatch( + app(EventManagerFactory::class)()->dispatch( PortalHook::prepareEditor, new Event(new ObjectArgs(Utils::$context['lp_page'])) ); diff --git a/src/Sources/LightPortal/Areas/PluginArea.php b/src/Sources/LightPortal/Areas/PluginArea.php index f8395fefa..5d5a658c7 100644 --- a/src/Sources/LightPortal/Areas/PluginArea.php +++ b/src/Sources/LightPortal/Areas/PluginArea.php @@ -21,6 +21,8 @@ use Bugo\LightPortal\Args\SettingsArgs; use Bugo\LightPortal\Enums\PortalHook; use Bugo\LightPortal\Enums\VarType; +use Bugo\LightPortal\EventManagerFactory; +use Bugo\LightPortal\Lists\PluginList; use Bugo\LightPortal\Plugins\Event; use Bugo\LightPortal\Repositories\PluginRepository; use Bugo\LightPortal\Utils\CacheTrait; @@ -59,12 +61,7 @@ final class PluginArea use CacheTrait; use RequestTrait; - private PluginRepository $repository; - - public function __construct() - { - $this->repository = app('plugin_repo'); - } + public function __construct(private readonly PluginRepository $repository) {} public function main(): void { @@ -96,7 +93,7 @@ public function main(): void ), ]; - Utils::$context['lp_plugins'] = app('plugin_list'); + Utils::$context['lp_plugins'] = app(PluginList::class); $this->extendPluginList(); @@ -107,7 +104,7 @@ public function main(): void $settings = []; // Plugin authors can add settings here - app('events', Utils::$context['lp_plugins'])->dispatch( + app(EventManagerFactory::class)(Utils::$context['lp_plugins'])->dispatch( PortalHook::addSettings, new Event(new SettingsArgs($settings)) ); @@ -162,27 +159,27 @@ private function handleSave(array $configVars): void User::$me->checkSession(); - $name = $this->request('plugin_name'); + $name = $this->request()->get('plugin_name'); $settings = []; foreach ($configVars[$name] as $var) { if ($this->request()->has($var[1])) { if ($var[0] === 'check') { - $settings[$var[1]] = VarType::BOOLEAN->filter($this->request($var[1])); + $settings[$var[1]] = VarType::BOOLEAN->filter($this->request()->get($var[1])); } elseif ($var[0] === 'int') { - $settings[$var[1]] = VarType::INTEGER->filter($this->request($var[1])); + $settings[$var[1]] = VarType::INTEGER->filter($this->request()->get($var[1])); } elseif ($var[0] === 'float') { - $settings[$var[1]] = VarType::FLOAT->filter($this->request($var[1])); + $settings[$var[1]] = VarType::FLOAT->filter($this->request()->get($var[1])); } elseif ($var[0] === 'url') { - $settings[$var[1]] = VarType::URL->filter($this->request($var[1])); + $settings[$var[1]] = VarType::URL->filter($this->request()->get($var[1])); } else { - $settings[$var[1]] = $this->request($var[1]); + $settings[$var[1]] = $this->request()->get($var[1]); } } } // Plugin authors can do additional actions after settings saving - app('events', Utils::$context['lp_plugins'])->dispatch( + app(EventManagerFactory::class)(Utils::$context['lp_plugins'])->dispatch( PortalHook::saveSettings, new Event(new SettingsArgs($settings)) ); diff --git a/src/Sources/LightPortal/Areas/TagArea.php b/src/Sources/LightPortal/Areas/TagArea.php index 8adaf824f..773c49696 100644 --- a/src/Sources/LightPortal/Areas/TagArea.php +++ b/src/Sources/LightPortal/Areas/TagArea.php @@ -37,6 +37,7 @@ use Bugo\LightPortal\Utils\Language; use Bugo\LightPortal\Utils\RequestTrait; use Bugo\LightPortal\Utils\Str; +use WPLake\Typed\Typed; use const LP_NAME; @@ -49,12 +50,7 @@ final class TagArea use CacheTrait; use RequestTrait; - private TagRepository $repository; - - public function __construct() - { - $this->repository = app('tag_repo'); - } + public function __construct(private readonly TagRepository $repository) {} public function main(): void { @@ -115,7 +111,7 @@ public function add(): void public function edit(): void { - $item = (int) ($this->request('tag_id') ?: $this->request('id')); + $item = Typed::int($this->request()->get('tag_id') ?: $this->request()->get('id')); Theme::loadTemplate('LightPortal/ManageTags'); diff --git a/src/Sources/LightPortal/Areas/Traits/QueryTrait.php b/src/Sources/LightPortal/Areas/Traits/QueryTrait.php index f53d8aa6a..3a22c51d4 100644 --- a/src/Sources/LightPortal/Areas/Traits/QueryTrait.php +++ b/src/Sources/LightPortal/Areas/Traits/QueryTrait.php @@ -16,6 +16,7 @@ use Bugo\Compat\Lang; use Bugo\Compat\Utils; use Bugo\LightPortal\Enums\PortalHook; +use Bugo\LightPortal\EventManagerFactory; use Bugo\LightPortal\Lists\IconList; use Bugo\LightPortal\Plugins\Event; use Bugo\LightPortal\Utils\CacheTrait; @@ -53,7 +54,7 @@ private function prepareIconList(): void $template = Str::html('i', ['class' => '%1$s fa-fw']) ->setAttribute('aria-hidden', 'true') . ' %1$s'; - app('events')->dispatch( + app(EventManagerFactory::class)()->dispatch( PortalHook::prepareIconList, new Event(new class ($icons, $template) { public function __construct(public array &$icons, public string &$template) {} diff --git a/src/Sources/LightPortal/Areas/Validators/BlockValidator.php b/src/Sources/LightPortal/Areas/Validators/BlockValidator.php index cbac70bbf..aadf38dfd 100644 --- a/src/Sources/LightPortal/Areas/Validators/BlockValidator.php +++ b/src/Sources/LightPortal/Areas/Validators/BlockValidator.php @@ -18,6 +18,7 @@ use Bugo\LightPortal\Args\ParamsArgs; use Bugo\LightPortal\Enums\PortalHook; use Bugo\LightPortal\Enums\VarType; +use Bugo\LightPortal\EventManagerFactory; use Bugo\LightPortal\Plugins\Event; use Bugo\LightPortal\Utils\RequestTrait; @@ -61,7 +62,7 @@ public function validate(): array $data = filter_input_array(INPUT_POST, $this->args); - app('events')->dispatch( + app(EventManagerFactory::class)()->dispatch( PortalHook::validateBlockParams, new Event(new ParamsArgs($params, Utils::$context['current_block']['type'])) ); @@ -92,7 +93,7 @@ private function findErrors(array $data): void $errors[] = 'no_valid_areas'; } - app('events')->dispatch( + app(EventManagerFactory::class)()->dispatch( PortalHook::findBlockErrors, new Event(new ErrorsDataArgs($errors, $data)) ); diff --git a/src/Sources/LightPortal/Areas/Validators/PageValidator.php b/src/Sources/LightPortal/Areas/Validators/PageValidator.php index 59e8f0e51..2ed609a54 100644 --- a/src/Sources/LightPortal/Areas/Validators/PageValidator.php +++ b/src/Sources/LightPortal/Areas/Validators/PageValidator.php @@ -20,6 +20,7 @@ use Bugo\LightPortal\Args\ParamsArgs; use Bugo\LightPortal\Enums\PortalHook; use Bugo\LightPortal\Enums\VarType; +use Bugo\LightPortal\EventManagerFactory; use Bugo\LightPortal\Plugins\Event; use Bugo\LightPortal\Utils\RequestTrait; @@ -65,7 +66,7 @@ public function validate(): array $this->args['title_' . $lang['filename']] = FILTER_SANITIZE_FULL_SPECIAL_CHARS; } - app('events')->dispatch( + app(EventManagerFactory::class)()->dispatch( PortalHook::validatePageParams, new Event(new ParamsArgs($params, Utils::$context['lp_current_page']['type'])) ); @@ -110,7 +111,7 @@ private function findErrors(array $data): void if (empty($data['content'])) $errors[] = 'no_content'; - app('events')->dispatch(PortalHook::findPageErrors, new Event(new ErrorsDataArgs($errors, $data))); + app(EventManagerFactory::class)()->dispatch(PortalHook::findPageErrors, new Event(new ErrorsDataArgs($errors, $data))); if ($errors) { $this->request()->put('preview', true); diff --git a/src/Sources/LightPortal/Articles/BoardArticle.php b/src/Sources/LightPortal/Articles/BoardArticle.php index 478dab527..aefeb113d 100644 --- a/src/Sources/LightPortal/Articles/BoardArticle.php +++ b/src/Sources/LightPortal/Articles/BoardArticle.php @@ -57,7 +57,7 @@ public function init(): void 'last_updated DESC', ]; - app('events')->dispatch( + app(EventManagerFactory::class)()->dispatch( PortalHook::frontBoards, new Event(new ArticlesArgs( $this->columns, @@ -137,7 +137,7 @@ public function getData(int $start, int $limit): array $this->prepareTeaser($boards, $row); - app('events')->dispatch( + app(EventManagerFactory::class)()->dispatch( PortalHook::frontBoardsRow, new Event(new ArticlesRowArgs($boards, $row)) ); diff --git a/src/Sources/LightPortal/Articles/PageArticle.php b/src/Sources/LightPortal/Articles/PageArticle.php index efd49b9b3..98af4babd 100644 --- a/src/Sources/LightPortal/Articles/PageArticle.php +++ b/src/Sources/LightPortal/Articles/PageArticle.php @@ -24,6 +24,8 @@ use Bugo\LightPortal\Enums\Permission; use Bugo\LightPortal\Enums\PortalHook; use Bugo\LightPortal\Enums\Status; +use Bugo\LightPortal\EventManagerFactory; +use Bugo\LightPortal\Lists\TitleList; use Bugo\LightPortal\Plugins\Event; use Bugo\LightPortal\Utils\Avatar; use Bugo\LightPortal\Utils\Content; @@ -74,7 +76,7 @@ public function init(): void 'date DESC', ]; - app('events')->dispatch( + app(EventManagerFactory::class)()->dispatch( PortalHook::frontPages, new Event(new ArticlesArgs( $this->columns, @@ -88,7 +90,7 @@ public function init(): void public function getData(int $start, int $limit): array { - $titles = app('title_list'); + $titles = app(TitleList::class); $this->params += [ 'start' => $start, @@ -153,7 +155,7 @@ public function getData(int $start, int $limit): array $this->prepareTeaser($pages, $row); - app('events')->dispatch( + app(EventManagerFactory::class)()->dispatch( PortalHook::frontPagesRow, new Event(new ArticlesRowArgs($pages, $row)) ); diff --git a/src/Sources/LightPortal/Articles/TopicArticle.php b/src/Sources/LightPortal/Articles/TopicArticle.php index 77ee6940a..9c9762aab 100644 --- a/src/Sources/LightPortal/Articles/TopicArticle.php +++ b/src/Sources/LightPortal/Articles/TopicArticle.php @@ -20,6 +20,7 @@ use Bugo\LightPortal\Args\ArticlesArgs; use Bugo\LightPortal\Args\ArticlesRowArgs; use Bugo\LightPortal\Enums\PortalHook; +use Bugo\LightPortal\EventManagerFactory; use Bugo\LightPortal\Plugins\Event; use Bugo\LightPortal\Utils\Avatar; use Bugo\LightPortal\Utils\Setting; @@ -59,7 +60,7 @@ public function init(): void 'date DESC', ]; - app('events')->dispatch( + app(EventManagerFactory::class)()->dispatch( PortalHook::frontTopics, new Event(new ArticlesArgs( $this->columns, @@ -151,7 +152,7 @@ public function getData(int $start, int $limit): array $this->prepareTeaser($topics, $row); - app('events')->dispatch( + app(EventManagerFactory::class)()->dispatch( PortalHook::frontTopicsRow, new Event(new ArticlesRowArgs($topics, $row)) ); diff --git a/src/Sources/LightPortal/Enums/Permission.php b/src/Sources/LightPortal/Enums/Permission.php index 751829091..eaef5ed12 100644 --- a/src/Sources/LightPortal/Enums/Permission.php +++ b/src/Sources/LightPortal/Enums/Permission.php @@ -15,6 +15,7 @@ use Bugo\Compat\Db; use Bugo\Compat\User; use Bugo\LightPortal\Enums\Traits\HasValuesTrait; +use Bugo\LightPortal\Utils\Cache; use function array_column; use function array_filter; @@ -75,7 +76,7 @@ public static function isGroupMember(int $groupId): bool private static function getBoardModerators(): array { - if (($moderators = app('cache')->get('board_moderators')) === null) { + if (($moderators = app(Cache::class)->get('board_moderators')) === null) { $result = Db::$db->query('', /** @lang text */ ' SELECT id_member FROM {db_prefix}moderators', @@ -87,7 +88,7 @@ private static function getBoardModerators(): array $moderators = array_column($items, 'id_member'); - app('cache')->put('board_moderators', $moderators); + app(Cache::class)->put('board_moderators', $moderators); } return $moderators; diff --git a/src/Sources/LightPortal/EventManagerFactory.php b/src/Sources/LightPortal/EventManagerFactory.php index c31c68ed4..fde3c787d 100644 --- a/src/Sources/LightPortal/EventManagerFactory.php +++ b/src/Sources/LightPortal/EventManagerFactory.php @@ -26,11 +26,10 @@ public function __invoke(array $plugins = []): EventManager { if ($plugins !== self::$plugins) { self::$plugins = $plugins; - self::$handler = new PluginHandler($plugins); + self::$handler = app(PluginHandler::class)($plugins); } - self::$handler ??= new PluginHandler(); - + self::$handler ??= app(PluginHandler::class)(); self::$manager = self::$handler->getManager(); return self::$manager; diff --git a/src/Sources/LightPortal/Hooks/Actions.php b/src/Sources/LightPortal/Hooks/Actions.php index 518b822bb..819769304 100644 --- a/src/Sources/LightPortal/Hooks/Actions.php +++ b/src/Sources/LightPortal/Hooks/Actions.php @@ -16,6 +16,10 @@ use Bugo\Compat\Theme; use Bugo\Compat\User; use Bugo\Compat\Utils; +use Bugo\LightPortal\Actions\BoardIndex; +use Bugo\LightPortal\Actions\Category; +use Bugo\LightPortal\Actions\FrontPage; +use Bugo\LightPortal\Actions\Tag; use Bugo\LightPortal\Enums\Action; use Bugo\LightPortal\Utils\Setting; use Bugo\LightPortal\Utils\RequestTrait; @@ -36,19 +40,19 @@ class Actions public function __invoke(array &$actions): void { if (Setting::get('lp_frontpage_mode', 'string', '')) { - $actions[LP_ACTION] = [false, [app('front_page'), 'show']]; + $actions[LP_ACTION] = [false, [app(FrontPage::class), 'show']]; } - $actions[Action::FORUM->value] = [false, [app('board_index'), 'show']]; + $actions[Action::FORUM->value] = [false, [app(BoardIndex::class), 'show']]; Theme::load(); if ($this->request()->is(LP_ACTION) && Utils::$context['current_subaction'] === 'categories') { - app('category')->show(app('card_list')); + app(Category::class)->show(); } if ($this->request()->is(LP_ACTION) && Utils::$context['current_subaction'] === 'tags') { - app('tag')->show(app('card_list')); + app(Tag::class)->show(); } if ($this->request()->is(LP_ACTION) && Utils::$context['current_subaction'] === 'promote') { @@ -67,7 +71,7 @@ protected function promoteTopic(): void if (empty(User::$info['is_admin']) || $this->request()->hasNot('t')) return; - $topic = $this->request('t'); + $topic = $this->request()->get('t'); $frontpageTopics = Setting::getFrontpageTopics(); diff --git a/src/Sources/LightPortal/Hooks/CommonChecks.php b/src/Sources/LightPortal/Hooks/CommonChecks.php index dde1870a6..b84b23cf6 100644 --- a/src/Sources/LightPortal/Hooks/CommonChecks.php +++ b/src/Sources/LightPortal/Hooks/CommonChecks.php @@ -45,21 +45,26 @@ protected function unsetDisabledActions(array &$data): void $disabledActions = array_flip($this->getDisabledActions()); foreach (array_keys($data) as $action) { - if (array_key_exists($action, $disabledActions)) + if (array_key_exists($action, $disabledActions)) { unset($data[$action]); + } } - if (array_key_exists('search', $disabledActions)) + if (array_key_exists('search', $disabledActions)) { Utils::$context['allow_search'] = false; + } - if (array_key_exists('moderate', $disabledActions)) + if (array_key_exists('moderate', $disabledActions)) { Utils::$context['allow_moderation_center'] = false; + } - if (array_key_exists('calendar', $disabledActions)) + if (array_key_exists('calendar', $disabledActions)) { Utils::$context['allow_calendar'] = false; + } - if (array_key_exists('mlist', $disabledActions)) + if (array_key_exists('mlist', $disabledActions)) { Utils::$context['allow_memberlist'] = false; + } Utils::$context['lp_disabled_actions'] = $disabledActions; } diff --git a/src/Sources/LightPortal/Hooks/CurrentAction.php b/src/Sources/LightPortal/Hooks/CurrentAction.php index 96aa83fbb..ad65c4246 100644 --- a/src/Sources/LightPortal/Hooks/CurrentAction.php +++ b/src/Sources/LightPortal/Hooks/CurrentAction.php @@ -75,7 +75,7 @@ public function setCurrentActionForMenuPages(string &$action): void return; if ($this->request()->url() === LP_PAGE_URL . Utils::$context['lp_page']['slug']) { - $action = 'portal_page_' . $this->request(LP_PAGE_PARAM); + $action = 'portal_page_' . $this->request()->get(LP_PAGE_PARAM); } } } diff --git a/src/Sources/LightPortal/Hooks/DefaultAction.php b/src/Sources/LightPortal/Hooks/DefaultAction.php index 55d044d8c..aaa04384c 100644 --- a/src/Sources/LightPortal/Hooks/DefaultAction.php +++ b/src/Sources/LightPortal/Hooks/DefaultAction.php @@ -13,9 +13,14 @@ namespace Bugo\LightPortal\Hooks; use Bugo\Compat\Config; +use Bugo\LightPortal\Actions\BoardIndex; +use Bugo\LightPortal\Actions\FrontPage; +use Bugo\LightPortal\Actions\Page; use Bugo\LightPortal\Utils\RequestTrait; use Bugo\LightPortal\Utils\Setting; +use function call_user_func; + use const LP_PAGE_PARAM; if (! defined('SMF')) @@ -28,13 +33,13 @@ class DefaultAction public function __invoke(): mixed { if ($this->request()->isNotEmpty(LP_PAGE_PARAM)) { - return app('page')->show(); + return call_user_func([app(Page::class), 'show']); } if (empty(Config::$modSettings['lp_frontpage_mode']) || Setting::isStandaloneMode()) { - return app('board_index')->show(); + return call_user_func([app(BoardIndex::class), 'show']); } - return app('front_page')->show(); + return call_user_func([app(FrontPage::class), 'show']); } } diff --git a/src/Sources/LightPortal/Hooks/DownloadRequest.php b/src/Sources/LightPortal/Hooks/DownloadRequest.php index 73c8676d3..41582c8d1 100644 --- a/src/Sources/LightPortal/Hooks/DownloadRequest.php +++ b/src/Sources/LightPortal/Hooks/DownloadRequest.php @@ -14,6 +14,7 @@ use Bugo\Compat\Lang; use Bugo\LightPortal\Enums\PortalHook; +use Bugo\LightPortal\EventManagerFactory; use Bugo\LightPortal\Plugins\Event; if (! defined('SMF')) @@ -25,7 +26,7 @@ public function __invoke(mixed &$attachRequest): void { Lang::load('LightPortal/LightPortal'); - app('events')->dispatch( + app(EventManagerFactory::class)()->dispatch( PortalHook::downloadRequest, new Event(new class ($attachRequest) { public function __construct(public mixed &$attachRequest) {} diff --git a/src/Sources/LightPortal/Hooks/LoadTheme.php b/src/Sources/LightPortal/Hooks/LoadTheme.php index 655a19092..b16f2b5ba 100644 --- a/src/Sources/LightPortal/Hooks/LoadTheme.php +++ b/src/Sources/LightPortal/Hooks/LoadTheme.php @@ -25,6 +25,8 @@ use Bugo\LightPortal\Enums\PluginType; use Bugo\LightPortal\Enums\PortalHook; use Bugo\LightPortal\Enums\TitleClass; +use Bugo\LightPortal\EventManagerFactory; +use Bugo\LightPortal\Repositories\BlockRepository; use Bugo\LightPortal\Utils\RequestTrait; use Bugo\LightPortal\Utils\SessionManager; @@ -48,10 +50,10 @@ public function __invoke(): void $this->defineVars(); - $this->loadAssets(app('compiler')); + $this->loadAssets(app(CompilerInterface::class)); // Run all init methods for active plugins - app('events')->dispatch(PortalHook::init); + app(EventManagerFactory::class)()->dispatch(PortalHook::init); } protected function defineVars(): void @@ -72,7 +74,7 @@ protected function defineVars(): void Utils::$context['lp_content_types'] = ContentType::all(); Utils::$context['lp_page_types'] = EntryType::all(); - Utils::$context['lp_active_blocks'] = app('active_blocks'); + Utils::$context['lp_active_blocks'] = app(BlockRepository::class)->getActive(); } protected function loadAssets(CompilerInterface $compiler): void diff --git a/src/Sources/LightPortal/Hooks/MenuButtons.php b/src/Sources/LightPortal/Hooks/MenuButtons.php index cad586253..469a5ae44 100644 --- a/src/Sources/LightPortal/Hooks/MenuButtons.php +++ b/src/Sources/LightPortal/Hooks/MenuButtons.php @@ -16,8 +16,10 @@ use Bugo\Compat\Lang; use Bugo\Compat\Theme; use Bugo\Compat\Utils; +use Bugo\LightPortal\Actions\Block; use Bugo\LightPortal\Enums\Action; use Bugo\LightPortal\Enums\Permission; +use Bugo\LightPortal\Repositories\PageRepository; use Bugo\LightPortal\Utils\Setting; use Bugo\LightPortal\Utils\Str; @@ -45,7 +47,7 @@ public function __invoke(array &$buttons): void if ($this->isPortalCanBeLoaded() === false) return; - app('block')->show(); + app(Block::class)->show(); $this->prepareAdminButtons($buttons); $this->prepareModerationButtons($buttons); @@ -145,7 +147,7 @@ protected function prepareModerationButtons(array &$buttons): void protected function preparePageButtons(array &$buttons): void { - if (empty(Utils::$context['lp_menu_pages'] = app('page_repo')->getMenuItems())) + if (empty(Utils::$context['lp_menu_pages'] = app(PageRepository::class)->getMenuItems())) return; $pageButtons = []; diff --git a/src/Sources/LightPortal/Hooks/PreCssOutput.php b/src/Sources/LightPortal/Hooks/PreCssOutput.php index c74045aee..f5fdf964a 100644 --- a/src/Sources/LightPortal/Hooks/PreCssOutput.php +++ b/src/Sources/LightPortal/Hooks/PreCssOutput.php @@ -15,6 +15,7 @@ use Bugo\Compat\Config; use Bugo\Compat\Utils; use Bugo\LightPortal\Enums\PortalHook; +use Bugo\LightPortal\EventManagerFactory; use Bugo\LightPortal\Plugins\Event; use Bugo\LightPortal\Utils\Str; @@ -44,7 +45,7 @@ public function __invoke(): void $styles[] = 'https://cdn.jsdelivr.net/npm/@fortawesome/fontawesome-free@6/css/all.min.css'; } - app('events')->dispatch( + app(EventManagerFactory::class)()->dispatch( PortalHook::preloadStyles, new Event(new class ($styles) { public function __construct(public array &$styles) {} diff --git a/src/Sources/LightPortal/Hooks/ProfileAreas.php b/src/Sources/LightPortal/Hooks/ProfileAreas.php index 123f504f7..00aca77e7 100644 --- a/src/Sources/LightPortal/Hooks/ProfileAreas.php +++ b/src/Sources/LightPortal/Hooks/ProfileAreas.php @@ -33,7 +33,7 @@ public function __invoke(array &$areas): void 'label' => Lang::$txt['lp_my_pages'], 'custom_url' => Config::$scripturl . '?action=admin;area=lp_pages', 'icon' => 'reports', - 'enabled' => $this->request('area') === 'popup', + 'enabled' => $this->request()->get('area') === 'popup', 'permission' => [ 'own' => 'light_portal_manage_pages_own', ], diff --git a/src/Sources/LightPortal/Hooks/WhosOnline.php b/src/Sources/LightPortal/Hooks/WhosOnline.php index b96d24e5c..5b2c56b0d 100644 --- a/src/Sources/LightPortal/Hooks/WhosOnline.php +++ b/src/Sources/LightPortal/Hooks/WhosOnline.php @@ -15,6 +15,8 @@ use Bugo\Compat\Config; use Bugo\Compat\Lang; use Bugo\LightPortal\Enums\Action; +use Bugo\LightPortal\Lists\CategoryList; +use Bugo\LightPortal\Lists\TagList; use Bugo\LightPortal\Utils\Setting; use function sprintf; @@ -57,7 +59,7 @@ public function __invoke(array $actions): string $result = sprintf(Lang::$txt['lp_who_viewing_frontpage'], LP_BASE_URL); if (isset($actions['sa']) && $actions['sa'] === 'tags') { - $tags = app('tag_list'); + $tags = app(TagList::class); $result = isset($actions['id']) ? Lang::getTxt('lp_who_viewing_the_tag', [ @@ -71,7 +73,7 @@ public function __invoke(array $actions): string } if (isset($actions['sa']) && $actions['sa'] === 'categories') { - $categories = app('category_list'); + $categories = app(CategoryList::class); $result = isset($actions['id']) ? Lang::getTxt('lp_who_viewing_the_category', [ diff --git a/src/Sources/LightPortal/Lists/IconList.php b/src/Sources/LightPortal/Lists/IconList.php index 18b7cf679..92a635106 100644 --- a/src/Sources/LightPortal/Lists/IconList.php +++ b/src/Sources/LightPortal/Lists/IconList.php @@ -14,6 +14,7 @@ use Bugo\FontAwesome\Enums\Icon as IconEnum; use Bugo\LightPortal\Enums\PortalHook; +use Bugo\LightPortal\EventManagerFactory; use Bugo\LightPortal\Plugins\Event; use Bugo\LightPortal\Utils\Icon; @@ -103,7 +104,7 @@ public function __invoke(): array $set['big_image'] = 'fa-regular fa-image fa-5x'; // Plugin authors can extend the icon set - app('events')->dispatch( + app(EventManagerFactory::class)()->dispatch( PortalHook::changeIconSet, new Event(new class ($set) { public function __construct(public array &$set) {} diff --git a/src/Sources/LightPortal/Lists/PageList.php b/src/Sources/LightPortal/Lists/PageList.php index 2c2abef35..78ece3e7f 100644 --- a/src/Sources/LightPortal/Lists/PageList.php +++ b/src/Sources/LightPortal/Lists/PageList.php @@ -26,12 +26,7 @@ final class PageList implements ListInterface { - private readonly PageRepository $repository; - - public function __construct() - { - $this->repository = app('page_repo'); - } + public function __construct(private readonly PageRepository $repository) {} public function __invoke(): array { diff --git a/src/Sources/LightPortal/Plugins/AdsBlock/Hooks/MenuButtons.php b/src/Sources/LightPortal/Plugins/AdsBlock/Hooks/MenuButtons.php index eefe4c904..07a49c391 100644 --- a/src/Sources/LightPortal/Plugins/AdsBlock/Hooks/MenuButtons.php +++ b/src/Sources/LightPortal/Plugins/AdsBlock/Hooks/MenuButtons.php @@ -69,14 +69,14 @@ private function prepareAdsPlacements(): void if ($this->request()->hasNot('area')) return; - if ($this->request('area') === 'lp_blocks') { + if ($this->request()->get('area') === 'lp_blocks') { require_once dirname(__DIR__) . '/template.php'; Utils::$context['template_layers'][] = 'ads_block_form'; } if ( - $this->request('area') === 'lp_settings' + $this->request()->get('area') === 'lp_settings' && Utils::$context['current_subaction'] === 'panels' ) { unset(Utils::$context['lp_block_placements']['ads']); diff --git a/src/Sources/LightPortal/Plugins/ArticleList/ArticleList.php b/src/Sources/LightPortal/Plugins/ArticleList/ArticleList.php index fe07e9511..120669200 100644 --- a/src/Sources/LightPortal/Plugins/ArticleList/ArticleList.php +++ b/src/Sources/LightPortal/Plugins/ArticleList/ArticleList.php @@ -23,6 +23,7 @@ use Bugo\LightPortal\Enums\Permission; use Bugo\LightPortal\Enums\Status; use Bugo\LightPortal\Enums\Tab; +use Bugo\LightPortal\Lists\TitleList; use Bugo\LightPortal\Plugins\Block; use Bugo\LightPortal\Plugins\Event; use Bugo\LightPortal\UI\Fields\CheckboxField; @@ -155,7 +156,7 @@ public function getPages(ParamWrapper $parameters): array if (empty($parameters['include_pages'])) return []; - $titles = app('title_list'); + $titles = app(TitleList::class); $result = Db::$db->query('', ' SELECT page_id, slug, content, description, type diff --git a/src/Sources/LightPortal/Plugins/BlogMode/BlogIndex.php b/src/Sources/LightPortal/Plugins/BlogMode/BlogIndex.php index 4eeda2d59..ab0b5bb69 100644 --- a/src/Sources/LightPortal/Plugins/BlogMode/BlogIndex.php +++ b/src/Sources/LightPortal/Plugins/BlogMode/BlogIndex.php @@ -29,7 +29,7 @@ class BlogIndex public function __construct() { - $this->front = app('front_page'); + $this->front = app(FrontPage::class); $this->action = Utils::$context['lp_blog_mode_plugin']['blog_action'] ?? ''; } diff --git a/src/Sources/LightPortal/Plugins/BlogMode/BlogMode.php b/src/Sources/LightPortal/Plugins/BlogMode/BlogMode.php index 7c15687e5..5a473ecc2 100644 --- a/src/Sources/LightPortal/Plugins/BlogMode/BlogMode.php +++ b/src/Sources/LightPortal/Plugins/BlogMode/BlogMode.php @@ -25,6 +25,7 @@ use Bugo\LightPortal\Enums\Hook; use Bugo\LightPortal\Plugins\Event; use Bugo\LightPortal\Plugins\Plugin; +use Bugo\LightPortal\Repositories\PageRepository; use Bugo\LightPortal\UI\Tables\NumViewsColumn; use Bugo\LightPortal\UI\Tables\DateColumn; use Bugo\LightPortal\UI\Tables\PortalTableBuilder; @@ -51,6 +52,8 @@ class BlogMode extends Plugin private string $blogAction = 'blog'; + private readonly PageRepository $pageRepository; + private string $mode = 'blog_pages'; public function __construct() @@ -58,6 +61,8 @@ public function __construct() parent::__construct(); $this->blogAction = $this->context['blog_action'] ?? $this->blogAction; + + $this->pageRepository = app(PageRepository::class); } public function init(): void @@ -76,7 +81,7 @@ public function init(): void if (empty(User::hasPermission('light_portal_post_blog_entries'))) return; - Utils::$context['lp_page_types'][$this->blogAction] = $this->txt['blogged_status']; + Utils::$context['lp_page_types']['blog'] = $this->txt['blogged_status']; if (empty($this->context['show_blogs_in_profiles'])) return; @@ -213,8 +218,6 @@ public function showBlogEntries(int $memID): void ' - ' . User::$profiles[$memID]['real_name'] ); - $repository = app('page_repo'); - $params = [ 'AND p.author_id = {int:current_user} AND p.entry_type = {string:entry_type}', ['current_user' => $memID, 'entry_type' => BlogArticle::TYPE], @@ -226,8 +229,8 @@ public function showBlogEntries(int $memID): void action: Config::$scripturl . '?action=profile;area=blogs;u=' . Utils::$context['current_member'], defaultSortColumn: 'date' ) - ->setItems($repository->getAll(...), $params) - ->setCount($repository->getTotalCount(...), $params) + ->setItems($this->pageRepository->getAll(...), $params) + ->setCount($this->pageRepository->getTotalCount(...), $params) ->addColumns([ IdColumn::make()->setSort('p.page_id'), DateColumn::make(), diff --git a/src/Sources/LightPortal/Plugins/CategoryList/CategoryList.php b/src/Sources/LightPortal/Plugins/CategoryList/CategoryList.php index 4df4bc69d..b07f7386e 100644 --- a/src/Sources/LightPortal/Plugins/CategoryList/CategoryList.php +++ b/src/Sources/LightPortal/Plugins/CategoryList/CategoryList.php @@ -18,6 +18,7 @@ use Bugo\LightPortal\Plugins\Block; use Bugo\LightPortal\Plugins\Event; use Bugo\LightPortal\Utils\Str; +use WPLake\Typed\Typed; if (! defined('LP_NAME')) die('No direct access...'); @@ -28,7 +29,7 @@ class CategoryList extends Block public function getData(): array { - return (new Category())->getAll(0, 0, 'c.priority'); + return (app(Category::class))->getAll(0, 0, 'c.priority'); } public function prepareContent(Event $e): void @@ -44,8 +45,8 @@ public function prepareContent(Event $e): void $currentCat = Utils::$context['current_action'] === 'portal' && $this->request()->has('sa') - && $this->request('sa') === 'categories' - ? (int) $this->request('id', 0) : false; + && $this->request()->get('sa') === 'categories' + ? Typed::int($this->request()->get('id')) : false; if (isset(Utils::$context['lp_page']['category_id'])) { $currentCat = Utils::$context['lp_page']['category_id']; diff --git a/src/Sources/LightPortal/Plugins/ConfigHandler.php b/src/Sources/LightPortal/Plugins/ConfigHandler.php index 16eada4e5..b2383a262 100644 --- a/src/Sources/LightPortal/Plugins/ConfigHandler.php +++ b/src/Sources/LightPortal/Plugins/ConfigHandler.php @@ -13,6 +13,7 @@ namespace Bugo\LightPortal\Plugins; use Bugo\Compat\Utils; +use Bugo\LightPortal\Repositories\PluginRepository; class ConfigHandler { @@ -20,7 +21,7 @@ class ConfigHandler public function handle(string $snakeName): void { - self::$settings ??= app('plugin_repo')->getSettings(); + self::$settings ??= app(PluginRepository::class)->getSettings(); // @TODO These variables are still needed in some templates Utils::$context['lp_' . $snakeName . '_plugin'] = self::$settings[$snakeName] ?? []; diff --git a/src/Sources/LightPortal/Plugins/EhPortalMigration/EhPortalMigration.php b/src/Sources/LightPortal/Plugins/EhPortalMigration/EhPortalMigration.php index 35cbdd495..2dc54c5cc 100644 --- a/src/Sources/LightPortal/Plugins/EhPortalMigration/EhPortalMigration.php +++ b/src/Sources/LightPortal/Plugins/EhPortalMigration/EhPortalMigration.php @@ -68,7 +68,7 @@ public function importPages(Event $e): void $items = &$e->args->items; $titles = &$e->args->titles; - if ($this->request('sa') !== self::AREA) + if ($this->request()->get('sa') !== self::AREA) return; foreach ($items as $pageId => $item) { diff --git a/src/Sources/LightPortal/Plugins/EzPortalMigration/EzPortalMigration.php b/src/Sources/LightPortal/Plugins/EzPortalMigration/EzPortalMigration.php index fc8ef3501..4de46596b 100644 --- a/src/Sources/LightPortal/Plugins/EzPortalMigration/EzPortalMigration.php +++ b/src/Sources/LightPortal/Plugins/EzPortalMigration/EzPortalMigration.php @@ -56,7 +56,7 @@ public function updatePageAreas(Event $e): void public function importPages(Event $e): void { - if ($this->request('sa') !== self::AREA) + if ($this->request()->get('sa') !== self::AREA) return; $items = &$e->args->items; diff --git a/src/Sources/LightPortal/Plugins/HelloPortal/HelloPortal.php b/src/Sources/LightPortal/Plugins/HelloPortal/HelloPortal.php index 998a252e3..551d208e3 100644 --- a/src/Sources/LightPortal/Plugins/HelloPortal/HelloPortal.php +++ b/src/Sources/LightPortal/Plugins/HelloPortal/HelloPortal.php @@ -46,10 +46,10 @@ public function menuButtons(): void if ($this->request()->isNot('admin') || empty($steps = $this->getStepData())) return; - if (empty($this->request('area')) || empty(Utils::$context['template_layers'])) + if (empty($this->request()->get('area')) || empty(Utils::$context['template_layers'])) return; - if (str_contains((string) $this->request('area'), 'lp_')) { + if (str_contains((string) $this->request()->get('area'), 'lp_')) { $this->setTemplate(); Utils::$context['template_layers'][] = 'tour_info'; @@ -169,7 +169,7 @@ private function getStepData(): string private function isCurrentArea(string $area, string $sa = 'main', bool $canBeEmpty = true): bool { - return $this->request()->has('area') && $this->request('area') === $area && + return $this->request()->has('area') && $this->request()->get('area') === $area && ( $canBeEmpty ? (Utils::$context['current_subaction'] === $sa || empty(Utils::$context['current_subaction'])) diff --git a/src/Sources/LightPortal/Plugins/MainMenu/MainMenu.php b/src/Sources/LightPortal/Plugins/MainMenu/MainMenu.php index 23bb9373c..3137cdf62 100644 --- a/src/Sources/LightPortal/Plugins/MainMenu/MainMenu.php +++ b/src/Sources/LightPortal/Plugins/MainMenu/MainMenu.php @@ -91,14 +91,14 @@ public function saveSettings(Event $e): void $portalLangs = $forumLangs = []; if ($this->request()->has('portal_item_langs')) { - foreach ($this->request('portal_item_langs') as $lang => $val) { + foreach ($this->request()->get('portal_item_langs') as $lang => $val) { if (! empty($val)) $portalLangs[$lang] = $val; } } if ($this->request()->has('forum_item_langs')) { - foreach ($this->request('forum_item_langs') as $lang => $val) { + foreach ($this->request()->get('forum_item_langs') as $lang => $val) { if (! empty($val)) { $forumLangs[$lang] = $val; } diff --git a/src/Sources/LightPortal/Plugins/PageList/PageList.php b/src/Sources/LightPortal/Plugins/PageList/PageList.php index 7350ff6a9..bf9489670 100644 --- a/src/Sources/LightPortal/Plugins/PageList/PageList.php +++ b/src/Sources/LightPortal/Plugins/PageList/PageList.php @@ -21,6 +21,8 @@ use Bugo\LightPortal\Enums\Permission; use Bugo\LightPortal\Enums\Status; use Bugo\LightPortal\Enums\Tab; +use Bugo\LightPortal\Lists\CategoryList; +use Bugo\LightPortal\Lists\TitleList; use Bugo\LightPortal\Plugins\Block; use Bugo\LightPortal\Plugins\Event; use Bugo\LightPortal\UI\Fields\CustomField; @@ -97,8 +99,8 @@ public function prepareBlockFields(Event $e): void public function getData(ParamWrapper $parameters): array { - $titles = app('title_list'); - $allCategories = app('category_list'); + $titles = app(TitleList::class); + $allCategories = app(CategoryList::class); $categories = empty($parameters['categories']) ? null : explode(',', (string) $parameters['categories']); $sort = Typed::string($parameters['sort'], default: 'page_id'); diff --git a/src/Sources/LightPortal/Plugins/Plugin.php b/src/Sources/LightPortal/Plugins/Plugin.php index 3d028c152..5afd16e07 100644 --- a/src/Sources/LightPortal/Plugins/Plugin.php +++ b/src/Sources/LightPortal/Plugins/Plugin.php @@ -17,6 +17,7 @@ use Bugo\Compat\ServerSideIncludes; use Bugo\Compat\Theme; use Bugo\Compat\Utils; +use Bugo\LightPortal\Repositories\PluginRepository; use Bugo\LightPortal\Utils\CacheTrait; use Bugo\LightPortal\Utils\HasTemplateAware; use Bugo\LightPortal\Utils\RequestTrait; @@ -86,7 +87,7 @@ public function addDefaultValues(array $values): void } } - app('plugin_repo')->addSettings($settings); + app(PluginRepository::class)->addSettings($settings); } function loadExternalResources(array $resources): void diff --git a/src/Sources/LightPortal/Plugins/PluginHandler.php b/src/Sources/LightPortal/Plugins/PluginHandler.php index b1f39e238..ddf5602f4 100644 --- a/src/Sources/LightPortal/Plugins/PluginHandler.php +++ b/src/Sources/LightPortal/Plugins/PluginHandler.php @@ -39,8 +39,8 @@ final class PluginHandler public function __construct(array $plugins = []) { - $this->registry = app('plugin_registry'); - $this->manager = app('event_manager'); + $this->registry = app(PluginRegistry::class); + $this->manager = app(EventManager::class); $this->assetHandler = new AssetHandler(); $this->configHandler = new ConfigHandler(); diff --git a/src/Sources/LightPortal/Plugins/PluginMaker/Generator.php b/src/Sources/LightPortal/Plugins/PluginMaker/Generator.php index 73f733838..50a1ed3d0 100644 --- a/src/Sources/LightPortal/Plugins/PluginMaker/Generator.php +++ b/src/Sources/LightPortal/Plugins/PluginMaker/Generator.php @@ -56,9 +56,9 @@ class Generator { - private PhpNamespace $namespace; + private readonly PhpNamespace $namespace; - private ClassType $class; + private readonly ClassType $class; public function __construct(private array $plugin) { diff --git a/src/Sources/LightPortal/Plugins/PluginMaker/Handler.php b/src/Sources/LightPortal/Plugins/PluginMaker/Handler.php index 8085f04fb..c356620ad 100644 --- a/src/Sources/LightPortal/Plugins/PluginMaker/Handler.php +++ b/src/Sources/LightPortal/Plugins/PluginMaker/Handler.php @@ -21,6 +21,7 @@ use Bugo\LightPortal\Areas\Traits\AreaTrait; use Bugo\LightPortal\Enums\PluginType; use Bugo\LightPortal\Enums\Tab; +use Bugo\LightPortal\Repositories\PluginRepository; use Bugo\LightPortal\UI\Fields\CheckboxField; use Bugo\LightPortal\UI\Fields\CustomField; use Bugo\LightPortal\UI\Fields\SelectField; @@ -338,7 +339,7 @@ private function setData(): void private function saveAuthorData(): void { - app('plugin_repo')->changeSettings('plugin_maker', [ + app(PluginRepository::class)->changeSettings('plugin_maker', [ 'author' => Utils::$context['lp_plugin']['author'], 'email' => Utils::$context['lp_plugin']['email'], 'site' => Utils::$context['lp_plugin']['site'], diff --git a/src/Sources/LightPortal/Plugins/PluginMaker/Validator.php b/src/Sources/LightPortal/Plugins/PluginMaker/Validator.php index 06c1e5c4f..6930ede34 100644 --- a/src/Sources/LightPortal/Plugins/PluginMaker/Validator.php +++ b/src/Sources/LightPortal/Plugins/PluginMaker/Validator.php @@ -17,6 +17,7 @@ use Bugo\Compat\Utils; use Bugo\LightPortal\Areas\Validators\AbstractValidator; use Bugo\LightPortal\Enums\VarType; +use Bugo\LightPortal\Lists\PluginList; use Bugo\LightPortal\Utils\RequestTrait; if (! defined('LP_NAME')) @@ -119,6 +120,6 @@ private function findErrors(array $data): void private function isUnique(string $name): bool { - return ! in_array($name, app('plugin_list')); + return ! in_array($name, app(PluginList::class)); } } diff --git a/src/Sources/LightPortal/Plugins/Polls/Polls.php b/src/Sources/LightPortal/Plugins/Polls/Polls.php index b379012fc..36dfac0ad 100644 --- a/src/Sources/LightPortal/Plugins/Polls/Polls.php +++ b/src/Sources/LightPortal/Plugins/Polls/Polls.php @@ -8,7 +8,7 @@ * @license https://spdx.org/licenses/GPL-3.0-or-later.html GPL-3.0-or-later * * @category plugin - * @version 08.01.25 + * @version 11.01.25 */ namespace Bugo\LightPortal\Plugins\Polls; @@ -66,76 +66,85 @@ public function prepareContent(Event $e): void { $poll = $this->getFromSSI('showPoll', Typed::int($e->args->parameters['selected_item']), 'array'); - if ($poll) { - if ($poll['allow_vote']) { - $form = Str::html('form', [ - 'action' => Config::$boardurl . '/SSI.php?ssi_function=pollVote', - 'method' => 'post', - 'accept-charset' => Utils::$context['character_set'], - ]); + if (! $poll) { + echo $this->txt['no_items']; + return; + } - $form->addHtml(Str::html('strong')->setText($poll['question']))->addHtml('
'); + if ($poll['allow_vote']) { + $form = Str::html('form', [ + 'action' => Config::$boardurl . '/SSI.php?ssi_function=pollVote', + 'method' => 'post', + 'accept-charset' => Utils::$context['character_set'], + ]); - if (! empty($poll['allowed_warning'])) { - $form->addHtml($poll['allowed_warning'] . '
'); - } + $form->addHtml(Str::html('strong')->setText($poll['question']))->addHtml('
'); - foreach ($poll['options'] as $option) { - $label = Str::html('label', ['for' => $option['id']]) - ->addHtml($option['vote_button'] . ' ' . $option['option']); - $form->addHtml($label)->addHtml('
'); - } + if (! empty($poll['allowed_warning'])) { + $form->addHtml($poll['allowed_warning'] . '
'); + } - $form->addHtml(Str::html('input', [ - 'type' => 'submit', - 'value' => Lang::$txt['poll_vote'], - 'class' => 'button', - ])); - $form->addHtml(Str::html('input', [ - 'type' => 'hidden', - 'name' => 'poll', - 'value' => $poll['id'], - ])); - $form->addHtml(Str::html('input', [ - 'type' => 'hidden', - 'name' => Utils::$context['session_var'], - 'value' => Utils::$context['session_id'], - ])); - - echo $form; - } else { - $div = Str::html('div'); - $div->addHtml(Str::html('strong')->addHtml(Str::html('a', [ - 'class' => 'bbc_link', - 'href' => Config::$scripturl . '?topic=' . $poll['topic'] . '.0', - ])->setText($poll['question']))); - - $dl = Str::html('dl', ['class' => 'stats']); - foreach ($poll['options'] as $option) { - $dt = Str::html('dt')->setText($option['option']); - $dd = Str::html('dd', ['class' => 'statsbar generic_bar righttext']); - - if ($poll['allow_view_results']) { - $bar = Str::html('div', [ - 'class' => 'bar' . (empty($option['percent']) ? ' empty' : ''), - 'style' => empty($option['percent']) ? '' : 'width: ' . $option['percent'] . '%', - ]); - $dd->addHtml($bar); - $dd->addHtml(Str::html('span')->setText($option['votes'] . ' (' . $option['percent'] . '%)')); - } - - $dl->addHtml($dt)->addHtml($dd); - } + foreach ($poll['options'] as $option) { + $label = Str::html('label', ['for' => $option['id']]) + ->addHtml($option['vote_button'] . ' ' . $option['option']); + + $form->addHtml($label)->addHtml('
'); + } + + $form->addHtml(Str::html('input', [ + 'type' => 'submit', + 'value' => Lang::$txt['poll_vote'], + 'class' => 'button', + ])); + $form->addHtml(Str::html('input', [ + 'type' => 'hidden', + 'name' => 'poll', + 'value' => $poll['id'], + ])); + $form->addHtml(Str::html('input', [ + 'type' => 'hidden', + 'name' => Utils::$context['session_var'], + 'value' => Utils::$context['session_id'], + ])); + + echo $form; + } else { + $div = Str::html('div'); + $div->addHtml(Str::html('strong')->addHtml(Str::html('a', [ + 'class' => 'bbc_link', + 'href' => Config::$scripturl . '?topic=' . $poll['topic'] . '.0', + ])->setText($poll['question']))); + + $dl = Str::html('dl', ['class' => 'stats']); + foreach ($poll['options'] as $option) { + $dt = Str::html('dt')->setText($option['option']); + $dd = Str::html('dd', ['class' => 'statsbar generic_bar righttext']); - $div->addHtml($dl); if ($poll['allow_view_results']) { - $div->addHtml(Str::html('strong')->setText(Lang::$txt['poll_total_voters'] . ': ' . $poll['total_votes'])); + $bar = Str::html('div', [ + 'class' => 'bar' . (empty($option['percent']) ? ' empty' : ''), + 'style' => empty($option['percent']) ? '' : 'width: ' . $option['percent'] . '%', + ]); + + $dd->addHtml($bar); + $dd->addHtml( + Str::html('span') + ->setText($option['votes'] . ' (' . $option['percent'] . '%)') + ); } - echo $div; + $dl->addHtml($dt)->addHtml($dd); } - } else { - echo $this->txt['no_items']; + + $div->addHtml($dl); + if ($poll['allow_view_results']) { + $div->addHtml( + Str::html('strong') + ->setText(Lang::$txt['poll_total_voters'] . ': ' . $poll['total_votes']) + ); + } + + echo $div; } } @@ -154,8 +163,9 @@ private function getAll(): array ); $polls = []; - while ($row = Db::$db->fetch_assoc($result)) + while ($row = Db::$db->fetch_assoc($result)) { $polls[$row['id_topic']] = $row['question']; + } Db::$db->free_result($result); diff --git a/src/Sources/LightPortal/Plugins/RandomPages/RandomPages.php b/src/Sources/LightPortal/Plugins/RandomPages/RandomPages.php index 9f59def2f..e0c796ecc 100644 --- a/src/Sources/LightPortal/Plugins/RandomPages/RandomPages.php +++ b/src/Sources/LightPortal/Plugins/RandomPages/RandomPages.php @@ -21,6 +21,7 @@ use Bugo\LightPortal\Enums\Permission; use Bugo\LightPortal\Enums\Status; use Bugo\LightPortal\Enums\Tab; +use Bugo\LightPortal\Lists\TitleList; use Bugo\LightPortal\Plugins\Block; use Bugo\LightPortal\Plugins\Event; use Bugo\LightPortal\UI\Fields\CheckboxField; @@ -96,7 +97,7 @@ public function getData(ParamWrapper $parameters): array if (empty($pagesCount)) return []; - $titles = app('title_list'); + $titles = app(TitleList::class); if (Config::$db_type === 'postgresql') { $result = Db::$db->query('', ' diff --git a/src/Sources/LightPortal/Plugins/Search/Search.php b/src/Sources/LightPortal/Plugins/Search/Search.php index 7ab88ba68..0adc367b5 100644 --- a/src/Sources/LightPortal/Plugins/Search/Search.php +++ b/src/Sources/LightPortal/Plugins/Search/Search.php @@ -91,7 +91,7 @@ private function getResults(): array if ($this->request()->isNotEmpty($this->name) === false) return []; - $query = Utils::$smcFunc['htmltrim'](Utils::htmlspecialchars($this->request($this->name))); + $query = Utils::$smcFunc['htmltrim'](Utils::htmlspecialchars($this->request()->get($this->name))); if (empty($query)) return []; diff --git a/src/Sources/LightPortal/Plugins/SimpleChat/SimpleChat.php b/src/Sources/LightPortal/Plugins/SimpleChat/SimpleChat.php index df36feac3..cadb17198 100644 --- a/src/Sources/LightPortal/Plugins/SimpleChat/SimpleChat.php +++ b/src/Sources/LightPortal/Plugins/SimpleChat/SimpleChat.php @@ -69,11 +69,11 @@ public function actions(): void if ($this->request()->isNot('portal')) return; - if ($this->request()->has('chat') && $this->request('chat') === 'post') { + if ($this->request()->has('chat') && $this->request()->get('chat') === 'post') { $this->chat->addMessage(); } - if ($this->request()->has('chat') && $this->request('chat') === 'update') { + if ($this->request()->has('chat') && $this->request()->get('chat') === 'update') { $this->chat->deleteMessage(); } } diff --git a/src/Sources/LightPortal/Plugins/SiteList/SiteList.php b/src/Sources/LightPortal/Plugins/SiteList/SiteList.php index b710f654f..5b5e0e5c3 100644 --- a/src/Sources/LightPortal/Plugins/SiteList/SiteList.php +++ b/src/Sources/LightPortal/Plugins/SiteList/SiteList.php @@ -57,11 +57,11 @@ public function saveSettings(Event $e): void $sites = []; if ($this->request()->has('url')) { - foreach ($this->request('url') as $key => $value) { + foreach ($this->request()->get('url') as $key => $value) { $sites[VarType::URL->filter($value)] = [ - VarType::URL->filter($this->request('image')[$key]), - $this->request('title')[$key], - $this->request('desc')[$key], + VarType::URL->filter($this->request()->get('image')[$key]), + $this->request()->get('title')[$key], + $this->request()->get('desc')[$key], ]; } } diff --git a/src/Sources/LightPortal/Plugins/TagList/TagList.php b/src/Sources/LightPortal/Plugins/TagList/TagList.php index 778b85736..90e73a177 100644 --- a/src/Sources/LightPortal/Plugins/TagList/TagList.php +++ b/src/Sources/LightPortal/Plugins/TagList/TagList.php @@ -17,6 +17,7 @@ use Bugo\Compat\Db; use Bugo\Compat\Lang; use Bugo\Compat\User; +use Bugo\LightPortal\Actions\Tag; use Bugo\LightPortal\Enums\Tab; use Bugo\LightPortal\Plugins\Block; use Bugo\LightPortal\Plugins\Event; @@ -123,7 +124,7 @@ public function prepareContent(Event $e): void if ($source) { $tagList = $this->cache($this->name . '_addon_b' . $e->args->id . '_u' . User::$info['id']) ->setLifeTime($e->args->cacheTime) - ->setFallback(fn() => app('tag')->getAll(0, 0, $sorting === 'name' ? 'title' : 'frequency DESC')); + ->setFallback(fn() => app(Tag::class)->getAll(0, 0, $sorting === 'name' ? 'title' : 'frequency DESC')); } else { $tagList = $this->cache($this->name . '_addon_b' . $e->args->id . '_u' . User::$info['id']) ->setLifeTime($e->args->cacheTime) diff --git a/src/Sources/LightPortal/Plugins/TinyPortalMigration/TinyPortalMigration.php b/src/Sources/LightPortal/Plugins/TinyPortalMigration/TinyPortalMigration.php index 05bc07a03..9a4cfd8cf 100644 --- a/src/Sources/LightPortal/Plugins/TinyPortalMigration/TinyPortalMigration.php +++ b/src/Sources/LightPortal/Plugins/TinyPortalMigration/TinyPortalMigration.php @@ -66,7 +66,7 @@ public function updateCategoryAreas(Event $e): void public function importPages(Event $e): void { - if ($this->request('sa') !== self::AREA) + if ($this->request()->get('sa') !== self::AREA) return; $items = &$e->args->items; diff --git a/src/Sources/LightPortal/Plugins/TinySlider/style.css b/src/Sources/LightPortal/Plugins/TinySlider/style.css index 4be7b96e1..0354ac946 100644 --- a/src/Sources/LightPortal/Plugins/TinySlider/style.css +++ b/src/Sources/LightPortal/Plugins/TinySlider/style.css @@ -85,9 +85,7 @@ .block_tiny_slider .customize-tools .thumbnails { margin-bottom: 10px; } -} -@media (max-width: 640px) { .block_tiny_slider .customize-tools .controls li { display: inline-block; position: relative; diff --git a/src/Sources/LightPortal/Plugins/TopPages/TopPages.php b/src/Sources/LightPortal/Plugins/TopPages/TopPages.php index cd682f677..255fddda8 100644 --- a/src/Sources/LightPortal/Plugins/TopPages/TopPages.php +++ b/src/Sources/LightPortal/Plugins/TopPages/TopPages.php @@ -17,6 +17,7 @@ use Bugo\Compat\Lang; use Bugo\Compat\User; use Bugo\LightPortal\Enums\Permission; +use Bugo\LightPortal\Lists\TitleList; use Bugo\LightPortal\Plugins\Block; use Bugo\LightPortal\Plugins\Event; use Bugo\LightPortal\UI\Fields\CheckboxField; @@ -75,7 +76,7 @@ public function prepareBlockFields(Event $e): void public function getData(ParamWrapper $parameters): array { - $titles = app('title_list'); + $titles = app(TitleList::class); $type = Typed::string($parameters['popularity_type'], default: 'comments'); $numPages = Typed::int($parameters['num_pages'], default: 10); diff --git a/src/Sources/LightPortal/Renderers/AbstractRenderer.php b/src/Sources/LightPortal/Renderers/AbstractRenderer.php index ea52ca4ca..a85ebf5b3 100644 --- a/src/Sources/LightPortal/Renderers/AbstractRenderer.php +++ b/src/Sources/LightPortal/Renderers/AbstractRenderer.php @@ -15,6 +15,7 @@ use Bugo\Compat\Lang; use Bugo\Compat\Theme; use Bugo\LightPortal\Enums\PortalHook; +use Bugo\LightPortal\EventManagerFactory; use Bugo\LightPortal\Plugins\Event; use function array_combine; @@ -50,7 +51,7 @@ public function getLayouts(): array $extensions = [static::DEFAULT_EXTENSION]; // You can add custom extensions for layouts - app('events')->dispatch( + app(EventManagerFactory::class)()->dispatch( PortalHook::layoutExtensions, new Event(new class ($extensions) { public function __construct(public array &$extensions) {} diff --git a/src/Sources/LightPortal/Repositories/BlockRepository.php b/src/Sources/LightPortal/Repositories/BlockRepository.php index bcba2786f..c4057e318 100644 --- a/src/Sources/LightPortal/Repositories/BlockRepository.php +++ b/src/Sources/LightPortal/Repositories/BlockRepository.php @@ -23,6 +23,8 @@ use Bugo\LightPortal\Args\ItemsArgs; use Bugo\LightPortal\Enums\PortalHook; use Bugo\LightPortal\Enums\Status; +use Bugo\LightPortal\EventManagerFactory; +use Bugo\LightPortal\Lists\PluginList; use Bugo\LightPortal\Plugins\Event; use Bugo\LightPortal\Utils\CacheTrait; use Bugo\LightPortal\Utils\Icon; @@ -188,7 +190,7 @@ public function remove(array $items): void if ($items === []) return; - app('events')->dispatch(PortalHook::onBlockRemoving, new Event(new ItemsArgs($items))); + app(EventManagerFactory::class)()->dispatch(PortalHook::onBlockRemoving, new Event(new ItemsArgs($items))); Db::$db->query('', ' DELETE FROM {db_prefix}lp_blocks @@ -349,7 +351,7 @@ private function addData(): int return 0; } - app('events')->dispatch(PortalHook::onBlockSaving, new Event(new ItemArgs($item))); + app(EventManagerFactory::class)()->dispatch(PortalHook::onBlockSaving, new Event(new ItemArgs($item))); $this->saveTitles($item); $this->saveOptions($item); @@ -383,7 +385,7 @@ private function updateData(int $item): void ] ); - app('events')->dispatch(PortalHook::onBlockSaving, new Event(new ItemArgs($item))); + app(EventManagerFactory::class)()->dispatch(PortalHook::onBlockSaving, new Event(new ItemArgs($item))); $this->saveTitles($item, 'replace'); $this->saveOptions($item, 'replace'); @@ -403,7 +405,7 @@ private function prepareMissingBlockTypes(string $type): void $plugin = Str::getCamelName($type); - $message = in_array($plugin, app('plugin_list')) + $message = in_array($plugin, app(PluginList::class)) ? Lang::$txt['lp_addon_not_activated'] : Lang::$txt['lp_addon_not_installed']; diff --git a/src/Sources/LightPortal/Repositories/PageRepository.php b/src/Sources/LightPortal/Repositories/PageRepository.php index 8ffda27ea..d8cfc57fc 100644 --- a/src/Sources/LightPortal/Repositories/PageRepository.php +++ b/src/Sources/LightPortal/Repositories/PageRepository.php @@ -26,6 +26,9 @@ use Bugo\LightPortal\Enums\Permission; use Bugo\LightPortal\Enums\PortalHook; use Bugo\LightPortal\Enums\Status; +use Bugo\LightPortal\EventManagerFactory; +use Bugo\LightPortal\Lists\CategoryList; +use Bugo\LightPortal\Lists\TitleList; use Bugo\LightPortal\Plugins\Event; use Bugo\LightPortal\Utils\CacheTrait; use Bugo\LightPortal\Utils\Content; @@ -64,13 +67,6 @@ final class PageRepository extends AbstractRepository protected string $entity = 'page'; - private CommentRepository $commentRepository; - - public function __construct() - { - $this->commentRepository = app('comment_repo'); - } - public function getAll( int $start, int $limit, @@ -290,7 +286,7 @@ public function removePermanently(array $items): void if ($items === []) return; - app('events')->dispatch(PortalHook::onPageRemoving, new Event(new ItemsArgs($items))); + app(EventManagerFactory::class)()->dispatch(PortalHook::onPageRemoving, new Event(new ItemsArgs($items))); Db::$db->query('', ' DELETE FROM {db_prefix}lp_pages @@ -334,7 +330,8 @@ public function removePermanently(array $items): void ] ); - $this->commentRepository->removeFromResult($result); + $commentRepository = new CommentRepository(); + $commentRepository->removeFromResult($result); $this->session()->free('lp'); } @@ -502,7 +499,7 @@ public function updateNumViews(int $item): void public function getMenuItems(): array { if (($pages = $this->cache()->get('menu_pages')) === null) { - $titles = app('title_list'); + $titles = app(TitleList::class); $result = Db::$db->query('', ' SELECT p.page_id, p.slug, p.permissions, pp2.value AS icon @@ -563,12 +560,12 @@ public function prepareData(?array &$data): void } if (! empty($data['category_id'])) { - $data['category'] = app('category_list')[$data['category_id']]['title']; + $data['category'] = app(CategoryList::class)[$data['category_id']]['title']; } $data['tags'] = $this->getTags($data['id']); - app('events')->dispatch( + app(EventManagerFactory::class)()->dispatch( PortalHook::preparePageData, new Event(new class ($data, $isAuthor) { public function __construct(public array &$data, public readonly bool $isAuthor) {} @@ -615,7 +612,7 @@ private function addData(): int return 0; } - app('events')->dispatch(PortalHook::onPageSaving, new Event(new ItemArgs($item))); + app(EventManagerFactory::class)()->dispatch(PortalHook::onPageSaving, new Event(new ItemArgs($item))); $this->saveTitles($item); $this->saveTags($item); @@ -668,7 +665,7 @@ private function updateData(int $item): void ] ); - app('events')->dispatch(PortalHook::onPageSaving, new Event(new ItemArgs($item))); + app(EventManagerFactory::class)()->dispatch(PortalHook::onPageSaving, new Event(new ItemArgs($item))); $this->saveTitles($item, 'replace'); $this->saveTags($item, 'replace'); diff --git a/src/Sources/LightPortal/ServiceProvider.php b/src/Sources/LightPortal/ServiceProvider.php index d1be8fcd1..57705b5b1 100644 --- a/src/Sources/LightPortal/ServiceProvider.php +++ b/src/Sources/LightPortal/ServiceProvider.php @@ -15,10 +15,27 @@ use Bugo\LightPortal\Actions\Block; use Bugo\LightPortal\Actions\BoardIndex; use Bugo\LightPortal\Actions\CardList; +use Bugo\LightPortal\Actions\CardListInterface; use Bugo\LightPortal\Actions\Category; +use Bugo\LightPortal\Actions\Comment; use Bugo\LightPortal\Actions\FrontPage; use Bugo\LightPortal\Actions\Page; use Bugo\LightPortal\Actions\Tag; +use Bugo\LightPortal\Areas\BlockArea; +use Bugo\LightPortal\Areas\CategoryArea; +use Bugo\LightPortal\Areas\Exports\BlockExport; +use Bugo\LightPortal\Areas\Exports\CategoryExport; +use Bugo\LightPortal\Areas\Exports\PageExport; +use Bugo\LightPortal\Areas\Exports\PluginExport; +use Bugo\LightPortal\Areas\Exports\TagExport; +use Bugo\LightPortal\Areas\Imports\BlockImport; +use Bugo\LightPortal\Areas\Imports\CategoryImport; +use Bugo\LightPortal\Areas\Imports\PageImport; +use Bugo\LightPortal\Areas\Imports\PluginImport; +use Bugo\LightPortal\Areas\Imports\TagImport; +use Bugo\LightPortal\Areas\PageArea; +use Bugo\LightPortal\Areas\PluginArea; +use Bugo\LightPortal\Areas\TagArea; use Bugo\LightPortal\Compilers\CompilerInterface; use Bugo\LightPortal\Lists\CategoryList; use Bugo\LightPortal\Lists\IconList; @@ -43,7 +60,6 @@ use Bugo\LightPortal\Utils\Session; use Bugo\LightPortal\Utils\Weaver; use League\Container\ServiceProvider\AbstractServiceProvider; -use Nette\Utils\Html; use function in_array; @@ -52,40 +68,7 @@ class ServiceProvider extends AbstractServiceProvider public function provides(string $id): bool { $services = [ - 'event_manager', - 'events', - 'config', - 'compiler', - 'renderer', - 'plugin_handler', - 'plugin_registry', - 'category_list', - 'page_list', - 'tag_list', - 'title_list', - 'icon_list', - 'plugin_list', - 'active_blocks', - 'cache', - 'request', - 'post', - 'file', - 'session', - 'block_repo', - 'category_repo', - 'comment_repo', - 'page_repo', - 'plugin_repo', - 'tag_repo', - 'board_index', - 'front_page', - 'block', - 'page', - 'category', - 'tag', - 'card_list', - 'html', - 'weaver', + Request::class, ]; return in_array($id, $services); @@ -93,45 +76,60 @@ public function provides(string $id): bool public function register(): void { - $this->getContainer()->add('event_manager', EventManager::class); - $this->getContainer()->add('events', EventManagerFactory::class); $this->getContainer()->add('config', fn() => (new ConfigProvider())->get()); - $this->getContainer()->add('compiler', app('config')[CompilerInterface::class]); - $this->getContainer()->add('renderer', app('config')[RendererInterface::class]); - $this->getContainer()->add('plugin_handler', PluginHandler::class); - $this->getContainer()->add('plugin_registry', PluginRegistry::class); + $this->getContainer()->add(CompilerInterface::class, fn() => $this->getContainer()->get('config')[CompilerInterface::class]); + $this->getContainer()->add(RendererInterface::class, fn() => $this->getContainer()->get('config')[RendererInterface::class]); - $this->getContainer()->add('category_list', fn() => (new CategoryList())()); - $this->getContainer()->add('page_list', fn() => (new PageList())()); - $this->getContainer()->add('tag_list', fn() => (new TagList())()); - $this->getContainer()->add('title_list', fn() => (new TitleList())()); - $this->getContainer()->add('icon_list', fn() => (new IconList())()); - $this->getContainer()->add('plugin_list', fn() => (new PluginList())()); + $this->getContainer()->add(EventManager::class); + $this->getContainer()->add(EventManagerFactory::class); + $this->getContainer()->add(PluginHandler::class, fn() => fn(array $plugins = []) => new PluginHandler($plugins)); + $this->getContainer()->add(PluginRegistry::class); - $this->getContainer()->add('active_blocks', fn() => app('block_repo')->getActive()); + $this->getContainer()->add(CategoryList::class, fn() => (new CategoryList())()); + $this->getContainer()->add(PageList::class, fn() => (new PageList($this->getContainer()->get(PageRepository::class)))()); + $this->getContainer()->add(TagList::class, fn() => (new TagList())()); + $this->getContainer()->add(TitleList::class, fn() => (new TitleList())()); + $this->getContainer()->add(IconList::class, fn() => (new IconList())()); + $this->getContainer()->add(PluginList::class, fn() => (new PluginList())()); - $this->getContainer()->add('cache', Cache::class); - $this->getContainer()->add('request', Request::class); - $this->getContainer()->add('post', Post::class); - $this->getContainer()->add('file', File::class); - $this->getContainer()->add('session', Session::class); + $this->getContainer()->add(Request::class); + $this->getContainer()->add(Post::class); + $this->getContainer()->add(File::class); + $this->getContainer()->add(Cache::class, fn() => fn(?string $key = null) => new Cache($key)); + $this->getContainer()->add(Session::class, fn() => fn(?string $key = null) => new Session($key)); - $this->getContainer()->add('block_repo', BlockRepository::class); - $this->getContainer()->add('category_repo', CategoryRepository::class); - $this->getContainer()->add('comment_repo', CommentRepository::class); - $this->getContainer()->add('page_repo', PageRepository::class); - $this->getContainer()->add('plugin_repo', PluginRepository::class); - $this->getContainer()->add('tag_repo', TagRepository::class); + $this->getContainer()->add(BlockRepository::class); + $this->getContainer()->add(CategoryRepository::class); + $this->getContainer()->add(CommentRepository::class); + $this->getContainer()->add(PageRepository::class); + $this->getContainer()->add(PluginRepository::class); + $this->getContainer()->add(TagRepository::class); - $this->getContainer()->add('board_index', BoardIndex::class); - $this->getContainer()->add('front_page', FrontPage::class); - $this->getContainer()->add('block', Block::class); - $this->getContainer()->add('page', Page::class); - $this->getContainer()->add('category', Category::class); - $this->getContainer()->add('tag', Tag::class); - $this->getContainer()->add('card_list', CardList::class); + $this->getContainer()->add(BlockArea::class)->addArgument(BlockRepository::class); + $this->getContainer()->add(BlockExport::class)->addArgument(BlockRepository::class); + $this->getContainer()->add(BlockImport::class); + $this->getContainer()->add(PageArea::class)->addArgument(PageRepository::class); + $this->getContainer()->add(PageExport::class)->addArgument(PageRepository::class); + $this->getContainer()->add(PageImport::class); + $this->getContainer()->add(CategoryArea::class)->addArgument(CategoryRepository::class); + $this->getContainer()->add(CategoryExport::class)->addArgument(CategoryRepository::class); + $this->getContainer()->add(CategoryImport::class); + $this->getContainer()->add(TagArea::class)->addArgument(TagRepository::class); + $this->getContainer()->add(TagExport::class)->addArgument(TagRepository::class); + $this->getContainer()->add(TagImport::class); + $this->getContainer()->add(PluginArea::class)->addArgument(PluginRepository::class); + $this->getContainer()->add(PluginExport::class); + $this->getContainer()->add(PluginImport::class); - $this->getContainer()->add('html', Html::class)->setShared(false); - $this->getContainer()->add('weaver', Weaver::class)->setShared(false); + $this->getContainer()->add(BoardIndex::class); + $this->getContainer()->add(FrontPage::class)->addArgument(RendererInterface::class); + $this->getContainer()->add(Block::class); + $this->getContainer()->add(Page::class)->addArgument(PageRepository::class); + $this->getContainer()->add(Comment::class)->addArgument(CommentRepository::class); + $this->getContainer()->add(Category::class)->addArgument(CardListInterface::class); + $this->getContainer()->add(Tag::class)->addArgument(CardListInterface::class); + $this->getContainer()->add(CardListInterface::class, CardList::class); + + $this->getContainer()->add(Weaver::class, Weaver::class)->setShared(false); } } diff --git a/src/Sources/LightPortal/Tasks/Maintainer.php b/src/Sources/LightPortal/Tasks/Maintainer.php index f9131ef47..109342739 100644 --- a/src/Sources/LightPortal/Tasks/Maintainer.php +++ b/src/Sources/LightPortal/Tasks/Maintainer.php @@ -15,6 +15,8 @@ use Bugo\Compat\Tasks\BackgroundTask; use Bugo\Compat\Db; +use Bugo\LightPortal\Repositories\CommentRepository; + use function array_keys; use function array_map; use function ini_set; @@ -74,7 +76,7 @@ private function removeRedundantValues(): void AND parent_id NOT IN (SELECT * FROM (SELECT id FROM {db_prefix}lp_comments) com)', ); - $commentRepository = app('comment_repo'); + $commentRepository = app(CommentRepository::class); $commentRepository->removeFromResult($result); } @@ -105,9 +107,7 @@ private function updateNumComments(): void Db::$db->query('', /** @lang text */ ' UPDATE {db_prefix}lp_pages - SET num_comments = CASE ' . $line . ' - ELSE num_comments - END + SET num_comments = CASE ' . $line . ' ELSE num_comments END WHERE page_id IN ({array_int:pages})', [ 'pages' => array_keys($pages), @@ -142,9 +142,7 @@ private function updateLastCommentIds(): void Db::$db->query('', /** @lang text */ ' UPDATE {db_prefix}lp_pages - SET last_comment_id = CASE ' . $line . ' - ELSE last_comment_id - END + SET last_comment_id = CASE ' . $line . ' ELSE last_comment_id END WHERE page_id IN ({array_int:pages})', [ 'pages' => array_keys($pages), diff --git a/src/Sources/LightPortal/UI/Partials/CategorySelect.php b/src/Sources/LightPortal/UI/Partials/CategorySelect.php index af23f4e55..75233b268 100644 --- a/src/Sources/LightPortal/UI/Partials/CategorySelect.php +++ b/src/Sources/LightPortal/UI/Partials/CategorySelect.php @@ -15,6 +15,7 @@ use Bugo\Compat\Config; use Bugo\Compat\Lang; use Bugo\Compat\Utils; +use Bugo\LightPortal\Lists\CategoryList; use Bugo\LightPortal\Utils\Icon; use function count; @@ -32,7 +33,7 @@ public function __invoke(): string $params['multiple'] ??= true; $params['wide'] ??= true; $params['hint'] ??= Lang::$txt['lp_frontpage_categories_select']; - $params['data'] ??= app('category_list'); + $params['data'] ??= app(CategoryList::class); $params['value'] ??= Config::$modSettings['lp_frontpage_categories'] ?? ''; $data = []; diff --git a/src/Sources/LightPortal/UI/Partials/PageSelect.php b/src/Sources/LightPortal/UI/Partials/PageSelect.php index e65d5871d..db76a0eaf 100644 --- a/src/Sources/LightPortal/UI/Partials/PageSelect.php +++ b/src/Sources/LightPortal/UI/Partials/PageSelect.php @@ -16,6 +16,8 @@ use Bugo\Compat\Lang; use Bugo\Compat\Utils; +use Bugo\LightPortal\Lists\PageList; + use function func_get_args; use function json_encode; @@ -28,7 +30,7 @@ public function __invoke(): string $params['id'] ??= 'lp_frontpage_pages'; $params['value'] ??= Config::$modSettings['lp_frontpage_pages'] ?? ''; - $params['data'] ??= app('page_list'); + $params['data'] ??= app(PageList::class); $data = []; foreach ($params['data'] as $id => $page) { diff --git a/src/Sources/LightPortal/UI/Partials/PageSlugSelect.php b/src/Sources/LightPortal/UI/Partials/PageSlugSelect.php index 921a5872c..f2c27ae11 100644 --- a/src/Sources/LightPortal/UI/Partials/PageSlugSelect.php +++ b/src/Sources/LightPortal/UI/Partials/PageSlugSelect.php @@ -16,6 +16,8 @@ use Bugo\Compat\Lang; use Bugo\Compat\Utils; +use Bugo\LightPortal\Lists\PageList; + use function func_get_args; use function json_encode; @@ -28,7 +30,7 @@ public function __invoke(): string $params['id'] ??= 'lp_frontpage_chosen_page'; $params['value'] ??= Config::$modSettings['lp_frontpage_chosen_page'] ?? ''; - $params['data'] ??= app('page_list'); + $params['data'] ??= app(PageList::class); $data = []; foreach ($params['data'] as $page) { diff --git a/src/Sources/LightPortal/UI/Partials/TagSelect.php b/src/Sources/LightPortal/UI/Partials/TagSelect.php index fba4b1d50..582d9ee00 100644 --- a/src/Sources/LightPortal/UI/Partials/TagSelect.php +++ b/src/Sources/LightPortal/UI/Partials/TagSelect.php @@ -14,6 +14,7 @@ use Bugo\Compat\Lang; use Bugo\Compat\Utils; +use Bugo\LightPortal\Lists\TagList; use Bugo\LightPortal\Utils\Icon; use Bugo\LightPortal\Utils\Setting; @@ -25,7 +26,7 @@ final class TagSelect extends AbstractPartial { public function __invoke(): string { - Utils::$context['lp_tags'] = app('tag_list'); + Utils::$context['lp_tags'] = app(TagList::class); $data = $values = []; foreach (Utils::$context['lp_tags'] as $id => $tag) { diff --git a/src/Sources/LightPortal/UI/Tables/PageButtonsRow.php b/src/Sources/LightPortal/UI/Tables/PageButtonsRow.php index 95eb7b9e5..eda45eebe 100644 --- a/src/Sources/LightPortal/UI/Tables/PageButtonsRow.php +++ b/src/Sources/LightPortal/UI/Tables/PageButtonsRow.php @@ -26,8 +26,8 @@ public static function make(string $value = '', ?string $class = null): static return parent::make($value ?: Str::html('select', ['name' => 'page_actions']) ->addHtml( Str::html('option', [ - 'value' => (new Request())->has('deleted') ? 'delete_forever' : 'delete' - ])->setText(Lang::$txt[(new Request())->has('deleted') ? 'lp_action_remove_permanently' : 'remove']) + 'value' => app(Request::class)->has('deleted') ? 'delete_forever' : 'delete' + ])->setText(Lang::$txt[app(Request::class)->has('deleted') ? 'lp_action_remove_permanently' : 'remove']) ) ->addHtml( Utils::$context['allow_light_portal_approve_pages'] diff --git a/src/Sources/LightPortal/UI/Tables/PageContextMenuColumn.php b/src/Sources/LightPortal/UI/Tables/PageContextMenuColumn.php index bbec06098..f2eee9d5f 100644 --- a/src/Sources/LightPortal/UI/Tables/PageContextMenuColumn.php +++ b/src/Sources/LightPortal/UI/Tables/PageContextMenuColumn.php @@ -28,7 +28,7 @@ public static function make(string $name = 'actions', string $title = ''): stati ' . IconButton::make('ellipsis', ['x-on:click.prevent' => 'showContextMenu = true'], 'button floatnone') . '
    ' . ( - (new Request())->has('deleted') ? ( + app(Request::class)->has('deleted') ? ( Str::html('li')->addHtml( LinkButton::make(Lang::$txt['restore_message'], ['x-on:click.prevent' => 'showContextMenu = false; entity.restore($root)']) ) . diff --git a/src/Sources/LightPortal/UI/Tables/PageTypeSelectRow.php b/src/Sources/LightPortal/UI/Tables/PageTypeSelectRow.php index eaa9a3bba..0b492ae83 100644 --- a/src/Sources/LightPortal/UI/Tables/PageTypeSelectRow.php +++ b/src/Sources/LightPortal/UI/Tables/PageTypeSelectRow.php @@ -30,7 +30,7 @@ public static function make(string $value = '', ?string $class = null): static $types .= Str::html('option', [ 'value' => $type, - 'selected' => (new Request())->has('type') && (new Request())->get('type') === $type, + 'selected' => app(Request::class)->has('type') && app(Request::class)->get('type') === $type, ])->setText($text); } diff --git a/src/Sources/LightPortal/Utils/Cache.php b/src/Sources/LightPortal/Utils/Cache.php index f762bb296..5d52c29cd 100644 --- a/src/Sources/LightPortal/Utils/Cache.php +++ b/src/Sources/LightPortal/Utils/Cache.php @@ -43,7 +43,7 @@ public function setFallback(callable $callback): mixed } if (($cachedValue = $this->get($this->key, $this->lifeTime)) === null) { - $cachedValue = app('weaver')($callback); + $cachedValue = app(Weaver::class)($callback); $this->put($this->key, $cachedValue, $this->lifeTime); } diff --git a/src/Sources/LightPortal/Utils/CacheTrait.php b/src/Sources/LightPortal/Utils/CacheTrait.php index dd9d08d98..865418440 100644 --- a/src/Sources/LightPortal/Utils/CacheTrait.php +++ b/src/Sources/LightPortal/Utils/CacheTrait.php @@ -16,6 +16,6 @@ trait CacheTrait { public function cache(?string $key = null): Cache { - return new Cache($key); + return app(Cache::class)($key); } } diff --git a/src/Sources/LightPortal/Utils/Content.php b/src/Sources/LightPortal/Utils/Content.php index 805a1ea7f..a8c4ec36a 100644 --- a/src/Sources/LightPortal/Utils/Content.php +++ b/src/Sources/LightPortal/Utils/Content.php @@ -18,6 +18,7 @@ use Bugo\Compat\Utils; use Bugo\LightPortal\Enums\ContentType; use Bugo\LightPortal\Enums\PortalHook; +use Bugo\LightPortal\EventManagerFactory; use Bugo\LightPortal\Plugins\Event; use ParseError; @@ -46,7 +47,7 @@ public static function prepare( $parameters = new ParamWrapper($parameters); - app('events')->dispatch( + app(EventManagerFactory::class)()->dispatch( PortalHook::prepareContent, new Event(new class ($type, $block_id, $cache_time, $parameters) { public function __construct( @@ -95,7 +96,7 @@ public static function parse(string $content, string $type = 'bbc'): string return ob_get_clean(); } - app('events')->dispatch( + app(EventManagerFactory::class)()->dispatch( PortalHook::parseContent, new Event(new class ($content, $type) { public function __construct(public string &$content, public readonly string $type) {} diff --git a/src/Sources/LightPortal/Utils/Icon.php b/src/Sources/LightPortal/Utils/Icon.php index 4eaeb58ce..0f351b39a 100644 --- a/src/Sources/LightPortal/Utils/Icon.php +++ b/src/Sources/LightPortal/Utils/Icon.php @@ -14,6 +14,8 @@ use Bugo\FontAwesome\IconBuilder; use Bugo\LightPortal\Enums\PortalHook; +use Bugo\LightPortal\EventManagerFactory; +use Bugo\LightPortal\Lists\IconList; use Bugo\LightPortal\Plugins\Event; use function str_replace; @@ -41,7 +43,7 @@ public static function parse(?string $icon = ''): string $template = (new IconBuilder($icon, ['aria-hidden' => true]))->html() . ' '; - app('events')->dispatch( + app(EventManagerFactory::class)()->dispatch( PortalHook::prepareIconTemplate, new Event(new class ($template, $icon) { public function __construct(public string &$template, public readonly string $icon) {} @@ -53,6 +55,6 @@ public function __construct(public string &$template, public readonly string $ic public static function all(): array { - return app('icon_list'); + return app(IconList::class); } } diff --git a/src/Sources/LightPortal/Utils/RequestTrait.php b/src/Sources/LightPortal/Utils/RequestTrait.php index 91e6e182e..3b79f362b 100644 --- a/src/Sources/LightPortal/Utils/RequestTrait.php +++ b/src/Sources/LightPortal/Utils/RequestTrait.php @@ -14,18 +14,18 @@ trait RequestTrait { - public function request(?string $key = null, mixed $default = null): mixed + public function request(): Request { - return $key ? (app('request')->get($key) ?? $default) : app('request'); + return app(Request::class); } - public function post(?string $key = null, mixed $default = null): mixed + public function post(): Post { - return $key ? (app('post')->get($key) ?? $default) : app('post'); + return app(Post::class); } - public function files(?string $key = null): mixed + public function files(): File { - return $key ? app('file')->get($key) : app('file'); + return app(File::class); } } diff --git a/src/Sources/LightPortal/Utils/SessionTrait.php b/src/Sources/LightPortal/Utils/SessionTrait.php index a6854ea28..45c04f853 100644 --- a/src/Sources/LightPortal/Utils/SessionTrait.php +++ b/src/Sources/LightPortal/Utils/SessionTrait.php @@ -16,6 +16,6 @@ trait SessionTrait { public function session(?string $key = null): Session { - return new Session($key); + return app(Session::class)($key); } } diff --git a/src/Sources/LightPortal/Utils/Setting.php b/src/Sources/LightPortal/Utils/Setting.php index 16508fd43..57ad083f1 100644 --- a/src/Sources/LightPortal/Utils/Setting.php +++ b/src/Sources/LightPortal/Utils/Setting.php @@ -36,10 +36,10 @@ public static function get(string $key, string $type = 'string', $default = null return match ($type) { 'bool' => filter_var($value, FILTER_VALIDATE_BOOLEAN), - 'int' => (int) $value, - 'float' => (float) $value, + 'int' => filter_var($value, FILTER_VALIDATE_INT), + 'float' => filter_var($value, FILTER_VALIDATE_FLOAT), 'array' => self::transformArray($value, $from), - default => (string) $value, + default => filter_var($value), }; } @@ -133,7 +133,7 @@ public static function hideBlocksInACP(): bool { $hideBlocks = self::get('lp_hide_blocks_in_acp', 'bool', false); - return $hideBlocks && (new Request())->is('admin'); + return $hideBlocks && app(Request::class)->is('admin'); } public static function getDisabledActions(): array diff --git a/src/Themes/default/LightPortal/ViewPage.template.php b/src/Themes/default/LightPortal/ViewPage.template.php index da794e377..15b333894 100644 --- a/src/Themes/default/LightPortal/ViewPage.template.php +++ b/src/Themes/default/LightPortal/ViewPage.template.php @@ -3,6 +3,7 @@ use Bugo\Compat\{Config, Lang, Theme, Utils}; use Bugo\LightPortal\Enums\PortalHook; use Bugo\LightPortal\Utils\{Icon, Setting}; +use Bugo\LightPortal\EventManagerFactory; function template_show_page(): void { @@ -94,7 +95,7 @@ function template_show_page(): void
    '; } - app('events')->dispatch(PortalHook::beforePageContent); + app(EventManagerFactory::class)()->dispatch(PortalHook::beforePageContent); if (! empty(Theme::$current->settings['og_image'])) { echo ' @@ -106,7 +107,7 @@ function template_show_page(): void ', Utils::$context['lp_page']['content'], '
'; - app('events')->dispatch(PortalHook::afterPageContent); + app(EventManagerFactory::class)()->dispatch(PortalHook::afterPageContent); echo ' '; From ef2caa56ca3b2a0082641c9898708fe0ab2ebb11 Mon Sep 17 00:00:00 2001 From: Bugo Date: Wed, 15 Jan 2025 20:37:40 +0500 Subject: [PATCH 07/15] Add transitions for the context menu --- src/Sources/LightPortal/UI/Tables/ContextMenuColumn.php | 2 +- src/Sources/LightPortal/UI/Tables/PageContextMenuColumn.php | 2 +- src/Themes/default/LightPortal/ManageBlocks.template.php | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Sources/LightPortal/UI/Tables/ContextMenuColumn.php b/src/Sources/LightPortal/UI/Tables/ContextMenuColumn.php index a70a577cb..34149f339 100644 --- a/src/Sources/LightPortal/UI/Tables/ContextMenuColumn.php +++ b/src/Sources/LightPortal/UI/Tables/ContextMenuColumn.php @@ -26,7 +26,7 @@ public static function make(string $name = 'actions', string $title = ''): stati
' . IconButton::make('ellipsis', ['x-on:click.prevent' => 'showContextMenu = true'], 'button floatnone') . ' -
+
  • ' . LinkButton::make(Lang::$txt['modify'], ['href' => Utils::$context['form_action'] . ";sa=edit;id={$entry['id']}"]) . '
  • ' . LinkButton::make(Lang::$txt['remove'], ['x-on:click.prevent' => 'showContextMenu = false; entity.remove($root)'], 'button error') . '
  • diff --git a/src/Sources/LightPortal/UI/Tables/PageContextMenuColumn.php b/src/Sources/LightPortal/UI/Tables/PageContextMenuColumn.php index f2eee9d5f..8ec77d003 100644 --- a/src/Sources/LightPortal/UI/Tables/PageContextMenuColumn.php +++ b/src/Sources/LightPortal/UI/Tables/PageContextMenuColumn.php @@ -26,7 +26,7 @@ public static function make(string $name = 'actions', string $title = ''): stati
    ' . IconButton::make('ellipsis', ['x-on:click.prevent' => 'showContextMenu = true'], 'button floatnone') . ' -
    +
      ' . ( app(Request::class)->has('deleted') ? ( Str::html('li')->addHtml( diff --git a/src/Themes/default/LightPortal/ManageBlocks.template.php b/src/Themes/default/LightPortal/ManageBlocks.template.php index f0a9676f2..f82685348 100644 --- a/src/Themes/default/LightPortal/ManageBlocks.template.php +++ b/src/Themes/default/LightPortal/ManageBlocks.template.php @@ -1,4 +1,4 @@ - ', Icon::get('ellipsis'), ' -
      +
      • ', Lang::$txt['lp_action_clone'], ' From 3e1198aae5b32c40d093c10b120bcda428474372 Mon Sep 17 00:00:00 2001 From: Bugo Date: Fri, 17 Jan 2025 10:39:19 +0500 Subject: [PATCH 08/15] Update components --- .../components/comments/CommentItem.svelte | 28 +++++++++++++------ .../components/comments/CommentList.svelte | 16 ++++++++--- .../comments/MarkdownPreview.svelte | 3 +- .../components/plugins/PluginItem.svelte | 20 +++++++------ .../plugins/PluginOptionList.svelte | 10 +++---- 5 files changed, 50 insertions(+), 27 deletions(-) diff --git a/resources/components/comments/CommentItem.svelte b/resources/components/comments/CommentItem.svelte index c5f7199de..9c725c7de 100644 --- a/resources/components/comments/CommentItem.svelte +++ b/resources/components/comments/CommentItem.svelte @@ -46,33 +46,44 @@ editMode = false; }; - const itemType = 'https://schema.org/Comment'; + const even = index % 2 === 0; + const odd = !even;
      • {@html comment.poster.avatar} + {#if comment.authorial} {$_('author')} {/if}
        -
        + +
        - {comment.poster.name} -
        + {comment.poster.name} + +
        diff --git a/resources/components/plugins/PluginOptionList.svelte b/resources/components/plugins/PluginOptionList.svelte index 66d3548fb..023ee70be 100644 --- a/resources/components/plugins/PluginOptionList.svelte +++ b/resources/components/plugins/PluginOptionList.svelte @@ -1,12 +1,12 @@ -
        +
        {$_('settings')}
        @@ -54,10 +54,8 @@ {$_('settings_saved')} - - {#if item.saveable} - {/if} From 32be760ab24984eabbc45d506ce83534b2e412c7 Mon Sep 17 00:00:00 2001 From: Bugo Date: Fri, 17 Jan 2025 10:39:44 +0500 Subject: [PATCH 09/15] Refactor code --- src/Sources/LightPortal/Areas/PluginArea.php | 9 --------- src/Sources/LightPortal/Hooks/Init.php | 2 +- src/Sources/LightPortal/Hooks/LoadTheme.php | 19 +------------------ .../Repositories/PageRepository.php | 3 +-- src/Sources/LightPortal/ServiceProvider.php | 2 ++ src/Sources/LightPortal/Tasks/Maintainer.php | 3 +-- .../LightPortal/Utils/SessionManager.php | 7 +++---- src/Sources/LightPortal/Utils/Setting.php | 2 +- .../LightPortal/ManageCategories.template.php | 2 +- .../LightPortal/ManageFeedback.template.php | 2 +- .../LightPortal/ManageImpex.template.php | 2 +- .../LightPortal/ManagePages.template.php | 2 +- .../LightPortal/ManagePanels.template.php | 2 +- .../LightPortal/ManagePlugins.template.php | 4 ++-- .../LightPortal/ManageSettings.template.php | 2 +- .../LightPortal/ManageTags.template.php | 2 +- .../LightPortal/ViewCredits.template.php | 2 +- .../LightPortal/ViewDebug.template.php | 2 +- .../LightPortal/ViewFrontPage.template.php | 2 +- .../default/LightPortal/ViewPage.template.php | 2 +- src/portal.php | 12 +++++------- 21 files changed, 28 insertions(+), 57 deletions(-) diff --git a/src/Sources/LightPortal/Areas/PluginArea.php b/src/Sources/LightPortal/Areas/PluginArea.php index 5d5a658c7..14d4e6af1 100644 --- a/src/Sources/LightPortal/Areas/PluginArea.php +++ b/src/Sources/LightPortal/Areas/PluginArea.php @@ -71,15 +71,6 @@ public function main(): void Utils::$context['sub_template'] = 'manage_plugins'; - Theme::loadCSSFile( - implode('', [ - 'https://cdn.jsdelivr.net/combine/', - 'npm/@vueform/multiselect@2/themes/default.min.css,', - 'npm/@vueform/toggle@2/themes/default.min.css' - ]), - ['external' => true] - ); - Utils::$context['page_title'] = Lang::$txt['lp_portal'] . ' - ' . Lang::$txt['lp_plugins_manage']; Utils::$context['post_url'] = Config::$scripturl . '?action=admin;area=lp_plugins;save'; diff --git a/src/Sources/LightPortal/Hooks/Init.php b/src/Sources/LightPortal/Hooks/Init.php index b81d6ae1b..b0babe825 100644 --- a/src/Sources/LightPortal/Hooks/Init.php +++ b/src/Sources/LightPortal/Hooks/Init.php @@ -36,7 +36,7 @@ public function __invoke(): void define('LP_NAME', (new DateTime())->format('m-d') === '04-01' ? 'Lazy Panda' : 'Light Portal'); define('LP_VERSION', '2.9.0'); - define('LP_PLUGIN_LIST', 'https://d8d75ea98b25aa12.mokky.dev/plugins'); + define('LP_PLUGIN_LIST', 'https://d8d75ea98b25aa12.mokky.dev/json'); define('LP_ADDON_DIR', dirname(__DIR__) . '/Plugins'); define('LP_ADDON_URL', Config::$boardurl . '/Sources/LightPortal/Plugins'); define('LP_CACHE_TIME', Setting::get('lp_cache_interval', 'int', 72000)); diff --git a/src/Sources/LightPortal/Hooks/LoadTheme.php b/src/Sources/LightPortal/Hooks/LoadTheme.php index b16f2b5ba..524a4e5ee 100644 --- a/src/Sources/LightPortal/Hooks/LoadTheme.php +++ b/src/Sources/LightPortal/Hooks/LoadTheme.php @@ -30,9 +30,6 @@ use Bugo\LightPortal\Utils\RequestTrait; use Bugo\LightPortal\Utils\SessionManager; -use function array_combine; -use function array_map; - if (! defined('SMF')) die('No direct access...'); @@ -63,7 +60,7 @@ protected function defineVars(): void Utils::$context['allow_light_portal_manage_pages_any'] = User::hasPermission('light_portal_manage_pages_any'); Utils::$context['allow_light_portal_approve_pages'] = User::hasPermission('light_portal_approve_pages'); - $this->calculateNumberOfEntities(); + Utils::$context['lp_quantities'] = app(SessionManager::class); Utils::$context['lp_all_title_classes'] = TitleClass::values(); Utils::$context['lp_all_content_classes'] = ContentClass::values(); @@ -117,18 +114,4 @@ protected function loadFontAwesome(): void ); } } - - private function calculateNumberOfEntities(): void - { - $sessionManager = new SessionManager(); - - $entities = [ - 'active_blocks', 'active_pages', 'my_pages', 'unapproved_pages', - 'deleted_pages', 'active_categories', 'active_tags', - ]; - - Utils::$context['lp_quantities'] = array_map( - static fn($key) => $sessionManager($key), array_combine($entities, $entities) - ); - } } diff --git a/src/Sources/LightPortal/Repositories/PageRepository.php b/src/Sources/LightPortal/Repositories/PageRepository.php index d8cfc57fc..a9cc25c18 100644 --- a/src/Sources/LightPortal/Repositories/PageRepository.php +++ b/src/Sources/LightPortal/Repositories/PageRepository.php @@ -330,8 +330,7 @@ public function removePermanently(array $items): void ] ); - $commentRepository = new CommentRepository(); - $commentRepository->removeFromResult($result); + app(CommentRepository::class)->removeFromResult($result); $this->session()->free('lp'); } diff --git a/src/Sources/LightPortal/ServiceProvider.php b/src/Sources/LightPortal/ServiceProvider.php index 57705b5b1..455d24ea8 100644 --- a/src/Sources/LightPortal/ServiceProvider.php +++ b/src/Sources/LightPortal/ServiceProvider.php @@ -58,6 +58,7 @@ use Bugo\LightPortal\Utils\Post; use Bugo\LightPortal\Utils\Request; use Bugo\LightPortal\Utils\Session; +use Bugo\LightPortal\Utils\SessionManager; use Bugo\LightPortal\Utils\Weaver; use League\Container\ServiceProvider\AbstractServiceProvider; @@ -91,6 +92,7 @@ public function register(): void $this->getContainer()->add(TitleList::class, fn() => (new TitleList())()); $this->getContainer()->add(IconList::class, fn() => (new IconList())()); $this->getContainer()->add(PluginList::class, fn() => (new PluginList())()); + $this->getContainer()->add(SessionManager::class, fn() => (new SessionManager())()); $this->getContainer()->add(Request::class); $this->getContainer()->add(Post::class); diff --git a/src/Sources/LightPortal/Tasks/Maintainer.php b/src/Sources/LightPortal/Tasks/Maintainer.php index 109342739..672fa3246 100644 --- a/src/Sources/LightPortal/Tasks/Maintainer.php +++ b/src/Sources/LightPortal/Tasks/Maintainer.php @@ -76,8 +76,7 @@ private function removeRedundantValues(): void AND parent_id NOT IN (SELECT * FROM (SELECT id FROM {db_prefix}lp_comments) com)', ); - $commentRepository = app(CommentRepository::class); - $commentRepository->removeFromResult($result); + app(CommentRepository::class)->removeFromResult($result); } private function updateNumComments(): void diff --git a/src/Sources/LightPortal/Utils/SessionManager.php b/src/Sources/LightPortal/Utils/SessionManager.php index 8fe0ec27c..5e60873f5 100644 --- a/src/Sources/LightPortal/Utils/SessionManager.php +++ b/src/Sources/LightPortal/Utils/SessionManager.php @@ -24,9 +24,9 @@ final class SessionManager { use SessionTrait; - public function __invoke(string $key): int + public function __invoke(): array { - return match ($key) { + return [ 'active_blocks' => $this->getActiveBlocksCount(), 'active_pages' => $this->getActivePagesCount(), 'my_pages' => $this->getMyPagesCount(), @@ -34,8 +34,7 @@ public function __invoke(string $key): int 'deleted_pages' => $this->getDeletedPagesCount(), 'active_categories' => $this->getActiveCategoriesCount(), 'active_tags' => $this->getActiveTagsCount(), - default => 0, - }; + ]; } public function getActiveBlocksCount(): int diff --git a/src/Sources/LightPortal/Utils/Setting.php b/src/Sources/LightPortal/Utils/Setting.php index 57ad083f1..254fde983 100644 --- a/src/Sources/LightPortal/Utils/Setting.php +++ b/src/Sources/LightPortal/Utils/Setting.php @@ -26,7 +26,7 @@ class Setting { - public static function get(string $key, string $type = 'string', $default = null, string $from = 'string'): mixed + public static function get(string $key, string $type = 'string', mixed $default = null, string $from = 'string'): mixed { if (! isset(Config::$modSettings[$key])) { return $default; diff --git a/src/Themes/default/LightPortal/ManageCategories.template.php b/src/Themes/default/LightPortal/ManageCategories.template.php index 4c8fbe25b..41b6aab4b 100644 --- a/src/Themes/default/LightPortal/ManageCategories.template.php +++ b/src/Themes/default/LightPortal/ManageCategories.template.php @@ -1,4 +1,4 @@ - @@ -17,16 +15,16 @@ require_once __DIR__ . '/SSI.php'; -if (empty(Config::$sourcedir)) +if (empty(Config::$sourcedir)) { die('' . Lang::$txt['error_occured'] . ' ' . Lang::$txt['lp_standalone_mode_error']); +} -if (empty(Config::$modSettings['lp_standalone_mode']) || empty(Config::$modSettings['lp_standalone_url'])) +if (empty(Config::$modSettings['lp_standalone_mode']) || empty(Config::$modSettings['lp_standalone_url'])) { Utils::redirectexit(); - -require_once Config::$sourcedir . '/LightPortal/Actions/FrontPage.php'; +} try { - (new FrontPage())->show(); + app(FrontPage::class)->show(); } catch (Exception $e) { die($e->getMessage()); } From 97f35e19f7ffd400a62cfe70cb6cdb4bd23d1bb9 Mon Sep 17 00:00:00 2001 From: Bugo Date: Fri, 17 Jan 2025 11:29:27 +0500 Subject: [PATCH 10/15] Update resources/.editorconfig --- resources/.editorconfig | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/resources/.editorconfig b/resources/.editorconfig index 933ec94fa..33d9c4fda 100644 --- a/resources/.editorconfig +++ b/resources/.editorconfig @@ -7,3 +7,7 @@ indent_style = space indent_size = 2 trim_trailing_whitespace = true charset = utf-8 + +[*.scss] +indent_style = tab +indent_size = tab \ No newline at end of file From 487047b329da20d3f3684849189d137dc25069d4 Mon Sep 17 00:00:00 2001 From: Bugo Date: Fri, 17 Jan 2025 11:29:58 +0500 Subject: [PATCH 11/15] Update description block styles --- resources/sass/admin_tabs.scss | 11 ++++++++++- src/Sources/LightPortal/Areas/Traits/AreaTrait.php | 2 +- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/resources/sass/admin_tabs.scss b/resources/sass/admin_tabs.scss index cd36bb7d4..0fcb80ccc 100644 --- a/resources/sass/admin_tabs.scss +++ b/resources/sass/admin_tabs.scss @@ -138,6 +138,15 @@ } } + .roundframe { + &.smalltext { + box-shadow: inset 0 2px 2px rgba(0, 0, 0, 0.1), + inset 0 -2px 2px rgba(0, 0, 0, 0.1), + inset 2px 0 2px rgba(0, 0, 0, 0.1), + inset -2px 0 2px rgba(0, 0, 0, 0.1); + } + } + @media (max-width: 600px) { flex: 1 100%; text-align: center; @@ -180,4 +189,4 @@ } } } -} \ No newline at end of file +} diff --git a/src/Sources/LightPortal/Areas/Traits/AreaTrait.php b/src/Sources/LightPortal/Areas/Traits/AreaTrait.php index 936f7232d..ee82f1603 100644 --- a/src/Sources/LightPortal/Areas/Traits/AreaTrait.php +++ b/src/Sources/LightPortal/Areas/Traits/AreaTrait.php @@ -125,7 +125,7 @@ public function preparePostFields(): void } Utils::$context['posting_fields'][$item]['input']['after'] = Str::html($tag) - ->class('descbox alternative2 smalltext') + ->class('roundframe smalltext') ->setHtml($data['input']['after']); } From 059e85049a4f8f3ce74ec45dbb19c368591ad736 Mon Sep 17 00:00:00 2001 From: Bugo Date: Fri, 17 Jan 2025 11:30:17 +0500 Subject: [PATCH 12/15] Update docs --- docs/src/getting-started/updating.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/src/getting-started/updating.md b/docs/src/getting-started/updating.md index aaa806df6..ae632b90d 100644 --- a/docs/src/getting-started/updating.md +++ b/docs/src/getting-started/updating.md @@ -9,7 +9,7 @@ If there are no notes in the changelog of the latest version, it is enough to ex :::info Note -Since version 2.4 you can upgrade without uninstalling the previous version. Simply download the new archive, go to the Package Manager and click "Upgrade" button next to the uploaded package. +If the new version can be installed without removing the previous one, you'll see the "Upgrade" button instead of the "Install" button: ![Updating](upgrade.png) From 67860384f83c25edefc956ef78413c332cc6c5b8 Mon Sep 17 00:00:00 2001 From: Bugo Date: Fri, 17 Jan 2025 18:07:38 +0500 Subject: [PATCH 13/15] Update version --- src/Sources/LightPortal/Hooks/Init.php | 2 +- src/package-info.xml | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Sources/LightPortal/Hooks/Init.php b/src/Sources/LightPortal/Hooks/Init.php index b0babe825..3fea6f6c8 100644 --- a/src/Sources/LightPortal/Hooks/Init.php +++ b/src/Sources/LightPortal/Hooks/Init.php @@ -35,7 +35,7 @@ public function __invoke(): void Utils::$context['lp_load_time'] ??= microtime(true); define('LP_NAME', (new DateTime())->format('m-d') === '04-01' ? 'Lazy Panda' : 'Light Portal'); - define('LP_VERSION', '2.9.0'); + define('LP_VERSION', '2.9.1'); define('LP_PLUGIN_LIST', 'https://d8d75ea98b25aa12.mokky.dev/json'); define('LP_ADDON_DIR', dirname(__DIR__) . '/Plugins'); define('LP_ADDON_URL', Config::$boardurl . '/Sources/LightPortal/Plugins'); diff --git a/src/package-info.xml b/src/package-info.xml index ae119f1df..5a69be364 100644 --- a/src/package-info.xml +++ b/src/package-info.xml @@ -3,10 +3,10 @@ Bugo:LightPortal Light Portal - 2.9.0 + 2.9.1 modification - + From decc8ec565055aaaa3e924d5642c8caf348cea95 Mon Sep 17 00:00:00 2001 From: Bugo Date: Sat, 18 Jan 2025 00:13:20 +0500 Subject: [PATCH 14/15] Refactor code --- build.xml | 6 -- .../Compilers/AbstractCompiler.php | 70 ------------------- .../Compilers/CompilerInterface.php | 20 ------ src/Sources/LightPortal/Compilers/Less.php | 44 ------------ src/Sources/LightPortal/Compilers/Sass.php | 46 ------------ src/Sources/LightPortal/Compilers/Zero.php | 22 ------ src/Sources/LightPortal/Compilers/index.php | 6 -- src/Sources/LightPortal/Enums/Hook.php | 1 - src/Sources/LightPortal/Hooks/LoadTheme.php | 7 +- .../LightPortal/Hooks/PackageUpload.php | 42 ----------- src/Sources/LightPortal/Integration.php | 2 - src/Sources/LightPortal/Plugins/Plugin.php | 2 +- src/Sources/LightPortal/ServiceProvider.php | 53 ++++++++++++-- .../UI/Tables/ContextMenuColumn.php | 4 +- .../UI/Tables/{LinkButton.php => Link.php} | 2 +- .../LightPortal/UI/Tables/PageButtonsRow.php | 69 +++++++++--------- .../UI/Tables/PageContextMenuColumn.php | 8 +-- .../LightPortal/UI/Tables/PageSearchRow.php | 51 +++++++------- .../UI/Tables/PageTypeSelectRow.php | 17 +++-- .../UI/Tables/PortalTableBuilder.php | 32 +++++---- .../LightPortal/Utils/ConfigProvider.php | 28 -------- src/Sources/LightPortal/Utils/DateTime.php | 2 +- src/Sources/LightPortal/composer.json | 4 -- src/Sources/LightPortal/create_index.php | 2 +- .../LightPortal/development.config.php | 12 ---- src/Sources/LightPortal/production.config.php | 12 ---- src/Sources/LightPortal/update_plugins.php | 2 +- 27 files changed, 151 insertions(+), 415 deletions(-) delete mode 100644 src/Sources/LightPortal/Compilers/AbstractCompiler.php delete mode 100644 src/Sources/LightPortal/Compilers/CompilerInterface.php delete mode 100644 src/Sources/LightPortal/Compilers/Less.php delete mode 100644 src/Sources/LightPortal/Compilers/Sass.php delete mode 100644 src/Sources/LightPortal/Compilers/Zero.php delete mode 100644 src/Sources/LightPortal/Compilers/index.php delete mode 100644 src/Sources/LightPortal/Hooks/PackageUpload.php rename src/Sources/LightPortal/UI/Tables/{LinkButton.php => Link.php} (98%) delete mode 100644 src/Sources/LightPortal/Utils/ConfigProvider.php delete mode 100644 src/Sources/LightPortal/development.config.php delete mode 100644 src/Sources/LightPortal/production.config.php diff --git a/build.xml b/build.xml index 7308e2e45..6a8d46f7a 100644 --- a/build.xml +++ b/build.xml @@ -68,9 +68,6 @@ - - - @@ -134,9 +131,6 @@ - - - diff --git a/src/Sources/LightPortal/Compilers/AbstractCompiler.php b/src/Sources/LightPortal/Compilers/AbstractCompiler.php deleted file mode 100644 index 8f5ed66b8..000000000 --- a/src/Sources/LightPortal/Compilers/AbstractCompiler.php +++ /dev/null @@ -1,70 +0,0 @@ - - * @copyright 2019-2025 Bugo - * @license https://spdx.org/licenses/GPL-3.0-or-later.html GPL-3.0-or-later - * - * @version 2.9 - */ - -namespace Bugo\LightPortal\Compilers; - -use Bugo\Compat\Config; -use Bugo\Compat\Sapi; -use Bugo\Compat\Theme; -use Bugo\LightPortal\Enums\Hook; -use Bugo\LightPortal\Utils\SMFHookTrait; - -use function filemtime; -use function is_file; -use function touch; - -abstract class AbstractCompiler implements CompilerInterface -{ - use SMFHookTrait; - - public const TARGET_FILE = '/portal.css'; - - protected string $sourceFile; - - protected string $targetFile; - - public function __construct() - { - $this->sourceFile = $this->getCssDirPath() . static::SOURCE_FILE; - $this->targetFile = $this->getCssDirPath() . static::TARGET_FILE; - - $this->applyHook(Hook::cleanCache); - } - - public function cleanCache(): void - { - if (is_file($this->sourceFile)) { - touch($this->sourceFile); - } - } - - protected function isCompilationRequired(): bool - { - if (! is_file($this->sourceFile)) - return false; - - if (is_file($this->targetFile) && filemtime($this->sourceFile) < filemtime($this->targetFile)) - return false; - - return true; - } - - protected function getTempDir(): ?string - { - return empty(Config::$modSettings['cache_enable']) ? null : Sapi::getTempDir(); - } - - protected function getCssDirPath(): string - { - return Theme::$current->settings['default_theme_dir'] . '/css/light_portal'; - } -} diff --git a/src/Sources/LightPortal/Compilers/CompilerInterface.php b/src/Sources/LightPortal/Compilers/CompilerInterface.php deleted file mode 100644 index 50da760d1..000000000 --- a/src/Sources/LightPortal/Compilers/CompilerInterface.php +++ /dev/null @@ -1,20 +0,0 @@ - - * @copyright 2019-2025 Bugo - * @license https://spdx.org/licenses/GPL-3.0-or-later.html GPL-3.0-or-later - * - * @version 2.9 - */ - -namespace Bugo\LightPortal\Compilers; - -interface CompilerInterface -{ - public function compile(): void; - - public function cleanCache(): void; -} diff --git a/src/Sources/LightPortal/Compilers/Less.php b/src/Sources/LightPortal/Compilers/Less.php deleted file mode 100644 index 534d8e4e2..000000000 --- a/src/Sources/LightPortal/Compilers/Less.php +++ /dev/null @@ -1,44 +0,0 @@ - - * @copyright 2019-2025 Bugo - * @license https://spdx.org/licenses/GPL-3.0-or-later.html GPL-3.0-or-later - * - * @version 2.9 - */ - -namespace Bugo\LightPortal\Compilers; - -use Bugo\Compat\ErrorHandler; -use Exception; -use Less_Exception_Parser; -use Less_Parser; - -use function file_put_contents; - -final class Less extends AbstractCompiler -{ - public const SOURCE_FILE = '/less/portal.less'; - - public function compile(): void - { - if (! $this->isCompilationRequired()) - return; - - try { - $parser = new Less_Parser([ - 'compress' => true, - 'cache_dir' => $this->getTempDir(), - ]); - - $parser->parseFile($this->sourceFile); - - file_put_contents($this->targetFile, $parser->getCss()); - } catch (Less_Exception_Parser | Exception $e) { - ErrorHandler::log($e->getMessage(), 'critical'); - } - } -} diff --git a/src/Sources/LightPortal/Compilers/Sass.php b/src/Sources/LightPortal/Compilers/Sass.php deleted file mode 100644 index f705e63aa..000000000 --- a/src/Sources/LightPortal/Compilers/Sass.php +++ /dev/null @@ -1,46 +0,0 @@ - - * @copyright 2019-2025 Bugo - * @license https://spdx.org/licenses/GPL-3.0-or-later.html GPL-3.0-or-later - * - * @version 2.9 - */ - -namespace Bugo\LightPortal\Compilers; - -use Bugo\Compat\ErrorHandler; -use Exception; -use ScssPhp\ScssPhp\Compiler; -use ScssPhp\ScssPhp\Exception\SassException; -use ScssPhp\ScssPhp\OutputStyle; - -use function file_put_contents; - -final class Sass extends AbstractCompiler -{ - public const SOURCE_FILE = '/sass/portal.scss'; - - public function compile(): void - { - if (! $this->isCompilationRequired()) - return; - - try { - $compiler = new Compiler([ - 'cacheDir' => $this->getTempDir(), - ]); - - $compiler->setOutputStyle(OutputStyle::COMPRESSED); - - $result = $compiler->compileFile($this->sourceFile); - - file_put_contents($this->targetFile, $result->getCss()); - } catch (SassException | Exception $e) { - ErrorHandler::log($e->getMessage(), 'critical'); - } - } -} diff --git a/src/Sources/LightPortal/Compilers/Zero.php b/src/Sources/LightPortal/Compilers/Zero.php deleted file mode 100644 index cf593febe..000000000 --- a/src/Sources/LightPortal/Compilers/Zero.php +++ /dev/null @@ -1,22 +0,0 @@ - - * @copyright 2019-2025 Bugo - * @license https://spdx.org/licenses/GPL-3.0-or-later.html GPL-3.0-or-later - * - * @version 2.9 - */ - -namespace Bugo\LightPortal\Compilers; - -final class Zero extends AbstractCompiler -{ - public const SOURCE_FILE = ''; - - public function compile(): void - { - } -} diff --git a/src/Sources/LightPortal/Compilers/index.php b/src/Sources/LightPortal/Compilers/index.php deleted file mode 100644 index 66249736f..000000000 --- a/src/Sources/LightPortal/Compilers/index.php +++ /dev/null @@ -1,6 +0,0 @@ -defineVars(); - $this->loadAssets(app(CompilerInterface::class)); + $this->loadAssets(); // Run all init methods for active plugins app(EventManagerFactory::class)()->dispatch(PortalHook::init); @@ -74,12 +73,10 @@ protected function defineVars(): void Utils::$context['lp_active_blocks'] = app(BlockRepository::class)->getActive(); } - protected function loadAssets(CompilerInterface $compiler): void + protected function loadAssets(): void { $this->loadFontAwesome(); - $compiler->compile(); - Theme::loadCSSFile('light_portal/flexboxgrid.css'); Theme::loadCSSFile('light_portal/portal.css'); Theme::loadCSSFile('light_portal/plugins.css'); diff --git a/src/Sources/LightPortal/Hooks/PackageUpload.php b/src/Sources/LightPortal/Hooks/PackageUpload.php deleted file mode 100644 index d2df2b782..000000000 --- a/src/Sources/LightPortal/Hooks/PackageUpload.php +++ /dev/null @@ -1,42 +0,0 @@ - - * @copyright 2019-2025 Bugo - * @license https://spdx.org/licenses/GPL-3.0-or-later.html GPL-3.0-or-later - * - * @version 2.9 - */ - -namespace Bugo\LightPortal\Hooks; - -use Bugo\Compat\Config; -use Bugo\Compat\Lang; -use Bugo\Compat\Utils; -use Bugo\LightPortal\Utils\Str; - -use function preg_match; - -use const LP_NAME; -use const LP_VERSION; - -if (! defined('SMF')) - die('No direct access...'); - -class PackageUpload -{ - public function __invoke(): void - { - if (Utils::$context['package']['name'] !== LP_NAME || Utils::$context['package']['version'] < LP_VERSION) - return; - - if (isset(Utils::$context['package']['upgrade']) && preg_match('/^2\.8\..*/', LP_VERSION)) { - Utils::$context['package']['install']['link'] = Str::html('a') - ->href(Config::$scripturl . '?action=admin;area=packages;sa=install;package=' . Utils::$context['package']['filename']) - ->setText('[ ' . Lang::$txt['package_upgrade'] . ' ]') - ->toHtml(); - } - } -} diff --git a/src/Sources/LightPortal/Integration.php b/src/Sources/LightPortal/Integration.php index bc4694183..c52f06131 100644 --- a/src/Sources/LightPortal/Integration.php +++ b/src/Sources/LightPortal/Integration.php @@ -25,7 +25,6 @@ use Bugo\LightPortal\Hooks\LoadPermissions; use Bugo\LightPortal\Hooks\LoadTheme; use Bugo\LightPortal\Hooks\MenuButtons; -use Bugo\LightPortal\Hooks\PackageUpload; use Bugo\LightPortal\Hooks\PermissionsList; use Bugo\LightPortal\Hooks\PreCssOutput; use Bugo\LightPortal\Hooks\PreLoad; @@ -69,7 +68,6 @@ public function __invoke(): void $this->applyHook(Hook::deleteMembers, DeleteMembers::class); $this->applyHook(Hook::alertTypes, AlertTypes::class); $this->applyHook(Hook::fetchAlerts, FetchAlerts::class); - $this->applyHook(Hook::packageUpload, PackageUpload::class); $this->applyHook(Hook::profileAreas, ProfileAreas::class); $this->applyHook(Hook::profilePopup, ProfilePopup::class); $this->applyHook(Hook::downloadRequest, DownloadRequest::class); diff --git a/src/Sources/LightPortal/Plugins/Plugin.php b/src/Sources/LightPortal/Plugins/Plugin.php index 5afd16e07..365c3426d 100644 --- a/src/Sources/LightPortal/Plugins/Plugin.php +++ b/src/Sources/LightPortal/Plugins/Plugin.php @@ -90,7 +90,7 @@ public function addDefaultValues(array $values): void app(PluginRepository::class)->addSettings($settings); } - function loadExternalResources(array $resources): void + public function loadExternalResources(array $resources): void { foreach ($resources as $resource) { $type = $resource['type'] ?? null; diff --git a/src/Sources/LightPortal/ServiceProvider.php b/src/Sources/LightPortal/ServiceProvider.php index 455d24ea8..93f79dd68 100644 --- a/src/Sources/LightPortal/ServiceProvider.php +++ b/src/Sources/LightPortal/ServiceProvider.php @@ -36,7 +36,6 @@ use Bugo\LightPortal\Areas\PageArea; use Bugo\LightPortal\Areas\PluginArea; use Bugo\LightPortal\Areas\TagArea; -use Bugo\LightPortal\Compilers\CompilerInterface; use Bugo\LightPortal\Lists\CategoryList; use Bugo\LightPortal\Lists\IconList; use Bugo\LightPortal\Lists\PageList; @@ -45,6 +44,7 @@ use Bugo\LightPortal\Lists\TitleList; use Bugo\LightPortal\Plugins\PluginHandler; use Bugo\LightPortal\Plugins\PluginRegistry; +use Bugo\LightPortal\Renderers\Blade; use Bugo\LightPortal\Renderers\RendererInterface; use Bugo\LightPortal\Repositories\BlockRepository; use Bugo\LightPortal\Repositories\CategoryRepository; @@ -53,7 +53,6 @@ use Bugo\LightPortal\Repositories\PluginRepository; use Bugo\LightPortal\Repositories\TagRepository; use Bugo\LightPortal\Utils\Cache; -use Bugo\LightPortal\Utils\ConfigProvider; use Bugo\LightPortal\Utils\File; use Bugo\LightPortal\Utils\Post; use Bugo\LightPortal\Utils\Request; @@ -69,7 +68,53 @@ class ServiceProvider extends AbstractServiceProvider public function provides(string $id): bool { $services = [ + RendererInterface::class, + EventManager::class, + EventManagerFactory::class, + PluginHandler::class, + PluginRegistry::class, + CategoryList::class, + PageList::class, + TagList::class, + TitleList::class, + IconList::class, + PluginList::class, + SessionManager::class, Request::class, + Post::class, + File::class, + Cache::class, + Session::class, + BlockRepository::class, + CategoryRepository::class, + CommentRepository::class, + PageRepository::class, + PluginRepository::class, + TagRepository::class, + BlockArea::class, + BlockExport::class, + BlockImport::class, + PageArea::class, + PageExport::class, + PageImport::class, + CategoryArea::class, + CategoryExport::class, + CategoryImport::class, + TagArea::class, + TagExport::class, + TagImport::class, + PluginArea::class, + PluginExport::class, + PluginImport::class, + BoardIndex::class, + FrontPage::class, + Block::class, + Page::class, + Comment::class, + Category::class, + Tag::class, + CardListInterface::class, + Weaver::class, ]; return in_array($id, $services); @@ -77,9 +122,7 @@ public function provides(string $id): bool public function register(): void { - $this->getContainer()->add('config', fn() => (new ConfigProvider())->get()); - $this->getContainer()->add(CompilerInterface::class, fn() => $this->getContainer()->get('config')[CompilerInterface::class]); - $this->getContainer()->add(RendererInterface::class, fn() => $this->getContainer()->get('config')[RendererInterface::class]); + $this->getContainer()->add(RendererInterface::class, Blade::class); $this->getContainer()->add(EventManager::class); $this->getContainer()->add(EventManagerFactory::class); diff --git a/src/Sources/LightPortal/UI/Tables/ContextMenuColumn.php b/src/Sources/LightPortal/UI/Tables/ContextMenuColumn.php index 34149f339..167974eda 100644 --- a/src/Sources/LightPortal/UI/Tables/ContextMenuColumn.php +++ b/src/Sources/LightPortal/UI/Tables/ContextMenuColumn.php @@ -28,8 +28,8 @@ public static function make(string $name = 'actions', string $title = ''): stati ' . IconButton::make('ellipsis', ['x-on:click.prevent' => 'showContextMenu = true'], 'button floatnone') . '
          -
        • ' . LinkButton::make(Lang::$txt['modify'], ['href' => Utils::$context['form_action'] . ";sa=edit;id={$entry['id']}"]) . '
        • -
        • ' . LinkButton::make(Lang::$txt['remove'], ['x-on:click.prevent' => 'showContextMenu = false; entity.remove($root)'], 'button error') . '
        • +
        • ' . Link::make(Lang::$txt['modify'], ['href' => Utils::$context['form_action'] . ";sa=edit;id={$entry['id']}"]) . '
        • +
        • ' . Link::make(Lang::$txt['remove'], ['x-on:click.prevent' => 'showContextMenu = false; entity.remove($root)'], 'button error') . '
        diff --git a/src/Sources/LightPortal/UI/Tables/LinkButton.php b/src/Sources/LightPortal/UI/Tables/Link.php similarity index 98% rename from src/Sources/LightPortal/UI/Tables/LinkButton.php rename to src/Sources/LightPortal/UI/Tables/Link.php index 61226f594..369d2d726 100644 --- a/src/Sources/LightPortal/UI/Tables/LinkButton.php +++ b/src/Sources/LightPortal/UI/Tables/Link.php @@ -14,7 +14,7 @@ use Bugo\LightPortal\Utils\Str; -class LinkButton +class Link { public function __construct( private readonly string $text, diff --git a/src/Sources/LightPortal/UI/Tables/PageButtonsRow.php b/src/Sources/LightPortal/UI/Tables/PageButtonsRow.php index eda45eebe..d1b8c3ce5 100644 --- a/src/Sources/LightPortal/UI/Tables/PageButtonsRow.php +++ b/src/Sources/LightPortal/UI/Tables/PageButtonsRow.php @@ -23,38 +23,41 @@ class PageButtonsRow extends Row { public static function make(string $value = '', ?string $class = null): static { - return parent::make($value ?: Str::html('select', ['name' => 'page_actions']) - ->addHtml( - Str::html('option', [ - 'value' => app(Request::class)->has('deleted') ? 'delete_forever' : 'delete' - ])->setText(Lang::$txt[app(Request::class)->has('deleted') ? 'lp_action_remove_permanently' : 'remove']) - ) - ->addHtml( - Utils::$context['allow_light_portal_approve_pages'] - ? Str::html('option', ['value' => 'toggle']) - ->setText(Lang::$txt['lp_action_toggle']) - : '' - ) - ->addHtml( - Setting::isFrontpageMode('chosen_pages') - ? Str::html('option', ['value' => 'promote_up']) - ->setText(Lang::$txt['lp_promote_to_fp']) - : '' - ) - ->addHtml( - Setting::isFrontpageMode('chosen_pages') - ? Str::html('option', ['value' => 'promote_down']) - ->setText(Lang::$txt['lp_remove_from_fp']) - : '' - ) . ' ' . - Str::html('input', [ - 'type' => 'submit', - 'name' => 'mass_actions', - 'value' => Lang::$txt['quick_mod_go'], - 'class' => 'button', - 'onclick' => "return document.forms['manage_pages']['page_actions'].value && confirm('" . Lang::$txt['quickmod_confirm'] . ");", - ]) - ) - ->setClass('floatright'); + $text = Lang::$txt[app(Request::class)->has('deleted') ? 'lp_action_remove_permanently' : 'remove']; + + $delete = Str::html('option', [ + 'value' => app(Request::class)->has('deleted') ? 'delete_forever' : 'delete' + ]); + + $toggle = Utils::$context['allow_light_portal_approve_pages'] + ? Str::html('option', ['value' => 'toggle']) + ->setText(Lang::$txt['lp_action_toggle']) + : ''; + + $promoteUp = Setting::isFrontpageMode('chosen_pages') + ? Str::html('option', ['value' => 'promote_up']) + ->setText(Lang::$txt['lp_promote_to_fp']) + : ''; + + $promoteDown = Setting::isFrontpageMode('chosen_pages') + ? Str::html('option', ['value' => 'promote_down']) + ->setText(Lang::$txt['lp_remove_from_fp']) + : ''; + + $submit = Str::html('input', [ + 'type' => 'submit', + 'name' => 'mass_actions', + 'value' => Lang::$txt['quick_mod_go'], + 'class' => 'button', + 'onclick' => "return document.forms['manage_pages']['page_actions'].value && confirm('" . Lang::$txt['quickmod_confirm'] . ");", + ]); + + $select = Str::html('select', ['name' => 'page_actions']) + ->addHtml($delete->setText($text)) + ->addHtml($toggle) + ->addHtml($promoteUp) + ->addHtml($promoteDown); + + return parent::make($value ?: $select . ' ' . $submit)->setClass('floatright'); } } diff --git a/src/Sources/LightPortal/UI/Tables/PageContextMenuColumn.php b/src/Sources/LightPortal/UI/Tables/PageContextMenuColumn.php index 8ec77d003..abc926e36 100644 --- a/src/Sources/LightPortal/UI/Tables/PageContextMenuColumn.php +++ b/src/Sources/LightPortal/UI/Tables/PageContextMenuColumn.php @@ -30,17 +30,17 @@ public static function make(string $name = 'actions', string $title = ''): stati
          ' . ( app(Request::class)->has('deleted') ? ( Str::html('li')->addHtml( - LinkButton::make(Lang::$txt['restore_message'], ['x-on:click.prevent' => 'showContextMenu = false; entity.restore($root)']) + Link::make(Lang::$txt['restore_message'], ['x-on:click.prevent' => 'showContextMenu = false; entity.restore($root)']) ) . Str::html('li')->addHtml( - LinkButton::make(Lang::$txt['lp_action_remove_permanently'], ['x-on:click.prevent' => 'showContextMenu = false; entity.removeForever($root)'], 'button error') + Link::make(Lang::$txt['lp_action_remove_permanently'], ['x-on:click.prevent' => 'showContextMenu = false; entity.removeForever($root)'], 'button error') ) ) : ( Str::html('li')->addHtml( - LinkButton::make(Lang::$txt['modify'], ['href' => Config::$scripturl . "?action=admin;area=lp_pages;sa=edit;id={$entry['id']}"]) + Link::make(Lang::$txt['modify'], ['href' => Config::$scripturl . "?action=admin;area=lp_pages;sa=edit;id={$entry['id']}"]) ) . Str::html('li')->addHtml( - LinkButton::make(Lang::$txt['remove'], ['x-on:click.prevent' => 'showContextMenu = false; entity.remove($root)'], 'button error') + Link::make(Lang::$txt['remove'], ['x-on:click.prevent' => 'showContextMenu = false; entity.remove($root)'], 'button error') ) ) ) . ' diff --git a/src/Sources/LightPortal/UI/Tables/PageSearchRow.php b/src/Sources/LightPortal/UI/Tables/PageSearchRow.php index d36fce9d2..2d1a76827 100644 --- a/src/Sources/LightPortal/UI/Tables/PageSearchRow.php +++ b/src/Sources/LightPortal/UI/Tables/PageSearchRow.php @@ -23,30 +23,33 @@ class PageSearchRow extends Row { public static function make(string $value = '', ?string $class = null): static { - return parent::make($value ?: Str::html('div', ['class' => 'row']) - ->addHtml( - Str::html('div', ['class' => 'col-lg-10'])->setHtml( - Str::html('input', [ - 'type' => 'search', - 'name' => 'search', - 'value' => Utils::$context['search']['string'], - 'placeholder' => Lang::$txt['lp_pages_search'], - 'style' => 'width: 100%', - ]) - ) - ) - ->addHtml( - Str::html('div', ['class' => 'col-lg-2'])->setHtml( - Str::html('button', [ - 'type' => 'submit', - 'name' => 'is_search', - 'class' => 'button floatnone', - 'style' => 'width: 100%', - ])->setHtml(Icon::get('search') . Lang::$txt['search']) - ) - ) - ->toHtml() - ) + $input = Str::html('input', [ + 'type' => 'search', + 'name' => 'search', + 'value' => Utils::$context['search']['string'], + 'placeholder' => Lang::$txt['lp_pages_search'], + 'style' => 'width: 100%', + ]); + + $search = Str::html('div', ['class' => 'col-lg-10'])->setHtml($input); + + $icon = Icon::get('search') . Lang::$txt['search']; + + $button = Str::html('button', [ + 'type' => 'submit', + 'name' => 'is_search', + 'class' => 'button floatnone', + 'style' => 'width: 100%', + ])->setHtml($icon); + + $div = Str::html('div', ['class' => 'col-lg-2'])->setHtml($button); + + $row = Str::html('div', ['class' => 'row']) + ->addHtml($search) + ->addHtml($div) + ->toHtml(); + + return parent::make($value ?: $row) ->setClass('floatnone') ->setPosition(RowPosition::AFTER_TITLE); } diff --git a/src/Sources/LightPortal/UI/Tables/PageTypeSelectRow.php b/src/Sources/LightPortal/UI/Tables/PageTypeSelectRow.php index 0b492ae83..2d326b361 100644 --- a/src/Sources/LightPortal/UI/Tables/PageTypeSelectRow.php +++ b/src/Sources/LightPortal/UI/Tables/PageTypeSelectRow.php @@ -34,13 +34,16 @@ public static function make(string $value = '', ?string $class = null): static ])->setText($text); } - return parent::make($value ?: Str::html('label', ['for' => 'type']) - ->setText(Lang::$txt['lp_page_type']) . ' ' . - Str::html('select', [ - 'id' => 'type', - 'name' => 'type', - 'onchange' => 'this.form.submit()', - ])->addHtml($types), 'floatright') + $label = Str::html('label', ['for' => 'type']) + ->setText(Lang::$txt['lp_page_type']); + + $select = Str::html('select', [ + 'id' => 'type', + 'name' => 'type', + 'onchange' => 'this.form.submit()', + ]); + + return parent::make($value ?: $label . ' ' . $select->addHtml($types), 'floatright') ->setPosition(RowPosition::ABOVE_COLUMN_HEADERS); } } diff --git a/src/Sources/LightPortal/UI/Tables/PortalTableBuilder.php b/src/Sources/LightPortal/UI/Tables/PortalTableBuilder.php index 5bbf4287b..d179e77d1 100644 --- a/src/Sources/LightPortal/UI/Tables/PortalTableBuilder.php +++ b/src/Sources/LightPortal/UI/Tables/PortalTableBuilder.php @@ -35,23 +35,25 @@ protected function __construct(string $id, string $title) public function withCreateButton(string $entity, string $title = ''): static { - $this->setTitle($title ?: Str::html('span', ['class' => 'floatright']) - ->addHtml( - Str::html('a', [ - 'href' => implode('', [ - Config::$scripturl . "?action=admin;area=lp_$entity;sa=add;", - Utils::$context['session_var'] . '=' . Utils::$context['session_id'] - ]), - 'x-data' => '', - ]) - ->setHtml(str_replace( - ' class=', - ' @mouseover="entity.toggleSpin($event.target)" @mouseout="entity.toggleSpin($event.target)" class=', - Icon::get('plus', Lang::$txt["lp_{$entity}_add"]) - )) - ) . parent::getTitle() + $icon = str_replace( + ' class=', + ' @mouseover="entity.toggleSpin($event.target)" @mouseout="entity.toggleSpin($event.target)" class=', + Icon::get('plus', Lang::$txt["lp_{$entity}_add"]) ); + $link = Str::html('a', [ + 'href' => implode('', [ + Config::$scripturl . "?action=admin;area=lp_$entity;sa=add;", + Utils::$context['session_var'] . '=' . Utils::$context['session_id'] + ]), + 'x-data' => '', + ]); + + $button = Str::html('span', ['class' => 'floatright']) + ->addHtml($link->setHtml($icon)); + + $this->setTitle($title ?: $button . parent::getTitle()); + return $this; } } diff --git a/src/Sources/LightPortal/Utils/ConfigProvider.php b/src/Sources/LightPortal/Utils/ConfigProvider.php deleted file mode 100644 index 84ca03eac..000000000 --- a/src/Sources/LightPortal/Utils/ConfigProvider.php +++ /dev/null @@ -1,28 +0,0 @@ - - * @copyright 2019-2025 Bugo - * @license https://spdx.org/licenses/GPL-3.0-or-later.html GPL-3.0-or-later - * - * @version 2.9 - */ - -namespace Bugo\LightPortal\Utils; - -use function dirname; -use function is_file; - -class ConfigProvider -{ - public function get(): array - { - $configFile = is_file(dirname(__DIR__) . '/development.config.php') - ? '/development.config.php' - : '/production.config.php'; - - return require dirname(__DIR__) . $configFile; - } -} diff --git a/src/Sources/LightPortal/Utils/DateTime.php b/src/Sources/LightPortal/Utils/DateTime.php index f7fd05f92..c45036d46 100644 --- a/src/Sources/LightPortal/Utils/DateTime.php +++ b/src/Sources/LightPortal/Utils/DateTime.php @@ -120,7 +120,7 @@ public static function relative(int $timestamp): string // like "Yesterday at ..." elseif ($d.$m.$y === date('jmY', strtotime('-1 day'))) return Lang::$txt['yesterday'] . $t; - // like "Tuesday, 20 February, H:m" (current month) + // like "Thursday, 20 February, H:m" (current month) elseif ($m === date('m', $now) && $y === date('Y', $now)) return self::getLocalDate($timestamp); // like "20 February, H:m" (current year) diff --git a/src/Sources/LightPortal/composer.json b/src/Sources/LightPortal/composer.json index 90d16b710..f70a169a1 100644 --- a/src/Sources/LightPortal/composer.json +++ b/src/Sources/LightPortal/composer.json @@ -13,10 +13,6 @@ "league/container": "^4.2", "wplake/typed": "^1.1" }, - "suggest": { - "scssphp/scssphp": "Install v1.13 if you want to use the Sass compiler", - "wikimedia/less.php": "Install v5.1 if you want to use the Less compiler" - }, "autoload": { "psr-4": { "Bugo\\LightPortal\\": "" diff --git a/src/Sources/LightPortal/create_index.php b/src/Sources/LightPortal/create_index.php index 6fb078d04..f85d5d6ec 100644 --- a/src/Sources/LightPortal/create_index.php +++ b/src/Sources/LightPortal/create_index.php @@ -1,4 +1,4 @@ - true, - CompilerInterface::class => Zero::class, - RendererInterface::class => Blade::class, -]; diff --git a/src/Sources/LightPortal/production.config.php b/src/Sources/LightPortal/production.config.php deleted file mode 100644 index b108a0011..000000000 --- a/src/Sources/LightPortal/production.config.php +++ /dev/null @@ -1,12 +0,0 @@ - false, - CompilerInterface::class => Zero::class, - RendererInterface::class => Blade::class, -]; diff --git a/src/Sources/LightPortal/update_plugins.php b/src/Sources/LightPortal/update_plugins.php index ac5d32978..fa5d0b688 100644 --- a/src/Sources/LightPortal/update_plugins.php +++ b/src/Sources/LightPortal/update_plugins.php @@ -1,4 +1,4 @@ - Date: Sat, 18 Jan 2025 11:12:02 +0500 Subject: [PATCH 15/15] Update dependencies --- docs/package.json | 4 +- docs/pnpm-lock.yaml | 705 ++++++++++++++++++++++++-------------------- package.json | 14 +- pnpm-lock.yaml | 398 ++++++++++++------------- 4 files changed, 593 insertions(+), 528 deletions(-) diff --git a/docs/package.json b/docs/package.json index 11e616fc4..0ba60bc1b 100644 --- a/docs/package.json +++ b/docs/package.json @@ -4,9 +4,9 @@ }, "devDependencies": { "@nolebase/vitepress-plugin-enhanced-readabilities": "^2.12.0", - "@rive-app/canvas": "^2.25.3", + "@rive-app/canvas": "^2.25.4", "release-timeline": "^0.6.0", - "sass": "^1.83.0", + "sass": "^1.83.4", "vitepress": "^1.5.0", "vitepress-sidebar": "^1.30.2" }, diff --git a/docs/pnpm-lock.yaml b/docs/pnpm-lock.yaml index 94a5c8911..45dbeb7e9 100644 --- a/docs/pnpm-lock.yaml +++ b/docs/pnpm-lock.yaml @@ -14,19 +14,19 @@ importers: devDependencies: '@nolebase/vitepress-plugin-enhanced-readabilities': specifier: ^2.12.0 - version: 2.12.0(@algolia/client-search@5.18.0)(postcss@8.4.49)(sass@1.83.0)(search-insights@2.13.0) + version: 2.12.0(@algolia/client-search@5.19.0)(postcss@8.5.1)(sass@1.83.4)(search-insights@2.13.0) '@rive-app/canvas': - specifier: ^2.25.3 - version: 2.25.3 + specifier: ^2.25.4 + version: 2.25.4 release-timeline: specifier: ^0.6.0 version: 0.6.0(vue@3.5.13) sass: - specifier: ^1.83.0 - version: 1.83.0 + specifier: ^1.83.4 + version: 1.83.4 vitepress: specifier: ^1.5.0 - version: 1.5.0(@algolia/client-search@5.18.0)(less@4.2.1)(postcss@8.4.49)(sass@1.83.0)(search-insights@2.13.0) + version: 1.5.0(@algolia/client-search@5.19.0)(less@4.2.1)(postcss@8.5.1)(sass@1.83.4)(search-insights@2.13.0) vitepress-sidebar: specifier: ^1.30.2 version: 1.30.2 @@ -53,56 +53,56 @@ packages: '@algolia/client-search': '>= 4.9.1 < 6' algoliasearch: '>= 4.9.1 < 6' - '@algolia/client-abtesting@5.18.0': - resolution: {integrity: sha512-DLIrAukjsSrdMNNDx1ZTks72o4RH/1kOn8Wx5zZm8nnqFexG+JzY4SANnCNEjnFQPJTTvC+KpgiNW/CP2lumng==} + '@algolia/client-abtesting@5.19.0': + resolution: {integrity: sha512-dMHwy2+nBL0SnIsC1iHvkBao64h4z+roGelOz11cxrDBrAdASxLxmfVMop8gmodQ2yZSacX0Rzevtxa+9SqxCw==} engines: {node: '>= 14.0.0'} - '@algolia/client-analytics@5.18.0': - resolution: {integrity: sha512-0VpGG2uQW+h2aejxbG8VbnMCQ9ary9/ot7OASXi6OjE0SRkYQ/+pkW+q09+IScif3pmsVVYggmlMPtAsmYWHng==} + '@algolia/client-analytics@5.19.0': + resolution: {integrity: sha512-CDW4RwnCHzU10upPJqS6N6YwDpDHno7w6/qXT9KPbPbt8szIIzCHrva4O9KIfx1OhdsHzfGSI5hMAiOOYl4DEQ==} engines: {node: '>= 14.0.0'} - '@algolia/client-common@5.18.0': - resolution: {integrity: sha512-X1WMSC+1ve2qlMsemyTF5bIjwipOT+m99Ng1Tyl36ZjQKTa54oajBKE0BrmM8LD8jGdtukAgkUhFoYOaRbMcmQ==} + '@algolia/client-common@5.19.0': + resolution: {integrity: sha512-2ERRbICHXvtj5kfFpY5r8qu9pJII/NAHsdgUXnUitQFwPdPL7wXiupcvZJC7DSntOnE8AE0lM7oDsPhrJfj5nQ==} engines: {node: '>= 14.0.0'} - '@algolia/client-insights@5.18.0': - resolution: {integrity: sha512-FAJRNANUOSs/FgYOJ/Njqp+YTe4TMz2GkeZtfsw1TMiA5mVNRS/nnMpxas9771aJz7KTEWvK9GwqPs0K6RMYWg==} + '@algolia/client-insights@5.19.0': + resolution: {integrity: sha512-xPOiGjo6I9mfjdJO7Y+p035aWePcbsItizIp+qVyfkfZiGgD+TbNxM12g7QhFAHIkx/mlYaocxPY/TmwPzTe+A==} engines: {node: '>= 14.0.0'} - '@algolia/client-personalization@5.18.0': - resolution: {integrity: sha512-I2dc94Oiwic3SEbrRp8kvTZtYpJjGtg5y5XnqubgnA15AgX59YIY8frKsFG8SOH1n2rIhUClcuDkxYQNXJLg+w==} + '@algolia/client-personalization@5.19.0': + resolution: {integrity: sha512-B9eoce/fk8NLboGje+pMr72pw+PV7c5Z01On477heTZ7jkxoZ4X92dobeGuEQop61cJ93Gaevd1of4mBr4hu2A==} engines: {node: '>= 14.0.0'} - '@algolia/client-query-suggestions@5.18.0': - resolution: {integrity: sha512-x6XKIQgKFTgK/bMasXhghoEjHhmgoP61pFPb9+TaUJ32aKOGc65b12usiGJ9A84yS73UDkXS452NjyP50Knh/g==} + '@algolia/client-query-suggestions@5.19.0': + resolution: {integrity: sha512-6fcP8d4S8XRDtVogrDvmSM6g5g6DndLc0pEm1GCKe9/ZkAzCmM3ZmW1wFYYPxdjMeifWy1vVEDMJK7sbE4W7MA==} engines: {node: '>= 14.0.0'} - '@algolia/client-search@5.18.0': - resolution: {integrity: sha512-qI3LcFsVgtvpsBGR7aNSJYxhsR+Zl46+958ODzg8aCxIcdxiK7QEVLMJMZAR57jGqW0Lg/vrjtuLFDMfSE53qA==} + '@algolia/client-search@5.19.0': + resolution: {integrity: sha512-Ctg3xXD/1VtcwmkulR5+cKGOMj4r0wC49Y/KZdGQcqpydKn+e86F6l3tb3utLJQVq4lpEJud6kdRykFgcNsp8Q==} engines: {node: '>= 14.0.0'} - '@algolia/ingestion@1.18.0': - resolution: {integrity: sha512-bGvJg7HnGGm+XWYMDruZXWgMDPVt4yCbBqq8DM6EoaMBK71SYC4WMfIdJaw+ABqttjBhe6aKNRkWf/bbvYOGyw==} + '@algolia/ingestion@1.19.0': + resolution: {integrity: sha512-LO7w1MDV+ZLESwfPmXkp+KLeYeFrYEgtbCZG6buWjddhYraPQ9MuQWLhLLiaMlKxZ/sZvFTcZYuyI6Jx4WBhcg==} engines: {node: '>= 14.0.0'} - '@algolia/monitoring@1.18.0': - resolution: {integrity: sha512-lBssglINIeGIR+8KyzH05NAgAmn1BCrm5D2T6pMtr/8kbTHvvrm1Zvcltc5dKUQEFyyx3J5+MhNc7kfi8LdjVw==} + '@algolia/monitoring@1.19.0': + resolution: {integrity: sha512-Mg4uoS0aIKeTpu6iv6O0Hj81s8UHagi5TLm9k2mLIib4vmMtX7WgIAHAcFIaqIZp5D6s5EVy1BaDOoZ7buuJHA==} engines: {node: '>= 14.0.0'} - '@algolia/recommend@5.18.0': - resolution: {integrity: sha512-uSnkm0cdAuFwdMp4pGT5vHVQ84T6AYpTZ3I0b3k/M3wg4zXDhl3aCiY8NzokEyRLezz/kHLEEcgb/tTTobOYVw==} + '@algolia/recommend@5.19.0': + resolution: {integrity: sha512-PbgrMTbUPlmwfJsxjFhal4XqZO2kpBNRjemLVTkUiti4w/+kzcYO4Hg5zaBgVqPwvFDNQ8JS4SS3TBBem88u+g==} engines: {node: '>= 14.0.0'} - '@algolia/requester-browser-xhr@5.18.0': - resolution: {integrity: sha512-1XFjW0C3pV0dS/9zXbV44cKI+QM4ZIz9cpatXpsjRlq6SUCpLID3DZHsXyE6sTb8IhyPaUjk78GEJT8/3hviqg==} + '@algolia/requester-browser-xhr@5.19.0': + resolution: {integrity: sha512-GfnhnQBT23mW/VMNs7m1qyEyZzhZz093aY2x8p0era96MMyNv8+FxGek5pjVX0b57tmSCZPf4EqNCpkGcGsmbw==} engines: {node: '>= 14.0.0'} - '@algolia/requester-fetch@5.18.0': - resolution: {integrity: sha512-0uodeNdAHz1YbzJh6C5xeQ4T6x5WGiUxUq3GOaT/R4njh5t78dq+Rb187elr7KtnjUmETVVuCvmEYaThfTHzNg==} + '@algolia/requester-fetch@5.19.0': + resolution: {integrity: sha512-oyTt8ZJ4T4fYvW5avAnuEc6Laedcme9fAFryMD9ndUTIUe/P0kn3BuGcCLFjN3FDmdrETHSFkgPPf1hGy3sLCw==} engines: {node: '>= 14.0.0'} - '@algolia/requester-node-http@5.18.0': - resolution: {integrity: sha512-tZCqDrqJ2YE2I5ukCQrYN8oiF6u3JIdCxrtKq+eniuLkjkO78TKRnXrVcKZTmfFJyyDK8q47SfDcHzAA3nHi6w==} + '@algolia/requester-node-http@5.19.0': + resolution: {integrity: sha512-p6t8ue0XZNjcRiqNkb5QAM0qQRAKsCiebZ6n9JjWA+p8fWf8BvnhO55y2fO28g3GW0Imj7PrAuyBuxq8aDVQwQ==} engines: {node: '>= 14.0.0'} '@babel/helper-string-parser@7.25.9': @@ -113,13 +113,13 @@ packages: resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==} engines: {node: '>=6.9.0'} - '@babel/parser@7.26.3': - resolution: {integrity: sha512-WJ/CvmY8Mea8iDXo6a7RK2wbmJITT5fN3BEkRuFlxVyNx8jOKIIhmC4fSkTcPcf8JyavbBwIe6OpiCOBXt/IcA==} + '@babel/parser@7.26.5': + resolution: {integrity: sha512-SRJ4jYmXRqV1/Xc+TIVG84WjHBXKlxO9sHQnA2Pf12QQEAp1LOh6kDzNHXcUnbH1QI0FDoPPVOt+vyUDucxpaw==} engines: {node: '>=6.0.0'} hasBin: true - '@babel/types@7.26.3': - resolution: {integrity: sha512-vN5p+1kl59GVKMvTHt55NzzmYVxprfJD+ql7U9NFIfKCBkYE55LYtS+WtPlaYOyzydrKI8Nezd+aZextrd+FMA==} + '@babel/types@7.26.5': + resolution: {integrity: sha512-L6mZmwFDK6Cjh1nRCLXpa6no13ZIioJDz7mdkzHv399pThrTa/k0nUlNaenOeh2kWu/iaOQYElEpKPUswUa9Vg==} engines: {node: '>=6.9.0'} '@docsearch/css@3.8.2': @@ -297,8 +297,8 @@ packages: '@iconify-json/octicon@1.2.2': resolution: {integrity: sha512-qEPkP9DMMay5uILzyaSmVksSMxRw9i2wSDREfB8OK20mPdSadusjLqD/u69GzpFpw6894c+WNmoq7WzN5KAPeg==} - '@iconify-json/simple-icons@1.2.18': - resolution: {integrity: sha512-ae4ig7fxNXME1wl5og7Ocp82TM4jyz6IsOyI8GrteSbvHR9gaPu2Z01Amn5V/xo1Y7A7/+EH/3Ovpy2az/gYbg==} + '@iconify-json/simple-icons@1.2.20': + resolution: {integrity: sha512-WlQ95zrdxxizrFt2HtkfYjyWatLfE8Z7BKOkew9quG5S5AKYVxF1PkTtOs8LDWShce1DpvxKWQne4W5DQyEGZg==} '@iconify/types@2.0.0': resolution: {integrity: sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==} @@ -310,8 +310,8 @@ packages: '@jridgewell/sourcemap-codec@1.5.0': resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} - '@lit-labs/ssr-dom-shim@1.2.1': - resolution: {integrity: sha512-wx4aBmgeGvFmOKucFKY+8VFJSYZxs9poN3SDNQFF6lT6NrQUnHiPB2PWz2sc4ieEcAaYYzN+1uWahEeTq2aRIQ==} + '@lit-labs/ssr-dom-shim@1.3.0': + resolution: {integrity: sha512-nQIWonJ6eFAvUUrSlwyHDm/aE8PBDu5kRpL0vHMg6K8fK3Diq1xdPjTnsJSwxABhaZ+5eBi1btQB5ShUTKo4nQ==} '@lit/reactive-element@2.0.4': resolution: {integrity: sha512-GFn91inaUa2oHLak8awSIigYz0cU0Payr1rcFsrkf5OJ5eSPxElyZfKh0f2p9FsTiZWXQdWGJeXZICEfXXYSXQ==} @@ -408,127 +408,145 @@ packages: resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} - '@rive-app/canvas@2.25.3': - resolution: {integrity: sha512-L/uF7/o14yW1hRad+Pt1gmIxVjmp7HYtBZmHR9XzC0BBwUyqMr5S1c/x8dHa4PbvljHwI1TrTU+drCCScZfRnQ==} + '@rive-app/canvas@2.25.4': + resolution: {integrity: sha512-g0z2ldp77gQr8J2ePmDROq1//8ZWeLZX1myCBDrDs3TJ/tFVuBoLCo3Oa2YrLlT99jrJJU2RhPwvV3otHdn3Cw==} - '@rollup/rollup-android-arm-eabi@4.29.1': - resolution: {integrity: sha512-ssKhA8RNltTZLpG6/QNkCSge+7mBQGUqJRisZ2MDQcEGaK93QESEgWK2iOpIDZ7k9zPVkG5AS3ksvD5ZWxmItw==} + '@rollup/rollup-android-arm-eabi@4.30.1': + resolution: {integrity: sha512-pSWY+EVt3rJ9fQ3IqlrEUtXh3cGqGtPDH1FQlNZehO2yYxCHEX1SPsz1M//NXwYfbTlcKr9WObLnJX9FsS9K1Q==} cpu: [arm] os: [android] - '@rollup/rollup-android-arm64@4.29.1': - resolution: {integrity: sha512-CaRfrV0cd+NIIcVVN/jx+hVLN+VRqnuzLRmfmlzpOzB87ajixsN/+9L5xNmkaUUvEbI5BmIKS+XTwXsHEb65Ew==} + '@rollup/rollup-android-arm64@4.30.1': + resolution: {integrity: sha512-/NA2qXxE3D/BRjOJM8wQblmArQq1YoBVJjrjoTSBS09jgUisq7bqxNHJ8kjCHeV21W/9WDGwJEWSN0KQ2mtD/w==} cpu: [arm64] os: [android] - '@rollup/rollup-darwin-arm64@4.29.1': - resolution: {integrity: sha512-2ORr7T31Y0Mnk6qNuwtyNmy14MunTAMx06VAPI6/Ju52W10zk1i7i5U3vlDRWjhOI5quBcrvhkCHyF76bI7kEw==} + '@rollup/rollup-darwin-arm64@4.30.1': + resolution: {integrity: sha512-r7FQIXD7gB0WJ5mokTUgUWPl0eYIH0wnxqeSAhuIwvnnpjdVB8cRRClyKLQr7lgzjctkbp5KmswWszlwYln03Q==} cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-x64@4.29.1': - resolution: {integrity: sha512-j/Ej1oanzPjmN0tirRd5K2/nncAhS9W6ICzgxV+9Y5ZsP0hiGhHJXZ2JQ53iSSjj8m6cRY6oB1GMzNn2EUt6Ng==} + '@rollup/rollup-darwin-x64@4.30.1': + resolution: {integrity: sha512-x78BavIwSH6sqfP2xeI1hd1GpHL8J4W2BXcVM/5KYKoAD3nNsfitQhvWSw+TFtQTLZ9OmlF+FEInEHyubut2OA==} cpu: [x64] os: [darwin] - '@rollup/rollup-freebsd-arm64@4.29.1': - resolution: {integrity: sha512-91C//G6Dm/cv724tpt7nTyP+JdN12iqeXGFM1SqnljCmi5yTXriH7B1r8AD9dAZByHpKAumqP1Qy2vVNIdLZqw==} + '@rollup/rollup-freebsd-arm64@4.30.1': + resolution: {integrity: sha512-HYTlUAjbO1z8ywxsDFWADfTRfTIIy/oUlfIDmlHYmjUP2QRDTzBuWXc9O4CXM+bo9qfiCclmHk1x4ogBjOUpUQ==} cpu: [arm64] os: [freebsd] - '@rollup/rollup-freebsd-x64@4.29.1': - resolution: {integrity: sha512-hEioiEQ9Dec2nIRoeHUP6hr1PSkXzQaCUyqBDQ9I9ik4gCXQZjJMIVzoNLBRGet+hIUb3CISMh9KXuCcWVW/8w==} + '@rollup/rollup-freebsd-x64@4.30.1': + resolution: {integrity: sha512-1MEdGqogQLccphhX5myCJqeGNYTNcmTyaic9S7CG3JhwuIByJ7J05vGbZxsizQthP1xpVx7kd3o31eOogfEirw==} cpu: [x64] os: [freebsd] - '@rollup/rollup-linux-arm-gnueabihf@4.29.1': - resolution: {integrity: sha512-Py5vFd5HWYN9zxBv3WMrLAXY3yYJ6Q/aVERoeUFwiDGiMOWsMs7FokXihSOaT/PMWUty/Pj60XDQndK3eAfE6A==} + '@rollup/rollup-linux-arm-gnueabihf@4.30.1': + resolution: {integrity: sha512-PaMRNBSqCx7K3Wc9QZkFx5+CX27WFpAMxJNiYGAXfmMIKC7jstlr32UhTgK6T07OtqR+wYlWm9IxzennjnvdJg==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm-musleabihf@4.29.1': - resolution: {integrity: sha512-RiWpGgbayf7LUcuSNIbahr0ys2YnEERD4gYdISA06wa0i8RALrnzflh9Wxii7zQJEB2/Eh74dX4y/sHKLWp5uQ==} + '@rollup/rollup-linux-arm-musleabihf@4.30.1': + resolution: {integrity: sha512-B8Rcyj9AV7ZlEFqvB5BubG5iO6ANDsRKlhIxySXcF1axXYUyqwBok+XZPgIYGBgs7LDXfWfifxhw0Ik57T0Yug==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm64-gnu@4.29.1': - resolution: {integrity: sha512-Z80O+taYxTQITWMjm/YqNoe9d10OX6kDh8X5/rFCMuPqsKsSyDilvfg+vd3iXIqtfmp+cnfL1UrYirkaF8SBZA==} + '@rollup/rollup-linux-arm64-gnu@4.30.1': + resolution: {integrity: sha512-hqVyueGxAj3cBKrAI4aFHLV+h0Lv5VgWZs9CUGqr1z0fZtlADVV1YPOij6AhcK5An33EXaxnDLmJdQikcn5NEw==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-arm64-musl@4.29.1': - resolution: {integrity: sha512-fOHRtF9gahwJk3QVp01a/GqS4hBEZCV1oKglVVq13kcK3NeVlS4BwIFzOHDbmKzt3i0OuHG4zfRP0YoG5OF/rA==} + '@rollup/rollup-linux-arm64-musl@4.30.1': + resolution: {integrity: sha512-i4Ab2vnvS1AE1PyOIGp2kXni69gU2DAUVt6FSXeIqUCPIR3ZlheMW3oP2JkukDfu3PsexYRbOiJrY+yVNSk9oA==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-loongarch64-gnu@4.29.1': - resolution: {integrity: sha512-5a7q3tnlbcg0OodyxcAdrrCxFi0DgXJSoOuidFUzHZ2GixZXQs6Tc3CHmlvqKAmOs5eRde+JJxeIf9DonkmYkw==} + '@rollup/rollup-linux-loongarch64-gnu@4.30.1': + resolution: {integrity: sha512-fARcF5g296snX0oLGkVxPmysetwUk2zmHcca+e9ObOovBR++9ZPOhqFUM61UUZ2EYpXVPN1redgqVoBB34nTpQ==} cpu: [loong64] os: [linux] - '@rollup/rollup-linux-powerpc64le-gnu@4.29.1': - resolution: {integrity: sha512-9b4Mg5Yfz6mRnlSPIdROcfw1BU22FQxmfjlp/CShWwO3LilKQuMISMTtAu/bxmmrE6A902W2cZJuzx8+gJ8e9w==} + '@rollup/rollup-linux-powerpc64le-gnu@4.30.1': + resolution: {integrity: sha512-GLrZraoO3wVT4uFXh67ElpwQY0DIygxdv0BNW9Hkm3X34wu+BkqrDrkcsIapAY+N2ATEbvak0XQ9gxZtCIA5Rw==} cpu: [ppc64] os: [linux] - '@rollup/rollup-linux-riscv64-gnu@4.29.1': - resolution: {integrity: sha512-G5pn0NChlbRM8OJWpJFMX4/i8OEU538uiSv0P6roZcbpe/WfhEO+AT8SHVKfp8qhDQzaz7Q+1/ixMy7hBRidnQ==} + '@rollup/rollup-linux-riscv64-gnu@4.30.1': + resolution: {integrity: sha512-0WKLaAUUHKBtll0wvOmh6yh3S0wSU9+yas923JIChfxOaaBarmb/lBKPF0w/+jTVozFnOXJeRGZ8NvOxvk/jcw==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-s390x-gnu@4.29.1': - resolution: {integrity: sha512-WM9lIkNdkhVwiArmLxFXpWndFGuOka4oJOZh8EP3Vb8q5lzdSCBuhjavJsw68Q9AKDGeOOIHYzYm4ZFvmWez5g==} + '@rollup/rollup-linux-s390x-gnu@4.30.1': + resolution: {integrity: sha512-GWFs97Ruxo5Bt+cvVTQkOJ6TIx0xJDD/bMAOXWJg8TCSTEK8RnFeOeiFTxKniTc4vMIaWvCplMAFBt9miGxgkA==} cpu: [s390x] os: [linux] - '@rollup/rollup-linux-x64-gnu@4.29.1': - resolution: {integrity: sha512-87xYCwb0cPGZFoGiErT1eDcssByaLX4fc0z2nRM6eMtV9njAfEE6OW3UniAoDhX4Iq5xQVpE6qO9aJbCFumKYQ==} + '@rollup/rollup-linux-x64-gnu@4.30.1': + resolution: {integrity: sha512-UtgGb7QGgXDIO+tqqJ5oZRGHsDLO8SlpE4MhqpY9Llpzi5rJMvrK6ZGhsRCST2abZdBqIBeXW6WPD5fGK5SDwg==} cpu: [x64] os: [linux] - '@rollup/rollup-linux-x64-musl@4.29.1': - resolution: {integrity: sha512-xufkSNppNOdVRCEC4WKvlR1FBDyqCSCpQeMMgv9ZyXqqtKBfkw1yfGMTUTs9Qsl6WQbJnsGboWCp7pJGkeMhKA==} + '@rollup/rollup-linux-x64-musl@4.30.1': + resolution: {integrity: sha512-V9U8Ey2UqmQsBT+xTOeMzPzwDzyXmnAoO4edZhL7INkwQcaW1Ckv3WJX3qrrp/VHaDkEWIBWhRwP47r8cdrOow==} cpu: [x64] os: [linux] - '@rollup/rollup-win32-arm64-msvc@4.29.1': - resolution: {integrity: sha512-F2OiJ42m77lSkizZQLuC+jiZ2cgueWQL5YC9tjo3AgaEw+KJmVxHGSyQfDUoYR9cci0lAywv2Clmckzulcq6ig==} + '@rollup/rollup-win32-arm64-msvc@4.30.1': + resolution: {integrity: sha512-WabtHWiPaFF47W3PkHnjbmWawnX/aE57K47ZDT1BXTS5GgrBUEpvOzq0FI0V/UYzQJgdb8XlhVNH8/fwV8xDjw==} cpu: [arm64] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.29.1': - resolution: {integrity: sha512-rYRe5S0FcjlOBZQHgbTKNrqxCBUmgDJem/VQTCcTnA2KCabYSWQDrytOzX7avb79cAAweNmMUb/Zw18RNd4mng==} + '@rollup/rollup-win32-ia32-msvc@4.30.1': + resolution: {integrity: sha512-pxHAU+Zv39hLUTdQQHUVHf4P+0C47y/ZloorHpzs2SXMRqeAWmGghzAhfOlzFHHwjvgokdFAhC4V+6kC1lRRfw==} cpu: [ia32] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.29.1': - resolution: {integrity: sha512-+10CMg9vt1MoHj6x1pxyjPSMjHTIlqs8/tBztXvPAx24SKs9jwVnKqHJumlH/IzhaPUaj3T6T6wfZr8okdXaIg==} + '@rollup/rollup-win32-x64-msvc@4.30.1': + resolution: {integrity: sha512-D6qjsXGcvhTjv0kI4fU8tUuBDF/Ueee4SVX79VfNDXZa64TfCW1Slkb6Z7O1p7vflqZjcmOVdZlqf8gvJxc6og==} cpu: [x64] os: [win32] - '@shikijs/core@1.25.1': - resolution: {integrity: sha512-0j5k3ZkLTQViOuNzPVyWGoW1zgH3kiFdUT/JOCkTm7TU74mz+dF+NID+YoiCBzHQxgsDpcGYPjKDJRcuVLSt4A==} + '@shikijs/core@1.26.2': + resolution: {integrity: sha512-ORyu3MrY7dCC7FDLDsFSkBM9b/AT9/Y8rH+UQ07Rtek48pp0ZhQOMPTKolqszP4bBCas6FqTZQYt18BBamVl/g==} - '@shikijs/engine-javascript@1.25.1': - resolution: {integrity: sha512-zQ7UWKnRCfD/Q1M+XOSyjsbhpE0qv8LUnmn82HYCeOsgAHgUZGEDIQ63bbuK3kU5sQg+2CtI+dPfOqD/mjSY9w==} + '@shikijs/core@1.27.0': + resolution: {integrity: sha512-2RkIwaXVWxJQQw8JvqikTVe4gBxS3elH3qF3b7Ews1KdJc+TH9/nsVEftrtPn0bLOkdlMaGj5H2RBHpfWmRIcA==} - '@shikijs/engine-oniguruma@1.25.1': - resolution: {integrity: sha512-iKPMh3H+0USHtWfZ1irfMTH6tGmIUFSnqt3E2K8BgI1VEsqiPh0RYkG2WTwzNiM1/WHN4FzYx/nrKR7PDHiRyw==} + '@shikijs/engine-javascript@1.26.2': + resolution: {integrity: sha512-ngkIu9swLVo9Zt5QBtz5Sk08vmPcwuj01r7pPK/Zjmo2U2WyKMK4WMUMmkdQiUacdcLth0zt8u1onp4zhkFXKQ==} - '@shikijs/langs@1.25.1': - resolution: {integrity: sha512-hdYjq9aRJplAzGe2qF51PR9IDgEoyGb4IkXvr3Ts6lEdg4Z8M/kdknKRo2EIuv3IR/aKkJXTlBQRM+wr3t20Ew==} + '@shikijs/engine-javascript@1.27.0': + resolution: {integrity: sha512-1nzz37go+wb6uR97QSRtU4GEwx99efuucB6QI4R682wmPbti6LeWe5VcMNy8LJJt02GEYcZeJK6Lvq8YXBVNXA==} - '@shikijs/themes@1.25.1': - resolution: {integrity: sha512-JO0lDn4LgGqg5QKvgich5ScUmC2okK+LxM9a3iLUH7YMeI2c8UGXThuJv6sZduS7pdJbYQHPrvWq9t/V4GhpbQ==} + '@shikijs/engine-oniguruma@1.26.2': + resolution: {integrity: sha512-mlN7Qrs+w60nKrd7at7XkXSwz6728Pe34taDmHrG6LRHjzCqQ+ysg+/AT6/D2LMk0s2lsr71DjpI73430QP4/w==} - '@shikijs/transformers@1.25.1': - resolution: {integrity: sha512-uIwVJk9NnoHtEyF0zeL6kDygNh1FDkFXJvKOGieiilS1qa8KHtOwG2hGYOLkFjd2FRMhZSJKjOC94PCzY5xR+w==} + '@shikijs/engine-oniguruma@1.27.0': + resolution: {integrity: sha512-x1XMJvQuToX2KhESav2cnaTFDEwpJ1bcczaXy8wlRWhPVVAGR/MxlWnJbhHFe+ETerQgdpLZN8l+EgO0rVfEFQ==} - '@shikijs/types@1.25.1': - resolution: {integrity: sha512-dceqFUoO95eY4tpOj3OGq8wE8EgJ4ey6Me1HQEu5UbwIYszFndEll/bjlB8Kp9wl4fx3uM7n4+y9XCYuDBmcXA==} + '@shikijs/langs@1.26.2': + resolution: {integrity: sha512-o5cdPycB2Kw3IgncHxWopWPiTkjAj7dG01fLkkUyj3glb5ftxL/Opecq9F54opMlrgXy7ZIqDERvFLlUzsCOuA==} - '@shikijs/vscode-textmate@9.3.1': - resolution: {integrity: sha512-79QfK1393x9Ho60QFyLti+QfdJzRQCVLFb97kOIV7Eo9vQU/roINgk7m24uv0a7AUvN//RDH36FLjjK48v0s9g==} + '@shikijs/langs@1.27.0': + resolution: {integrity: sha512-6fBE0OL17XGYlNj8IuHfKtTALLk6+CVAXw8Rj2y/K8NP646/hows9+XwzIFcvFo3wZ0fPAcPKQ9pwG6a1FBevw==} + + '@shikijs/themes@1.26.2': + resolution: {integrity: sha512-y4Pn6PM5mODz/e3yF6jAUG7WLKJzqL2tJ5qMJCUkMUB1VRgtQVvoa1cHh7NScryGXyrYGJ8nPnRDhdv2rw0xpA==} + + '@shikijs/themes@1.27.0': + resolution: {integrity: sha512-L21LFq8hdsrBUXLh0fxKRURwE1brSlofK3Onutpwk71/EddfPqv60PG+Cg/KawPi8B04Mwp66EWw1shQjcYfBQ==} + + '@shikijs/transformers@1.26.2': + resolution: {integrity: sha512-nAwivOhYDKudYsX9xOmA9ekkqYv+Q/IadX5ca0nV7qPTN+wf/tXHrjxVmJJlsEVtakCEuMR0a0AVL+V9QZxi7w==} + + '@shikijs/types@1.26.2': + resolution: {integrity: sha512-PO2jucx2FIdlLBPYbIUlMtWSLs5ulcRcuV93cR3T65lkK5SJP4MGBRt9kmWGXiQc0f7+FHj/0BEawditZcI/fQ==} + + '@shikijs/types@1.27.0': + resolution: {integrity: sha512-oOJdIeOnGo+hbM7MH+Ejpksse2ASex4DVHdvBoKyY3+26GEzG9PwM85BeXNGxUZuVxtVKo43sZl0qtJs/K2Zow==} + + '@shikijs/vscode-textmate@10.0.1': + resolution: {integrity: sha512-fTIQwLF+Qhuws31iw7Ncl1R3HUDtGwIipiJ9iU+UsDUwMhegFcQKQHd51nZjb7CArq0MvON8rbgCGQYWHUKAdg==} '@types/estree@1.0.6': resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} @@ -579,14 +597,14 @@ packages: '@vue/compiler-ssr@3.5.13': resolution: {integrity: sha512-wMH6vrYHxQl/IybKJagqbquvxpWCuVYpoUJfCqFZwa/JY1GdATAQ+TgVtgrwwMZ0D07QhA99rs/EAAWfvG6KpA==} - '@vue/devtools-api@7.6.8': - resolution: {integrity: sha512-ma6dY/sZR36zALVsV1W7eC57c6IJPXsy8SNgZn1PLVWU4z4dPn5TIBmnF4stmdJ4sQcixqKaQ8pwjbMPzEZwiA==} + '@vue/devtools-api@7.7.0': + resolution: {integrity: sha512-bHEv6kT85BHtyGgDhE07bAUMAy7zpv6nnR004nSTd0wWMrAOtcrYoXO5iyr20Hkf5jR8obQOfS3byW+I3l2CCA==} - '@vue/devtools-kit@7.6.8': - resolution: {integrity: sha512-JhJ8M3sPU+v0P2iZBF2DkdmR9L0dnT5RXJabJqX6o8KtFs3tebdvfoXV2Dm3BFuqeECuMJIfF1aCzSt+WQ4wrw==} + '@vue/devtools-kit@7.7.0': + resolution: {integrity: sha512-5cvZ+6SA88zKC8XiuxUfqpdTwVjJbvYnQZY5NReh7qlSGPvVDjjzyEtW+gdzLXNSd8tStgOjAdMCpvDQamUXtA==} - '@vue/devtools-shared@7.6.8': - resolution: {integrity: sha512-9MBPO5Z3X1nYGFqTJyohl6Gmf/J7UNN1oicHdyzBVZP4jnhZ4c20MgtaHDIzWmHDHCMYVS5bwKxT3jxh7gOOKA==} + '@vue/devtools-shared@7.7.0': + resolution: {integrity: sha512-jtlQY26R5thQxW9YQTpXbI0HoK0Wf9Rd4ekidOkRvSy7ChfK0kIU6vvcBtjj87/EcpeOSK49fZAicaFNJcoTcQ==} '@vue/reactivity@3.5.13': resolution: {integrity: sha512-NaCwtw8o48B9I6L1zl2p41OHo/2Z4wqYGGIK1Khu5T7yxrn+ATOixn/Udn2m+6kZKB/J7cuT9DbWWhRxqixACg==} @@ -655,8 +673,8 @@ packages: '@vueuse/shared@11.3.0': resolution: {integrity: sha512-P8gSSWQeucH5821ek2mn/ciCk+MS/zoRKqdQIM3bHq6p7GXDAJLmnRRKmF5F65sAVJIfzQlwR3aDzwCn10s8hA==} - algoliasearch@5.18.0: - resolution: {integrity: sha512-/tfpK2A4FpS0o+S78o3YSdlqXr0MavJIDlFK3XZrlXLy7vaRXJvW5jYg3v5e/wCaF8y0IpMjkYLhoV6QqfpOgw==} + algoliasearch@5.19.0: + resolution: {integrity: sha512-zrLtGhC63z3sVLDDKGW+SlCRN9eJHFTgdEmoAOpsVh6wgGL1GgTTDou7tpCBjevzgIvi3AIyDAQO3Xjbg5eqZg==} engines: {node: '>= 14.0.0'} ansi-regex@5.0.1: @@ -781,8 +799,8 @@ packages: resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} engines: {node: '>=8'} - focus-trap@7.6.2: - resolution: {integrity: sha512-9FhUxK1hVju2+AiQIDJ5Dd//9R2n2RAfJ0qfhF4IHGHgcoEUTMpbTeG/zbEuwaiYXfuAH6XE0/aCyxDdRM+W5w==} + focus-trap@7.6.4: + resolution: {integrity: sha512-xx560wGBk7seZ6y933idtjJQc1l+ck+pI3sKvhKozdBV1dRZoKhkW5xoCaFv9tQiX5RH1xfSxjuNu6g+lmN/gw==} foreground-child@3.3.0: resolution: {integrity: sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==} @@ -953,8 +971,8 @@ packages: node-addon-api@7.1.1: resolution: {integrity: sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==} - oniguruma-to-es@0.10.0: - resolution: {integrity: sha512-zapyOUOCJxt+xhiNRPPMtfJkHGsZ98HHB9qJEkdT8BGytO/+kpe4m1Ngf0MzbzTmhacn11w9yGeDP6tzDhnCdg==} + oniguruma-to-es@1.0.0: + resolution: {integrity: sha512-kihvp0O4lFwf5tZMkfanwQLIZ9ORe9OeOFgZonH0BQeThgwfJiaZFeOfvvJVnJIM9TiVmx0RDD35hUJDR0++rQ==} package-json-from-dist@1.0.1: resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} @@ -985,8 +1003,8 @@ packages: resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} engines: {node: '>=6'} - postcss@8.4.49: - resolution: {integrity: sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==} + postcss@8.5.1: + resolution: {integrity: sha512-6oz2beyjc5VMn/KV1pPw8fliQkhBXrVn1Z3TVyqZxU8kZpzEKhBdmCFqI6ZbmGtamQvQGuU1sgPTk8ZrXDD7jQ==} engines: {node: ^10 || ^12 || >=14} preact@10.25.4: @@ -998,9 +1016,9 @@ packages: prr@1.0.1: resolution: {integrity: sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==} - readdirp@4.0.2: - resolution: {integrity: sha512-yDMz9g+VaZkqBYS/ozoBJwaBhTbZo3UNYQHNRw1D3UFQB8oHB4uS/tAODO+ZLjGWmUbKnIlOWO+aaIiAxrUWHA==} - engines: {node: '>= 14.16.0'} + readdirp@4.1.1: + resolution: {integrity: sha512-h80JrZu/MHUZCyHu5ciuoI0+WxsCxzxJTILn6Fs8rxSnFPh+UVHYfeIxK1nVGugMqkfC4vJcBOYbkfkwYK0+gw==} + engines: {node: '>= 14.18.0'} regex-recursion@5.1.1: resolution: {integrity: sha512-ae7SBCbzVNrIjgSbh7wMznPcQel1DNlDtzensnFxpiNpXt1U2ju/bHugH422r+4LAVS1FpW1YCwilmnNsjum9w==} @@ -1019,16 +1037,16 @@ packages: rfdc@1.4.1: resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==} - rollup@4.29.1: - resolution: {integrity: sha512-RaJ45M/kmJUzSWDs1Nnd5DdV4eerC98idtUOVr6FfKcgxqvjwHmxc5upLF9qZU9EpsVzzhleFahrT3shLuJzIw==} + rollup@4.30.1: + resolution: {integrity: sha512-mlJ4glW020fPuLi7DkM/lN97mYEZGWeqBnrljzN0gs7GLctqX3lNWxKQ7Gl712UAX+6fog/L3jh4gb7R6aVi3w==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true safer-buffer@2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} - sass@1.83.0: - resolution: {integrity: sha512-qsSxlayzoOjdvXMVLkzF84DJFc2HZEL/rFyGIKbbilYtAvlCxyuzUeff9LawTn4btVnLKg75Z8MMr1lxU1lfGw==} + sass@1.83.4: + resolution: {integrity: sha512-B1bozCeNQiOgDcLd33e2Cs2U60wZwjUUXzh900ZyQF5qUasvMdDZYbQ566LJu7cqR+sAHlAfO6RMkaID5s6qpA==} engines: {node: '>=14.0.0'} hasBin: true @@ -1054,8 +1072,11 @@ packages: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} - shiki@1.25.1: - resolution: {integrity: sha512-/1boRvNYwRW3GLG9Y6dXdnZ/Ha+J5T/5y3hV7TGQUcDSBM185D3FCbXlz2eTGNKG2iWCbWqo+P0yhGKZ4/CUrw==} + shiki@1.26.2: + resolution: {integrity: sha512-iP7u2NA9A6JwRRCkIUREEX2cMhlYV5EBmbbSlfSRvPThwca8HBRbVkWuNWW+kw9+i6BSUZqqG6YeUs5dC2SjZw==} + + shiki@1.27.0: + resolution: {integrity: sha512-PdrOqs36vGmftWETJJF6IJAUDS0ERYOYofHCBTHpLTvWLC8E/E6lyh+Xm1lMIZ/sBWT5uJSmri6NNW5ZDglMqQ==} signal-exit@4.1.0: resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} @@ -1227,129 +1248,129 @@ packages: snapshots: - '@algolia/autocomplete-core@1.17.7(@algolia/client-search@5.18.0)(algoliasearch@5.18.0)(search-insights@2.13.0)': + '@algolia/autocomplete-core@1.17.7(@algolia/client-search@5.19.0)(algoliasearch@5.19.0)(search-insights@2.13.0)': dependencies: - '@algolia/autocomplete-plugin-algolia-insights': 1.17.7(@algolia/client-search@5.18.0)(algoliasearch@5.18.0)(search-insights@2.13.0) - '@algolia/autocomplete-shared': 1.17.7(@algolia/client-search@5.18.0)(algoliasearch@5.18.0) + '@algolia/autocomplete-plugin-algolia-insights': 1.17.7(@algolia/client-search@5.19.0)(algoliasearch@5.19.0)(search-insights@2.13.0) + '@algolia/autocomplete-shared': 1.17.7(@algolia/client-search@5.19.0)(algoliasearch@5.19.0) transitivePeerDependencies: - '@algolia/client-search' - algoliasearch - search-insights - '@algolia/autocomplete-plugin-algolia-insights@1.17.7(@algolia/client-search@5.18.0)(algoliasearch@5.18.0)(search-insights@2.13.0)': + '@algolia/autocomplete-plugin-algolia-insights@1.17.7(@algolia/client-search@5.19.0)(algoliasearch@5.19.0)(search-insights@2.13.0)': dependencies: - '@algolia/autocomplete-shared': 1.17.7(@algolia/client-search@5.18.0)(algoliasearch@5.18.0) + '@algolia/autocomplete-shared': 1.17.7(@algolia/client-search@5.19.0)(algoliasearch@5.19.0) search-insights: 2.13.0 transitivePeerDependencies: - '@algolia/client-search' - algoliasearch - '@algolia/autocomplete-preset-algolia@1.17.7(@algolia/client-search@5.18.0)(algoliasearch@5.18.0)': + '@algolia/autocomplete-preset-algolia@1.17.7(@algolia/client-search@5.19.0)(algoliasearch@5.19.0)': dependencies: - '@algolia/autocomplete-shared': 1.17.7(@algolia/client-search@5.18.0)(algoliasearch@5.18.0) - '@algolia/client-search': 5.18.0 - algoliasearch: 5.18.0 + '@algolia/autocomplete-shared': 1.17.7(@algolia/client-search@5.19.0)(algoliasearch@5.19.0) + '@algolia/client-search': 5.19.0 + algoliasearch: 5.19.0 - '@algolia/autocomplete-shared@1.17.7(@algolia/client-search@5.18.0)(algoliasearch@5.18.0)': + '@algolia/autocomplete-shared@1.17.7(@algolia/client-search@5.19.0)(algoliasearch@5.19.0)': dependencies: - '@algolia/client-search': 5.18.0 - algoliasearch: 5.18.0 + '@algolia/client-search': 5.19.0 + algoliasearch: 5.19.0 - '@algolia/client-abtesting@5.18.0': + '@algolia/client-abtesting@5.19.0': dependencies: - '@algolia/client-common': 5.18.0 - '@algolia/requester-browser-xhr': 5.18.0 - '@algolia/requester-fetch': 5.18.0 - '@algolia/requester-node-http': 5.18.0 + '@algolia/client-common': 5.19.0 + '@algolia/requester-browser-xhr': 5.19.0 + '@algolia/requester-fetch': 5.19.0 + '@algolia/requester-node-http': 5.19.0 - '@algolia/client-analytics@5.18.0': + '@algolia/client-analytics@5.19.0': dependencies: - '@algolia/client-common': 5.18.0 - '@algolia/requester-browser-xhr': 5.18.0 - '@algolia/requester-fetch': 5.18.0 - '@algolia/requester-node-http': 5.18.0 + '@algolia/client-common': 5.19.0 + '@algolia/requester-browser-xhr': 5.19.0 + '@algolia/requester-fetch': 5.19.0 + '@algolia/requester-node-http': 5.19.0 - '@algolia/client-common@5.18.0': {} + '@algolia/client-common@5.19.0': {} - '@algolia/client-insights@5.18.0': + '@algolia/client-insights@5.19.0': dependencies: - '@algolia/client-common': 5.18.0 - '@algolia/requester-browser-xhr': 5.18.0 - '@algolia/requester-fetch': 5.18.0 - '@algolia/requester-node-http': 5.18.0 + '@algolia/client-common': 5.19.0 + '@algolia/requester-browser-xhr': 5.19.0 + '@algolia/requester-fetch': 5.19.0 + '@algolia/requester-node-http': 5.19.0 - '@algolia/client-personalization@5.18.0': + '@algolia/client-personalization@5.19.0': dependencies: - '@algolia/client-common': 5.18.0 - '@algolia/requester-browser-xhr': 5.18.0 - '@algolia/requester-fetch': 5.18.0 - '@algolia/requester-node-http': 5.18.0 + '@algolia/client-common': 5.19.0 + '@algolia/requester-browser-xhr': 5.19.0 + '@algolia/requester-fetch': 5.19.0 + '@algolia/requester-node-http': 5.19.0 - '@algolia/client-query-suggestions@5.18.0': + '@algolia/client-query-suggestions@5.19.0': dependencies: - '@algolia/client-common': 5.18.0 - '@algolia/requester-browser-xhr': 5.18.0 - '@algolia/requester-fetch': 5.18.0 - '@algolia/requester-node-http': 5.18.0 + '@algolia/client-common': 5.19.0 + '@algolia/requester-browser-xhr': 5.19.0 + '@algolia/requester-fetch': 5.19.0 + '@algolia/requester-node-http': 5.19.0 - '@algolia/client-search@5.18.0': + '@algolia/client-search@5.19.0': dependencies: - '@algolia/client-common': 5.18.0 - '@algolia/requester-browser-xhr': 5.18.0 - '@algolia/requester-fetch': 5.18.0 - '@algolia/requester-node-http': 5.18.0 + '@algolia/client-common': 5.19.0 + '@algolia/requester-browser-xhr': 5.19.0 + '@algolia/requester-fetch': 5.19.0 + '@algolia/requester-node-http': 5.19.0 - '@algolia/ingestion@1.18.0': + '@algolia/ingestion@1.19.0': dependencies: - '@algolia/client-common': 5.18.0 - '@algolia/requester-browser-xhr': 5.18.0 - '@algolia/requester-fetch': 5.18.0 - '@algolia/requester-node-http': 5.18.0 + '@algolia/client-common': 5.19.0 + '@algolia/requester-browser-xhr': 5.19.0 + '@algolia/requester-fetch': 5.19.0 + '@algolia/requester-node-http': 5.19.0 - '@algolia/monitoring@1.18.0': + '@algolia/monitoring@1.19.0': dependencies: - '@algolia/client-common': 5.18.0 - '@algolia/requester-browser-xhr': 5.18.0 - '@algolia/requester-fetch': 5.18.0 - '@algolia/requester-node-http': 5.18.0 + '@algolia/client-common': 5.19.0 + '@algolia/requester-browser-xhr': 5.19.0 + '@algolia/requester-fetch': 5.19.0 + '@algolia/requester-node-http': 5.19.0 - '@algolia/recommend@5.18.0': + '@algolia/recommend@5.19.0': dependencies: - '@algolia/client-common': 5.18.0 - '@algolia/requester-browser-xhr': 5.18.0 - '@algolia/requester-fetch': 5.18.0 - '@algolia/requester-node-http': 5.18.0 + '@algolia/client-common': 5.19.0 + '@algolia/requester-browser-xhr': 5.19.0 + '@algolia/requester-fetch': 5.19.0 + '@algolia/requester-node-http': 5.19.0 - '@algolia/requester-browser-xhr@5.18.0': + '@algolia/requester-browser-xhr@5.19.0': dependencies: - '@algolia/client-common': 5.18.0 + '@algolia/client-common': 5.19.0 - '@algolia/requester-fetch@5.18.0': + '@algolia/requester-fetch@5.19.0': dependencies: - '@algolia/client-common': 5.18.0 + '@algolia/client-common': 5.19.0 - '@algolia/requester-node-http@5.18.0': + '@algolia/requester-node-http@5.19.0': dependencies: - '@algolia/client-common': 5.18.0 + '@algolia/client-common': 5.19.0 '@babel/helper-string-parser@7.25.9': {} '@babel/helper-validator-identifier@7.25.9': {} - '@babel/parser@7.26.3': + '@babel/parser@7.26.5': dependencies: - '@babel/types': 7.26.3 + '@babel/types': 7.26.5 - '@babel/types@7.26.3': + '@babel/types@7.26.5': dependencies: '@babel/helper-string-parser': 7.25.9 '@babel/helper-validator-identifier': 7.25.9 '@docsearch/css@3.8.2': {} - '@docsearch/js@3.8.2(@algolia/client-search@5.18.0)(search-insights@2.13.0)': + '@docsearch/js@3.8.2(@algolia/client-search@5.19.0)(search-insights@2.13.0)': dependencies: - '@docsearch/react': 3.8.2(@algolia/client-search@5.18.0)(search-insights@2.13.0) + '@docsearch/react': 3.8.2(@algolia/client-search@5.19.0)(search-insights@2.13.0) preact: 10.25.4 transitivePeerDependencies: - '@algolia/client-search' @@ -1358,12 +1379,12 @@ snapshots: - react-dom - search-insights - '@docsearch/react@3.8.2(@algolia/client-search@5.18.0)(search-insights@2.13.0)': + '@docsearch/react@3.8.2(@algolia/client-search@5.19.0)(search-insights@2.13.0)': dependencies: - '@algolia/autocomplete-core': 1.17.7(@algolia/client-search@5.18.0)(algoliasearch@5.18.0)(search-insights@2.13.0) - '@algolia/autocomplete-preset-algolia': 1.17.7(@algolia/client-search@5.18.0)(algoliasearch@5.18.0) + '@algolia/autocomplete-core': 1.17.7(@algolia/client-search@5.19.0)(algoliasearch@5.19.0)(search-insights@2.13.0) + '@algolia/autocomplete-preset-algolia': 1.17.7(@algolia/client-search@5.19.0)(algoliasearch@5.19.0) '@docsearch/css': 3.8.2 - algoliasearch: 5.18.0 + algoliasearch: 5.19.0 optionalDependencies: search-insights: 2.13.0 transitivePeerDependencies: @@ -1455,7 +1476,7 @@ snapshots: dependencies: '@iconify/types': 2.0.0 - '@iconify-json/simple-icons@1.2.18': + '@iconify-json/simple-icons@1.2.20': dependencies: '@iconify/types': 2.0.0 @@ -1472,17 +1493,17 @@ snapshots: '@jridgewell/sourcemap-codec@1.5.0': {} - '@lit-labs/ssr-dom-shim@1.2.1': {} + '@lit-labs/ssr-dom-shim@1.3.0': {} '@lit/reactive-element@2.0.4': dependencies: - '@lit-labs/ssr-dom-shim': 1.2.1 + '@lit-labs/ssr-dom-shim': 1.3.0 - '@nolebase/ui@2.12.0(@algolia/client-search@5.18.0)(postcss@8.4.49)(sass@1.83.0)(search-insights@2.13.0)': + '@nolebase/ui@2.12.0(@algolia/client-search@5.19.0)(postcss@8.5.1)(sass@1.83.4)(search-insights@2.13.0)': dependencies: '@iconify-json/octicon': 1.2.2 less: 4.2.1 - vitepress: 1.5.0(@algolia/client-search@5.18.0)(less@4.2.1)(postcss@8.4.49)(sass@1.83.0)(search-insights@2.13.0) + vitepress: 1.5.0(@algolia/client-search@5.19.0)(less@4.2.1)(postcss@8.5.1)(sass@1.83.4)(search-insights@2.13.0) vue: 3.5.13 transitivePeerDependencies: - '@algolia/client-search' @@ -1513,13 +1534,13 @@ snapshots: - typescript - universal-cookie - '@nolebase/vitepress-plugin-enhanced-readabilities@2.12.0(@algolia/client-search@5.18.0)(postcss@8.4.49)(sass@1.83.0)(search-insights@2.13.0)': + '@nolebase/vitepress-plugin-enhanced-readabilities@2.12.0(@algolia/client-search@5.19.0)(postcss@8.5.1)(sass@1.83.4)(search-insights@2.13.0)': dependencies: '@iconify-json/carbon': 1.2.5 '@iconify-json/icon-park-outline': 1.2.2 - '@nolebase/ui': 2.12.0(@algolia/client-search@5.18.0)(postcss@8.4.49)(sass@1.83.0)(search-insights@2.13.0) + '@nolebase/ui': 2.12.0(@algolia/client-search@5.19.0)(postcss@8.5.1)(sass@1.83.4)(search-insights@2.13.0) less: 4.2.1 - vitepress: 1.5.0(@algolia/client-search@5.18.0)(less@4.2.1)(postcss@8.4.49)(sass@1.83.0)(search-insights@2.13.0) + vitepress: 1.5.0(@algolia/client-search@5.19.0)(less@4.2.1)(postcss@8.5.1)(sass@1.83.4)(search-insights@2.13.0) transitivePeerDependencies: - '@algolia/client-search' - '@types/node' @@ -1613,103 +1634,136 @@ snapshots: '@pkgjs/parseargs@0.11.0': optional: true - '@rive-app/canvas@2.25.3': {} + '@rive-app/canvas@2.25.4': {} - '@rollup/rollup-android-arm-eabi@4.29.1': + '@rollup/rollup-android-arm-eabi@4.30.1': optional: true - '@rollup/rollup-android-arm64@4.29.1': + '@rollup/rollup-android-arm64@4.30.1': optional: true - '@rollup/rollup-darwin-arm64@4.29.1': + '@rollup/rollup-darwin-arm64@4.30.1': optional: true - '@rollup/rollup-darwin-x64@4.29.1': + '@rollup/rollup-darwin-x64@4.30.1': optional: true - '@rollup/rollup-freebsd-arm64@4.29.1': + '@rollup/rollup-freebsd-arm64@4.30.1': optional: true - '@rollup/rollup-freebsd-x64@4.29.1': + '@rollup/rollup-freebsd-x64@4.30.1': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.29.1': + '@rollup/rollup-linux-arm-gnueabihf@4.30.1': optional: true - '@rollup/rollup-linux-arm-musleabihf@4.29.1': + '@rollup/rollup-linux-arm-musleabihf@4.30.1': optional: true - '@rollup/rollup-linux-arm64-gnu@4.29.1': + '@rollup/rollup-linux-arm64-gnu@4.30.1': optional: true - '@rollup/rollup-linux-arm64-musl@4.29.1': + '@rollup/rollup-linux-arm64-musl@4.30.1': optional: true - '@rollup/rollup-linux-loongarch64-gnu@4.29.1': + '@rollup/rollup-linux-loongarch64-gnu@4.30.1': optional: true - '@rollup/rollup-linux-powerpc64le-gnu@4.29.1': + '@rollup/rollup-linux-powerpc64le-gnu@4.30.1': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.29.1': + '@rollup/rollup-linux-riscv64-gnu@4.30.1': optional: true - '@rollup/rollup-linux-s390x-gnu@4.29.1': + '@rollup/rollup-linux-s390x-gnu@4.30.1': optional: true - '@rollup/rollup-linux-x64-gnu@4.29.1': + '@rollup/rollup-linux-x64-gnu@4.30.1': optional: true - '@rollup/rollup-linux-x64-musl@4.29.1': + '@rollup/rollup-linux-x64-musl@4.30.1': optional: true - '@rollup/rollup-win32-arm64-msvc@4.29.1': + '@rollup/rollup-win32-arm64-msvc@4.30.1': optional: true - '@rollup/rollup-win32-ia32-msvc@4.29.1': + '@rollup/rollup-win32-ia32-msvc@4.30.1': optional: true - '@rollup/rollup-win32-x64-msvc@4.29.1': + '@rollup/rollup-win32-x64-msvc@4.30.1': optional: true - '@shikijs/core@1.25.1': + '@shikijs/core@1.26.2': + dependencies: + '@shikijs/engine-javascript': 1.26.2 + '@shikijs/engine-oniguruma': 1.26.2 + '@shikijs/types': 1.26.2 + '@shikijs/vscode-textmate': 10.0.1 + '@types/hast': 3.0.4 + hast-util-to-html: 9.0.4 + + '@shikijs/core@1.27.0': dependencies: - '@shikijs/engine-javascript': 1.25.1 - '@shikijs/engine-oniguruma': 1.25.1 - '@shikijs/types': 1.25.1 - '@shikijs/vscode-textmate': 9.3.1 + '@shikijs/engine-javascript': 1.27.0 + '@shikijs/engine-oniguruma': 1.27.0 + '@shikijs/types': 1.27.0 + '@shikijs/vscode-textmate': 10.0.1 '@types/hast': 3.0.4 hast-util-to-html: 9.0.4 - '@shikijs/engine-javascript@1.25.1': + '@shikijs/engine-javascript@1.26.2': + dependencies: + '@shikijs/types': 1.26.2 + '@shikijs/vscode-textmate': 10.0.1 + oniguruma-to-es: 1.0.0 + + '@shikijs/engine-javascript@1.27.0': + dependencies: + '@shikijs/types': 1.27.0 + '@shikijs/vscode-textmate': 10.0.1 + oniguruma-to-es: 1.0.0 + + '@shikijs/engine-oniguruma@1.26.2': + dependencies: + '@shikijs/types': 1.26.2 + '@shikijs/vscode-textmate': 10.0.1 + + '@shikijs/engine-oniguruma@1.27.0': + dependencies: + '@shikijs/types': 1.27.0 + '@shikijs/vscode-textmate': 10.0.1 + + '@shikijs/langs@1.26.2': dependencies: - '@shikijs/types': 1.25.1 - '@shikijs/vscode-textmate': 9.3.1 - oniguruma-to-es: 0.10.0 + '@shikijs/types': 1.26.2 - '@shikijs/engine-oniguruma@1.25.1': + '@shikijs/langs@1.27.0': dependencies: - '@shikijs/types': 1.25.1 - '@shikijs/vscode-textmate': 9.3.1 + '@shikijs/types': 1.27.0 - '@shikijs/langs@1.25.1': + '@shikijs/themes@1.26.2': dependencies: - '@shikijs/types': 1.25.1 + '@shikijs/types': 1.26.2 - '@shikijs/themes@1.25.1': + '@shikijs/themes@1.27.0': dependencies: - '@shikijs/types': 1.25.1 + '@shikijs/types': 1.27.0 - '@shikijs/transformers@1.25.1': + '@shikijs/transformers@1.26.2': dependencies: - shiki: 1.25.1 + shiki: 1.26.2 - '@shikijs/types@1.25.1': + '@shikijs/types@1.26.2': dependencies: - '@shikijs/vscode-textmate': 9.3.1 + '@shikijs/vscode-textmate': 10.0.1 '@types/hast': 3.0.4 - '@shikijs/vscode-textmate@9.3.1': {} + '@shikijs/types@1.27.0': + dependencies: + '@shikijs/vscode-textmate': 10.0.1 + '@types/hast': 3.0.4 + + '@shikijs/vscode-textmate@10.0.1': {} '@types/estree@1.0.6': {} @@ -1738,14 +1792,14 @@ snapshots: '@ungap/structured-clone@1.2.1': {} - '@vitejs/plugin-vue@5.2.1(vite@5.4.11(less@4.2.1)(sass@1.83.0))(vue@3.5.13)': + '@vitejs/plugin-vue@5.2.1(vite@5.4.11(less@4.2.1)(sass@1.83.4))(vue@3.5.13)': dependencies: - vite: 5.4.11(less@4.2.1)(sass@1.83.0) + vite: 5.4.11(less@4.2.1)(sass@1.83.4) vue: 3.5.13 '@vue/compiler-core@3.5.13': dependencies: - '@babel/parser': 7.26.3 + '@babel/parser': 7.26.5 '@vue/shared': 3.5.13 entities: 4.5.0 estree-walker: 2.0.2 @@ -1758,14 +1812,14 @@ snapshots: '@vue/compiler-sfc@3.5.13': dependencies: - '@babel/parser': 7.26.3 + '@babel/parser': 7.26.5 '@vue/compiler-core': 3.5.13 '@vue/compiler-dom': 3.5.13 '@vue/compiler-ssr': 3.5.13 '@vue/shared': 3.5.13 estree-walker: 2.0.2 magic-string: 0.30.17 - postcss: 8.4.49 + postcss: 8.5.1 source-map-js: 1.2.1 '@vue/compiler-ssr@3.5.13': @@ -1773,13 +1827,13 @@ snapshots: '@vue/compiler-dom': 3.5.13 '@vue/shared': 3.5.13 - '@vue/devtools-api@7.6.8': + '@vue/devtools-api@7.7.0': dependencies: - '@vue/devtools-kit': 7.6.8 + '@vue/devtools-kit': 7.7.0 - '@vue/devtools-kit@7.6.8': + '@vue/devtools-kit@7.7.0': dependencies: - '@vue/devtools-shared': 7.6.8 + '@vue/devtools-shared': 7.7.0 birpc: 0.2.19 hookable: 5.5.3 mitt: 3.0.1 @@ -1787,7 +1841,7 @@ snapshots: speakingurl: 14.0.1 superjson: 2.2.2 - '@vue/devtools-shared@7.6.8': + '@vue/devtools-shared@7.7.0': dependencies: rfdc: 1.4.1 @@ -1825,13 +1879,13 @@ snapshots: - '@vue/composition-api' - vue - '@vueuse/integrations@11.3.0(focus-trap@7.6.2)(vue@3.5.13)': + '@vueuse/integrations@11.3.0(focus-trap@7.6.4)(vue@3.5.13)': dependencies: '@vueuse/core': 11.3.0(vue@3.5.13) '@vueuse/shared': 11.3.0(vue@3.5.13) vue-demi: 0.14.10(vue@3.5.13) optionalDependencies: - focus-trap: 7.6.2 + focus-trap: 7.6.4 transitivePeerDependencies: - '@vue/composition-api' - vue @@ -1845,21 +1899,21 @@ snapshots: - '@vue/composition-api' - vue - algoliasearch@5.18.0: - dependencies: - '@algolia/client-abtesting': 5.18.0 - '@algolia/client-analytics': 5.18.0 - '@algolia/client-common': 5.18.0 - '@algolia/client-insights': 5.18.0 - '@algolia/client-personalization': 5.18.0 - '@algolia/client-query-suggestions': 5.18.0 - '@algolia/client-search': 5.18.0 - '@algolia/ingestion': 1.18.0 - '@algolia/monitoring': 1.18.0 - '@algolia/recommend': 5.18.0 - '@algolia/requester-browser-xhr': 5.18.0 - '@algolia/requester-fetch': 5.18.0 - '@algolia/requester-node-http': 5.18.0 + algoliasearch@5.19.0: + dependencies: + '@algolia/client-abtesting': 5.19.0 + '@algolia/client-analytics': 5.19.0 + '@algolia/client-common': 5.19.0 + '@algolia/client-insights': 5.19.0 + '@algolia/client-personalization': 5.19.0 + '@algolia/client-query-suggestions': 5.19.0 + '@algolia/client-search': 5.19.0 + '@algolia/ingestion': 1.19.0 + '@algolia/monitoring': 1.19.0 + '@algolia/recommend': 5.19.0 + '@algolia/requester-browser-xhr': 5.19.0 + '@algolia/requester-fetch': 5.19.0 + '@algolia/requester-node-http': 5.19.0 ansi-regex@5.0.1: {} @@ -1896,7 +1950,7 @@ snapshots: chokidar@4.0.3: dependencies: - readdirp: 4.0.2 + readdirp: 4.1.1 color-convert@2.0.1: dependencies: @@ -1985,7 +2039,7 @@ snapshots: to-regex-range: 5.0.1 optional: true - focus-trap@7.6.2: + focus-trap@7.6.4: dependencies: tabbable: 6.2.0 @@ -2102,7 +2156,7 @@ snapshots: lit-element@4.1.1: dependencies: - '@lit-labs/ssr-dom-shim': 1.2.1 + '@lit-labs/ssr-dom-shim': 1.3.0 '@lit/reactive-element': 2.0.4 lit-html: 3.2.1 @@ -2189,7 +2243,7 @@ snapshots: node-addon-api@7.1.1: optional: true - oniguruma-to-es@0.10.0: + oniguruma-to-es@1.0.0: dependencies: emoji-regex-xs: 1.0.0 regex: 5.1.1 @@ -2216,7 +2270,7 @@ snapshots: pify@4.0.1: optional: true - postcss@8.4.49: + postcss@8.5.1: dependencies: nanoid: 3.3.8 picocolors: 1.1.1 @@ -2229,7 +2283,7 @@ snapshots: prr@1.0.1: optional: true - readdirp@4.0.2: {} + readdirp@4.1.1: {} regex-recursion@5.1.1: dependencies: @@ -2248,35 +2302,35 @@ snapshots: rfdc@1.4.1: {} - rollup@4.29.1: + rollup@4.30.1: dependencies: '@types/estree': 1.0.6 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.29.1 - '@rollup/rollup-android-arm64': 4.29.1 - '@rollup/rollup-darwin-arm64': 4.29.1 - '@rollup/rollup-darwin-x64': 4.29.1 - '@rollup/rollup-freebsd-arm64': 4.29.1 - '@rollup/rollup-freebsd-x64': 4.29.1 - '@rollup/rollup-linux-arm-gnueabihf': 4.29.1 - '@rollup/rollup-linux-arm-musleabihf': 4.29.1 - '@rollup/rollup-linux-arm64-gnu': 4.29.1 - '@rollup/rollup-linux-arm64-musl': 4.29.1 - '@rollup/rollup-linux-loongarch64-gnu': 4.29.1 - '@rollup/rollup-linux-powerpc64le-gnu': 4.29.1 - '@rollup/rollup-linux-riscv64-gnu': 4.29.1 - '@rollup/rollup-linux-s390x-gnu': 4.29.1 - '@rollup/rollup-linux-x64-gnu': 4.29.1 - '@rollup/rollup-linux-x64-musl': 4.29.1 - '@rollup/rollup-win32-arm64-msvc': 4.29.1 - '@rollup/rollup-win32-ia32-msvc': 4.29.1 - '@rollup/rollup-win32-x64-msvc': 4.29.1 + '@rollup/rollup-android-arm-eabi': 4.30.1 + '@rollup/rollup-android-arm64': 4.30.1 + '@rollup/rollup-darwin-arm64': 4.30.1 + '@rollup/rollup-darwin-x64': 4.30.1 + '@rollup/rollup-freebsd-arm64': 4.30.1 + '@rollup/rollup-freebsd-x64': 4.30.1 + '@rollup/rollup-linux-arm-gnueabihf': 4.30.1 + '@rollup/rollup-linux-arm-musleabihf': 4.30.1 + '@rollup/rollup-linux-arm64-gnu': 4.30.1 + '@rollup/rollup-linux-arm64-musl': 4.30.1 + '@rollup/rollup-linux-loongarch64-gnu': 4.30.1 + '@rollup/rollup-linux-powerpc64le-gnu': 4.30.1 + '@rollup/rollup-linux-riscv64-gnu': 4.30.1 + '@rollup/rollup-linux-s390x-gnu': 4.30.1 + '@rollup/rollup-linux-x64-gnu': 4.30.1 + '@rollup/rollup-linux-x64-musl': 4.30.1 + '@rollup/rollup-win32-arm64-msvc': 4.30.1 + '@rollup/rollup-win32-ia32-msvc': 4.30.1 + '@rollup/rollup-win32-x64-msvc': 4.30.1 fsevents: 2.3.3 safer-buffer@2.1.2: optional: true - sass@1.83.0: + sass@1.83.4: dependencies: chokidar: 4.0.3 immutable: 5.0.3 @@ -2303,15 +2357,26 @@ snapshots: shebang-regex@3.0.0: {} - shiki@1.25.1: + shiki@1.26.2: + dependencies: + '@shikijs/core': 1.26.2 + '@shikijs/engine-javascript': 1.26.2 + '@shikijs/engine-oniguruma': 1.26.2 + '@shikijs/langs': 1.26.2 + '@shikijs/themes': 1.26.2 + '@shikijs/types': 1.26.2 + '@shikijs/vscode-textmate': 10.0.1 + '@types/hast': 3.0.4 + + shiki@1.27.0: dependencies: - '@shikijs/core': 1.25.1 - '@shikijs/engine-javascript': 1.25.1 - '@shikijs/engine-oniguruma': 1.25.1 - '@shikijs/langs': 1.25.1 - '@shikijs/themes': 1.25.1 - '@shikijs/types': 1.25.1 - '@shikijs/vscode-textmate': 9.3.1 + '@shikijs/core': 1.27.0 + '@shikijs/engine-javascript': 1.27.0 + '@shikijs/engine-oniguruma': 1.27.0 + '@shikijs/langs': 1.27.0 + '@shikijs/themes': 1.27.0 + '@shikijs/types': 1.27.0 + '@shikijs/vscode-textmate': 10.0.1 '@types/hast': 3.0.4 signal-exit@4.1.0: {} @@ -2402,15 +2467,15 @@ snapshots: '@types/unist': 3.0.3 vfile-message: 4.0.2 - vite@5.4.11(less@4.2.1)(sass@1.83.0): + vite@5.4.11(less@4.2.1)(sass@1.83.4): dependencies: esbuild: 0.21.5 - postcss: 8.4.49 - rollup: 4.29.1 + postcss: 8.5.1 + rollup: 4.30.1 optionalDependencies: fsevents: 2.3.3 less: 4.2.1 - sass: 1.83.0 + sass: 1.83.4 vitepress-plugin-comment-with-giscus@1.1.15(vue@3.5.13): dependencies: @@ -2423,28 +2488,28 @@ snapshots: glob: 10.4.5 gray-matter: 4.0.3 - vitepress@1.5.0(@algolia/client-search@5.18.0)(less@4.2.1)(postcss@8.4.49)(sass@1.83.0)(search-insights@2.13.0): + vitepress@1.5.0(@algolia/client-search@5.19.0)(less@4.2.1)(postcss@8.5.1)(sass@1.83.4)(search-insights@2.13.0): dependencies: '@docsearch/css': 3.8.2 - '@docsearch/js': 3.8.2(@algolia/client-search@5.18.0)(search-insights@2.13.0) - '@iconify-json/simple-icons': 1.2.18 - '@shikijs/core': 1.25.1 - '@shikijs/transformers': 1.25.1 - '@shikijs/types': 1.25.1 + '@docsearch/js': 3.8.2(@algolia/client-search@5.19.0)(search-insights@2.13.0) + '@iconify-json/simple-icons': 1.2.20 + '@shikijs/core': 1.27.0 + '@shikijs/transformers': 1.26.2 + '@shikijs/types': 1.27.0 '@types/markdown-it': 14.1.2 - '@vitejs/plugin-vue': 5.2.1(vite@5.4.11(less@4.2.1)(sass@1.83.0))(vue@3.5.13) - '@vue/devtools-api': 7.6.8 + '@vitejs/plugin-vue': 5.2.1(vite@5.4.11(less@4.2.1)(sass@1.83.4))(vue@3.5.13) + '@vue/devtools-api': 7.7.0 '@vue/shared': 3.5.13 '@vueuse/core': 11.3.0(vue@3.5.13) - '@vueuse/integrations': 11.3.0(focus-trap@7.6.2)(vue@3.5.13) - focus-trap: 7.6.2 + '@vueuse/integrations': 11.3.0(focus-trap@7.6.4)(vue@3.5.13) + focus-trap: 7.6.4 mark.js: 8.11.1 minisearch: 7.1.1 - shiki: 1.25.1 - vite: 5.4.11(less@4.2.1)(sass@1.83.0) + shiki: 1.27.0 + vite: 5.4.11(less@4.2.1)(sass@1.83.4) vue: 3.5.13 optionalDependencies: - postcss: 8.4.49 + postcss: 8.5.1 transitivePeerDependencies: - '@algolia/client-search' - '@types/node' diff --git a/package.json b/package.json index 777d1f4b8..6b67a9d4e 100644 --- a/package.json +++ b/package.json @@ -15,17 +15,17 @@ "alpinejs": "^3.14.8", "alpinejs-slug": "^1.1.3", "axios": "^1.7.9", - "sass": "^1.83.0", + "sass": "^1.83.4", "sortablejs": "^1.15.6", - "svelecte": "^5.1.1", - "svelte": "^5.16.0", - "svelte-check": "^4.1.1", + "svelecte": "^5.1.4", + "svelte": "^5.19.0", + "svelte-check": "^4.1.4", "svelte-i18n": "^4.0.1", - "svelte-showdown": "^0.3.0", + "svelte-showdown": "^0.4.1", "svelte-toggle": "^4.0.1", "vanilla-lazyload": "^19.1.3", - "virtual-select-plugin": "^1.0.46", - "vite": "^6.0.6", + "virtual-select-plugin": "^1.0.47", + "vite": "^6.0.7", "vite-plugin-minify": "^2.1.0", "vite-plugin-static-copy": "^2.2.0" } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 5de794509..494254e50 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -13,7 +13,7 @@ importers: version: 2.2.3 '@sveltejs/vite-plugin-svelte': specifier: ^5.0.3 - version: 5.0.3(svelte@5.16.0)(vite@6.0.6(sass-embedded@1.81.0)(sass@1.83.0)(terser@5.37.0)) + version: 5.0.3(svelte@5.19.0)(vite@6.0.7(sass-embedded@1.81.0)(sass@1.83.4)(terser@5.37.0)) alpinejs: specifier: ^3.14.8 version: 3.14.8 @@ -24,26 +24,26 @@ importers: specifier: ^1.7.9 version: 1.7.9 sass: - specifier: ^1.83.0 - version: 1.83.0 + specifier: ^1.83.4 + version: 1.83.4 sortablejs: specifier: ^1.15.6 version: 1.15.6 svelecte: - specifier: ^5.1.1 - version: 5.1.1(svelte@5.16.0) + specifier: ^5.1.4 + version: 5.1.4(svelte@5.19.0) svelte: - specifier: ^5.16.0 - version: 5.16.0 + specifier: ^5.19.0 + version: 5.19.0 svelte-check: - specifier: ^4.1.1 - version: 4.1.1(svelte@5.16.0)(typescript@5.7.2) + specifier: ^4.1.4 + version: 4.1.4(svelte@5.19.0)(typescript@5.7.2) svelte-i18n: specifier: ^4.0.1 - version: 4.0.1(svelte@5.16.0) + version: 4.0.1(svelte@5.19.0) svelte-showdown: - specifier: ^0.3.0 - version: 0.3.0(svelte@5.16.0) + specifier: ^0.4.1 + version: 0.4.1(svelte@5.19.0) svelte-toggle: specifier: ^4.0.1 version: 4.0.1 @@ -51,17 +51,17 @@ importers: specifier: ^19.1.3 version: 19.1.3 virtual-select-plugin: - specifier: ^1.0.46 - version: 1.0.46 + specifier: ^1.0.47 + version: 1.0.47 vite: - specifier: ^6.0.6 - version: 6.0.6(sass-embedded@1.81.0)(sass@1.83.0)(terser@5.37.0) + specifier: ^6.0.7 + version: 6.0.7(sass-embedded@1.81.0)(sass@1.83.4)(terser@5.37.0) vite-plugin-minify: specifier: ^2.1.0 - version: 2.1.0(vite@6.0.6(sass-embedded@1.81.0)(sass@1.83.0)(terser@5.37.0)) + version: 2.1.0(vite@6.0.7(sass-embedded@1.81.0)(sass@1.83.4)(terser@5.37.0)) vite-plugin-static-copy: specifier: ^2.2.0 - version: 2.2.0(vite@6.0.6(sass-embedded@1.81.0)(sass@1.83.0)(terser@5.37.0)) + version: 2.2.0(vite@6.0.7(sass-embedded@1.81.0)(sass@1.83.4)(terser@5.37.0)) packages: @@ -360,20 +360,20 @@ packages: cpu: [x64] os: [win32] - '@formatjs/ecma402-abstract@2.3.1': - resolution: {integrity: sha512-Ip9uV+/MpLXWRk03U/GzeJMuPeOXpJBSB5V1tjA6kJhvqssye5J5LoYLc7Z5IAHb7nR62sRoguzrFiVCP/hnzw==} + '@formatjs/ecma402-abstract@2.3.2': + resolution: {integrity: sha512-6sE5nyvDloULiyOMbOTJEEgWL32w+VHkZQs8S02Lnn8Y/O5aQhjOEXwWzvR7SsBE/exxlSpY2EsWZgqHbtLatg==} - '@formatjs/fast-memoize@2.2.5': - resolution: {integrity: sha512-6PoewUMrrcqxSoBXAOJDiW1m+AmkrAj0RiXnOMD59GRaswjXhm3MDhgepXPBgonc09oSirAJTsAggzAGQf6A6g==} + '@formatjs/fast-memoize@2.2.6': + resolution: {integrity: sha512-luIXeE2LJbQnnzotY1f2U2m7xuQNj2DA8Vq4ce1BY9ebRZaoPB1+8eZ6nXpLzsxuW5spQxr7LdCg+CApZwkqkw==} - '@formatjs/icu-messageformat-parser@2.9.7': - resolution: {integrity: sha512-cuEHyRM5VqLQobANOjtjlgU7+qmk9Q3fDQuBiRRJ3+Wp3ZoZhpUPtUfuimZXsir6SaI2TaAJ+SLo9vLnV5QcbA==} + '@formatjs/icu-messageformat-parser@2.10.0': + resolution: {integrity: sha512-PDeky6nDAyHYEtmSi2X1PG9YpqE+2BRTJT7JvPix8K8JX1wBWQNao6KcPtmZpttQHUHmzMcd/rne7lFesSzUKQ==} - '@formatjs/icu-skeleton-parser@1.8.11': - resolution: {integrity: sha512-8LlHHE/yL/zVJZHAX3pbKaCjZKmBIO6aJY1mkVh4RMSEu/2WRZ4Ysvv3kKXJ9M8RJLBHdnk1/dUQFdod1Dt7Dw==} + '@formatjs/icu-skeleton-parser@1.8.12': + resolution: {integrity: sha512-QRAY2jC1BomFQHYDMcZtClqHR55EEnB96V7Xbk/UiBodsuFc5kujybzt87+qj1KqmJozFhk6n4KiT1HKwAkcfg==} - '@formatjs/intl-localematcher@0.5.9': - resolution: {integrity: sha512-8zkGu/sv5euxbjfZ/xmklqLyDGQSxsLqg8XOq88JW3cmJtzhCP8EtSJXlaKZnVO4beEaoiT9wj4eIoCQ9smwxA==} + '@formatjs/intl-localematcher@0.5.10': + resolution: {integrity: sha512-af3qATX+m4Rnd9+wHcjJ4w2ijq+rAVP3CCinJQvFv1kgSu1W6jypUmvleJxcewdxmutM8dmIRZFxO/IQBZmP2Q==} '@github/markdown-toolbar-element@2.2.3': resolution: {integrity: sha512-AlquKGee+IWiAMYVB0xyHFZRMnu4n3X4HTvJHu79GiVJ1ojTukCWyxMlF5NMsecoLcBKsuBhx3QPv2vkE/zQ0A==} @@ -493,98 +493,98 @@ packages: resolution: {integrity: sha512-i0GV1yJnm2n3Yq1qw6QrUrd/LI9bE8WEBOTtOkpCXHHdyN3TAGgqAK/DAT05z4fq2x04cARXt2pDmjWjL92iTQ==} engines: {node: '>= 10.0.0'} - '@rollup/rollup-android-arm-eabi@4.29.1': - resolution: {integrity: sha512-ssKhA8RNltTZLpG6/QNkCSge+7mBQGUqJRisZ2MDQcEGaK93QESEgWK2iOpIDZ7k9zPVkG5AS3ksvD5ZWxmItw==} + '@rollup/rollup-android-arm-eabi@4.30.1': + resolution: {integrity: sha512-pSWY+EVt3rJ9fQ3IqlrEUtXh3cGqGtPDH1FQlNZehO2yYxCHEX1SPsz1M//NXwYfbTlcKr9WObLnJX9FsS9K1Q==} cpu: [arm] os: [android] - '@rollup/rollup-android-arm64@4.29.1': - resolution: {integrity: sha512-CaRfrV0cd+NIIcVVN/jx+hVLN+VRqnuzLRmfmlzpOzB87ajixsN/+9L5xNmkaUUvEbI5BmIKS+XTwXsHEb65Ew==} + '@rollup/rollup-android-arm64@4.30.1': + resolution: {integrity: sha512-/NA2qXxE3D/BRjOJM8wQblmArQq1YoBVJjrjoTSBS09jgUisq7bqxNHJ8kjCHeV21W/9WDGwJEWSN0KQ2mtD/w==} cpu: [arm64] os: [android] - '@rollup/rollup-darwin-arm64@4.29.1': - resolution: {integrity: sha512-2ORr7T31Y0Mnk6qNuwtyNmy14MunTAMx06VAPI6/Ju52W10zk1i7i5U3vlDRWjhOI5quBcrvhkCHyF76bI7kEw==} + '@rollup/rollup-darwin-arm64@4.30.1': + resolution: {integrity: sha512-r7FQIXD7gB0WJ5mokTUgUWPl0eYIH0wnxqeSAhuIwvnnpjdVB8cRRClyKLQr7lgzjctkbp5KmswWszlwYln03Q==} cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-x64@4.29.1': - resolution: {integrity: sha512-j/Ej1oanzPjmN0tirRd5K2/nncAhS9W6ICzgxV+9Y5ZsP0hiGhHJXZ2JQ53iSSjj8m6cRY6oB1GMzNn2EUt6Ng==} + '@rollup/rollup-darwin-x64@4.30.1': + resolution: {integrity: sha512-x78BavIwSH6sqfP2xeI1hd1GpHL8J4W2BXcVM/5KYKoAD3nNsfitQhvWSw+TFtQTLZ9OmlF+FEInEHyubut2OA==} cpu: [x64] os: [darwin] - '@rollup/rollup-freebsd-arm64@4.29.1': - resolution: {integrity: sha512-91C//G6Dm/cv724tpt7nTyP+JdN12iqeXGFM1SqnljCmi5yTXriH7B1r8AD9dAZByHpKAumqP1Qy2vVNIdLZqw==} + '@rollup/rollup-freebsd-arm64@4.30.1': + resolution: {integrity: sha512-HYTlUAjbO1z8ywxsDFWADfTRfTIIy/oUlfIDmlHYmjUP2QRDTzBuWXc9O4CXM+bo9qfiCclmHk1x4ogBjOUpUQ==} cpu: [arm64] os: [freebsd] - '@rollup/rollup-freebsd-x64@4.29.1': - resolution: {integrity: sha512-hEioiEQ9Dec2nIRoeHUP6hr1PSkXzQaCUyqBDQ9I9ik4gCXQZjJMIVzoNLBRGet+hIUb3CISMh9KXuCcWVW/8w==} + '@rollup/rollup-freebsd-x64@4.30.1': + resolution: {integrity: sha512-1MEdGqogQLccphhX5myCJqeGNYTNcmTyaic9S7CG3JhwuIByJ7J05vGbZxsizQthP1xpVx7kd3o31eOogfEirw==} cpu: [x64] os: [freebsd] - '@rollup/rollup-linux-arm-gnueabihf@4.29.1': - resolution: {integrity: sha512-Py5vFd5HWYN9zxBv3WMrLAXY3yYJ6Q/aVERoeUFwiDGiMOWsMs7FokXihSOaT/PMWUty/Pj60XDQndK3eAfE6A==} + '@rollup/rollup-linux-arm-gnueabihf@4.30.1': + resolution: {integrity: sha512-PaMRNBSqCx7K3Wc9QZkFx5+CX27WFpAMxJNiYGAXfmMIKC7jstlr32UhTgK6T07OtqR+wYlWm9IxzennjnvdJg==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm-musleabihf@4.29.1': - resolution: {integrity: sha512-RiWpGgbayf7LUcuSNIbahr0ys2YnEERD4gYdISA06wa0i8RALrnzflh9Wxii7zQJEB2/Eh74dX4y/sHKLWp5uQ==} + '@rollup/rollup-linux-arm-musleabihf@4.30.1': + resolution: {integrity: sha512-B8Rcyj9AV7ZlEFqvB5BubG5iO6ANDsRKlhIxySXcF1axXYUyqwBok+XZPgIYGBgs7LDXfWfifxhw0Ik57T0Yug==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm64-gnu@4.29.1': - resolution: {integrity: sha512-Z80O+taYxTQITWMjm/YqNoe9d10OX6kDh8X5/rFCMuPqsKsSyDilvfg+vd3iXIqtfmp+cnfL1UrYirkaF8SBZA==} + '@rollup/rollup-linux-arm64-gnu@4.30.1': + resolution: {integrity: sha512-hqVyueGxAj3cBKrAI4aFHLV+h0Lv5VgWZs9CUGqr1z0fZtlADVV1YPOij6AhcK5An33EXaxnDLmJdQikcn5NEw==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-arm64-musl@4.29.1': - resolution: {integrity: sha512-fOHRtF9gahwJk3QVp01a/GqS4hBEZCV1oKglVVq13kcK3NeVlS4BwIFzOHDbmKzt3i0OuHG4zfRP0YoG5OF/rA==} + '@rollup/rollup-linux-arm64-musl@4.30.1': + resolution: {integrity: sha512-i4Ab2vnvS1AE1PyOIGp2kXni69gU2DAUVt6FSXeIqUCPIR3ZlheMW3oP2JkukDfu3PsexYRbOiJrY+yVNSk9oA==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-loongarch64-gnu@4.29.1': - resolution: {integrity: sha512-5a7q3tnlbcg0OodyxcAdrrCxFi0DgXJSoOuidFUzHZ2GixZXQs6Tc3CHmlvqKAmOs5eRde+JJxeIf9DonkmYkw==} + '@rollup/rollup-linux-loongarch64-gnu@4.30.1': + resolution: {integrity: sha512-fARcF5g296snX0oLGkVxPmysetwUk2zmHcca+e9ObOovBR++9ZPOhqFUM61UUZ2EYpXVPN1redgqVoBB34nTpQ==} cpu: [loong64] os: [linux] - '@rollup/rollup-linux-powerpc64le-gnu@4.29.1': - resolution: {integrity: sha512-9b4Mg5Yfz6mRnlSPIdROcfw1BU22FQxmfjlp/CShWwO3LilKQuMISMTtAu/bxmmrE6A902W2cZJuzx8+gJ8e9w==} + '@rollup/rollup-linux-powerpc64le-gnu@4.30.1': + resolution: {integrity: sha512-GLrZraoO3wVT4uFXh67ElpwQY0DIygxdv0BNW9Hkm3X34wu+BkqrDrkcsIapAY+N2ATEbvak0XQ9gxZtCIA5Rw==} cpu: [ppc64] os: [linux] - '@rollup/rollup-linux-riscv64-gnu@4.29.1': - resolution: {integrity: sha512-G5pn0NChlbRM8OJWpJFMX4/i8OEU538uiSv0P6roZcbpe/WfhEO+AT8SHVKfp8qhDQzaz7Q+1/ixMy7hBRidnQ==} + '@rollup/rollup-linux-riscv64-gnu@4.30.1': + resolution: {integrity: sha512-0WKLaAUUHKBtll0wvOmh6yh3S0wSU9+yas923JIChfxOaaBarmb/lBKPF0w/+jTVozFnOXJeRGZ8NvOxvk/jcw==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-s390x-gnu@4.29.1': - resolution: {integrity: sha512-WM9lIkNdkhVwiArmLxFXpWndFGuOka4oJOZh8EP3Vb8q5lzdSCBuhjavJsw68Q9AKDGeOOIHYzYm4ZFvmWez5g==} + '@rollup/rollup-linux-s390x-gnu@4.30.1': + resolution: {integrity: sha512-GWFs97Ruxo5Bt+cvVTQkOJ6TIx0xJDD/bMAOXWJg8TCSTEK8RnFeOeiFTxKniTc4vMIaWvCplMAFBt9miGxgkA==} cpu: [s390x] os: [linux] - '@rollup/rollup-linux-x64-gnu@4.29.1': - resolution: {integrity: sha512-87xYCwb0cPGZFoGiErT1eDcssByaLX4fc0z2nRM6eMtV9njAfEE6OW3UniAoDhX4Iq5xQVpE6qO9aJbCFumKYQ==} + '@rollup/rollup-linux-x64-gnu@4.30.1': + resolution: {integrity: sha512-UtgGb7QGgXDIO+tqqJ5oZRGHsDLO8SlpE4MhqpY9Llpzi5rJMvrK6ZGhsRCST2abZdBqIBeXW6WPD5fGK5SDwg==} cpu: [x64] os: [linux] - '@rollup/rollup-linux-x64-musl@4.29.1': - resolution: {integrity: sha512-xufkSNppNOdVRCEC4WKvlR1FBDyqCSCpQeMMgv9ZyXqqtKBfkw1yfGMTUTs9Qsl6WQbJnsGboWCp7pJGkeMhKA==} + '@rollup/rollup-linux-x64-musl@4.30.1': + resolution: {integrity: sha512-V9U8Ey2UqmQsBT+xTOeMzPzwDzyXmnAoO4edZhL7INkwQcaW1Ckv3WJX3qrrp/VHaDkEWIBWhRwP47r8cdrOow==} cpu: [x64] os: [linux] - '@rollup/rollup-win32-arm64-msvc@4.29.1': - resolution: {integrity: sha512-F2OiJ42m77lSkizZQLuC+jiZ2cgueWQL5YC9tjo3AgaEw+KJmVxHGSyQfDUoYR9cci0lAywv2Clmckzulcq6ig==} + '@rollup/rollup-win32-arm64-msvc@4.30.1': + resolution: {integrity: sha512-WabtHWiPaFF47W3PkHnjbmWawnX/aE57K47ZDT1BXTS5GgrBUEpvOzq0FI0V/UYzQJgdb8XlhVNH8/fwV8xDjw==} cpu: [arm64] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.29.1': - resolution: {integrity: sha512-rYRe5S0FcjlOBZQHgbTKNrqxCBUmgDJem/VQTCcTnA2KCabYSWQDrytOzX7avb79cAAweNmMUb/Zw18RNd4mng==} + '@rollup/rollup-win32-ia32-msvc@4.30.1': + resolution: {integrity: sha512-pxHAU+Zv39hLUTdQQHUVHf4P+0C47y/ZloorHpzs2SXMRqeAWmGghzAhfOlzFHHwjvgokdFAhC4V+6kC1lRRfw==} cpu: [ia32] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.29.1': - resolution: {integrity: sha512-+10CMg9vt1MoHj6x1pxyjPSMjHTIlqs8/tBztXvPAx24SKs9jwVnKqHJumlH/IzhaPUaj3T6T6wfZr8okdXaIg==} + '@rollup/rollup-win32-x64-msvc@4.30.1': + resolution: {integrity: sha512-D6qjsXGcvhTjv0kI4fU8tUuBDF/Ueee4SVX79VfNDXZa64TfCW1Slkb6Z7O1p7vflqZjcmOVdZlqf8gvJxc6og==} cpu: [x64] os: [win32] @@ -767,15 +767,15 @@ packages: engines: {node: '>=18'} hasBin: true - esm-env@1.2.1: - resolution: {integrity: sha512-U9JedYYjCnadUlXk7e1Kr+aENQhtUaoaV9+gZm1T8LC/YBAPJx3NSPIAurFOC0U5vrdSevnUJS2/wUVxGwPhng==} + esm-env@1.2.2: + resolution: {integrity: sha512-Epxrv+Nr/CaL4ZcFGPJIYLWFom+YeV1DqMLHJoEd9SYRxNbaFruBwfEX/kkHUJf55j2+TUbmDcmuilbP1TmXHA==} esniff@2.0.1: resolution: {integrity: sha512-kTUIGKQ/mDPFoJ0oVfcmyJn4iBDRptjNVIzwIFR7tqWXdVI9xfA2RMwY/gbSpJG3lkdWNEjLap/NqVHZiJsdfg==} engines: {node: '>=0.10'} - esrap@1.3.2: - resolution: {integrity: sha512-C4PXusxYhFT98GjLSmb20k9PREuUdporer50dhzGuJu9IJXktbMddVCMLAERl5dAHyAi73GWWCE4FVHGP1794g==} + esrap@1.4.3: + resolution: {integrity: sha512-Xddc1RsoFJ4z9nR7W7BFaEPIp4UXoeQ0+077UdWLxbafMQFyU79sQJMk7kxNgRwQ9/aVgaKacCHC2pUACGwmYw==} estree-walker@2.0.2: resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} @@ -786,15 +786,15 @@ packages: ext@1.7.0: resolution: {integrity: sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==} - fast-glob@3.3.2: - resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} + fast-glob@3.3.3: + resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} engines: {node: '>=8.6.0'} fastq@1.18.0: resolution: {integrity: sha512-QKHXPW0hD8g4UET03SdOdunzSouc9N4AuHdsX8XNcTsuz+yYFILVNIX4l9yHABMhiEI9Db0JTTIpu0wB+Y1QQw==} - fdir@6.4.2: - resolution: {integrity: sha512-KnhMXsKSPZlAhp7+IjUkRZKPb4fUyccpDrdFXbi4QL1qkmFh9kVY09Yox+n4MaOb3lHZ1Tv829C3oaaXoMYPDQ==} + fdir@6.4.3: + resolution: {integrity: sha512-PMXmW2y1hDDfTSRc9gaXIuCCRpuoz3Kaz8cUelp3smouvfT632ozg2vrT6lJsHKKOF59YLbOGfAWGUcKEfRMQw==} peerDependencies: picomatch: ^3 || ^4 peerDependenciesMeta: @@ -818,8 +818,8 @@ packages: resolution: {integrity: sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==} engines: {node: '>= 6'} - fs-extra@11.2.0: - resolution: {integrity: sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==} + fs-extra@11.3.0: + resolution: {integrity: sha512-Z4XaCL6dUDHfP/jT25jJKMmtxvuwbkrD1vNSMFlo9lNLY2c5FHYSQgHPRZUjAB26TpDEoW9HCOgplrdbaPV/ew==} engines: {node: '>=14.14'} fsevents@2.3.3: @@ -852,8 +852,8 @@ packages: immutable@5.0.3: resolution: {integrity: sha512-P8IdPQHq3lA1xVeBRi5VPqUm5HDgKnx0Ru51wZz5mjxHr5n3RWhjIpOFU7ybkUxfB+5IToy+OLaHYDBIWsv+uw==} - intl-messageformat@10.7.10: - resolution: {integrity: sha512-hp7iejCBiJdW3zmOe18FdlJu8U/JsADSDiBPQhfdSeI8B9POtvPRvPh3nMlvhYayGMKLv6maldhR7y3Pf1vkpw==} + intl-messageformat@10.7.12: + resolution: {integrity: sha512-4HBsPDJ61jZwNikauvm0mcLvs1AfCBbihiqOX2AGs1MX7SA1H0SNKJRSWxpZpToGoNzvoYLsJJ2pURkbEDg+Dw==} is-binary-path@2.1.0: resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} @@ -954,8 +954,8 @@ packages: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} engines: {node: '>=8.6'} - postcss@8.4.49: - resolution: {integrity: sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==} + postcss@8.5.1: + resolution: {integrity: sha512-6oz2beyjc5VMn/KV1pPw8fliQkhBXrVn1Z3TVyqZxU8kZpzEKhBdmCFqI6ZbmGtamQvQGuU1sgPTk8ZrXDD7jQ==} engines: {node: ^10 || ^12 || >=14} proxy-from-env@1.1.0: @@ -968,9 +968,9 @@ packages: resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} engines: {node: '>=8.10.0'} - readdirp@4.0.2: - resolution: {integrity: sha512-yDMz9g+VaZkqBYS/ozoBJwaBhTbZo3UNYQHNRw1D3UFQB8oHB4uS/tAODO+ZLjGWmUbKnIlOWO+aaIiAxrUWHA==} - engines: {node: '>= 14.16.0'} + readdirp@4.1.1: + resolution: {integrity: sha512-h80JrZu/MHUZCyHu5ciuoI0+WxsCxzxJTILn6Fs8rxSnFPh+UVHYfeIxK1nVGugMqkfC4vJcBOYbkfkwYK0+gw==} + engines: {node: '>= 14.18.0'} relateurl@0.2.7: resolution: {integrity: sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==} @@ -980,8 +980,8 @@ packages: resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - rollup@4.29.1: - resolution: {integrity: sha512-RaJ45M/kmJUzSWDs1Nnd5DdV4eerC98idtUOVr6FfKcgxqvjwHmxc5upLF9qZU9EpsVzzhleFahrT3shLuJzIw==} + rollup@4.30.1: + resolution: {integrity: sha512-mlJ4glW020fPuLi7DkM/lN97mYEZGWeqBnrljzN0gs7GLctqX3lNWxKQ7Gl712UAX+6fog/L3jh4gb7R6aVi3w==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true @@ -1120,8 +1120,8 @@ packages: engines: {node: '>=16.0.0'} hasBin: true - sass@1.83.0: - resolution: {integrity: sha512-qsSxlayzoOjdvXMVLkzF84DJFc2HZEL/rFyGIKbbilYtAvlCxyuzUeff9LawTn4btVnLKg75Z8MMr1lxU1lfGw==} + sass@1.83.4: + resolution: {integrity: sha512-B1bozCeNQiOgDcLd33e2Cs2U60wZwjUUXzh900ZyQF5qUasvMdDZYbQ566LJu7cqR+sAHlAfO6RMkaID5s6qpA==} engines: {node: '>=14.0.0'} hasBin: true @@ -1147,13 +1147,13 @@ packages: resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} engines: {node: '>=10'} - svelecte@5.1.1: - resolution: {integrity: sha512-G5n/UP9ehWtJ63D8hDGwwrUSkVNbagCqs/W2FHa/mmwbzX/Vq83n0DT9sqdA9WRChxNIsBqoXJV/QgNzJef3Vg==} + svelecte@5.1.4: + resolution: {integrity: sha512-eKtwtTwv8l72yj/foEZu3dsg4Rm77/TNCNSr0e1GK8sOGd+kspesKWoRz1dHfztriGCQaCPMJ3ClIyzsi0n8vg==} peerDependencies: svelte: ^5.2.7 - svelte-check@4.1.1: - resolution: {integrity: sha512-NfaX+6Qtc8W/CyVGS/F7/XdiSSyXz+WGYA9ZWV3z8tso14V2vzjfXviKaTFEzB7g8TqfgO2FOzP6XT4ApSTUTw==} + svelte-check@4.1.4: + resolution: {integrity: sha512-v0j7yLbT29MezzaQJPEDwksybTE2Ups9rUxEXy92T06TiA0cbqcO8wAOwNUVkFW6B0hsYHA+oAX3BS8b/2oHtw==} engines: {node: '>= 18.0.0'} hasBin: true peerDependencies: @@ -1167,16 +1167,16 @@ packages: peerDependencies: svelte: ^3 || ^4 || ^5 - svelte-showdown@0.3.0: - resolution: {integrity: sha512-0rWaL6VfVWUwvz0wdjeq8Ollw7fy05zzBnL7kKYtrj/YzP0kpT4CJhqQvasW7mbfDcXWEcPJmagXCkE6bX5mVA==} + svelte-showdown@0.4.1: + resolution: {integrity: sha512-LqLJ4S8AT2o6ASDdy3EPC6TKfGx0HgBb/yz3ht/vZsD4FdQedOceVGA0tHWn98eoe3GGyLwvPpqb/rgGiZc2qA==} peerDependencies: - svelte: ^5.16.0 + svelte: ^5.0.0 svelte-toggle@4.0.1: resolution: {integrity: sha512-omE2zHKmijXebDoNNjfV4JKEoUTSIBSoqg16/gzCfHKcwnafk0DAN9d4mwIg5F7ipyYc51sd9A9B2qwmbxypLw==} - svelte@5.16.0: - resolution: {integrity: sha512-Ygqsiac6UogVED2ruKclU+pOeMThxWtp9LG+li7BXeDKC2paVIsRTMkNmcON4Zejerd1s5sZHWx6ZtU85xklVg==} + svelte@5.19.0: + resolution: {integrity: sha512-qvd2GvvYnJxS/MteQKFSMyq8cQrAAut28QZ39ySv9k3ggmhw4Au4Rfcsqva74i0xMys//OhbhVCNfXPrDzL/Bg==} engines: {node: '>=18'} sync-child-process@1.0.2: @@ -1227,8 +1227,8 @@ packages: varint@6.0.0: resolution: {integrity: sha512-cXEIW6cfr15lFv563k4GuVuW/fiwjknytD37jIOLSdSWuOI6WnO/oKwmP2FQTU2l01LP8/M5TSAJpzUaGe3uWg==} - virtual-select-plugin@1.0.46: - resolution: {integrity: sha512-9rTrHZs1HBgGioyVODfinjNQThRDT1NnrVq0fzBMwU+sBLwdNQrTUoFvh3up8+aKKNRJok0TAB9wNwT4njRWsg==} + virtual-select-plugin@1.0.47: + resolution: {integrity: sha512-Lg2nbv9+2uUVn7yMnky+7AmiYvJ/oYHkPpIfZtXFpjOSh5gKBzCFzqB4B5MOGpjYjjHXIH4dy6RDHoElH5wR6g==} vite-plugin-minify@2.1.0: resolution: {integrity: sha512-h+Ae0WX0mvrWM4GhE6JX2NmxlDuZRv4AgcTHFqfbSyPwS+OdlOM692AQrK0eO8lDEh7gYLjG3EHovKvtrNQDvA==} @@ -1241,8 +1241,8 @@ packages: peerDependencies: vite: ^5.0.0 || ^6.0.0 - vite@6.0.6: - resolution: {integrity: sha512-NSjmUuckPmDU18bHz7QZ+bTYhRR0iA72cs2QAxCqDpafJ0S6qetco0LB3WW2OxlMHS0JmAv+yZ/R3uPmMyGTjQ==} + vite@6.0.7: + resolution: {integrity: sha512-RDt8r/7qx9940f8FcOIAH9PTViRrghKaK2K1jY3RaAURrEUbm9Du1mJ72G+jlhtG3WwodnfzY8ORQZbBavZEAQ==} engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} hasBin: true peerDependencies: @@ -1281,8 +1281,8 @@ packages: yaml: optional: true - vitefu@1.0.4: - resolution: {integrity: sha512-y6zEE3PQf6uu/Mt6DTJ9ih+kyJLr4XcSgHR2zUkM8SWDhuixEJxfJ6CZGMHh1Ec3vPLoEA0IHU5oWzVqw8ulow==} + vitefu@1.0.5: + resolution: {integrity: sha512-h4Vflt9gxODPFNGPwp4zAMZRpZR7eslzwH2c5hn5kNZ5rhnKyRJ50U+yGCdc2IRaBs8O4haIgLNGrV5CrpMsCA==} peerDependencies: vite: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 peerDependenciesMeta: @@ -1446,29 +1446,29 @@ snapshots: '@esbuild/win32-x64@0.24.2': optional: true - '@formatjs/ecma402-abstract@2.3.1': + '@formatjs/ecma402-abstract@2.3.2': dependencies: - '@formatjs/fast-memoize': 2.2.5 - '@formatjs/intl-localematcher': 0.5.9 + '@formatjs/fast-memoize': 2.2.6 + '@formatjs/intl-localematcher': 0.5.10 decimal.js: 10.4.3 tslib: 2.8.1 - '@formatjs/fast-memoize@2.2.5': + '@formatjs/fast-memoize@2.2.6': dependencies: tslib: 2.8.1 - '@formatjs/icu-messageformat-parser@2.9.7': + '@formatjs/icu-messageformat-parser@2.10.0': dependencies: - '@formatjs/ecma402-abstract': 2.3.1 - '@formatjs/icu-skeleton-parser': 1.8.11 + '@formatjs/ecma402-abstract': 2.3.2 + '@formatjs/icu-skeleton-parser': 1.8.12 tslib: 2.8.1 - '@formatjs/icu-skeleton-parser@1.8.11': + '@formatjs/icu-skeleton-parser@1.8.12': dependencies: - '@formatjs/ecma402-abstract': 2.3.1 + '@formatjs/ecma402-abstract': 2.3.2 tslib: 2.8.1 - '@formatjs/intl-localematcher@0.5.9': + '@formatjs/intl-localematcher@0.5.10': dependencies: tslib: 2.8.1 @@ -1569,82 +1569,82 @@ snapshots: '@parcel/watcher-win32-x64': 2.5.0 optional: true - '@rollup/rollup-android-arm-eabi@4.29.1': + '@rollup/rollup-android-arm-eabi@4.30.1': optional: true - '@rollup/rollup-android-arm64@4.29.1': + '@rollup/rollup-android-arm64@4.30.1': optional: true - '@rollup/rollup-darwin-arm64@4.29.1': + '@rollup/rollup-darwin-arm64@4.30.1': optional: true - '@rollup/rollup-darwin-x64@4.29.1': + '@rollup/rollup-darwin-x64@4.30.1': optional: true - '@rollup/rollup-freebsd-arm64@4.29.1': + '@rollup/rollup-freebsd-arm64@4.30.1': optional: true - '@rollup/rollup-freebsd-x64@4.29.1': + '@rollup/rollup-freebsd-x64@4.30.1': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.29.1': + '@rollup/rollup-linux-arm-gnueabihf@4.30.1': optional: true - '@rollup/rollup-linux-arm-musleabihf@4.29.1': + '@rollup/rollup-linux-arm-musleabihf@4.30.1': optional: true - '@rollup/rollup-linux-arm64-gnu@4.29.1': + '@rollup/rollup-linux-arm64-gnu@4.30.1': optional: true - '@rollup/rollup-linux-arm64-musl@4.29.1': + '@rollup/rollup-linux-arm64-musl@4.30.1': optional: true - '@rollup/rollup-linux-loongarch64-gnu@4.29.1': + '@rollup/rollup-linux-loongarch64-gnu@4.30.1': optional: true - '@rollup/rollup-linux-powerpc64le-gnu@4.29.1': + '@rollup/rollup-linux-powerpc64le-gnu@4.30.1': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.29.1': + '@rollup/rollup-linux-riscv64-gnu@4.30.1': optional: true - '@rollup/rollup-linux-s390x-gnu@4.29.1': + '@rollup/rollup-linux-s390x-gnu@4.30.1': optional: true - '@rollup/rollup-linux-x64-gnu@4.29.1': + '@rollup/rollup-linux-x64-gnu@4.30.1': optional: true - '@rollup/rollup-linux-x64-musl@4.29.1': + '@rollup/rollup-linux-x64-musl@4.30.1': optional: true - '@rollup/rollup-win32-arm64-msvc@4.29.1': + '@rollup/rollup-win32-arm64-msvc@4.30.1': optional: true - '@rollup/rollup-win32-ia32-msvc@4.29.1': + '@rollup/rollup-win32-ia32-msvc@4.30.1': optional: true - '@rollup/rollup-win32-x64-msvc@4.29.1': + '@rollup/rollup-win32-x64-msvc@4.30.1': optional: true - '@sveltejs/vite-plugin-svelte-inspector@4.0.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.16.0)(vite@6.0.6(sass-embedded@1.81.0)(sass@1.83.0)(terser@5.37.0)))(svelte@5.16.0)(vite@6.0.6(sass-embedded@1.81.0)(sass@1.83.0)(terser@5.37.0))': + '@sveltejs/vite-plugin-svelte-inspector@4.0.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.19.0)(vite@6.0.7(sass-embedded@1.81.0)(sass@1.83.4)(terser@5.37.0)))(svelte@5.19.0)(vite@6.0.7(sass-embedded@1.81.0)(sass@1.83.4)(terser@5.37.0))': dependencies: - '@sveltejs/vite-plugin-svelte': 5.0.3(svelte@5.16.0)(vite@6.0.6(sass-embedded@1.81.0)(sass@1.83.0)(terser@5.37.0)) + '@sveltejs/vite-plugin-svelte': 5.0.3(svelte@5.19.0)(vite@6.0.7(sass-embedded@1.81.0)(sass@1.83.4)(terser@5.37.0)) debug: 4.4.0 - svelte: 5.16.0 - vite: 6.0.6(sass-embedded@1.81.0)(sass@1.83.0)(terser@5.37.0) + svelte: 5.19.0 + vite: 6.0.7(sass-embedded@1.81.0)(sass@1.83.4)(terser@5.37.0) transitivePeerDependencies: - supports-color - '@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.16.0)(vite@6.0.6(sass-embedded@1.81.0)(sass@1.83.0)(terser@5.37.0))': + '@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.19.0)(vite@6.0.7(sass-embedded@1.81.0)(sass@1.83.4)(terser@5.37.0))': dependencies: - '@sveltejs/vite-plugin-svelte-inspector': 4.0.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.16.0)(vite@6.0.6(sass-embedded@1.81.0)(sass@1.83.0)(terser@5.37.0)))(svelte@5.16.0)(vite@6.0.6(sass-embedded@1.81.0)(sass@1.83.0)(terser@5.37.0)) + '@sveltejs/vite-plugin-svelte-inspector': 4.0.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.19.0)(vite@6.0.7(sass-embedded@1.81.0)(sass@1.83.4)(terser@5.37.0)))(svelte@5.19.0)(vite@6.0.7(sass-embedded@1.81.0)(sass@1.83.4)(terser@5.37.0)) debug: 4.4.0 deepmerge: 4.3.1 kleur: 4.1.5 magic-string: 0.30.17 - svelte: 5.16.0 - vite: 6.0.6(sass-embedded@1.81.0)(sass@1.83.0)(terser@5.37.0) - vitefu: 1.0.4(vite@6.0.6(sass-embedded@1.81.0)(sass@1.83.0)(terser@5.37.0)) + svelte: 5.19.0 + vite: 6.0.7(sass-embedded@1.81.0)(sass@1.83.4)(terser@5.37.0) + vitefu: 1.0.5(vite@6.0.7(sass-embedded@1.81.0)(sass@1.83.4)(terser@5.37.0)) transitivePeerDependencies: - supports-color @@ -1721,7 +1721,7 @@ snapshots: chokidar@4.0.3: dependencies: - readdirp: 4.0.2 + readdirp: 4.1.1 clean-css@5.3.3: dependencies: @@ -1854,7 +1854,7 @@ snapshots: '@esbuild/win32-ia32': 0.24.2 '@esbuild/win32-x64': 0.24.2 - esm-env@1.2.1: {} + esm-env@1.2.2: {} esniff@2.0.1: dependencies: @@ -1863,7 +1863,7 @@ snapshots: event-emitter: 0.3.5 type: 2.7.3 - esrap@1.3.2: + esrap@1.4.3: dependencies: '@jridgewell/sourcemap-codec': 1.5.0 @@ -1878,7 +1878,7 @@ snapshots: dependencies: type: 2.7.3 - fast-glob@3.3.2: + fast-glob@3.3.3: dependencies: '@nodelib/fs.stat': 2.0.5 '@nodelib/fs.walk': 1.2.8 @@ -1890,7 +1890,7 @@ snapshots: dependencies: reusify: 1.0.4 - fdir@6.4.2: {} + fdir@6.4.3: {} fill-range@7.1.1: dependencies: @@ -1904,7 +1904,7 @@ snapshots: combined-stream: 1.0.8 mime-types: 2.1.35 - fs-extra@11.2.0: + fs-extra@11.3.0: dependencies: graceful-fs: 4.2.11 jsonfile: 6.1.0 @@ -1938,11 +1938,11 @@ snapshots: immutable@5.0.3: {} - intl-messageformat@10.7.10: + intl-messageformat@10.7.12: dependencies: - '@formatjs/ecma402-abstract': 2.3.1 - '@formatjs/fast-memoize': 2.2.5 - '@formatjs/icu-messageformat-parser': 2.9.7 + '@formatjs/ecma402-abstract': 2.3.2 + '@formatjs/fast-memoize': 2.2.6 + '@formatjs/icu-messageformat-parser': 2.10.0 tslib: 2.8.1 is-binary-path@2.1.0: @@ -2041,7 +2041,7 @@ snapshots: picomatch@2.3.1: {} - postcss@8.4.49: + postcss@8.5.1: dependencies: nanoid: 3.3.8 picocolors: 1.1.1 @@ -2055,35 +2055,35 @@ snapshots: dependencies: picomatch: 2.3.1 - readdirp@4.0.2: {} + readdirp@4.1.1: {} relateurl@0.2.7: {} reusify@1.0.4: {} - rollup@4.29.1: + rollup@4.30.1: dependencies: '@types/estree': 1.0.6 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.29.1 - '@rollup/rollup-android-arm64': 4.29.1 - '@rollup/rollup-darwin-arm64': 4.29.1 - '@rollup/rollup-darwin-x64': 4.29.1 - '@rollup/rollup-freebsd-arm64': 4.29.1 - '@rollup/rollup-freebsd-x64': 4.29.1 - '@rollup/rollup-linux-arm-gnueabihf': 4.29.1 - '@rollup/rollup-linux-arm-musleabihf': 4.29.1 - '@rollup/rollup-linux-arm64-gnu': 4.29.1 - '@rollup/rollup-linux-arm64-musl': 4.29.1 - '@rollup/rollup-linux-loongarch64-gnu': 4.29.1 - '@rollup/rollup-linux-powerpc64le-gnu': 4.29.1 - '@rollup/rollup-linux-riscv64-gnu': 4.29.1 - '@rollup/rollup-linux-s390x-gnu': 4.29.1 - '@rollup/rollup-linux-x64-gnu': 4.29.1 - '@rollup/rollup-linux-x64-musl': 4.29.1 - '@rollup/rollup-win32-arm64-msvc': 4.29.1 - '@rollup/rollup-win32-ia32-msvc': 4.29.1 - '@rollup/rollup-win32-x64-msvc': 4.29.1 + '@rollup/rollup-android-arm-eabi': 4.30.1 + '@rollup/rollup-android-arm64': 4.30.1 + '@rollup/rollup-darwin-arm64': 4.30.1 + '@rollup/rollup-darwin-x64': 4.30.1 + '@rollup/rollup-freebsd-arm64': 4.30.1 + '@rollup/rollup-freebsd-x64': 4.30.1 + '@rollup/rollup-linux-arm-gnueabihf': 4.30.1 + '@rollup/rollup-linux-arm-musleabihf': 4.30.1 + '@rollup/rollup-linux-arm64-gnu': 4.30.1 + '@rollup/rollup-linux-arm64-musl': 4.30.1 + '@rollup/rollup-linux-loongarch64-gnu': 4.30.1 + '@rollup/rollup-linux-powerpc64le-gnu': 4.30.1 + '@rollup/rollup-linux-riscv64-gnu': 4.30.1 + '@rollup/rollup-linux-s390x-gnu': 4.30.1 + '@rollup/rollup-linux-x64-gnu': 4.30.1 + '@rollup/rollup-linux-x64-musl': 4.30.1 + '@rollup/rollup-win32-arm64-msvc': 4.30.1 + '@rollup/rollup-win32-ia32-msvc': 4.30.1 + '@rollup/rollup-win32-x64-msvc': 4.30.1 fsevents: 2.3.3 run-parallel@1.2.0: @@ -2192,7 +2192,7 @@ snapshots: sass-embedded-win32-x64: 1.81.0 optional: true - sass@1.83.0: + sass@1.83.4: dependencies: chokidar: 4.0.3 immutable: 5.0.3 @@ -2220,42 +2220,42 @@ snapshots: has-flag: 4.0.0 optional: true - svelecte@5.1.1(svelte@5.16.0): + svelecte@5.1.4(svelte@5.19.0): dependencies: - svelte: 5.16.0 + svelte: 5.19.0 - svelte-check@4.1.1(svelte@5.16.0)(typescript@5.7.2): + svelte-check@4.1.4(svelte@5.19.0)(typescript@5.7.2): dependencies: '@jridgewell/trace-mapping': 0.3.25 chokidar: 4.0.3 - fdir: 6.4.2 + fdir: 6.4.3 picocolors: 1.1.1 sade: 1.8.1 - svelte: 5.16.0 + svelte: 5.19.0 typescript: 5.7.2 transitivePeerDependencies: - picomatch - svelte-i18n@4.0.1(svelte@5.16.0): + svelte-i18n@4.0.1(svelte@5.19.0): dependencies: cli-color: 2.0.4 deepmerge: 4.3.1 esbuild: 0.19.12 estree-walker: 2.0.2 - intl-messageformat: 10.7.10 + intl-messageformat: 10.7.12 sade: 1.8.1 - svelte: 5.16.0 + svelte: 5.19.0 tiny-glob: 0.2.9 - svelte-showdown@0.3.0(svelte@5.16.0): + svelte-showdown@0.4.1(svelte@5.19.0): dependencies: '@types/showdown': 2.0.6 showdown: 2.1.0 - svelte: 5.16.0 + svelte: 5.19.0 svelte-toggle@4.0.1: {} - svelte@5.16.0: + svelte@5.19.0: dependencies: '@ampproject/remapping': 2.3.0 '@jridgewell/sourcemap-codec': 1.5.0 @@ -2265,8 +2265,8 @@ snapshots: aria-query: 5.3.2 axobject-query: 4.1.0 clsx: 2.1.1 - esm-env: 1.2.1 - esrap: 1.3.2 + esm-env: 1.2.2 + esrap: 1.4.3 is-reference: 3.0.3 locate-character: 3.0.0 magic-string: 0.30.17 @@ -2316,37 +2316,37 @@ snapshots: varint@6.0.0: optional: true - virtual-select-plugin@1.0.46: + virtual-select-plugin@1.0.47: dependencies: tooltip-plugin: 1.0.16 - vite-plugin-minify@2.1.0(vite@6.0.6(sass-embedded@1.81.0)(sass@1.83.0)(terser@5.37.0)): + vite-plugin-minify@2.1.0(vite@6.0.7(sass-embedded@1.81.0)(sass@1.83.4)(terser@5.37.0)): dependencies: '@types/html-minifier-terser': 7.0.2 html-minifier-terser: 7.2.0 - vite: 6.0.6(sass-embedded@1.81.0)(sass@1.83.0)(terser@5.37.0) + vite: 6.0.7(sass-embedded@1.81.0)(sass@1.83.4)(terser@5.37.0) - vite-plugin-static-copy@2.2.0(vite@6.0.6(sass-embedded@1.81.0)(sass@1.83.0)(terser@5.37.0)): + vite-plugin-static-copy@2.2.0(vite@6.0.7(sass-embedded@1.81.0)(sass@1.83.4)(terser@5.37.0)): dependencies: chokidar: 3.6.0 - fast-glob: 3.3.2 - fs-extra: 11.2.0 + fast-glob: 3.3.3 + fs-extra: 11.3.0 picocolors: 1.1.1 - vite: 6.0.6(sass-embedded@1.81.0)(sass@1.83.0)(terser@5.37.0) + vite: 6.0.7(sass-embedded@1.81.0)(sass@1.83.4)(terser@5.37.0) - vite@6.0.6(sass-embedded@1.81.0)(sass@1.83.0)(terser@5.37.0): + vite@6.0.7(sass-embedded@1.81.0)(sass@1.83.4)(terser@5.37.0): dependencies: esbuild: 0.24.2 - postcss: 8.4.49 - rollup: 4.29.1 + postcss: 8.5.1 + rollup: 4.30.1 optionalDependencies: fsevents: 2.3.3 - sass: 1.83.0 + sass: 1.83.4 sass-embedded: 1.81.0 terser: 5.37.0 - vitefu@1.0.4(vite@6.0.6(sass-embedded@1.81.0)(sass@1.83.0)(terser@5.37.0)): + vitefu@1.0.5(vite@6.0.7(sass-embedded@1.81.0)(sass@1.83.4)(terser@5.37.0)): optionalDependencies: - vite: 6.0.6(sass-embedded@1.81.0)(sass@1.83.0)(terser@5.37.0) + vite: 6.0.7(sass-embedded@1.81.0)(sass@1.83.4)(terser@5.37.0) zimmerframe@1.1.2: {}