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',
+ })
+ ]
+};