From b8902b4afaeca445334d75ce07c8621799eac938 Mon Sep 17 00:00:00 2001 From: Cooper Dalrymple Date: Tue, 6 Oct 2026 17:00:20 -0500 Subject: [PATCH] More work on this, incomplete! --- .vscode/tasks.json | 10 + assets/style.css | 1 + assets/style.scss | 54 + auth.json | 8 - composer.json | 2 +- composer.lock | 4 +- gulpfile.js | 45 +- inc/abstract-service.php | 77 +- inc/class-config.php | 20 +- inc/class-script.php | 39 +- inc/class-services.php | 27 +- inc/class-settings.php | 66 +- inc/integrations/class-gravityforms.php | 203 +++ inc/services/class-google-adsense.php | 35 + inc/services/class-google-analytics.php | 11 +- inc/services/class-google-tag-manager.php | 14 +- inc/services/class-twitter.php | 26 + inc/services/class-youtube.php | 27 +- ogre-consent.php | 105 ++ package-lock.json | 1437 ++++++++++++++++++++- package.json | 9 +- plugin.php | 75 -- postcss.config.js | 18 + 23 files changed, 2138 insertions(+), 175 deletions(-) create mode 100644 assets/style.css create mode 100644 assets/style.scss delete mode 100644 auth.json create mode 100644 inc/integrations/class-gravityforms.php create mode 100644 inc/services/class-google-adsense.php create mode 100644 inc/services/class-twitter.php create mode 100644 ogre-consent.php delete mode 100644 plugin.php create mode 100644 postcss.config.js diff --git a/.vscode/tasks.json b/.vscode/tasks.json index f22fd45..eed26e7 100644 --- a/.vscode/tasks.json +++ b/.vscode/tasks.json @@ -20,6 +20,16 @@ "reveal": "silent", "panel": "shared", } + }, + { + "label": "Compile", + "type": "shell", + "command": "gulp compile", + "group": "build", + "presentation": { + "reveal": "silent", + "panel": "shared", + } } ] } diff --git a/assets/style.css b/assets/style.css new file mode 100644 index 0000000..13566fe --- /dev/null +++ b/assets/style.css @@ -0,0 +1 @@ +#ogre-consent .klaro{--border-radius:var(--ogre-consent--border-radius, 4px);--border-width:var(--ogre-consent--border-width, 1px);--border-style:var(--ogre-consent--border-style, solid);--border-color:var(--ogre-consent--border-color, color-mix(currentColor 20%, transparent));--title-font-family:var(--ogre-consent--title--font-family)}#ogre-consent .klaro :is(.cookie-modal,.context-notice,.cookie-notice) :is(p,strong,h1,h2,ul,li){color:var(--ogre-consent--color,var(--wp--preset--color--contrast,#000))}#ogre-consent .klaro :is(.cookie-modal,.context-notice,.cookie-notice) .slider{box-shadow:var(--ogre-consent--slider--shadow,none)}#ogre-consent .klaro .cookie-modal .cm-bg{background-color:var(--ogre-consent--backdrop,rgba(0,0,0,.8))}#ogre-consent .klaro .cookie-modal .cm-modal .cm-header{border-bottom-color:var(--border-color)}#ogre-consent .klaro .cookie-modal .cm-modal .cm-header h1{font-size:var(--ogre-consent--title--font-size,var(--wp--preset--font-size--large,2em))}#ogre-consent .klaro .cookie-modal .cm-modal :is(.cm-body,.cm-header,.cm-footer){padding-top:var(--ogre-consent--padding,max(var(--wp--style--root--padding-top,1em),1em));padding-bottom:var(--ogre-consent--padding,max(var(--wp--style--root--padding-bottom,1em),1em));padding-left:var(--ogre-consent--padding,max(var(--wp--style--root--padding-left,1em),1em));padding-right:var(--ogre-consent--padding,max(var(--wp--style--root--padding-right,1em),1em))}@media (min-width:660px){#ogre-consent .klaro .cookie-modal .cm-modal.cm-klaro{max-width:var(--ogre-consent--max-width,640px);border-radius:var(--border-radius,4px);background-color:var(--ogre-consent--background-color,var(--wp--preset--color--base,#fff));color:var(--ogre-consent--color,var(--wp--preset--color--contrast,#000));box-shadow:var(--ogre-consent--shadow,var(--wp--preset--shadow--natural,.5em .5em 1em 0 rgba(0,0,0,.2)))}} \ No newline at end of file diff --git a/assets/style.scss b/assets/style.scss new file mode 100644 index 0000000..7078250 --- /dev/null +++ b/assets/style.scss @@ -0,0 +1,54 @@ +/** + * @package ogre-consent + * @author cleverogre + * @copyright 2026 CleverOgre + * @license GLP-3.0-or-later + * @version 0.0.0 + * @since 0.0.0 + */ + +#ogre-consent .klaro { + --border-radius: var(--ogre-consent--border-radius, 4px); + --border-width: var(--ogre-consent--border-width, 1px); + --border-style: var(--ogre-consent--border-style, solid); + --border-color: var(--ogre-consent--border-color, color-mix(currentColor 20%, transparent)); + + --title-font-family: var(--ogre-consent--title--font-family); + + :is(.cookie-modal, .context-notice, .cookie-notice) { + :is(p, strong, h1, h2, ul, li) { + color: var(--ogre-consent--color, var(--wp--preset--color--contrast, #000)); + } + .slider { + box-shadow: var(--ogre-consent--slider--shadow, none); + } + } + + .cookie-modal { + .cm-bg { + background-color: var(--ogre-consent--backdrop, rgb(0 0 0 / .8)); + } + .cm-modal .cm-header { + border-bottom-color: var(--border-color); + h1 { + font-size: var(--ogre-consent--title--font-size, var(--wp--preset--font-size--large, 2em)); + } + } + .cm-modal :is(.cm-body, .cm-header, .cm-footer) { + padding-top: var(--ogre-consent--padding, max(var(--wp--style--root--padding-top, 1em), 1em)); + padding-bottom: var(--ogre-consent--padding, max(var(--wp--style--root--padding-bottom, 1em), 1em)); + padding-left: var(--ogre-consent--padding, max(var(--wp--style--root--padding-left, 1em), 1em)); + padding-right: var(--ogre-consent--padding, max(var(--wp--style--root--padding-right, 1em), 1em)); + } + + @media (min-width: 660px) { + .cm-modal.cm-klaro { + max-width: var(--ogre-consent--max-width, 640px); + border-radius: var(--border-radius, 4px); + background-color: var(--ogre-consent--background-color, var(--wp--preset--color--base, #fff)); + color: var(--ogre-consent--color, var(--wp--preset--color--contrast, #000)); + box-shadow: var(--ogre-consent--shadow, var(--wp--preset--shadow--natural, 0.5em 0.5em 1em 0 rgb(0 0 0 / .2))); + } + } + } +} diff --git a/auth.json b/auth.json deleted file mode 100644 index 32e6986..0000000 --- a/auth.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "http-basic": { - "connect.advancedcustomfields.com": { - "username": "b3JkZXJfaWQ9NzkzNjJ8dHlwZT1kZXZlbG9wZXJ8ZGF0ZT0yMDE2LTA0LTEyIDAwOjEzOjEx", - "password": "https://cleverogre.com" - } - } -} diff --git a/composer.json b/composer.json index 4be578e..e33cf54 100644 --- a/composer.json +++ b/composer.json @@ -37,7 +37,7 @@ }, "autoload": { "files": [ - "plugin.php" + "ogre-consent.php" ] }, "require": { diff --git a/composer.lock b/composer.lock index d09f4e6..394fccd 100644 --- a/composer.lock +++ b/composer.lock @@ -12,7 +12,7 @@ "source": { "type": "git", "url": "git@git.cleverogre.com:cleverogre/plugin-framework.git", - "reference": "0b16ec6f70a5a3852a1da9189ebef8363c2d7436" + "reference": "cbea8dd02640b88b86091801adbb3da86a8bb55c" }, "require": { "cleverogre/plugin-update-checker": "dev-main", @@ -52,7 +52,7 @@ "Plugin", "WordPress" ], - "time": "2026-07-21T13:43:37+00:00" + "time": "2026-08-26T16:47:47+00:00" }, { "name": "cleverogre/plugin-update-checker", diff --git a/gulpfile.js b/gulpfile.js index 18e4f83..15de516 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -2,7 +2,10 @@ const fs = require('fs'), gulp = require('gulp'), clean = require('gulp-clean'), filter = require('gulp-filter').default, - zip = require('gulp-zip').default; + zip = require('gulp-zip').default, + postcss = require('gulp-postcss'), + cssnano = require('cssnano'), + sass = require('gulp-sass')(require('sass')); const PACKAGE = require('./package.json'); const NAME = PACKAGE.name.split('/').pop(); @@ -33,10 +36,36 @@ gulp.task( ) ); +gulp.task('clean-styles', () => { + return gulp.src('./assets/**/*.css', { + read: false, + allowEmpty: true, + }) + .pipe(filter((file) => !file.path.includes('klaro'))) + .pipe(clean()); +}) + gulp.task( 'clean', gulp.series( - 'clean-package' + 'clean-package', + 'clean-styles' + ) +); + +// Compile Tasks + +gulp.task('compile-styles', () => { + return gulp.src('assets/*.scss', { base: './' }) + .pipe(sass().on('error', sass.logError)) + .pipe(postcss(cssnano())) + .pipe(gulp.dest('./')); +}); + +gulp.task( + 'compile', + gulp.series( + 'compile-styles' ) ); @@ -44,20 +73,20 @@ gulp.task( gulp.task('package-copy', () => { return gulp.src([ - (fs.existsSync('acf') ? 'acf/**/*' : null), + 'assets/**/*', 'inc/**/*', - (fs.existsSync('lib') ? 'lib/**/*' : null),, + 'lib/**/*', 'vendor/**/*', 'LICENSE', `${NAME}.php`, 'readme.txt', - (fs.existsSync('updatepulse.json') ? 'updatepulse.json' : null), + 'updatepulse.json', '!vendor/**/node_modules/**/*', - ].filter(x => x), { + ], { base: './', encoding: false, }) - .pipe(filter((file) => !file.path.includes('/node_modules'))) + .pipe(filter((file) => !file.path.includes('/node_modules') && !file.path.endswith('.scss'))) .pipe(gulp.dest(`./dist/${NAME}`)); }); @@ -73,7 +102,6 @@ gulp.task('package-compress', () => { gulp.task( 'package', gulp.series( - 'clean', 'package-copy', 'package-compress', 'clean-package-files' @@ -86,6 +114,7 @@ gulp.task( 'default', gulp.series( 'clean', + 'compile', 'package' ) ); diff --git a/inc/abstract-service.php b/inc/abstract-service.php index 8c8953d..b4c9e2c 100644 --- a/inc/abstract-service.php +++ b/inc/abstract-service.php @@ -21,28 +21,48 @@ abstract class Service { use Singleton; protected string $name; + protected string $title; protected bool $contextualConsentOnly = false; - protected function __construct(string $name) { + protected function __construct(string $name, string $title = '') { $this->name = $name; + $this->title = !empty($title) ? $title : $name; Services::instance()->register($this); } + public function get_name(): string + { + return $this->name; + } + + public function get_title(): string + { + return $this->title; + } + + abstract public function get_purposes(): array; + + public function get_purpose(): string + { + $purposes = $this->get_purposes(); + if (empty($purposes)) return 'analytics'; + return array_values($purposes)[0]; + } + public function get_config(): array { $config = [ 'name' => $this->name, + 'title' => $this->title, 'purposes' => $this->get_purposes(), ]; if ($this->contextualConsentOnly) $config['contextualConsentOnly'] = true; return $config; } - public function get_purposes(): array + public function is_enabled(): bool { - return [ - 'marketing' - ]; + return Settings::instance()->is_service_enabled($this); } } @@ -50,9 +70,9 @@ abstract class Service { abstract class ScriptService extends Service { protected string $handle; - protected function __construct(string $handle, string $name = '') { + protected function __construct(string $handle, string $name = '', string $title = '') { $this->handle = $handle; - parent::__construct($name ?? $handle); + parent::__construct(!empty($name) ? $name : $handle, $title); add_filter('script_loader_tag', [$this, 'script_loader_tag'], 10, 3); } @@ -77,9 +97,9 @@ abstract class BlockService extends Service { protected string $blockName; - protected function __construct(string $blockName, string $name = '') { + protected function __construct(string $blockName, string $name = '', string $title = '') { $this->blockName = $blockName; - parent::__construct($name ?? $blockName); + parent::__construct(!empty($name) ? $name : $blockName, $title); add_filter("render_block_{$blockName}", [$this, 'render_block'], 10, 3); } @@ -91,9 +111,9 @@ abstract class GoogleTagManagerService extends ScriptService { protected string $consent_id; - protected function __construct(string $handle, string $name = '', string $consent_id = '') { - $this->consent_id = $consent_id ?? ($name ?? $handle); - parent::__construct($handle, $name); + protected function __construct(string $handle, string $name = '', string $consent_id = '', string $title = '') { + $this->consent_id = !empty($consent_id) ? $consent_id : (!empty($name) ? $name : $handle); + parent::__construct($handle, $name, $title); } #[Override] @@ -118,3 +138,36 @@ abstract class GoogleTagManagerService extends ScriptService { } } + +abstract class EmbedBlockService extends BlockService { + + protected function __construct(string $name, string $title = '') { + parent::__construct('core/embed', $name, $title); + } + + #[Override] + public function get_purposes(): array + { + return [ + 'marketing' + ]; + } + + #[Override] + public function render_block(string $block_content, array $block, WP_Block $instance): string + { + if ($block['name'] !== $this->name) return $block_content; + + $tags = new WP_HTML_Tag_Processor($block_content); + + if ($tags->next_tag('iframe')) { + $tags->set_attribute('data-name', $this->name); + $src = $tags->get_attribute('src'); + $tags->remove_attribute('src'); + $tags->set_attribute('data-src', $src); + } + + return $tags->get_updated_html(); + } + +} diff --git a/inc/class-config.php b/inc/class-config.php index be1743d..1b4e06a 100644 --- a/inc/class-config.php +++ b/inc/class-config.php @@ -18,14 +18,10 @@ defined('ABSPATH') || exit; final class Config { use Singleton; - protected function __construct() { - - } - public function get_config(): array { // See https://klaro.org/docs/integration/annotated-configuration - $config = [ + return apply_filters('ogre_consent_config', [ 'elementID' => Plugin::get_id(), 'storageMethod' => 'localStorage', 'storageName' => Plugin::get_id(), @@ -34,9 +30,21 @@ final class Config { 'mustConsent' => true, 'acceptAll' => true, 'hideLearnMore' => true, + 'disablePoweredBy' => true, 'services' => Services::instance()->get_config(), + ]); + } + + public static function get_purposes(): array + { + return [ + 'advertising' => Plugin::__('Advertising'), + 'analytics' => Plugin::__('Analytics'), + 'livechat' => Plugin::__('Livechat'), + 'marketing' => Plugin::__('Marketing'), + 'security' => Plugin::__('Security'), + 'styling' => Plugin::__('Styling'), ]; - return apply_filters('ogre_consent_config', $config); } } diff --git a/inc/class-script.php b/inc/class-script.php index 56e3c41..5937eec 100644 --- a/inc/class-script.php +++ b/inc/class-script.php @@ -24,38 +24,59 @@ final class Script { protected function __construct() { add_action('wp_enqueue_scripts', [$this, 'wp_enqueue_scripts']); - add_filter('script_loader_tag', [$this, 'script_loader_tag'], 10, 3); + add_filter('script_loader_tag', [$this, 'script_loader_tag'], 99, 3); } public function wp_enqueue_scripts(): void { + // Check user role + if (is_user_logged_in() && empty(array_intersect((array) wp_get_current_user()->roles, Settings::instance()->get_enabled_user_roles()))) return; + wp_enqueue_script( self::HANDLE, Plugin::get_url('assets/klaro.js'), ver: Plugin::get_version() ); - - wp_localize_script( - self::HANDLE, - self::CONFIG, - Config::instance()->get_config() - ); wp_enqueue_style( self::HANDLE, Plugin::get_url('assets/klaro.min.css'), ver: Plugin::get_version() ); + + wp_enqueue_style( + Plugin::get_id(), + Plugin::get_url('assets/style.css'), + deps: [ + self::HANDLE + ], + ver: Plugin::get_version() + ); + } + + private function get_config_tag(): string + { + return sprintf( + '', + esc_attr(self::HANDLE), + esc_js(self::CONFIG), + wp_json_encode(Config::instance()->get_config()) + ); } public function script_loader_tag(string $tag, string $handle, string $src): string { - if ($tag !== self::HANDLE) return $tag; + if ($handle !== self::HANDLE) return $tag; $tags = new WP_HTML_Tag_Processor($tag); if ($tags->next_tag('script')) { $tags->set_attribute('data-config', self::CONFIG); + if ((bool) apply_filters('ogre_consent_async', true)) { + $tags->set_attribute('async', true); + } } - return $tags->get_updated_html(); + $tag = $tags->get_updated_html(); + $tag = $this->get_config_tag() . $tag; + return $tag; } } diff --git a/inc/class-services.php b/inc/class-services.php index fe19e07..2103512 100644 --- a/inc/class-services.php +++ b/inc/class-services.php @@ -10,9 +10,7 @@ namespace Ogre\Consent; -use Ogre\Consent as Plugin; use Ogre\Singleton; -use WP_HTML_Tag_Processor; defined('ABSPATH') || exit; @@ -20,19 +18,34 @@ final class Services { use Singleton; protected array $services = []; - - protected function __construct() { - - } public function register(Service $service): void { $this->services[] = $service; } + public function get_services(): array + { + return $this->services; + } + + public function get_services_by_purpose(string $purpose): array + { + return array_filter( + $this->services, + fn (Service $service): bool => $service->get_purpose() == $purpose + ); + } + public function get_config(): array { - return array_map(fn (Service $service): array => $service->get_config(), $this->services); + return array_map( + fn (Service $service): array => $service->get_config(), + array_values(array_filter( + $this->services, + fn (Service $service): bool => $service->is_enabled() + )) + ); } } diff --git a/inc/class-settings.php b/inc/class-settings.php index f11e943..2c34fe6 100644 --- a/inc/class-settings.php +++ b/inc/class-settings.php @@ -11,8 +11,8 @@ namespace Ogre\Consent; use Override; -use Ogre\Settings as AbstractSettings; use Ogre\Consent as Plugin; +use Ogre\Settings as AbstractSettings; defined('ABSPATH') || exit; @@ -27,18 +27,68 @@ final class Settings extends AbstractSettings { $this->add_section( Plugin::__('General'), - Plugin::__('General settings for this plugin.') + sprintf( + Plugin::__('General settings for %s.'), + Plugin::get_title() + ) ); - $this->add_field( - 'text', - Plugin::__('Text'), + $this->add_checkbox_field( + 'user_roles', + Plugin::__('User Roles'), + array_map( + fn (array $details): string => translate_user_role($details['name']), + array_reverse(get_editable_roles()) + ), [ - 'placeholder' => Plugin::__('Insert some text here...'), - 'description' => Plugin::__('An example field.'), + 'description' => Plugin::__('The consent modal is disabled by default for all users. You can enable it for each user role using the settings below.'), ] ); - + + $this->add_section( + Plugin::__('Services'), + Plugin::__('You can control which services are included in user consent (opt-in) using the options below.'), + 'services' + ); + + $purposes = Config::get_purposes(); + foreach ($purposes as $name => $label) { + $services = []; + foreach (Services::instance()->get_services_by_purpose($name) as $service) { + $services[$service->get_name()] = $service->get_title(); + } + if (empty($services)) continue; + + $this->add_checkbox_field( + sprintf('services-%s', $name), + $label, + $services, + [ + 'name' => 'services', + 'hide_value' => true, + ], + 'services' + ); + } + } + + public function is_service_enabled(Service|string $service): bool + { + if (is_a($service, Service::class)) { + $service = $service->get_name(); + } else if (!is_string($service) || empty($service)) { + return false; + } + return $this->is_checked('services', $service); + } + + public function get_enabled_user_roles(): array + { + if (!function_exists('get_editable_roles')) include_once(ABSPATH . 'wp-admin/includes/user.php'); + return array_filter( + array_keys(get_editable_roles()), + fn (string $role): bool => $this->is_checked('user_roles', $role) + ); } } diff --git a/inc/integrations/class-gravityforms.php b/inc/integrations/class-gravityforms.php new file mode 100644 index 0000000..022c1dd --- /dev/null +++ b/inc/integrations/class-gravityforms.php @@ -0,0 +1,203 @@ +_version = Plugin::get_version(); + $this->_slug = Plugin::get_id(); + $this->_path = sprintf( + '%1$s/%1$s.php', + Plugin::get_id() + ); + $this->_full_path = Plugin::get_file(); + $this->_title = sprintf( + Plugin::__('%s Add-On'), + Plugin::get_title() + ); + $this->_short_title = Plugin::get_title(); + + parent::__construct(); + } + + public function init() { + add_filter('gform_submit_button', [$this, 'submit_button'], 10, 2); + add_filter('gform_validation', [$this, 'validation'], 10, 2); + + parent::init(); + } + + public function get_menu_icon() { + return 'gform-icon--lock'; + } + + public function plugin_settings_fields() { + return [ + [ + 'title' => esc_html(sprintf( + Plugin::__('%s Settings'), + Plugin::get_title() + )), + 'description' => sprintf( + Plugin::__('Looking to configure the rest of Ogre Consent? You can find the settings on this page.'), + esc_url(Settings::get_url()) + ), + 'fields' => [ + [ + 'label' => sprintf( + Plugin::esc_html__('Enable %s'), + Plugin::get_title() + ), + 'type' => 'checkbox', + 'name' => 'enabled', + 'choices' => [ + [ + 'label' => Plugin::esc_html__('Enable consent on all forms by default.'), + 'name' => 'enabled', + ] + ] + ] + ] + ] + ]; + } + + public function form_settings_fields($form) { + return [ + [ + 'title' => esc_html(sprintf( + Plugin::__('%s Settings'), + Plugin::get_title() + )), + 'fields' => [ + [ + 'type' => 'checkbox', + 'name' => 'disabled', + 'choices' => [ + [ + 'label' => Plugin::esc_html__('Disable consent for this form.'), + 'name' => 'disabled', + ] + ] + ] + ] + ] + ]; + } + + public function is_enabled(array|null $form = null): bool { + // Check to make sure that we're enabled on the plugin level first + $plugin_enabled = $this->get_plugin_setting('enabled') === '1'; + if (is_null($form) || !$plugin_enabled) return $plugin_enabled; + + $form_id = !is_null($form) ? absint(rgar($form, 'id')) : 0; + + // If Gravity Perks Nested Forms is active and the current form is nested, disable entirely (it's not compatible at the moment) + if (class_exists('GP_Nested_Forms')) { + $gp_nested_forms = GP_Nested_Forms::get_instance(); + if ($gp_nested_forms->is_nested_form_submission() && $gp_nested_forms->get_parent_form_id() !== $form_id) return false; + } + + // Now check to see if the opt-out is enabled within the form settings + $form_settings = $this->get_form_settings($form); + $form_disabled = (bool) rgar($form_settings, 'disabled'); + return !$form_disabled; + } + + public function set_enabled(bool $value): bool { + $settings = (array) $this->get_plugin_settings(); + $settings['enabled'] = !!$value ? '1' : '0'; + $this->update_plugin_settings($settings); + return true; + } + + public function submit_button(string $button_input, array $form): string { + if (!Settings::is_connected() || !$this->is_enabled($form)) return $button_input; + if ((is_admin() && !defined('DOING_AJAX')) || GFCommon::is_form_editor()) return $button_input; + + $id = sprintf( + 'gform_cap_%d', + absint(rgar($form, 'id')) + ); + + ob_start(); + Widget::render([ + 'id' => $id, + ]); + $button_input = ob_get_clean() . $button_input; + if (Settings::is_widget_floating()) { + $button_input = Widget::set_button_floating( + $button_input, + [ + 'id' => $id, + ] + ); + } + return $button_input; + } + + public function validation(array $validation_result, string $context): array { + if ($context != 'form-submit') return $validation_result; + + $form = $validation_result['form']; + + // Make sure that we are actually processing the end of the form + if (!GFFormDisplay::is_last_page($form) || rgpost('action') == 'heartbeat') return $validation_result; + + // Make sure that we are connected and enabled + if (!Settings::is_connected() || !$this->is_enabled($form)) return $validation_result; + + $errors = API::process(Widget::get_token()); + if ($errors->has_errors()) { + $validation_result['is_valid'] = false; + } + + // TODO: Mark as spam (optional) + return $validation_result; + } + + public function plugin_settings_link( $links, $file ) { + // Remove plugin action link + return $links; + } + + public function get_url(): string { + return add_query_arg( + [ + 'page' => 'gf_settings', + 'subview' => $this->get_slug() + ], + admin_url('admin.php') + ); + } + +} diff --git a/inc/services/class-google-adsense.php b/inc/services/class-google-adsense.php new file mode 100644 index 0000000..b00d677 --- /dev/null +++ b/inc/services/class-google-adsense.php @@ -0,0 +1,35 @@ + true, 'onAccept' => "for (let k of Object.keys(opts.consents)) { if (opts.consents[k]) { dataLayer.push({'event': 'ogre-consent-'+k+'-accepted'}) } }", 'onInit' => "window.dataLayer = window.dataLayer || []; window.gtag = function() { dataLayer.push(arguments) }; gtag('consent', 'default', {'ad_storage': 'denied', 'analytics_storage': 'denied', 'ad_user_data': 'denied', 'ad_personalization': 'denied'}); gtag('set', 'ads_data_redaction', true);", ] @@ -36,4 +44,4 @@ final class GoogleTagManager extends ScriptService { } -GoogleAnalytics::instance(); +GoogleTagManager::instance(); diff --git a/inc/services/class-twitter.php b/inc/services/class-twitter.php new file mode 100644 index 0000000..abda779 --- /dev/null +++ b/inc/services/class-twitter.php @@ -0,0 +1,26 @@ +next_tag('iframe')) { - $tags->set_attribute('data-name', $this->name); - $src = $tags->get_attribute('src'); - $tags->remove_attribute('src'); - $tags->set_attribute('data-src', $src); - } - - return $tags->get_updated_html(); + parent::__construct('youtube', Plugin::__('YouTube')); } } diff --git a/ogre-consent.php b/ogre-consent.php new file mode 100644 index 0000000..f58749a --- /dev/null +++ b/ogre-consent.php @@ -0,0 +1,105 @@ +add_files([ + 'inc/abstract-service.php', + 'inc/class-config.php', + 'inc/class-script.php', + 'inc/class-services.php', + 'inc/class-settings.php', + 'inc/services/class-google-adsense.php', + 'inc/services/class-google-analytics.php', + 'inc/services/class-google-tag-manager.php', + 'inc/services/class-twitter.php', + 'inc/services/class-youtube.php', + ]); + } + + protected function enable():void { + parent::enable(); + add_filter('plugin_action_links_' . self::get_basename(), [$this, 'action_links'], 10, 1); + add_action('gform_loaded', [$this, 'load_gravityforms'], 5, 0); + } + + protected function disable():void { + parent::disable(); + remove_filter('plugin_action_links_' . self::get_basename(), [$this, 'action_links'], 10); + remove_action('gform_loaded', [$this, 'load_gravityforms'], 5); + } + + public function action_links(array $links): array + { + if (current_user_can('manage_options')) { + array_unshift($links, sprintf( + '%s', + esc_url(Settings::instance()->get_url()), + esc_html(self::__('Settings')) + )); + } + return $links; + } + + public function load_gravityforms(): void + { + if (!self::is_gravityforms_active() || !method_exists('GFForms', 'include_addon_framework')) return; + + require_once('inc/integrations/class-gravityforms.php'); + + GFAddOn::register(GravityForms::class); + } + + } + +} + +Consent::instance(); diff --git a/package-lock.json b/package-lock.json index 804efec..7757aee 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,11 +13,18 @@ "klaro": "^0.7.21" }, "devDependencies": { + "autoprefixer": "^10.5.4", + "cssnano": "^8.0.8", "gulp": "^5.0.0", "gulp-clean": "^0.4.0", "gulp-cli": "^2.3.0", "gulp-filter": "^10.0.0", - "gulp-zip": "^6.1.0" + "gulp-postcss": "^10.0.0", + "gulp-sass": "^6.0.1", + "gulp-zip": "^6.1.0", + "postcss": "^8.5.26", + "postcss-cli": "^11.0.1", + "sass": "^1.103.1" }, "engines": { "node": ">=21.1.0", @@ -282,6 +289,13 @@ "node": ">=6.9.0" } }, + "node_modules/@colordx/core": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/@colordx/core/-/core-5.6.0.tgz", + "integrity": "sha512-EDlcg/Hmlj1WuFh/Os9YhA+A2aasB2XlgwFfGePUDuW7fVHC07HBi5AFIMx0Ct1eM8kHM9NRyOtZ0MuVYa8xvg==", + "dev": true, + "license": "MIT" + }, "node_modules/@eslint-community/eslint-utils": { "version": "4.10.1", "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.10.1.tgz", @@ -1236,6 +1250,43 @@ "node": ">= 4.5.0" } }, + "node_modules/autoprefixer": { + "version": "10.5.4", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.5.4.tgz", + "integrity": "sha512-MaU0U/za7N3r6brxD4YB/l4NSrFzLPlANv6wEuQVaIPlD3L4W9rFcQPbL/EilY9BHhHvhfcz3gInDLrEtWT4EA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "browserslist": "^4.28.6", + "caniuse-lite": "^1.0.30001806", + "fraction.js": "^5.3.4", + "picocolors": "^1.1.1", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, "node_modules/b4a": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.8.1.tgz", @@ -1345,7 +1396,6 @@ "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.11.19.tgz", "integrity": "sha512-Grytf1xOxOEMTGRwx6rLGKkTabd4vMg3VrKdj/7joCmV0qgh4QwMMO6xh34YEXQqirAuUdgQGa5orJQQ+69RBw==", "license": "Apache-2.0", - "peer": true, "bin": { "baseline-browser-mapping": "dist/cli.cjs" }, @@ -1393,6 +1443,13 @@ "node": ">= 6" } }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "dev": true, + "license": "ISC" + }, "node_modules/brace-expansion": { "version": "1.1.18", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.18.tgz", @@ -1435,7 +1492,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "baseline-browser-mapping": "^2.11.12", "caniuse-lite": "^1.0.30001809", @@ -1583,6 +1639,17 @@ "node": ">=0.10.0" } }, + "node_modules/caniuse-api": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-4.0.0.tgz", + "integrity": "sha512-B0hQ1OLyJuHTQSOWXvwibWqM6DCoqJdvBA6X1S/53bd4XU7LJ1yurIPlrsouol3mw1jh9pGI4ivubSpmJeIqCA==", + "dev": true, + "license": "MIT", + "dependencies": { + "browserslist": "^4.0.0", + "caniuse-lite": "^1.0.0" + } + }, "node_modules/caniuse-lite": { "version": "1.0.30001810", "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001810.tgz", @@ -1601,8 +1668,7 @@ "url": "https://github.com/sponsors/ai" } ], - "license": "CC-BY-4.0", - "peer": true + "license": "CC-BY-4.0" }, "node_modules/chalk": { "version": "5.6.2", @@ -1833,6 +1899,16 @@ "color-support": "bin.js" } }, + "node_modules/commander": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-11.1.0.tgz", + "integrity": "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16" + } + }, "node_modules/component-emitter": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.1.tgz", @@ -1914,6 +1990,177 @@ "node": ">= 8" } }, + "node_modules/css-select": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-6.0.0.tgz", + "integrity": "sha512-rZZVSLle8v0+EY8QAkDWrKhpgt6SA5OtHsgBnsj6ZaLb5dmDVOWUDtQitd9ydxxvEjhewNudS6eTVU7uOyzvXw==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^7.0.0", + "domhandler": "^5.0.3", + "domutils": "^3.2.2", + "nth-check": "^2.1.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css-tree": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-3.2.1.tgz", + "integrity": "sha512-X7sjQzceUhu1u7Y/ylrRZFU2FS6LRiFVp6rKLPg23y3x3c3DOKAwuXGDp+PAGjh6CSnCjYeAul8pcT8bAl+lSA==", + "dev": true, + "license": "MIT", + "dependencies": { + "mdn-data": "2.27.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" + } + }, + "node_modules/css-what": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-7.0.0.tgz", + "integrity": "sha512-wD5oz5xibMOPHzy13CyGmogB3phdvcDaB5t0W/Nr5Z2O/agcB8YwOz6e2Lsp10pNDzBoDO9nVa3RGs/2BttpHQ==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true, + "license": "MIT", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cssnano": { + "version": "8.0.8", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-8.0.8.tgz", + "integrity": "sha512-lN79/SZ2L0bGBBxGnChGKkbodkXAQUR5Em4LBW3rijpdrvUY8jxKhp2uQ8LgI8sKKbjCnI8peqPSoSZJDuchKw==", + "dev": true, + "license": "MIT", + "dependencies": { + "cssnano-preset-default": "^8.0.8", + "lilconfig": "^3.1.3" + }, + "engines": { + "node": "^22.11.0 || ^24.11.0 || >=26.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/cssnano" + }, + "peerDependencies": { + "postcss": "^8.5.26" + } + }, + "node_modules/cssnano-preset-default": { + "version": "8.0.8", + "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-8.0.8.tgz", + "integrity": "sha512-WHUoojPq3fMdps/OjSn73p6FDb3YAN7HiuMA5WJJxs6Ka0MFqtZZsS4EppIWTJzW/Ss4sEZHVIKst/qi22u3uA==", + "dev": true, + "license": "MIT", + "dependencies": { + "browserslist": "^4.28.8", + "cssnano-utils": "^6.0.4", + "postcss-calc": "^10.1.1", + "postcss-colormin": "^8.0.4", + "postcss-convert-values": "^8.0.4", + "postcss-discard-comments": "^8.0.4", + "postcss-discard-duplicates": "^8.0.4", + "postcss-discard-empty": "^8.0.5", + "postcss-discard-overridden": "^8.0.4", + "postcss-merge-longhand": "^8.0.4", + "postcss-merge-rules": "^8.0.5", + "postcss-minify-font-values": "^8.0.4", + "postcss-minify-gradients": "^8.0.5", + "postcss-minify-params": "^8.0.4", + "postcss-minify-selectors": "^8.0.5", + "postcss-normalize-charset": "^8.0.4", + "postcss-normalize-display-values": "^8.0.4", + "postcss-normalize-positions": "^8.0.4", + "postcss-normalize-repeat-style": "^8.0.4", + "postcss-normalize-string": "^8.0.4", + "postcss-normalize-timing-functions": "^8.0.4", + "postcss-normalize-unicode": "^8.0.4", + "postcss-normalize-url": "^8.0.4", + "postcss-normalize-whitespace": "^8.0.5", + "postcss-ordered-values": "^8.0.5", + "postcss-reduce-initial": "^8.0.5", + "postcss-reduce-transforms": "^8.0.4", + "postcss-svgo": "^8.0.5", + "postcss-unique-selectors": "^8.0.4" + }, + "engines": { + "node": "^22.11.0 || ^24.11.0 || >=26.0" + }, + "peerDependencies": { + "postcss": "^8.5.26" + } + }, + "node_modules/cssnano-utils": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-6.0.4.tgz", + "integrity": "sha512-j1z2mW4MqtcGM4I8TxXAdOXUifp1DZ5/bZnyYnCpHlzQ/ilCj2voLxE0aqEKnBDA5hF6HahSY13JU8kyZ1s8Mg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^22.11.0 || ^24.11.0 || >=26.0" + }, + "peerDependencies": { + "postcss": "^8.5.26" + } + }, + "node_modules/csso": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/csso/-/csso-5.0.5.tgz", + "integrity": "sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "css-tree": "~2.2.0" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/csso/node_modules/css-tree": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.2.1.tgz", + "integrity": "sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==", + "dev": true, + "license": "MIT", + "dependencies": { + "mdn-data": "2.0.28", + "source-map-js": "^1.0.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/csso/node_modules/mdn-data": { + "version": "2.0.28", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.28.tgz", + "integrity": "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==", + "dev": true, + "license": "CC0-1.0" + }, "node_modules/d": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/d/-/d-1.0.2.tgz", @@ -2036,6 +2283,16 @@ "node": ">=0.10.0" } }, + "node_modules/dependency-graph": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/dependency-graph/-/dependency-graph-1.0.0.tgz", + "integrity": "sha512-cW3gggJ28HZ/LExwxP2B++aiKxhJXMSIt9K48FOXQkm+vuG5gyatXnLsONRJdzO/7VfjDIiaOOa/bs4l464Lwg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, "node_modules/detect-file": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", @@ -2056,6 +2313,65 @@ "node": ">=8" } }, + "node_modules/dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "dev": true, + "license": "MIT", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "BSD-2-Clause" + }, + "node_modules/domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "domelementtype": "^2.3.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/domutils": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz", + "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, "node_modules/dunder-proto": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", @@ -2112,8 +2428,7 @@ "version": "1.5.414", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.414.tgz", "integrity": "sha512-aYlviXiaXBbzvKgyALpcMmqa3Np3sDr0XnZbEG62n2UpZFbEcjQ4EEMOLGzVPhwVnwTz0lvKY+GcARbunuHekw==", - "license": "ISC", - "peer": true + "license": "ISC" }, "node_modules/emoji-regex": { "version": "8.0.0", @@ -2132,6 +2447,19 @@ "once": "^1.4.0" } }, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, "node_modules/error-ex": { "version": "1.3.4", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz", @@ -2926,6 +3254,20 @@ "node": ">=0.10.0" } }, + "node_modules/fraction.js": { + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-5.3.4.tgz", + "integrity": "sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/rawify" + } + }, "node_modules/fragment-cache": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", @@ -2939,6 +3281,21 @@ "node": ">=0.10.0" } }, + "node_modules/fs-extra": { + "version": "11.4.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.4.0.tgz", + "integrity": "sha512-EQsFzMUJkCKGr1ePqlYADkIUmHW1s3ZXr5Yqy6wbGrfUCphpl2maM/kyOIRA2HpP3AaFQTZXD4ldjek+nccddA==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, "node_modules/fs-mkdirp-stream": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/fs-mkdirp-stream/-/fs-mkdirp-stream-2.0.1.tgz", @@ -3369,6 +3726,128 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/gulp-postcss": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/gulp-postcss/-/gulp-postcss-10.0.0.tgz", + "integrity": "sha512-z1RF2RJEX/BvFsKN11PXai8lRmihZTiHnlJf7Zu8uHaA/Q7Om4IeN8z1NtMAW5OiLwUY02H0DIFl9tHl0CNSgA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fancy-log": "^2.0.0", + "plugin-error": "^2.0.1", + "postcss-load-config": "^5.0.0", + "vinyl-sourcemaps-apply": "^0.2.1" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.0.0" + } + }, + "node_modules/gulp-postcss/node_modules/fancy-log": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-2.0.0.tgz", + "integrity": "sha512-9CzxZbACXMUXW13tS0tI8XsGGmxWzO2DmYrGuBJOJ8k8q2K7hwfJA5qHjuPPe8wtsco33YR9wc+Rlr5wYFvhSA==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-support": "^1.1.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/gulp-postcss/node_modules/plugin-error": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-2.0.1.tgz", + "integrity": "sha512-zMakqvIDyY40xHOvzXka0kUvf40nYIuwRE8dWhti2WtjQZ31xAgBZBhxsK7vK3QbRXS1Xms/LO7B5cuAsfB2Gg==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-colors": "^1.0.1" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/gulp-sass": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/gulp-sass/-/gulp-sass-6.0.1.tgz", + "integrity": "sha512-4wonidxB8lGPHvahelpGavUBJAuERSl+OIVxPCyQthK4lSJhZ/u3/qjFcyAtnMIXDl6fXTn34H4BXsN7gt54kQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "lodash.clonedeep": "^4.5.0", + "picocolors": "^1.0.0", + "plugin-error": "^1.0.1", + "replace-ext": "^2.0.0", + "strip-ansi": "^6.0.1", + "vinyl-sourcemaps-apply": "^0.2.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/gulp-sass/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/gulp-sass/node_modules/arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/gulp-sass/node_modules/plugin-error": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-1.0.1.tgz", + "integrity": "sha512-L1zP0dk7vGweZME2i+EeakvUNqSrdiI3F91TwEoYiGrAfUXmVv6fJIq4g82PAXxNsWOp0J7ZqQy/3Szz0ajTxA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-colors": "^1.0.1", + "arr-diff": "^4.0.0", + "arr-union": "^3.1.0", + "extend-shallow": "^3.0.2" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/gulp-sass/node_modules/replace-ext": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-2.0.0.tgz", + "integrity": "sha512-UszKE5KVK6JvyD92nzMn9cDapSk6w/CaFZ96CnmDMUqH9oowfxF/ZjRITD25H4DnOQClLA4/j7jLGXXLVKxAug==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/gulp-sass/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/gulp-zip": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/gulp-zip/-/gulp-zip-6.1.0.tgz", @@ -4413,6 +4892,19 @@ "node": ">=6" } }, + "node_modules/jsonfile": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.1.tgz", + "integrity": "sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, "node_modules/keyv": { "version": "4.5.4", "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", @@ -4524,6 +5016,19 @@ "node": ">=0.10.0" } }, + "node_modules/lilconfig": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", + "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antonk52" + } + }, "node_modules/load-json-file": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", @@ -4557,6 +5062,13 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/lodash.clonedeep": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==", + "dev": true, + "license": "MIT" + }, "node_modules/lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", @@ -4675,6 +5187,13 @@ "node": ">= 0.4" } }, + "node_modules/mdn-data": { + "version": "2.27.1", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.27.1.tgz", + "integrity": "sha512-9Yubnt3e8A0OKwxYSXyhLymGW4sCufcLG6VdiDdUGVkPhpqLxlvP5vl1983gQjJl3tqbrM731mjaZaP68AgosQ==", + "dev": true, + "license": "CC0-1.0" + }, "node_modules/micromatch": { "version": "3.1.10", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", @@ -4898,6 +5417,25 @@ "node": ">= 0.10" } }, + "node_modules/nanoid": { + "version": "3.3.18", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.18.tgz", + "integrity": "sha512-DTg4MJbGMWkfi6VZFdNt2/caMbQy4Ou+Op/hJQvGEWcnVfoA1QA+xzRKAzw9jD6+GVOOeYr/mIcuDSdug6F6+w==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, "node_modules/nanomatch": { "version": "1.2.13", "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", @@ -4957,7 +5495,6 @@ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.53.tgz", "integrity": "sha512-D9UOmYG3UH1V+ENW56t5QXBwJw1YEY18ruVeus89Rw+SyIgjPkCO84bRzO3uNIYosJbNwiabWVn48o3uJLjxFQ==", "license": "MIT", - "peer": true, "engines": { "node": ">=18" } @@ -5008,6 +5545,19 @@ "node": ">= 10.13.0" } }, + "node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, "node_modules/number-is-nan": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", @@ -5383,8 +5933,7 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "license": "ISC", - "peer": true + "license": "ISC" }, "node_modules/picomatch": { "version": "2.3.2", @@ -5506,6 +6055,722 @@ "node": ">=0.10.0" } }, + "node_modules/postcss": { + "version": "8.5.26", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.26.tgz", + "integrity": "sha512-u82N74LFzG8ca+dD8puPnplTXoGH4fTPpVGuIbt36G3qvNlkvfD0lEAZSxaly3KX8TS/L1A1gsCEmvKmBcVbkQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.17", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-calc": { + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-10.1.1.tgz", + "integrity": "sha512-NYEsLHh8DgG/PRH2+G9BTuUdtf9ViS+vdoQ0YA5OQdGsfN4ztiwtDWNtBl9EKeqNMFnIu8IKZ0cLxEQ5r5KVMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^7.0.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^18.12 || ^20.9 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.38" + } + }, + "node_modules/postcss-cli": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/postcss-cli/-/postcss-cli-11.0.1.tgz", + "integrity": "sha512-0UnkNPSayHKRe/tc2YGW6XnSqqOA9eqpiRMgRlV1S6HdGi16vwJBx7lviARzbV1HpQHqLLRH3o8vTcB0cLc+5g==", + "dev": true, + "license": "MIT", + "dependencies": { + "chokidar": "^3.3.0", + "dependency-graph": "^1.0.0", + "fs-extra": "^11.0.0", + "picocolors": "^1.0.0", + "postcss-load-config": "^5.0.0", + "postcss-reporter": "^7.0.0", + "pretty-hrtime": "^1.0.3", + "read-cache": "^1.0.0", + "slash": "^5.0.0", + "tinyglobby": "^0.2.12", + "yargs": "^17.0.0" + }, + "bin": { + "postcss": "index.js" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.0.0" + } + }, + "node_modules/postcss-cli/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/postcss-cli/node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/postcss-cli/node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/postcss-cli/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/postcss-cli/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/postcss-cli/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/postcss-cli/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/postcss-cli/node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/postcss-cli/node_modules/yargs": { + "version": "17.7.3", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.3.tgz", + "integrity": "sha512-GZtjxm/J/4TSxuL3FNYjCmLktBTnIw/rVmKSIyKeYAZpmJB2ig9VauCC5xsa82GNKVKDAqpOn3KVzNt0zmrU0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/postcss-cli/node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/postcss-colormin": { + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-8.0.4.tgz", + "integrity": "sha512-iQ8Eh6Fb3FJx32zduprL33D80bPnE9F4nm+EqvvoHvoK72H7XjvH4GzbD7VlIowmtzf96tgtkjZgmQ/bAi/CYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@colordx/core": "^5.5.0", + "browserslist": "^4.28.8", + "caniuse-api": "^4.0.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^22.11.0 || ^24.11.0 || >=26.0" + }, + "peerDependencies": { + "postcss": "^8.5.26" + } + }, + "node_modules/postcss-convert-values": { + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-8.0.4.tgz", + "integrity": "sha512-ifBmAJBfpDymi7r/CqxYRJWlG+BLdVmusUC/kFPOqH/+TitdBeHA68CYqY79wXL+iQnqg6e4LGHA2Mte14X6Ig==", + "dev": true, + "license": "MIT", + "dependencies": { + "browserslist": "^4.28.8", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^22.11.0 || ^24.11.0 || >=26.0" + }, + "peerDependencies": { + "postcss": "^8.5.26" + } + }, + "node_modules/postcss-discard-comments": { + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-8.0.4.tgz", + "integrity": "sha512-SU1uLYRQPKLJJmqEmqzu+Ze+9xDurBm7m/LOzXG/ANBAfAGLjbQF+oIyZnf3jV3F155q5rRMYXsoTNEJsPyHng==", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^7.1.5" + }, + "engines": { + "node": "^22.11.0 || ^24.11.0 || >=26.0" + }, + "peerDependencies": { + "postcss": "^8.5.26" + } + }, + "node_modules/postcss-discard-duplicates": { + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-8.0.4.tgz", + "integrity": "sha512-/ugMYYTE+IpHpTmwz6/S8w+blCz9pZNroUgadTdlbPnHoLLWis9QvwmoyWui2mOgFzuRM6Me7AnoGU3i0Ua2ng==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^22.11.0 || ^24.11.0 || >=26.0" + }, + "peerDependencies": { + "postcss": "^8.5.26" + } + }, + "node_modules/postcss-discard-empty": { + "version": "8.0.5", + "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-8.0.5.tgz", + "integrity": "sha512-im0QtfNFa6V3SGPrfqzrWYuhzSz1ztWORKsuhZHQbWdKMh0DiNj3pmqBnABbhdKjyeW6nZ1oZYGh4dMc3biyaw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^22.11.0 || ^24.11.0 || >=26.0" + }, + "peerDependencies": { + "postcss": "^8.5.26" + } + }, + "node_modules/postcss-discard-overridden": { + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-8.0.4.tgz", + "integrity": "sha512-NqupxmnSSfWPJJDYbQk1qXWRwr+lw4Kyp/LSOjqwTpy/vSwo34EVXYKywgemSWpgh39P7Cs/G+tqynbRlXoJhw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^22.11.0 || ^24.11.0 || >=26.0" + }, + "peerDependencies": { + "postcss": "^8.5.26" + } + }, + "node_modules/postcss-load-config": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-5.1.0.tgz", + "integrity": "sha512-G5AJ+IX0aD0dygOE0yFZQ/huFFMSNneyfp0e3/bT05a8OfPC5FUoZRPfGijUdGOJNMewJiwzcHJXFafFzeKFVA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "lilconfig": "^3.1.1", + "yaml": "^2.4.2" + }, + "engines": { + "node": ">= 18" + }, + "peerDependencies": { + "jiti": ">=1.21.0", + "postcss": ">=8.0.9", + "tsx": "^4.8.1" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + }, + "postcss": { + "optional": true + }, + "tsx": { + "optional": true + } + } + }, + "node_modules/postcss-merge-longhand": { + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-8.0.4.tgz", + "integrity": "sha512-ammolHhMvuTz/L9YN/ge1SWbUDcD3Y9o2gXlo3S6H4MCJHheyVPwcI/LAnSuNT4gcUmSF9pNTXo7+3M/2MFPAQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0", + "stylehacks": "^8.0.4" + }, + "engines": { + "node": "^22.11.0 || ^24.11.0 || >=26.0" + }, + "peerDependencies": { + "postcss": "^8.5.26" + } + }, + "node_modules/postcss-merge-rules": { + "version": "8.0.5", + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-8.0.5.tgz", + "integrity": "sha512-jz+QaKz4VhjsqTVsJMRuH+EvrX1F9l6kYFuF8g6geVxFoYnPEZN4G+zqCb6zhxOIcc2aeAo38XEl2pOIZi2gBw==", + "dev": true, + "license": "MIT", + "dependencies": { + "browserslist": "^4.28.8", + "caniuse-api": "^4.0.0", + "cssnano-utils": "^6.0.4", + "postcss-selector-parser": "^7.1.5" + }, + "engines": { + "node": "^22.11.0 || ^24.11.0 || >=26.0" + }, + "peerDependencies": { + "postcss": "^8.5.26" + } + }, + "node_modules/postcss-minify-font-values": { + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-8.0.4.tgz", + "integrity": "sha512-wZZgJ87U5WbQCEM0EOY/oM7M1a+sqW6vrOClGC9lNbsY0HYmbMFvFuukBn8PzF+ikKmaT0QB+uSAHTRLzMkD+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^22.11.0 || ^24.11.0 || >=26.0" + }, + "peerDependencies": { + "postcss": "^8.5.26" + } + }, + "node_modules/postcss-minify-gradients": { + "version": "8.0.5", + "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-8.0.5.tgz", + "integrity": "sha512-ViFzyy4qqTcl2D1+SpoubxkgGUvWNRPxboQKL64WON60KslCzi+XOf/Yn5QdQlBYI8/ChCpYMLS3FJ0ksA+r1Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@colordx/core": "^5.5.0", + "cssnano-utils": "^6.0.4", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^22.11.0 || ^24.11.0 || >=26.0" + }, + "peerDependencies": { + "postcss": "^8.5.26" + } + }, + "node_modules/postcss-minify-params": { + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-8.0.4.tgz", + "integrity": "sha512-TDx9O/ni7KazRK32pVvoo3MjExyVxWE0949vB2XZ0oHnxdAtQFHa9oG21wWkvsOL3osjiOVejwDLe6a0d0EuSw==", + "dev": true, + "license": "MIT", + "dependencies": { + "browserslist": "^4.28.8", + "cssnano-utils": "^6.0.4", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^22.11.0 || ^24.11.0 || >=26.0" + }, + "peerDependencies": { + "postcss": "^8.5.26" + } + }, + "node_modules/postcss-minify-selectors": { + "version": "8.0.5", + "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-8.0.5.tgz", + "integrity": "sha512-i+PlhVCaPa7xevjhpActH2PrP27kDNSuuFf/ZGk8YrIcd1pd3Mfcfiv8H7dbY1/vz7U+QparioAtJaFV+IEwQg==", + "dev": true, + "license": "MIT", + "dependencies": { + "browserslist": "^4.28.8", + "caniuse-api": "^4.0.0", + "cssesc": "^3.0.0", + "postcss-selector-parser": "^7.1.5" + }, + "engines": { + "node": "^22.11.0 || ^24.11.0 || >=26.0" + }, + "peerDependencies": { + "postcss": "^8.5.26" + } + }, + "node_modules/postcss-normalize-charset": { + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-8.0.4.tgz", + "integrity": "sha512-ihNV/Q9V/+Q9NTqgoK4FOwI7ipqJlsaxoTWxkGyCMi4ArLKX8HqLYIqATB/8xhXd9K88PCXqdR8218u9uuyc4w==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^22.11.0 || ^24.11.0 || >=26.0" + }, + "peerDependencies": { + "postcss": "^8.5.26" + } + }, + "node_modules/postcss-normalize-display-values": { + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-8.0.4.tgz", + "integrity": "sha512-F8DGtzelJDV6S5mhcugc+EJ8sXI+kFv2PBedkfMWqd8mvTE4qyy3kva6AQwjy2+L2lZ9TGTkSumdq+n3EhGeAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^22.11.0 || ^24.11.0 || >=26.0" + }, + "peerDependencies": { + "postcss": "^8.5.26" + } + }, + "node_modules/postcss-normalize-positions": { + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-8.0.4.tgz", + "integrity": "sha512-anOMhqe6Z0OP4jvchK1v1hIG08kO7rsp8uHrxT2+XaKp8wbvVcUO3QHUzRmQDazWUPtRzy1h2UlixyJenF42sg==", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^22.11.0 || ^24.11.0 || >=26.0" + }, + "peerDependencies": { + "postcss": "^8.5.26" + } + }, + "node_modules/postcss-normalize-repeat-style": { + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-8.0.4.tgz", + "integrity": "sha512-vY8+k+/bFT7B8gzlHVye8FxBTMEpUAQxAgb4UYFAGGsKmXfwEvc7VPs+kpFNrTeqVKAvVh8+VVhZ+f3S4TWJPg==", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^22.11.0 || ^24.11.0 || >=26.0" + }, + "peerDependencies": { + "postcss": "^8.5.26" + } + }, + "node_modules/postcss-normalize-string": { + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-8.0.4.tgz", + "integrity": "sha512-dWnV1frIV1XUlSYzJudceAbQ7PGyho9EgVHQXMcAoog6Nwnet3G9rz8IXcCb0EF2eefmpYG9hDT9+yWJOxc5zw==", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^22.11.0 || ^24.11.0 || >=26.0" + }, + "peerDependencies": { + "postcss": "^8.5.26" + } + }, + "node_modules/postcss-normalize-timing-functions": { + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-8.0.4.tgz", + "integrity": "sha512-VANJsokAWdQ03ZJwmcdEKXJjVHRtMgalB/BgbCgN3CRTdbwB5TXlSDRmdShSCxpnZs8WLAm0mPa//p5o5D/ZTg==", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^22.11.0 || ^24.11.0 || >=26.0" + }, + "peerDependencies": { + "postcss": "^8.5.26" + } + }, + "node_modules/postcss-normalize-unicode": { + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-8.0.4.tgz", + "integrity": "sha512-SxVEoFdYed0bxxwZwAXnaAZ2lzNb5jtiQvYWyMIEqnGOzCuztWpVO8LvsqpOfUIacOb6oYaWi7WOAZR36OhYqw==", + "dev": true, + "license": "MIT", + "dependencies": { + "browserslist": "^4.28.8", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^22.11.0 || ^24.11.0 || >=26.0" + }, + "peerDependencies": { + "postcss": "^8.5.26" + } + }, + "node_modules/postcss-normalize-url": { + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-8.0.4.tgz", + "integrity": "sha512-JKZW8KRHkLEYkUb/55n3knDUMZeyvxlTv7ZA82bcHiCjL81b0Yyf9fIUBAYKZ6ucDgKfCDM78xhXuteVlk/o9Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^22.11.0 || ^24.11.0 || >=26.0" + }, + "peerDependencies": { + "postcss": "^8.5.26" + } + }, + "node_modules/postcss-normalize-whitespace": { + "version": "8.0.5", + "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-8.0.5.tgz", + "integrity": "sha512-xuFovful3vVIA9fWWmAL2pG1Qr95Udj2MrLgjU50C6r+Xnh3s6t2BN1xXQ8lnCOCAtzMvMpPWYlnAh4nSv5VEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^22.11.0 || ^24.11.0 || >=26.0" + }, + "peerDependencies": { + "postcss": "^8.5.26" + } + }, + "node_modules/postcss-ordered-values": { + "version": "8.0.5", + "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-8.0.5.tgz", + "integrity": "sha512-aDL7nPR7w1foUqo4rN6QY1Kr45+SYELnmUg5taZehh7FfFdxQmUjbuOOBuffIXjiHV45zqgFHCb4azsWW19jyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "cssnano-utils": "^6.0.4", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^22.11.0 || ^24.11.0 || >=26.0" + }, + "peerDependencies": { + "postcss": "^8.5.26" + } + }, + "node_modules/postcss-reduce-initial": { + "version": "8.0.5", + "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-8.0.5.tgz", + "integrity": "sha512-Bh5d7zjH1Ai9LzJ1qULUZIaC18cniD+wA6gFlOPglMxJRC7meXbuPvpJ/zHQGg5QKwQgit++XQhDTiEIhCk8Ow==", + "dev": true, + "license": "MIT", + "dependencies": { + "browserslist": "^4.28.8", + "caniuse-api": "^4.0.0" + }, + "engines": { + "node": "^22.11.0 || ^24.11.0 || >=26.0" + }, + "peerDependencies": { + "postcss": "^8.5.26" + } + }, + "node_modules/postcss-reduce-transforms": { + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-8.0.4.tgz", + "integrity": "sha512-ZGU7/R0GmjE3x2mOGB0g9Ohx74X+JjYX62RB5IBYLOe6R0fuHGZ76HtTY2CdM5NE8Yey/ew5clEf8iZQnjDjWA==", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^22.11.0 || ^24.11.0 || >=26.0" + }, + "peerDependencies": { + "postcss": "^8.5.26" + } + }, + "node_modules/postcss-reporter": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-reporter/-/postcss-reporter-7.1.0.tgz", + "integrity": "sha512-/eoEylGWyy6/DOiMP5lmFRdmDKThqgn7D6hP2dXKJI/0rJSO1ADFNngZfDzxL0YAxFvws+Rtpuji1YIHj4mySA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "picocolors": "^1.0.0", + "thenby": "^1.3.4" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-selector-parser": { + "version": "7.1.5", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.5.tgz", + "integrity": "sha512-KvvtD7SrlBP7dlgkBghEE3r84CABm5SmV2aNcG4oCA+qDnJ/tvKonFVvwWAyyWUEwxuNawdfEAZKP9zM3oZ2Uw==", + "dev": true, + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-svgo": { + "version": "8.0.5", + "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-8.0.5.tgz", + "integrity": "sha512-8B5r9VfLVD2lANKxDi4FXeP2MX6NdaGIQwaMVXXy5DhzAPO3CdHqPYqknF63y7tuQLB+rSvYyNltW/tHHg4fAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0", + "svgo": "^4.0.2" + }, + "engines": { + "node": "^22.11.0 || ^24.11.0 || >=26.0" + }, + "peerDependencies": { + "postcss": "^8.5.26" + } + }, + "node_modules/postcss-unique-selectors": { + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-8.0.4.tgz", + "integrity": "sha512-Sby0EtmD1mlvcZSWP5eXjxhxVgvXE5QVRzd+8NH0IbF+lYQIM57ybwAvJYYtI/fexMgCWcRnDETovjKOcLJb8w==", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^7.1.5" + }, + "engines": { + "node": "^22.11.0 || ^24.11.0 || >=26.0" + }, + "peerDependencies": { + "postcss": "^8.5.26" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true, + "license": "MIT" + }, "node_modules/prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", @@ -5543,6 +6808,13 @@ "node": ">=6" } }, + "node_modules/read-cache": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.2.tgz", + "integrity": "sha512-/peqiBB/n07gQGLsWaHho3WfvUyRscw0gYTsEFMhrIe/nWLkYaf5SbKYjGYqtRV3aPwykJgF2VEMo1ac4bnsGA==", + "dev": true, + "license": "MIT" + }, "node_modules/read-pkg": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", @@ -5897,6 +7169,16 @@ "url": "https://paulmillr.com/funding/" } }, + "node_modules/sax": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.6.1.tgz", + "integrity": "sha512-42tBVwLWnaQvW5zc4HbZrTuWccECCZfBi92FDuwtqxasH+JbPB3/FOKb1m222K42R4WxuxzzMsTswfzgtSu64Q==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=11.0.0" + } + }, "node_modules/semver": { "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", @@ -6439,6 +7721,23 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/stylehacks": { + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-8.0.4.tgz", + "integrity": "sha512-irgZeyYBFVkb8k7yTRQ9No/bTniTGqzptGVMG1/Mj3N2YnI8nIozzY1pcok4i01NfrCSqvc0PdQB6O6kr6dJHw==", + "dev": true, + "license": "MIT", + "dependencies": { + "browserslist": "^4.28.8", + "postcss-selector-parser": "^7.1.5" + }, + "engines": { + "node": "^22.11.0 || ^24.11.0 || >=26.0" + }, + "peerDependencies": { + "postcss": "^8.5.26" + } + }, "node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -6485,6 +7784,32 @@ "es6-symbol": "^3.1.1" } }, + "node_modules/svgo": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-4.1.0.tgz", + "integrity": "sha512-bkxnTg1kSU0guhIBmibA6UUhrQmPVA1XsQLN+ylCd+UWzbnLkySOcXpyk1mrl05f+pcaCx2eHb+sp6BgMZWX+Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "commander": "^11.1.0", + "css-select": "^6.0.0", + "css-tree": "^3.0.1", + "css-what": "^7.0.0", + "csso": "^5.0.5", + "picocolors": "^1.1.1", + "sax": "1.6.1" + }, + "bin": { + "svgo": "bin/svgo.js" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/svgo" + } + }, "node_modules/teex": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/teex/-/teex-1.0.1.tgz", @@ -6505,6 +7830,13 @@ "b4a": "^1.6.4" } }, + "node_modules/thenby": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/thenby/-/thenby-1.4.1.tgz", + "integrity": "sha512-D5a/bO0KdalOE3q8MlrRmSxjbKZHT3MQmXkJP+r97Vw8MMwOZKOwUSEyTtK7eSMj2y0kyAjpYMRMZmmLw1FtNQ==", + "dev": true, + "license": "Apache-2.0" + }, "node_modules/through2": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", @@ -6526,6 +7858,54 @@ "node": ">=0.10.0" } }, + "node_modules/tinyglobby": { + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz", + "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tinyglobby/node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/tinyglobby/node_modules/picomatch": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.7.tgz", + "integrity": "sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/to-absolute-glob": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/to-absolute-glob/-/to-absolute-glob-3.0.0.tgz", @@ -6734,6 +8114,16 @@ "node": ">=0.10.0" } }, + "node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, "node_modules/unset-value": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", @@ -6805,7 +8195,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "escalade": "^3.2.0", "picocolors": "^1.1.1" @@ -7040,6 +8429,16 @@ "node": ">=10.13.0" } }, + "node_modules/vinyl-sourcemaps-apply": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/vinyl-sourcemaps-apply/-/vinyl-sourcemaps-apply-0.2.1.tgz", + "integrity": "sha512-+oDh3KYZBoZC8hfocrbrxbLUeaYtQK7J5WU5Br9VqWqmCll3tFJqKp97GC9GmMsVIL0qnx2DgEDVxdo5EZ5sSw==", + "dev": true, + "license": "ISC", + "dependencies": { + "source-map": "^0.5.1" + } + }, "node_modules/webpack-merge": { "version": "5.10.0", "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz", @@ -7138,6 +8537,22 @@ "license": "ISC", "peer": true }, + "node_modules/yaml": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.9.0.tgz", + "integrity": "sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA==", + "dev": true, + "license": "ISC", + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14.6" + }, + "funding": { + "url": "https://github.com/sponsors/eemeli" + } + }, "node_modules/yargs": { "version": "7.1.2", "resolved": "https://registry.npmjs.org/yargs/-/yargs-7.1.2.tgz", diff --git a/package.json b/package.json index 89cfd6a..5b9a293 100644 --- a/package.json +++ b/package.json @@ -20,11 +20,18 @@ "postupdate": "make postupdate" }, "devDependencies": { + "autoprefixer": "^10.5.4", + "cssnano": "^8.0.8", "gulp": "^5.0.0", "gulp-clean": "^0.4.0", "gulp-cli": "^2.3.0", "gulp-filter": "^10.0.0", - "gulp-zip": "^6.1.0" + "gulp-postcss": "^10.0.0", + "gulp-sass": "^6.0.1", + "gulp-zip": "^6.1.0", + "postcss": "^8.5.26", + "postcss-cli": "^11.0.1", + "sass": "^1.103.1" }, "dependencies": { "klaro": "^0.7.21" diff --git a/plugin.php b/plugin.php deleted file mode 100644 index cb23ede..0000000 --- a/plugin.php +++ /dev/null @@ -1,75 +0,0 @@ -add_files([ - 'inc/class-settings.php', - ]); - } - - protected function enable():void { - parent::enable(); - add_filter('plugin_action_links_' . self::get_basename(), [$this, 'action_links'], 10, 1); - } - - protected function disable():void { - parent::disable(); - remove_filter('plugin_action_links_' . self::get_basename(), [$this, 'action_links'], 10); - } - - public function action_links(array $links): array - { - if (current_user_can('manage_options')) { - array_unshift($links, sprintf( - '%s', - esc_url(Settings::instance()->get_url()), - esc_html(self::__('Settings')) - )); - } - return $links; - } - -} - -Consent::instance(); diff --git a/postcss.config.js b/postcss.config.js new file mode 100644 index 0000000..e8b4689 --- /dev/null +++ b/postcss.config.js @@ -0,0 +1,18 @@ +module.exports = { + plugins: [ + require('autoprefixer')({ + overrideBrowserslist: [ + "ie 10", + "> 0.3%", + "last 7 versions", + "Android >= 4", + "Firefox >= 20", + "iOS >= 8" + ], + flexbox: true + }), + require('cssnano')({ + preset: 'default', + }) + ] +};