From 582179b5b24730f08b1bd36f8ad0a7411eac4e05 Mon Sep 17 00:00:00 2001 From: Roussange Alexandre Date: Wed, 2 Jul 2025 17:01:51 +0200 Subject: [PATCH 1/9] =?UTF-8?q?feat=20=E2=9C=A8update=20to=20typescript?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 1 + crowdsec-docs/.npmrc | 1 + crowdsec-docs/babel.config.js | 3 - .../docs/appsec/quickstart/traefik.mdx | 2 +- .../docs/getting_started/getting_started.md | 20 +- crowdsec-docs/docs/intro.mdx | 2 +- .../docs/log_processor/parsers/create.md | 110 +- .../docs/log_processor/scenarios/create.md | 36 +- .../docs/observability/prometheus.md | 63 +- crowdsec-docs/docusaurus.config.js | 334 --- crowdsec-docs/docusaurus.config.ts | 282 ++ crowdsec-docs/package-lock.json | 2542 ++++++++--------- crowdsec-docs/package.json | 8 +- .../plugins/gtag/{gtag.js => gtag.ts} | 0 crowdsec-docs/plugins/gtag/index.js | 69 - crowdsec-docs/plugins/gtag/index.ts | 68 + crowdsec-docs/plugins/matomo/index.js | 65 +- crowdsec-docs/plugins/tailwind-config.js | 13 - crowdsec-docs/plugins/tailwind-config.ts | 13 + crowdsec-docs/{sidebars.js => sidebars.ts} | 13 +- ...sUnversioned.js => sidebarsUnversioned.ts} | 47 +- crowdsec-docs/src/components/AcademyPromo.js | 30 - .../src/components/HomepageFeatures.js | 105 - .../src/components/RemediationFeatures.js | 18 - .../src/components/academy-promo.tsx | 38 + .../{ConsoleAd.js => console-ad.tsx} | 14 +- .../{ConsolePromo.js => console-promo.tsx} | 14 +- .../{FormattedTabs.js => formatted-tabs.tsx} | 12 +- .../{GetToKnowUs.js => get-to-know-us.tsx} | 16 +- .../src/components/github-icon-renderer.tsx | 22 + .../src/components/githubIconRender.js | 15 - .../HomepageFeatures.module.css | 0 .../src/components/home-page/features.tsx | 121 + .../{QuickStart.js => quick-start.tsx} | 12 +- .../RemediationFeatures.module.css | 0 .../components/remediation-features/index.tsx | 28 + crowdsec-docs/src/components/table-render.tsx | 100 + crowdsec-docs/src/components/tableRender.js | 98 - crowdsec-docs/src/css/custom.css | 1 + .../src/pages/{index.js => index.tsx} | 15 +- crowdsec-docs/src/theme/Root.js | 9 - crowdsec-docs/src/theme/Root.tsx | 13 + crowdsec-docs/src/theme/TOC/index.js | 24 - crowdsec-docs/src/theme/TOC/index.tsx | 33 + .../index.js => doc-item/layout/index.tsx} | 3 +- .../layout}/styles.module.css | 0 crowdsec-docs/tsconfig.json | 3 +- .../blocklists/getting_started.mdx | 2 +- .../blocklists/security_engine.mdx | 2 +- .../unversioned/console/cti/cti_api_keys.mdx | 2 +- .../unversioned/console/getting_started.mdx | 2 +- .../unversioned/cti_api/getting_started.mdx | 2 +- .../cti_api/taxonomy/behaviors.mdx | 4 +- .../unversioned/cti_api/taxonomy/benign.mdx | 4 +- .../cti_api/taxonomy/classifications.mdx | 4 +- .../cti_api/taxonomy/false_positives.mdx | 4 +- .../cti_api/taxonomy/scenarios.mdx | 4 +- .../post_installation/acquisition_new.mdx | 2 +- .../acquisition_troubleshoot.mdx | 2 +- .../post_installation/console.mdx | 2 +- .../post_installation/console_blocklists.mdx | 2 +- .../post_installation/profiles.mdx | 2 +- .../post_installation/troubleshoot.mdx | 2 +- .../remediation_components.mdx | 2 +- .../troubleshooting/security_engine.mdx | 2 +- .../versioned_docs/version-v1.5.0/console.md | 18 +- .../getting_started/getting_started.md | 19 +- .../observability/prometheus.md | 63 +- .../version-v1.5.0/parsers/create.md | 110 +- .../version-v1.5.0/scenarios/create.md | 67 +- .../getting_started/getting_started.md | 20 +- .../versioned_docs/version-v1.6.0/intro.mdx | 2 +- .../observability/prometheus.md | 63 +- .../version-v1.6.0/parsers/create.md | 110 +- .../version-v1.6.0/scenarios/create.md | 36 +- 75 files changed, 2395 insertions(+), 2595 deletions(-) create mode 100644 crowdsec-docs/.npmrc delete mode 100644 crowdsec-docs/babel.config.js delete mode 100644 crowdsec-docs/docusaurus.config.js create mode 100644 crowdsec-docs/docusaurus.config.ts rename crowdsec-docs/plugins/gtag/{gtag.js => gtag.ts} (100%) delete mode 100644 crowdsec-docs/plugins/gtag/index.js create mode 100644 crowdsec-docs/plugins/gtag/index.ts delete mode 100644 crowdsec-docs/plugins/tailwind-config.js create mode 100644 crowdsec-docs/plugins/tailwind-config.ts rename crowdsec-docs/{sidebars.js => sidebars.ts} (98%) rename crowdsec-docs/{sidebarsUnversioned.js => sidebarsUnversioned.ts} (94%) delete mode 100644 crowdsec-docs/src/components/AcademyPromo.js delete mode 100644 crowdsec-docs/src/components/HomepageFeatures.js delete mode 100644 crowdsec-docs/src/components/RemediationFeatures.js create mode 100644 crowdsec-docs/src/components/academy-promo.tsx rename crowdsec-docs/src/components/{ConsoleAd.js => console-ad.tsx} (73%) rename crowdsec-docs/src/components/{ConsolePromo.js => console-promo.tsx} (78%) rename crowdsec-docs/src/components/{FormattedTabs.js => formatted-tabs.tsx} (96%) rename crowdsec-docs/src/components/{GetToKnowUs.js => get-to-know-us.tsx} (92%) create mode 100644 crowdsec-docs/src/components/github-icon-renderer.tsx delete mode 100644 crowdsec-docs/src/components/githubIconRender.js rename crowdsec-docs/src/components/{ => home-page}/HomepageFeatures.module.css (100%) create mode 100644 crowdsec-docs/src/components/home-page/features.tsx rename crowdsec-docs/src/components/{QuickStart.js => quick-start.tsx} (94%) rename crowdsec-docs/src/components/{ => remediation-features}/RemediationFeatures.module.css (100%) create mode 100644 crowdsec-docs/src/components/remediation-features/index.tsx create mode 100644 crowdsec-docs/src/components/table-render.tsx delete mode 100644 crowdsec-docs/src/components/tableRender.js rename crowdsec-docs/src/pages/{index.js => index.tsx} (92%) delete mode 100644 crowdsec-docs/src/theme/Root.js create mode 100644 crowdsec-docs/src/theme/Root.tsx delete mode 100644 crowdsec-docs/src/theme/TOC/index.js create mode 100644 crowdsec-docs/src/theme/TOC/index.tsx rename crowdsec-docs/src/theme/{DocItem/Layout/index.js => doc-item/layout/index.tsx} (96%) rename crowdsec-docs/src/theme/{DocItem/Layout => doc-item/layout}/styles.module.css (100%) diff --git a/.gitignore b/.gitignore index 7c787426b..62551d255 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ .vscode node_modules +.history \ No newline at end of file diff --git a/crowdsec-docs/.npmrc b/crowdsec-docs/.npmrc new file mode 100644 index 000000000..12419e9c5 --- /dev/null +++ b/crowdsec-docs/.npmrc @@ -0,0 +1 @@ +v20.18.1 \ No newline at end of file diff --git a/crowdsec-docs/babel.config.js b/crowdsec-docs/babel.config.js deleted file mode 100644 index e00595dae..000000000 --- a/crowdsec-docs/babel.config.js +++ /dev/null @@ -1,3 +0,0 @@ -module.exports = { - presets: [require.resolve('@docusaurus/core/lib/babel/preset')], -}; diff --git a/crowdsec-docs/docs/appsec/quickstart/traefik.mdx b/crowdsec-docs/docs/appsec/quickstart/traefik.mdx index 746006a1b..5d7b4bc28 100644 --- a/crowdsec-docs/docs/appsec/quickstart/traefik.mdx +++ b/crowdsec-docs/docs/appsec/quickstart/traefik.mdx @@ -3,7 +3,7 @@ id: traefik title: Traefik --- -import FormattedTabs from '@site/src/components/FormattedTabs'; +import FormattedTabs from '@site/src/components/formatted-tabs'; # CrowdSec WAF QuickStart for Traefik diff --git a/crowdsec-docs/docs/getting_started/getting_started.md b/crowdsec-docs/docs/getting_started/getting_started.md index 2aa6b14f4..17c415256 100644 --- a/crowdsec-docs/docs/getting_started/getting_started.md +++ b/crowdsec-docs/docs/getting_started/getting_started.md @@ -3,7 +3,7 @@ id: getting_started title: Getting Started --- -import AcademyPromo from '@site/src/components/AcademyPromo'; +import AcademyPromo from '@site/src/components/academy-promo'; Welcome to CrowdSec! @@ -15,8 +15,7 @@ To embark on your CrowdSec journey, the optimal starting point is to set up a co The CrowdSec console serves as a web-based interface enabling you to conveniently monitor all your CrowdSec instances from a centralized hub. To get started, simply [sign up here](https://app.crowdsec.net/signup). - -## Deploy +## Deploy ### Walkthrough @@ -43,8 +42,9 @@ In our updated documentation, we now refer to CrowdSec as the "Security Engine" #### Prerequisites The Security Engine by default uses the following ports: - - 8080/tcp for the API - - 6060/tcp for the Prometheus metrics / Debugging + +- 8080/tcp for the API +- 6060/tcp for the Prometheus metrics / Debugging If these ports are not available on your system, you can change them in the configuration file post installation. See [Configuration](/configuration/crowdsec_configuration.md) for more information. @@ -55,15 +55,15 @@ Please note that the API is mandatory for your security engine, do not remove it For the most straightforward installation of the Security Engine, utilize the official repository, guaranteeing you'll constantly have the latest version. Please see the relevant documentation for your OS: -- [Linux](/getting_started/install.mdx) -- [FreeBSD](/getting_started/install_freebsd.md) -- [Windows](/getting_started/getting_started_on_windows.md) + +- [Linux](/getting_started/install.mdx) +- [FreeBSD](/getting_started/install_freebsd.md) +- [Windows](/getting_started/getting_started_on_windows.md) #### Installing from source Should you opt for a source-based installation, you can follow the steps outlined [here](/getting_started/install_source.mdx). - ### Remediation Component After installing the Security Engine, you can proceed to install a Remediation Component, which is responsible for executing actions based on the decisions made by the Security Engine. @@ -76,4 +76,4 @@ If you are uncertain about which one to install, please refer to our [Remediatio Since you created your account on the CrowdSec console, you can now [enroll your Security Engine to your account](https://app.crowdsec.net/security-engines?enroll-engine=true). -To do so, you can find steps outlined [here](/u/getting_started/post_installation/console/#engines-page). \ No newline at end of file +To do so, you can find steps outlined [here](/u/getting_started/post_installation/console/#engines-page). diff --git a/crowdsec-docs/docs/intro.mdx b/crowdsec-docs/docs/intro.mdx index 35ec4fb5f..06bedc210 100644 --- a/crowdsec-docs/docs/intro.mdx +++ b/crowdsec-docs/docs/intro.mdx @@ -4,7 +4,7 @@ id: intro --- import useBaseUrl from "@docusaurus/useBaseUrl" -import AcademyPromo from "@site/src/components/AcademyPromo" +import AcademyPromo from "@site/src/components/academy-promo" # Security Engine Overview diff --git a/crowdsec-docs/docs/log_processor/parsers/create.md b/crowdsec-docs/docs/log_processor/parsers/create.md index 3b4463370..453cce2d6 100644 --- a/crowdsec-docs/docs/log_processor/parsers/create.md +++ b/crowdsec-docs/docs/log_processor/parsers/create.md @@ -4,7 +4,7 @@ title: Creating parsers sidebar_position: 4 --- -import AcademyPromo from '@site/src/components/AcademyPromo'; +import AcademyPromo from '@site/src/components/academy-promo'; ## Foreword @@ -51,10 +51,8 @@ The error message can be useful when one wants to understand why the parser file ![Possible integration](/img/parser_creation/error_message.png) - ## Pre-requisites - 1. [Create a local test environment](https://doc.crowdsec.net/docs/contributing/contributing_test_env) 2. Clone the hub @@ -63,7 +61,6 @@ The error message can be useful when one wants to understand why the parser file git clone https://github.com/crowdsecurity/hub.git ``` - ## Create our test From the root of the hub repository : @@ -81,23 +78,20 @@ From the root of the hub repository : ## Configure our test - Let's add our parser to the test configuration (`.tests/myservice-logs/config.yaml`). He specify that we need syslog-logs parser (because myservice logs are shipped via syslog), and then our custom parser. ```yaml parsers: -- crowdsecurity/syslog-logs -- ./parsers/s01-parse/crowdsecurity/myservice-logs.yaml + - crowdsecurity/syslog-logs + - ./parsers/s01-parse/crowdsecurity/myservice-logs.yaml scenarios: postoverflows: log_file: myservice-logs.log log_type: syslog ignore_parsers: false - ``` -__note: as our custom parser isn't yet part of the hub, we specify its path relative to the root of the hub directory__ - +**note: as our custom parser isn't yet part of the hub, we specify its path relative to the root of the hub directory** ## Parser creation : skeleton @@ -110,29 +104,28 @@ onsuccess: next_stage name: crowdsecurity/myservice-logs description: "Parse myservice logs" grok: -#our grok pattern : capture .* - pattern: ^%{DATA:some_data}$ -#the field to which we apply the grok pattern : the log message itself - apply_on: message + #our grok pattern : capture .* + pattern: ^%{DATA:some_data}$ + #the field to which we apply the grok pattern : the log message itself + apply_on: message statics: - - parsed: is_my_service - value: yes + - parsed: is_my_service + value: yes ``` - - a [filter](/log_processor/parsers/format.md#filter) : if the expression is `true`, the event will enter the parser, otherwise, it won't - - a [onsuccess](/log_processor/parsers/format.md#onsuccess) : defines what happens when the event was successfully parsed : shall we continue ? shall we move to next stage ? etc. - - a `name` & a `description` - - some [statics](/log_processor/parsers/format.md#statics) that will modify the event - - a `debug` flag that allows to enable local debugging information - - a `grok` pattern to capture some data in logs - +- a [filter](/log_processor/parsers/format.md#filter) : if the expression is `true`, the event will enter the parser, otherwise, it won't +- a [onsuccess](/log_processor/parsers/format.md#onsuccess) : defines what happens when the event was successfully parsed : shall we continue ? shall we move to next stage ? etc. +- a `name` & a `description` +- some [statics](/log_processor/parsers/format.md#statics) that will modify the event +- a `debug` flag that allows to enable local debugging information +- a `grok` pattern to capture some data in logs We can then "test" our parser like this : ```bash β–Ά cscli hubtest run myservice-logs -INFO[01-10-2021 12:41:21 PM] Running test 'myservice-logs' -WARN[01-10-2021 12:41:24 PM] Assert file '/home/dev/github/hub/.tests/myservice-logs/parser.assert' is empty, generating assertion: +INFO[01-10-2021 12:41:21 PM] Running test 'myservice-logs' +WARN[01-10-2021 12:41:24 PM] Assert file '/home/dev/github/hub/.tests/myservice-logs/parser.assert' is empty, generating assertion: len(results) == 2 len(results["s00-raw"]["crowdsecurity/syslog-logs"]) == 3 @@ -153,9 +146,10 @@ Please fill your assert file(s) for test 'myservice-logs', exiting ``` -What happened here ? - - Our logs have been processed by syslog-logs parser and our custom parser - - As we have no existing assertion(s), `cscli hubtest` kindly generated some for us +What happened here ? + +- Our logs have been processed by syslog-logs parser and our custom parser +- As we have no existing assertion(s), `cscli hubtest` kindly generated some for us This mostly allows us to ensure that our logs have been processed by our parser, even if it's useless in its current state. Further inspection can be seen with `cscli hubtest explain` : @@ -184,10 +178,8 @@ line: Dec 8 06:28:43 mymachine myservice[2806]: accepted connection for user 't We can see that our log lines were successfully parsed by both syslog-logs and myservice-logs parsers. - ## Parser creation : actual parser - Let's modify our parser, `./parsers/s01-parse/crowdsecurity/myservice-logs.yaml` : ```yaml @@ -197,26 +189,26 @@ name: crowdsecurity/myservice-logs description: "Parse myservice logs" #for clarity, we create our pattern syntax beforehand pattern_syntax: - MYSERVICE_BADPASSWORD: bad password for user '%{USERNAME:user}' from '%{IP:source_ip}' #[1] - MYSERVICE_BADUSER: unknown user '%{USERNAME:user}' from '%{IP:source_ip}' #[1] + MYSERVICE_BADPASSWORD: bad password for user '%{USERNAME:user}' from '%{IP:source_ip}' #[1] + MYSERVICE_BADUSER: unknown user '%{USERNAME:user}' from '%{IP:source_ip}' #[1] nodes: -#and we use them to parse our two type of logs - - grok: - name: "MYSERVICE_BADPASSWORD" #[2] - apply_on: message - statics: - - meta: log_type #[3] - value: myservice_failed_auth - - meta: log_subtype - value: myservice_bad_password - - grok: - name: "MYSERVICE_BADUSER" #[2] - apply_on: message - statics: - - meta: log_type #[3] - value: myservice_failed_auth - - meta: log_subtype - value: myservice_bad_user + #and we use them to parse our two type of logs + - grok: + name: "MYSERVICE_BADPASSWORD" #[2] + apply_on: message + statics: + - meta: log_type #[3] + value: myservice_failed_auth + - meta: log_subtype + value: myservice_bad_password + - grok: + name: "MYSERVICE_BADUSER" #[2] + apply_on: message + statics: + - meta: log_type #[3] + value: myservice_failed_auth + - meta: log_subtype + value: myservice_bad_user statics: - meta: service #[3] value: myservice @@ -227,19 +219,18 @@ statics: ``` Various changes have been made here : - - We created to patterns to capture the two relevant type of log lines, Using an [online grok debugger](https://grokdebug.herokuapp.com/) or an [online regex debugger](https://www.debuggex.com/) [2] -) - - We keep track of the username and the source_ip (Please note that setting the source_ip in `evt.Meta.source_ip` and `evt.Parsed.source_ip` is important [1]) - - We setup various [statics](/log_processor/parsers/format.md#statics) information to classify the log type [3] - +- We created to patterns to capture the two relevant type of log lines, Using an [online grok debugger](https://grokdebug.herokuapp.com/) or an [online regex debugger](https://www.debuggex.com/) [2] + ) +- We keep track of the username and the source_ip (Please note that setting the source_ip in `evt.Meta.source_ip` and `evt.Parsed.source_ip` is important [1]) +- We setup various [statics](/log_processor/parsers/format.md#statics) information to classify the log type [3] Let's run out tests again : ```bash {13-20} -β–Ά cscli hubtest run myservice-logs -INFO[01-10-2021 12:49:56 PM] Running test 'myservice-logs' -WARN[01-10-2021 12:49:59 PM] Assert file '/home/dev/github/hub/.tests/myservice-logs/parser.assert' is empty, generating assertion: +β–Ά cscli hubtest run myservice-logs +INFO[01-10-2021 12:49:56 PM] Running test 'myservice-logs' +WARN[01-10-2021 12:49:59 PM] Assert file '/home/dev/github/hub/.tests/myservice-logs/parser.assert' is empty, generating assertion: len(results) == 2 len(results["s00-raw"]["crowdsecurity/syslog-logs"]) == 3 @@ -291,8 +282,7 @@ line: Dec 8 06:28:43 mymachine myservice[2806]: accepted connection for user 't β”” πŸ”΄ crowdsecurity/myservice-logs ``` -__note: we can see that our log line `accepted connection for user 'toto' from '192.168.1.1'` wasn't parsed by `crowdsecurity/myservice-logs` as we have no pattern for it__ - +**note: we can see that our log line `accepted connection for user 'toto' from '192.168.1.1'` wasn't parsed by `crowdsecurity/myservice-logs` as we have no pattern for it** ## Closing word @@ -309,4 +299,4 @@ See as well [this blog article](https://crowdsec.net/blog/how-to-write-crowdsec- title="More ways to learn" course="writing-parsers-and-scenarios" utm="?utm_source=docs&utm_medium=banner&utm_campaign=parser-page&utm_id=academydocs" -/> \ No newline at end of file +/> diff --git a/crowdsec-docs/docs/log_processor/scenarios/create.md b/crowdsec-docs/docs/log_processor/scenarios/create.md index 986a45eb8..a2fd370b4 100644 --- a/crowdsec-docs/docs/log_processor/scenarios/create.md +++ b/crowdsec-docs/docs/log_processor/scenarios/create.md @@ -4,7 +4,7 @@ title: Creating scenarios sidebar_position: 4 --- -import AcademyPromo from '@site/src/components/AcademyPromo'; +import AcademyPromo from '@site/src/components/academy-promo'; :::caution @@ -77,13 +77,13 @@ Let's add our parser and scenario to the test configuration (`.tests/myservice-b ```yaml parsers: - - crowdsecurity/syslog-logs - - crowdsecurity/dateparse-enrich - - ./parsers/s01-parse/crowdsecurity/myservice-logs.yaml + - crowdsecurity/syslog-logs + - crowdsecurity/dateparse-enrich + - ./parsers/s01-parse/crowdsecurity/myservice-logs.yaml scenarios: - - ./scenarios/crowdsecurity/myservice-bf.yaml + - ./scenarios/crowdsecurity/myservice-bf.yaml postoverflows: - - "" + - "" log_file: myservice-bf.log log_type: syslog ignore_parsers: true @@ -126,16 +126,16 @@ We filter on `evt.Meta.log_type == 'myservice_failed_auth'` because in the parse We have the following fields: -- a [type](/log_processor/scenarios/format.md#type): the type of bucket to use (trigger or leaky). -- a [name](/log_processor/scenarios/format.md#name) -- a [description](/log_processor/scenarios/format.md#description) -- a [filter](/log_processor/scenarios/format.md#type): the filter to apply on events to be filled in this bucket. -- a [leakspeed](/log_processor/scenarios/format.md#leakspeed) -- a [capacity](/log_processor/scenarios/format.md#capacity): the number of events in the bucket before it overflows. -- a [groupby](/log_processor/scenarios/format.md#groupby): a field from the event to partition the bucket. It is often the `source_ip` of the event. -- a [blackhole](/log_processor/scenarios/format.md#blackhole): the number of minute to not retrigger this scenario for the same `groupby` field. -- a [reprocess](/log_processor/scenarios/format.md#reprocess): ingest the alert in crowdsec for further processing. -- some [labels](/log_processor/scenarios/format.md#labels): Some labels are mandatory and the scenario will not be validated by the Hub if they are missing. Don't forget to set `remediation: true` if you want the IP to be blocked by bouncers. +- a [type](/log_processor/scenarios/format.md#type): the type of bucket to use (trigger or leaky). +- a [name](/log_processor/scenarios/format.md#name) +- a [description](/log_processor/scenarios/format.md#description) +- a [filter](/log_processor/scenarios/format.md#type): the filter to apply on events to be filled in this bucket. +- a [leakspeed](/log_processor/scenarios/format.md#leakspeed) +- a [capacity](/log_processor/scenarios/format.md#capacity): the number of events in the bucket before it overflows. +- a [groupby](/log_processor/scenarios/format.md#groupby): a field from the event to partition the bucket. It is often the `source_ip` of the event. +- a [blackhole](/log_processor/scenarios/format.md#blackhole): the number of minute to not retrigger this scenario for the same `groupby` field. +- a [reprocess](/log_processor/scenarios/format.md#reprocess): ingest the alert in crowdsec for further processing. +- some [labels](/log_processor/scenarios/format.md#labels): Some labels are mandatory and the scenario will not be validated by the Hub if they are missing. Don't forget to set `remediation: true` if you want the IP to be blocked by bouncers. We can then "test" our scenario like this : @@ -171,8 +171,8 @@ Please fill your assert file(s) for test 'myservice-bf', exiting What happened here ? -- The scenario has been triggered and is generating some assertion (for functional test) -- In production environment, an alert would have been send to the CrowdSec Local API. +- The scenario has been triggered and is generating some assertion (for functional test) +- In production environment, an alert would have been send to the CrowdSec Local API. We can again understand more of what is going on thanks to `cscli hubtest explain` : diff --git a/crowdsec-docs/docs/observability/prometheus.md b/crowdsec-docs/docs/observability/prometheus.md index 0c48c7a2c..64dfde923 100644 --- a/crowdsec-docs/docs/observability/prometheus.md +++ b/crowdsec-docs/docs/observability/prometheus.md @@ -4,16 +4,16 @@ title: Prometheus sidebar_position: 4 --- -import AcademyPromo from '@site/src/components/AcademyPromo'; +import AcademyPromo from '@site/src/components/academy-promo'; CrowdSec can expose a [prometheus](https://github.com/prometheus/client_golang) endpoint for collection (on `http://127.0.0.1:6060/metrics` by default). You can edit the listen_addr in [config.yaml](/configuration/crowdsec_configuration.md#prometheus) to allow an external Prometheus to scrape the metrics. The goal of this endpoint, besides the usual resources consumption monitoring, aims at offering a view of CrowdSec "applicative" behavior : - - is it processing a lot of logs ? is it parsing them successfully ? - - are a lot of scenarios being triggered ? - - are a lot of IPs banned ? - - etc. +- is it processing a lot of logs ? is it parsing them successfully ? +- are a lot of scenarios being triggered ? +- are a lot of IPs banned ? +- etc. All the counters are "since CrowdSec start". @@ -21,16 +21,15 @@ All the counters are "since CrowdSec start". #### Scenarios - - `cs_buckets` : number of scenario that currently exist - - `cs_bucket_created_total` : total number of instantiation of each scenario - - `cs_bucket_overflowed_total` : total number of overflow of each scenario - - `cs_bucket_underflowed_total` : total number of underflow of each scenario (bucket was created but expired because of lack of events) - - `cs_bucket_poured_total` : total number of event poured to each scenario with source as complementary key +- `cs_buckets` : number of scenario that currently exist +- `cs_bucket_created_total` : total number of instantiation of each scenario +- `cs_bucket_overflowed_total` : total number of overflow of each scenario +- `cs_bucket_underflowed_total` : total number of underflow of each scenario (bucket was created but expired because of lack of events) +- `cs_bucket_poured_total` : total number of event poured to each scenario with source as complementary key
example - ``` #2030 lines from `/var/log/nginx/access.log` were poured to `crowdsecurity/http-scan-uniques_404` scenario cs_bucket_poured_total{name="crowdsecurity/http-scan-uniques_404",source="/var/log/nginx/access.log"} 2030 @@ -38,15 +37,13 @@ cs_bucket_poured_total{name="crowdsecurity/http-scan-uniques_404",source="/var/l
- #### Parsers - - `cs_node_hits_total` : how many times an event from a specific source was processed by a parser node : +- `cs_node_hits_total` : how many times an event from a specific source was processed by a parser node :
example - ``` # 235 lines from `auth.log` were processed by the `crowdsecurity/dateparse-enrich` parser cs_node_hits_total{name="crowdsecurity/dateparse-enrich",source="/var/log/auth.log"} 235 @@ -54,12 +51,11 @@ cs_node_hits_total{name="crowdsecurity/dateparse-enrich",source="/var/log/auth.l
- - `cs_node_hits_ko_total` : how many times an event from a specific was unsuccessfully parsed by a specific parser +- `cs_node_hits_ko_total` : how many times an event from a specific was unsuccessfully parsed by a specific parser
example - ``` # 2112 lines from `error.log` failed to be parsed by `crowdsecurity/http-logs` cs_node_hits_ko_total{name="crowdsecurity/http-logs",source="/var/log/nginx/error.log"} 2112 @@ -67,12 +63,11 @@ cs_node_hits_ko_total{name="crowdsecurity/http-logs",source="/var/log/nginx/erro
- - `cs_node_hits_ok_total` : how many times an event from a specific source was successfully parsed by a specific parser - - - `cs_parser_hits_total` : how many times an event from a source has hit the parser - - `cs_parser_hits_ok_total` : how many times an event from a source was successfully parsed - - `cs_parser_hits_ko_total` : how many times an event from a source was unsuccessfully parsed +- `cs_node_hits_ok_total` : how many times an event from a specific source was successfully parsed by a specific parser +- `cs_parser_hits_total` : how many times an event from a source has hit the parser +- `cs_parser_hits_ok_total` : how many times an event from a source was successfully parsed +- `cs_parser_hits_ko_total` : how many times an event from a source was unsuccessfully parsed #### Acquisition @@ -80,33 +75,33 @@ Acquisition metrics are split by datasource. The following metrics are available ##### Cloudwatch - - `cs_cloudwatch_openstreams_total` : number of opened stream within group (by group) - - `cs_cloudwatch_stream_hits_total` : number of event read from stream (by group and by stream) +- `cs_cloudwatch_openstreams_total` : number of opened stream within group (by group) +- `cs_cloudwatch_stream_hits_total` : number of event read from stream (by group and by stream) ##### Files - - `cs_filesource_hits_total` : Total lines that were read (by source file) - +- `cs_filesource_hits_total` : Total lines that were read (by source file) + ##### Journald - - `cs_journalctlsource_hits_total` : Total lines that were read (by source filter) +- `cs_journalctlsource_hits_total` : Total lines that were read (by source filter) ##### Syslog - - `cs_syslogsource_hits_total` : Total lines that were received (by the syslog server) - - `cs_syslogsource_parsed_total` : Total lines that were successfully parsed by the syslog server +- `cs_syslogsource_hits_total` : Total lines that were received (by the syslog server) +- `cs_syslogsource_parsed_total` : Total lines that were successfully parsed by the syslog server #### Local API - - `cs_lapi_route_requests_total` : number of calls to each route per method - - `cs_lapi_machine_requests_total` : number of calls to each route per method grouped by machines - - `cs_lapi_bouncer_requests_total` : number of calls to each route per method grouped by bouncers - - `cs_lapi_decisions_ko_total` : number of unsuccessfully responses when bouncers ask for an IP. - - `cs_lapi_decisions_ok_total` : number of successfully responses when bouncers ask for an IP. +- `cs_lapi_route_requests_total` : number of calls to each route per method +- `cs_lapi_machine_requests_total` : number of calls to each route per method grouped by machines +- `cs_lapi_bouncer_requests_total` : number of calls to each route per method grouped by bouncers +- `cs_lapi_decisions_ko_total` : number of unsuccessfully responses when bouncers ask for an IP. +- `cs_lapi_decisions_ok_total` : number of successfully responses when bouncers ask for an IP. #### Info - - `cs_info` : Information about CrowdSec (software version) +- `cs_info` : Information about CrowdSec (software version) [ - { - from: `/docs/${s}`, - to: `/u/${s}`, - }, - { - from: `/docs/next/${s}`, - to: `/u/${s}`, - }, -] - -const backportRedirect = (s) => { - const arr = [] - if (typeof s !== "string") { - const { id, link, items } = s - if (id) { - arr.push(...generateCurrentAndNextRedirects(id)) - } - if (link && link.id) { - arr.push(...generateCurrentAndNextRedirects(link.id)) - } - if (items) { - for (const item of items) { - if (typeof item === "string") { - arr.push(...generateCurrentAndNextRedirects(item)) - } - if (typeof item === "object") { - arr.push(...backportRedirect(item)) - } - } - } - } else { - arr.push(...generateCurrentAndNextRedirects(s)) - } - return arr -} - -/** @type {import('@docusaurus/types').DocusaurusConfig} */ -module.exports = { - future: { - v4: { - removeLegacyPostBuildHeadAttribute: true, - }, - experimental_faster: true, - }, - title: "CrowdSec", - tagline: - "CrowdSec - Real-time & crowdsourced protection against aggressive IPs", - url: "https://docs.crowdsec.net", - baseUrl: "/", - onBrokenLinks: "warn", - onBrokenMarkdownLinks: "warn", - favicon: "img/crowdsec_no_txt.png", - organizationName: "CrowdSec", - projectName: "crowdsec-docs", - markdown: { - mdx1Compat: { - comments: true, - admonitions: true, - headingIds: true, - }, - }, - stylesheets: [ - { - href: "https://fonts.googleapis.com/icon?family=Material+Icons", - }, - ], - themeConfig: { - image: "img/crowdsec_og_image.png", - announcementBar: { - id: "banner_docs", - content: - 'Learn how to guard your webserver in real-time with the CrowdSec WAF', - backgroundColor: "#F8AB13", - textColor: "#131132", - isCloseable: true, - }, - algolia: { - appId: "PWTZ94KULF", - apiKey: "31673122672f1eb819e16c87468e53b4", - indexName: "crowdsec", - contextualSearch: true, - }, - zooming: { - selector: ".markdown :not(a) > img", - delay: 500, - background: { - light: "rgba(101,108,133,0.8)", - dark: "rgba(9,10,17,0.8)", - }, - }, - navbar: { - items: [], - }, - navbar: { - title: "", - logo: { - alt: "CrowdSec", - src: "img/crowdsec_logo.png", - }, - items: [ - { - type: "docsVersionDropdown", - docsPluginId: "default", - position: "left", - dropdownActiveClassDisabled: true, - }, - { - label: "Security Stack", - position: "left", - items: [ - { - type: "doc", - docId: "intro", - label: "Security Engine", - }, - { - to: "/u/bouncers/intro", - label: "Remediation Components", - }, - { - type: "docsVersion", - to: "/docs/next/appsec/intro", - label: "Web Application Firewall (AppSec)", - }, - { - type: "doc", - docId: "cscli/cscli", - label: "Cscli", - }, - { - to: "/u/user_guides/intro", - label: "Guides", - }, - ], - }, - { - to: "/u/blocklists/getting_started", - position: "left", - label: "Blocklists", - }, - { - label: "API(s)", - position: "left", - items: [ - { - label: "CTI API", - to: "/u/cti_api/getting_started", - }, - { - label: "Service API πŸ…", - to: "/u/service_api/getting_started", - }, - ], - }, - { - to: "/u/console/intro", - position: "left", - label: "Console", - }, - { - to: `https://academy.crowdsec.net/courses?${ - process.env.NODE_ENV === "production" - ? "utm_source=docs&utm_medium=menu&utm_campaign=top-menu&utm_id=academydocs" - : "" - }`, - label: "Academy", - position: "left", - }, - { - to: "/u/troubleshooting/intro", - position: "left", - label: "FAQ/Troubleshooting", - }, - { - href: "https://github.com/crowdsecurity/crowdsec", - position: "right", - className: "header-github-link header-icon-link", - }, - { - href: "https://discord.gg/wGN7ShmEE8", - position: "right", - className: "header-discord-link", - }, - { - href: "https://discourse.crowdsec.net", - position: "right", - className: "header-discourse-link", - }, - { - href: "https://hub.crowdsec.net/", - position: "right", - className: "header-hub-link", - }, - ], - }, - footer: { - style: "dark", - links: [ - { - title: "Community", - items: [ - { - label: "GitHub", - href: "https://github.com/crowdsecurity/crowdsec", - }, - { - label: "Discourse", - href: "https://discourse.crowdsec.net/", - }, - { - label: "Discord", - href: "https://discord.gg/crowdsec", - }, - { - label: "Twitter", - href: "https://twitter.com/crowd_security", - }, - ], - }, - { - title: "More", - items: [ - { - label: "Console", - href: "https://app.crowdsec.net/", - }, - { - label: "Hub", - href: "https://hub.crowdsec.net/", - }, - { - label: "Blog", - href: "https://crowdsec.net/blog/", - }, - { - label: "Tutorial", - href: "https://crowdsec.net/blog/category/tutorial/", - }, - ], - }, - ], - copyright: `Copyright Β© ${new Date().getFullYear()} CrowdSec`, - }, - prism: { - theme: themes.shadesOfPurple, - additionalLanguages: ["bash", "yaml", "json"], - }, - }, - presets: [ - [ - "@docusaurus/preset-classic", - { - docs: { - sidebarPath: require.resolve("./sidebars.js"), - // Please change this to your repo. - editUrl: - "https://github.com/crowdsecurity/crowdsec-docs/edit/main/crowdsec-docs/", - lastVersion: "current", - versions: { - "v1.6.0": { - banner: "none", - path: "/", - }, - current: { - path: "/next", - }, - }, - }, - blog: { - showReadingTime: true, - // Please change this to your repo. - editUrl: - "https://github.com/crowdsecurity/crowdsec-docs/edit/main/crowdsec-docs/", - }, - theme: { - customCss: require.resolve("./src/css/custom.css"), - }, - }, - ], - ], - plugins: [ - "docusaurus-plugin-zooming", - [ - "@docusaurus/plugin-content-docs", - { - id: "unversioned", - path: "unversioned", - routeBasePath: "u", - sidebarPath: require.resolve("./sidebarsUnversioned.js"), - }, - ], - ["./plugins/gtag/index.js", { trackingID: "G-0TFBMNTDFQ" }], - [ - "@docusaurus/plugin-client-redirects", - { - redirects: [ - // Redirect current and next routes to unversioned to avoid 404 on articles and app.crowdsec.net - ...[ - ...remediationSideBar, - ...ctiApiSidebar, - ...guidesSideBar, - ].flatMap(backportRedirect), - { - from: "/docs/troubleshooting", - to: "/u/troubleshooting/intro", - }, - { - from: "/docs/next/troubleshooting", - to: "/u/troubleshooting/intro", - }, - { - from: "/docs/faq", - to: "/u/troubleshooting/intro", - }, - { - from: "/docs/next/faq", - to: "/u/troubleshooting/intro", - }, - ], - }, - ], - "./plugins/tailwind-config.js", - ], -} diff --git a/crowdsec-docs/docusaurus.config.ts b/crowdsec-docs/docusaurus.config.ts new file mode 100644 index 000000000..2c891c673 --- /dev/null +++ b/crowdsec-docs/docusaurus.config.ts @@ -0,0 +1,282 @@ +import { Config } from "@docusaurus/types" +import type * as Preset from "@docusaurus/preset-classic" +import { themes } from "prism-react-renderer" + +import sidebarsUnversionedConfig, { + remediationSideBar, + ctiApiSidebar, + guidesSideBar, +} from "./sidebarsUnversioned" + +import tailwindPlugin from "./plugins/tailwind-config" +import { NavbarItem } from "@docusaurus/theme-common" + +const generateCurrentAndNextRedirects = (s) => [ + { + from: `/docs/${s}`, + to: `/u/${s}`, + }, + { + from: `/docs/next/${s}`, + to: `/u/${s}`, + }, +] + +const backportRedirect = (s) => { + const arr = [] + if (typeof s !== "string") { + const { id, link, items } = s + if (id) { + arr.push(...generateCurrentAndNextRedirects(id)) + } + if (link?.id) { + arr.push(...generateCurrentAndNextRedirects(link.id)) + } + if (items) { + for (const item of items) { + if (typeof item === "string") { + arr.push(...generateCurrentAndNextRedirects(item)) + } + if (typeof item === "object") { + arr.push(...backportRedirect(item)) + } + } + } + } else { + arr.push(...generateCurrentAndNextRedirects(s)) + } + return arr +} + +const currentYear = new Date().getFullYear() + +const ACADEMY_URL = `https://academy.crowdsec.net/courses?${ + process.env.NODE_ENV === "production" + ? "utm_source=docs&utm_medium=menu&utm_campaign=top-menu&utm_id=academydocs" + : "" +}` + +const NAVBAR_ITEMS: NavbarItem[] = [ + { + type: "docsVersionDropdown", + docsPluginId: "default", + position: "left", + dropdownActiveClassDisabled: true, + }, + { + label: "Security Stack", + position: "left", + items: [ + { type: "doc", docId: "intro", label: "Security Engine" }, + { to: "/u/bouncers/intro", label: "Remediation Components" }, + { + type: "docsVersion", + to: "/docs/next/appsec/intro", + label: "Web Application Firewall (AppSec)", + }, + { type: "doc", docId: "cscli/cscli", label: "Cscli" }, + { to: "/u/user_guides/intro", label: "Guides" }, + ], + }, + { + to: "/u/blocklists/getting_started", + position: "left", + label: "Blocklists", + }, + { + label: "API(s)", + position: "left", + items: [ + { label: "CTI API", to: "/u/cti_api/getting_started" }, + { label: "Service API πŸ…", to: "/u/service_api/getting_started" }, + ], + }, + { to: "/u/console/intro", position: "left", label: "Console" }, + { to: ACADEMY_URL, label: "Academy", position: "left" }, + { + to: "/u/troubleshooting/intro", + position: "left", + label: "FAQ/Troubleshooting", + }, + { + href: "https://github.com/crowdsecurity/crowdsec", + position: "right", + className: "header-github-link header-icon-link", + }, + { + href: "https://discord.gg/wGN7ShmEE8", + position: "right", + className: "header-discord-link", + }, + { + href: "https://discourse.crowdsec.net", + position: "right", + className: "header-discourse-link", + }, + { + href: "https://hub.crowdsec.net/", + position: "right", + className: "header-hub-link", + }, +] + +const FOOTER_LINKS = [ + { + title: "Community", + items: [ + { + label: "GitHub", + href: "https://github.com/crowdsecurity/crowdsec", + }, + { label: "Discourse", href: "https://discourse.crowdsec.net/" }, + { label: "Discord", href: "https://discord.gg/crowdsec" }, + { label: "Twitter", href: "https://twitter.com/crowd_security" }, + ], + }, + { + title: "More", + items: [ + { label: "Console", href: "https://app.crowdsec.net/" }, + { label: "Hub", href: "https://hub.crowdsec.net/" }, + { label: "Blog", href: "https://crowdsec.net/blog/" }, + { + label: "Tutorial", + href: "https://crowdsec.net/blog/category/tutorial/", + }, + ], + }, +] + +const redirects = [ + ...[ + ...(Array.isArray(remediationSideBar) + ? remediationSideBar + : [remediationSideBar]), + ...(Array.isArray(ctiApiSidebar) ? ctiApiSidebar : [ctiApiSidebar]), + ...(Array.isArray(guidesSideBar) ? guidesSideBar : [guidesSideBar]), + ].flatMap(backportRedirect), + { from: "/docs/troubleshooting", to: "/u/troubleshooting/intro" }, + { from: "/docs/next/troubleshooting", to: "/u/troubleshooting/intro" }, + { from: "/docs/faq", to: "/u/troubleshooting/intro" }, + { from: "/docs/next/faq", to: "/u/troubleshooting/intro" }, +] + +const config: Config = { + future: { + v4: { + removeLegacyPostBuildHeadAttribute: true, + }, + experimental_faster: true, + }, + title: "CrowdSec", + tagline: + "CrowdSec - Real-time & crowdsourced protection against aggressive IPs", + url: "https://docs.crowdsec.net", + baseUrl: "/", + onBrokenLinks: "warn", + onBrokenMarkdownLinks: "warn", + favicon: "img/crowdsec_no_txt.png", + organizationName: "CrowdSec", + projectName: "crowdsec-docs", + markdown: { + mdx1Compat: { + comments: true, + admonitions: true, + headingIds: true, + }, + }, + stylesheets: [ + { + href: "https://fonts.googleapis.com/icon?family=Material+Icons", + }, + ], + themeConfig: { + image: "img/crowdsec_og_image.png", + announcementBar: { + id: "banner_docs", + content: + 'Learn how to guard your webserver in real-time with the CrowdSec WAF', + backgroundColor: "#F8AB13", + textColor: "#131132", + isCloseable: true, + }, + algolia: { + appId: "PWTZ94KULF", + apiKey: "31673122672f1eb819e16c87468e53b4", + indexName: "crowdsec", + contextualSearch: true, + }, + zooming: { + selector: ".markdown :not(a) > img", + delay: 500, + background: { + light: "rgba(101,108,133,0.8)", + dark: "rgba(9,10,17,0.8)", + }, + }, + navbar: { + title: "", + logo: { + alt: "CrowdSec", + src: "img/crowdsec_logo.png", + }, + items: NAVBAR_ITEMS, + }, + footer: { + style: "dark", + links: FOOTER_LINKS, + copyright: `Copyright Β© ${currentYear} CrowdSec`, + }, + prism: { + theme: themes.shadesOfPurple, + additionalLanguages: ["bash", "yaml", "json"], + }, + } satisfies Preset.ThemeConfig, + presets: [ + [ + "@docusaurus/preset-classic", + { + docs: { + sidebarPath: require.resolve("./sidebars.js"), + editUrl: + "https://github.com/crowdsecurity/crowdsec-docs/edit/main/crowdsec-docs/", + lastVersion: "current", + versions: { + "v1.6.0": { + banner: "none", + path: "/", + }, + current: { + path: "/next", + }, + }, + }, + blog: { + showReadingTime: true, + editUrl: + "https://github.com/crowdsecurity/crowdsec-docs/edit/main/crowdsec-docs/", + }, + theme: { + customCss: require.resolve("./src/css/custom.css"), + }, + }, + ], + ], + plugins: [ + "docusaurus-plugin-zooming", + [ + "@docusaurus/plugin-content-docs", + { + id: "unversioned", + path: "unversioned", + routeBasePath: "u", + sidebarPath: sidebarsUnversionedConfig, + }, + ], + ["./plugins/gtag/index.ts", { trackingID: "G-0TFBMNTDFQ" }], + ["@docusaurus/plugin-client-redirects", { redirects }], + tailwindPlugin, + ], +} + +export default config diff --git a/crowdsec-docs/package-lock.json b/crowdsec-docs/package-lock.json index 3ebc2a621..ade0fe412 100644 --- a/crowdsec-docs/package-lock.json +++ b/crowdsec-docs/package-lock.json @@ -22,7 +22,6 @@ "@mui/icons-material": "^5.11.16", "@mui/material": "^5.13.4", "@mui/x-date-pickers": "^6.18.0", - "@radix-ui/react-popover": "^1.1.14", "@radix-ui/react-tooltip": "^1.1.2", "class-variance-authority": "^0.7.0", "clsx": "^2.1.1", @@ -36,11 +35,13 @@ "tailwindcss-animate": "^1.0.7" }, "devDependencies": { - "@docusaurus/module-type-aliases": "^3.7.0", - "@docusaurus/types": "^3.7.0", + "@docusaurus/module-type-aliases": "^3.8.1", + "@docusaurus/tsconfig": "^3.8.1", + "@docusaurus/types": "^3.8.1", "autoprefixer": "^10.4.20", "postcss": "^8.4.47", - "tailwindcss": "^3.4.14" + "tailwindcss": "^3.4.14", + "typescript": "^5.8.3" } }, "node_modules/@algolia/autocomplete-core": { @@ -89,99 +90,99 @@ } }, "node_modules/@algolia/client-abtesting": { - "version": "5.30.0", - "resolved": "https://registry.npmjs.org/@algolia/client-abtesting/-/client-abtesting-5.30.0.tgz", - "integrity": "sha512-Q3OQXYlTNqVUN/V1qXX8VIzQbLjP3yrRBO9m6NRe1CBALmoGHh9JrYosEGvfior28+DjqqU3Q+nzCSuf/bX0Gw==", + "version": "5.29.0", + "resolved": "https://registry.npmjs.org/@algolia/client-abtesting/-/client-abtesting-5.29.0.tgz", + "integrity": "sha512-AM/6LYMSTnZvAT5IarLEKjYWOdV+Fb+LVs8JRq88jn8HH6bpVUtjWdOZXqX1hJRXuCAY8SdQfb7F8uEiMNXdYQ==", "license": "MIT", "dependencies": { - "@algolia/client-common": "5.30.0", - "@algolia/requester-browser-xhr": "5.30.0", - "@algolia/requester-fetch": "5.30.0", - "@algolia/requester-node-http": "5.30.0" + "@algolia/client-common": "5.29.0", + "@algolia/requester-browser-xhr": "5.29.0", + "@algolia/requester-fetch": "5.29.0", + "@algolia/requester-node-http": "5.29.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/client-analytics": { - "version": "5.30.0", - "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-5.30.0.tgz", - "integrity": "sha512-/b+SAfHjYjx/ZVeVReCKTTnFAiZWOyvYLrkYpeNMraMT6akYRR8eC1AvFcvR60GLG/jytxcJAp42G8nN5SdcLg==", + "version": "5.29.0", + "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-5.29.0.tgz", + "integrity": "sha512-La34HJh90l0waw3wl5zETO8TuukeUyjcXhmjYZL3CAPLggmKv74mobiGRIb+mmBENybiFDXf/BeKFLhuDYWMMQ==", "license": "MIT", "dependencies": { - "@algolia/client-common": "5.30.0", - "@algolia/requester-browser-xhr": "5.30.0", - "@algolia/requester-fetch": "5.30.0", - "@algolia/requester-node-http": "5.30.0" + "@algolia/client-common": "5.29.0", + "@algolia/requester-browser-xhr": "5.29.0", + "@algolia/requester-fetch": "5.29.0", + "@algolia/requester-node-http": "5.29.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/client-common": { - "version": "5.30.0", - "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-5.30.0.tgz", - "integrity": "sha512-tbUgvkp2d20mHPbM0+NPbLg6SzkUh0lADUUjzNCF+HiPkjFRaIW3NGMlESKw5ia4Oz6ZvFzyREquUX6rdkdJcQ==", + "version": "5.29.0", + "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-5.29.0.tgz", + "integrity": "sha512-T0lzJH/JiCxQYtCcnWy7Jf1w/qjGDXTi2npyF9B9UsTvXB97GRC6icyfXxe21mhYvhQcaB1EQ/J2575FXxi2rA==", "license": "MIT", "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/client-insights": { - "version": "5.30.0", - "resolved": "https://registry.npmjs.org/@algolia/client-insights/-/client-insights-5.30.0.tgz", - "integrity": "sha512-caXuZqJK761m32KoEAEkjkE2WF/zYg1McuGesWXiLSgfxwZZIAf+DljpiSToBUXhoPesvjcLtINyYUzbkwE0iw==", + "version": "5.29.0", + "resolved": "https://registry.npmjs.org/@algolia/client-insights/-/client-insights-5.29.0.tgz", + "integrity": "sha512-A39F1zmHY9aev0z4Rt3fTLcGN5AG1VsVUkVWy6yQG5BRDScktH+U5m3zXwThwniBTDV1HrPgiGHZeWb67GkR2Q==", "license": "MIT", "dependencies": { - "@algolia/client-common": "5.30.0", - "@algolia/requester-browser-xhr": "5.30.0", - "@algolia/requester-fetch": "5.30.0", - "@algolia/requester-node-http": "5.30.0" + "@algolia/client-common": "5.29.0", + "@algolia/requester-browser-xhr": "5.29.0", + "@algolia/requester-fetch": "5.29.0", + "@algolia/requester-node-http": "5.29.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/client-personalization": { - "version": "5.30.0", - "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-5.30.0.tgz", - "integrity": "sha512-7K6P7TRBHLX1zTmwKDrIeBSgUidmbj6u3UW/AfroLRDGf9oZFytPKU49wg28lz/yulPuHY0nZqiwbyAxq9V17w==", + "version": "5.29.0", + "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-5.29.0.tgz", + "integrity": "sha512-ibxmh2wKKrzu5du02gp8CLpRMeo+b/75e4ORct98CT7mIxuYFXowULwCd6cMMkz/R0LpKXIbTUl15UL5soaiUQ==", "license": "MIT", "dependencies": { - "@algolia/client-common": "5.30.0", - "@algolia/requester-browser-xhr": "5.30.0", - "@algolia/requester-fetch": "5.30.0", - "@algolia/requester-node-http": "5.30.0" + "@algolia/client-common": "5.29.0", + "@algolia/requester-browser-xhr": "5.29.0", + "@algolia/requester-fetch": "5.29.0", + "@algolia/requester-node-http": "5.29.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/client-query-suggestions": { - "version": "5.30.0", - "resolved": "https://registry.npmjs.org/@algolia/client-query-suggestions/-/client-query-suggestions-5.30.0.tgz", - "integrity": "sha512-WMjWuBjYxJheRt7Ec5BFr33k3cV0mq2WzmH9aBf5W4TT8kUp34x91VRsYVaWOBRlxIXI8o/WbhleqSngiuqjLA==", + "version": "5.29.0", + "resolved": "https://registry.npmjs.org/@algolia/client-query-suggestions/-/client-query-suggestions-5.29.0.tgz", + "integrity": "sha512-VZq4/AukOoJC2WSwF6J5sBtt+kImOoBwQc1nH3tgI+cxJBg7B77UsNC+jT6eP2dQCwGKBBRTmtPLUTDDnHpMgA==", "license": "MIT", "dependencies": { - "@algolia/client-common": "5.30.0", - "@algolia/requester-browser-xhr": "5.30.0", - "@algolia/requester-fetch": "5.30.0", - "@algolia/requester-node-http": "5.30.0" + "@algolia/client-common": "5.29.0", + "@algolia/requester-browser-xhr": "5.29.0", + "@algolia/requester-fetch": "5.29.0", + "@algolia/requester-node-http": "5.29.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/client-search": { - "version": "5.30.0", - "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-5.30.0.tgz", - "integrity": "sha512-puc1/LREfSqzgmrOFMY5L/aWmhYOlJ0TTpa245C0ZNMKEkdOkcimFbXTXQ8lZhzh+rlyFgR7cQGNtXJ5H0XgZg==", + "version": "5.29.0", + "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-5.29.0.tgz", + "integrity": "sha512-cZ0Iq3OzFUPpgszzDr1G1aJV5UMIZ4VygJ2Az252q4Rdf5cQMhYEIKArWY/oUjMhQmosM8ygOovNq7gvA9CdCg==", "license": "MIT", "dependencies": { - "@algolia/client-common": "5.30.0", - "@algolia/requester-browser-xhr": "5.30.0", - "@algolia/requester-fetch": "5.30.0", - "@algolia/requester-node-http": "5.30.0" + "@algolia/client-common": "5.29.0", + "@algolia/requester-browser-xhr": "5.29.0", + "@algolia/requester-fetch": "5.29.0", + "@algolia/requester-node-http": "5.29.0" }, "engines": { "node": ">= 14.0.0" @@ -194,81 +195,81 @@ "license": "MIT" }, "node_modules/@algolia/ingestion": { - "version": "1.30.0", - "resolved": "https://registry.npmjs.org/@algolia/ingestion/-/ingestion-1.30.0.tgz", - "integrity": "sha512-NfqiIKVgGKTLr6T9F81oqB39pPiEtILTy0z8ujxPKg2rCvI/qQeDqDWFBmQPElCfUTU6kk67QAgMkQ7T6fE+gg==", + "version": "1.29.0", + "resolved": "https://registry.npmjs.org/@algolia/ingestion/-/ingestion-1.29.0.tgz", + "integrity": "sha512-scBXn0wO5tZCxmO6evfa7A3bGryfyOI3aoXqSQBj5SRvNYXaUlFWQ/iKI70gRe/82ICwE0ICXbHT/wIvxOW7vw==", "license": "MIT", "dependencies": { - "@algolia/client-common": "5.30.0", - "@algolia/requester-browser-xhr": "5.30.0", - "@algolia/requester-fetch": "5.30.0", - "@algolia/requester-node-http": "5.30.0" + "@algolia/client-common": "5.29.0", + "@algolia/requester-browser-xhr": "5.29.0", + "@algolia/requester-fetch": "5.29.0", + "@algolia/requester-node-http": "5.29.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/monitoring": { - "version": "1.30.0", - "resolved": "https://registry.npmjs.org/@algolia/monitoring/-/monitoring-1.30.0.tgz", - "integrity": "sha512-/eeM3aqLKro5KBZw0W30iIA6afkGa+bcpvEM0NDa92m5t3vil4LOmJI9FkgzfmSkF4368z/SZMOTPShYcaVXjA==", + "version": "1.29.0", + "resolved": "https://registry.npmjs.org/@algolia/monitoring/-/monitoring-1.29.0.tgz", + "integrity": "sha512-FGWWG9jLFhsKB7YiDjM2dwQOYnWu//7Oxrb2vT96N7+s+hg1mdHHfHNRyEudWdxd4jkMhBjeqNA21VbTiOIPVg==", "license": "MIT", "dependencies": { - "@algolia/client-common": "5.30.0", - "@algolia/requester-browser-xhr": "5.30.0", - "@algolia/requester-fetch": "5.30.0", - "@algolia/requester-node-http": "5.30.0" + "@algolia/client-common": "5.29.0", + "@algolia/requester-browser-xhr": "5.29.0", + "@algolia/requester-fetch": "5.29.0", + "@algolia/requester-node-http": "5.29.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/recommend": { - "version": "5.30.0", - "resolved": "https://registry.npmjs.org/@algolia/recommend/-/recommend-5.30.0.tgz", - "integrity": "sha512-iWeAUWqw+xT+2IyUyTqnHCK+cyCKYV5+B6PXKdagc9GJJn6IaPs8vovwoC0Za5vKCje/aXQ24a2Z1pKpc/tdHg==", + "version": "5.29.0", + "resolved": "https://registry.npmjs.org/@algolia/recommend/-/recommend-5.29.0.tgz", + "integrity": "sha512-xte5+mpdfEARAu61KXa4ewpjchoZuJlAlvQb8ptK6hgHlBHDnYooy1bmOFpokaAICrq/H9HpoqNUX71n+3249A==", "license": "MIT", "dependencies": { - "@algolia/client-common": "5.30.0", - "@algolia/requester-browser-xhr": "5.30.0", - "@algolia/requester-fetch": "5.30.0", - "@algolia/requester-node-http": "5.30.0" + "@algolia/client-common": "5.29.0", + "@algolia/requester-browser-xhr": "5.29.0", + "@algolia/requester-fetch": "5.29.0", + "@algolia/requester-node-http": "5.29.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/requester-browser-xhr": { - "version": "5.30.0", - "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-5.30.0.tgz", - "integrity": "sha512-alo3ly0tdNLjfMSPz9dmNwYUFHx7guaz5dTGlIzVGnOiwLgIoM6NgA+MJLMcH6e1S7OpmE2AxOy78svlhst2tQ==", + "version": "5.29.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-5.29.0.tgz", + "integrity": "sha512-og+7Em75aPHhahEUScq2HQ3J7ULN63Levtd87BYMpn6Im5d5cNhaC4QAUsXu6LWqxRPgh4G+i+wIb6tVhDhg2A==", "license": "MIT", "dependencies": { - "@algolia/client-common": "5.30.0" + "@algolia/client-common": "5.29.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/requester-fetch": { - "version": "5.30.0", - "resolved": "https://registry.npmjs.org/@algolia/requester-fetch/-/requester-fetch-5.30.0.tgz", - "integrity": "sha512-WOnTYUIY2InllHBy6HHMpGIOo7Or4xhYUx/jkoSK/kPIa1BRoFEHqa8v4pbKHtoG7oLvM2UAsylSnjVpIhGZXg==", + "version": "5.29.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-fetch/-/requester-fetch-5.29.0.tgz", + "integrity": "sha512-JCxapz7neAy8hT/nQpCvOrI5JO8VyQ1kPvBiaXWNC1prVq0UMYHEL52o1BsPvtXfdQ7BVq19OIq6TjOI06mV/w==", "license": "MIT", "dependencies": { - "@algolia/client-common": "5.30.0" + "@algolia/client-common": "5.29.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/requester-node-http": { - "version": "5.30.0", - "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-5.30.0.tgz", - "integrity": "sha512-uSTUh9fxeHde1c7KhvZKUrivk90sdiDftC+rSKNFKKEU9TiIKAGA7B2oKC+AoMCqMymot1vW9SGbeESQPTZd0w==", + "version": "5.29.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-5.29.0.tgz", + "integrity": "sha512-lVBD81RBW5VTdEYgnzCz7Pf9j2H44aymCP+/eHGJu4vhU+1O8aKf3TVBgbQr5UM6xoe8IkR/B112XY6YIG2vtg==", "license": "MIT", "dependencies": { - "@algolia/client-common": "5.30.0" + "@algolia/client-common": "5.29.0" }, "engines": { "node": ">= 14.0.0" @@ -314,30 +315,30 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.0.tgz", - "integrity": "sha512-60X7qkglvrap8mn1lh2ebxXdZYtUcpd7gsmy9kLaBJ4i/WdY8PqTSdxyA8qraikqKQK5C1KRBKXqznrVapyNaw==", + "version": "7.27.5", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.27.5.tgz", + "integrity": "sha512-KiRAp/VoJaWkkte84TvUd9qjdbZAdiqyvMxrGl1N6vzFogKmaLgoM3L1kgtLicp2HP5fBJS8JrZKLVIZGVJAVg==", "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.0.tgz", - "integrity": "sha512-UlLAnTPrFdNGoFtbSXwcGFQBtQZJCNjaN6hQNP3UPvuNXT1i82N26KL3dZeIpNalWywr9IuQuncaAfUaS1g6sQ==", + "version": "7.27.4", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.27.4.tgz", + "integrity": "sha512-bXYxrXFubeYdvB0NhD/NBB3Qi6aZeV20GOWVI47t2dkecCEoneR4NPVcb7abpXDEvejgrUfFtG6vG/zxAKmg+g==", "license": "MIT", "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.27.1", - "@babel/generator": "^7.28.0", + "@babel/generator": "^7.27.3", "@babel/helper-compilation-targets": "^7.27.2", "@babel/helper-module-transforms": "^7.27.3", - "@babel/helpers": "^7.27.6", - "@babel/parser": "^7.28.0", + "@babel/helpers": "^7.27.4", + "@babel/parser": "^7.27.4", "@babel/template": "^7.27.2", - "@babel/traverse": "^7.28.0", - "@babel/types": "^7.28.0", + "@babel/traverse": "^7.27.4", + "@babel/types": "^7.27.3", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -362,15 +363,15 @@ } }, "node_modules/@babel/generator": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.0.tgz", - "integrity": "sha512-lJjzvrbEeWrhB4P3QBsH7tey117PjLZnDbLiQEKjQ/fNJTjuq4HSqgFA+UNSwZT8D7dxxbnuSBMsa1lrWzKlQg==", + "version": "7.27.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.27.5.tgz", + "integrity": "sha512-ZGhA37l0e/g2s1Cnzdix0O3aLYm66eF8aufiVteOgnwxgnRP8GoyMj7VWsgWnQbVKXyge7hqrFh2K2TQM6t1Hw==", "license": "MIT", "dependencies": { - "@babel/parser": "^7.28.0", - "@babel/types": "^7.28.0", - "@jridgewell/gen-mapping": "^0.3.12", - "@jridgewell/trace-mapping": "^0.3.28", + "@babel/parser": "^7.27.5", + "@babel/types": "^7.27.3", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^3.0.2" }, "engines": { @@ -471,30 +472,21 @@ } }, "node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.5.tgz", - "integrity": "sha512-uJnGFcPsWQK8fvjgGP5LZUZZsYGIoPeRjSF5PGwrelYgq7Q15/Ft9NGFp1zglwgIv//W0uG4BevRuSJRyylZPg==", + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.4.tgz", + "integrity": "sha512-jljfR1rGnXXNWnmQg2K3+bvhkxB51Rl32QRaOTuwwjviGrHzIbSc8+x9CpraDtbT7mfyjXObULP4w/adunNwAw==", "license": "MIT", "dependencies": { - "@babel/helper-compilation-targets": "^7.27.2", - "@babel/helper-plugin-utils": "^7.27.1", - "debug": "^4.4.1", + "@babel/helper-compilation-targets": "^7.22.6", + "@babel/helper-plugin-utils": "^7.22.5", + "debug": "^4.1.1", "lodash.debounce": "^4.0.8", - "resolve": "^1.22.10" + "resolve": "^1.14.2" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, - "node_modules/@babel/helper-globals": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", - "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/helper-member-expression-to-functions": { "version": "7.27.1", "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.27.1.tgz", @@ -661,12 +653,12 @@ } }, "node_modules/@babel/parser": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.0.tgz", - "integrity": "sha512-jVZGvOxOuNSsuQuLRTh13nU0AogFlw32w/MT+LV6D3sP5WdbW61E77RnkbaO2dUvmPAYrBDJXGn5gGS6tH4j8g==", + "version": "7.27.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.27.5.tgz", + "integrity": "sha512-OsQd175SxWkGlzbny8J3K8TnnDD0N3lrIUtB92xwyRpzaenGZhxDvxN/JgU00U3CDZNj9tPuDJ5H0WS4Nt3vKg==", "license": "MIT", "dependencies": { - "@babel/types": "^7.28.0" + "@babel/types": "^7.27.3" }, "bin": { "parser": "bin/babel-parser.js" @@ -870,14 +862,14 @@ } }, "node_modules/@babel/plugin-transform-async-generator-functions": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.28.0.tgz", - "integrity": "sha512-BEOdvX4+M765icNPZeidyADIvQ1m1gmunXufXxvRESy/jNNyfovIqUyE7MVgGBjWktCoJlzvFA1To2O4ymIO3Q==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.27.1.tgz", + "integrity": "sha512-eST9RrwlpaoJBDHShc+DS2SG4ATTi2MYNb4OxYkf3n+7eb49LWpnS+HSpVfW4x927qQwgk8A2hGNVaajAEw0EA==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-remap-async-to-generator": "^7.27.1", - "@babel/traverse": "^7.28.0" + "@babel/traverse": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -919,9 +911,9 @@ } }, "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.28.0.tgz", - "integrity": "sha512-gKKnwjpdx5sER/wl0WN0efUBFzF/56YZO0RJrSYP4CljXnP31ByY7fol89AzomdlLNzI36AvOTmYHsnZTCkq8Q==", + "version": "7.27.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.27.5.tgz", + "integrity": "sha512-JF6uE2s67f0y2RZcm2kpAUEbD50vH62TyWVebxwHAlbSdM49VqPz8t4a1uIjp4NIOIZ4xzLfjY5emt/RCyC7TQ==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" @@ -966,17 +958,17 @@ } }, "node_modules/@babel/plugin-transform-classes": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.28.0.tgz", - "integrity": "sha512-IjM1IoJNw72AZFlj33Cu8X0q2XK/6AaVC3jQu+cgQ5lThWD5ajnuUAml80dqRmOhmPkTH8uAwnpMu9Rvj0LTRA==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.27.1.tgz", + "integrity": "sha512-7iLhfFAubmpeJe/Wo2TVuDrykh/zlWXLzPNdL0Jqn/Xu8R3QQ8h9ff8FQoISZOsw74/HFqFI7NX63HN7QFIHKA==", "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.27.3", - "@babel/helper-compilation-targets": "^7.27.2", - "@babel/helper-globals": "^7.28.0", + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-compilation-targets": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-replace-supers": "^7.27.1", - "@babel/traverse": "^7.28.0" + "@babel/traverse": "^7.27.1", + "globals": "^11.1.0" }, "engines": { "node": ">=6.9.0" @@ -1002,13 +994,12 @@ } }, "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.28.0.tgz", - "integrity": "sha512-v1nrSMBiKcodhsyJ4Gf+Z0U/yawmJDBOTpEB3mcQY52r9RIyPneGyAS/yM6seP/8I+mWI3elOMtT5dB8GJVs+A==", + "version": "7.27.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.27.3.tgz", + "integrity": "sha512-s4Jrok82JpiaIprtY2nHsYmrThKvvwgHwjgd7UMiYhZaN0asdXNLr0y+NjTfkA7SyQE5i2Fb7eawUOZmLvyqOA==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/traverse": "^7.28.0" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1079,22 +1070,6 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-explicit-resource-management": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-explicit-resource-management/-/plugin-transform-explicit-resource-management-7.28.0.tgz", - "integrity": "sha512-K8nhUcn3f6iB+P3gwCv/no7OdzOZQcKchW6N389V6PD8NUWKZHzndOd9sPDVbMoBsbmjMqlB4L9fm+fEFNVlwQ==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/plugin-transform-destructuring": "^7.28.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, "node_modules/@babel/plugin-transform-exponentiation-operator": { "version": "7.27.1", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.27.1.tgz", @@ -1346,16 +1321,15 @@ } }, "node_modules/@babel/plugin-transform-object-rest-spread": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.28.0.tgz", - "integrity": "sha512-9VNGikXxzu5eCiQjdE4IZn8sb9q7Xsk5EXLDBKUYg1e/Tve8/05+KJEtcxGxAgCY5t/BpKQM+JEL/yT4tvgiUA==", + "version": "7.27.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.27.3.tgz", + "integrity": "sha512-7ZZtznF9g4l2JCImCo5LNKFHB5eXnN39lLtLY5Tg+VkR0jwOt7TBciMckuiQIOIW7L5tkQOCh3bVGYeXgMx52Q==", "license": "MIT", "dependencies": { "@babel/helper-compilation-targets": "^7.27.2", "@babel/helper-plugin-utils": "^7.27.1", - "@babel/plugin-transform-destructuring": "^7.28.0", - "@babel/plugin-transform-parameters": "^7.27.7", - "@babel/traverse": "^7.28.0" + "@babel/plugin-transform-destructuring": "^7.27.3", + "@babel/plugin-transform-parameters": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1412,9 +1386,9 @@ } }, "node_modules/@babel/plugin-transform-parameters": { - "version": "7.27.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.27.7.tgz", - "integrity": "sha512-qBkYTYCb76RRxUM6CcZA5KRu8K4SM8ajzVeUgVdMVO9NN9uI/GaVmBg/WKJJGnNokV9SY8FxNOVWGXzqzUidBg==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.27.1.tgz", + "integrity": "sha512-018KRk76HWKeZ5l4oTj2zPpSh+NbGdt0st5S6x0pga6HgrjBOJb24mMDHorFopOOd6YHkLgOZ+zaCjZGPO4aKg==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" @@ -1490,9 +1464,9 @@ } }, "node_modules/@babel/plugin-transform-react-display-name": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.28.0.tgz", - "integrity": "sha512-D6Eujc2zMxKjfa4Zxl4GHMsmhKKZ9VpcqIchJLvwTxad9zWIYulwYItBovpDOoNLISpcZSXoDJ5gaGbQUDqViA==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.27.1.tgz", + "integrity": "sha512-p9+Vl3yuHPmkirRrg021XiP+EETmPMQTLr6Ayjj85RLNEbb3Eya/4VI0vAdzQG9SEAl2Lnt7fy5lZyMzjYoZQQ==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" @@ -1555,9 +1529,9 @@ } }, "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.28.0.tgz", - "integrity": "sha512-LOAozRVbqxEVjSKfhGnuLoE4Kz4Oc5UJzuvFUhSsQzdCdaAQu06mG8zDv2GFSerM62nImUZ7K92vxnQcLSDlCQ==", + "version": "7.27.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.27.5.tgz", + "integrity": "sha512-uhB8yHerfe3MWnuLAhEbeQ4afVoqv8BQsPqrTv7e/jZ9y00kJL6l9a/f4OWaKxotmjzewfEyXE1vgDJenkQ2/Q==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" @@ -1601,16 +1575,16 @@ } }, "node_modules/@babel/plugin-transform-runtime": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.28.0.tgz", - "integrity": "sha512-dGopk9nZrtCs2+nfIem25UuHyt5moSJamArzIoh9/vezUQPmYDOzjaHDCkAzuGJibCIkPup8rMT2+wYB6S73cA==", + "version": "7.27.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.27.4.tgz", + "integrity": "sha512-D68nR5zxU64EUzV8i7T3R5XP0Xhrou/amNnddsRQssx6GrTLdZl1rLxyjtVZBd+v/NVX4AbTPOB5aU8thAZV1A==", "license": "MIT", "dependencies": { "@babel/helper-module-imports": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1", - "babel-plugin-polyfill-corejs2": "^0.4.14", - "babel-plugin-polyfill-corejs3": "^0.13.0", - "babel-plugin-polyfill-regenerator": "^0.6.5", + "babel-plugin-polyfill-corejs2": "^0.4.10", + "babel-plugin-polyfill-corejs3": "^0.11.0", + "babel-plugin-polyfill-regenerator": "^0.6.1", "semver": "^6.3.1" }, "engines": { @@ -1706,12 +1680,12 @@ } }, "node_modules/@babel/plugin-transform-typescript": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.28.0.tgz", - "integrity": "sha512-4AEiDEBPIZvLQaWlc9liCavE0xRM0dNca41WtBeM3jgFptfUOSG9z0uteLhq6+3rq+WB6jIvUwKDTpXEHPJ2Vg==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.27.1.tgz", + "integrity": "sha512-Q5sT5+O4QUebHdbwKedFBEwRLb02zJ7r4A5Gg2hUoLuU3FjdMcyqcywqUrLCaDsFCxzokf7u9kuy7qz51YUuAg==", "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-annotate-as-pure": "^7.27.1", "@babel/helper-create-class-features-plugin": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", @@ -1788,12 +1762,12 @@ } }, "node_modules/@babel/preset-env": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.28.0.tgz", - "integrity": "sha512-VmaxeGOwuDqzLl5JUkIRM1X2Qu2uKGxHEQWh+cvvbl7JuJRgKGJSfsEF/bUaxFhJl/XAyxBe7q7qSuTbKFuCyg==", + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.27.2.tgz", + "integrity": "sha512-Ma4zSuYSlGNRlCLO+EAzLnCmJK2vdstgv+n7aUP+/IKZrOfWHOJVdSJtuub8RzHTj3ahD37k5OKJWvzf16TQyQ==", "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.28.0", + "@babel/compat-data": "^7.27.2", "@babel/helper-compilation-targets": "^7.27.2", "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-validator-option": "^7.27.1", @@ -1807,20 +1781,19 @@ "@babel/plugin-syntax-import-attributes": "^7.27.1", "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", "@babel/plugin-transform-arrow-functions": "^7.27.1", - "@babel/plugin-transform-async-generator-functions": "^7.28.0", + "@babel/plugin-transform-async-generator-functions": "^7.27.1", "@babel/plugin-transform-async-to-generator": "^7.27.1", "@babel/plugin-transform-block-scoped-functions": "^7.27.1", - "@babel/plugin-transform-block-scoping": "^7.28.0", + "@babel/plugin-transform-block-scoping": "^7.27.1", "@babel/plugin-transform-class-properties": "^7.27.1", "@babel/plugin-transform-class-static-block": "^7.27.1", - "@babel/plugin-transform-classes": "^7.28.0", + "@babel/plugin-transform-classes": "^7.27.1", "@babel/plugin-transform-computed-properties": "^7.27.1", - "@babel/plugin-transform-destructuring": "^7.28.0", + "@babel/plugin-transform-destructuring": "^7.27.1", "@babel/plugin-transform-dotall-regex": "^7.27.1", "@babel/plugin-transform-duplicate-keys": "^7.27.1", "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.27.1", "@babel/plugin-transform-dynamic-import": "^7.27.1", - "@babel/plugin-transform-explicit-resource-management": "^7.28.0", "@babel/plugin-transform-exponentiation-operator": "^7.27.1", "@babel/plugin-transform-export-namespace-from": "^7.27.1", "@babel/plugin-transform-for-of": "^7.27.1", @@ -1837,15 +1810,15 @@ "@babel/plugin-transform-new-target": "^7.27.1", "@babel/plugin-transform-nullish-coalescing-operator": "^7.27.1", "@babel/plugin-transform-numeric-separator": "^7.27.1", - "@babel/plugin-transform-object-rest-spread": "^7.28.0", + "@babel/plugin-transform-object-rest-spread": "^7.27.2", "@babel/plugin-transform-object-super": "^7.27.1", "@babel/plugin-transform-optional-catch-binding": "^7.27.1", "@babel/plugin-transform-optional-chaining": "^7.27.1", - "@babel/plugin-transform-parameters": "^7.27.7", + "@babel/plugin-transform-parameters": "^7.27.1", "@babel/plugin-transform-private-methods": "^7.27.1", "@babel/plugin-transform-private-property-in-object": "^7.27.1", "@babel/plugin-transform-property-literals": "^7.27.1", - "@babel/plugin-transform-regenerator": "^7.28.0", + "@babel/plugin-transform-regenerator": "^7.27.1", "@babel/plugin-transform-regexp-modifiers": "^7.27.1", "@babel/plugin-transform-reserved-words": "^7.27.1", "@babel/plugin-transform-shorthand-properties": "^7.27.1", @@ -1858,10 +1831,10 @@ "@babel/plugin-transform-unicode-regex": "^7.27.1", "@babel/plugin-transform-unicode-sets-regex": "^7.27.1", "@babel/preset-modules": "0.1.6-no-external-plugins", - "babel-plugin-polyfill-corejs2": "^0.4.14", - "babel-plugin-polyfill-corejs3": "^0.13.0", - "babel-plugin-polyfill-regenerator": "^0.6.5", - "core-js-compat": "^3.43.0", + "babel-plugin-polyfill-corejs2": "^0.4.10", + "babel-plugin-polyfill-corejs3": "^0.11.0", + "babel-plugin-polyfill-regenerator": "^0.6.1", + "core-js-compat": "^3.40.0", "semver": "^6.3.1" }, "engines": { @@ -1934,21 +1907,24 @@ } }, "node_modules/@babel/runtime": { - "version": "7.27.6", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.27.6.tgz", - "integrity": "sha512-vbavdySgbTTrmFE+EsiqUTzlOr5bzlnJtUv9PynGCAKvfQqjIXbvFdumPM/GxMDfyuGMJaJAU6TO4zc1Jf1i8Q==", + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.27.0.tgz", + "integrity": "sha512-VtPOkrdPHZsKc/clNqyi9WUA8TINkZ4cGk63UUE3u4pmB2k+ZMQRDuIOagv8UVd6j7k0T3+RRIb7beKTebNbcw==", "license": "MIT", + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/runtime-corejs3": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.28.0.tgz", - "integrity": "sha512-nlIXnSqLcBij8K8TtkxbBJgfzfvi75V1pAKSM7dUXejGw12vJAqez74jZrHTsJ3Z+Aczc5Q/6JgNjKRMsVU44g==", + "version": "7.27.6", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.27.6.tgz", + "integrity": "sha512-vDVrlmRAY8z9Ul/HxT+8ceAru95LQgkSKiXkSYZvqtbkPSfhZJgpRp45Cldbh1GJ1kxzQkI70AqyrTI58KpaWQ==", "license": "MIT", "dependencies": { - "core-js-pure": "^3.43.0" + "core-js-pure": "^3.30.2" }, "engines": { "node": ">=6.9.0" @@ -1969,27 +1945,27 @@ } }, "node_modules/@babel/traverse": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.0.tgz", - "integrity": "sha512-mGe7UK5wWyh0bKRfupsUchrQGqvDbZDbKJw+kcRGSmdHVYrv+ltd0pnpDTVpiTqnaBru9iEvA8pz8W46v0Amwg==", + "version": "7.27.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.27.4.tgz", + "integrity": "sha512-oNcu2QbHqts9BtOWJosOVJapWjBDSxGCpFvikNR5TGDYDQf3JwpIoMzIKrvfoti93cLfPJEG4tH9SPVeyCGgdA==", "license": "MIT", "dependencies": { "@babel/code-frame": "^7.27.1", - "@babel/generator": "^7.28.0", - "@babel/helper-globals": "^7.28.0", - "@babel/parser": "^7.28.0", + "@babel/generator": "^7.27.3", + "@babel/parser": "^7.27.4", "@babel/template": "^7.27.2", - "@babel/types": "^7.28.0", - "debug": "^4.3.1" + "@babel/types": "^7.27.3", + "debug": "^4.3.1", + "globals": "^11.1.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/types": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.0.tgz", - "integrity": "sha512-jYnje+JyZG5YThjHiF28oT4SIZLnYOcSBb6+SDaFIyzDVSkXQmQQYclJ2R+YxcdmK0AX6x1E5OQNtuh3jHDrUg==", + "version": "7.27.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.27.6.tgz", + "integrity": "sha512-ETyHEk2VHHvl9b9jZP5IHPavHYk57EhanlRRuae9XCpb/j5bDCbPPMOBfCWhnl/7EDJz0jEMCi/RhccCE8r1+Q==", "license": "MIT", "dependencies": { "@babel/helper-string-parser": "^7.27.1", @@ -2182,9 +2158,9 @@ } }, "node_modules/@csstools/postcss-cascade-layers": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/@csstools/postcss-cascade-layers/-/postcss-cascade-layers-5.0.2.tgz", - "integrity": "sha512-nWBE08nhO8uWl6kSAeCx4im7QfVko3zLrtgWZY4/bP87zrSPpSyN/3W3TDqz1jJuH+kbKOHXg5rJnK+ZVYcFFg==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-cascade-layers/-/postcss-cascade-layers-5.0.1.tgz", + "integrity": "sha512-XOfhI7GShVcKiKwmPAnWSqd2tBR0uxt+runAxttbSp/LY2U16yAVPmAf7e9q4JJ0d+xMNmpwNDLBXnmRCl3HMQ==", "funding": [ { "type": "github", @@ -3332,6 +3308,57 @@ "react-dom": "^18.0.0 || ^19.0.0" } }, + "node_modules/@docusaurus/core/node_modules/@docusaurus/mdx-loader": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/@docusaurus/mdx-loader/-/mdx-loader-3.8.1.tgz", + "integrity": "sha512-DZRhagSFRcEq1cUtBMo4TKxSNo/W6/s44yhr8X+eoXqCLycFQUylebOMPseHi5tc4fkGJqwqpWJLz6JStU9L4w==", + "license": "MIT", + "dependencies": { + "@docusaurus/logger": "3.8.1", + "@docusaurus/utils": "3.8.1", + "@docusaurus/utils-validation": "3.8.1", + "@mdx-js/mdx": "^3.0.0", + "@slorber/remark-comment": "^1.0.0", + "escape-html": "^1.0.3", + "estree-util-value-to-estree": "^3.0.1", + "file-loader": "^6.2.0", + "fs-extra": "^11.1.1", + "image-size": "^2.0.2", + "mdast-util-mdx": "^3.0.0", + "mdast-util-to-string": "^4.0.0", + "rehype-raw": "^7.0.0", + "remark-directive": "^3.0.0", + "remark-emoji": "^4.0.0", + "remark-frontmatter": "^5.0.0", + "remark-gfm": "^4.0.0", + "stringify-object": "^3.3.0", + "tslib": "^2.6.0", + "unified": "^11.0.3", + "unist-util-visit": "^5.0.0", + "url-loader": "^4.1.1", + "vfile": "^6.0.1", + "webpack": "^5.88.1" + }, + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/core/node_modules/image-size": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-2.0.2.tgz", + "integrity": "sha512-IRqXKlaXwgSMAMtpNzZa1ZAe8m+Sa1770Dhk8VkSsP9LS+iHD62Zd8FQKs8fbPiagBE7BzoFX23cxFnwshpV6w==", + "license": "MIT", + "bin": { + "image-size": "bin/image-size.js" + }, + "engines": { + "node": ">=16.x" + } + }, "node_modules/@docusaurus/cssnano-preset": { "version": "3.8.1", "resolved": "https://registry.npmjs.org/@docusaurus/cssnano-preset/-/cssnano-preset-3.8.1.tgz", @@ -3383,45 +3410,6 @@ "node": ">=18.0" } }, - "node_modules/@docusaurus/mdx-loader": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/@docusaurus/mdx-loader/-/mdx-loader-3.8.1.tgz", - "integrity": "sha512-DZRhagSFRcEq1cUtBMo4TKxSNo/W6/s44yhr8X+eoXqCLycFQUylebOMPseHi5tc4fkGJqwqpWJLz6JStU9L4w==", - "license": "MIT", - "dependencies": { - "@docusaurus/logger": "3.8.1", - "@docusaurus/utils": "3.8.1", - "@docusaurus/utils-validation": "3.8.1", - "@mdx-js/mdx": "^3.0.0", - "@slorber/remark-comment": "^1.0.0", - "escape-html": "^1.0.3", - "estree-util-value-to-estree": "^3.0.1", - "file-loader": "^6.2.0", - "fs-extra": "^11.1.1", - "image-size": "^2.0.2", - "mdast-util-mdx": "^3.0.0", - "mdast-util-to-string": "^4.0.0", - "rehype-raw": "^7.0.0", - "remark-directive": "^3.0.0", - "remark-emoji": "^4.0.0", - "remark-frontmatter": "^5.0.0", - "remark-gfm": "^4.0.0", - "stringify-object": "^3.3.0", - "tslib": "^2.6.0", - "unified": "^11.0.3", - "unist-util-visit": "^5.0.0", - "url-loader": "^4.1.1", - "vfile": "^6.0.1", - "webpack": "^5.88.1" - }, - "engines": { - "node": ">=18.0" - }, - "peerDependencies": { - "react": "^18.0.0 || ^19.0.0", - "react-dom": "^18.0.0 || ^19.0.0" - } - }, "node_modules/@docusaurus/module-type-aliases": { "version": "3.8.1", "resolved": "https://registry.npmjs.org/@docusaurus/module-type-aliases/-/module-type-aliases-3.8.1.tgz", @@ -3499,6 +3487,57 @@ "react-dom": "^18.0.0 || ^19.0.0" } }, + "node_modules/@docusaurus/plugin-content-blog/node_modules/@docusaurus/mdx-loader": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/@docusaurus/mdx-loader/-/mdx-loader-3.8.1.tgz", + "integrity": "sha512-DZRhagSFRcEq1cUtBMo4TKxSNo/W6/s44yhr8X+eoXqCLycFQUylebOMPseHi5tc4fkGJqwqpWJLz6JStU9L4w==", + "license": "MIT", + "dependencies": { + "@docusaurus/logger": "3.8.1", + "@docusaurus/utils": "3.8.1", + "@docusaurus/utils-validation": "3.8.1", + "@mdx-js/mdx": "^3.0.0", + "@slorber/remark-comment": "^1.0.0", + "escape-html": "^1.0.3", + "estree-util-value-to-estree": "^3.0.1", + "file-loader": "^6.2.0", + "fs-extra": "^11.1.1", + "image-size": "^2.0.2", + "mdast-util-mdx": "^3.0.0", + "mdast-util-to-string": "^4.0.0", + "rehype-raw": "^7.0.0", + "remark-directive": "^3.0.0", + "remark-emoji": "^4.0.0", + "remark-frontmatter": "^5.0.0", + "remark-gfm": "^4.0.0", + "stringify-object": "^3.3.0", + "tslib": "^2.6.0", + "unified": "^11.0.3", + "unist-util-visit": "^5.0.0", + "url-loader": "^4.1.1", + "vfile": "^6.0.1", + "webpack": "^5.88.1" + }, + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/plugin-content-blog/node_modules/image-size": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-2.0.2.tgz", + "integrity": "sha512-IRqXKlaXwgSMAMtpNzZa1ZAe8m+Sa1770Dhk8VkSsP9LS+iHD62Zd8FQKs8fbPiagBE7BzoFX23cxFnwshpV6w==", + "license": "MIT", + "bin": { + "image-size": "bin/image-size.js" + }, + "engines": { + "node": ">=16.x" + } + }, "node_modules/@docusaurus/plugin-content-docs": { "version": "3.8.1", "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-docs/-/plugin-content-docs-3.8.1.tgz", @@ -3532,19 +3571,35 @@ "react-dom": "^18.0.0 || ^19.0.0" } }, - "node_modules/@docusaurus/plugin-content-pages": { + "node_modules/@docusaurus/plugin-content-docs/node_modules/@docusaurus/mdx-loader": { "version": "3.8.1", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-pages/-/plugin-content-pages-3.8.1.tgz", - "integrity": "sha512-a+V6MS2cIu37E/m7nDJn3dcxpvXb6TvgdNI22vJX8iUTp8eoMoPa0VArEbWvCxMY/xdC26WzNv4wZ6y0iIni/w==", + "resolved": "https://registry.npmjs.org/@docusaurus/mdx-loader/-/mdx-loader-3.8.1.tgz", + "integrity": "sha512-DZRhagSFRcEq1cUtBMo4TKxSNo/W6/s44yhr8X+eoXqCLycFQUylebOMPseHi5tc4fkGJqwqpWJLz6JStU9L4w==", "license": "MIT", "dependencies": { - "@docusaurus/core": "3.8.1", - "@docusaurus/mdx-loader": "3.8.1", - "@docusaurus/types": "3.8.1", + "@docusaurus/logger": "3.8.1", "@docusaurus/utils": "3.8.1", "@docusaurus/utils-validation": "3.8.1", + "@mdx-js/mdx": "^3.0.0", + "@slorber/remark-comment": "^1.0.0", + "escape-html": "^1.0.3", + "estree-util-value-to-estree": "^3.0.1", + "file-loader": "^6.2.0", "fs-extra": "^11.1.1", + "image-size": "^2.0.2", + "mdast-util-mdx": "^3.0.0", + "mdast-util-to-string": "^4.0.0", + "rehype-raw": "^7.0.0", + "remark-directive": "^3.0.0", + "remark-emoji": "^4.0.0", + "remark-frontmatter": "^5.0.0", + "remark-gfm": "^4.0.0", + "stringify-object": "^3.3.0", "tslib": "^2.6.0", + "unified": "^11.0.3", + "unist-util-visit": "^5.0.0", + "url-loader": "^4.1.1", + "vfile": "^6.0.1", "webpack": "^5.88.1" }, "engines": { @@ -3555,34 +3610,32 @@ "react-dom": "^18.0.0 || ^19.0.0" } }, - "node_modules/@docusaurus/plugin-css-cascade-layers": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-css-cascade-layers/-/plugin-css-cascade-layers-3.8.1.tgz", - "integrity": "sha512-VQ47xRxfNKjHS5ItzaVXpxeTm7/wJLFMOPo1BkmoMG4Cuz4nuI+Hs62+RMk1OqVog68Swz66xVPK8g9XTrBKRw==", + "node_modules/@docusaurus/plugin-content-docs/node_modules/image-size": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-2.0.2.tgz", + "integrity": "sha512-IRqXKlaXwgSMAMtpNzZa1ZAe8m+Sa1770Dhk8VkSsP9LS+iHD62Zd8FQKs8fbPiagBE7BzoFX23cxFnwshpV6w==", "license": "MIT", - "dependencies": { - "@docusaurus/core": "3.8.1", - "@docusaurus/types": "3.8.1", - "@docusaurus/utils": "3.8.1", - "@docusaurus/utils-validation": "3.8.1", - "tslib": "^2.6.0" + "bin": { + "image-size": "bin/image-size.js" }, "engines": { - "node": ">=18.0" + "node": ">=16.x" } }, - "node_modules/@docusaurus/plugin-debug": { + "node_modules/@docusaurus/plugin-content-pages": { "version": "3.8.1", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-debug/-/plugin-debug-3.8.1.tgz", - "integrity": "sha512-nT3lN7TV5bi5hKMB7FK8gCffFTBSsBsAfV84/v293qAmnHOyg1nr9okEw8AiwcO3bl9vije5nsUvP0aRl2lpaw==", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-pages/-/plugin-content-pages-3.8.1.tgz", + "integrity": "sha512-a+V6MS2cIu37E/m7nDJn3dcxpvXb6TvgdNI22vJX8iUTp8eoMoPa0VArEbWvCxMY/xdC26WzNv4wZ6y0iIni/w==", "license": "MIT", "dependencies": { "@docusaurus/core": "3.8.1", + "@docusaurus/mdx-loader": "3.8.1", "@docusaurus/types": "3.8.1", "@docusaurus/utils": "3.8.1", + "@docusaurus/utils-validation": "3.8.1", "fs-extra": "^11.1.1", - "react-json-view-lite": "^2.3.0", - "tslib": "^2.6.0" + "tslib": "^2.6.0", + "webpack": "^5.88.1" }, "engines": { "node": ">=18.0" @@ -3592,21 +3645,109 @@ "react-dom": "^18.0.0 || ^19.0.0" } }, - "node_modules/@docusaurus/plugin-google-analytics": { + "node_modules/@docusaurus/plugin-content-pages/node_modules/@docusaurus/mdx-loader": { "version": "3.8.1", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-analytics/-/plugin-google-analytics-3.8.1.tgz", - "integrity": "sha512-Hrb/PurOJsmwHAsfMDH6oVpahkEGsx7F8CWMjyP/dw1qjqmdS9rcV1nYCGlM8nOtD3Wk/eaThzUB5TSZsGz+7Q==", + "resolved": "https://registry.npmjs.org/@docusaurus/mdx-loader/-/mdx-loader-3.8.1.tgz", + "integrity": "sha512-DZRhagSFRcEq1cUtBMo4TKxSNo/W6/s44yhr8X+eoXqCLycFQUylebOMPseHi5tc4fkGJqwqpWJLz6JStU9L4w==", "license": "MIT", "dependencies": { - "@docusaurus/core": "3.8.1", - "@docusaurus/types": "3.8.1", + "@docusaurus/logger": "3.8.1", + "@docusaurus/utils": "3.8.1", "@docusaurus/utils-validation": "3.8.1", - "tslib": "^2.6.0" - }, - "engines": { - "node": ">=18.0" - }, - "peerDependencies": { + "@mdx-js/mdx": "^3.0.0", + "@slorber/remark-comment": "^1.0.0", + "escape-html": "^1.0.3", + "estree-util-value-to-estree": "^3.0.1", + "file-loader": "^6.2.0", + "fs-extra": "^11.1.1", + "image-size": "^2.0.2", + "mdast-util-mdx": "^3.0.0", + "mdast-util-to-string": "^4.0.0", + "rehype-raw": "^7.0.0", + "remark-directive": "^3.0.0", + "remark-emoji": "^4.0.0", + "remark-frontmatter": "^5.0.0", + "remark-gfm": "^4.0.0", + "stringify-object": "^3.3.0", + "tslib": "^2.6.0", + "unified": "^11.0.3", + "unist-util-visit": "^5.0.0", + "url-loader": "^4.1.1", + "vfile": "^6.0.1", + "webpack": "^5.88.1" + }, + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/plugin-content-pages/node_modules/image-size": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-2.0.2.tgz", + "integrity": "sha512-IRqXKlaXwgSMAMtpNzZa1ZAe8m+Sa1770Dhk8VkSsP9LS+iHD62Zd8FQKs8fbPiagBE7BzoFX23cxFnwshpV6w==", + "license": "MIT", + "bin": { + "image-size": "bin/image-size.js" + }, + "engines": { + "node": ">=16.x" + } + }, + "node_modules/@docusaurus/plugin-css-cascade-layers": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-css-cascade-layers/-/plugin-css-cascade-layers-3.8.1.tgz", + "integrity": "sha512-VQ47xRxfNKjHS5ItzaVXpxeTm7/wJLFMOPo1BkmoMG4Cuz4nuI+Hs62+RMk1OqVog68Swz66xVPK8g9XTrBKRw==", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.8.1", + "@docusaurus/types": "3.8.1", + "@docusaurus/utils": "3.8.1", + "@docusaurus/utils-validation": "3.8.1", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=18.0" + } + }, + "node_modules/@docusaurus/plugin-debug": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-debug/-/plugin-debug-3.8.1.tgz", + "integrity": "sha512-nT3lN7TV5bi5hKMB7FK8gCffFTBSsBsAfV84/v293qAmnHOyg1nr9okEw8AiwcO3bl9vije5nsUvP0aRl2lpaw==", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.8.1", + "@docusaurus/types": "3.8.1", + "@docusaurus/utils": "3.8.1", + "fs-extra": "^11.1.1", + "react-json-view-lite": "^2.3.0", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/plugin-google-analytics": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-analytics/-/plugin-google-analytics-3.8.1.tgz", + "integrity": "sha512-Hrb/PurOJsmwHAsfMDH6oVpahkEGsx7F8CWMjyP/dw1qjqmdS9rcV1nYCGlM8nOtD3Wk/eaThzUB5TSZsGz+7Q==", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.8.1", + "@docusaurus/types": "3.8.1", + "@docusaurus/utils-validation": "3.8.1", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { "react": "^18.0.0 || ^19.0.0", "react-dom": "^18.0.0 || ^19.0.0" } @@ -3768,6 +3909,57 @@ "react-dom": "^18.0.0 || ^19.0.0" } }, + "node_modules/@docusaurus/theme-classic/node_modules/@docusaurus/mdx-loader": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/@docusaurus/mdx-loader/-/mdx-loader-3.8.1.tgz", + "integrity": "sha512-DZRhagSFRcEq1cUtBMo4TKxSNo/W6/s44yhr8X+eoXqCLycFQUylebOMPseHi5tc4fkGJqwqpWJLz6JStU9L4w==", + "license": "MIT", + "dependencies": { + "@docusaurus/logger": "3.8.1", + "@docusaurus/utils": "3.8.1", + "@docusaurus/utils-validation": "3.8.1", + "@mdx-js/mdx": "^3.0.0", + "@slorber/remark-comment": "^1.0.0", + "escape-html": "^1.0.3", + "estree-util-value-to-estree": "^3.0.1", + "file-loader": "^6.2.0", + "fs-extra": "^11.1.1", + "image-size": "^2.0.2", + "mdast-util-mdx": "^3.0.0", + "mdast-util-to-string": "^4.0.0", + "rehype-raw": "^7.0.0", + "remark-directive": "^3.0.0", + "remark-emoji": "^4.0.0", + "remark-frontmatter": "^5.0.0", + "remark-gfm": "^4.0.0", + "stringify-object": "^3.3.0", + "tslib": "^2.6.0", + "unified": "^11.0.3", + "unist-util-visit": "^5.0.0", + "url-loader": "^4.1.1", + "vfile": "^6.0.1", + "webpack": "^5.88.1" + }, + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/theme-classic/node_modules/image-size": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-2.0.2.tgz", + "integrity": "sha512-IRqXKlaXwgSMAMtpNzZa1ZAe8m+Sa1770Dhk8VkSsP9LS+iHD62Zd8FQKs8fbPiagBE7BzoFX23cxFnwshpV6w==", + "license": "MIT", + "bin": { + "image-size": "bin/image-size.js" + }, + "engines": { + "node": ">=16.x" + } + }, "node_modules/@docusaurus/theme-common": { "version": "3.8.1", "resolved": "https://registry.npmjs.org/@docusaurus/theme-common/-/theme-common-3.8.1.tgz", @@ -3796,6 +3988,57 @@ "react-dom": "^18.0.0 || ^19.0.0" } }, + "node_modules/@docusaurus/theme-common/node_modules/@docusaurus/mdx-loader": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/@docusaurus/mdx-loader/-/mdx-loader-3.8.1.tgz", + "integrity": "sha512-DZRhagSFRcEq1cUtBMo4TKxSNo/W6/s44yhr8X+eoXqCLycFQUylebOMPseHi5tc4fkGJqwqpWJLz6JStU9L4w==", + "license": "MIT", + "dependencies": { + "@docusaurus/logger": "3.8.1", + "@docusaurus/utils": "3.8.1", + "@docusaurus/utils-validation": "3.8.1", + "@mdx-js/mdx": "^3.0.0", + "@slorber/remark-comment": "^1.0.0", + "escape-html": "^1.0.3", + "estree-util-value-to-estree": "^3.0.1", + "file-loader": "^6.2.0", + "fs-extra": "^11.1.1", + "image-size": "^2.0.2", + "mdast-util-mdx": "^3.0.0", + "mdast-util-to-string": "^4.0.0", + "rehype-raw": "^7.0.0", + "remark-directive": "^3.0.0", + "remark-emoji": "^4.0.0", + "remark-frontmatter": "^5.0.0", + "remark-gfm": "^4.0.0", + "stringify-object": "^3.3.0", + "tslib": "^2.6.0", + "unified": "^11.0.3", + "unist-util-visit": "^5.0.0", + "url-loader": "^4.1.1", + "vfile": "^6.0.1", + "webpack": "^5.88.1" + }, + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/theme-common/node_modules/image-size": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-2.0.2.tgz", + "integrity": "sha512-IRqXKlaXwgSMAMtpNzZa1ZAe8m+Sa1770Dhk8VkSsP9LS+iHD62Zd8FQKs8fbPiagBE7BzoFX23cxFnwshpV6w==", + "license": "MIT", + "bin": { + "image-size": "bin/image-size.js" + }, + "engines": { + "node": ">=16.x" + } + }, "node_modules/@docusaurus/theme-search-algolia": { "version": "3.8.1", "resolved": "https://registry.npmjs.org/@docusaurus/theme-search-algolia/-/theme-search-algolia-3.8.1.tgz", @@ -3840,6 +4083,13 @@ "node": ">=18.0" } }, + "node_modules/@docusaurus/tsconfig": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/@docusaurus/tsconfig/-/tsconfig-3.8.1.tgz", + "integrity": "sha512-XBWCcqhRHhkhfolnSolNL+N7gj3HVE3CoZVqnVjfsMzCoOsuQw2iCLxVVHtO+rePUUfouVZHURDgmqIySsF66A==", + "dev": true, + "license": "MIT" + }, "node_modules/@docusaurus/types": { "version": "3.8.1", "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.8.1.tgz", @@ -3939,37 +4189,6 @@ "node": ">=18.0" } }, - "node_modules/@emnapi/core": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.4.3.tgz", - "integrity": "sha512-4m62DuCE07lw01soJwPiBGC0nAww0Q+RY70VZ+n49yDIO13yyinhbWCeNnaob0lakDtWQzSdtNWzJeOJt2ma+g==", - "license": "MIT", - "optional": true, - "dependencies": { - "@emnapi/wasi-threads": "1.0.2", - "tslib": "^2.4.0" - } - }, - "node_modules/@emnapi/runtime": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.4.3.tgz", - "integrity": "sha512-pBPWdu6MLKROBX05wSNKcNb++m5Er+KQ9QkB+WVM+pW2Kx9hoSrVTnu3BdkI5eBLZoKu/J6mW/B6i6bJB2ytXQ==", - "license": "MIT", - "optional": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, - "node_modules/@emnapi/wasi-threads": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.0.2.tgz", - "integrity": "sha512-5n3nTJblwRi8LlXkJ9eBzu+kZR8Yxcc7ubakyQTFzPMtIhFpUBRbsnc2Dv88IZDIbCDlBiWrknhB4Lsz7mg6BA==", - "license": "MIT", - "optional": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, "node_modules/@emotion/babel-plugin": { "version": "11.13.5", "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.13.5.tgz", @@ -4073,9 +4292,9 @@ "license": "MIT" }, "node_modules/@emotion/styled": { - "version": "11.14.1", - "resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-11.14.1.tgz", - "integrity": "sha512-qEEJt42DuToa3gurlH4Qqc1kVpNq8wO8cJtDzU46TjlzWjDlsVyevtYCRijVq3SrHsROS+gVQ8Fnea108GnKzw==", + "version": "11.14.0", + "resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-11.14.0.tgz", + "integrity": "sha512-XxfOnXFffatap2IyCeJyNov3kiDQWoR08gPUQxvbL7fxKryGBKUZUkG6Hz48DZwVrJSVh9sJboyV1Ds4OW6SgA==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.18.3", @@ -4123,31 +4342,31 @@ "license": "MIT" }, "node_modules/@floating-ui/core": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.7.2.tgz", - "integrity": "sha512-wNB5ooIKHQc+Kui96jE/n69rHFWAVoxn5CAzL1Xdd8FG03cgY3MLO+GF9U3W737fYDSgPWA6MReKhBQBop6Pcw==", + "version": "1.6.9", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.9.tgz", + "integrity": "sha512-uMXCuQ3BItDUbAMhIXw7UPXRfAlOAvZzdK9BWpE60MCn+Svt3aLn9jsPTi/WNGlRUu2uI0v5S7JiIUsbsvh3fw==", "license": "MIT", "dependencies": { - "@floating-ui/utils": "^0.2.10" + "@floating-ui/utils": "^0.2.9" } }, "node_modules/@floating-ui/dom": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.7.2.tgz", - "integrity": "sha512-7cfaOQuCS27HD7DX+6ib2OrnW+b4ZBwDNnCcT0uTyidcmyWb03FnQqJybDBoCnpdxwBSfA94UAYlRCt7mV+TbA==", + "version": "1.6.13", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.13.tgz", + "integrity": "sha512-umqzocjDgNRGTuO7Q8CU32dkHkECqI8ZdMZ5Swb6QAM0t5rnlrN3lGo1hdpscRd3WS8T6DKYK4ephgIH9iRh3w==", "license": "MIT", "dependencies": { - "@floating-ui/core": "^1.7.2", - "@floating-ui/utils": "^0.2.10" + "@floating-ui/core": "^1.6.0", + "@floating-ui/utils": "^0.2.9" } }, "node_modules/@floating-ui/react-dom": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.4.tgz", - "integrity": "sha512-JbbpPhp38UmXDDAu60RJmbeme37Jbgsm7NrHGgzYYFKmblzRUh6Pa641dII6LsjwF4XlScDrde2UAzDo/b9KPw==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.2.tgz", + "integrity": "sha512-06okr5cgPzMNBy+Ycse2A6udMi4bqwW/zgBF/rwjcNqWkyr82Mcg8b0vjX8OJpZFy/FKjJmw6wV7t44kK6kW7A==", "license": "MIT", "dependencies": { - "@floating-ui/dom": "^1.7.2" + "@floating-ui/dom": "^1.0.0" }, "peerDependencies": { "react": ">=16.8.0", @@ -4155,9 +4374,9 @@ } }, "node_modules/@floating-ui/utils": { - "version": "0.2.10", - "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.10.tgz", - "integrity": "sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ==", + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.9.tgz", + "integrity": "sha512-MDWhGtE+eHw5JW7lq4qhc5yRLS11ERl1c7Z6Xd0a58DozHES6EnNNwUWbMiG4J9Cgj053Bhk8zvlhFYKVhULwg==", "license": "MIT" }, "node_modules/@hapi/hoek": { @@ -4249,13 +4468,17 @@ } }, "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.12", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.12.tgz", - "integrity": "sha512-OuLGC46TjB5BbN1dH8JULVVZY4WTdkF7tV9Ys6wLL1rubZnCMstOhNHueU5bLCrnRuDhKPDM4g6sw4Bel5Gzqg==", + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz", + "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", "license": "MIT", "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" } }, "node_modules/@jridgewell/resolve-uri": { @@ -4267,10 +4490,19 @@ "node": ">=6.0.0" } }, + "node_modules/@jridgewell/set-array": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/@jridgewell/source-map": { - "version": "0.3.10", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.10.tgz", - "integrity": "sha512-0pPkgz9dY+bijgistcTTJ5mR+ocqRXLuhXHYdzoMmmoJ2C9S46RCm2GMUbatPEUK9Yjy26IrAy8D/M00lLkv+Q==", + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz", + "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==", "license": "MIT", "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", @@ -4278,15 +4510,15 @@ } }, "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.4.tgz", - "integrity": "sha512-VT2+G1VQs/9oz078bLrYbecdZKs912zQlkelYpuf+SXF+QvZDYJlbx/LSx+meSAwdDFnF8FVXW92AVjjkVmgFw==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", "license": "MIT" }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.29", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.29.tgz", - "integrity": "sha512-uw6guiW/gcAGPDhLmd77/6lW8QLeiV5RUTsAX46Db6oLhGaVj4lhnPwb184s1bkc8kdVg/+h988dro8GRDpmYQ==", + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", "license": "MIT", "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", @@ -4362,56 +4594,56 @@ } }, "node_modules/@module-federation/error-codes": { - "version": "0.15.0", - "resolved": "https://registry.npmjs.org/@module-federation/error-codes/-/error-codes-0.15.0.tgz", - "integrity": "sha512-CFJSF+XKwTcy0PFZ2l/fSUpR4z247+Uwzp1sXVkdIfJ/ATsnqf0Q01f51qqSEA6MYdQi6FKos9FIcu3dCpQNdg==", + "version": "0.14.3", + "resolved": "https://registry.npmjs.org/@module-federation/error-codes/-/error-codes-0.14.3.tgz", + "integrity": "sha512-sBJ3XKU9g5Up31jFeXPFsD8AgORV7TLO/cCSMuRewSfgYbG/3vSKLJmfHrO6+PvjZSb9VyV2UaF02ojktW65vw==", "license": "MIT" }, "node_modules/@module-federation/runtime": { - "version": "0.15.0", - "resolved": "https://registry.npmjs.org/@module-federation/runtime/-/runtime-0.15.0.tgz", - "integrity": "sha512-dTPsCNum9Bhu3yPOcrPYq0YnM9eCMMMNB1wuiqf1+sFbQlNApF0vfZxooqz3ln0/MpgE0jerVvFsLVGfqvC9Ug==", + "version": "0.14.3", + "resolved": "https://registry.npmjs.org/@module-federation/runtime/-/runtime-0.14.3.tgz", + "integrity": "sha512-7ZHpa3teUDVhraYdxQGkfGHzPbjna4LtwbpudgzAxSLLFxLDNanaxCuSeIgSM9c+8sVUNC9kvzUgJEZB0krPJw==", "license": "MIT", "dependencies": { - "@module-federation/error-codes": "0.15.0", - "@module-federation/runtime-core": "0.15.0", - "@module-federation/sdk": "0.15.0" + "@module-federation/error-codes": "0.14.3", + "@module-federation/runtime-core": "0.14.3", + "@module-federation/sdk": "0.14.3" } }, "node_modules/@module-federation/runtime-core": { - "version": "0.15.0", - "resolved": "https://registry.npmjs.org/@module-federation/runtime-core/-/runtime-core-0.15.0.tgz", - "integrity": "sha512-RYzI61fRDrhyhaEOXH3AgIGlHiot0wPFXu7F43cr+ZnTi+VlSYWLdlZ4NBuT9uV6JSmH54/c+tEZm5SXgKR2sQ==", + "version": "0.14.3", + "resolved": "https://registry.npmjs.org/@module-federation/runtime-core/-/runtime-core-0.14.3.tgz", + "integrity": "sha512-xMFQXflLVW/AJTWb4soAFP+LB4XuhE7ryiLIX8oTyUoBBgV6U2OPghnFljPjeXbud72O08NYlQ1qsHw1kN/V8Q==", "license": "MIT", "dependencies": { - "@module-federation/error-codes": "0.15.0", - "@module-federation/sdk": "0.15.0" + "@module-federation/error-codes": "0.14.3", + "@module-federation/sdk": "0.14.3" } }, "node_modules/@module-federation/runtime-tools": { - "version": "0.15.0", - "resolved": "https://registry.npmjs.org/@module-federation/runtime-tools/-/runtime-tools-0.15.0.tgz", - "integrity": "sha512-kzFn3ObUeBp5vaEtN1WMxhTYBuYEErxugu1RzFUERD21X3BZ+b4cWwdFJuBDlsmVjctIg/QSOoZoPXRKAO0foA==", + "version": "0.14.3", + "resolved": "https://registry.npmjs.org/@module-federation/runtime-tools/-/runtime-tools-0.14.3.tgz", + "integrity": "sha512-QBETX7iMYXdSa3JtqFlYU+YkpymxETZqyIIRiqg0gW+XGpH3jgU68yjrme2NBJp7URQi/CFZG8KWtfClk0Pjgw==", "license": "MIT", "dependencies": { - "@module-federation/runtime": "0.15.0", - "@module-federation/webpack-bundler-runtime": "0.15.0" + "@module-federation/runtime": "0.14.3", + "@module-federation/webpack-bundler-runtime": "0.14.3" } }, "node_modules/@module-federation/sdk": { - "version": "0.15.0", - "resolved": "https://registry.npmjs.org/@module-federation/sdk/-/sdk-0.15.0.tgz", - "integrity": "sha512-PWiYbGcJrKUD6JZiEPihrXhV3bgXdll4bV7rU+opV7tHaun+Z0CdcawjZ82Xnpb8MCPGmqHwa1MPFeUs66zksw==", + "version": "0.14.3", + "resolved": "https://registry.npmjs.org/@module-federation/sdk/-/sdk-0.14.3.tgz", + "integrity": "sha512-THJZMfbXpqjQOLblCQ8jjcBFFXsGRJwUWE9l/Q4SmuCSKMgAwie7yLT0qSGrHmyBYrsUjAuy+xNB4nfKP0pnGw==", "license": "MIT" }, "node_modules/@module-federation/webpack-bundler-runtime": { - "version": "0.15.0", - "resolved": "https://registry.npmjs.org/@module-federation/webpack-bundler-runtime/-/webpack-bundler-runtime-0.15.0.tgz", - "integrity": "sha512-i+3wu2Ljh2TmuUpsnjwZVupOVqV50jP0ndA8PSP4gwMKlgdGeaZ4VH5KkHAXGr2eiYUxYLMrJXz1+eILJqeGDg==", + "version": "0.14.3", + "resolved": "https://registry.npmjs.org/@module-federation/webpack-bundler-runtime/-/webpack-bundler-runtime-0.14.3.tgz", + "integrity": "sha512-hIyJFu34P7bY2NeMIUHAS/mYUHEY71VTAsN0A0AqEJFSVPszheopu9VdXq0VDLrP9KQfuXT8SDxeYeJXyj0mgA==", "license": "MIT", "dependencies": { - "@module-federation/runtime": "0.15.0", - "@module-federation/sdk": "0.15.0" + "@module-federation/runtime": "0.14.3", + "@module-federation/sdk": "0.14.3" } }, "node_modules/@mui/base": { @@ -4767,18 +4999,6 @@ } } }, - "node_modules/@napi-rs/wasm-runtime": { - "version": "0.2.11", - "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.11.tgz", - "integrity": "sha512-9DPkXtvHydrcOsopiYpUgPHpmj0HWZKMUnL2dZqpvC42lsratuBG06V5ipyno0fUek5VlFsNQ+AcFATSrJXgMA==", - "license": "MIT", - "optional": true, - "dependencies": { - "@emnapi/core": "^1.4.3", - "@emnapi/runtime": "^1.4.3", - "@tybys/wasm-util": "^0.9.0" - } - }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -4813,362 +5033,132 @@ "engines": { "node": ">= 8" } - }, - "node_modules/@pkgjs/parseargs": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", - "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">=14" - } - }, - "node_modules/@pnpm/config.env-replace": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@pnpm/config.env-replace/-/config.env-replace-1.1.0.tgz", - "integrity": "sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w==", - "license": "MIT", - "engines": { - "node": ">=12.22.0" - } - }, - "node_modules/@pnpm/network.ca-file": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@pnpm/network.ca-file/-/network.ca-file-1.0.2.tgz", - "integrity": "sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA==", - "license": "MIT", - "dependencies": { - "graceful-fs": "4.2.10" - }, - "engines": { - "node": ">=12.22.0" - } - }, - "node_modules/@pnpm/network.ca-file/node_modules/graceful-fs": { - "version": "4.2.10", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", - "license": "ISC" - }, - "node_modules/@pnpm/npm-conf": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/@pnpm/npm-conf/-/npm-conf-2.3.1.tgz", - "integrity": "sha512-c83qWb22rNRuB0UaVCI0uRPNRr8Z0FWnEIvT47jiHAmOIUHbBOg5XvV7pM5x+rKn9HRpjxquDbXYSXr3fAKFcw==", - "license": "MIT", - "dependencies": { - "@pnpm/config.env-replace": "^1.1.0", - "@pnpm/network.ca-file": "^1.0.1", - "config-chain": "^1.1.11" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@polka/url": { - "version": "1.0.0-next.29", - "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.29.tgz", - "integrity": "sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==", - "license": "MIT" - }, - "node_modules/@popperjs/core": { - "version": "2.11.8", - "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", - "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/popperjs" - } - }, - "node_modules/@radix-ui/primitive": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.2.tgz", - "integrity": "sha512-XnbHrrprsNqZKQhStrSwgRUQzoCI1glLzdw79xiZPoofhGICeZRSQ3dIxAKH1gb3OHfNf4d6f+vAv3kil2eggA==", - "license": "MIT" - }, - "node_modules/@radix-ui/react-compose-refs": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.2.tgz", - "integrity": "sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg==", - "license": "MIT", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-context": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.2.tgz", - "integrity": "sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA==", - "license": "MIT", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-focus-guards": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-1.1.2.tgz", - "integrity": "sha512-fyjAACV62oPV925xFCrH8DR5xWhg9KYtJT4s3u54jxp+L/hbpTY2kIeEFFbFe+a/HCE94zGQMZLIpVTPVZDhaA==", - "license": "MIT", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-id": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.1.1.tgz", - "integrity": "sha512-kGkGegYIdQsOb4XjsfM97rXsiHaBwco+hFI66oO4s9LU+PLAC5oJ7khdOVFxkhsmlbpUqDAvXw11CluXP+jkHg==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-use-layout-effect": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-popover": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/@radix-ui/react-popover/-/react-popover-1.1.14.tgz", - "integrity": "sha512-ODz16+1iIbGUfFEfKx2HTPKizg2MN39uIOV8MXeHnmdd3i/N9Wt7vU46wbHsqA0xoaQyXVcs0KIlBdOA2Y95bw==", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.2", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-dismissable-layer": "1.1.10", - "@radix-ui/react-focus-guards": "1.1.2", - "@radix-ui/react-focus-scope": "1.1.7", - "@radix-ui/react-id": "1.1.1", - "@radix-ui/react-popper": "1.2.7", - "@radix-ui/react-portal": "1.1.9", - "@radix-ui/react-presence": "1.1.4", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-slot": "1.2.3", - "@radix-ui/react-use-controllable-state": "1.2.2", - "aria-hidden": "^1.2.4", - "react-remove-scroll": "^2.6.3" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-popover/node_modules/@radix-ui/react-dismissable-layer": { - "version": "1.1.10", - "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.10.tgz", - "integrity": "sha512-IM1zzRV4W3HtVgftdQiiOmA0AdJlCtMLe00FXaHwgt3rAnNsIyDqshvkIW3hj/iu5hu8ERP7KIYki6NkqDxAwQ==", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.2", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-callback-ref": "1.1.1", - "@radix-ui/react-use-escape-keydown": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=14" } }, - "node_modules/@radix-ui/react-popover/node_modules/@radix-ui/react-focus-scope": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.1.7.tgz", - "integrity": "sha512-t2ODlkXBQyn7jkl6TNaw/MtVEVvIGelJDCG41Okq/KwUsJBwQ4XVZsHAVUkK4mBv3ewiAS3PGuUWuY2BoK4ZUw==", + "node_modules/@pnpm/config.env-replace": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@pnpm/config.env-replace/-/config.env-replace-1.1.0.tgz", + "integrity": "sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w==", "license": "MIT", - "dependencies": { - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-callback-ref": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } + "engines": { + "node": ">=12.22.0" } }, - "node_modules/@radix-ui/react-popover/node_modules/@radix-ui/react-popper": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/@radix-ui/react-popper/-/react-popper-1.2.7.tgz", - "integrity": "sha512-IUFAccz1JyKcf/RjB552PlWwxjeCJB8/4KxT7EhBHOJM+mN7LdW+B3kacJXILm32xawcMMjb2i0cIZpo+f9kiQ==", + "node_modules/@pnpm/network.ca-file": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@pnpm/network.ca-file/-/network.ca-file-1.0.2.tgz", + "integrity": "sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA==", "license": "MIT", "dependencies": { - "@floating-ui/react-dom": "^2.0.0", - "@radix-ui/react-arrow": "1.1.7", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-callback-ref": "1.1.1", - "@radix-ui/react-use-layout-effect": "1.1.1", - "@radix-ui/react-use-rect": "1.1.1", - "@radix-ui/react-use-size": "1.1.1", - "@radix-ui/rect": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + "graceful-fs": "4.2.10" }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } + "engines": { + "node": ">=12.22.0" } }, - "node_modules/@radix-ui/react-popover/node_modules/@radix-ui/react-popper/node_modules/@radix-ui/react-arrow": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/@radix-ui/react-arrow/-/react-arrow-1.1.7.tgz", - "integrity": "sha512-F+M1tLhO+mlQaOWspE8Wstg+z6PwxwRd8oQ8IXceWz92kfAmalTRf0EjrouQeo7QssEPfCn05B4Ihs1K9WQ/7w==", + "node_modules/@pnpm/network.ca-file/node_modules/graceful-fs": { + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", + "license": "ISC" + }, + "node_modules/@pnpm/npm-conf": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/@pnpm/npm-conf/-/npm-conf-2.3.1.tgz", + "integrity": "sha512-c83qWb22rNRuB0UaVCI0uRPNRr8Z0FWnEIvT47jiHAmOIUHbBOg5XvV7pM5x+rKn9HRpjxquDbXYSXr3fAKFcw==", "license": "MIT", "dependencies": { - "@radix-ui/react-primitive": "2.1.3" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + "@pnpm/config.env-replace": "^1.1.0", + "@pnpm/network.ca-file": "^1.0.1", + "config-chain": "^1.1.11" }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } + "engines": { + "node": ">=12" + } + }, + "node_modules/@polka/url": { + "version": "1.0.0-next.29", + "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.29.tgz", + "integrity": "sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==", + "license": "MIT" + }, + "node_modules/@popperjs/core": { + "version": "2.11.8", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", + "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/popperjs" } }, - "node_modules/@radix-ui/react-popover/node_modules/@radix-ui/react-portal": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.1.9.tgz", - "integrity": "sha512-bpIxvq03if6UNwXZ+HTK71JLh4APvnXntDc6XOX8UVq4XQOVl7lwok0AvIl+b8zgCw3fSaVTZMpAPPagXbKmHQ==", + "node_modules/@radix-ui/primitive": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.2.tgz", + "integrity": "sha512-XnbHrrprsNqZKQhStrSwgRUQzoCI1glLzdw79xiZPoofhGICeZRSQ3dIxAKH1gb3OHfNf4d6f+vAv3kil2eggA==", + "license": "MIT" + }, + "node_modules/@radix-ui/react-compose-refs": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.2.tgz", + "integrity": "sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg==", "license": "MIT", - "dependencies": { - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-layout-effect": "1.1.1" - }, "peerDependencies": { "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "peerDependenciesMeta": { "@types/react": { "optional": true - }, - "@types/react-dom": { - "optional": true } } }, - "node_modules/@radix-ui/react-popover/node_modules/@radix-ui/react-presence": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.1.4.tgz", - "integrity": "sha512-ueDqRbdc4/bkaQT3GIpLQssRlFgWaL/U2z/S31qRwwLWoxHLgry3SIfCwhxeQNbirEUXFa+lq3RL3oBYXtcmIA==", + "node_modules/@radix-ui/react-context": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.2.tgz", + "integrity": "sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA==", "license": "MIT", - "dependencies": { - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-use-layout-effect": "1.1.1" - }, "peerDependencies": { "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "peerDependenciesMeta": { "@types/react": { "optional": true - }, - "@types/react-dom": { - "optional": true } } }, - "node_modules/@radix-ui/react-popover/node_modules/@radix-ui/react-primitive": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.3.tgz", - "integrity": "sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ==", + "node_modules/@radix-ui/react-id": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.1.1.tgz", + "integrity": "sha512-kGkGegYIdQsOb4XjsfM97rXsiHaBwco+hFI66oO4s9LU+PLAC5oJ7khdOVFxkhsmlbpUqDAvXw11CluXP+jkHg==", "license": "MIT", "dependencies": { - "@radix-ui/react-slot": "1.2.3" + "@radix-ui/react-use-layout-effect": "1.1.1" }, "peerDependencies": { "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "peerDependenciesMeta": { "@types/react": { "optional": true - }, - "@types/react-dom": { - "optional": true } } }, "node_modules/@radix-ui/react-slot": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz", - "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.0.tgz", + "integrity": "sha512-ujc+V6r0HNDviYqIK3rW4ffgYiZ8g5DEHrGJVk4x7kTlLXRDILnKX9vAUYeIsLOoDpDJ0ujpqMkjH4w2ofuo6w==", "license": "MIT", "dependencies": { "@radix-ui/react-compose-refs": "1.1.2" @@ -5184,23 +5174,23 @@ } }, "node_modules/@radix-ui/react-tooltip": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/@radix-ui/react-tooltip/-/react-tooltip-1.2.7.tgz", - "integrity": "sha512-Ap+fNYwKTYJ9pzqW+Xe2HtMRbQ/EeWkj2qykZ6SuEV4iS/o1bZI5ssJbk4D2r8XuDuOBVz/tIx2JObtuqU+5Zw==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-tooltip/-/react-tooltip-1.2.0.tgz", + "integrity": "sha512-b1Sdc75s7zN9B8ONQTGBSHL3XS8+IcjcOIY51fhM4R1Hx8s0YbgqgyNZiri4qcYMVZK8hfCZVBiyCm7N9rs0rw==", "license": "MIT", "dependencies": { "@radix-ui/primitive": "1.1.2", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-dismissable-layer": "1.1.10", + "@radix-ui/react-dismissable-layer": "1.1.6", "@radix-ui/react-id": "1.1.1", - "@radix-ui/react-popper": "1.2.7", - "@radix-ui/react-portal": "1.1.9", - "@radix-ui/react-presence": "1.1.4", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-slot": "1.2.3", - "@radix-ui/react-use-controllable-state": "1.2.2", - "@radix-ui/react-visually-hidden": "1.2.3" + "@radix-ui/react-popper": "1.2.3", + "@radix-ui/react-portal": "1.1.5", + "@radix-ui/react-presence": "1.1.3", + "@radix-ui/react-primitive": "2.0.3", + "@radix-ui/react-slot": "1.2.0", + "@radix-ui/react-use-controllable-state": "1.1.1", + "@radix-ui/react-visually-hidden": "1.1.3" }, "peerDependencies": { "@types/react": "*", @@ -5218,14 +5208,14 @@ } }, "node_modules/@radix-ui/react-tooltip/node_modules/@radix-ui/react-dismissable-layer": { - "version": "1.1.10", - "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.10.tgz", - "integrity": "sha512-IM1zzRV4W3HtVgftdQiiOmA0AdJlCtMLe00FXaHwgt3rAnNsIyDqshvkIW3hj/iu5hu8ERP7KIYki6NkqDxAwQ==", + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.6.tgz", + "integrity": "sha512-7gpgMT2gyKym9Jz2ZhlRXSg2y6cNQIK8d/cqBZ0RBCaps8pFryCWXiUKI+uHGFrhMrbGUP7U6PWgiXzIxoyF3Q==", "license": "MIT", "dependencies": { "@radix-ui/primitive": "1.1.2", "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-primitive": "2.0.3", "@radix-ui/react-use-callback-ref": "1.1.1", "@radix-ui/react-use-escape-keydown": "1.1.1" }, @@ -5245,16 +5235,16 @@ } }, "node_modules/@radix-ui/react-tooltip/node_modules/@radix-ui/react-popper": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/@radix-ui/react-popper/-/react-popper-1.2.7.tgz", - "integrity": "sha512-IUFAccz1JyKcf/RjB552PlWwxjeCJB8/4KxT7EhBHOJM+mN7LdW+B3kacJXILm32xawcMMjb2i0cIZpo+f9kiQ==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-popper/-/react-popper-1.2.3.tgz", + "integrity": "sha512-iNb9LYUMkne9zIahukgQmHlSBp9XWGeQQ7FvUGNk45ywzOb6kQa+Ca38OphXlWDiKvyneo9S+KSJsLfLt8812A==", "license": "MIT", "dependencies": { "@floating-ui/react-dom": "^2.0.0", - "@radix-ui/react-arrow": "1.1.7", + "@radix-ui/react-arrow": "1.1.3", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-primitive": "2.0.3", "@radix-ui/react-use-callback-ref": "1.1.1", "@radix-ui/react-use-layout-effect": "1.1.1", "@radix-ui/react-use-rect": "1.1.1", @@ -5277,12 +5267,12 @@ } }, "node_modules/@radix-ui/react-tooltip/node_modules/@radix-ui/react-popper/node_modules/@radix-ui/react-arrow": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/@radix-ui/react-arrow/-/react-arrow-1.1.7.tgz", - "integrity": "sha512-F+M1tLhO+mlQaOWspE8Wstg+z6PwxwRd8oQ8IXceWz92kfAmalTRf0EjrouQeo7QssEPfCn05B4Ihs1K9WQ/7w==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-arrow/-/react-arrow-1.1.3.tgz", + "integrity": "sha512-2dvVU4jva0qkNZH6HHWuSz5FN5GeU5tymvCgutF8WaXz9WnD1NgUhy73cqzkjkN4Zkn8lfTPv5JIfrC221W+Nw==", "license": "MIT", "dependencies": { - "@radix-ui/react-primitive": "2.1.3" + "@radix-ui/react-primitive": "2.0.3" }, "peerDependencies": { "@types/react": "*", @@ -5300,12 +5290,12 @@ } }, "node_modules/@radix-ui/react-tooltip/node_modules/@radix-ui/react-portal": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.1.9.tgz", - "integrity": "sha512-bpIxvq03if6UNwXZ+HTK71JLh4APvnXntDc6XOX8UVq4XQOVl7lwok0AvIl+b8zgCw3fSaVTZMpAPPagXbKmHQ==", + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.1.5.tgz", + "integrity": "sha512-ps/67ZqsFm+Mb6lSPJpfhRLrVL2i2fntgCmGMqqth4eaGUf+knAuuRtWVJrNjUhExgmdRqftSgzpf0DF0n6yXA==", "license": "MIT", "dependencies": { - "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-primitive": "2.0.3", "@radix-ui/react-use-layout-effect": "1.1.1" }, "peerDependencies": { @@ -5324,9 +5314,9 @@ } }, "node_modules/@radix-ui/react-tooltip/node_modules/@radix-ui/react-presence": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.1.4.tgz", - "integrity": "sha512-ueDqRbdc4/bkaQT3GIpLQssRlFgWaL/U2z/S31qRwwLWoxHLgry3SIfCwhxeQNbirEUXFa+lq3RL3oBYXtcmIA==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.1.3.tgz", + "integrity": "sha512-IrVLIhskYhH3nLvtcBLQFZr61tBG7wx7O3kEmdzcYwRGAEBmBicGGL7ATzNgruYJ3xBTbuzEEq9OXJM3PAX3tA==", "license": "MIT", "dependencies": { "@radix-ui/react-compose-refs": "1.1.2", @@ -5348,12 +5338,12 @@ } }, "node_modules/@radix-ui/react-tooltip/node_modules/@radix-ui/react-primitive": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.3.tgz", - "integrity": "sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.0.3.tgz", + "integrity": "sha512-Pf/t/GkndH7CQ8wE2hbkXA+WyZ83fhQQn5DDmwDiDo6AwN/fhaH8oqZ0jRjMrO2iaMhDi6P1HRx6AZwyMinY1g==", "license": "MIT", "dependencies": { - "@radix-ui/react-slot": "1.2.3" + "@radix-ui/react-slot": "1.2.0" }, "peerDependencies": { "@types/react": "*", @@ -5371,12 +5361,12 @@ } }, "node_modules/@radix-ui/react-tooltip/node_modules/@radix-ui/react-visually-hidden": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-visually-hidden/-/react-visually-hidden-1.2.3.tgz", - "integrity": "sha512-pzJq12tEaaIhqjbzpCuv/OypJY/BPavOofm+dbab+MHLajy277+1lLm6JFcGgF5eskJ6mquGirhXY2GD/8u8Ug==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-visually-hidden/-/react-visually-hidden-1.1.3.tgz", + "integrity": "sha512-oXSF3ZQRd5fvomd9hmUCb2EHSZbPp3ZSHAHJJU/DlF9XoFkJBBW8RHU/E8WEH+RbSfJd/QFA0sl8ClJXknBwHQ==", "license": "MIT", "dependencies": { - "@radix-ui/react-primitive": "2.1.3" + "@radix-ui/react-primitive": "2.0.3" }, "peerDependencies": { "@types/react": "*", @@ -5409,31 +5399,12 @@ } }, "node_modules/@radix-ui/react-use-controllable-state": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.2.2.tgz", - "integrity": "sha512-BjasUjixPFdS+NKkypcyyN5Pmg83Olst0+c6vGov0diwTEo6mgdqVR6hxcEgFuh4QrAs7Rc+9KuGJ9TVCj0Zzg==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-use-effect-event": "0.0.2", - "@radix-ui/react-use-layout-effect": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-use-effect-event": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-effect-event/-/react-use-effect-event-0.0.2.tgz", - "integrity": "sha512-Qp8WbZOBe+blgpuUT+lw2xheLP8q0oatc9UpmiemEICxGvFLYmHm9QowVZGHtJlGbS6A6yJ3iViad/2cVjnOiA==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.1.1.tgz", + "integrity": "sha512-YnEXIy8/ga01Y1PN0VfaNH//MhA91JlEGVBDxDzROqwrAtG5Yr2QGEPz8A/rJA3C7ZAHryOYGaUv8fLSW2H/mg==", "license": "MIT", "dependencies": { - "@radix-ui/react-use-layout-effect": "1.1.1" + "@radix-ui/react-use-callback-ref": "1.1.1" }, "peerDependencies": { "@types/react": "*", @@ -5521,27 +5492,26 @@ "license": "MIT" }, "node_modules/@rspack/binding": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/@rspack/binding/-/binding-1.4.2.tgz", - "integrity": "sha512-NdTLlA20ufD0thFvDIwwPk+bX9yo3TDE4XjfvZYbwFyYvBgqJOWQflnbwLgvSTck0MSTiOqWIqpR88ymAvWTqg==", + "version": "1.3.15", + "resolved": "https://registry.npmjs.org/@rspack/binding/-/binding-1.3.15.tgz", + "integrity": "sha512-utNPuJglLO5lW9XbwIqjB7+2ilMo6JkuVLTVdnNVKU94FW7asn9F/qV+d+MgjUVqU1QPCGm0NuGO9xhbgeJ7pg==", "license": "MIT", "optionalDependencies": { - "@rspack/binding-darwin-arm64": "1.4.2", - "@rspack/binding-darwin-x64": "1.4.2", - "@rspack/binding-linux-arm64-gnu": "1.4.2", - "@rspack/binding-linux-arm64-musl": "1.4.2", - "@rspack/binding-linux-x64-gnu": "1.4.2", - "@rspack/binding-linux-x64-musl": "1.4.2", - "@rspack/binding-wasm32-wasi": "1.4.2", - "@rspack/binding-win32-arm64-msvc": "1.4.2", - "@rspack/binding-win32-ia32-msvc": "1.4.2", - "@rspack/binding-win32-x64-msvc": "1.4.2" + "@rspack/binding-darwin-arm64": "1.3.15", + "@rspack/binding-darwin-x64": "1.3.15", + "@rspack/binding-linux-arm64-gnu": "1.3.15", + "@rspack/binding-linux-arm64-musl": "1.3.15", + "@rspack/binding-linux-x64-gnu": "1.3.15", + "@rspack/binding-linux-x64-musl": "1.3.15", + "@rspack/binding-win32-arm64-msvc": "1.3.15", + "@rspack/binding-win32-ia32-msvc": "1.3.15", + "@rspack/binding-win32-x64-msvc": "1.3.15" } }, "node_modules/@rspack/binding-darwin-arm64": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/@rspack/binding-darwin-arm64/-/binding-darwin-arm64-1.4.2.tgz", - "integrity": "sha512-0fPOew7D0l/x6qFZYdyUqutbw15K98VLvES2/7x2LPssTgypE4rVmnQSmVBnge3Nr8Qs/9qASPRpMWXBaqMfOA==", + "version": "1.3.15", + "resolved": "https://registry.npmjs.org/@rspack/binding-darwin-arm64/-/binding-darwin-arm64-1.3.15.tgz", + "integrity": "sha512-f+DnVRENRdVe+ufpZeqTtWAUDSTnP48jVo7x9KWsXf8XyJHUi+eHKEPrFoy1HvL1/k5yJ3HVnFBh1Hb9cNIwSg==", "cpu": [ "arm64" ], @@ -5552,9 +5522,9 @@ ] }, "node_modules/@rspack/binding-darwin-x64": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/@rspack/binding-darwin-x64/-/binding-darwin-x64-1.4.2.tgz", - "integrity": "sha512-0Dh6ssGgwnd9G+IO8SwQaJ0RJ8NkQbk4hwoJH/u52Mnfl0EvhmNvuhkbSEoKn1U3kElOA2cxH/3gbYzuYExn3g==", + "version": "1.3.15", + "resolved": "https://registry.npmjs.org/@rspack/binding-darwin-x64/-/binding-darwin-x64-1.3.15.tgz", + "integrity": "sha512-TfUvEIBqYUT2OK01BYXb2MNcZeZIhAnJy/5aj0qV0uy4KlvwW63HYcKWa1sFd4Ac7bnGShDkanvP3YEuHOFOyg==", "cpu": [ "x64" ], @@ -5565,9 +5535,9 @@ ] }, "node_modules/@rspack/binding-linux-arm64-gnu": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/@rspack/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.4.2.tgz", - "integrity": "sha512-UHAzggS8Mc7b3Xguhj82HwujLqBZquCeo8qJj5XreNaMKGb6YRw/91dJOVmkNiLCB0bj71CRE1Cocd+Peq3N9A==", + "version": "1.3.15", + "resolved": "https://registry.npmjs.org/@rspack/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.3.15.tgz", + "integrity": "sha512-D/YjYk9snKvYm1Elotq8/GsEipB4ZJWVv/V8cZ+ohhFNOPzygENi6JfyI06TryBTQiN0/JDZqt/S9RaWBWnMqw==", "cpu": [ "arm64" ], @@ -5578,9 +5548,9 @@ ] }, "node_modules/@rspack/binding-linux-arm64-musl": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/@rspack/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.4.2.tgz", - "integrity": "sha512-QybZ0VxlFih+upLoE7Le5cN3LpxJwk6EnEQTigmzpfc4c4SOC889ftBoIAO3IeBk+mF3H2C9xD+/NolTdwoeiw==", + "version": "1.3.15", + "resolved": "https://registry.npmjs.org/@rspack/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.3.15.tgz", + "integrity": "sha512-lJbBsPMOiR0hYPCSM42yp7QiZjfo0ALtX7ws2wURpsQp3BMfRVAmXU3Ixpo2XCRtG1zj8crHaCmAWOJTS0smsA==", "cpu": [ "arm64" ], @@ -5591,9 +5561,9 @@ ] }, "node_modules/@rspack/binding-linux-x64-gnu": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/@rspack/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.4.2.tgz", - "integrity": "sha512-ucCCWdtH1tekZadrsYj6GNJ8EP21BM2uSE7MootbwLw8aBtgVTKUuRDQEps1h/rtrdthzd9XBX6Lc2N926gM+g==", + "version": "1.3.15", + "resolved": "https://registry.npmjs.org/@rspack/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.3.15.tgz", + "integrity": "sha512-qGB8ucHklrzNg6lsAS36VrBsCbOw0acgpQNqTE5cuHWrp1Pu3GFTRiFEogenxEmzoRbohMZt0Ev5grivrcgKBQ==", "cpu": [ "x64" ], @@ -5604,9 +5574,9 @@ ] }, "node_modules/@rspack/binding-linux-x64-musl": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/@rspack/binding-linux-x64-musl/-/binding-linux-x64-musl-1.4.2.tgz", - "integrity": "sha512-+Y2LS6Qyk2AZor8DqlA8yKCqElYr0Urjc3M66O4ZzlxDT5xXX0J2vp04AtFp0g81q/+UgV3cbC//dqDvO0SiBA==", + "version": "1.3.15", + "resolved": "https://registry.npmjs.org/@rspack/binding-linux-x64-musl/-/binding-linux-x64-musl-1.3.15.tgz", + "integrity": "sha512-qRn6e40fLQP+N2rQD8GAj/h4DakeTIho32VxTIaHRVuzw68ZD7VmKkwn55ssN370ejmey35ZdoNFNE12RBrMZA==", "cpu": [ "x64" ], @@ -5616,23 +5586,10 @@ "linux" ] }, - "node_modules/@rspack/binding-wasm32-wasi": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/@rspack/binding-wasm32-wasi/-/binding-wasm32-wasi-1.4.2.tgz", - "integrity": "sha512-3WvfHY7NvzORek3FcQWLI/B8wQ7NZe0e0Bub9GyLNVxe5Bi+dxnSzEg6E7VsjbUzKnYufJA0hDKbEJ2qCMvpdw==", - "cpu": [ - "wasm32" - ], - "license": "MIT", - "optional": true, - "dependencies": { - "@napi-rs/wasm-runtime": "^0.2.11" - } - }, "node_modules/@rspack/binding-win32-arm64-msvc": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/@rspack/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.4.2.tgz", - "integrity": "sha512-Y6L9DrLFRW6qBBCY3xBt7townStN5mlcbBTuG1zeXl0KcORPv1G1Cq6HXP6f1em+YsHE1iwnNqLvv4svg5KsnQ==", + "version": "1.3.15", + "resolved": "https://registry.npmjs.org/@rspack/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.3.15.tgz", + "integrity": "sha512-7uJ7dWhO1nWXJiCss6Rslz8hoAxAhFpwpbWja3eHgRb7O4NPHg6MWw63AQSI2aFVakreenfu9yXQqYfpVWJ2dA==", "cpu": [ "arm64" ], @@ -5643,9 +5600,9 @@ ] }, "node_modules/@rspack/binding-win32-ia32-msvc": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/@rspack/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-1.4.2.tgz", - "integrity": "sha512-FyTJrL7GcYXPWKUB9Oj2X29kfma6MUgM9PyXGy8gDMti21kMMhpHp/bGVqfurRbazDyklDuLLtbHuawpa6toeA==", + "version": "1.3.15", + "resolved": "https://registry.npmjs.org/@rspack/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-1.3.15.tgz", + "integrity": "sha512-UsaWTYCjDiSCB0A0qETgZk4QvhwfG8gCrO4SJvA+QSEWOmgSai1YV70prFtLLIiyT9mDt1eU3tPWl1UWPRU/EQ==", "cpu": [ "ia32" ], @@ -5656,9 +5613,9 @@ ] }, "node_modules/@rspack/binding-win32-x64-msvc": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/@rspack/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.4.2.tgz", - "integrity": "sha512-ODSU26tmG8MfMFDHCaMLCORB64EVdEtDvPP5zJs0Mgh7vQaqweJtqgG0ukZCQy4ApUatOrMaZrLk557jp9Biyw==", + "version": "1.3.15", + "resolved": "https://registry.npmjs.org/@rspack/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.3.15.tgz", + "integrity": "sha512-ZnDIc9Es8EF94MirPDN+hOMt7tkb8nMEbRJFKLMmNd0ElNPgsql+1cY5SqyGRH1hsKB87KfSUQlhFiKZvzbfIg==", "cpu": [ "x64" ], @@ -5669,13 +5626,13 @@ ] }, "node_modules/@rspack/core": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/@rspack/core/-/core-1.4.2.tgz", - "integrity": "sha512-Mmk3X3fbOLtRq4jX8Ebp3rfjr75YgupvNksQb0WbaGEVr5l1b6woPH/LaXF2v9U9DP83wmpZJXJ8vclB5JfL/w==", + "version": "1.3.15", + "resolved": "https://registry.npmjs.org/@rspack/core/-/core-1.3.15.tgz", + "integrity": "sha512-QuElIC8jXSKWAp0LSx18pmbhA7NiA5HGoVYesmai90UVxz98tud0KpMxTVCg+0lrLrnKZfCWN9kwjCxM5pGnrA==", "license": "MIT", "dependencies": { - "@module-federation/runtime-tools": "0.15.0", - "@rspack/binding": "1.4.2", + "@module-federation/runtime-tools": "0.14.3", + "@rspack/binding": "1.3.15", "@rspack/lite-tapable": "1.0.1" }, "engines": { @@ -6007,14 +5964,14 @@ } }, "node_modules/@swc/core": { - "version": "1.12.9", - "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.12.9.tgz", - "integrity": "sha512-O+LfT2JlVMsIMWG9x+rdxg8GzpzeGtCZQfXV7cKc1PjIKUkLFf1QJ7okuseA4f/9vncu37dQ2ZcRrPKy0Ndd5g==", + "version": "1.11.21", + "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.11.21.tgz", + "integrity": "sha512-/Y3BJLcwd40pExmdar8MH2UGGvCBrqNN7hauOMckrEX2Ivcbv3IMhrbGX4od1dnF880Ed8y/E9aStZCIQi0EGw==", "hasInstallScript": true, "license": "Apache-2.0", "dependencies": { "@swc/counter": "^0.1.3", - "@swc/types": "^0.1.23" + "@swc/types": "^0.1.21" }, "engines": { "node": ">=10" @@ -6024,16 +5981,16 @@ "url": "https://opencollective.com/swc" }, "optionalDependencies": { - "@swc/core-darwin-arm64": "1.12.9", - "@swc/core-darwin-x64": "1.12.9", - "@swc/core-linux-arm-gnueabihf": "1.12.9", - "@swc/core-linux-arm64-gnu": "1.12.9", - "@swc/core-linux-arm64-musl": "1.12.9", - "@swc/core-linux-x64-gnu": "1.12.9", - "@swc/core-linux-x64-musl": "1.12.9", - "@swc/core-win32-arm64-msvc": "1.12.9", - "@swc/core-win32-ia32-msvc": "1.12.9", - "@swc/core-win32-x64-msvc": "1.12.9" + "@swc/core-darwin-arm64": "1.11.21", + "@swc/core-darwin-x64": "1.11.21", + "@swc/core-linux-arm-gnueabihf": "1.11.21", + "@swc/core-linux-arm64-gnu": "1.11.21", + "@swc/core-linux-arm64-musl": "1.11.21", + "@swc/core-linux-x64-gnu": "1.11.21", + "@swc/core-linux-x64-musl": "1.11.21", + "@swc/core-win32-arm64-msvc": "1.11.21", + "@swc/core-win32-ia32-msvc": "1.11.21", + "@swc/core-win32-x64-msvc": "1.11.21" }, "peerDependencies": { "@swc/helpers": ">=0.5.17" @@ -6045,9 +6002,9 @@ } }, "node_modules/@swc/core-darwin-arm64": { - "version": "1.12.9", - "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.12.9.tgz", - "integrity": "sha512-GACFEp4nD6V+TZNR2JwbMZRHB+Yyvp14FrcmB6UCUYmhuNWjkxi+CLnEvdbuiKyQYv0zA+TRpCHZ+whEs6gwfA==", + "version": "1.11.21", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.11.21.tgz", + "integrity": "sha512-v6gjw9YFWvKulCw3ZA1dY+LGMafYzJksm1mD4UZFZ9b36CyHFowYVYug1ajYRIRqEvvfIhHUNV660zTLoVFR8g==", "cpu": [ "arm64" ], @@ -6061,9 +6018,9 @@ } }, "node_modules/@swc/core-darwin-x64": { - "version": "1.12.9", - "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.12.9.tgz", - "integrity": "sha512-hv2kls7Ilkm2EpeJz+I9MCil7pGS3z55ZAgZfxklEuYsxpICycxeH+RNRv4EraggN44ms+FWCjtZFu0LGg2V3g==", + "version": "1.11.21", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.11.21.tgz", + "integrity": "sha512-CUiTiqKlzskwswrx9Ve5NhNoab30L1/ScOfQwr1duvNlFvarC8fvQSgdtpw2Zh3MfnfNPpyLZnYg7ah4kbT9JQ==", "cpu": [ "x64" ], @@ -6077,9 +6034,9 @@ } }, "node_modules/@swc/core-linux-arm-gnueabihf": { - "version": "1.12.9", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.12.9.tgz", - "integrity": "sha512-od9tDPiG+wMU9wKtd6y3nYJdNqgDOyLdgRRcrj1/hrbHoUPOM8wZQZdwQYGarw63iLXGgsw7t5HAF9Yc51ilFA==", + "version": "1.11.21", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.11.21.tgz", + "integrity": "sha512-YyBTAFM/QPqt1PscD8hDmCLnqPGKmUZpqeE25HXY8OLjl2MUs8+O4KjwPZZ+OGxpdTbwuWFyMoxjcLy80JODvg==", "cpu": [ "arm" ], @@ -6093,9 +6050,9 @@ } }, "node_modules/@swc/core-linux-arm64-gnu": { - "version": "1.12.9", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.12.9.tgz", - "integrity": "sha512-6qx1ka9LHcLzxIgn2Mros+CZLkHK2TawlXzi/h7DJeNnzi8F1Hw0Yzjp8WimxNCg6s2n+o3jnmin1oXB7gg8rw==", + "version": "1.11.21", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.11.21.tgz", + "integrity": "sha512-DQD+ooJmwpNsh4acrftdkuwl5LNxxg8U4+C/RJNDd7m5FP9Wo4c0URi5U0a9Vk/6sQNh9aSGcYChDpqCDWEcBw==", "cpu": [ "arm64" ], @@ -6109,9 +6066,9 @@ } }, "node_modules/@swc/core-linux-arm64-musl": { - "version": "1.12.9", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.12.9.tgz", - "integrity": "sha512-yghFZWKPVVGbUdqiD7ft23G0JX6YFGDJPz9YbLLAwGuKZ9th3/jlWoQDAw1Naci31LQhVC+oIji6ozihSuwB2A==", + "version": "1.11.21", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.11.21.tgz", + "integrity": "sha512-y1L49+snt1a1gLTYPY641slqy55QotPdtRK9Y6jMi4JBQyZwxC8swWYlQWb+MyILwxA614fi62SCNZNznB3XSA==", "cpu": [ "arm64" ], @@ -6125,9 +6082,9 @@ } }, "node_modules/@swc/core-linux-x64-gnu": { - "version": "1.12.9", - "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.12.9.tgz", - "integrity": "sha512-SFUxyhWLZRNL8QmgGNqdi2Q43PNyFVkRZ2zIif30SOGFSxnxcf2JNeSeBgKIGVgaLSuk6xFVVCtJ3KIeaStgRg==", + "version": "1.11.21", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.11.21.tgz", + "integrity": "sha512-NesdBXv4CvVEaFUlqKj+GA4jJMNUzK2NtKOrUNEtTbXaVyNiXjFCSaDajMTedEB0jTAd9ybB0aBvwhgkJUWkWA==", "cpu": [ "x64" ], @@ -6141,9 +6098,9 @@ } }, "node_modules/@swc/core-linux-x64-musl": { - "version": "1.12.9", - "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.12.9.tgz", - "integrity": "sha512-9FB0wM+6idCGTI20YsBNBg9xSWtkDBymnpaTCsZM3qDc0l4uOpJMqbfWhQvp17x7r/ulZfb2QY8RDvQmCL6AcQ==", + "version": "1.11.21", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.11.21.tgz", + "integrity": "sha512-qFV60pwpKVOdmX67wqQzgtSrUGWX9Cibnp1CXyqZ9Mmt8UyYGvmGu7p6PMbTyX7vdpVUvWVRf8DzrW2//wmVHg==", "cpu": [ "x64" ], @@ -6157,9 +6114,9 @@ } }, "node_modules/@swc/core-win32-arm64-msvc": { - "version": "1.12.9", - "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.12.9.tgz", - "integrity": "sha512-zHOusMVbOH9ik5RtRrMiGzLpKwxrPXgXkBm3SbUCa65HAdjV33NZ0/R9Rv1uPESALtEl2tzMYLUxYA5ECFDFhA==", + "version": "1.11.21", + "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.11.21.tgz", + "integrity": "sha512-DJJe9k6gXR/15ZZVLv1SKhXkFst8lYCeZRNHH99SlBodvu4slhh/MKQ6YCixINRhCwliHrpXPym8/5fOq8b7Ig==", "cpu": [ "arm64" ], @@ -6173,9 +6130,9 @@ } }, "node_modules/@swc/core-win32-ia32-msvc": { - "version": "1.12.9", - "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.12.9.tgz", - "integrity": "sha512-aWZf0PqE0ot7tCuhAjRkDFf41AzzSQO0x2xRfTbnhpROp57BRJ/N5eee1VULO/UA2PIJRG7GKQky5bSGBYlFug==", + "version": "1.11.21", + "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.11.21.tgz", + "integrity": "sha512-TqEXuy6wedId7bMwLIr9byds+mKsaXVHctTN88R1UIBPwJA92Pdk0uxDgip0pEFzHB/ugU27g6d8cwUH3h2eIw==", "cpu": [ "ia32" ], @@ -6189,9 +6146,9 @@ } }, "node_modules/@swc/core-win32-x64-msvc": { - "version": "1.12.9", - "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.12.9.tgz", - "integrity": "sha512-C25fYftXOras3P3anSUeXXIpxmEkdAcsIL9yrr0j1xepTZ/yKwpnQ6g3coj8UXdeJy4GTVlR6+Ow/QiBgZQNOg==", + "version": "1.11.21", + "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.11.21.tgz", + "integrity": "sha512-BT9BNNbMxdpUM1PPAkYtviaV0A8QcXttjs2MDtOeSqqvSJaPtyM+Fof2/+xSwQDmDEFzbGCcn75M5+xy3lGqpA==", "cpu": [ "x64" ], @@ -6211,9 +6168,9 @@ "license": "Apache-2.0" }, "node_modules/@swc/html": { - "version": "1.12.9", - "resolved": "https://registry.npmjs.org/@swc/html/-/html-1.12.9.tgz", - "integrity": "sha512-DYG65Xls3mt5DRavmYozp7lHIjB/k9JnFMo4OHl4JieRY4NdPIglEfVYCIeRhTHGX6ruFTwj0zcUZkaOsv7OZA==", + "version": "1.11.21", + "resolved": "https://registry.npmjs.org/@swc/html/-/html-1.11.21.tgz", + "integrity": "sha512-hW8Dk1jlLfngjMIz9uNVlEwPbMZd1GUYq0Lq19D8pAt6FYWwdB/pB93z1Kh/Z2RA9c+GXNYfuoq8UbEOgTMRMg==", "license": "Apache-2.0", "dependencies": { "@swc/counter": "^0.1.3" @@ -6222,22 +6179,22 @@ "node": ">=14" }, "optionalDependencies": { - "@swc/html-darwin-arm64": "1.12.9", - "@swc/html-darwin-x64": "1.12.9", - "@swc/html-linux-arm-gnueabihf": "1.12.9", - "@swc/html-linux-arm64-gnu": "1.12.9", - "@swc/html-linux-arm64-musl": "1.12.9", - "@swc/html-linux-x64-gnu": "1.12.9", - "@swc/html-linux-x64-musl": "1.12.9", - "@swc/html-win32-arm64-msvc": "1.12.9", - "@swc/html-win32-ia32-msvc": "1.12.9", - "@swc/html-win32-x64-msvc": "1.12.9" + "@swc/html-darwin-arm64": "1.11.21", + "@swc/html-darwin-x64": "1.11.21", + "@swc/html-linux-arm-gnueabihf": "1.11.21", + "@swc/html-linux-arm64-gnu": "1.11.21", + "@swc/html-linux-arm64-musl": "1.11.21", + "@swc/html-linux-x64-gnu": "1.11.21", + "@swc/html-linux-x64-musl": "1.11.21", + "@swc/html-win32-arm64-msvc": "1.11.21", + "@swc/html-win32-ia32-msvc": "1.11.21", + "@swc/html-win32-x64-msvc": "1.11.21" } }, "node_modules/@swc/html-darwin-arm64": { - "version": "1.12.9", - "resolved": "https://registry.npmjs.org/@swc/html-darwin-arm64/-/html-darwin-arm64-1.12.9.tgz", - "integrity": "sha512-uQl0y9uOgqnYR6t+TgcwFeGv1TC48xHGBqw3MrOIQLc+tqavqhQsLkVEEz1yd1J0WW3cVAsNSQlbERiwQcXQXA==", + "version": "1.11.21", + "resolved": "https://registry.npmjs.org/@swc/html-darwin-arm64/-/html-darwin-arm64-1.11.21.tgz", + "integrity": "sha512-b4RwP927+h1rtIxpgXBoENsQ+xuVKvHyt2jxWnzfptARMcU11bGLpop5PzF2OEz4ikt1yXWyiEWEh9HOLLslNw==", "cpu": [ "arm64" ], @@ -6251,9 +6208,9 @@ } }, "node_modules/@swc/html-darwin-x64": { - "version": "1.12.9", - "resolved": "https://registry.npmjs.org/@swc/html-darwin-x64/-/html-darwin-x64-1.12.9.tgz", - "integrity": "sha512-x3wc8vJq7pYGbLhU7FP8xz2w0yb2vdxFh1Z2ngHqSq5tODN/Gsj8NrFFNHtAiu6QD8lyPCMQagREGlwiedOk9A==", + "version": "1.11.21", + "resolved": "https://registry.npmjs.org/@swc/html-darwin-x64/-/html-darwin-x64-1.11.21.tgz", + "integrity": "sha512-NHHM0fZxQQgv5eFAnJdyLoqhMGVAjq9Q5faSGPAz5nAEVx1ki3KhFM5ZDt8kyDkTjQ50Mv19dJKDCSWdkGTGJg==", "cpu": [ "x64" ], @@ -6267,9 +6224,9 @@ } }, "node_modules/@swc/html-linux-arm-gnueabihf": { - "version": "1.12.9", - "resolved": "https://registry.npmjs.org/@swc/html-linux-arm-gnueabihf/-/html-linux-arm-gnueabihf-1.12.9.tgz", - "integrity": "sha512-qdgVLywK5zjjBzZ3FiIQdkSc20Xe9Mi7FhgPwpaBELT8xrpJiHKM72omXHBkkziyOMXszU0ycV3mVK+RarQ8PA==", + "version": "1.11.21", + "resolved": "https://registry.npmjs.org/@swc/html-linux-arm-gnueabihf/-/html-linux-arm-gnueabihf-1.11.21.tgz", + "integrity": "sha512-bbnB2ZjeGWzh9LHHTjg3mSg+L9XC6tB9OXgIcXlzqeWdfvJqq8mMLRd03Rj2LXHfcvHEAbz/ZNQFdvNvZ8HmQg==", "cpu": [ "arm" ], @@ -6283,9 +6240,9 @@ } }, "node_modules/@swc/html-linux-arm64-gnu": { - "version": "1.12.9", - "resolved": "https://registry.npmjs.org/@swc/html-linux-arm64-gnu/-/html-linux-arm64-gnu-1.12.9.tgz", - "integrity": "sha512-xX/S0galaqXMNc1olt1UOMcHXybDYGogGP90WheI6XD5zKVmbHdz9yU/nVeddZNUf5gZ011NCc5QSMB+2fh8EA==", + "version": "1.11.21", + "resolved": "https://registry.npmjs.org/@swc/html-linux-arm64-gnu/-/html-linux-arm64-gnu-1.11.21.tgz", + "integrity": "sha512-Dpv/zP3bLi8Ffvz/97B2chlK2akS9fqN4YP/Jf9ahjB1IgbQtD9Abr5ByCt8Y+8GQXKdc05gsU9nApKNVoerTw==", "cpu": [ "arm64" ], @@ -6299,9 +6256,9 @@ } }, "node_modules/@swc/html-linux-arm64-musl": { - "version": "1.12.9", - "resolved": "https://registry.npmjs.org/@swc/html-linux-arm64-musl/-/html-linux-arm64-musl-1.12.9.tgz", - "integrity": "sha512-wmVFGW/lb646NZgeHdo6LhO+qeUgR55LFDvw0pT8WUGpl+PlOk4ZFhXfStbQ3X1u2daJDcy9GmaYz+3jeHem5g==", + "version": "1.11.21", + "resolved": "https://registry.npmjs.org/@swc/html-linux-arm64-musl/-/html-linux-arm64-musl-1.11.21.tgz", + "integrity": "sha512-qnnBkScssiZrohrtLeyk3YRy7JA0AB2+5CrtyWk1IhyS+q8nyVMKQlEJE/1g2LBVAQZDTXR6h9udlEKnX5sL2A==", "cpu": [ "arm64" ], @@ -6315,9 +6272,9 @@ } }, "node_modules/@swc/html-linux-x64-gnu": { - "version": "1.12.9", - "resolved": "https://registry.npmjs.org/@swc/html-linux-x64-gnu/-/html-linux-x64-gnu-1.12.9.tgz", - "integrity": "sha512-9tRAsVsjjyEUFMH5uNrcLxb+5q0l2PCgTH7pe48hjcshKFoZamp1aiwvNnJMMBan3Ny9vFG5jKMJKG3ZkYPYxg==", + "version": "1.11.21", + "resolved": "https://registry.npmjs.org/@swc/html-linux-x64-gnu/-/html-linux-x64-gnu-1.11.21.tgz", + "integrity": "sha512-+5LH2ChaWG/EA9/Jq6yflwizulo6pU7+5N4v5rYAOBIyGJPcyN/mQQlmOw2Kc4PWC1ASBNU/GWLoKGp+EuC04g==", "cpu": [ "x64" ], @@ -6331,9 +6288,9 @@ } }, "node_modules/@swc/html-linux-x64-musl": { - "version": "1.12.9", - "resolved": "https://registry.npmjs.org/@swc/html-linux-x64-musl/-/html-linux-x64-musl-1.12.9.tgz", - "integrity": "sha512-hfjCQBQr6e9Cp+qKKX8kHhR9oYUOpA5u99VF6GgkiaX81ai5PB+eSFh3TpRE7fiG13ykT/fXrzs79M43WbqXRw==", + "version": "1.11.21", + "resolved": "https://registry.npmjs.org/@swc/html-linux-x64-musl/-/html-linux-x64-musl-1.11.21.tgz", + "integrity": "sha512-gMtXkPwh9kjnTsykbD+4K6LajZNmhCadXEPtJHMmx1iNxovSHmKdYkX1t8HYtysB6QD+uQdmA3wPh2LBVHoKoA==", "cpu": [ "x64" ], @@ -6347,9 +6304,9 @@ } }, "node_modules/@swc/html-win32-arm64-msvc": { - "version": "1.12.9", - "resolved": "https://registry.npmjs.org/@swc/html-win32-arm64-msvc/-/html-win32-arm64-msvc-1.12.9.tgz", - "integrity": "sha512-PdIwxR4FY75ISjCC4+GAoH7d8KrL+MpbhZNB8n0B5ozOTEcY1y9AJ/eP0yNyWD3cDqIbIPpkHkjT4mfp9LcYuQ==", + "version": "1.11.21", + "resolved": "https://registry.npmjs.org/@swc/html-win32-arm64-msvc/-/html-win32-arm64-msvc-1.11.21.tgz", + "integrity": "sha512-SiFBEhAPI/bSTEm6vJO9EawTLaCCiGsVR2PWM8x1fU4fZlf97JKOJr5W2lwCFSG0r2jO+HAr1IZB0SaF58ierg==", "cpu": [ "arm64" ], @@ -6363,9 +6320,9 @@ } }, "node_modules/@swc/html-win32-ia32-msvc": { - "version": "1.12.9", - "resolved": "https://registry.npmjs.org/@swc/html-win32-ia32-msvc/-/html-win32-ia32-msvc-1.12.9.tgz", - "integrity": "sha512-5rukRP+8I/lXy0K5C9OZbaVrRbj76Vssk59CY2wEh3gvylHavBrOOPflGyxIMNsVkNKMxFoDiwEQEOE7Yu42gw==", + "version": "1.11.21", + "resolved": "https://registry.npmjs.org/@swc/html-win32-ia32-msvc/-/html-win32-ia32-msvc-1.11.21.tgz", + "integrity": "sha512-ke3z9lEp9JqFT906SkU1ap8aE8BYrCxGDULYqqYPjsD0cov/Je4H/qwXkTJ9VkD9RENljKwoisAXfCuBeIoxvQ==", "cpu": [ "ia32" ], @@ -6379,9 +6336,9 @@ } }, "node_modules/@swc/html-win32-x64-msvc": { - "version": "1.12.9", - "resolved": "https://registry.npmjs.org/@swc/html-win32-x64-msvc/-/html-win32-x64-msvc-1.12.9.tgz", - "integrity": "sha512-E5djH4JodyJC6w17pVzsfCLB0y8YcVYd1MjmIBKXhl5FVvBVC54EUvA57cQ6faes31Eeg8qV0DSfo5iH0LODwg==", + "version": "1.11.21", + "resolved": "https://registry.npmjs.org/@swc/html-win32-x64-msvc/-/html-win32-x64-msvc-1.11.21.tgz", + "integrity": "sha512-UBzKWLt2hQpYPnq5o5tPGwtNVE18jUdCt4Wm59e00JBZgP2IMRO3/BYzmvYmGfNbKzDUGWDeSWpe+MRt9gPPVA==", "cpu": [ "x64" ], @@ -6395,9 +6352,9 @@ } }, "node_modules/@swc/types": { - "version": "0.1.23", - "resolved": "https://registry.npmjs.org/@swc/types/-/types-0.1.23.tgz", - "integrity": "sha512-u1iIVZV9Q0jxY+yM2vw/hZGDNudsN85bBpTqzAQ9rzkxW9D+e3aEM4Han+ow518gSewkXgjmEK0BD79ZcNVgPw==", + "version": "0.1.21", + "resolved": "https://registry.npmjs.org/@swc/types/-/types-0.1.21.tgz", + "integrity": "sha512-2YEtj5HJVbKivud9N4bpPBAyZhj4S2Ipe5LkUG94alTpr7in/GU/EARgPAd3BwU+YOmFVJC2+kjqhGRi3r0ZpQ==", "license": "Apache-2.0", "dependencies": { "@swc/counter": "^0.1.3" @@ -6500,20 +6457,10 @@ "node": ">=10.13.0" } }, - "node_modules/@tybys/wasm-util": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.9.0.tgz", - "integrity": "sha512-6+7nlbMVX/PVDCwaIQ8nTOPveOcFLSt8GcXdx8hD0bt39uWxYT88uXzqTd4fTvqta7oeUJqudepapKNt2DYJFw==", - "license": "MIT", - "optional": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, "node_modules/@types/body-parser": { - "version": "1.19.6", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.6.tgz", - "integrity": "sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==", + "version": "1.19.5", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz", + "integrity": "sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==", "license": "MIT", "dependencies": { "@types/connect": "*", @@ -6578,9 +6525,9 @@ } }, "node_modules/@types/estree": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", - "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.7.tgz", + "integrity": "sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==", "license": "MIT" }, "node_modules/@types/estree-jsx": { @@ -6593,9 +6540,9 @@ } }, "node_modules/@types/express": { - "version": "4.17.23", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.23.tgz", - "integrity": "sha512-Crp6WY9aTYP3qPi2wGDo9iUe/rceX01UMhnF1jmwDcKCFM6cx7YhGP/Mpr3y9AASpfHixIG0E6azCcL5OcDHsQ==", + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz", + "integrity": "sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==", "license": "MIT", "dependencies": { "@types/body-parser": "*", @@ -6662,9 +6609,9 @@ "license": "MIT" }, "node_modules/@types/http-errors": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.5.tgz", - "integrity": "sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz", + "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==", "license": "MIT" }, "node_modules/@types/http-proxy": { @@ -6734,12 +6681,12 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "24.0.10", - "resolved": "https://registry.npmjs.org/@types/node/-/node-24.0.10.tgz", - "integrity": "sha512-ENHwaH+JIRTDIEEbDK6QSQntAYGtbvdDXnMXnZaZ6k13Du1dPMmprkEHIL7ok2Wl2aZevetwTAb5S+7yIF+enA==", + "version": "22.14.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.14.1.tgz", + "integrity": "sha512-u0HuPQwe/dHrItgHHpmw3N2fYCR6x4ivMNbPHRkBVP4CvN+kiRrKHWk3i8tXiO/joPwXLMYvF9TTF0eqgHIuOw==", "license": "MIT", "dependencies": { - "undici-types": "~7.8.0" + "undici-types": "~6.21.0" } }, "node_modules/@types/node-forge": { @@ -6764,15 +6711,15 @@ "license": "MIT" }, "node_modules/@types/prop-types": { - "version": "15.7.15", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.15.tgz", - "integrity": "sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==", + "version": "15.7.14", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.14.tgz", + "integrity": "sha512-gNMvNH49DJ7OJYv+KAKn0Xp45p8PLl6zo2YnvDIbTd4J6MER2BmWN49TG7n9LvkyihINxeKW8+3bfS2yDC9dzQ==", "license": "MIT" }, "node_modules/@types/qs": { - "version": "6.14.0", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.14.0.tgz", - "integrity": "sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ==", + "version": "6.9.18", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.18.tgz", + "integrity": "sha512-kK7dgTYDyGqS+e2Q4aK9X3D7q234CIZ1Bv0q/7Z5IwRDoADNU81xXJK/YVyLbLTZCoIwUoDoffFeF+p/eIklAA==", "license": "MIT" }, "node_modules/@types/range-parser": { @@ -6782,9 +6729,9 @@ "license": "MIT" }, "node_modules/@types/react": { - "version": "18.3.23", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.23.tgz", - "integrity": "sha512-/LDXMQh55EzZQ0uVAZmKKhfENivEvWz6E+EYzh+/MCjMhNsotd+ZHhBGIjFDTi6+fz0OhQQQLbTgdQIxxCsC0w==", + "version": "18.3.20", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.20.tgz", + "integrity": "sha512-IPaCZN7PShZK/3t6Q87pfTkRm6oLTd4vztyoj+cbHUF1g3FfVb2tFIL79uCRKEfv16AhqDMBywP2VW3KIZUvcg==", "license": "MIT", "dependencies": { "@types/prop-types": "*", @@ -6848,9 +6795,9 @@ } }, "node_modules/@types/send": { - "version": "0.17.5", - "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.5.tgz", - "integrity": "sha512-z6F2D3cOStZvuk2SaP6YrwkNO65iTZcwA2ZkSABegdkAh/lf+Aa/YQndZVfmEXT5vgAp6zv06VQ3ejSVjAny4w==", + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz", + "integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==", "license": "MIT", "dependencies": { "@types/mime": "^1", @@ -6867,9 +6814,9 @@ } }, "node_modules/@types/serve-static": { - "version": "1.15.8", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.8.tgz", - "integrity": "sha512-roei0UY3LhpOJvjbIP6ZZFngyLKl5dskOtDhxY5THRSpO+ZI+nzJ+m5yUMzGrp89YRa7lvknKkMYjqQFGwA7Sg==", + "version": "1.15.7", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.7.tgz", + "integrity": "sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==", "license": "MIT", "dependencies": { "@types/http-errors": "*", @@ -7124,9 +7071,9 @@ } }, "node_modules/acorn": { - "version": "8.15.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", - "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", + "version": "8.14.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.1.tgz", + "integrity": "sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==", "license": "MIT", "bin": { "acorn": "bin/acorn" @@ -7224,24 +7171,24 @@ } }, "node_modules/algoliasearch": { - "version": "5.30.0", - "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-5.30.0.tgz", - "integrity": "sha512-ILSdPX4je0n5WUKD34TMe57/eqiXUzCIjAsdtLQYhomqOjTtFUg1s6dE7kUegc4Mc43Xr7IXYlMutU9HPiYfdw==", - "license": "MIT", - "dependencies": { - "@algolia/client-abtesting": "5.30.0", - "@algolia/client-analytics": "5.30.0", - "@algolia/client-common": "5.30.0", - "@algolia/client-insights": "5.30.0", - "@algolia/client-personalization": "5.30.0", - "@algolia/client-query-suggestions": "5.30.0", - "@algolia/client-search": "5.30.0", - "@algolia/ingestion": "1.30.0", - "@algolia/monitoring": "1.30.0", - "@algolia/recommend": "5.30.0", - "@algolia/requester-browser-xhr": "5.30.0", - "@algolia/requester-fetch": "5.30.0", - "@algolia/requester-node-http": "5.30.0" + "version": "5.29.0", + "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-5.29.0.tgz", + "integrity": "sha512-E2l6AlTWGznM2e7vEE6T6hzObvEyXukxMOlBmVlMyixZyK1umuO/CiVc6sDBbzVH0oEviCE5IfVY1oZBmccYPQ==", + "license": "MIT", + "dependencies": { + "@algolia/client-abtesting": "5.29.0", + "@algolia/client-analytics": "5.29.0", + "@algolia/client-common": "5.29.0", + "@algolia/client-insights": "5.29.0", + "@algolia/client-personalization": "5.29.0", + "@algolia/client-query-suggestions": "5.29.0", + "@algolia/client-search": "5.29.0", + "@algolia/ingestion": "1.29.0", + "@algolia/monitoring": "1.29.0", + "@algolia/recommend": "5.29.0", + "@algolia/requester-browser-xhr": "5.29.0", + "@algolia/requester-fetch": "5.29.0", + "@algolia/requester-node-http": "5.29.0" }, "engines": { "node": ">= 14.0.0" @@ -7382,18 +7329,6 @@ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "license": "Python-2.0" }, - "node_modules/aria-hidden": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.6.tgz", - "integrity": "sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA==", - "license": "MIT", - "dependencies": { - "tslib": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/array-flatten": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", @@ -7522,13 +7457,13 @@ } }, "node_modules/babel-plugin-polyfill-corejs2": { - "version": "0.4.14", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.14.tgz", - "integrity": "sha512-Co2Y9wX854ts6U8gAAPXfn0GmAyctHuK8n0Yhfjd6t30g7yvKjspvvOo9yG+z52PZRgFErt7Ka2pYnXCjLKEpg==", + "version": "0.4.13", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.13.tgz", + "integrity": "sha512-3sX/eOms8kd3q2KZ6DAhKPc0dgm525Gqq5NtWKZ7QYYZEv57OQ54KtblzJzH1lQF/eQxO8KjWGIK9IPUJNus5g==", "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.27.7", - "@babel/helper-define-polyfill-provider": "^0.6.5", + "@babel/compat-data": "^7.22.6", + "@babel/helper-define-polyfill-provider": "^0.6.4", "semver": "^6.3.1" }, "peerDependencies": { @@ -7545,25 +7480,25 @@ } }, "node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.13.0.tgz", - "integrity": "sha512-U+GNwMdSFgzVmfhNm8GJUX88AadB3uo9KpJqS3FaqNIPKgySuvMb+bHPsOmmuWyIcuqZj/pzt1RUIUZns4y2+A==", + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.11.1.tgz", + "integrity": "sha512-yGCqvBT4rwMczo28xkH/noxJ6MZ4nJfkVYdoDaC/utLtWrXxv27HVrzAeSbqR8SxDsp46n0YF47EbHoixy6rXQ==", "license": "MIT", "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.6.5", - "core-js-compat": "^3.43.0" + "@babel/helper-define-polyfill-provider": "^0.6.3", + "core-js-compat": "^3.40.0" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, "node_modules/babel-plugin-polyfill-regenerator": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.5.tgz", - "integrity": "sha512-ISqQ2frbiNU9vIJkzg7dlPpznPZ4jOiUQ1uSmB0fEHeowtN3COYRsXr/xexn64NpU13P06jc/L5TgiJXOgrbEg==", + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.4.tgz", + "integrity": "sha512-7gD3pRadPrbjhjLyxebmx/WrFYcuSjZ0XbdUujQMZ/fcE9oeewk2U/7PCvez84UeuK3oSjmPZ0Ch0dlupQvGzw==", "license": "MIT", "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.6.5" + "@babel/helper-define-polyfill-provider": "^0.6.4" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" @@ -7721,9 +7656,9 @@ } }, "node_modules/browserslist": { - "version": "4.25.1", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.25.1.tgz", - "integrity": "sha512-KGj0KoOMXLpSNkkEI6Z6mShmQy0bc1I+T7K9N81k4WWMrfz+6fQ6es80B/YLAeRoKvjYE1YSHHOW1qe9xIVzHw==", + "version": "4.25.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.25.0.tgz", + "integrity": "sha512-PJ8gYKeS5e/whHBh8xrwYK+dAvEj7JXtz6uTucnMRB8OiGTsKccFekoRrjajPBHV8oOY+2tI4uxeceSimKwMFA==", "funding": [ { "type": "opencollective", @@ -7740,8 +7675,8 @@ ], "license": "MIT", "dependencies": { - "caniuse-lite": "^1.0.30001726", - "electron-to-chromium": "^1.5.173", + "caniuse-lite": "^1.0.30001718", + "electron-to-chromium": "^1.5.160", "node-releases": "^2.0.19", "update-browserslist-db": "^1.1.3" }, @@ -7894,9 +7829,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001726", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001726.tgz", - "integrity": "sha512-VQAUIUzBiZ/UnlM28fSp2CRF3ivUn1BWEvxMcVTNwpw91Py1pGbPIyIKtd+tzct9C3ouceCVdGAXxZOpZAsgdw==", + "version": "1.0.30001723", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001723.tgz", + "integrity": "sha512-1R/elMjtehrFejxwmexeXAtae5UO9iSyFn6G/I806CYC/BLyyBk1EPhrKBkWhy6wM6Xnm47dSJQec+tLJ39WHw==", "funding": [ { "type": "opencollective", @@ -8339,12 +8274,6 @@ "proto-list": "~1.2.1" } }, - "node_modules/config-chain/node_modules/ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "license": "ISC" - }, "node_modules/configstore": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/configstore/-/configstore-6.0.0.tgz", @@ -8501,9 +8430,9 @@ } }, "node_modules/core-js": { - "version": "3.43.0", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.43.0.tgz", - "integrity": "sha512-N6wEbTTZSYOY2rYAn85CuvWWkCK6QweMn7/4Nr3w+gDBeBhk/x4EJeY6FPo4QzDoJZxVTv8U7CMvgWk6pOHHqA==", + "version": "3.41.0", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.41.0.tgz", + "integrity": "sha512-SJ4/EHwS36QMJd6h/Rg+GyR4A5xE0FSI3eZ+iBVpfqf1x0eTSg1smWLHrA+2jQThZSh97fmSgFSU8B61nxosxA==", "hasInstallScript": true, "license": "MIT", "funding": { @@ -8822,9 +8751,9 @@ } }, "node_modules/css-select": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.2.2.tgz", - "integrity": "sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", + "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", "license": "BSD-2-Clause", "dependencies": { "boolbase": "^1.0.0", @@ -8851,9 +8780,9 @@ } }, "node_modules/css-what": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.2.2.tgz", - "integrity": "sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", "license": "BSD-2-Clause", "engines": { "node": ">= 6" @@ -8863,9 +8792,9 @@ } }, "node_modules/cssdb": { - "version": "8.3.1", - "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-8.3.1.tgz", - "integrity": "sha512-XnDRQMXucLueX92yDe0LPKupXetWoFOgawr4O4X41l5TltgK2NVbJJVDnnOywDYfW1sTJ28AcXGKOqdRKwCcmQ==", + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-8.3.0.tgz", + "integrity": "sha512-c7bmItIg38DgGjSwDPZOYF/2o0QU/sSgkWOMyl8votOfgFuyiFKWPesmCGEsrGLxEA9uL540cp8LdaGEjUGsZQ==", "funding": [ { "type": "opencollective", @@ -9033,9 +8962,9 @@ "license": "MIT" }, "node_modules/debug": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", - "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", "license": "MIT", "dependencies": { "ms": "^2.1.3" @@ -9050,9 +8979,9 @@ } }, "node_modules/decode-named-character-reference": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.2.0.tgz", - "integrity": "sha512-c6fcElNV6ShtZXmsgNgFFV5tVX2PaV4g+MOAkb8eXHvn6sryJBrZa9r0zV6+dtTyoCKxtDy5tyQ5ZwQuidtd+Q==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.1.0.tgz", + "integrity": "sha512-Wy+JTSbFThEOXQIR2L6mxJvEs+veIzpmqD7ynWxMXGpnk3smkHQOp6forLdHsKpAMW9iJpaBBIxz285t1n1C3w==", "license": "MIT", "dependencies": { "character-entities": "^2.0.0" @@ -9200,9 +9129,9 @@ } }, "node_modules/detect-libc": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.4.tgz", - "integrity": "sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz", + "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==", "license": "Apache-2.0", "engines": { "node": ">=8" @@ -9214,12 +9143,6 @@ "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", "license": "MIT" }, - "node_modules/detect-node-es": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz", - "integrity": "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==", - "license": "MIT" - }, "node_modules/detect-port": { "version": "1.6.1", "resolved": "https://registry.npmjs.org/detect-port/-/detect-port-1.6.1.tgz", @@ -9440,9 +9363,9 @@ "license": "MIT" }, "node_modules/electron-to-chromium": { - "version": "1.5.179", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.179.tgz", - "integrity": "sha512-UWKi/EbBopgfFsc5k61wFpV7WrnnSlSzW/e2XcBmS6qKYTivZlLtoll5/rdqRTxGglGHkmkW0j0pFNJG10EUIQ==", + "version": "1.5.170", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.170.tgz", + "integrity": "sha512-GP+M7aeluQo9uAyiTCxgIj/j+PrWhMlY7LFVj8prlsPljd0Fdg9AprlfUi+OCSFWy9Y5/2D/Jrj9HS8Z4rpKWA==", "license": "ISC" }, "node_modules/emoji-regex": { @@ -9486,9 +9409,9 @@ } }, "node_modules/enhanced-resolve": { - "version": "5.18.2", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.2.tgz", - "integrity": "sha512-6Jw4sE1maoRJo3q8MsSIn2onJFbLTOjY9hlx4DZXmOKvLRd1Ok2kXmAGXaafL2+ijsJZ1ClYbl/pmqr9+k4iUQ==", + "version": "5.18.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.1.tgz", + "integrity": "sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg==", "license": "MIT", "dependencies": { "graceful-fs": "^4.2.4", @@ -9538,9 +9461,9 @@ } }, "node_modules/es-module-lexer": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz", - "integrity": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.6.0.tgz", + "integrity": "sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ==", "license": "MIT" }, "node_modules/es-object-atoms": { @@ -9760,9 +9683,9 @@ } }, "node_modules/estree-util-value-to-estree": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/estree-util-value-to-estree/-/estree-util-value-to-estree-3.4.0.tgz", - "integrity": "sha512-Zlp+gxis+gCfK12d3Srl2PdX2ybsEA8ZYy6vQGVQTNNYLEGRQQ56XB64bjemN8kxIKXP1nC9ip4Z+ILy9LGzvQ==", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/estree-util-value-to-estree/-/estree-util-value-to-estree-3.3.3.tgz", + "integrity": "sha512-Db+m1WSD4+mUO7UgMeKkAwdbfNWwIxLt48XF2oFU9emPfXkIu+k5/nlOj313v7wqtAPo0f9REhUvznFrPkG8CQ==", "license": "MIT", "dependencies": { "@types/estree": "^1.0.0" @@ -10433,15 +10356,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/get-nonce": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/get-nonce/-/get-nonce-1.0.1.tgz", - "integrity": "sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "node_modules/get-own-enumerable-property-symbols": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz", @@ -10480,20 +10394,21 @@ "license": "ISC" }, "node_modules/glob": { - "version": "10.4.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", - "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", "license": "ISC", "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" }, - "bin": { - "glob": "dist/esm/bin.mjs" + "engines": { + "node": "*" }, "funding": { "url": "https://github.com/sponsors/isaacs" @@ -10517,30 +10432,6 @@ "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", "license": "BSD-2-Clause" }, - "node_modules/glob/node_modules/brace-expansion": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/glob/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/global-dirs": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.1.tgz", @@ -10556,6 +10447,24 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/global-dirs/node_modules/ini": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", + "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, "node_modules/globby": { "version": "11.1.0", "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", @@ -11170,9 +11079,9 @@ } }, "node_modules/http-cache-semantics": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz", - "integrity": "sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", + "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", "license": "BSD-2-Clause" }, "node_modules/http-deceiver": { @@ -11308,18 +11217,6 @@ "node": ">= 4" } }, - "node_modules/image-size": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/image-size/-/image-size-2.0.2.tgz", - "integrity": "sha512-IRqXKlaXwgSMAMtpNzZa1ZAe8m+Sa1770Dhk8VkSsP9LS+iHD62Zd8FQKs8fbPiagBE7BzoFX23cxFnwshpV6w==", - "license": "MIT", - "bin": { - "image-size": "bin/image-size.js" - }, - "engines": { - "node": ">=16.x" - } - }, "node_modules/import-fresh": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", @@ -11390,13 +11287,10 @@ "license": "ISC" }, "node_modules/ini": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", - "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", - "license": "ISC", - "engines": { - "node": ">=10" - } + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "license": "ISC" }, "node_modules/inline-style-parser": { "version": "0.2.4", @@ -11931,9 +11825,9 @@ } }, "node_modules/lightningcss": { - "version": "1.30.1", - "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.30.1.tgz", - "integrity": "sha512-xi6IyHML+c9+Q3W0S4fCQJOym42pyurFiJUHEcEyHS0CeKzia4yZDEsLlqOFykxOdHpNy0NmvVO31vcSqAxJCg==", + "version": "1.29.3", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.29.3.tgz", + "integrity": "sha512-GlOJwTIP6TMIlrTFsxTerwC0W6OpQpCGuX1ECRLBUVRh6fpJH3xTqjCjRgQHTb4ZXexH9rtHou1Lf03GKzmhhQ==", "license": "MPL-2.0", "dependencies": { "detect-libc": "^2.0.3" @@ -11946,22 +11840,22 @@ "url": "https://opencollective.com/parcel" }, "optionalDependencies": { - "lightningcss-darwin-arm64": "1.30.1", - "lightningcss-darwin-x64": "1.30.1", - "lightningcss-freebsd-x64": "1.30.1", - "lightningcss-linux-arm-gnueabihf": "1.30.1", - "lightningcss-linux-arm64-gnu": "1.30.1", - "lightningcss-linux-arm64-musl": "1.30.1", - "lightningcss-linux-x64-gnu": "1.30.1", - "lightningcss-linux-x64-musl": "1.30.1", - "lightningcss-win32-arm64-msvc": "1.30.1", - "lightningcss-win32-x64-msvc": "1.30.1" + "lightningcss-darwin-arm64": "1.29.3", + "lightningcss-darwin-x64": "1.29.3", + "lightningcss-freebsd-x64": "1.29.3", + "lightningcss-linux-arm-gnueabihf": "1.29.3", + "lightningcss-linux-arm64-gnu": "1.29.3", + "lightningcss-linux-arm64-musl": "1.29.3", + "lightningcss-linux-x64-gnu": "1.29.3", + "lightningcss-linux-x64-musl": "1.29.3", + "lightningcss-win32-arm64-msvc": "1.29.3", + "lightningcss-win32-x64-msvc": "1.29.3" } }, "node_modules/lightningcss-darwin-arm64": { - "version": "1.30.1", - "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.30.1.tgz", - "integrity": "sha512-c8JK7hyE65X1MHMN+Viq9n11RRC7hgin3HhYKhrMyaXflk5GVplZ60IxyoVtzILeKr+xAJwg6zK6sjTBJ0FKYQ==", + "version": "1.29.3", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.29.3.tgz", + "integrity": "sha512-fb7raKO3pXtlNbQbiMeEu8RbBVHnpyqAoxTyTRMEWFQWmscGC2wZxoHzZ+YKAepUuKT9uIW5vL2QbFivTgprZg==", "cpu": [ "arm64" ], @@ -11979,9 +11873,9 @@ } }, "node_modules/lightningcss-darwin-x64": { - "version": "1.30.1", - "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.30.1.tgz", - "integrity": "sha512-k1EvjakfumAQoTfcXUcHQZhSpLlkAuEkdMBsI/ivWw9hL+7FtilQc0Cy3hrx0AAQrVtQAbMI7YjCgYgvn37PzA==", + "version": "1.29.3", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.29.3.tgz", + "integrity": "sha512-KF2XZ4ZdmDGGtEYmx5wpzn6u8vg7AdBHaEOvDKu8GOs7xDL/vcU2vMKtTeNe1d4dogkDdi3B9zC77jkatWBwEQ==", "cpu": [ "x64" ], @@ -11999,9 +11893,9 @@ } }, "node_modules/lightningcss-freebsd-x64": { - "version": "1.30.1", - "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.30.1.tgz", - "integrity": "sha512-kmW6UGCGg2PcyUE59K5r0kWfKPAVy4SltVeut+umLCFoJ53RdCUWxcRDzO1eTaxf/7Q2H7LTquFHPL5R+Gjyig==", + "version": "1.29.3", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.29.3.tgz", + "integrity": "sha512-VUWeVf+V1UM54jv9M4wen9vMlIAyT69Krl9XjI8SsRxz4tdNV/7QEPlW6JASev/pYdiynUCW0pwaFquDRYdxMw==", "cpu": [ "x64" ], @@ -12019,9 +11913,9 @@ } }, "node_modules/lightningcss-linux-arm-gnueabihf": { - "version": "1.30.1", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.30.1.tgz", - "integrity": "sha512-MjxUShl1v8pit+6D/zSPq9S9dQ2NPFSQwGvxBCYaBYLPlCWuPh9/t1MRS8iUaR8i+a6w7aps+B4N0S1TYP/R+Q==", + "version": "1.29.3", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.29.3.tgz", + "integrity": "sha512-UhgZ/XVNfXQVEJrMIWeK1Laj8KbhjbIz7F4znUk7G4zeGw7TRoJxhb66uWrEsonn1+O45w//0i0Fu0wIovYdYg==", "cpu": [ "arm" ], @@ -12039,9 +11933,9 @@ } }, "node_modules/lightningcss-linux-arm64-gnu": { - "version": "1.30.1", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.30.1.tgz", - "integrity": "sha512-gB72maP8rmrKsnKYy8XUuXi/4OctJiuQjcuqWNlJQ6jZiWqtPvqFziskH3hnajfvKB27ynbVCucKSm2rkQp4Bw==", + "version": "1.29.3", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.29.3.tgz", + "integrity": "sha512-Pqau7jtgJNmQ/esugfmAT1aCFy/Gxc92FOxI+3n+LbMHBheBnk41xHDhc0HeYlx9G0xP5tK4t0Koy3QGGNqypw==", "cpu": [ "arm64" ], @@ -12059,9 +11953,9 @@ } }, "node_modules/lightningcss-linux-arm64-musl": { - "version": "1.30.1", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.30.1.tgz", - "integrity": "sha512-jmUQVx4331m6LIX+0wUhBbmMX7TCfjF5FoOH6SD1CttzuYlGNVpA7QnrmLxrsub43ClTINfGSYyHe2HWeLl5CQ==", + "version": "1.29.3", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.29.3.tgz", + "integrity": "sha512-dxakOk66pf7KLS7VRYFO7B8WOJLecE5OPL2YOk52eriFd/yeyxt2Km5H0BjLfElokIaR+qWi33gB8MQLrdAY3A==", "cpu": [ "arm64" ], @@ -12079,9 +11973,9 @@ } }, "node_modules/lightningcss-linux-x64-gnu": { - "version": "1.30.1", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.30.1.tgz", - "integrity": "sha512-piWx3z4wN8J8z3+O5kO74+yr6ze/dKmPnI7vLqfSqI8bccaTGY5xiSGVIJBDd5K5BHlvVLpUB3S2YCfelyJ1bw==", + "version": "1.29.3", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.29.3.tgz", + "integrity": "sha512-ySZTNCpbfbK8rqpKJeJR2S0g/8UqqV3QnzcuWvpI60LWxnFN91nxpSSwCbzfOXkzKfar9j5eOuOplf+klKtINg==", "cpu": [ "x64" ], @@ -12099,9 +11993,9 @@ } }, "node_modules/lightningcss-linux-x64-musl": { - "version": "1.30.1", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.30.1.tgz", - "integrity": "sha512-rRomAK7eIkL+tHY0YPxbc5Dra2gXlI63HL+v1Pdi1a3sC+tJTcFrHX+E86sulgAXeI7rSzDYhPSeHHjqFhqfeQ==", + "version": "1.29.3", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.29.3.tgz", + "integrity": "sha512-3pVZhIzW09nzi10usAXfIGTTSTYQ141dk88vGFNCgawIzayiIzZQxEcxVtIkdvlEq2YuFsL9Wcj/h61JHHzuFQ==", "cpu": [ "x64" ], @@ -12119,9 +12013,9 @@ } }, "node_modules/lightningcss-win32-arm64-msvc": { - "version": "1.30.1", - "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.30.1.tgz", - "integrity": "sha512-mSL4rqPi4iXq5YVqzSsJgMVFENoa4nGTT/GjO2c0Yl9OuQfPsIfncvLrEW6RbbB24WtZ3xP/2CCmI3tNkNV4oA==", + "version": "1.29.3", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.29.3.tgz", + "integrity": "sha512-VRnkAvtIkeWuoBJeGOTrZxsNp4HogXtcaaLm8agmbYtLDOhQdpgxW6NjZZjDXbvGF+eOehGulXZ3C1TiwHY4QQ==", "cpu": [ "arm64" ], @@ -12139,9 +12033,9 @@ } }, "node_modules/lightningcss-win32-x64-msvc": { - "version": "1.30.1", - "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.30.1.tgz", - "integrity": "sha512-PVqXh48wh4T53F/1CCu8PIPCxLzWyCnn/9T5W1Jpmdy5h9Cwd+0YQS6/LwhHXSafuc61/xg9Lv5OrCby6a++jg==", + "version": "1.29.3", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.29.3.tgz", + "integrity": "sha512-IszwRPu2cPnDQsZpd7/EAr0x2W7jkaWqQ1SwCVIZ/tSbZVXPLt6k8s6FkcyBjViCzvB5CW0We0QbbP7zp2aBjQ==", "cpu": [ "x64" ], @@ -14858,9 +14752,9 @@ } }, "node_modules/normalize-url": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-8.0.2.tgz", - "integrity": "sha512-Ee/R3SyN4BuynXcnTaekmaVdbDAEiNrHqjQIA37mHU8G9pf7aaAD4ZX3XjBLo6rsdcxA/gtkcNYZLt30ACgynw==", + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-8.0.1.tgz", + "integrity": "sha512-IO9QvjUMWxPQQhs60oOu10CRkWCiZzSUkzbXGGV9pviYl1fXYcvkzQ5jV9z8Y6un8ARoVRl4EtC6v6jNqbaJ/w==", "license": "MIT", "engines": { "node": ">=14.16" @@ -15304,12 +15198,12 @@ "license": "ISC" }, "node_modules/parse5": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz", - "integrity": "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==", + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.2.1.tgz", + "integrity": "sha512-BuBYQYlv1ckiPdQi/ohiivi9Sagc9JG+Ozs0r7b/0iK3sKmrb0b9FdWdBbOdx6hBCM/F9Ir82ofnBhtZOjCRPQ==", "license": "MIT", "dependencies": { - "entities": "^6.0.0" + "entities": "^4.5.0" }, "funding": { "url": "https://github.com/inikulin/parse5?sponsor=1" @@ -15328,18 +15222,6 @@ "url": "https://github.com/inikulin/parse5?sponsor=1" } }, - "node_modules/parse5/node_modules/entities": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", - "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, "node_modules/parseurl": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", @@ -16767,9 +16649,9 @@ } }, "node_modules/postcss-preset-env": { - "version": "10.2.4", - "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-10.2.4.tgz", - "integrity": "sha512-q+lXgqmTMdB0Ty+EQ31SuodhdfZetUlwCA/F0zRcd/XdxjzI+Rl2JhZNz5US2n/7t9ePsvuhCnEN4Bmu86zXlA==", + "version": "10.2.3", + "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-10.2.3.tgz", + "integrity": "sha512-zlQN1yYmA7lFeM1wzQI14z97mKoM8qGng+198w1+h6sCud/XxOjcKtApY9jWr7pXNS3yHDEafPlClSsWnkY8ow==", "funding": [ { "type": "github", @@ -16782,7 +16664,7 @@ ], "license": "MIT-0", "dependencies": { - "@csstools/postcss-cascade-layers": "^5.0.2", + "@csstools/postcss-cascade-layers": "^5.0.1", "@csstools/postcss-color-function": "^4.0.10", "@csstools/postcss-color-mix-function": "^3.0.10", "@csstools/postcss-color-mix-variadic-function-arguments": "^1.0.0", @@ -17140,9 +17022,9 @@ "license": "MIT" }, "node_modules/property-information": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/property-information/-/property-information-7.1.0.tgz", - "integrity": "sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-7.0.0.tgz", + "integrity": "sha512-7D/qOz/+Y4X/rzSB6jKxKUsQnphO046ei8qxG59mtM3RG3DHgTK81HrxrmoDVINJb8NKT5ZsRbwHvQ6B68Iyhg==", "license": "MIT", "funding": { "type": "github", @@ -17305,12 +17187,6 @@ "rc": "cli.js" } }, - "node_modules/rc/node_modules/ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "license": "ISC" - }, "node_modules/rc/node_modules/strip-json-comments": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", @@ -17416,53 +17292,6 @@ "webpack": ">=4.41.1 || 5.x" } }, - "node_modules/react-remove-scroll": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.7.1.tgz", - "integrity": "sha512-HpMh8+oahmIdOuS5aFKKY6Pyog+FNaZV/XyJOq7b4YFwsFHe5yYfdbIalI4k3vU2nSDql7YskmUseHsRrJqIPA==", - "license": "MIT", - "dependencies": { - "react-remove-scroll-bar": "^2.3.7", - "react-style-singleton": "^2.2.3", - "tslib": "^2.1.0", - "use-callback-ref": "^1.3.3", - "use-sidecar": "^1.1.3" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/react-remove-scroll-bar": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.8.tgz", - "integrity": "sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q==", - "license": "MIT", - "dependencies": { - "react-style-singleton": "^2.2.2", - "tslib": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, "node_modules/react-router": { "version": "5.3.4", "resolved": "https://registry.npmjs.org/react-router/-/react-router-5.3.4.tgz", @@ -17520,28 +17349,6 @@ "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", "license": "MIT" }, - "node_modules/react-style-singleton": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.2.3.tgz", - "integrity": "sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ==", - "license": "MIT", - "dependencies": { - "get-nonce": "^1.0.0", - "tslib": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, "node_modules/react-transition-group": { "version": "4.4.5", "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz", @@ -17675,6 +17482,12 @@ "node": ">=4" } }, + "node_modules/regenerator-runtime": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", + "license": "MIT" + }, "node_modules/regexpu-core": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.2.0.tgz", @@ -18157,27 +17970,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/rimraf/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/rtlcss": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/rtlcss/-/rtlcss-4.3.0.tgz", @@ -18267,9 +18059,9 @@ "license": "Apache-2.0" }, "node_modules/schema-utils": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.2.tgz", - "integrity": "sha512-Gn/JaSk/Mt9gYubxTtSn/QCV4em9mpAPiR1rqy/Ocu19u/G9J5WWdNoUT4SiV6mFC3y6cxyFcFwdzPM3FgxGAQ==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.0.tgz", + "integrity": "sha512-Gf9qqc58SpCA/xdziiHz35F4GNIWYWZrEshUc/G/r5BnLph6xpKuLeoJoQuj5WfBIx/eQLf+hmVPYHaxJu7V2g==", "license": "MIT", "dependencies": { "@types/json-schema": "^7.0.9", @@ -18325,9 +18117,9 @@ } }, "node_modules/semver": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", - "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "version": "7.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", + "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", "license": "ISC", "bin": { "semver": "bin/semver.js" @@ -18594,9 +18386,9 @@ } }, "node_modules/shell-quote": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.3.tgz", - "integrity": "sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==", + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.2.tgz", + "integrity": "sha512-AzqKpGKjrj7EM6rKVQEPpB288oCfnrEIuyoT9cyF4nmGa7V8Zk6f7RRqYisX8X9m+Q7bd632aZW4ky7EhbQztA==", "license": "MIT", "engines": { "node": ">= 0.4" @@ -19047,18 +18839,18 @@ } }, "node_modules/style-to-js": { - "version": "1.1.17", - "resolved": "https://registry.npmjs.org/style-to-js/-/style-to-js-1.1.17.tgz", - "integrity": "sha512-xQcBGDxJb6jjFCTzvQtfiPn6YvvP2O8U1MDIPNfJQlWMYfktPy+iGsHE7cssjs7y84d9fQaK4UF3RIJaAHSoYA==", + "version": "1.1.16", + "resolved": "https://registry.npmjs.org/style-to-js/-/style-to-js-1.1.16.tgz", + "integrity": "sha512-/Q6ld50hKYPH3d/r6nr117TZkHR0w0kGGIVfpG9N6D8NymRPM9RqCUv4pRpJ62E5DqOYx2AFpbZMyCPnjQCnOw==", "license": "MIT", "dependencies": { - "style-to-object": "1.0.9" + "style-to-object": "1.0.8" } }, "node_modules/style-to-object": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-1.0.9.tgz", - "integrity": "sha512-G4qppLgKu/k6FwRpHiGiKPaPTFcG3g4wNVX/Qsfu+RqQM30E7Tyu/TEgxcL9PNLF5pdRLwQdE3YKKf+KF2Dzlw==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-1.0.8.tgz", + "integrity": "sha512-xT47I/Eo0rwJmaXC4oilDGDWLohVhR6o/xAQcPQN8q6QBuZVL8qMYL85kLmST5cPjAorwvqIA4qXTRQoYHaL6g==", "license": "MIT", "dependencies": { "inline-style-parser": "0.2.4" @@ -19108,6 +18900,15 @@ "node": ">=16 || 14 >=14.17" } }, + "node_modules/sucrase/node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, "node_modules/sucrase/node_modules/commander": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", @@ -19117,6 +18918,41 @@ "node": ">= 6" } }, + "node_modules/sucrase/node_modules/glob": { + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/sucrase/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -19263,22 +19099,22 @@ } }, "node_modules/tapable": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.2.tgz", - "integrity": "sha512-Re10+NauLTMCudc7T5WLFLAwDhQ0JWdrMK+9B2M8zR5hRExKmsRDCBA7/aV/pNJFltmBFO5BAMlQFi/vq3nKOg==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/terser": { - "version": "5.43.1", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.43.1.tgz", - "integrity": "sha512-+6erLbBm0+LROX2sPXlUYx/ux5PyE9K/a92Wrt6oA+WDAoFTdpHE5tCYCI5PNzq2y8df4rA+QgHLJuR4jNymsg==", + "version": "5.39.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.39.0.tgz", + "integrity": "sha512-LBAhFyLho16harJoWMg/nZsQYgTrg5jXOn2nCYjRUcZZEdE3qa2zb8QEDRUGVZBW4rlazf2fxkg8tztybTaqWw==", "license": "BSD-2-Clause", "dependencies": { "@jridgewell/source-map": "^0.3.3", - "acorn": "^8.14.0", + "acorn": "^8.8.2", "commander": "^2.20.0", "source-map-support": "~0.5.20" }, @@ -19523,10 +19359,24 @@ "is-typedarray": "^1.0.0" } }, + "node_modules/typescript": { + "version": "5.8.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz", + "integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==", + "devOptional": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, "node_modules/undici-types": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.8.0.tgz", - "integrity": "sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw==", + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", "license": "MIT" }, "node_modules/unicode-canonical-property-names-ecmascript": { @@ -19921,49 +19771,6 @@ "url": "https://opencollective.com/webpack" } }, - "node_modules/use-callback-ref": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.3.tgz", - "integrity": "sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg==", - "license": "MIT", - "dependencies": { - "tslib": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/use-sidecar": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/use-sidecar/-/use-sidecar-1.1.3.tgz", - "integrity": "sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ==", - "license": "MIT", - "dependencies": { - "detect-node-es": "^1.1.0", - "tslib": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", @@ -20074,9 +19881,9 @@ } }, "node_modules/watchpack": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.4.tgz", - "integrity": "sha512-c5EGNOiyxxV5qmTtAB7rbiXxi1ooX1pQKMLX/MIabJjRA0SJBQOjKF+KSVfHkr9U1cADPon0mRiVe/riyaiDUA==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.2.tgz", + "integrity": "sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw==", "license": "MIT", "dependencies": { "glob-to-regexp": "^0.4.1", @@ -20106,14 +19913,13 @@ } }, "node_modules/webpack": { - "version": "5.99.9", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.99.9.tgz", - "integrity": "sha512-brOPwM3JnmOa+7kd3NsmOUOwbDAj8FT9xDsG3IW0MgbN9yZV7Oi/s/+MNQ/EcSMqw7qfoRyXPoeEWT8zLVdVGg==", + "version": "5.99.5", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.99.5.tgz", + "integrity": "sha512-q+vHBa6H9qwBLUlHL4Y7L0L1/LlyBKZtS9FHNCQmtayxjI5RKC9yD8gpvLeqGv5lCQp1Re04yi0MF40pf30Pvg==", "license": "MIT", "dependencies": { "@types/eslint-scope": "^3.7.7", "@types/estree": "^1.0.6", - "@types/json-schema": "^7.0.15", "@webassemblyjs/ast": "^1.14.1", "@webassemblyjs/wasm-edit": "^1.14.1", "@webassemblyjs/wasm-parser": "^1.14.1", @@ -20130,7 +19936,7 @@ "loader-runner": "^4.2.0", "mime-types": "^2.1.27", "neo-async": "^2.6.2", - "schema-utils": "^4.3.2", + "schema-utils": "^4.3.0", "tapable": "^2.1.1", "terser-webpack-plugin": "^5.3.11", "watchpack": "^2.4.1", @@ -20300,9 +20106,9 @@ } }, "node_modules/webpack-dev-server/node_modules/ws": { - "version": "8.18.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz", - "integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==", + "version": "8.18.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.1.tgz", + "integrity": "sha512-RKW2aJZMXeMxVpnZ6bck+RswznaxmzdULiBr6KY7XkTnW8uvt0iT9H5DkHUChXrc+uurzwa0rVI16n/Xzjdz1w==", "license": "MIT", "engines": { "node": ">=10.0.0" @@ -20335,9 +20141,9 @@ } }, "node_modules/webpack-sources": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.3.3.tgz", - "integrity": "sha512-yd1RBzSGanHkitROoPFd6qsrxt+oFhg/129YzheDGqeustzX0vTZJZsSsQjVQC4yzBQ56K55XU8gaNCtIzOnTg==", + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", + "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", "license": "MIT", "engines": { "node": ">=10.13.0" @@ -20659,15 +20465,15 @@ "license": "ISC" }, "node_modules/yaml": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.0.tgz", - "integrity": "sha512-4lLa/EcQCB0cJkyts+FpIRx5G/llPxfP6VQU5KByHEhLxY3IJCH0f0Hy1MHI8sClTvsIb8qwRJ6R/ZdlDJ/leQ==", + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.7.1.tgz", + "integrity": "sha512-10ULxpnOCQXxJvBgxsn9ptjq6uviG/htZKk9veJGhlqn3w/DxQ631zFF+nlQXLwmImeS5amR2dl2U8sg6U9jsQ==", "license": "ISC", "bin": { "yaml": "bin.mjs" }, "engines": { - "node": ">= 14.6" + "node": ">= 14" } }, "node_modules/yocto-queue": { diff --git a/crowdsec-docs/package.json b/crowdsec-docs/package.json index 586291746..15378c985 100644 --- a/crowdsec-docs/package.json +++ b/crowdsec-docs/package.json @@ -42,11 +42,13 @@ "tailwindcss-animate": "^1.0.7" }, "devDependencies": { - "@docusaurus/module-type-aliases": "^3.7.0", - "@docusaurus/types": "^3.7.0", + "@docusaurus/module-type-aliases": "^3.8.1", + "@docusaurus/tsconfig": "^3.8.1", + "@docusaurus/types": "^3.8.1", "autoprefixer": "^10.4.20", "postcss": "^8.4.47", - "tailwindcss": "^3.4.14" + "tailwindcss": "^3.4.14", + "typescript": "^5.8.3" }, "browserslist": { "production": [ diff --git a/crowdsec-docs/plugins/gtag/gtag.js b/crowdsec-docs/plugins/gtag/gtag.ts similarity index 100% rename from crowdsec-docs/plugins/gtag/gtag.js rename to crowdsec-docs/plugins/gtag/gtag.ts diff --git a/crowdsec-docs/plugins/gtag/index.js b/crowdsec-docs/plugins/gtag/index.js deleted file mode 100644 index 31c469b8e..000000000 --- a/crowdsec-docs/plugins/gtag/index.js +++ /dev/null @@ -1,69 +0,0 @@ - -const createConfigSnippet = ({ trackingID, anonymizeIP }) => `gtag('config', '${trackingID}', { ${anonymizeIP ? "'anonymize_ip': true" : ''} });` - -export default function pluginGoogleGtag( - _, - options, - ) { - const isProd = process.env.NODE_ENV === 'production'; - - return { - name: 'simple-gtag', - - contentLoaded({actions}) { - actions.setGlobalData(options); - }, - - getClientModules() { - return isProd ? ['./gtag'] : []; - }, - injectHtmlTags() { - if (!isProd) { - return {}; - } - return { - // Gtag includes GA by default, so we also preconnect to - // google-analytics. - headTags: [ - { - tagName: 'link', - attributes: { - rel: 'preconnect', - href: 'https://www.google-analytics.com', - }, - }, - { - tagName: 'link', - attributes: { - rel: 'preconnect', - href: 'https://www.googletagmanager.com', - }, - }, - // https://developers.google.com/analytics/devguides/collection/gtagjs/#install_the_global_site_tag - { - tagName: 'script', - attributes: { - async: true, - // We only include the first tracking id here because google says - // we shouldn't install multiple tags/scripts on the same page - // Instead we should load one script and use n * gtag("config",id) - // See https://developers.google.com/tag-platform/gtagjs/install#add-products - src: `https://www.googletagmanager.com/gtag/js?id=${options.trackingID}`, - }, - }, - { - tagName: 'script', - innerHTML: ` - window.dataLayer = window.dataLayer || []; - function gtag(){dataLayer.push(arguments);} - gtag('js', new Date()); - ${createConfigSnippet(options)}; - `, - }, - ], - }; - }, - }; -} - -export {validateThemeConfig, validateOptions} from './validate.ts'; diff --git a/crowdsec-docs/plugins/gtag/index.ts b/crowdsec-docs/plugins/gtag/index.ts new file mode 100644 index 000000000..f580fcd97 --- /dev/null +++ b/crowdsec-docs/plugins/gtag/index.ts @@ -0,0 +1,68 @@ +const createConfigSnippet = ({ trackingID, anonymizeIP }) => + `gtag('config', '${trackingID}', { ${ + anonymizeIP ? "'anonymize_ip': true" : "" + } });` + +export default function pluginGoogleGtag(_, options) { + const isProd = process.env.NODE_ENV === "production" + + return { + name: "simple-gtag", + + contentLoaded({ actions }) { + actions.setGlobalData(options) + }, + + getClientModules() { + return isProd ? ["./gtag"] : [] + }, + injectHtmlTags() { + if (!isProd) { + return {} + } + return { + // Gtag includes GA by default, so we also preconnect to + // google-analytics. + headTags: [ + { + tagName: "link", + attributes: { + rel: "preconnect", + href: "https://www.google-analytics.com", + }, + }, + { + tagName: "link", + attributes: { + rel: "preconnect", + href: "https://www.googletagmanager.com", + }, + }, + // https://developers.google.com/analytics/devguides/collection/gtagjs/#install_the_global_site_tag + { + tagName: "script", + attributes: { + async: true, + // We only include the first tracking id here because google says + // we shouldn't install multiple tags/scripts on the same page + // Instead we should load one script and use n * gtag("config",id) + // See https://developers.google.com/tag-platform/gtagjs/install#add-products + src: `https://www.googletagmanager.com/gtag/js?id=${options.trackingID}`, + }, + }, + { + tagName: "script", + innerHTML: ` + window.dataLayer = window.dataLayer || []; + function gtag(){dataLayer.push(arguments);} + gtag('js', new Date()); + ${createConfigSnippet(options)}; + `, + }, + ], + } + }, + } +} + +export { validateThemeConfig, validateOptions } from "./validate.js" diff --git a/crowdsec-docs/plugins/matomo/index.js b/crowdsec-docs/plugins/matomo/index.js index 6368c97e0..4da05115b 100644 --- a/crowdsec-docs/plugins/matomo/index.js +++ b/crowdsec-docs/plugins/matomo/index.js @@ -1,30 +1,29 @@ - -var path = require("path"); +var path = require("path") module.exports = function (context) { - const {siteConfig} = context; - const {themeConfig} = siteConfig; - const {matomo} = themeConfig || {}; + const { siteConfig } = context + const { themeConfig } = siteConfig + const { matomo } = themeConfig || {} - //const isProd = process.env.NODE_ENV === 'production'; - isProd = true; - return { - name: 'docusaurus-plugin-matomo', - getClientModules() { - return isProd ? [path.resolve(__dirname, './track')] : []; - }, - injectHtmlTags() { - return { - headTags: [ - { - tagName: 'script', - attributes: { - src: '/plugins/matomo/tarteaucitron.js-1.9.7/tarteaucitron.js', - }, + //const isProd = process.env.NODE_ENV === 'production'; + isProd = true + return { + name: "docusaurus-plugin-matomo", + getClientModules() { + return isProd ? [path.resolve(__dirname, "./track")] : [] }, - { - tagName: 'script', - innerHTML: `tarteaucitron.init({ + injectHtmlTags() { + return { + headTags: [ + { + tagName: "script", + attributes: { + src: "/plugins/matomo/tarteaucitron.js-1.9.7/tarteaucitron.js", + }, + }, + { + tagName: "script", + innerHTML: `tarteaucitron.init({ "privacyUrl": "", /* Privacy policy url */ "bodyPosition": "bottom", /* or top to bring it as first element for accessibility */ @@ -66,16 +65,16 @@ module.exports = function (context) { "mandatory": true, /* Show a message about mandatory cookies */ "mandatoryCta": true /* Show the disabled accept button when mandatory on */ });`, - }, - { - tagName: 'script', - innerHTML:` + }, + { + tagName: "script", + innerHTML: ` tarteaucitron.user.matomoId = '5'; tarteaucitron.user.matomoHost = 'https://crowdsec.matomo.cloud/'; (tarteaucitron.job = tarteaucitron.job || []).push('matomocloud');`, - } - ], - }; - }, - }; -}; \ No newline at end of file + }, + ], + } + }, + } +} diff --git a/crowdsec-docs/plugins/tailwind-config.js b/crowdsec-docs/plugins/tailwind-config.js deleted file mode 100644 index b3cdba630..000000000 --- a/crowdsec-docs/plugins/tailwind-config.js +++ /dev/null @@ -1,13 +0,0 @@ -export default function tailwindPlugin(context, options) { - return { - name: 'tailwind-plugin', - configurePostCss(postcssOptions) { - postcssOptions.plugins = [ - require('postcss-import'), - require('tailwindcss'), - require('autoprefixer'), - ]; - return postcssOptions; - }, - }; - } \ No newline at end of file diff --git a/crowdsec-docs/plugins/tailwind-config.ts b/crowdsec-docs/plugins/tailwind-config.ts new file mode 100644 index 000000000..d592bd507 --- /dev/null +++ b/crowdsec-docs/plugins/tailwind-config.ts @@ -0,0 +1,13 @@ +export default function tailwindPlugin() { + return { + name: "tailwind-plugin", + configurePostCss(postcssOptions) { + postcssOptions.plugins = [ + require("postcss-import"), + require("tailwindcss"), + require("autoprefixer"), + ] + return postcssOptions + }, + } +} diff --git a/crowdsec-docs/sidebars.js b/crowdsec-docs/sidebars.ts similarity index 98% rename from crowdsec-docs/sidebars.js rename to crowdsec-docs/sidebars.ts index 48a0dbaee..fe3c2240b 100644 --- a/crowdsec-docs/sidebars.js +++ b/crowdsec-docs/sidebars.ts @@ -1,5 +1,8 @@ +import { SidebarsConfig } from "@docusaurus/plugin-content-docs" -module.exports = { +type SidebarConfig = SidebarsConfig[string] + +const sidebarsConfig: SidebarConfig = { // By default, Docusaurus generates a sidebar from the docs folder structure //tutorialSidebar: [{type: 'autogenerated', dirName: '.'}], // But you can create a sidebar manually @@ -778,10 +781,16 @@ module.exports = { { type: "doc", id: "appsec/create_rules" }, ], }, - { type: "doc", id: "appsec/alerts_and_scenarios", label: "Alerts & Scenarios" }, + { + type: "doc", + id: "appsec/alerts_and_scenarios", + label: "Alerts & Scenarios", + }, { type: "doc", id: "appsec/installation" }, { type: "doc", id: "appsec/protocol", label: "Communication Protocol" }, { type: "doc", id: "appsec/benchmark", label: "Benchmark" }, { type: "doc", id: "appsec/troubleshooting" }, ], } + +export default sidebarsConfig diff --git a/crowdsec-docs/sidebarsUnversioned.js b/crowdsec-docs/sidebarsUnversioned.ts similarity index 94% rename from crowdsec-docs/sidebarsUnversioned.js rename to crowdsec-docs/sidebarsUnversioned.ts index 666f60edd..6de53a04b 100644 --- a/crowdsec-docs/sidebarsUnversioned.js +++ b/crowdsec-docs/sidebarsUnversioned.ts @@ -1,4 +1,8 @@ -module.exports = { +import { SidebarsConfig } from "@docusaurus/plugin-content-docs" + +type SidebarConfig = SidebarsConfig[string] + +const sidebarsUnversionedConfig: SidebarConfig = { ctiApiSidebar: [ { type: "doc", @@ -554,9 +558,9 @@ module.exports = { gettingStarted: [ { type: "doc", - id: "getting_started/intro", + id: "getting_started/intro", label: "🧭 Introduction", - }, + }, { type: "category", label: "πŸ“¦ Installation", @@ -576,7 +580,7 @@ module.exports = { type: "doc", id: "getting_started/health_check", label: "🩺 Stack Health-Check", - }, + }, { type: "category", label: "πŸ’‘ Post Installation Steps", @@ -584,7 +588,7 @@ module.exports = { type: "doc", id: "getting_started/next_steps", }, - items: [ + items: [ { type: "category", label: "CrowdSec Console", @@ -596,14 +600,14 @@ module.exports = { "getting_started/post_installation/console_blocklists", "getting_started/post_installation/console_hub", ], - className: "sideBarItemRecommended" // to display tag + className: "sideBarItemRecommended", // to display tag }, { type: "doc", id: "getting_started/post_installation/whitelists", label: "Whitelisting IPs", - className: "sideBarItemRecommended" - }, + className: "sideBarItemRecommended", + }, { type: "category", label: "Acquisition", @@ -627,21 +631,21 @@ module.exports = { }, { type: "doc", - id: "getting_started/post_installation/profiles", + id: "getting_started/post_installation/profiles", label: "Profiles", - className: "sideBarItemOptional" + className: "sideBarItemOptional", }, { type: "doc", - id: "getting_started/post_installation/metrics", + id: "getting_started/post_installation/metrics", label: "Metrics", - className: "sideBarItemOptional" - }, + className: "sideBarItemOptional", + }, { type: "doc", - id: "getting_started/post_installation/troubleshoot", + id: "getting_started/post_installation/troubleshoot", label: "General Troubleshooting 🚨", - }, + }, ], }, { @@ -651,3 +655,16 @@ module.exports = { }, ], } + +export default sidebarsUnversionedConfig + +export const { + ctiApiSidebar, + consoleSidebar, + remediationSideBar, + blocklistsSideBar, + troubleshootingSideBar, + serviceApiSideBar, + guidesSideBar, + gettingStarted, +} = sidebarsUnversionedConfig diff --git a/crowdsec-docs/src/components/AcademyPromo.js b/crowdsec-docs/src/components/AcademyPromo.js deleted file mode 100644 index 2ee96dd08..000000000 --- a/crowdsec-docs/src/components/AcademyPromo.js +++ /dev/null @@ -1,30 +0,0 @@ -export default function AcademyPromo({ ...props }) { - const LINK = `https://academy.crowdsec.net/course/${props.course}${process.env.NODE_ENV === 'production' ? props.utm : ' '}` - return ( -
-
-
- {!!props.title && ( -

{props.title}

- )} -
-
- {!!props.image && ( - {props.title} - )} -
-
- {!!props.description && ( -

{props.description}

- )} - {!!props.course && ( - Learn with CrowdSec Academy - )} -
-
-
-
-
- ); - } - diff --git a/crowdsec-docs/src/components/HomepageFeatures.js b/crowdsec-docs/src/components/HomepageFeatures.js deleted file mode 100644 index 2d12a9252..000000000 --- a/crowdsec-docs/src/components/HomepageFeatures.js +++ /dev/null @@ -1,105 +0,0 @@ -import clsx from 'clsx'; -import styles from './HomepageFeatures.module.css'; - -const FeatureList = [ - { - //screenshot terminal / apt-get ? - title: 'Easy to Setup and Use', - Svg: require('../../static/img/icon-easytouse.svg').default, - link: "/docs/getting_started/install_crowdsec", - description: ( - <> - CrowdSec is easy to install, deploy and use regardless of your knowledge. - You don't need to be a security master to enjoy its full capabilities. - - ), - }, - { - //screenshot metabase ? - title: 'Replayable', - Svg: require('../../static/img/icon-replay.svg').default, - link: "/u/user_guides/replay_mode", - description: ( - <> - CrowdSec is able to process both live and old logs, which makes it false-positive resilient. - - ), - }, - { - //screenshot de grafana - title: 'Observable', - link: "/docs/observability/prometheus#exploitation-with-prometheus-server--grafana", - Svg: require('../../static/img/icon-data.svg').default, - description: ( - <> - CrowdSec is instrumented with Metabase & Prometheus to generate out-of-the-box dashboards and monitor activity across your assets. - - ), - }, - { - //schema api ? - title: 'API-Driven', - Svg: require('../../static/img/icon-api.svg').default, - link: "/docs/local_api/intro", - description: ( - <> - All components communicate via HTTP API, making it easy to cover complex setups. - - ), - }, - { - //schema api ? - title: 'Participative', - link: "/docs/central_api/intro", - Svg: require('../../static/img/icon-collaborative.svg').default, - description: ( - <> - You can share malevolent IP data with your fellow users, have each other's backs and outnumber hackers. - - ), - }, - { - //schema api ? - title: 'Open Source', - Svg: require('../../static/img/icon-opensource.svg').default, - link: "/docs/faq#what-licence-is-crowdsec-released-under-", - description: ( - <> - CrowdSec is as open source and free as it can be through an MIT license. No back doors. No shenanigans. - - ), - }, - //community driven -> - //open-source - //detect here apply there - //block anything, not just ips - -]; - -function Feature({Svg, title, description, link}) { - return ( -
-
- -
-
-

{title}

-

{description}

-
-
- ); -} - -export default function HomepageFeatures() { - return ( -
-
-
- {FeatureList.map((props, idx) => ( - - ))} -
-
-
- ); -} diff --git a/crowdsec-docs/src/components/RemediationFeatures.js b/crowdsec-docs/src/components/RemediationFeatures.js deleted file mode 100644 index 48736248c..000000000 --- a/crowdsec-docs/src/components/RemediationFeatures.js +++ /dev/null @@ -1,18 +0,0 @@ -import styles from './RemediationFeatures.module.css'; - - -import useBaseUrl from '@docusaurus/useBaseUrl'; - -export default function RemediationsFeatures() { - return ( -
-
-

Examples of detected behaviors

-
- -
-
-
- ); - } - diff --git a/crowdsec-docs/src/components/academy-promo.tsx b/crowdsec-docs/src/components/academy-promo.tsx new file mode 100644 index 000000000..c6f54750f --- /dev/null +++ b/crowdsec-docs/src/components/academy-promo.tsx @@ -0,0 +1,38 @@ +import React from "react" + +const AcademyPromo = ({ ...props }): React.JSX.Element => { + const LINK = `https://academy.crowdsec.net/course/${props.course}${ + process.env.NODE_ENV === "production" ? props.utm : " " + }` + return ( +
+
+
+ {!!props.title &&

{props.title}

} +
+
+ {!!props.image && ( + + {props.title} + + )} +
+
+ {!!props.description &&

{props.description}

} + {!!props.course && ( + + Learn with CrowdSec Academy + + )} +
+
+
+
+
+ ) +} + +export default AcademyPromo diff --git a/crowdsec-docs/src/components/ConsoleAd.js b/crowdsec-docs/src/components/console-ad.tsx similarity index 73% rename from crowdsec-docs/src/components/ConsoleAd.js rename to crowdsec-docs/src/components/console-ad.tsx index 20aca7747..8b116db06 100644 --- a/crowdsec-docs/src/components/ConsoleAd.js +++ b/crowdsec-docs/src/components/console-ad.tsx @@ -1,13 +1,13 @@ -import React from "react"; -import ThemedImage from "@theme/ThemedImage"; -import useBaseUrl from "@docusaurus/useBaseUrl"; +import React from "react" +import ThemedImage from "@theme/ThemedImage" +import useBaseUrl from "@docusaurus/useBaseUrl" const SIGNUP_LINK = `https://app.crowdsec.net/signup${ process.env.NODE_ENV === "production" ? "?mtm_campaign=Console&mtm_source=docs&mtm_medium=tocAd&mtm_content=Console" : "" -}`; -export default function ConsoleAd() { +}` +const ConsoleAd = (): React.JSX.Element => { return ( - ); + ) } + +export default ConsoleAd diff --git a/crowdsec-docs/src/components/ConsolePromo.js b/crowdsec-docs/src/components/console-promo.tsx similarity index 78% rename from crowdsec-docs/src/components/ConsolePromo.js rename to crowdsec-docs/src/components/console-promo.tsx index 626ed4426..9bbab5d16 100644 --- a/crowdsec-docs/src/components/ConsolePromo.js +++ b/crowdsec-docs/src/components/console-promo.tsx @@ -1,16 +1,18 @@ +import React from "react" import useBaseUrl from "@docusaurus/useBaseUrl" import Link from "@docusaurus/Link" -export default function ConsolePromo({ ...props }) { +const ConsolePromo = ({ ...props }): React.JSX.Element => { + const url = useBaseUrl("/img/" + props.image) return (
- {!!props.title ? ( + {Boolean(props.title) ? (

{props.title}

) : null} - {!!props.description ? ( + {Boolean(props.description) ? (

{props.description}

) : null}
- {!!props.image ? ( + {Boolean(props.image) ? ( {props.title} @@ -30,3 +32,5 @@ export default function ConsolePromo({ ...props }) {
) } + +export default ConsolePromo diff --git a/crowdsec-docs/src/components/FormattedTabs.js b/crowdsec-docs/src/components/formatted-tabs.tsx similarity index 96% rename from crowdsec-docs/src/components/FormattedTabs.js rename to crowdsec-docs/src/components/formatted-tabs.tsx index e88155d9d..b8e9a73e1 100644 --- a/crowdsec-docs/src/components/FormattedTabs.js +++ b/crowdsec-docs/src/components/formatted-tabs.tsx @@ -1,3 +1,4 @@ +import React from "react" import Tabs from "@theme/Tabs" import TabItem from "@theme/TabItem" import CodeBlock from "@theme/CodeBlock" @@ -18,7 +19,7 @@ import { * The powershell prop is used to display the code snippet for Windows Powershell. * The cmd prop is used to display the code snippet for Windows Command Prompt. */ -export default function FormattedTabs({ ...props }) { +const FormattedTabs = ({ ...props }): React.JSX.Element => { const values = [] let defaultValue = "" @@ -32,7 +33,7 @@ export default function FormattedTabs({ ...props }) { } values.push({ label: "Windows", value: "windows", icon: cibWindows }) } - + if (props.docker !== undefined || props.dockerCompose !== undefined) { if (defaultValue === "") { defaultValue = "docker" @@ -106,8 +107,9 @@ export default function FormattedTabs({ ...props }) { {props.docker} ) : null} - - {props.dockerCompose !== undefined && props.docker === undefined ? ( + + {props.dockerCompose !== undefined && + props.docker === undefined ? ( {props.dockerCompose} ) : null} @@ -153,3 +155,5 @@ export default function FormattedTabs({ ...props }) { ) } + +export default FormattedTabs diff --git a/crowdsec-docs/src/components/GetToKnowUs.js b/crowdsec-docs/src/components/get-to-know-us.tsx similarity index 92% rename from crowdsec-docs/src/components/GetToKnowUs.js rename to crowdsec-docs/src/components/get-to-know-us.tsx index 3926b7e99..aa86dd86c 100644 --- a/crowdsec-docs/src/components/GetToKnowUs.js +++ b/crowdsec-docs/src/components/get-to-know-us.tsx @@ -1,6 +1,14 @@ +import React from "react" import Link from "@docusaurus/Link" -const staticData = [ +type StaticData = { + icon: React.FC> + title: string + description: string + link: string +} + +const staticData: StaticData[] = [ { icon: () => ( { return (

Get to know us!

@@ -84,7 +92,7 @@ export default function GetToKnowUs() {
{staticData.map((props, index) => ( ) } + +export default GetToKnowUs diff --git a/crowdsec-docs/src/components/github-icon-renderer.tsx b/crowdsec-docs/src/components/github-icon-renderer.tsx new file mode 100644 index 000000000..902ae8bba --- /dev/null +++ b/crowdsec-docs/src/components/github-icon-renderer.tsx @@ -0,0 +1,22 @@ +import React from "react" +import { cibGithub } from "@coreui/icons" +import CIcon from "@coreui/icons-react" + +const GithubIconRender = ({ ...props }): React.JSX.Element => { + return ( +
+
+ + + +

Github

+
+
+ ) +} + +export default GithubIconRender diff --git a/crowdsec-docs/src/components/githubIconRender.js b/crowdsec-docs/src/components/githubIconRender.js deleted file mode 100644 index 688dc4c15..000000000 --- a/crowdsec-docs/src/components/githubIconRender.js +++ /dev/null @@ -1,15 +0,0 @@ -import { cibGithub } from '@coreui/icons'; -import CIcon from '@coreui/icons-react'; - -export default function GithubIconRender({ ...props }) { - return ( -
-
- - - -

Github

-
-
- ) -} diff --git a/crowdsec-docs/src/components/HomepageFeatures.module.css b/crowdsec-docs/src/components/home-page/HomepageFeatures.module.css similarity index 100% rename from crowdsec-docs/src/components/HomepageFeatures.module.css rename to crowdsec-docs/src/components/home-page/HomepageFeatures.module.css diff --git a/crowdsec-docs/src/components/home-page/features.tsx b/crowdsec-docs/src/components/home-page/features.tsx new file mode 100644 index 000000000..bc26358d2 --- /dev/null +++ b/crowdsec-docs/src/components/home-page/features.tsx @@ -0,0 +1,121 @@ +import React from "react" +import clsx from "clsx" +import styles from "./HomepageFeatures.module.css" + +const FEATURES_LIST = [ + { + //screenshot terminal / apt-get ? + title: "Easy to Setup and Use", + Svg: require("../../static/img/icon-easytouse.svg").default, + link: "/docs/getting_started/install_crowdsec", + description: ( + <> + CrowdSec is easy to install, deploy and use regardless of your + knowledge. You don't need to be a security master to enjoy its + full capabilities. + + ), + }, + { + //screenshot metabase ? + title: "Replayable", + Svg: require("../../static/img/icon-replay.svg").default, + link: "/u/user_guides/replay_mode", + description: ( + <> + CrowdSec is able to process both live and old logs, which makes + it false-positive resilient. + + ), + }, + { + //screenshot de grafana + title: "Observable", + link: "/docs/observability/prometheus#exploitation-with-prometheus-server--grafana", + Svg: require("../../static/img/icon-data.svg").default, + description: ( + <> + CrowdSec is instrumented with Metabase & Prometheus to generate + out-of-the-box dashboards and monitor activity across your + assets. + + ), + }, + { + //schema api ? + title: "API-Driven", + Svg: require("../../static/img/icon-api.svg").default, + link: "/docs/local_api/intro", + description: ( + <> + All components communicate via HTTP API, making it easy to cover + complex setups. + + ), + }, + { + //schema api ? + title: "Participative", + link: "/docs/central_api/intro", + Svg: require("../../static/img/icon-collaborative.svg").default, + description: ( + <> + You can share malevolent IP data with your fellow users, have + each other's backs and outnumber hackers. + + ), + }, + { + //schema api ? + title: "Open Source", + Svg: require("../../static/img/icon-opensource.svg").default, + link: "/docs/faq#what-licence-is-crowdsec-released-under-", + description: ( + <> + CrowdSec is as open source and free as it can be through an MIT + license. No back doors. No shenanigans. + + ), + }, + //community driven -> + //open-source + //detect here apply there + //block anything, not just ips +] + +const Feature = ({ Svg, title, description, link }): React.JSX.Element => { + return ( +
+ +
+

{title}

+

{description}

+
+
+ ) +} + +const HomepageFeatures = () => { + return ( +
+
+
+ {FEATURES_LIST.map((props, idx) => ( + + ))} +
+
+
+ ) +} + +export default HomepageFeatures diff --git a/crowdsec-docs/src/components/QuickStart.js b/crowdsec-docs/src/components/quick-start.tsx similarity index 94% rename from crowdsec-docs/src/components/QuickStart.js rename to crowdsec-docs/src/components/quick-start.tsx index d215cc39d..a3eab7829 100644 --- a/crowdsec-docs/src/components/QuickStart.js +++ b/crowdsec-docs/src/components/quick-start.tsx @@ -1,4 +1,4 @@ -import CIcon from "@coreui/icons-react" +import React from "react" import cibLinux from "@site/static/img/logo/linux-colored.svg" import cibDocker from "@site/static/img/logo/docker-colored.svg" import cibWindows from "@site/static/img/logo/windows-colored.svg" @@ -8,8 +8,8 @@ import opnsenseLogo from "@site/static/img/logo-opnsense.svg" import pfSenseLogo from "@site/static/img/logo-pfsense.svg" import cibKubernetes from "@site/static/img/logo/kubernetes-colored.svg" import whmLogo from "@site/static/img/logo-whm.svg" -import cloudwaysLogo from "@site/static/img/logo-cloudways.svg" import Link from "@docusaurus/Link" +import CIcon from "@coreui/icons-react" const staticData = [ { @@ -65,7 +65,7 @@ const staticData = [ // }, ] -export default function QuickStart() { +const QuickStart = (): React.JSX.Element => { return (
@@ -93,7 +93,9 @@ export default function QuickStart() { {(!Array.isArray(props.icon) && ( - )) || } + )) || ( + + )} ) } + +export default QuickStart diff --git a/crowdsec-docs/src/components/RemediationFeatures.module.css b/crowdsec-docs/src/components/remediation-features/RemediationFeatures.module.css similarity index 100% rename from crowdsec-docs/src/components/RemediationFeatures.module.css rename to crowdsec-docs/src/components/remediation-features/RemediationFeatures.module.css diff --git a/crowdsec-docs/src/components/remediation-features/index.tsx b/crowdsec-docs/src/components/remediation-features/index.tsx new file mode 100644 index 000000000..cd26a9c8c --- /dev/null +++ b/crowdsec-docs/src/components/remediation-features/index.tsx @@ -0,0 +1,28 @@ +import React from "react" +import styles from "./RemediationFeatures.module.css" +import useBaseUrl from "@docusaurus/useBaseUrl" + +const RemediationFeatures = (): React.JSX.Element => { + return ( +
+
+

+ {" "} + Examples of detected behaviors{" "} +

+
+ +
+
+
+ ) +} + +export default RemediationFeatures diff --git a/crowdsec-docs/src/components/table-render.tsx b/crowdsec-docs/src/components/table-render.tsx new file mode 100644 index 000000000..6958f6cd8 --- /dev/null +++ b/crowdsec-docs/src/components/table-render.tsx @@ -0,0 +1,100 @@ +import React, { useState, useEffect, useMemo } from "react" +import { MaterialReactTable } from "material-react-table" +import { createTheme, ThemeProvider } from "@mui/material" +import BrowserOnly from "@docusaurus/BrowserOnly" +import { useColorMode } from "@docusaurus/theme-common" + +const TableRender = ({ + columns, + url, + include = [], + exclude = [], +}): React.JSX.Element => { + const [jsonContent, setJsonContent] = useState([]) + const { colorMode } = useColorMode() + + const theme = useMemo(() => { + const isLight = colorMode === "light" + + return createTheme({ + palette: { + mode: colorMode, + background: { + default: isLight ? "rgb(255,255,255)" : "#1b1b1d", + }, + }, + }) + }, [colorMode]) + + useEffect(() => { + fetch(url) + .then((res) => res.json()) + .then((data) => { + const updatedData = [] + const names = [] + + Object.keys(data).forEach((key, i) => { + // filter duplicate names + const item = data[key] + const name = item["name"] + for (const element of exclude) { + if (name.includes(element)) { + return + } + } + for (const element of include) { + if (!name.includes(element)) { + return + } + } + if (names.includes(name)) { + return + } + + names.push(name) + updatedData.push({ + ...item, + // flattening list of strings into CSV strings allow global filtering on them + // /!\ it requires special handling in the rendering side (see crowdsec-docs/docs/cti_api/taxonomy) /!\ + ...(item.behaviors + ? { behaviors: item.behaviors.join("\n") } + : {}), + ...(item.mitre_attacks + ? { mitre_attacks: item.mitre_attacks.join("\n") } + : {}), + ...(item.cves ? { cves: item.cves.join("\n") } : {}), + }) + }) + + setJsonContent(updatedData) + }) + // execute this fetch only once (on mount) + }, []) + + if (!columns || !jsonContent) { + return <> + } + + return ( + + {() => ( + + + + )} + + ) +} + +export default TableRender diff --git a/crowdsec-docs/src/components/tableRender.js b/crowdsec-docs/src/components/tableRender.js deleted file mode 100644 index 8bd563cf4..000000000 --- a/crowdsec-docs/src/components/tableRender.js +++ /dev/null @@ -1,98 +0,0 @@ -import { useState, useEffect, useMemo } from 'react'; -import { MaterialReactTable } from 'material-react-table'; -import { createTheme, ThemeProvider } from '@mui/material'; -import BrowserOnly from '@docusaurus/BrowserOnly'; -import {useColorMode} from '@docusaurus/theme-common'; - - -const TableRender = ({ columns, url, include=[], exclude=[] }) => { - const [jsonContent, setJsonContent] = useState([]) - const {colorMode} = useColorMode(); - - const theme = useMemo(() => { - const isLight = colorMode === 'light'; - - return createTheme({ - palette: { - mode: colorMode, - background: { - default: - isLight - ? 'rgb(255,255,255)' - : '#1b1b1d', - }, - }, - }, - ); - }, [colorMode]); - - - useEffect(() => { - fetch(url) - .then((res) => res.json()) - .then((data) => { - const updatedData = []; - const names = []; - - Object.keys(data).map((key, i) => { - // filter duplicate names - const item = data[key]; - const name = item["name"]; - for (let i = 0; i < exclude.length; i++) { - if (name.includes(exclude[i])) { - return - } - } - for (let i = 0; i < include.length; i++) { - if (!name.includes(include[i])) { - return - } - } - if (names.includes(name)) { - return - } - - names.push(name) - updatedData.push({ - ...item, - // flattening list of strings into CSV strings allow global filtering on them - // /!\ it requires special handling in the rendering side (see crowdsec-docs/docs/cti_api/taxonomy) /!\ - ...item.behaviors ? { behaviors: item.behaviors.join('\n') } : {}, - ...item.mitre_attacks ? { mitre_attacks: item.mitre_attacks.join('\n') } : {}, - ...item.cves ? { cves: item.cves.join('\n') } : {}, - }); - }); - - setJsonContent(updatedData); - }) - // execute this fetch only once (on mount) - }, []); - - if (!columns || !jsonContent) { - return <> - } - - return ( - - {() => - - - - } - - ); - -} - -export default TableRender; - - diff --git a/crowdsec-docs/src/css/custom.css b/crowdsec-docs/src/css/custom.css index f73d52b02..eb75ff394 100644 --- a/crowdsec-docs/src/css/custom.css +++ b/crowdsec-docs/src/css/custom.css @@ -1,4 +1,5 @@ @import url('https://fonts.googleapis.com/css2?family=Instrument+Sans:ital,wght@0,400..700;1,400..700&display=swap'); + @tailwind base; @tailwind components; @tailwind utilities; diff --git a/crowdsec-docs/src/pages/index.js b/crowdsec-docs/src/pages/index.tsx similarity index 92% rename from crowdsec-docs/src/pages/index.js rename to crowdsec-docs/src/pages/index.tsx index 745574817..f99552c52 100644 --- a/crowdsec-docs/src/pages/index.js +++ b/crowdsec-docs/src/pages/index.tsx @@ -3,10 +3,10 @@ import clsx from "clsx" import Layout from "@theme/Layout" import Link from "@docusaurus/Link" import styles from "./index.module.css" -import QuickStart from "../components/QuickStart" -import GetToKnowUs from "../components/GetToKnowUs" +import QuickStart from "../components/quick-start" +import GetToKnowUs from "../components/get-to-know-us" -function HomepageHeader() { +const HomePageHeader = (): JSX.Element => { return (
Explore the Console - Online Sandbox -
@@ -65,13 +64,15 @@ function HomepageHeader() { ) } -export default function Home() { +const HomePage = () => { return ( - + ) } + +export default HomePage diff --git a/crowdsec-docs/src/theme/Root.js b/crowdsec-docs/src/theme/Root.js deleted file mode 100644 index db1f1d561..000000000 --- a/crowdsec-docs/src/theme/Root.js +++ /dev/null @@ -1,9 +0,0 @@ -import {useStorageSlot} from "@docusaurus/theme-common" -import CookieConsent from "../../plugins/gtag/theme/cookieconsent"; -export default function Root({children}) { - const [value, _] = useStorageSlot('docusaurus.cookieConsent'); - return <> - {children} - {value === null && } - ; -} \ No newline at end of file diff --git a/crowdsec-docs/src/theme/Root.tsx b/crowdsec-docs/src/theme/Root.tsx new file mode 100644 index 000000000..0e5814e01 --- /dev/null +++ b/crowdsec-docs/src/theme/Root.tsx @@ -0,0 +1,13 @@ +import React from "react" +import { useStorageSlot } from "@docusaurus/theme-common" +import CookieConsent from "../../plugins/gtag/theme/cookieconsent" + +export default function Root({ children }) { + const [value, _] = useStorageSlot("docusaurus.cookieConsent") + return ( + <> + {children} + {value === null && } + + ) +} diff --git a/crowdsec-docs/src/theme/TOC/index.js b/crowdsec-docs/src/theme/TOC/index.js deleted file mode 100644 index eb7215fe4..000000000 --- a/crowdsec-docs/src/theme/TOC/index.js +++ /dev/null @@ -1,24 +0,0 @@ -// Import necessary components and modules -import React from "react"; -import clsx from "clsx"; -import TOCItems from "@theme/TOCItems"; -import styles from "./styles.module.css"; -import ConsoleAd from '@site/src/components/ConsoleAd.js' - -// Define custom classNames -const LINK_CLASS_NAME = "table-of-contents__link toc-highlight"; -const LINK_ACTIVE_CLASS_NAME = "table-of-contents__link--active"; - -// Modified TOC component -export default function TOC({ className, ...props }) { - return ( -
- - -
- ); -} \ No newline at end of file diff --git a/crowdsec-docs/src/theme/TOC/index.tsx b/crowdsec-docs/src/theme/TOC/index.tsx new file mode 100644 index 000000000..3f5abad70 --- /dev/null +++ b/crowdsec-docs/src/theme/TOC/index.tsx @@ -0,0 +1,33 @@ +// Import necessary components and modules +import React from "react" +import clsx from "clsx" +import TOCItems from "@theme/TOCItems" +import styles from "./styles.module.css" +import ConsoleAd from "@site/src/components/console-ad" + +// Define custom classNames +const LINK_CLASS_NAME = "table-of-contents__link toc-highlight" +const LINK_ACTIVE_CLASS_NAME = "table-of-contents__link--active" + +// Modified TOC component +const TOC = ({ className, ...props }): React.JSX.Element => { + return ( +
+ + +
+ ) +} + +export default TOC diff --git a/crowdsec-docs/src/theme/DocItem/Layout/index.js b/crowdsec-docs/src/theme/doc-item/layout/index.tsx similarity index 96% rename from crowdsec-docs/src/theme/DocItem/Layout/index.js rename to crowdsec-docs/src/theme/doc-item/layout/index.tsx index 31d7aa5b4..8d0bfb8b1 100644 --- a/crowdsec-docs/src/theme/DocItem/Layout/index.js +++ b/crowdsec-docs/src/theme/doc-item/layout/index.tsx @@ -6,7 +6,6 @@ import { useDoc } from "@docusaurus/plugin-content-docs/client" import DocItemPaginator from "@theme/DocItem/Paginator" import DocVersionBanner from "@theme/DocVersionBanner" import DocVersionBadge from "@theme/DocVersionBadge" -import DocItemFooter from "@theme/DocItem/Footer" import DocItemTOCMobile from "@theme/DocItem/TOC/Mobile" import DocItemTOCDesktop from "@theme/DocItem/TOC/Desktop" import DocItemContent from "@theme/DocItem/Content" @@ -14,7 +13,7 @@ import DocBreadcrumbs from "@theme/DocBreadcrumbs" import styles from "./styles.module.css" // Function to decide whether to render the TOC on mobile or desktop -function useDocTOC() { +const useDocTOC = () => { const { frontMatter, toc } = useDoc() const windowSize = useWindowSize() const hidden = frontMatter.hide_table_of_contents diff --git a/crowdsec-docs/src/theme/DocItem/Layout/styles.module.css b/crowdsec-docs/src/theme/doc-item/layout/styles.module.css similarity index 100% rename from crowdsec-docs/src/theme/DocItem/Layout/styles.module.css rename to crowdsec-docs/src/theme/doc-item/layout/styles.module.css diff --git a/crowdsec-docs/tsconfig.json b/crowdsec-docs/tsconfig.json index 44bfbdeb1..9fba2f9b6 100644 --- a/crowdsec-docs/tsconfig.json +++ b/crowdsec-docs/tsconfig.json @@ -4,8 +4,7 @@ "jsx": "react", "baseUrl": ".", "paths": { - "@/*": ["./*"], - "@site/*": ["./*"] + "@site/*": ["./*"], } } } diff --git a/crowdsec-docs/unversioned/blocklists/getting_started.mdx b/crowdsec-docs/unversioned/blocklists/getting_started.mdx index 6054db6b9..419c9751e 100644 --- a/crowdsec-docs/unversioned/blocklists/getting_started.mdx +++ b/crowdsec-docs/unversioned/blocklists/getting_started.mdx @@ -3,7 +3,7 @@ id: getting_started title: Getting Started --- -import ConsolePromo from '@site/src/components/ConsolePromo.js'; +import ConsolePromo from '@site/src/components/console-promo'; Make sure to read the [Introduction](/blocklists/intro.md) to understand CrowdSec Blocklists, how they work, and their available tiers. diff --git a/crowdsec-docs/unversioned/blocklists/security_engine.mdx b/crowdsec-docs/unversioned/blocklists/security_engine.mdx index 3408c0e4c..f28463199 100644 --- a/crowdsec-docs/unversioned/blocklists/security_engine.mdx +++ b/crowdsec-docs/unversioned/blocklists/security_engine.mdx @@ -3,7 +3,7 @@ id: security_engine title: Security Engine --- -import QuickStart from '@site/src/components/QuickStart' +import QuickStart from '@site/src/components/quick-start' This page is used to reference other pages into a single guide. It is not meant to be used as a standalone page. diff --git a/crowdsec-docs/unversioned/console/cti/cti_api_keys.mdx b/crowdsec-docs/unversioned/console/cti/cti_api_keys.mdx index 69d039950..8b6eba0db 100644 --- a/crowdsec-docs/unversioned/console/cti/cti_api_keys.mdx +++ b/crowdsec-docs/unversioned/console/cti/cti_api_keys.mdx @@ -3,7 +3,7 @@ title: CTI API Keys description: What can you access in the CTI API --- -import AcademyPromo from '@site/src/components/AcademyPromo'; +import AcademyPromo from '@site/src/components/academy-promo'; import ThemedImage from "@theme/ThemedImage"; import useBaseUrl from "@docusaurus/useBaseUrl"; diff --git a/crowdsec-docs/unversioned/console/getting_started.mdx b/crowdsec-docs/unversioned/console/getting_started.mdx index 823bd9676..bbd2ab78c 100644 --- a/crowdsec-docs/unversioned/console/getting_started.mdx +++ b/crowdsec-docs/unversioned/console/getting_started.mdx @@ -3,7 +3,7 @@ id: getting_started title: Getting started --- -import ConsolePromo from '@site/src/components/ConsolePromo.js'; +import ConsolePromo from '@site/src/components/console-promo'; # Getting Started diff --git a/crowdsec-docs/unversioned/cti_api/getting_started.mdx b/crowdsec-docs/unversioned/cti_api/getting_started.mdx index f55983e92..ef6338a75 100644 --- a/crowdsec-docs/unversioned/cti_api/getting_started.mdx +++ b/crowdsec-docs/unversioned/cti_api/getting_started.mdx @@ -4,7 +4,7 @@ title: CTI API Getting Started sidebar_position: 2 --- -import AcademyPromo from '@site/src/components/AcademyPromo'; +import AcademyPromo from '@site/src/components/academy-promo'; import ThemedImage from "@theme/ThemedImage"; import useBaseUrl from "@docusaurus/useBaseUrl"; diff --git a/crowdsec-docs/unversioned/cti_api/taxonomy/behaviors.mdx b/crowdsec-docs/unversioned/cti_api/taxonomy/behaviors.mdx index 8ebede675..bbaaf2779 100644 --- a/crowdsec-docs/unversioned/cti_api/taxonomy/behaviors.mdx +++ b/crowdsec-docs/unversioned/cti_api/taxonomy/behaviors.mdx @@ -5,8 +5,8 @@ sidebar_position: 6 --- -import TableRender from '@site/src/components/tableRender'; -import GithubIconRender from '@site/src/components/githubIconRender'; +import TableRender from '@site/src/components/table-render'; +import GithubIconRender from '@site/src/components/github-icon-renderer'; export const behaviorsURL = "https://hub-cdn.crowdsec.net/master/taxonomy/behaviors.json"; export const columns = [ diff --git a/crowdsec-docs/unversioned/cti_api/taxonomy/benign.mdx b/crowdsec-docs/unversioned/cti_api/taxonomy/benign.mdx index 87a10319e..4b2f05f6d 100644 --- a/crowdsec-docs/unversioned/cti_api/taxonomy/benign.mdx +++ b/crowdsec-docs/unversioned/cti_api/taxonomy/benign.mdx @@ -4,8 +4,8 @@ title: Benign Classifications sidebar_position: 7 --- -import TableRender from "@site/src/components/tableRender" -import GithubIconRender from "@site/src/components/githubIconRender" +import TableRender from "@site/src/components/table-render" +import GithubIconRender from "@site/src/components/github-icon-renderer" export const classificationsURL = "https://hub-cdn.crowdsec.net/master/taxonomy/classifications.json" diff --git a/crowdsec-docs/unversioned/cti_api/taxonomy/classifications.mdx b/crowdsec-docs/unversioned/cti_api/taxonomy/classifications.mdx index c98e18228..2344824ad 100644 --- a/crowdsec-docs/unversioned/cti_api/taxonomy/classifications.mdx +++ b/crowdsec-docs/unversioned/cti_api/taxonomy/classifications.mdx @@ -4,8 +4,8 @@ title: Classifications sidebar_position: 5 --- -import TableRender from "@site/src/components/tableRender" -import GithubIconRender from "@site/src/components/githubIconRender" +import TableRender from "@site/src/components/table-render" +import GithubIconRender from "@site/src/components/github-icon-renderer" export const classificationsURL = "https://hub-cdn.crowdsec.net/master/taxonomy/classifications.json" diff --git a/crowdsec-docs/unversioned/cti_api/taxonomy/false_positives.mdx b/crowdsec-docs/unversioned/cti_api/taxonomy/false_positives.mdx index 7f704685b..4fb4b2aaa 100644 --- a/crowdsec-docs/unversioned/cti_api/taxonomy/false_positives.mdx +++ b/crowdsec-docs/unversioned/cti_api/taxonomy/false_positives.mdx @@ -4,8 +4,8 @@ title: Safe Classifications sidebar_position: 7 --- -import TableRender from "@site/src/components/tableRender" -import GithubIconRender from "@site/src/components/githubIconRender" +import TableRender from "@site/src/components/table-render" +import GithubIconRender from "@site/src/components/github-icon-renderer" export const fpURL = "https://hub-cdn.crowdsec.net/master/taxonomy/false_positives.json" diff --git a/crowdsec-docs/unversioned/cti_api/taxonomy/scenarios.mdx b/crowdsec-docs/unversioned/cti_api/taxonomy/scenarios.mdx index 9aa44889e..409f0cc4f 100644 --- a/crowdsec-docs/unversioned/cti_api/taxonomy/scenarios.mdx +++ b/crowdsec-docs/unversioned/cti_api/taxonomy/scenarios.mdx @@ -4,8 +4,8 @@ title: Scenarios sidebar_position: 4 --- -import TableRender from '@site/src/components/tableRender'; -import GithubIconRender from '@site/src/components/githubIconRender'; +import TableRender from '@site/src/components/table-render'; +import GithubIconRender from '@site/src/components/github-icon-renderer'; export const scenarioURL = "https://hub-cdn.crowdsec.net/master/taxonomy/scenarios.json"; export const columns = [ diff --git a/crowdsec-docs/unversioned/getting_started/post_installation/acquisition_new.mdx b/crowdsec-docs/unversioned/getting_started/post_installation/acquisition_new.mdx index eff46ea87..4569f5504 100644 --- a/crowdsec-docs/unversioned/getting_started/post_installation/acquisition_new.mdx +++ b/crowdsec-docs/unversioned/getting_started/post_installation/acquisition_new.mdx @@ -9,7 +9,7 @@ pagination_next: getting_started/post_installation/profiles We will be adding a [file based acquisition](/docs/next/data_sources/file). If you need to use a different source then alter the instructions to match your needs. ::: -import FormattedTabs from '@site/src/components/FormattedTabs'; +import FormattedTabs from '@site/src/components/formatted-tabs'; Once you have found service you want to add, you can use the `cscli` command line tool to add the collection. diff --git a/crowdsec-docs/unversioned/getting_started/post_installation/acquisition_troubleshoot.mdx b/crowdsec-docs/unversioned/getting_started/post_installation/acquisition_troubleshoot.mdx index 318fc62d8..fd175fbd0 100644 --- a/crowdsec-docs/unversioned/getting_started/post_installation/acquisition_troubleshoot.mdx +++ b/crowdsec-docs/unversioned/getting_started/post_installation/acquisition_troubleshoot.mdx @@ -5,7 +5,7 @@ pagination_prev: getting_started/next_steps pagination_next: getting_started/post_installation/profiles --- -import FormattedTabs from '@site/src/components/FormattedTabs'; +import FormattedTabs from '@site/src/components/formatted-tabs'; # Troubleshoting Acquisition diff --git a/crowdsec-docs/unversioned/getting_started/post_installation/console.mdx b/crowdsec-docs/unversioned/getting_started/post_installation/console.mdx index bfe30e1cb..81749adba 100644 --- a/crowdsec-docs/unversioned/getting_started/post_installation/console.mdx +++ b/crowdsec-docs/unversioned/getting_started/post_installation/console.mdx @@ -5,7 +5,7 @@ title: CrowdSec Console import ThemedImage from "@theme/ThemedImage"; import useBaseUrl from "@docusaurus/useBaseUrl"; -import FormattedTabs from '@site/src/components/FormattedTabs'; +import FormattedTabs from '@site/src/components/formatted-tabs'; # CrowdSec Console diff --git a/crowdsec-docs/unversioned/getting_started/post_installation/console_blocklists.mdx b/crowdsec-docs/unversioned/getting_started/post_installation/console_blocklists.mdx index 136597860..07ffa83c6 100644 --- a/crowdsec-docs/unversioned/getting_started/post_installation/console_blocklists.mdx +++ b/crowdsec-docs/unversioned/getting_started/post_installation/console_blocklists.mdx @@ -5,7 +5,7 @@ title: CrowdSec Blocklists import ThemedImage from "@theme/ThemedImage"; import useBaseUrl from "@docusaurus/useBaseUrl"; -import FormattedTabs from '@site/src/components/FormattedTabs'; +import FormattedTabs from '@site/src/components/formatted-tabs'; # CrowdSec Blocklists diff --git a/crowdsec-docs/unversioned/getting_started/post_installation/profiles.mdx b/crowdsec-docs/unversioned/getting_started/post_installation/profiles.mdx index e91854704..c0a286d1c 100644 --- a/crowdsec-docs/unversioned/getting_started/post_installation/profiles.mdx +++ b/crowdsec-docs/unversioned/getting_started/post_installation/profiles.mdx @@ -3,7 +3,7 @@ id: profiles title: Profiles --- -import FormattedTabs from '@site/src/components/FormattedTabs'; +import FormattedTabs from '@site/src/components/formatted-tabs'; # Profiles diff --git a/crowdsec-docs/unversioned/getting_started/post_installation/troubleshoot.mdx b/crowdsec-docs/unversioned/getting_started/post_installation/troubleshoot.mdx index 47ad8ab54..84238c5c3 100644 --- a/crowdsec-docs/unversioned/getting_started/post_installation/troubleshoot.mdx +++ b/crowdsec-docs/unversioned/getting_started/post_installation/troubleshoot.mdx @@ -5,7 +5,7 @@ pagination_prev: getting_started/next_steps pagination_next: getting_started/next_steps --- -import FormattedTabs from '@site/src/components/FormattedTabs'; +import FormattedTabs from '@site/src/components/formatted-tabs'; # Troubleshoot diff --git a/crowdsec-docs/unversioned/troubleshooting/remediation_components.mdx b/crowdsec-docs/unversioned/troubleshooting/remediation_components.mdx index 336605fc2..e189be23f 100644 --- a/crowdsec-docs/unversioned/troubleshooting/remediation_components.mdx +++ b/crowdsec-docs/unversioned/troubleshooting/remediation_components.mdx @@ -3,7 +3,7 @@ title: Troubleshooting Remediation Components id: remediation_components --- -import FormattedTabs from '@site/src/components/FormattedTabs'; +import FormattedTabs from '@site/src/components/formatted-tabs'; ## Community support diff --git a/crowdsec-docs/unversioned/troubleshooting/security_engine.mdx b/crowdsec-docs/unversioned/troubleshooting/security_engine.mdx index 14d5d49f5..c79f14a89 100644 --- a/crowdsec-docs/unversioned/troubleshooting/security_engine.mdx +++ b/crowdsec-docs/unversioned/troubleshooting/security_engine.mdx @@ -3,7 +3,7 @@ title: Troubleshooting Security Engine id: security_engine --- -import FormattedTabs from '@site/src/components/FormattedTabs'; +import FormattedTabs from '@site/src/components/formatted-tabs'; ## Community support diff --git a/crowdsec-docs/versioned_docs/version-v1.5.0/console.md b/crowdsec-docs/versioned_docs/version-v1.5.0/console.md index 911c48027..49188c2b8 100644 --- a/crowdsec-docs/versioned_docs/version-v1.5.0/console.md +++ b/crowdsec-docs/versioned_docs/version-v1.5.0/console.md @@ -4,7 +4,7 @@ title: Console sidebar_position: 10 --- -import AcademyPromo from '@site/src/components/AcademyPromo'; +import AcademyPromo from '@site/src/components/academy-promo'; The [console](https://app.crowdsec.net) is a web interface hosted by crowdsec that allows you to get even more from crowdsec : - - aggregate, tag and classify your instances (without having them share a common local API) - - view/filter/export alerts in real-time - - get statistics and insights on your alerts compared - - organization management, MFA and more - - and much more + +- aggregate, tag and classify your instances (without having them share a common local API) +- view/filter/export alerts in real-time +- get statistics and insights on your alerts compared +- organization management, MFA and more +- and much more ![console-overview](/img/console-overview.png) Once your [registration done](https://app.crowdsec.net/signup), follow the tour ! - You will be able to register any instance directly from `cscli` : ```bash -sudo cscli console enroll +sudo cscli console enroll ``` And see what's going in the console : ![instance-overview](/img/console-instance-overview.png) - - ![stats-overview](/img/console-stats-overview.png) diff --git a/crowdsec-docs/versioned_docs/version-v1.5.0/getting_started/getting_started.md b/crowdsec-docs/versioned_docs/version-v1.5.0/getting_started/getting_started.md index 13aeb852f..0f1e7629d 100644 --- a/crowdsec-docs/versioned_docs/version-v1.5.0/getting_started/getting_started.md +++ b/crowdsec-docs/versioned_docs/version-v1.5.0/getting_started/getting_started.md @@ -3,7 +3,7 @@ id: getting_started title: Getting Started --- -import AcademyPromo from '@site/src/components/AcademyPromo'; +import AcademyPromo from '@site/src/components/academy-promo'; Welcome to CrowdSec! @@ -15,8 +15,7 @@ To embark on your CrowdSec journey, the optimal starting point is to set up a co The CrowdSec console serves as a web-based interface enabling you to conveniently monitor all your CrowdSec instances from a centralized hub. To get started, simply [sign up here](https://app.crowdsec.net/signup). - -## Deploy +## Deploy ### Walkthrough @@ -43,8 +42,9 @@ In our updated documentation, we now refer to CrowdSec as the "Security Engine" #### Prerequisites The Security Engine by default uses the following ports: - - 8080/tcp for the API - - 6060/tcp for the Prometheus metrics / Debugging + +- 8080/tcp for the API +- 6060/tcp for the Prometheus metrics / Debugging If these ports are not available on your system, you can change them in the configuration file post installation. See [Configuration](/configuration/crowdsec_configuration.md) for more information. @@ -55,9 +55,10 @@ Please note that the API is mandatory for your security engine, do not remove it For the most straightforward installation of the Security Engine, utilize the official repository, guaranteeing you'll constantly have the latest version. Please see the relevant documentation for your OS: -- [Linux](/getting_started/install.mdx) -- [FreeBSD](/getting_started/install_freebsd.md) -- [Windows](/getting_started/getting_started_on_windows.md) + +- [Linux](/getting_started/install.mdx) +- [FreeBSD](/getting_started/install_freebsd.md) +- [Windows](/getting_started/getting_started_on_windows.md) #### Installing from source @@ -75,4 +76,4 @@ If you are uncertain about which one to install, please refer to our [Remediatio ## Enroll -Since you created your account on the CrowdSec console, you can now enroll your Security Engine to your account. \ No newline at end of file +Since you created your account on the CrowdSec console, you can now enroll your Security Engine to your account. diff --git a/crowdsec-docs/versioned_docs/version-v1.5.0/observability/prometheus.md b/crowdsec-docs/versioned_docs/version-v1.5.0/observability/prometheus.md index 0c48c7a2c..64dfde923 100644 --- a/crowdsec-docs/versioned_docs/version-v1.5.0/observability/prometheus.md +++ b/crowdsec-docs/versioned_docs/version-v1.5.0/observability/prometheus.md @@ -4,16 +4,16 @@ title: Prometheus sidebar_position: 4 --- -import AcademyPromo from '@site/src/components/AcademyPromo'; +import AcademyPromo from '@site/src/components/academy-promo'; CrowdSec can expose a [prometheus](https://github.com/prometheus/client_golang) endpoint for collection (on `http://127.0.0.1:6060/metrics` by default). You can edit the listen_addr in [config.yaml](/configuration/crowdsec_configuration.md#prometheus) to allow an external Prometheus to scrape the metrics. The goal of this endpoint, besides the usual resources consumption monitoring, aims at offering a view of CrowdSec "applicative" behavior : - - is it processing a lot of logs ? is it parsing them successfully ? - - are a lot of scenarios being triggered ? - - are a lot of IPs banned ? - - etc. +- is it processing a lot of logs ? is it parsing them successfully ? +- are a lot of scenarios being triggered ? +- are a lot of IPs banned ? +- etc. All the counters are "since CrowdSec start". @@ -21,16 +21,15 @@ All the counters are "since CrowdSec start". #### Scenarios - - `cs_buckets` : number of scenario that currently exist - - `cs_bucket_created_total` : total number of instantiation of each scenario - - `cs_bucket_overflowed_total` : total number of overflow of each scenario - - `cs_bucket_underflowed_total` : total number of underflow of each scenario (bucket was created but expired because of lack of events) - - `cs_bucket_poured_total` : total number of event poured to each scenario with source as complementary key +- `cs_buckets` : number of scenario that currently exist +- `cs_bucket_created_total` : total number of instantiation of each scenario +- `cs_bucket_overflowed_total` : total number of overflow of each scenario +- `cs_bucket_underflowed_total` : total number of underflow of each scenario (bucket was created but expired because of lack of events) +- `cs_bucket_poured_total` : total number of event poured to each scenario with source as complementary key
example - ``` #2030 lines from `/var/log/nginx/access.log` were poured to `crowdsecurity/http-scan-uniques_404` scenario cs_bucket_poured_total{name="crowdsecurity/http-scan-uniques_404",source="/var/log/nginx/access.log"} 2030 @@ -38,15 +37,13 @@ cs_bucket_poured_total{name="crowdsecurity/http-scan-uniques_404",source="/var/l
- #### Parsers - - `cs_node_hits_total` : how many times an event from a specific source was processed by a parser node : +- `cs_node_hits_total` : how many times an event from a specific source was processed by a parser node :
example - ``` # 235 lines from `auth.log` were processed by the `crowdsecurity/dateparse-enrich` parser cs_node_hits_total{name="crowdsecurity/dateparse-enrich",source="/var/log/auth.log"} 235 @@ -54,12 +51,11 @@ cs_node_hits_total{name="crowdsecurity/dateparse-enrich",source="/var/log/auth.l
- - `cs_node_hits_ko_total` : how many times an event from a specific was unsuccessfully parsed by a specific parser +- `cs_node_hits_ko_total` : how many times an event from a specific was unsuccessfully parsed by a specific parser
example - ``` # 2112 lines from `error.log` failed to be parsed by `crowdsecurity/http-logs` cs_node_hits_ko_total{name="crowdsecurity/http-logs",source="/var/log/nginx/error.log"} 2112 @@ -67,12 +63,11 @@ cs_node_hits_ko_total{name="crowdsecurity/http-logs",source="/var/log/nginx/erro
- - `cs_node_hits_ok_total` : how many times an event from a specific source was successfully parsed by a specific parser - - - `cs_parser_hits_total` : how many times an event from a source has hit the parser - - `cs_parser_hits_ok_total` : how many times an event from a source was successfully parsed - - `cs_parser_hits_ko_total` : how many times an event from a source was unsuccessfully parsed +- `cs_node_hits_ok_total` : how many times an event from a specific source was successfully parsed by a specific parser +- `cs_parser_hits_total` : how many times an event from a source has hit the parser +- `cs_parser_hits_ok_total` : how many times an event from a source was successfully parsed +- `cs_parser_hits_ko_total` : how many times an event from a source was unsuccessfully parsed #### Acquisition @@ -80,33 +75,33 @@ Acquisition metrics are split by datasource. The following metrics are available ##### Cloudwatch - - `cs_cloudwatch_openstreams_total` : number of opened stream within group (by group) - - `cs_cloudwatch_stream_hits_total` : number of event read from stream (by group and by stream) +- `cs_cloudwatch_openstreams_total` : number of opened stream within group (by group) +- `cs_cloudwatch_stream_hits_total` : number of event read from stream (by group and by stream) ##### Files - - `cs_filesource_hits_total` : Total lines that were read (by source file) - +- `cs_filesource_hits_total` : Total lines that were read (by source file) + ##### Journald - - `cs_journalctlsource_hits_total` : Total lines that were read (by source filter) +- `cs_journalctlsource_hits_total` : Total lines that were read (by source filter) ##### Syslog - - `cs_syslogsource_hits_total` : Total lines that were received (by the syslog server) - - `cs_syslogsource_parsed_total` : Total lines that were successfully parsed by the syslog server +- `cs_syslogsource_hits_total` : Total lines that were received (by the syslog server) +- `cs_syslogsource_parsed_total` : Total lines that were successfully parsed by the syslog server #### Local API - - `cs_lapi_route_requests_total` : number of calls to each route per method - - `cs_lapi_machine_requests_total` : number of calls to each route per method grouped by machines - - `cs_lapi_bouncer_requests_total` : number of calls to each route per method grouped by bouncers - - `cs_lapi_decisions_ko_total` : number of unsuccessfully responses when bouncers ask for an IP. - - `cs_lapi_decisions_ok_total` : number of successfully responses when bouncers ask for an IP. +- `cs_lapi_route_requests_total` : number of calls to each route per method +- `cs_lapi_machine_requests_total` : number of calls to each route per method grouped by machines +- `cs_lapi_bouncer_requests_total` : number of calls to each route per method grouped by bouncers +- `cs_lapi_decisions_ko_total` : number of unsuccessfully responses when bouncers ask for an IP. +- `cs_lapi_decisions_ok_total` : number of successfully responses when bouncers ask for an IP. #### Info - - `cs_info` : Information about CrowdSec (software version) +- `cs_info` : Information about CrowdSec (software version) \ No newline at end of file +/> diff --git a/crowdsec-docs/versioned_docs/version-v1.5.0/scenarios/create.md b/crowdsec-docs/versioned_docs/version-v1.5.0/scenarios/create.md index eab6425d6..6d471368f 100644 --- a/crowdsec-docs/versioned_docs/version-v1.5.0/scenarios/create.md +++ b/crowdsec-docs/versioned_docs/version-v1.5.0/scenarios/create.md @@ -4,7 +4,7 @@ title: Creating scenarios sidebar_position: 4 --- -import AcademyPromo from '@site/src/components/AcademyPromo'; +import AcademyPromo from '@site/src/components/academy-promo'; :::caution @@ -12,7 +12,6 @@ All the examples assume that you have read the [Creating parsers](/docs/next/par ::: - ## Foreword This documentation assumes you're trying to create a scenario for crowdsec with the intent of submitting to the hub, and thus create the associated functional testing. @@ -47,7 +46,6 @@ has to be `.yaml`. ## Pre-requisites - 1. [Create a local test environment](https://doc.crowdsec.net/docs/contributing/contributing_test_env) 2. Clone the hub @@ -56,7 +54,6 @@ has to be `.yaml`. git clone https://github.com/crowdsecurity/hub.git ``` - ## Create our test From the root of the hub repository : @@ -72,31 +69,27 @@ From the root of the hub repository : Configuration File : /home/dev/github/hub/.tests/myservice-bf/config.yaml (please fill it with parsers, scenarios...) ``` -__note: we specify the `--ignore-parsers` flag because we don't want to test the parsers, only the scenarios.__ - +**note: we specify the `--ignore-parsers` flag because we don't want to test the parsers, only the scenarios.** ## Configure our test - Let's add our parser and scenario to the test configuration (`.tests/myservice-bf/config.yaml`) file. ```yaml parsers: -- crowdsecurity/syslog-logs -- crowdsecurity/dateparse-enrich -- ./parsers/s01-parse/crowdsecurity/myservice-logs.yaml + - crowdsecurity/syslog-logs + - crowdsecurity/dateparse-enrich + - ./parsers/s01-parse/crowdsecurity/myservice-logs.yaml scenarios: -- ./scenarios/crowdsecurity/myservice-bf.yaml + - ./scenarios/crowdsecurity/myservice-bf.yaml postoverflows: -- "" + - "" log_file: myservice-bf.log log_type: syslog ignore_parsers: true - ``` -__note: as our custom parser and scenario are not yet part of the hub, we specify their path relative to the root of the hub directory.__ - +**note: as our custom parser and scenario are not yet part of the hub, we specify their path relative to the root of the hub directory.** ## Scenario creation @@ -114,41 +107,36 @@ groupby: evt.Meta.source_ip blackhole: 1m reprocess: true labels: - service: myservice - type: bruteforce - remediation: true + service: myservice + type: bruteforce + remediation: true ``` - :::note We filter on `evt.Meta.log_type == 'myservice_failed_auth'` because in the parser `myservice-logs` (created in the [Creating parsers](/docs/next/parsers/create) part) we set the `log_type` to `myservice_failed_auth` for bad password or bad user attempt. ::: - We have the following fields: - - a [type](/scenarios/format.md#type): the type of bucket to use (trigger or leaky). - - a [name](/scenarios/format.md#name) - - a [description](/scenarios/format.md#description) - - a [filter](/scenarios/format.md#type): the filter to apply on events to be filled in this bucket. - - a [leakspeed](/scenarios/format.md#leakspeed) - - a [capacity](/scenarios/format.md#capacity): the number of events in the bucket before it overflows. - - a [groupby](/scenarios/format.md#groupby): a field from the event to partition the bucket. It is often the `source_ip` of the event. - - a [blackhole](/scenarios/format.md#blackhole): the number of minute to not retrigger this scenario for the same `groupby` field. - - a [reprocess](/scenarios/format.md#reprocess): ingest the alert in crowdsec for further processing. - - some [labels](/scenarios/format.md#labels): some labels to apply on the trigger event. Don't forget to set `remediation: true` if you want the IP to be blocked by bouncers. - - - +- a [type](/scenarios/format.md#type): the type of bucket to use (trigger or leaky). +- a [name](/scenarios/format.md#name) +- a [description](/scenarios/format.md#description) +- a [filter](/scenarios/format.md#type): the filter to apply on events to be filled in this bucket. +- a [leakspeed](/scenarios/format.md#leakspeed) +- a [capacity](/scenarios/format.md#capacity): the number of events in the bucket before it overflows. +- a [groupby](/scenarios/format.md#groupby): a field from the event to partition the bucket. It is often the `source_ip` of the event. +- a [blackhole](/scenarios/format.md#blackhole): the number of minute to not retrigger this scenario for the same `groupby` field. +- a [reprocess](/scenarios/format.md#reprocess): ingest the alert in crowdsec for further processing. +- some [labels](/scenarios/format.md#labels): some labels to apply on the trigger event. Don't forget to set `remediation: true` if you want the IP to be blocked by bouncers. We can then "test" our scenario like this : ```bash β–Ά cscli hubtest run myservice-bf -INFO[01-10-2021 12:41:21 PM] Running test 'myservice-bf' -WARN[01-10-2021 12:41:24 PM] Assert file '/home/dev/github/hub/.tests/myservice-bf/scenario.assert' is empty, generating assertion: +INFO[01-10-2021 12:41:21 PM] Running test 'myservice-bf' +WARN[01-10-2021 12:41:24 PM] Assert file '/home/dev/github/hub/.tests/myservice-bf/scenario.assert' is empty, generating assertion: len(results) == 1 "192.168.1.1" in results[0].Overflow.GetSources() @@ -175,11 +163,10 @@ Please fill your assert file(s) for test 'myservice-bf', exiting ``` -What happened here ? - -- The scenario has been triggered and is generating some assertion (for functional test) -- In production environment, an alert would have been send to the CrowdSec Local API. +What happened here ? +- The scenario has been triggered and is generating some assertion (for functional test) +- In production environment, an alert would have been send to the CrowdSec Local API. We can again understand more of what is going on thanks to `cscli hubtest explain` : @@ -269,4 +256,4 @@ See as well [this blog article](https://crowdsec.net/blog/how-to-write-crowdsec- title="More ways to learn" course="writing-parsers-and-scenarios" utm="?utm_source=docs&utm_medium=banner&utm_campaign=scenario-page&utm_id=academydocs" -/> \ No newline at end of file +/> diff --git a/crowdsec-docs/versioned_docs/version-v1.6.0/getting_started/getting_started.md b/crowdsec-docs/versioned_docs/version-v1.6.0/getting_started/getting_started.md index 2aa6b14f4..17c415256 100644 --- a/crowdsec-docs/versioned_docs/version-v1.6.0/getting_started/getting_started.md +++ b/crowdsec-docs/versioned_docs/version-v1.6.0/getting_started/getting_started.md @@ -3,7 +3,7 @@ id: getting_started title: Getting Started --- -import AcademyPromo from '@site/src/components/AcademyPromo'; +import AcademyPromo from '@site/src/components/academy-promo'; Welcome to CrowdSec! @@ -15,8 +15,7 @@ To embark on your CrowdSec journey, the optimal starting point is to set up a co The CrowdSec console serves as a web-based interface enabling you to conveniently monitor all your CrowdSec instances from a centralized hub. To get started, simply [sign up here](https://app.crowdsec.net/signup). - -## Deploy +## Deploy ### Walkthrough @@ -43,8 +42,9 @@ In our updated documentation, we now refer to CrowdSec as the "Security Engine" #### Prerequisites The Security Engine by default uses the following ports: - - 8080/tcp for the API - - 6060/tcp for the Prometheus metrics / Debugging + +- 8080/tcp for the API +- 6060/tcp for the Prometheus metrics / Debugging If these ports are not available on your system, you can change them in the configuration file post installation. See [Configuration](/configuration/crowdsec_configuration.md) for more information. @@ -55,15 +55,15 @@ Please note that the API is mandatory for your security engine, do not remove it For the most straightforward installation of the Security Engine, utilize the official repository, guaranteeing you'll constantly have the latest version. Please see the relevant documentation for your OS: -- [Linux](/getting_started/install.mdx) -- [FreeBSD](/getting_started/install_freebsd.md) -- [Windows](/getting_started/getting_started_on_windows.md) + +- [Linux](/getting_started/install.mdx) +- [FreeBSD](/getting_started/install_freebsd.md) +- [Windows](/getting_started/getting_started_on_windows.md) #### Installing from source Should you opt for a source-based installation, you can follow the steps outlined [here](/getting_started/install_source.mdx). - ### Remediation Component After installing the Security Engine, you can proceed to install a Remediation Component, which is responsible for executing actions based on the decisions made by the Security Engine. @@ -76,4 +76,4 @@ If you are uncertain about which one to install, please refer to our [Remediatio Since you created your account on the CrowdSec console, you can now [enroll your Security Engine to your account](https://app.crowdsec.net/security-engines?enroll-engine=true). -To do so, you can find steps outlined [here](/u/getting_started/post_installation/console/#engines-page). \ No newline at end of file +To do so, you can find steps outlined [here](/u/getting_started/post_installation/console/#engines-page). diff --git a/crowdsec-docs/versioned_docs/version-v1.6.0/intro.mdx b/crowdsec-docs/versioned_docs/version-v1.6.0/intro.mdx index 9c1f29cc6..695f35751 100644 --- a/crowdsec-docs/versioned_docs/version-v1.6.0/intro.mdx +++ b/crowdsec-docs/versioned_docs/version-v1.6.0/intro.mdx @@ -4,7 +4,7 @@ id: intro --- import useBaseUrl from "@docusaurus/useBaseUrl" -import AcademyPromo from "@site/src/components/AcademyPromo" +import AcademyPromo from "@site/src/components/academy-promo" # Security Engine Overview diff --git a/crowdsec-docs/versioned_docs/version-v1.6.0/observability/prometheus.md b/crowdsec-docs/versioned_docs/version-v1.6.0/observability/prometheus.md index 0c48c7a2c..64dfde923 100644 --- a/crowdsec-docs/versioned_docs/version-v1.6.0/observability/prometheus.md +++ b/crowdsec-docs/versioned_docs/version-v1.6.0/observability/prometheus.md @@ -4,16 +4,16 @@ title: Prometheus sidebar_position: 4 --- -import AcademyPromo from '@site/src/components/AcademyPromo'; +import AcademyPromo from '@site/src/components/academy-promo'; CrowdSec can expose a [prometheus](https://github.com/prometheus/client_golang) endpoint for collection (on `http://127.0.0.1:6060/metrics` by default). You can edit the listen_addr in [config.yaml](/configuration/crowdsec_configuration.md#prometheus) to allow an external Prometheus to scrape the metrics. The goal of this endpoint, besides the usual resources consumption monitoring, aims at offering a view of CrowdSec "applicative" behavior : - - is it processing a lot of logs ? is it parsing them successfully ? - - are a lot of scenarios being triggered ? - - are a lot of IPs banned ? - - etc. +- is it processing a lot of logs ? is it parsing them successfully ? +- are a lot of scenarios being triggered ? +- are a lot of IPs banned ? +- etc. All the counters are "since CrowdSec start". @@ -21,16 +21,15 @@ All the counters are "since CrowdSec start". #### Scenarios - - `cs_buckets` : number of scenario that currently exist - - `cs_bucket_created_total` : total number of instantiation of each scenario - - `cs_bucket_overflowed_total` : total number of overflow of each scenario - - `cs_bucket_underflowed_total` : total number of underflow of each scenario (bucket was created but expired because of lack of events) - - `cs_bucket_poured_total` : total number of event poured to each scenario with source as complementary key +- `cs_buckets` : number of scenario that currently exist +- `cs_bucket_created_total` : total number of instantiation of each scenario +- `cs_bucket_overflowed_total` : total number of overflow of each scenario +- `cs_bucket_underflowed_total` : total number of underflow of each scenario (bucket was created but expired because of lack of events) +- `cs_bucket_poured_total` : total number of event poured to each scenario with source as complementary key
example - ``` #2030 lines from `/var/log/nginx/access.log` were poured to `crowdsecurity/http-scan-uniques_404` scenario cs_bucket_poured_total{name="crowdsecurity/http-scan-uniques_404",source="/var/log/nginx/access.log"} 2030 @@ -38,15 +37,13 @@ cs_bucket_poured_total{name="crowdsecurity/http-scan-uniques_404",source="/var/l
- #### Parsers - - `cs_node_hits_total` : how many times an event from a specific source was processed by a parser node : +- `cs_node_hits_total` : how many times an event from a specific source was processed by a parser node :
example - ``` # 235 lines from `auth.log` were processed by the `crowdsecurity/dateparse-enrich` parser cs_node_hits_total{name="crowdsecurity/dateparse-enrich",source="/var/log/auth.log"} 235 @@ -54,12 +51,11 @@ cs_node_hits_total{name="crowdsecurity/dateparse-enrich",source="/var/log/auth.l
- - `cs_node_hits_ko_total` : how many times an event from a specific was unsuccessfully parsed by a specific parser +- `cs_node_hits_ko_total` : how many times an event from a specific was unsuccessfully parsed by a specific parser
example - ``` # 2112 lines from `error.log` failed to be parsed by `crowdsecurity/http-logs` cs_node_hits_ko_total{name="crowdsecurity/http-logs",source="/var/log/nginx/error.log"} 2112 @@ -67,12 +63,11 @@ cs_node_hits_ko_total{name="crowdsecurity/http-logs",source="/var/log/nginx/erro
- - `cs_node_hits_ok_total` : how many times an event from a specific source was successfully parsed by a specific parser - - - `cs_parser_hits_total` : how many times an event from a source has hit the parser - - `cs_parser_hits_ok_total` : how many times an event from a source was successfully parsed - - `cs_parser_hits_ko_total` : how many times an event from a source was unsuccessfully parsed +- `cs_node_hits_ok_total` : how many times an event from a specific source was successfully parsed by a specific parser +- `cs_parser_hits_total` : how many times an event from a source has hit the parser +- `cs_parser_hits_ok_total` : how many times an event from a source was successfully parsed +- `cs_parser_hits_ko_total` : how many times an event from a source was unsuccessfully parsed #### Acquisition @@ -80,33 +75,33 @@ Acquisition metrics are split by datasource. The following metrics are available ##### Cloudwatch - - `cs_cloudwatch_openstreams_total` : number of opened stream within group (by group) - - `cs_cloudwatch_stream_hits_total` : number of event read from stream (by group and by stream) +- `cs_cloudwatch_openstreams_total` : number of opened stream within group (by group) +- `cs_cloudwatch_stream_hits_total` : number of event read from stream (by group and by stream) ##### Files - - `cs_filesource_hits_total` : Total lines that were read (by source file) - +- `cs_filesource_hits_total` : Total lines that were read (by source file) + ##### Journald - - `cs_journalctlsource_hits_total` : Total lines that were read (by source filter) +- `cs_journalctlsource_hits_total` : Total lines that were read (by source filter) ##### Syslog - - `cs_syslogsource_hits_total` : Total lines that were received (by the syslog server) - - `cs_syslogsource_parsed_total` : Total lines that were successfully parsed by the syslog server +- `cs_syslogsource_hits_total` : Total lines that were received (by the syslog server) +- `cs_syslogsource_parsed_total` : Total lines that were successfully parsed by the syslog server #### Local API - - `cs_lapi_route_requests_total` : number of calls to each route per method - - `cs_lapi_machine_requests_total` : number of calls to each route per method grouped by machines - - `cs_lapi_bouncer_requests_total` : number of calls to each route per method grouped by bouncers - - `cs_lapi_decisions_ko_total` : number of unsuccessfully responses when bouncers ask for an IP. - - `cs_lapi_decisions_ok_total` : number of successfully responses when bouncers ask for an IP. +- `cs_lapi_route_requests_total` : number of calls to each route per method +- `cs_lapi_machine_requests_total` : number of calls to each route per method grouped by machines +- `cs_lapi_bouncer_requests_total` : number of calls to each route per method grouped by bouncers +- `cs_lapi_decisions_ko_total` : number of unsuccessfully responses when bouncers ask for an IP. +- `cs_lapi_decisions_ok_total` : number of successfully responses when bouncers ask for an IP. #### Info - - `cs_info` : Information about CrowdSec (software version) +- `cs_info` : Information about CrowdSec (software version) \ No newline at end of file +/> diff --git a/crowdsec-docs/versioned_docs/version-v1.6.0/scenarios/create.md b/crowdsec-docs/versioned_docs/version-v1.6.0/scenarios/create.md index 86e16ef43..45467a7ae 100644 --- a/crowdsec-docs/versioned_docs/version-v1.6.0/scenarios/create.md +++ b/crowdsec-docs/versioned_docs/version-v1.6.0/scenarios/create.md @@ -4,7 +4,7 @@ title: Creating scenarios sidebar_position: 4 --- -import AcademyPromo from '@site/src/components/AcademyPromo'; +import AcademyPromo from '@site/src/components/academy-promo'; :::caution @@ -77,13 +77,13 @@ Let's add our parser and scenario to the test configuration (`.tests/myservice-b ```yaml parsers: - - crowdsecurity/syslog-logs - - crowdsecurity/dateparse-enrich - - ./parsers/s01-parse/crowdsecurity/myservice-logs.yaml + - crowdsecurity/syslog-logs + - crowdsecurity/dateparse-enrich + - ./parsers/s01-parse/crowdsecurity/myservice-logs.yaml scenarios: - - ./scenarios/crowdsecurity/myservice-bf.yaml + - ./scenarios/crowdsecurity/myservice-bf.yaml postoverflows: - - "" + - "" log_file: myservice-bf.log log_type: syslog ignore_parsers: true @@ -126,16 +126,16 @@ We filter on `evt.Meta.log_type == 'myservice_failed_auth'` because in the parse We have the following fields: -- a [type](/scenarios/format.md#type): the type of bucket to use (trigger or leaky). -- a [name](/scenarios/format.md#name) -- a [description](/scenarios/format.md#description) -- a [filter](/scenarios/format.md#type): the filter to apply on events to be filled in this bucket. -- a [leakspeed](/scenarios/format.md#leakspeed) -- a [capacity](/scenarios/format.md#capacity): the number of events in the bucket before it overflows. -- a [groupby](/scenarios/format.md#groupby): a field from the event to partition the bucket. It is often the `source_ip` of the event. -- a [blackhole](/scenarios/format.md#blackhole): the number of minute to not retrigger this scenario for the same `groupby` field. -- a [reprocess](/scenarios/format.md#reprocess): ingest the alert in crowdsec for further processing. -- some [labels](/scenarios/format.md#labels): Some labels are mandatory and the scenario will not be validated by the Hub if they are missing. Don't forget to set `remediation: true` if you want the IP to be blocked by bouncers. +- a [type](/scenarios/format.md#type): the type of bucket to use (trigger or leaky). +- a [name](/scenarios/format.md#name) +- a [description](/scenarios/format.md#description) +- a [filter](/scenarios/format.md#type): the filter to apply on events to be filled in this bucket. +- a [leakspeed](/scenarios/format.md#leakspeed) +- a [capacity](/scenarios/format.md#capacity): the number of events in the bucket before it overflows. +- a [groupby](/scenarios/format.md#groupby): a field from the event to partition the bucket. It is often the `source_ip` of the event. +- a [blackhole](/scenarios/format.md#blackhole): the number of minute to not retrigger this scenario for the same `groupby` field. +- a [reprocess](/scenarios/format.md#reprocess): ingest the alert in crowdsec for further processing. +- some [labels](/scenarios/format.md#labels): Some labels are mandatory and the scenario will not be validated by the Hub if they are missing. Don't forget to set `remediation: true` if you want the IP to be blocked by bouncers. We can then "test" our scenario like this : @@ -171,8 +171,8 @@ Please fill your assert file(s) for test 'myservice-bf', exiting What happened here ? -- The scenario has been triggered and is generating some assertion (for functional test) -- In production environment, an alert would have been send to the CrowdSec Local API. +- The scenario has been triggered and is generating some assertion (for functional test) +- In production environment, an alert would have been send to the CrowdSec Local API. We can again understand more of what is going on thanks to `cscli hubtest explain` : From 2c9a1843bd958293700d588cce389dd473773fc2 Mon Sep 17 00:00:00 2001 From: Roussange Alexandre Date: Thu, 3 Jul 2025 16:14:39 +0200 Subject: [PATCH 2/9] feat: :building_construction: add biome linter and formatter + add linter GH action --- .github/workflows/lint.yaml | 31 + README.md | 15 + biome.json | 48 + crowdsec-docs/.prettierrc | 6 - crowdsec-docs/docusaurus.config.ts | 499 +++--- crowdsec-docs/package-lock.json | 164 ++ crowdsec-docs/package.json | 3 + crowdsec-docs/plugins/gtag/gtag.ts | 26 +- crowdsec-docs/plugins/gtag/index.ts | 6 +- crowdsec-docs/plugins/gtag/validate.ts | 53 +- crowdsec-docs/plugins/tailwind-config.ts | 6 +- crowdsec-docs/sidebars.ts | 1554 ++++++++--------- crowdsec-docs/sidebarsUnversioned.ts | 18 +- .../components/RemediationSupportBadges.tsx | 59 - .../src/components/academy-promo.tsx | 59 +- crowdsec-docs/src/components/console-ad.tsx | 32 +- .../src/components/console-promo.tsx | 50 +- .../src/components/formatted-tabs.tsx | 250 ++- .../src/components/get-to-know-us.tsx | 192 +- .../src/components/github-icon-renderer.tsx | 26 +- .../src/components/home-page/features.tsx | 192 +- crowdsec-docs/src/components/quick-start.tsx | 197 +-- .../components/remediation-features/index.tsx | 32 +- .../components/remediation-support-badge.tsx | 66 + crowdsec-docs/src/components/table-render.tsx | 163 +- crowdsec-docs/src/pages/index.tsx | 119 +- crowdsec-docs/src/theme/Root.tsx | 18 +- crowdsec-docs/src/theme/TOC/index.tsx | 30 +- .../src/theme/doc-item/layout/index.tsx | 87 +- crowdsec-docs/src/ui/tooltip.tsx | 7 +- crowdsec-docs/src/utils/index.ts | 4 +- crowdsec-docs/tsconfig.json | 5 +- .../unversioned/bouncers/aws-waf.mdx | 2 +- .../unversioned/bouncers/blocklist-mirror.mdx | 2 +- .../bouncers/cloudflare-workers.mdx | 2 +- .../unversioned/bouncers/cloudflare.mdx | 2 +- crowdsec-docs/unversioned/bouncers/custom.mdx | 2 +- crowdsec-docs/unversioned/bouncers/fastly.mdx | 2 +- .../unversioned/bouncers/firewall.mdx | 2 +- .../unversioned/bouncers/haproxy.mdx | 2 +- .../unversioned/bouncers/ingress-nginx.mdx | 2 +- .../unversioned/bouncers/magento.mdx | 2 +- .../bouncers/misp-feed-generator.mdx | 2 +- crowdsec-docs/unversioned/bouncers/nginx.mdx | 2 +- .../unversioned/bouncers/openresty.mdx | 2 +- .../unversioned/bouncers/php-lib.mdx | 2 +- crowdsec-docs/unversioned/bouncers/php.mdx | 2 +- .../unversioned/bouncers/windows-firewall.mdx | 2 +- .../unversioned/bouncers/wordpress.mdx | 2 +- 49 files changed, 2041 insertions(+), 2010 deletions(-) create mode 100644 .github/workflows/lint.yaml create mode 100644 biome.json delete mode 100644 crowdsec-docs/.prettierrc delete mode 100644 crowdsec-docs/src/components/RemediationSupportBadges.tsx create mode 100644 crowdsec-docs/src/components/remediation-support-badge.tsx diff --git a/.github/workflows/lint.yaml b/.github/workflows/lint.yaml new file mode 100644 index 000000000..b752cdfa5 --- /dev/null +++ b/.github/workflows/lint.yaml @@ -0,0 +1,31 @@ +name: Code quality + +on: + pull_request: + +jobs: + quality: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: 20 + cache: "npm" + cache-dependency-path: crowdsec-docs/package-lock.json + + + - name: Install dependencies + run: npm ci + working-directory: ./crowdsec-docs/ + + - name: Setup Biome + uses: biomejs/setup-biome@v2 + with: + version: latest + + - name: Run Biome + run: biome ci . \ No newline at end of file diff --git a/README.md b/README.md index 755f68ab4..4630bcf8a 100644 --- a/README.md +++ b/README.md @@ -6,6 +6,12 @@ Online version of this documentation is available here: https://doc.crowdsec.net The documentation is built using [Docusaurus](https://docusaurus.io/), a modern static website generator. +## Pre-requisites + +- Node.js (version 20 or later) +- npm (Node package manager) +- VSCode with recommended extensions installed (see `.vscode/extensions.json`) + ## Installation ```console @@ -28,3 +34,12 @@ npm run build This command generates static content into the `build` directory and can be served using any static contents hosting service. you can also use the `npm run serve` command to test the build locally. + +## Linting and Formatting + +This project uses [Biomes](https://biomejs.dev/) for linting and formatting. You can run the following commands: + +```console +npm run lint +npm run format +``` diff --git a/biome.json b/biome.json new file mode 100644 index 000000000..38668d395 --- /dev/null +++ b/biome.json @@ -0,0 +1,48 @@ +{ + "$schema": "https://biomejs.dev/schemas/2.0.6/schema.json", + "vcs": { "enabled": false, "clientKind": "git", "useIgnoreFile": false }, + "files": { + "ignoreUnknown": false, + "includes": ["crowdsec-docs/**/*.ts", "crowdsec-docs/**/*.tsx", "!**/node_modules/**", "!crowdsec-docs/plugins/**"] + }, + "formatter": { + "enabled": true, + "formatWithErrors": false, + "indentStyle": "tab", + "indentWidth": 4, + "lineEnding": "lf", + "lineWidth": 140, + "attributePosition": "auto", + "bracketSameLine": false, + "bracketSpacing": true, + "expand": "auto", + "useEditorconfig": true + }, + "linter": { + "enabled": true, + "rules": { + "recommended": true, + "style": { + "useImportType": "off" + } + } + }, + "javascript": { + "formatter": { + "jsxQuoteStyle": "double", + "quoteProperties": "asNeeded", + "trailingCommas": "es5", + "semicolons": "asNeeded", + "arrowParentheses": "always", + "bracketSameLine": false, + "quoteStyle": "double", + "attributePosition": "auto", + "bracketSpacing": true + } + }, + "html": { "formatter": { "selfCloseVoidElements": "always" } }, + "assist": { + "enabled": true, + "actions": { "source": { "organizeImports": "on" } } + } +} diff --git a/crowdsec-docs/.prettierrc b/crowdsec-docs/.prettierrc deleted file mode 100644 index 87cf9d60a..000000000 --- a/crowdsec-docs/.prettierrc +++ /dev/null @@ -1,6 +0,0 @@ -{ - "trailingComma": "es5", - "tabWidth": 4, - "semi": false, - "singleQuote": false -} diff --git a/crowdsec-docs/docusaurus.config.ts b/crowdsec-docs/docusaurus.config.ts index 2c891c673..758402591 100644 --- a/crowdsec-docs/docusaurus.config.ts +++ b/crowdsec-docs/docusaurus.config.ts @@ -1,282 +1,275 @@ -import { Config } from "@docusaurus/types" import type * as Preset from "@docusaurus/preset-classic" +import type { NavbarItem } from "@docusaurus/theme-common" +import type { Config } from "@docusaurus/types" import { themes } from "prism-react-renderer" -import sidebarsUnversionedConfig, { - remediationSideBar, - ctiApiSidebar, - guidesSideBar, -} from "./sidebarsUnversioned" - import tailwindPlugin from "./plugins/tailwind-config" -import { NavbarItem } from "@docusaurus/theme-common" +import { ctiApiSidebar, guidesSideBar, remediationSideBar } from "./sidebarsUnversioned" const generateCurrentAndNextRedirects = (s) => [ - { - from: `/docs/${s}`, - to: `/u/${s}`, - }, - { - from: `/docs/next/${s}`, - to: `/u/${s}`, - }, + { + from: `/docs/${s}`, + to: `/u/${s}`, + }, + { + from: `/docs/next/${s}`, + to: `/u/${s}`, + }, ] +function handleSidebarItems(items) { + const arr = [] + for (const item of items) { + if (typeof item === "string") { + arr.push(...generateCurrentAndNextRedirects(item)) + } else if (typeof item === "object") { + arr.push(...backportRedirect(item)) + } + } + return arr +} + const backportRedirect = (s) => { - const arr = [] - if (typeof s !== "string") { - const { id, link, items } = s - if (id) { - arr.push(...generateCurrentAndNextRedirects(id)) - } - if (link?.id) { - arr.push(...generateCurrentAndNextRedirects(link.id)) - } - if (items) { - for (const item of items) { - if (typeof item === "string") { - arr.push(...generateCurrentAndNextRedirects(item)) - } - if (typeof item === "object") { - arr.push(...backportRedirect(item)) - } - } - } - } else { - arr.push(...generateCurrentAndNextRedirects(s)) - } - return arr + const arr = [] + if (typeof s === "string") { + arr.push(...generateCurrentAndNextRedirects(s)) + return arr + } + const { id, link, items } = s + if (id) { + arr.push(...generateCurrentAndNextRedirects(id)) + } + if (link?.id) { + arr.push(...generateCurrentAndNextRedirects(link.id)) + } + if (items) { + arr.push(...handleSidebarItems(items)) + } + return arr } const currentYear = new Date().getFullYear() const ACADEMY_URL = `https://academy.crowdsec.net/courses?${ - process.env.NODE_ENV === "production" - ? "utm_source=docs&utm_medium=menu&utm_campaign=top-menu&utm_id=academydocs" - : "" + process.env.NODE_ENV === "production" ? "utm_source=docs&utm_medium=menu&utm_campaign=top-menu&utm_id=academydocs" : "" }` const NAVBAR_ITEMS: NavbarItem[] = [ - { - type: "docsVersionDropdown", - docsPluginId: "default", - position: "left", - dropdownActiveClassDisabled: true, - }, - { - label: "Security Stack", - position: "left", - items: [ - { type: "doc", docId: "intro", label: "Security Engine" }, - { to: "/u/bouncers/intro", label: "Remediation Components" }, - { - type: "docsVersion", - to: "/docs/next/appsec/intro", - label: "Web Application Firewall (AppSec)", - }, - { type: "doc", docId: "cscli/cscli", label: "Cscli" }, - { to: "/u/user_guides/intro", label: "Guides" }, - ], - }, - { - to: "/u/blocklists/getting_started", - position: "left", - label: "Blocklists", - }, - { - label: "API(s)", - position: "left", - items: [ - { label: "CTI API", to: "/u/cti_api/getting_started" }, - { label: "Service API πŸ…", to: "/u/service_api/getting_started" }, - ], - }, - { to: "/u/console/intro", position: "left", label: "Console" }, - { to: ACADEMY_URL, label: "Academy", position: "left" }, - { - to: "/u/troubleshooting/intro", - position: "left", - label: "FAQ/Troubleshooting", - }, - { - href: "https://github.com/crowdsecurity/crowdsec", - position: "right", - className: "header-github-link header-icon-link", - }, - { - href: "https://discord.gg/wGN7ShmEE8", - position: "right", - className: "header-discord-link", - }, - { - href: "https://discourse.crowdsec.net", - position: "right", - className: "header-discourse-link", - }, - { - href: "https://hub.crowdsec.net/", - position: "right", - className: "header-hub-link", - }, + { + type: "docsVersionDropdown", + docsPluginId: "default", + position: "left", + dropdownActiveClassDisabled: true, + }, + { + label: "Security Stack", + position: "left", + items: [ + { type: "doc", docId: "intro", label: "Security Engine" }, + { to: "/u/bouncers/intro", label: "Remediation Components" }, + { + type: "docsVersion", + to: "/docs/next/appsec/intro", + label: "Web Application Firewall (AppSec)", + }, + { type: "doc", docId: "cscli/cscli", label: "Cscli" }, + { to: "/u/user_guides/intro", label: "Guides" }, + ], + }, + { + to: "/u/blocklists/getting_started", + position: "left", + label: "Blocklists", + }, + { + label: "API(s)", + position: "left", + items: [ + { label: "CTI API", to: "/u/cti_api/getting_started" }, + { label: "Service API πŸ…", to: "/u/service_api/getting_started" }, + ], + }, + { to: "/u/console/intro", position: "left", label: "Console" }, + { to: ACADEMY_URL, label: "Academy", position: "left" }, + { + to: "/u/troubleshooting/intro", + position: "left", + label: "FAQ/Troubleshooting", + }, + { + href: "https://github.com/crowdsecurity/crowdsec", + position: "right", + className: "header-github-link header-icon-link", + }, + { + href: "https://discord.gg/wGN7ShmEE8", + position: "right", + className: "header-discord-link", + }, + { + href: "https://discourse.crowdsec.net", + position: "right", + className: "header-discourse-link", + }, + { + href: "https://hub.crowdsec.net/", + position: "right", + className: "header-hub-link", + }, ] const FOOTER_LINKS = [ - { - title: "Community", - items: [ - { - label: "GitHub", - href: "https://github.com/crowdsecurity/crowdsec", - }, - { label: "Discourse", href: "https://discourse.crowdsec.net/" }, - { label: "Discord", href: "https://discord.gg/crowdsec" }, - { label: "Twitter", href: "https://twitter.com/crowd_security" }, - ], - }, - { - title: "More", - items: [ - { label: "Console", href: "https://app.crowdsec.net/" }, - { label: "Hub", href: "https://hub.crowdsec.net/" }, - { label: "Blog", href: "https://crowdsec.net/blog/" }, - { - label: "Tutorial", - href: "https://crowdsec.net/blog/category/tutorial/", - }, - ], - }, + { + title: "Community", + items: [ + { + label: "GitHub", + href: "https://github.com/crowdsecurity/crowdsec", + }, + { label: "Discourse", href: "https://discourse.crowdsec.net/" }, + { label: "Discord", href: "https://discord.gg/crowdsec" }, + { label: "Twitter", href: "https://twitter.com/crowd_security" }, + ], + }, + { + title: "More", + items: [ + { label: "Console", href: "https://app.crowdsec.net/" }, + { label: "Hub", href: "https://hub.crowdsec.net/" }, + { label: "Blog", href: "https://crowdsec.net/blog/" }, + { + label: "Tutorial", + href: "https://crowdsec.net/blog/category/tutorial/", + }, + ], + }, ] const redirects = [ - ...[ - ...(Array.isArray(remediationSideBar) - ? remediationSideBar - : [remediationSideBar]), - ...(Array.isArray(ctiApiSidebar) ? ctiApiSidebar : [ctiApiSidebar]), - ...(Array.isArray(guidesSideBar) ? guidesSideBar : [guidesSideBar]), - ].flatMap(backportRedirect), - { from: "/docs/troubleshooting", to: "/u/troubleshooting/intro" }, - { from: "/docs/next/troubleshooting", to: "/u/troubleshooting/intro" }, - { from: "/docs/faq", to: "/u/troubleshooting/intro" }, - { from: "/docs/next/faq", to: "/u/troubleshooting/intro" }, + ...[ + ...(Array.isArray(remediationSideBar) ? remediationSideBar : [remediationSideBar]), + ...(Array.isArray(ctiApiSidebar) ? ctiApiSidebar : [ctiApiSidebar]), + ...(Array.isArray(guidesSideBar) ? guidesSideBar : [guidesSideBar]), + ].flatMap(backportRedirect), + { from: "/docs/troubleshooting", to: "/u/troubleshooting/intro" }, + { from: "/docs/next/troubleshooting", to: "/u/troubleshooting/intro" }, + { from: "/docs/faq", to: "/u/troubleshooting/intro" }, + { from: "/docs/next/faq", to: "/u/troubleshooting/intro" }, ] const config: Config = { - future: { - v4: { - removeLegacyPostBuildHeadAttribute: true, - }, - experimental_faster: true, - }, - title: "CrowdSec", - tagline: - "CrowdSec - Real-time & crowdsourced protection against aggressive IPs", - url: "https://docs.crowdsec.net", - baseUrl: "/", - onBrokenLinks: "warn", - onBrokenMarkdownLinks: "warn", - favicon: "img/crowdsec_no_txt.png", - organizationName: "CrowdSec", - projectName: "crowdsec-docs", - markdown: { - mdx1Compat: { - comments: true, - admonitions: true, - headingIds: true, - }, - }, - stylesheets: [ - { - href: "https://fonts.googleapis.com/icon?family=Material+Icons", - }, - ], - themeConfig: { - image: "img/crowdsec_og_image.png", - announcementBar: { - id: "banner_docs", - content: - 'Learn how to guard your webserver in real-time with the CrowdSec WAF', - backgroundColor: "#F8AB13", - textColor: "#131132", - isCloseable: true, - }, - algolia: { - appId: "PWTZ94KULF", - apiKey: "31673122672f1eb819e16c87468e53b4", - indexName: "crowdsec", - contextualSearch: true, - }, - zooming: { - selector: ".markdown :not(a) > img", - delay: 500, - background: { - light: "rgba(101,108,133,0.8)", - dark: "rgba(9,10,17,0.8)", - }, - }, - navbar: { - title: "", - logo: { - alt: "CrowdSec", - src: "img/crowdsec_logo.png", - }, - items: NAVBAR_ITEMS, - }, - footer: { - style: "dark", - links: FOOTER_LINKS, - copyright: `Copyright Β© ${currentYear} CrowdSec`, - }, - prism: { - theme: themes.shadesOfPurple, - additionalLanguages: ["bash", "yaml", "json"], - }, - } satisfies Preset.ThemeConfig, - presets: [ - [ - "@docusaurus/preset-classic", - { - docs: { - sidebarPath: require.resolve("./sidebars.js"), - editUrl: - "https://github.com/crowdsecurity/crowdsec-docs/edit/main/crowdsec-docs/", - lastVersion: "current", - versions: { - "v1.6.0": { - banner: "none", - path: "/", - }, - current: { - path: "/next", - }, - }, - }, - blog: { - showReadingTime: true, - editUrl: - "https://github.com/crowdsecurity/crowdsec-docs/edit/main/crowdsec-docs/", - }, - theme: { - customCss: require.resolve("./src/css/custom.css"), - }, - }, - ], - ], - plugins: [ - "docusaurus-plugin-zooming", - [ - "@docusaurus/plugin-content-docs", - { - id: "unversioned", - path: "unversioned", - routeBasePath: "u", - sidebarPath: sidebarsUnversionedConfig, - }, - ], - ["./plugins/gtag/index.ts", { trackingID: "G-0TFBMNTDFQ" }], - ["@docusaurus/plugin-client-redirects", { redirects }], - tailwindPlugin, - ], + future: { + v4: { + removeLegacyPostBuildHeadAttribute: true, + }, + experimental_faster: true, + }, + title: "CrowdSec", + tagline: "CrowdSec - Real-time & crowdsourced protection against aggressive IPs", + url: "https://docs.crowdsec.net", + baseUrl: "/", + onBrokenLinks: "warn", + onBrokenMarkdownLinks: "warn", + favicon: "img/crowdsec_no_txt.png", + organizationName: "CrowdSec", + projectName: "crowdsec-docs", + markdown: { + mdx1Compat: { + comments: true, + admonitions: true, + headingIds: true, + }, + }, + stylesheets: [ + { + href: "https://fonts.googleapis.com/icon?family=Material+Icons", + }, + ], + themeConfig: { + image: "img/crowdsec_og_image.png", + announcementBar: { + id: "banner_docs", + content: + 'Learn how to guard your webserver in real-time with the CrowdSec WAF', + backgroundColor: "#F8AB13", + textColor: "#131132", + isCloseable: true, + }, + algolia: { + appId: "PWTZ94KULF", + apiKey: "31673122672f1eb819e16c87468e53b4", + indexName: "crowdsec", + contextualSearch: true, + }, + zooming: { + selector: ".markdown :not(a) > img", + delay: 500, + background: { + light: "rgba(101,108,133,0.8)", + dark: "rgba(9,10,17,0.8)", + }, + }, + navbar: { + title: "", + logo: { + alt: "CrowdSec", + src: "img/crowdsec_logo.png", + }, + items: NAVBAR_ITEMS, + }, + footer: { + style: "dark", + links: FOOTER_LINKS, + copyright: `Copyright Β© ${currentYear} CrowdSec`, + }, + prism: { + theme: themes.shadesOfPurple, + additionalLanguages: ["bash", "yaml", "json"], + }, + } satisfies Preset.ThemeConfig, + presets: [ + [ + "@docusaurus/preset-classic", + { + docs: { + sidebarPath: "./sidebars.ts", + editUrl: "https://github.com/crowdsecurity/crowdsec-docs/edit/main/crowdsec-docs/", + lastVersion: "current", + versions: { + "v1.6.0": { + banner: "none", + path: "/", + }, + current: { + path: "/next", + }, + }, + }, + blog: { + showReadingTime: true, + editUrl: "https://github.com/crowdsecurity/crowdsec-docs/edit/main/crowdsec-docs/", + }, + theme: { + customCss: require.resolve("./src/css/custom.css"), + }, + } satisfies Preset.Options, + ], + ], + plugins: [ + "docusaurus-plugin-zooming", + [ + "@docusaurus/plugin-content-docs", + { + id: "unversioned", + path: "unversioned", + routeBasePath: "u", + sidebarPath: "./sidebarsUnversioned.ts", + }, + ], + ["./plugins/gtag/index.ts", { trackingID: "G-0TFBMNTDFQ" }], + ["@docusaurus/plugin-client-redirects", { redirects }], + tailwindPlugin, + ], } export default config diff --git a/crowdsec-docs/package-lock.json b/crowdsec-docs/package-lock.json index ade0fe412..2ba1bbcf1 100644 --- a/crowdsec-docs/package-lock.json +++ b/crowdsec-docs/package-lock.json @@ -35,6 +35,7 @@ "tailwindcss-animate": "^1.0.7" }, "devDependencies": { + "@biomejs/biome": "2.0.6", "@docusaurus/module-type-aliases": "^3.8.1", "@docusaurus/tsconfig": "^3.8.1", "@docusaurus/types": "^3.8.1", @@ -1975,6 +1976,169 @@ "node": ">=6.9.0" } }, + "node_modules/@biomejs/biome": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@biomejs/biome/-/biome-2.0.6.tgz", + "integrity": "sha512-RRP+9cdh5qwe2t0gORwXaa27oTOiQRQvrFf49x2PA1tnpsyU7FIHX4ZOFMtBC4QNtyWsN7Dqkf5EDbg4X+9iqA==", + "dev": true, + "license": "MIT OR Apache-2.0", + "bin": { + "biome": "bin/biome" + }, + "engines": { + "node": ">=14.21.3" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/biome" + }, + "optionalDependencies": { + "@biomejs/cli-darwin-arm64": "2.0.6", + "@biomejs/cli-darwin-x64": "2.0.6", + "@biomejs/cli-linux-arm64": "2.0.6", + "@biomejs/cli-linux-arm64-musl": "2.0.6", + "@biomejs/cli-linux-x64": "2.0.6", + "@biomejs/cli-linux-x64-musl": "2.0.6", + "@biomejs/cli-win32-arm64": "2.0.6", + "@biomejs/cli-win32-x64": "2.0.6" + } + }, + "node_modules/@biomejs/cli-darwin-arm64": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-arm64/-/cli-darwin-arm64-2.0.6.tgz", + "integrity": "sha512-AzdiNNjNzsE6LfqWyBvcL29uWoIuZUkndu+wwlXW13EKcBHbbKjNQEZIJKYDc6IL+p7bmWGx3v9ZtcRyIoIz5A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT OR Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=14.21.3" + } + }, + "node_modules/@biomejs/cli-darwin-x64": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-x64/-/cli-darwin-x64-2.0.6.tgz", + "integrity": "sha512-wJjjP4E7bO4WJmiQaLnsdXMa516dbtC6542qeRkyJg0MqMXP0fvs4gdsHhZ7p9XWTAmGIjZHFKXdsjBvKGIJJQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT OR Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=14.21.3" + } + }, + "node_modules/@biomejs/cli-linux-arm64": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64/-/cli-linux-arm64-2.0.6.tgz", + "integrity": "sha512-ZSVf6TYo5rNMUHIW1tww+rs/krol7U5A1Is/yzWyHVZguuB0lBnIodqyFuwCNqG9aJGyk7xIMS8HG0qGUPz0SA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT OR Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.21.3" + } + }, + "node_modules/@biomejs/cli-linux-arm64-musl": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64-musl/-/cli-linux-arm64-musl-2.0.6.tgz", + "integrity": "sha512-CVPEMlin3bW49sBqLBg2x016Pws7eUXA27XYDFlEtponD0luYjg2zQaMJ2nOqlkKG9fqzzkamdYxHdMDc2gZFw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT OR Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.21.3" + } + }, + "node_modules/@biomejs/cli-linux-x64": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64/-/cli-linux-x64-2.0.6.tgz", + "integrity": "sha512-geM1MkHTV1Kh2Cs/Xzot9BOF3WBacihw6bkEmxkz4nSga8B9/hWy5BDiOG3gHDGIBa8WxT0nzsJs2f/hPqQIQw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT OR Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.21.3" + } + }, + "node_modules/@biomejs/cli-linux-x64-musl": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64-musl/-/cli-linux-x64-musl-2.0.6.tgz", + "integrity": "sha512-mKHE/e954hR/hSnAcJSjkf4xGqZc/53Kh39HVW1EgO5iFi0JutTN07TSjEMg616julRtfSNJi0KNyxvc30Y4rQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT OR Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.21.3" + } + }, + "node_modules/@biomejs/cli-win32-arm64": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-arm64/-/cli-win32-arm64-2.0.6.tgz", + "integrity": "sha512-290V4oSFoKaprKE1zkYVsDfAdn0An5DowZ+GIABgjoq1ndhvNxkJcpxPsiYtT7slbVe3xmlT0ncdfOsN7KruzA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT OR Apache-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=14.21.3" + } + }, + "node_modules/@biomejs/cli-win32-x64": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-x64/-/cli-win32-x64-2.0.6.tgz", + "integrity": "sha512-bfM1Bce0d69Ao7pjTjUS+AWSZ02+5UHdiAP85Th8e9yV5xzw6JrHXbL5YWlcEKQ84FIZMdDc7ncuti1wd2sdbw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT OR Apache-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=14.21.3" + } + }, "node_modules/@colors/colors": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", diff --git a/crowdsec-docs/package.json b/crowdsec-docs/package.json index 15378c985..76cad2c1e 100644 --- a/crowdsec-docs/package.json +++ b/crowdsec-docs/package.json @@ -10,6 +10,8 @@ "deploy": "docusaurus deploy", "clear": "docusaurus clear", "serve": "docusaurus serve", + "lint": "biome check", + "format": "biome format", "write-translations": "docusaurus write-translations", "write-heading-ids": "docusaurus write-heading-ids" }, @@ -42,6 +44,7 @@ "tailwindcss-animate": "^1.0.7" }, "devDependencies": { + "@biomejs/biome": "2.0.6", "@docusaurus/module-type-aliases": "^3.8.1", "@docusaurus/tsconfig": "^3.8.1", "@docusaurus/types": "^3.8.1", diff --git a/crowdsec-docs/plugins/gtag/gtag.ts b/crowdsec-docs/plugins/gtag/gtag.ts index a2990a134..163057706 100644 --- a/crowdsec-docs/plugins/gtag/gtag.ts +++ b/crowdsec-docs/plugins/gtag/gtag.ts @@ -1,16 +1,14 @@ -import ExecutionEnvironment from "@docusaurus/ExecutionEnvironment"; +import ExecutionEnvironment from "@docusaurus/ExecutionEnvironment" const clientModule = { onRouteDidUpdate({ location, previousLocation }) { if (!ExecutionEnvironment.canUseDOM) { - return null; + return null } - const cookieConsentResponse = JSON.parse( - localStorage.getItem("docusaurus.cookieConsent") ?? "null" - ); + const cookieConsentResponse = JSON.parse(localStorage.getItem("docusaurus.cookieConsent") ?? "null") if (!cookieConsentResponse) { - window["ga-disable-MEASUREMENT_ID"] = true; - return; + window["ga-disable-MEASUREMENT_ID"] = true + return } if ( previousLocation && @@ -26,15 +24,11 @@ const clientModule = { setTimeout(() => { // Always refer to the variable on window in case it gets overridden // elsewhere. - window.gtag( - "set", - "page_path", - location.pathname + location.search + location.hash - ); - window.gtag("event", "page_view"); - }); + window.gtag("set", "page_path", location.pathname + location.search + location.hash) + window.gtag("event", "page_view") + }) } }, -}; +} -export default clientModule; +export default clientModule diff --git a/crowdsec-docs/plugins/gtag/index.ts b/crowdsec-docs/plugins/gtag/index.ts index f580fcd97..6ab459bb7 100644 --- a/crowdsec-docs/plugins/gtag/index.ts +++ b/crowdsec-docs/plugins/gtag/index.ts @@ -1,7 +1,5 @@ const createConfigSnippet = ({ trackingID, anonymizeIP }) => - `gtag('config', '${trackingID}', { ${ - anonymizeIP ? "'anonymize_ip': true" : "" - } });` + `gtag('config', '${trackingID}', { ${anonymizeIP ? "'anonymize_ip': true" : ""} });` export default function pluginGoogleGtag(_, options) { const isProd = process.env.NODE_ENV === "production" @@ -65,4 +63,4 @@ export default function pluginGoogleGtag(_, options) { } } -export { validateThemeConfig, validateOptions } from "./validate.js" +export { validateOptions, validateThemeConfig } from "./validate.js" diff --git a/crowdsec-docs/plugins/gtag/validate.ts b/crowdsec-docs/plugins/gtag/validate.ts index 2e88f49d1..c5be4ec98 100644 --- a/crowdsec-docs/plugins/gtag/validate.ts +++ b/crowdsec-docs/plugins/gtag/validate.ts @@ -1,43 +1,34 @@ -import {Joi} from '@docusaurus/utils-validation'; -import type { - OptionValidationContext, - ThemeConfig, - ThemeConfigValidationContext, -} from '@docusaurus/types'; +import type { OptionValidationContext, ThemeConfig, ThemeConfigValidationContext } from "@docusaurus/types" +import { Joi } from "@docusaurus/utils-validation" export type PluginOptions = { - trackingID: string; - anonymizeIP: boolean; -}; + trackingID: string + anonymizeIP: boolean +} export type Options = { - trackingID: string; - anonymizeIP?: boolean; -}; + trackingID: string + anonymizeIP?: boolean +} export const DEFAULT_OPTIONS: Partial = { - anonymizeIP: false, -}; + anonymizeIP: false, +} const pluginOptionsSchema = Joi.object({ - trackingID: Joi.string().required(), - anonymizeIP: Joi.boolean().default(DEFAULT_OPTIONS.anonymizeIP), -}); + trackingID: Joi.string().required(), + anonymizeIP: Joi.boolean().default(DEFAULT_OPTIONS.anonymizeIP), +}) -export function validateOptions({ - validate, - options, -}: OptionValidationContext): PluginOptions { - return validate(pluginOptionsSchema, options); +export function validateOptions({ validate, options }: OptionValidationContext): PluginOptions { + return validate(pluginOptionsSchema, options) } -export function validateThemeConfig({ - themeConfig, -}: ThemeConfigValidationContext): ThemeConfig { - if ('gtag' in themeConfig) { - throw new Error( - 'The "gtag" field in themeConfig should now be specified as option for plugin-google-gtag. More information at https://github.com/facebook/docusaurus/pull/5832.', - ); - } - return themeConfig; +export function validateThemeConfig({ themeConfig }: ThemeConfigValidationContext): ThemeConfig { + if ("gtag" in themeConfig) { + throw new Error( + 'The "gtag" field in themeConfig should now be specified as option for plugin-google-gtag. More information at https://github.com/facebook/docusaurus/pull/5832.' + ) + } + return themeConfig } diff --git a/crowdsec-docs/plugins/tailwind-config.ts b/crowdsec-docs/plugins/tailwind-config.ts index d592bd507..5c0803bea 100644 --- a/crowdsec-docs/plugins/tailwind-config.ts +++ b/crowdsec-docs/plugins/tailwind-config.ts @@ -2,11 +2,7 @@ export default function tailwindPlugin() { return { name: "tailwind-plugin", configurePostCss(postcssOptions) { - postcssOptions.plugins = [ - require("postcss-import"), - require("tailwindcss"), - require("autoprefixer"), - ] + postcssOptions.plugins = [require("postcss-import"), require("tailwindcss"), require("autoprefixer")] return postcssOptions }, } diff --git a/crowdsec-docs/sidebars.ts b/crowdsec-docs/sidebars.ts index fe3c2240b..c49753e23 100644 --- a/crowdsec-docs/sidebars.ts +++ b/crowdsec-docs/sidebars.ts @@ -1,796 +1,772 @@ -import { SidebarsConfig } from "@docusaurus/plugin-content-docs" +import type { SidebarsConfig } from "@docusaurus/plugin-content-docs" type SidebarConfig = SidebarsConfig[string] const sidebarsConfig: SidebarConfig = { - // By default, Docusaurus generates a sidebar from the docs folder structure - //tutorialSidebar: [{type: 'autogenerated', dirName: '.'}], - // But you can create a sidebar manually - tutorialSidebar: [ - { - type: "doc", - id: "intro", - }, - { - type: "category", - label: "Getting Started", - collapsed: false, - link: { - type: "doc", - id: "getting_started/getting_started", - }, - items: [ - { - type: "category", - label: "Security Engine", - collapsed: true, - link: { - type: "doc", - id: "getting_started/security_engine_intro", - }, - items: [ - "getting_started/install_crowdsec", - "getting_started/install_crowdsec_freebsd", - "getting_started/install_crowdsec_opnsense", - "getting_started/install_crowdsec_pfsense", - "getting_started/install_windows", - { - type: "link", - label: "Helm/K8s", - href: "https://artifacthub.io/packages/helm/crowdsec/crowdsec", - }, - { - type: "category", - label: "Container", - items: [ - { - type: "link", - href: "https://hub.docker.com/r/crowdsecurity/crowdsec", - label: "Docker Hub", - }, - { - type: "link", - href: "https://github.com/crowdsecurity/crowdsec/pkgs/container/crowdsec", - label: "GHCR", - }, - { - type: "link", - href: "https://github.com/crowdsecurity/example-docker-compose", - label: "Examples", - }, - ], - }, - "getting_started/install_source", - ], - }, - { - type: "link", - label: "Remediation", - href: "/u/bouncers/intro", - }, - { - type: "ref", - id: "appsec/intro", - label: "AppSec", - }, - { - type: "category", - label: "SDK", - items: [ - { - type: "doc", - label: "Python", - id: "getting_started/install_pyagent", - }, - { - type: "doc", - label: "PHP", - id: "getting_started/install_softagent", - }, - ], - }, - "getting_started/crowdsec_tour", - "getting_started/versions_matrix", - ], - }, - { - type: "doc", - label: "Concepts", - id: "concepts", - }, - { - type: "category", - label: "Log Processor", - link: { - type: "doc", - id: "log_processor/intro", - }, - items: [ - { - type: "category", - label: "Data Sources", - link: { - type: "doc", - id: "log_processor/data_sources/intro", - }, - items: [ - "log_processor/data_sources/appsec", - "log_processor/data_sources/cloudwatch", - "log_processor/data_sources/kinesis", - "log_processor/data_sources/s3", - "log_processor/data_sources/docker", - "log_processor/data_sources/file", - "log_processor/data_sources/http", - "log_processor/data_sources/journald", - "log_processor/data_sources/kafka", - "log_processor/data_sources/kubernetes_audit", - "log_processor/data_sources/loki", - "log_processor/data_sources/victorialogs", - "log_processor/data_sources/syslog", - "log_processor/data_sources/windows_evt_log", - "log_processor/data_sources/troubleshoot", - ], - }, - { - type: "category", - label: "Parsers", - link: { - type: "doc", - id: "log_processor/parsers/intro", - }, - items: [ - "log_processor/parsers/format", - "log_processor/parsers/create", - "log_processor/parsers/enricher", - "log_processor/parsers/patterns", - ], - }, - { - type: "category", - label: "Scenarios", - link: { - type: "doc", - id: "log_processor/scenarios/intro", - }, - items: [ - "log_processor/scenarios/format", - "log_processor/scenarios/simulation", - "log_processor/scenarios/create", - ], - }, - { - type: "category", - label: "Collections", - link: { - type: "doc", - id: "log_processor/collections/intro", - }, - items: ["log_processor/collections/format"], - }, - { - type: "category", - label: "Whitelists", - link: { - type: "doc", - id: "log_processor/whitelist/intro", - }, - items: [ - "log_processor/whitelist/format", - { - type: "category", - label: "Examples", - items: [ - "log_processor/whitelist/create_ip", - "log_processor/whitelist/create_expr", - "log_processor/whitelist/create_postoverflow", - "log_processor/whitelist/create_fqdn", - "log_processor/whitelist/create_capi", - "log_processor/whitelist/create_lapi", - ], - }, - ], - }, - { - type: "category", - label: "Alert Context", - link: { - type: "doc", - id: "log_processor/alert_context/intro", - }, - items: [], - }, - ], - }, - { - type: "category", - label: "Local API", - link: { - type: "doc", - id: "local_api/intro", - }, - items: [ - { - type: "category", - label: "Profiles", - link: { - type: "doc", - id: "local_api/profiles/intro", - }, - items: [ - "local_api/profiles/format", - { - type: "category", - label: "Examples", - items: [ - "local_api/profiles/cti_profile", - "local_api/profiles/captcha_profile", - "local_api/profiles/pid_profile", - ], - }, - ], - }, - { - type: "category", - label: "Notification plugins", - link: { - type: "doc", - id: "local_api/notification_plugins/intro", - }, - items: [ - { - type: "category", - label: "HTTP Plugin", - collapsed: true, - link: { - type: "doc", - id: "local_api/notification_plugins/http", - }, - items: [ - "local_api/notification_plugins/teams", - "local_api/notification_plugins/elastic", - "local_api/notification_plugins/telegram", - "local_api/notification_plugins/gotify", - ], - }, - "local_api/notification_plugins/email", - "local_api/notification_plugins/sentinel", - "local_api/notification_plugins/slack", - "local_api/notification_plugins/splunk", - "local_api/notification_plugins/file", - "local_api/notification_plugins/template_helpers", - "local_api/notification_plugins/writing_your_own_plugin", - ], - }, - "local_api/database", - "local_api/bouncers", - "local_api/configuration", - "local_api/authentication", - "local_api/tls_auth", - "local_api/centralized_allowlists", - { - type: "link", - label: "Swagger", - href: "https://crowdsecurity.github.io/api_doc/lapi/", - }, - ], - }, - { - type: "category", - label: "Central API", - link: { - type: "doc", - id: "central_api/intro", - }, - items: [ - "central_api/community_blocklist", - { - type: "link", - label: "Swagger", - href: "https://crowdsecurity.github.io/api_doc/capi/", - }, - ], - }, - { - type: "category", - label: "Configuration", - link: { - type: "doc", - id: "configuration/crowdsec_configuration", - }, - items: [ - "configuration/feature_flags", - "configuration/network_management", - ], - }, - { - type: "category", - label: "Observability", - link: { - type: "doc", - id: "observability/intro", - }, - items: [ - "observability/cscli", - "observability/prometheus", - "observability/usage_metrics", - "observability/dashboard", - "observability/pprof", - ], - }, - { - type: "category", - label: "Expr", - link: { - type: "doc", - id: "expr/intro", - }, - items: [ - "expr/strings_helpers", - "expr/file_helpers", - "expr/ip_helpers", - "expr/json_helpers", - "expr/cti_helpers", - "expr/libinjection_helpers", - "expr/other_helpers", - "expr/alert", - "expr/decision", - "expr/event", - ], - }, - { - type: "category", - label: "Contributing", - link: { - type: "doc", - id: "contributing/getting_started", - }, - items: [ - "contributing/contributing_doc", - "contributing/contributing_hub", - "contributing/contributing_bouncers", - "contributing/contributing_test_env", - "contributing/contributing_crowdsec", - ], - }, - { - type: "doc", - label: "Contact the team", - id: "contact_team", - }, - ], - cscliSidebar: [ - { - type: "doc", - label: "cscli", - id: "cscli/cscli", - }, - { - type: "category", - label: "cscli alerts", - link: { - type: "doc", - id: "cscli/cscli_alerts", - }, - items: [ - "cscli/cscli_alerts_delete", - "cscli/cscli_alerts_flush", - "cscli/cscli_alerts_inspect", - "cscli/cscli_alerts_list", - ], - }, - { - type: "category", - label: "cscli allowlists", - link: { - type: "doc", - id: "cscli/cscli_allowlists", - }, - items: [ - "cscli/cscli_allowlists_add", - "cscli/cscli_allowlists_create", - "cscli/cscli_allowlists_delete", - "cscli/cscli_allowlists_inspect", - "cscli/cscli_allowlists_list", - "cscli/cscli_allowlists_remove", - ], - }, - { - type: "category", - label: "cscli appsec-configs", - link: { - type: "doc", - id: "cscli/cscli_appsec-configs", - }, - items: [ - "cscli/cscli_appsec-configs_inspect", - "cscli/cscli_appsec-configs_install", - "cscli/cscli_appsec-configs_list", - "cscli/cscli_appsec-configs_remove", - "cscli/cscli_appsec-configs_upgrade", - ], - }, - { - type: "category", - label: "cscli appsec-rules", - link: { - type: "doc", - id: "cscli/cscli_appsec-rules", - }, - items: [ - "cscli/cscli_appsec-rules_inspect", - "cscli/cscli_appsec-rules_install", - "cscli/cscli_appsec-rules_list", - "cscli/cscli_appsec-rules_remove", - "cscli/cscli_appsec-rules_upgrade", - ], - }, - { - type: "category", - label: "cscli bouncers", - link: { - type: "doc", - id: "cscli/cscli_bouncers", - }, - items: [ - "cscli/cscli_bouncers_add", - "cscli/cscli_bouncers_delete", - "cscli/cscli_bouncers_inspect", - "cscli/cscli_bouncers_list", - "cscli/cscli_bouncers_prune", - ], - }, - { - type: "category", - label: "cscli capi", - link: { - type: "doc", - id: "cscli/cscli_capi", - }, - items: ["cscli/cscli_capi_register", "cscli/cscli_capi_status"], - }, - { - type: "category", - label: "cscli collections", - link: { - type: "doc", - id: "cscli/cscli_collections", - }, - items: [ - "cscli/cscli_collections_inspect", - "cscli/cscli_collections_install", - "cscli/cscli_collections_list", - "cscli/cscli_collections_remove", - "cscli/cscli_collections_upgrade", - ], - }, - { - type: "doc", - label: "cscli completion", - id: "cscli/cscli_completion", - }, - { - type: "category", - label: "cscli config", - link: { - type: "doc", - id: "cscli/cscli_config", - }, - items: [ - "cscli/cscli_config_feature-flags", - "cscli/cscli_config_show", - ], - }, - { - type: "category", - label: "cscli console", - link: { - type: "doc", - id: "cscli/cscli_console", - }, - items: [ - "cscli/cscli_console_disable", - "cscli/cscli_console_enable", - "cscli/cscli_console_enroll", - "cscli/cscli_console_status", - ], - }, - { - type: "category", - label: "cscli contexts", - link: { - type: "doc", - id: "cscli/cscli_contexts", - }, - items: [ - "cscli/cscli_contexts_install", - "cscli/cscli_contexts_remove", - "cscli/cscli_contexts_upgrade", - "cscli/cscli_contexts_list", - "cscli/cscli_contexts_inspect", - ], - }, - { - type: "category", - label: "cscli dashboard", - link: { - type: "doc", - id: "cscli/cscli_dashboard", - }, - items: [ - "cscli/cscli_dashboard_remove", - "cscli/cscli_dashboard_setup", - "cscli/cscli_dashboard_start", - "cscli/cscli_dashboard_stop", - "cscli/cscli_dashboard_show-password", - ], - }, - { - type: "category", - label: "cscli decisions", - link: { - type: "doc", - id: "cscli/cscli_decisions", - }, - items: [ - "cscli/cscli_decisions_add", - "cscli/cscli_decisions_delete", - "cscli/cscli_decisions_list", - "cscli/cscli_decisions_import", - ], - }, - { - type: "category", - label: "cscli hub", - link: { - type: "doc", - id: "cscli/cscli_hub", - }, - items: [ - "cscli/cscli_hub_list", - "cscli/cscli_hub_update", - "cscli/cscli_hub_upgrade", - "cscli/cscli_hub_types", - ], - }, - { - type: "doc", - label: "cscli explain", - id: "cscli/cscli_explain", - }, - { - type: "category", - label: "cscli lapi", - link: { - type: "doc", - id: "cscli/cscli_lapi", - }, - items: [ - "cscli/cscli_lapi_context", - "cscli/cscli_lapi_context_add", - "cscli/cscli_lapi_context_delete", - "cscli/cscli_lapi_context_detect", - "cscli/cscli_lapi_context_status", - "cscli/cscli_lapi_register", - "cscli/cscli_lapi_status", - ], - }, - { - type: "category", - label: "cscli machines", - link: { - type: "doc", - id: "cscli/cscli_machines", - }, - items: [ - "cscli/cscli_machines_add", - "cscli/cscli_machines_delete", - "cscli/cscli_machines_inspect", - "cscli/cscli_machines_list", - "cscli/cscli_machines_prune", - "cscli/cscli_machines_validate", - ], - }, - { - type: "category", - label: "cscli metrics", - link: { - type: "doc", - id: "cscli/cscli_metrics", - }, - items: ["cscli/cscli_metrics_list", "cscli/cscli_metrics_show"], - }, - { - type: "category", - label: "cscli notifications", - link: { - type: "doc", - id: "cscli/cscli_notifications", - }, - items: [ - "cscli/cscli_notifications_inspect", - "cscli/cscli_notifications_list", - "cscli/cscli_notifications_reinject", - "cscli/cscli_notifications_test", - ], - }, - { - type: "category", - label: "cscli papi", - link: { - type: "doc", - id: "cscli/cscli_papi", - }, - items: ["cscli/cscli_papi_status", "cscli/cscli_papi_sync"], - }, - { - type: "category", - label: "cscli parsers", - link: { - type: "doc", - id: "cscli/cscli_parsers", - }, - items: [ - "cscli/cscli_parsers_inspect", - "cscli/cscli_parsers_install", - "cscli/cscli_parsers_list", - "cscli/cscli_parsers_remove", - "cscli/cscli_parsers_upgrade", - ], - }, - { - type: "category", - label: "cscli postoverflows", - link: { - type: "doc", - id: "cscli/cscli_postoverflows", - }, - items: [ - "cscli/cscli_postoverflows_inspect", - "cscli/cscli_postoverflows_install", - "cscli/cscli_postoverflows_list", - "cscli/cscli_postoverflows_remove", - "cscli/cscli_postoverflows_upgrade", - ], - }, - { - type: "category", - label: "cscli scenarios", - link: { - type: "doc", - id: "cscli/cscli_scenarios", - }, - items: [ - "cscli/cscli_scenarios_inspect", - "cscli/cscli_scenarios_install", - "cscli/cscli_scenarios_list", - "cscli/cscli_scenarios_remove", - "cscli/cscli_scenarios_upgrade", - ], - }, - { - type: "category", - label: "cscli support", - link: { - type: "doc", - id: "cscli/cscli_support", - }, - items: ["cscli/cscli_support_dump"], - }, - { - type: "category", - label: "cscli hubtest", - link: { - type: "doc", - id: "cscli/cscli_hubtest", - }, - items: [ - "cscli/cscli_hubtest_create", - "cscli/cscli_hubtest_run", - "cscli/cscli_hubtest_eval", - "cscli/cscli_hubtest_explain", - "cscli/cscli_hubtest_coverage", - "cscli/cscli_hubtest_info", - "cscli/cscli_hubtest_list", - "cscli/cscli_hubtest_clean", - ], - }, - { - type: "category", - label: "cscli simulation", - link: { - type: "doc", - id: "cscli/cscli_simulation", - }, - items: [ - "cscli/cscli_simulation_disable", - "cscli/cscli_simulation_enable", - "cscli/cscli_simulation_status", - ], - }, - { - type: "doc", - label: "cscli version", - id: "cscli/cscli_version", - }, - ], - betaSidebar: [ - { - type: "category", - label: "Preview Programs", - collapsed: true, - items: [ - { - type: "category", - label: "Crowdsec v1.5", - link: { - type: "doc", - id: "preview/1-5/intro", - }, - items: ["preview/1-5/crowdsec_preview_setup"], - }, - ], - }, - { - type: "doc", - label: "Backup Guide", - id: "preview/backup_guide", - }, - { - type: "category", - label: "Security Engine (Preview)", - collapsed: true, - items: [ - "preview/crowdsec_linux", - //"preview/crowdsec_freebsd", - "preview/crowdsec_windows", - { - type: "link", - label: "Helm/K8s", - href: "https://artifacthub.io/packages/helm/crowdsec/crowdsec", - }, - { - type: "link", - label: "Docker/Podman", - href: "https://hub.docker.com/r/crowdsecurity/crowdsec", - }, - ], - }, - { - type: "doc", - label: "Rollback to previous version", - id: "preview/rollback", - }, - ], - appSecSideBar: [ - { type: "doc", id: "appsec/intro", label: "CrowdSec WAF" }, - { - type: "category", - label: "Quickstart", - items: [ - { type: "doc", id: "appsec/quickstart/nginxopenresty" }, - { type: "doc", id: "appsec/quickstart/traefik" }, - ], - }, - { type: "doc", id: "appsec/configuration" }, - { - type: "category", - label: "Rules", - items: [ - { type: "doc", id: "appsec/rules_syntax" }, - { type: "doc", id: "appsec/hooks" }, - { type: "doc", id: "appsec/create_rules" }, - ], - }, - { - type: "doc", - id: "appsec/alerts_and_scenarios", - label: "Alerts & Scenarios", - }, - { type: "doc", id: "appsec/installation" }, - { type: "doc", id: "appsec/protocol", label: "Communication Protocol" }, - { type: "doc", id: "appsec/benchmark", label: "Benchmark" }, - { type: "doc", id: "appsec/troubleshooting" }, - ], + // By default, Docusaurus generates a sidebar from the docs folder structure + //tutorialSidebar: [{type: 'autogenerated', dirName: '.'}], + // But you can create a sidebar manually + tutorialSidebar: [ + { + type: "doc", + id: "intro", + }, + { + type: "category", + label: "Getting Started", + collapsed: false, + link: { + type: "doc", + id: "getting_started/getting_started", + }, + items: [ + { + type: "category", + label: "Security Engine", + collapsed: true, + link: { + type: "doc", + id: "getting_started/security_engine_intro", + }, + items: [ + "getting_started/install_crowdsec", + "getting_started/install_crowdsec_freebsd", + "getting_started/install_crowdsec_opnsense", + "getting_started/install_crowdsec_pfsense", + "getting_started/install_windows", + { + type: "link", + label: "Helm/K8s", + href: "https://artifacthub.io/packages/helm/crowdsec/crowdsec", + }, + { + type: "category", + label: "Container", + items: [ + { + type: "link", + href: "https://hub.docker.com/r/crowdsecurity/crowdsec", + label: "Docker Hub", + }, + { + type: "link", + href: "https://github.com/crowdsecurity/crowdsec/pkgs/container/crowdsec", + label: "GHCR", + }, + { + type: "link", + href: "https://github.com/crowdsecurity/example-docker-compose", + label: "Examples", + }, + ], + }, + "getting_started/install_source", + ], + }, + { + type: "link", + label: "Remediation", + href: "/u/bouncers/intro", + }, + { + type: "ref", + id: "appsec/intro", + label: "AppSec", + }, + { + type: "category", + label: "SDK", + items: [ + { + type: "doc", + label: "Python", + id: "getting_started/install_pyagent", + }, + { + type: "doc", + label: "PHP", + id: "getting_started/install_softagent", + }, + ], + }, + "getting_started/crowdsec_tour", + "getting_started/versions_matrix", + ], + }, + { + type: "doc", + label: "Concepts", + id: "concepts", + }, + { + type: "category", + label: "Log Processor", + link: { + type: "doc", + id: "log_processor/intro", + }, + items: [ + { + type: "category", + label: "Data Sources", + link: { + type: "doc", + id: "log_processor/data_sources/intro", + }, + items: [ + "log_processor/data_sources/appsec", + "log_processor/data_sources/cloudwatch", + "log_processor/data_sources/kinesis", + "log_processor/data_sources/s3", + "log_processor/data_sources/docker", + "log_processor/data_sources/file", + "log_processor/data_sources/http", + "log_processor/data_sources/journald", + "log_processor/data_sources/kafka", + "log_processor/data_sources/kubernetes_audit", + "log_processor/data_sources/loki", + "log_processor/data_sources/victorialogs", + "log_processor/data_sources/syslog", + "log_processor/data_sources/windows_evt_log", + "log_processor/data_sources/troubleshoot", + ], + }, + { + type: "category", + label: "Parsers", + link: { + type: "doc", + id: "log_processor/parsers/intro", + }, + items: [ + "log_processor/parsers/format", + "log_processor/parsers/create", + "log_processor/parsers/enricher", + "log_processor/parsers/patterns", + ], + }, + { + type: "category", + label: "Scenarios", + link: { + type: "doc", + id: "log_processor/scenarios/intro", + }, + items: ["log_processor/scenarios/format", "log_processor/scenarios/simulation", "log_processor/scenarios/create"], + }, + { + type: "category", + label: "Collections", + link: { + type: "doc", + id: "log_processor/collections/intro", + }, + items: ["log_processor/collections/format"], + }, + { + type: "category", + label: "Whitelists", + link: { + type: "doc", + id: "log_processor/whitelist/intro", + }, + items: [ + "log_processor/whitelist/format", + { + type: "category", + label: "Examples", + items: [ + "log_processor/whitelist/create_ip", + "log_processor/whitelist/create_expr", + "log_processor/whitelist/create_postoverflow", + "log_processor/whitelist/create_fqdn", + "log_processor/whitelist/create_capi", + "log_processor/whitelist/create_lapi", + ], + }, + ], + }, + { + type: "category", + label: "Alert Context", + link: { + type: "doc", + id: "log_processor/alert_context/intro", + }, + items: [], + }, + ], + }, + { + type: "category", + label: "Local API", + link: { + type: "doc", + id: "local_api/intro", + }, + items: [ + { + type: "category", + label: "Profiles", + link: { + type: "doc", + id: "local_api/profiles/intro", + }, + items: [ + "local_api/profiles/format", + { + type: "category", + label: "Examples", + items: [ + "local_api/profiles/cti_profile", + "local_api/profiles/captcha_profile", + "local_api/profiles/pid_profile", + ], + }, + ], + }, + { + type: "category", + label: "Notification plugins", + link: { + type: "doc", + id: "local_api/notification_plugins/intro", + }, + items: [ + { + type: "category", + label: "HTTP Plugin", + collapsed: true, + link: { + type: "doc", + id: "local_api/notification_plugins/http", + }, + items: [ + "local_api/notification_plugins/teams", + "local_api/notification_plugins/elastic", + "local_api/notification_plugins/telegram", + "local_api/notification_plugins/gotify", + ], + }, + "local_api/notification_plugins/email", + "local_api/notification_plugins/sentinel", + "local_api/notification_plugins/slack", + "local_api/notification_plugins/splunk", + "local_api/notification_plugins/file", + "local_api/notification_plugins/template_helpers", + "local_api/notification_plugins/writing_your_own_plugin", + ], + }, + "local_api/database", + "local_api/bouncers", + "local_api/configuration", + "local_api/authentication", + "local_api/tls_auth", + "local_api/centralized_allowlists", + { + type: "link", + label: "Swagger", + href: "https://crowdsecurity.github.io/api_doc/lapi/", + }, + ], + }, + { + type: "category", + label: "Central API", + link: { + type: "doc", + id: "central_api/intro", + }, + items: [ + "central_api/community_blocklist", + { + type: "link", + label: "Swagger", + href: "https://crowdsecurity.github.io/api_doc/capi/", + }, + ], + }, + { + type: "category", + label: "Configuration", + link: { + type: "doc", + id: "configuration/crowdsec_configuration", + }, + items: ["configuration/feature_flags", "configuration/network_management"], + }, + { + type: "category", + label: "Observability", + link: { + type: "doc", + id: "observability/intro", + }, + items: [ + "observability/cscli", + "observability/prometheus", + "observability/usage_metrics", + "observability/dashboard", + "observability/pprof", + ], + }, + { + type: "category", + label: "Expr", + link: { + type: "doc", + id: "expr/intro", + }, + items: [ + "expr/strings_helpers", + "expr/file_helpers", + "expr/ip_helpers", + "expr/json_helpers", + "expr/cti_helpers", + "expr/libinjection_helpers", + "expr/other_helpers", + "expr/alert", + "expr/decision", + "expr/event", + ], + }, + { + type: "category", + label: "Contributing", + link: { + type: "doc", + id: "contributing/getting_started", + }, + items: [ + "contributing/contributing_doc", + "contributing/contributing_hub", + "contributing/contributing_bouncers", + "contributing/contributing_test_env", + "contributing/contributing_crowdsec", + ], + }, + { + type: "doc", + label: "Contact the team", + id: "contact_team", + }, + ], + cscliSidebar: [ + { + type: "doc", + label: "cscli", + id: "cscli/cscli", + }, + { + type: "category", + label: "cscli alerts", + link: { + type: "doc", + id: "cscli/cscli_alerts", + }, + items: ["cscli/cscli_alerts_delete", "cscli/cscli_alerts_flush", "cscli/cscli_alerts_inspect", "cscli/cscli_alerts_list"], + }, + { + type: "category", + label: "cscli allowlists", + link: { + type: "doc", + id: "cscli/cscli_allowlists", + }, + items: [ + "cscli/cscli_allowlists_add", + "cscli/cscli_allowlists_create", + "cscli/cscli_allowlists_delete", + "cscli/cscli_allowlists_inspect", + "cscli/cscli_allowlists_list", + "cscli/cscli_allowlists_remove", + ], + }, + { + type: "category", + label: "cscli appsec-configs", + link: { + type: "doc", + id: "cscli/cscli_appsec-configs", + }, + items: [ + "cscli/cscli_appsec-configs_inspect", + "cscli/cscli_appsec-configs_install", + "cscli/cscli_appsec-configs_list", + "cscli/cscli_appsec-configs_remove", + "cscli/cscli_appsec-configs_upgrade", + ], + }, + { + type: "category", + label: "cscli appsec-rules", + link: { + type: "doc", + id: "cscli/cscli_appsec-rules", + }, + items: [ + "cscli/cscli_appsec-rules_inspect", + "cscli/cscli_appsec-rules_install", + "cscli/cscli_appsec-rules_list", + "cscli/cscli_appsec-rules_remove", + "cscli/cscli_appsec-rules_upgrade", + ], + }, + { + type: "category", + label: "cscli bouncers", + link: { + type: "doc", + id: "cscli/cscli_bouncers", + }, + items: [ + "cscli/cscli_bouncers_add", + "cscli/cscli_bouncers_delete", + "cscli/cscli_bouncers_inspect", + "cscli/cscli_bouncers_list", + "cscli/cscli_bouncers_prune", + ], + }, + { + type: "category", + label: "cscli capi", + link: { + type: "doc", + id: "cscli/cscli_capi", + }, + items: ["cscli/cscli_capi_register", "cscli/cscli_capi_status"], + }, + { + type: "category", + label: "cscli collections", + link: { + type: "doc", + id: "cscli/cscli_collections", + }, + items: [ + "cscli/cscli_collections_inspect", + "cscli/cscli_collections_install", + "cscli/cscli_collections_list", + "cscli/cscli_collections_remove", + "cscli/cscli_collections_upgrade", + ], + }, + { + type: "doc", + label: "cscli completion", + id: "cscli/cscli_completion", + }, + { + type: "category", + label: "cscli config", + link: { + type: "doc", + id: "cscli/cscli_config", + }, + items: ["cscli/cscli_config_feature-flags", "cscli/cscli_config_show"], + }, + { + type: "category", + label: "cscli console", + link: { + type: "doc", + id: "cscli/cscli_console", + }, + items: [ + "cscli/cscli_console_disable", + "cscli/cscli_console_enable", + "cscli/cscli_console_enroll", + "cscli/cscli_console_status", + ], + }, + { + type: "category", + label: "cscli contexts", + link: { + type: "doc", + id: "cscli/cscli_contexts", + }, + items: [ + "cscli/cscli_contexts_install", + "cscli/cscli_contexts_remove", + "cscli/cscli_contexts_upgrade", + "cscli/cscli_contexts_list", + "cscli/cscli_contexts_inspect", + ], + }, + { + type: "category", + label: "cscli dashboard", + link: { + type: "doc", + id: "cscli/cscli_dashboard", + }, + items: [ + "cscli/cscli_dashboard_remove", + "cscli/cscli_dashboard_setup", + "cscli/cscli_dashboard_start", + "cscli/cscli_dashboard_stop", + "cscli/cscli_dashboard_show-password", + ], + }, + { + type: "category", + label: "cscli decisions", + link: { + type: "doc", + id: "cscli/cscli_decisions", + }, + items: [ + "cscli/cscli_decisions_add", + "cscli/cscli_decisions_delete", + "cscli/cscli_decisions_list", + "cscli/cscli_decisions_import", + ], + }, + { + type: "category", + label: "cscli hub", + link: { + type: "doc", + id: "cscli/cscli_hub", + }, + items: ["cscli/cscli_hub_list", "cscli/cscli_hub_update", "cscli/cscli_hub_upgrade", "cscli/cscli_hub_types"], + }, + { + type: "doc", + label: "cscli explain", + id: "cscli/cscli_explain", + }, + { + type: "category", + label: "cscli lapi", + link: { + type: "doc", + id: "cscli/cscli_lapi", + }, + items: [ + "cscli/cscli_lapi_context", + "cscli/cscli_lapi_context_add", + "cscli/cscli_lapi_context_delete", + "cscli/cscli_lapi_context_detect", + "cscli/cscli_lapi_context_status", + "cscli/cscli_lapi_register", + "cscli/cscli_lapi_status", + ], + }, + { + type: "category", + label: "cscli machines", + link: { + type: "doc", + id: "cscli/cscli_machines", + }, + items: [ + "cscli/cscli_machines_add", + "cscli/cscli_machines_delete", + "cscli/cscli_machines_inspect", + "cscli/cscli_machines_list", + "cscli/cscli_machines_prune", + "cscli/cscli_machines_validate", + ], + }, + { + type: "category", + label: "cscli metrics", + link: { + type: "doc", + id: "cscli/cscli_metrics", + }, + items: ["cscli/cscli_metrics_list", "cscli/cscli_metrics_show"], + }, + { + type: "category", + label: "cscli notifications", + link: { + type: "doc", + id: "cscli/cscli_notifications", + }, + items: [ + "cscli/cscli_notifications_inspect", + "cscli/cscli_notifications_list", + "cscli/cscli_notifications_reinject", + "cscli/cscli_notifications_test", + ], + }, + { + type: "category", + label: "cscli papi", + link: { + type: "doc", + id: "cscli/cscli_papi", + }, + items: ["cscli/cscli_papi_status", "cscli/cscli_papi_sync"], + }, + { + type: "category", + label: "cscli parsers", + link: { + type: "doc", + id: "cscli/cscli_parsers", + }, + items: [ + "cscli/cscli_parsers_inspect", + "cscli/cscli_parsers_install", + "cscli/cscli_parsers_list", + "cscli/cscli_parsers_remove", + "cscli/cscli_parsers_upgrade", + ], + }, + { + type: "category", + label: "cscli postoverflows", + link: { + type: "doc", + id: "cscli/cscli_postoverflows", + }, + items: [ + "cscli/cscli_postoverflows_inspect", + "cscli/cscli_postoverflows_install", + "cscli/cscli_postoverflows_list", + "cscli/cscli_postoverflows_remove", + "cscli/cscli_postoverflows_upgrade", + ], + }, + { + type: "category", + label: "cscli scenarios", + link: { + type: "doc", + id: "cscli/cscli_scenarios", + }, + items: [ + "cscli/cscli_scenarios_inspect", + "cscli/cscli_scenarios_install", + "cscli/cscli_scenarios_list", + "cscli/cscli_scenarios_remove", + "cscli/cscli_scenarios_upgrade", + ], + }, + { + type: "category", + label: "cscli support", + link: { + type: "doc", + id: "cscli/cscli_support", + }, + items: ["cscli/cscli_support_dump"], + }, + { + type: "category", + label: "cscli hubtest", + link: { + type: "doc", + id: "cscli/cscli_hubtest", + }, + items: [ + "cscli/cscli_hubtest_create", + "cscli/cscli_hubtest_run", + "cscli/cscli_hubtest_eval", + "cscli/cscli_hubtest_explain", + "cscli/cscli_hubtest_coverage", + "cscli/cscli_hubtest_info", + "cscli/cscli_hubtest_list", + "cscli/cscli_hubtest_clean", + ], + }, + { + type: "category", + label: "cscli simulation", + link: { + type: "doc", + id: "cscli/cscli_simulation", + }, + items: ["cscli/cscli_simulation_disable", "cscli/cscli_simulation_enable", "cscli/cscli_simulation_status"], + }, + { + type: "doc", + label: "cscli version", + id: "cscli/cscli_version", + }, + ], + betaSidebar: [ + { + type: "category", + label: "Preview Programs", + collapsed: true, + items: [ + { + type: "category", + label: "Crowdsec v1.5", + link: { + type: "doc", + id: "preview/1-5/intro", + }, + items: ["preview/1-5/crowdsec_preview_setup"], + }, + ], + }, + { + type: "doc", + label: "Backup Guide", + id: "preview/backup_guide", + }, + { + type: "category", + label: "Security Engine (Preview)", + collapsed: true, + items: [ + "preview/crowdsec_linux", + //"preview/crowdsec_freebsd", + "preview/crowdsec_windows", + { + type: "link", + label: "Helm/K8s", + href: "https://artifacthub.io/packages/helm/crowdsec/crowdsec", + }, + { + type: "link", + label: "Docker/Podman", + href: "https://hub.docker.com/r/crowdsecurity/crowdsec", + }, + ], + }, + { + type: "doc", + label: "Rollback to previous version", + id: "preview/rollback", + }, + ], + appSecSideBar: [ + { type: "doc", id: "appsec/intro", label: "CrowdSec WAF" }, + { + type: "category", + label: "Quickstart", + items: [ + { type: "doc", id: "appsec/quickstart/nginxopenresty" }, + { type: "doc", id: "appsec/quickstart/traefik" }, + ], + }, + { type: "doc", id: "appsec/configuration" }, + { + type: "category", + label: "Rules", + items: [ + { type: "doc", id: "appsec/rules_syntax" }, + { type: "doc", id: "appsec/hooks" }, + { type: "doc", id: "appsec/create_rules" }, + ], + }, + { + type: "doc", + id: "appsec/alerts_and_scenarios", + label: "Alerts & Scenarios", + }, + { type: "doc", id: "appsec/installation" }, + { type: "doc", id: "appsec/protocol", label: "Communication Protocol" }, + { type: "doc", id: "appsec/benchmark", label: "Benchmark" }, + { type: "doc", id: "appsec/troubleshooting" }, + ], } export default sidebarsConfig diff --git a/crowdsec-docs/sidebarsUnversioned.ts b/crowdsec-docs/sidebarsUnversioned.ts index 6de53a04b..74ee65bef 100644 --- a/crowdsec-docs/sidebarsUnversioned.ts +++ b/crowdsec-docs/sidebarsUnversioned.ts @@ -1,4 +1,4 @@ -import { SidebarsConfig } from "@docusaurus/plugin-content-docs" +import type { SidebarsConfig } from "@docusaurus/plugin-content-docs" type SidebarConfig = SidebarsConfig[string] @@ -659,12 +659,12 @@ const sidebarsUnversionedConfig: SidebarConfig = { export default sidebarsUnversionedConfig export const { - ctiApiSidebar, - consoleSidebar, - remediationSideBar, - blocklistsSideBar, - troubleshootingSideBar, - serviceApiSideBar, - guidesSideBar, - gettingStarted, + ctiApiSidebar, + consoleSidebar, + remediationSideBar, + blocklistsSideBar, + troubleshootingSideBar, + serviceApiSideBar, + guidesSideBar, + gettingStarted, } = sidebarsUnversionedConfig diff --git a/crowdsec-docs/src/components/RemediationSupportBadges.tsx b/crowdsec-docs/src/components/RemediationSupportBadges.tsx deleted file mode 100644 index 636419a08..000000000 --- a/crowdsec-docs/src/components/RemediationSupportBadges.tsx +++ /dev/null @@ -1,59 +0,0 @@ -import React from 'react'; -import { clsx } from 'clsx'; -import { - Tooltip, - TooltipContent, - TooltipProvider, - TooltipTrigger, - ToolTipArrow -} from "@site/src/ui/tooltip" - - -type RemediationSupportBadgesProps = { - Prometheus: boolean; // Prometheus is a boolean that controls the color of the Prometheus bubble - MTLS: boolean; // MTLS is a boolean that controls the color of the MTLS bubble - Mode: boolean; // Mode is a boolean that controls the color of the Mode bubble - Metrics: boolean; // Metrics is a boolean that controls the color of the Metrics bubble - Appsec?: boolean; // Appsec is a boolean that controls the color of the AppSec bubble -} - -const RemediationSupportBadge = ({ title, description, support }: { title: string, description: string, support: string }) => { - //ugly, for test - const colorClass = support === 'Unsupported' ? 'tw-bg-red-400' : 'tw-bg-green-400'; - return ( - - - -
- {title} - {support} -
-
- -

{description}

- -
-
-
- ); -} - -export default function RemediationSupportBadges({ MTLS, Metrics, Prometheus, Mode, Appsec }: RemediationSupportBadgesProps): React.JSX.Element { - const mtlsSupport = MTLS ? 'Supported' : 'Unsupported'; - const metricsSupport = Metrics ? 'Supported' : 'Unsupported'; - const prometheusSupport = Prometheus ? 'Supported' : 'Unsupported'; - const modeSupport = Mode ? 'Live & Stream' : 'Stream only'; - const appsecSupport = (Appsec !== undefined && Appsec) ? 'Supported' : 'Unsupported'; - - return ( -
- {Appsec !== undefined && ( - - )} - - - - -
- ); -} diff --git a/crowdsec-docs/src/components/academy-promo.tsx b/crowdsec-docs/src/components/academy-promo.tsx index c6f54750f..afdc262d7 100644 --- a/crowdsec-docs/src/components/academy-promo.tsx +++ b/crowdsec-docs/src/components/academy-promo.tsx @@ -1,38 +1,33 @@ import React from "react" const AcademyPromo = ({ ...props }): React.JSX.Element => { - const LINK = `https://academy.crowdsec.net/course/${props.course}${ - process.env.NODE_ENV === "production" ? props.utm : " " - }` - return ( -
-
-
- {!!props.title &&

{props.title}

} -
-
- {!!props.image && ( - - {props.title} - - )} -
-
- {!!props.description &&

{props.description}

} - {!!props.course && ( - - Learn with CrowdSec Academy - - )} -
-
-
-
-
- ) + const LINK = `https://academy.crowdsec.net/course/${props.course}${process.env.NODE_ENV === "production" ? props.utm : " "}` + return ( +
+
+
+ {!!props.title &&

{props.title}

} +
+
+ {!!props.image && ( + + {props.title} + + )} +
+
+ {!!props.description &&

{props.description}

} + {!!props.course && ( + + Learn with CrowdSec Academy + + )} +
+
+
+
+
+ ) } export default AcademyPromo diff --git a/crowdsec-docs/src/components/console-ad.tsx b/crowdsec-docs/src/components/console-ad.tsx index 8b116db06..f094ad883 100644 --- a/crowdsec-docs/src/components/console-ad.tsx +++ b/crowdsec-docs/src/components/console-ad.tsx @@ -1,25 +1,23 @@ -import React from "react" -import ThemedImage from "@theme/ThemedImage" import useBaseUrl from "@docusaurus/useBaseUrl" +import ThemedImage from "@theme/ThemedImage" +import React from "react" const SIGNUP_LINK = `https://app.crowdsec.net/signup${ - process.env.NODE_ENV === "production" - ? "?mtm_campaign=Console&mtm_source=docs&mtm_medium=tocAd&mtm_content=Console" - : "" + process.env.NODE_ENV === "production" ? "?mtm_campaign=Console&mtm_source=docs&mtm_medium=tocAd&mtm_content=Console" : "" }` const ConsoleAd = (): React.JSX.Element => { - return ( - - - - ) + return ( + + + + ) } export default ConsoleAd diff --git a/crowdsec-docs/src/components/console-promo.tsx b/crowdsec-docs/src/components/console-promo.tsx index 9bbab5d16..93ef72b19 100644 --- a/crowdsec-docs/src/components/console-promo.tsx +++ b/crowdsec-docs/src/components/console-promo.tsx @@ -1,36 +1,26 @@ -import React from "react" -import useBaseUrl from "@docusaurus/useBaseUrl" import Link from "@docusaurus/Link" +import useBaseUrl from "@docusaurus/useBaseUrl" +import React from "react" const ConsolePromo = ({ ...props }): React.JSX.Element => { - const url = useBaseUrl("/img/" + props.image) - return ( -
-
- {Boolean(props.title) ? ( -

- {props.title} -

- ) : null} - {Boolean(props.description) ? ( -

{props.description}

- ) : null} - - {props.text ?? "Get Started"} - -
- {Boolean(props.image) ? ( - {props.title} - ) : null} -
- ) + const url = useBaseUrl(`/img/${props.image}`) + return ( +
+
+ {props.title ? ( +

{props.title}

+ ) : null} + {props.description ?

{props.description}

: null} + + {props.text ?? "Get Started"} + +
+ {props.image ? {props.title} : null} +
+ ) } export default ConsolePromo diff --git a/crowdsec-docs/src/components/formatted-tabs.tsx b/crowdsec-docs/src/components/formatted-tabs.tsx index b8e9a73e1..f2543a2fa 100644 --- a/crowdsec-docs/src/components/formatted-tabs.tsx +++ b/crowdsec-docs/src/components/formatted-tabs.tsx @@ -1,16 +1,9 @@ -import React from "react" -import Tabs from "@theme/Tabs" -import TabItem from "@theme/TabItem" +import { cibDocker, cibKubernetes, cibLinux, cibPowershell, cibWindows, cilDollar, cilShortText } from "@coreui/icons" import CodeBlock from "@theme/CodeBlock" -import { - cibKubernetes, - cibLinux, - cibWindows, - cibPowershell, - cilShortText, - cibDocker, - cilDollar, -} from "@coreui/icons" +import TabItem from "@theme/TabItem" +import Tabs from "@theme/Tabs" +import React from "react" + /* * This component is used to display code snippets for both Unix and Windows operating systems. * It uses the Docusaurus Tabs component to display the code snippets for both operating systems. @@ -20,140 +13,117 @@ import { * The cmd prop is used to display the code snippet for Windows Command Prompt. */ const FormattedTabs = ({ ...props }): React.JSX.Element => { - const values = [] - let defaultValue = "" + const values = [] + let defaultValue = "" - if (props.bash !== undefined) { - defaultValue = "nix" - values.push({ label: "Linux/Freebsd", value: "nix", icon: cibLinux }) - } - if (props.powershell !== undefined) { - if (defaultValue === "") { - defaultValue = "windows" - } - values.push({ label: "Windows", value: "windows", icon: cibWindows }) - } + if (props.bash !== undefined) { + defaultValue = "nix" + values.push({ label: "Linux/Freebsd", value: "nix", icon: cibLinux }) + } + if (props.powershell !== undefined) { + if (defaultValue === "") { + defaultValue = "windows" + } + values.push({ label: "Windows", value: "windows", icon: cibWindows }) + } - if (props.docker !== undefined || props.dockerCompose !== undefined) { - if (defaultValue === "") { - defaultValue = "docker" - } - values.push({ label: "Docker", value: "docker", icon: cibDocker }) - } + if (props.docker !== undefined || props.dockerCompose !== undefined) { + if (defaultValue === "") { + defaultValue = "docker" + } + values.push({ label: "Docker", value: "docker", icon: cibDocker }) + } - if (props.k8s !== undefined || props.yaml !== undefined) { - if (defaultValue === "") { - defaultValue = "kubernetes" - } - values.push({ - label: "Kubernetes", - value: "kubernetes", - icon: cibKubernetes, - }) - } + if (props.k8s !== undefined || props.yaml !== undefined) { + if (defaultValue === "") { + defaultValue = "kubernetes" + } + values.push({ + label: "Kubernetes", + value: "kubernetes", + icon: cibKubernetes, + }) + } - return ( - - - {props.bash} - - - {props.cmd === undefined && props.powershell !== undefined ? ( - - {props.powershell} - - ) : null} - {props.cmd !== undefined && props.powershell === undefined ? ( - {props.cmd} - ) : null} - {props.cmd !== undefined && props.powershell !== undefined ? ( - - - - {props.powershell} - - - - - {props.cmd} - - - - ) : null} - - - {props.docker !== undefined && - props.dockerCompose === undefined ? ( - - {props.docker} - - ) : null} + return ( + + + {props.bash} + + + {props.cmd === undefined && props.powershell !== undefined ? ( + {props.powershell} + ) : null} + {props.cmd !== undefined && props.powershell === undefined ? ( + {props.cmd} + ) : null} + {props.cmd !== undefined && props.powershell !== undefined ? ( + + + {props.powershell} + + + {props.cmd} + + + ) : null} + + + {props.docker !== undefined && props.dockerCompose === undefined ? ( + {props.docker} + ) : null} - {props.dockerCompose !== undefined && - props.docker === undefined ? ( - {props.dockerCompose} - ) : null} + {props.dockerCompose !== undefined && props.docker === undefined ? ( + {props.dockerCompose} + ) : null} - {props.dockerCompose !== undefined && - props.docker !== undefined ? ( - - - - {props.docker} - - - - - {props.dockerCompose} - - - - ) : null} - - - {props.yaml !== undefined ? ( - {props.yaml} - ) : null} - {props.k8s !== undefined ? ( - {props.k8s} - ) : null} - - - ) + {props.dockerCompose !== undefined && props.docker !== undefined ? ( + + + {props.docker} + + + {props.dockerCompose} + + + ) : null} + + + {props.yaml !== undefined ? {props.yaml} : null} + {props.k8s !== undefined ? {props.k8s} : null} + + + ) } export default FormattedTabs diff --git a/crowdsec-docs/src/components/get-to-know-us.tsx b/crowdsec-docs/src/components/get-to-know-us.tsx index aa86dd86c..68a9c43bb 100644 --- a/crowdsec-docs/src/components/get-to-know-us.tsx +++ b/crowdsec-docs/src/components/get-to-know-us.tsx @@ -1,131 +1,89 @@ -import React from "react" import Link from "@docusaurus/Link" +import React from "react" type StaticData = { - icon: React.FC> - title: string - description: string - link: string + icon: React.FC> + title: string + description: string + link: string } const staticData: StaticData[] = [ - { - icon: () => ( - CrowdSec logo - ), - title: "What is CrowdSec?", - description: - "Data curated solution with a bunch of millions IPs detected by our large community.", - link: "https://www.crowdsec.net", - }, - { - icon: () => ( - security engines - ), - title: "Security Engines", - description: "Secure yourself.", - link: "/docs/intro", - }, - { - icon: () => πŸ–₯️, - title: "CrowdSec Console", - description: "Manage and monitor your security.", - link: "/u/console/intro", - }, - { - icon: () => πŸ§‘πŸ»β€πŸ’», - title: "CrowdSec CLI", - description: "Use our command line interface.", - link: "/docs/cscli/", - }, - { - icon: () => ( - Web application firewall - ), - title: "CrowdSec WAF", - description: "Protect your web applications.", - link: "/docs/appsec/intro", - }, - { - icon: () => ( - blocklists - ), - title: "Blocklists", - description: "Block thousands of IPs.", - link: "/u/blocklists/intro", - }, - { - icon: () => ( - world API - ), - title: "APIs", - description: "Integrate with your tools.", - link: "/u/cti_api/intro", - }, + { + icon: () => CrowdSec logo, + title: "What is CrowdSec?", + description: "Data curated solution with a bunch of millions IPs detected by our large community.", + link: "https://www.crowdsec.net", + }, + { + icon: () => security engines, + title: "Security Engines", + description: "Secure yourself.", + link: "/docs/intro", + }, + { + icon: () => πŸ–₯️, + title: "CrowdSec Console", + description: "Manage and monitor your security.", + link: "/u/console/intro", + }, + { + icon: () => πŸ§‘πŸ»β€πŸ’», + title: "CrowdSec CLI", + description: "Use our command line interface.", + link: "/docs/cscli/", + }, + { + icon: () => Web application firewall, + title: "CrowdSec WAF", + description: "Protect your web applications.", + link: "/docs/appsec/intro", + }, + { + icon: () => blocklists, + title: "Blocklists", + description: "Block thousands of IPs.", + link: "/u/blocklists/intro", + }, + { + icon: () => world API, + title: "APIs", + description: "Integrate with your tools.", + link: "/u/cti_api/intro", + }, ] const GetToKnowUs = (): React.JSX.Element => { - return ( -
-

Get to know us!

+ return ( +
+

Get to know us!

-
- {staticData.map((props, index) => ( - -
- - - +
+ {staticData.map((props, index) => ( + +
+ + + -
- - {props.title} - -

- {props.description} -

-
-
- - ))} -
-
- ) +
+ {props.title} +

{props.description}

+
+ + + ))} + +
+ ) } export default GetToKnowUs diff --git a/crowdsec-docs/src/components/github-icon-renderer.tsx b/crowdsec-docs/src/components/github-icon-renderer.tsx index 902ae8bba..9f7f6ba19 100644 --- a/crowdsec-docs/src/components/github-icon-renderer.tsx +++ b/crowdsec-docs/src/components/github-icon-renderer.tsx @@ -1,22 +1,18 @@ -import React from "react" import { cibGithub } from "@coreui/icons" import CIcon from "@coreui/icons-react" +import React from "react" const GithubIconRender = ({ ...props }): React.JSX.Element => { - return ( -
-
- - - -

Github

-
-
- ) + return ( +
+
+ + + +

Github

+
+
+ ) } export default GithubIconRender diff --git a/crowdsec-docs/src/components/home-page/features.tsx b/crowdsec-docs/src/components/home-page/features.tsx index bc26358d2..bac7e3256 100644 --- a/crowdsec-docs/src/components/home-page/features.tsx +++ b/crowdsec-docs/src/components/home-page/features.tsx @@ -1,121 +1,93 @@ -import React from "react" import clsx from "clsx" +import React from "react" import styles from "./HomepageFeatures.module.css" const FEATURES_LIST = [ - { - //screenshot terminal / apt-get ? - title: "Easy to Setup and Use", - Svg: require("../../static/img/icon-easytouse.svg").default, - link: "/docs/getting_started/install_crowdsec", - description: ( - <> - CrowdSec is easy to install, deploy and use regardless of your - knowledge. You don't need to be a security master to enjoy its - full capabilities. - - ), - }, - { - //screenshot metabase ? - title: "Replayable", - Svg: require("../../static/img/icon-replay.svg").default, - link: "/u/user_guides/replay_mode", - description: ( - <> - CrowdSec is able to process both live and old logs, which makes - it false-positive resilient. - - ), - }, - { - //screenshot de grafana - title: "Observable", - link: "/docs/observability/prometheus#exploitation-with-prometheus-server--grafana", - Svg: require("../../static/img/icon-data.svg").default, - description: ( - <> - CrowdSec is instrumented with Metabase & Prometheus to generate - out-of-the-box dashboards and monitor activity across your - assets. - - ), - }, - { - //schema api ? - title: "API-Driven", - Svg: require("../../static/img/icon-api.svg").default, - link: "/docs/local_api/intro", - description: ( - <> - All components communicate via HTTP API, making it easy to cover - complex setups. - - ), - }, - { - //schema api ? - title: "Participative", - link: "/docs/central_api/intro", - Svg: require("../../static/img/icon-collaborative.svg").default, - description: ( - <> - You can share malevolent IP data with your fellow users, have - each other's backs and outnumber hackers. - - ), - }, - { - //schema api ? - title: "Open Source", - Svg: require("../../static/img/icon-opensource.svg").default, - link: "/docs/faq#what-licence-is-crowdsec-released-under-", - description: ( - <> - CrowdSec is as open source and free as it can be through an MIT - license. No back doors. No shenanigans. - - ), - }, - //community driven -> - //open-source - //detect here apply there - //block anything, not just ips + { + //screenshot terminal / apt-get ? + title: "Easy to Setup and Use", + Svg: require("../../static/img/icon-easytouse.svg").default, + link: "/docs/getting_started/install_crowdsec", + description: ( + <> + CrowdSec is easy to install, deploy and use regardless of your knowledge. You don't need to be a security master to enjoy + its full capabilities. + + ), + }, + { + //screenshot metabase ? + title: "Replayable", + Svg: require("../../static/img/icon-replay.svg").default, + link: "/u/user_guides/replay_mode", + description: <>CrowdSec is able to process both live and old logs, which makes it false-positive resilient., + }, + { + //screenshot de grafana + title: "Observable", + link: "/docs/observability/prometheus#exploitation-with-prometheus-server--grafana", + Svg: require("../../static/img/icon-data.svg").default, + description: ( + <> + CrowdSec is instrumented with Metabase & Prometheus to generate out-of-the-box dashboards and monitor activity across your + assets. + + ), + }, + { + //schema api ? + title: "API-Driven", + Svg: require("../../static/img/icon-api.svg").default, + link: "/docs/local_api/intro", + description: <>All components communicate via HTTP API, making it easy to cover complex setups., + }, + { + //schema api ? + title: "Participative", + link: "/docs/central_api/intro", + Svg: require("../../static/img/icon-collaborative.svg").default, + description: <>You can share malevolent IP data with your fellow users, have each other's backs and outnumber hackers., + }, + { + //schema api ? + title: "Open Source", + Svg: require("../../static/img/icon-opensource.svg").default, + link: "/docs/faq#what-licence-is-crowdsec-released-under-", + description: <>CrowdSec is as open source and free as it can be through an MIT license. No back doors. No shenanigans., + }, + //community driven -> + //open-source + //detect here apply there + //block anything, not just ips ] const Feature = ({ Svg, title, description, link }): React.JSX.Element => { - return ( -
- -
-

{title}

-

{description}

-
-
- ) + return ( +
+ +
+

{title}

+

{description}

+
+
+ ) } -const HomepageFeatures = () => { - return ( -
-
-
- {FEATURES_LIST.map((props, idx) => ( - - ))} -
-
-
- ) -} +const HomepageFeatures = () => ( +
+
+
+ {FEATURES_LIST.map((props) => ( + + ))} +
+
+
+) export default HomepageFeatures diff --git a/crowdsec-docs/src/components/quick-start.tsx b/crowdsec-docs/src/components/quick-start.tsx index a3eab7829..e579d7aee 100644 --- a/crowdsec-docs/src/components/quick-start.tsx +++ b/crowdsec-docs/src/components/quick-start.tsx @@ -1,121 +1,106 @@ -import React from "react" -import cibLinux from "@site/static/img/logo/linux-colored.svg" +import CIcon from "@coreui/icons-react" +import Link from "@docusaurus/Link" +import cibApple from "@site/static/img/logo/apple-colored.svg" import cibDocker from "@site/static/img/logo/docker-colored.svg" -import cibWindows from "@site/static/img/logo/windows-colored.svg" import cibFreebsd from "@site/static/img/logo/freebsd-colored.svg" -import cibApple from "@site/static/img/logo/apple-colored.svg" +import cibKubernetes from "@site/static/img/logo/kubernetes-colored.svg" +import cibLinux from "@site/static/img/logo/linux-colored.svg" +import cibWindows from "@site/static/img/logo/windows-colored.svg" import opnsenseLogo from "@site/static/img/logo-opnsense.svg" import pfSenseLogo from "@site/static/img/logo-pfsense.svg" -import cibKubernetes from "@site/static/img/logo/kubernetes-colored.svg" import whmLogo from "@site/static/img/logo-whm.svg" -import Link from "@docusaurus/Link" -import CIcon from "@coreui/icons-react" +import React from "react" const staticData = [ - { - icon: cibLinux, - text: "Linux", - link: "/u/getting_started/installation/linux", - }, - { - icon: cibWindows, - text: "Windows", - link: "/u/getting_started/installation/windows", - }, - { - icon: cibFreebsd, - text: "FreeBSD", - link: "/u/getting_started/installation/freebsd", - }, - { - icon: cibApple, - text: "macOS", - link: "/u/getting_started/installation/macos", - }, - { - icon: cibDocker, - text: "Docker", - link: "/u/getting_started/installation/docker", - }, - { - icon: cibKubernetes, - text: "Kubernetes", - link: "/u/getting_started/installation/kubernetes", - }, - { - icon: opnsenseLogo, - text: "OPNsense", - link: "/u/getting_started/installation/opnsense", - }, - { - icon: pfSenseLogo, - text: "pfSense", - link: "/u/getting_started/installation/pfsense", - }, - { - icon: whmLogo, - text: "WHM", - link: "/u/getting_started/installation/whm", - }, - // Experimental, not linking to it - // { - // icon: cloudwaysLogo, - // text: "Cloudways", - // link: "/u/getting_started/installation/cloudways", - // }, + { + icon: cibLinux, + text: "Linux", + link: "/u/getting_started/installation/linux", + }, + { + icon: cibWindows, + text: "Windows", + link: "/u/getting_started/installation/windows", + }, + { + icon: cibFreebsd, + text: "FreeBSD", + link: "/u/getting_started/installation/freebsd", + }, + { + icon: cibApple, + text: "macOS", + link: "/u/getting_started/installation/macos", + }, + { + icon: cibDocker, + text: "Docker", + link: "/u/getting_started/installation/docker", + }, + { + icon: cibKubernetes, + text: "Kubernetes", + link: "/u/getting_started/installation/kubernetes", + }, + { + icon: opnsenseLogo, + text: "OPNsense", + link: "/u/getting_started/installation/opnsense", + }, + { + icon: pfSenseLogo, + text: "pfSense", + link: "/u/getting_started/installation/pfsense", + }, + { + icon: whmLogo, + text: "WHM", + link: "/u/getting_started/installation/whm", + }, + // Experimental, not linking to it + // { + // icon: cloudwaysLogo, + // text: "Cloudways", + // link: "/u/getting_started/installation/cloudways", + // }, ] const QuickStart = (): React.JSX.Element => { - return ( -
-
-

- Select your environment -

-

- We can secure your stack. Just select your platform and get - started. -

-
+ return ( +
+
+

Select your environment

+

+ We can secure your stack. Just select your platform and get started. +

+
-
- {staticData.map((props) => ( - -
- - {(!Array.isArray(props.icon) && ( - - )) || ( - - )} - +
+ {staticData.map((props) => ( + +
+ + {(!Array.isArray(props.icon) && ) || ( + // biome-ignore lint/suspicious/noExplicitAny: We need to cast to any for CIcon to work with icons + + )} + - - {props.text} - -
- - ))} -
-

- *Logos and trademarks, such as the logos above, are the property - of their respective owners and are used here for identification - purposes only. -

-
- ) + {props.text} + + + ))} + +

+ *Logos and trademarks, such as the logos above, are the property of their respective owners and are used here for + identification purposes only. +

+
+ ) } export default QuickStart diff --git a/crowdsec-docs/src/components/remediation-features/index.tsx b/crowdsec-docs/src/components/remediation-features/index.tsx index cd26a9c8c..6a0a34aa3 100644 --- a/crowdsec-docs/src/components/remediation-features/index.tsx +++ b/crowdsec-docs/src/components/remediation-features/index.tsx @@ -1,28 +1,18 @@ +import useBaseUrl from "@docusaurus/useBaseUrl" import React from "react" import styles from "./RemediationFeatures.module.css" -import useBaseUrl from "@docusaurus/useBaseUrl" const RemediationFeatures = (): React.JSX.Element => { - return ( -
-
-

- {" "} - Examples of detected behaviors{" "} -

-
- -
-
-
- ) + return ( +
+
+

Examples of detected behaviors

+
+ Remediation Features +
+
+
+ ) } export default RemediationFeatures diff --git a/crowdsec-docs/src/components/remediation-support-badge.tsx b/crowdsec-docs/src/components/remediation-support-badge.tsx new file mode 100644 index 000000000..d66f354d2 --- /dev/null +++ b/crowdsec-docs/src/components/remediation-support-badge.tsx @@ -0,0 +1,66 @@ +import { ToolTipArrow, Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from "@site/src/ui/tooltip" +import { clsx } from "clsx" +import React from "react" + +type RemediationSupportBadgesProps = { + Prometheus: boolean // Prometheus is a boolean that controls the color of the Prometheus bubble + MTLS: boolean // MTLS is a boolean that controls the color of the MTLS bubble + Mode: boolean // Mode is a boolean that controls the color of the Mode bubble + Metrics: boolean // Metrics is a boolean that controls the color of the Metrics bubble + Appsec?: boolean // Appsec is a boolean that controls the color of the AppSec bubble +} + +const RemediationSupportBadge = ({ title, description, support }: { title: string; description: string; support: string }) => { + //ugly, for test + const colorClass = support === "Unsupported" ? "tw-bg-red-400" : "tw-bg-green-400" + return ( + + + +
+ {title} + {support} +
+
+ +

{description}

+ +
+
+
+ ) +} + +export default function RemediationSupportBadges({ + MTLS, + Metrics, + Prometheus, + Mode, + Appsec, +}: Readonly): React.JSX.Element { + const mtlsSupport = MTLS ? "Supported" : "Unsupported" + const metricsSupport = Metrics ? "Supported" : "Unsupported" + const prometheusSupport = Prometheus ? "Supported" : "Unsupported" + const modeSupport = Mode ? "Live & Stream" : "Stream only" + const appsecSupport = Appsec !== undefined && Appsec ? "Supported" : "Unsupported" + + return ( +
+ {Appsec !== undefined && ( + + )} + + + + +
+ ) +} diff --git a/crowdsec-docs/src/components/table-render.tsx b/crowdsec-docs/src/components/table-render.tsx index 6958f6cd8..69abc2729 100644 --- a/crowdsec-docs/src/components/table-render.tsx +++ b/crowdsec-docs/src/components/table-render.tsx @@ -1,100 +1,91 @@ -import React, { useState, useEffect, useMemo } from "react" -import { MaterialReactTable } from "material-react-table" -import { createTheme, ThemeProvider } from "@mui/material" import BrowserOnly from "@docusaurus/BrowserOnly" import { useColorMode } from "@docusaurus/theme-common" +import { createTheme, ThemeProvider } from "@mui/material" +import { MaterialReactTable } from "material-react-table" +import React, { useEffect, useMemo, useState } from "react" -const TableRender = ({ - columns, - url, - include = [], - exclude = [], -}): React.JSX.Element => { - const [jsonContent, setJsonContent] = useState([]) - const { colorMode } = useColorMode() +const TableRender = ({ columns, url, include = [], exclude = [] }): React.JSX.Element => { + const [jsonContent, setJsonContent] = useState([]) + const { colorMode } = useColorMode() - const theme = useMemo(() => { - const isLight = colorMode === "light" + const theme = useMemo(() => { + const isLight = colorMode === "light" - return createTheme({ - palette: { - mode: colorMode, - background: { - default: isLight ? "rgb(255,255,255)" : "#1b1b1d", - }, - }, - }) - }, [colorMode]) + return createTheme({ + palette: { + mode: colorMode, + background: { + default: isLight ? "rgb(255,255,255)" : "#1b1b1d", + }, + }, + }) + }, [colorMode]) - useEffect(() => { - fetch(url) - .then((res) => res.json()) - .then((data) => { - const updatedData = [] - const names = [] + useEffect(() => { + fetch(url) + .then((res) => res.json()) + .then((data) => { + const updatedData = [] + const names = [] - Object.keys(data).forEach((key, i) => { - // filter duplicate names - const item = data[key] - const name = item["name"] - for (const element of exclude) { - if (name.includes(element)) { - return - } - } - for (const element of include) { - if (!name.includes(element)) { - return - } - } - if (names.includes(name)) { - return - } + Object.keys(data).forEach((key) => { + // filter duplicate names + const item = data[key] + const name = item.name + for (const element of exclude) { + if (name.includes(element)) { + return + } + } + for (const element of include) { + if (!name.includes(element)) { + return + } + } + if (names.includes(name)) { + return + } - names.push(name) - updatedData.push({ - ...item, - // flattening list of strings into CSV strings allow global filtering on them - // /!\ it requires special handling in the rendering side (see crowdsec-docs/docs/cti_api/taxonomy) /!\ - ...(item.behaviors - ? { behaviors: item.behaviors.join("\n") } - : {}), - ...(item.mitre_attacks - ? { mitre_attacks: item.mitre_attacks.join("\n") } - : {}), - ...(item.cves ? { cves: item.cves.join("\n") } : {}), - }) - }) + names.push(name) + updatedData.push({ + ...item, + // flattening list of strings into CSV strings allow global filtering on them + // /!\ it requires special handling in the rendering side (see crowdsec-docs/docs/cti_api/taxonomy) /!\ + ...(item.behaviors ? { behaviors: item.behaviors.join("\n") } : {}), + ...(item.mitre_attacks ? { mitre_attacks: item.mitre_attacks.join("\n") } : {}), + ...(item.cves ? { cves: item.cves.join("\n") } : {}), + }) + }) - setJsonContent(updatedData) - }) - // execute this fetch only once (on mount) - }, []) + setJsonContent(updatedData) + }) + // execute this fetch only once (on mount) + }, [include, exclude, url]) - if (!columns || !jsonContent) { - return <> - } + if (!columns || !jsonContent) { + return null + } - return ( - - {() => ( - - - - )} - - ) + return ( + + {() => ( + + + + )} + + ) } export default TableRender diff --git a/crowdsec-docs/src/pages/index.tsx b/crowdsec-docs/src/pages/index.tsx index f99552c52..fb2505383 100644 --- a/crowdsec-docs/src/pages/index.tsx +++ b/crowdsec-docs/src/pages/index.tsx @@ -1,78 +1,63 @@ -import React from "react" -import clsx from "clsx" -import Layout from "@theme/Layout" import Link from "@docusaurus/Link" -import styles from "./index.module.css" -import QuickStart from "../components/quick-start" +import Layout from "@theme/Layout" +import clsx from "clsx" +import type React from "react" import GetToKnowUs from "../components/get-to-know-us" +import QuickStart from "../components/quick-start" +import styles from "./index.module.css" -const HomePageHeader = (): JSX.Element => { - return ( -
-
-
-
-
-
-

- Welcome to the CrowdSec Documentation -

-

- CrowdSec provides open source solution for - detecting and blocking malicious IPs, - safeguarding both infrastructure and application - security. -

-
- -
-
- - Get started - - - Explore the Console - - - Online Sandbox - -
-
+const HomePageHeader = (): React.JSX.Element => { + return ( +
+
+
+
+
+
+

Welcome to the CrowdSec Documentation

+

+ CrowdSec provides open source solution for detecting and blocking malicious IPs, safeguarding both + infrastructure and application security. +

+
+ CrowdSec Logo +
+
+ + Get started + + + Explore the Console + + + Online Sandbox + +
+
- + - -
-
- ) + +
+
+ ) } const HomePage = () => { - return ( - - - - ) + return ( + + + + ) } export default HomePage diff --git a/crowdsec-docs/src/theme/Root.tsx b/crowdsec-docs/src/theme/Root.tsx index 0e5814e01..085d75f38 100644 --- a/crowdsec-docs/src/theme/Root.tsx +++ b/crowdsec-docs/src/theme/Root.tsx @@ -1,13 +1,13 @@ -import React from "react" import { useStorageSlot } from "@docusaurus/theme-common" +import type React from "react" import CookieConsent from "../../plugins/gtag/theme/cookieconsent" -export default function Root({ children }) { - const [value, _] = useStorageSlot("docusaurus.cookieConsent") - return ( - <> - {children} - {value === null && } - - ) +export default function Root({ children }): React.JSX.Element { + const [value, _] = useStorageSlot("docusaurus.cookieConsent") + return ( + <> + {children} + {value === null && } + + ) } diff --git a/crowdsec-docs/src/theme/TOC/index.tsx b/crowdsec-docs/src/theme/TOC/index.tsx index 3f5abad70..6995a2ae0 100644 --- a/crowdsec-docs/src/theme/TOC/index.tsx +++ b/crowdsec-docs/src/theme/TOC/index.tsx @@ -1,9 +1,10 @@ // Import necessary components and modules -import React from "react" -import clsx from "clsx" + +import ConsoleAd from "@site/src/components/console-ad" import TOCItems from "@theme/TOCItems" +import clsx from "clsx" +import type React from "react" import styles from "./styles.module.css" -import ConsoleAd from "@site/src/components/console-ad" // Define custom classNames const LINK_CLASS_NAME = "table-of-contents__link toc-highlight" @@ -11,23 +12,12 @@ const LINK_ACTIVE_CLASS_NAME = "table-of-contents__link--active" // Modified TOC component const TOC = ({ className, ...props }): React.JSX.Element => { - return ( -
- - -
- ) + return ( +
+ + +
+ ) } export default TOC diff --git a/crowdsec-docs/src/theme/doc-item/layout/index.tsx b/crowdsec-docs/src/theme/doc-item/layout/index.tsx index 8d0bfb8b1..f62c97d89 100644 --- a/crowdsec-docs/src/theme/doc-item/layout/index.tsx +++ b/crowdsec-docs/src/theme/doc-item/layout/index.tsx @@ -1,58 +1,57 @@ // Import necessary components and modules -import React from "react" -import clsx from "clsx" -import { useWindowSize } from "@docusaurus/theme-common" + import { useDoc } from "@docusaurus/plugin-content-docs/client" +import { useWindowSize } from "@docusaurus/theme-common" +import DocBreadcrumbs from "@theme/DocBreadcrumbs" +import DocItemContent from "@theme/DocItem/Content" import DocItemPaginator from "@theme/DocItem/Paginator" -import DocVersionBanner from "@theme/DocVersionBanner" -import DocVersionBadge from "@theme/DocVersionBadge" -import DocItemTOCMobile from "@theme/DocItem/TOC/Mobile" import DocItemTOCDesktop from "@theme/DocItem/TOC/Desktop" -import DocItemContent from "@theme/DocItem/Content" -import DocBreadcrumbs from "@theme/DocBreadcrumbs" +import DocItemTOCMobile from "@theme/DocItem/TOC/Mobile" +import DocVersionBadge from "@theme/DocVersionBadge" +import DocVersionBanner from "@theme/DocVersionBanner" +import clsx from "clsx" +import type { PropsWithChildren } from "react" +import React from "react" import styles from "./styles.module.css" // Function to decide whether to render the TOC on mobile or desktop const useDocTOC = () => { - const { frontMatter, toc } = useDoc() - const windowSize = useWindowSize() - const hidden = frontMatter.hide_table_of_contents - const canRender = !hidden && toc.length > 0 - const mobile = canRender ? : undefined - const desktop = - windowSize === "desktop" || windowSize === "ssr" ? ( - - ) : undefined + const { frontMatter, toc } = useDoc() + const windowSize = useWindowSize() + const hidden = frontMatter.hide_table_of_contents + const canRender = !hidden && toc.length > 0 + const mobile = canRender ? : undefined + const desktop = windowSize === "desktop" || windowSize === "ssr" ? : undefined - return { - hidden, - mobile, - desktop, - } + return { + hidden, + mobile, + desktop, + } } // Modified DocItemLayout component -export default function DocItemLayout({ children }) { - const docTOC = useDocTOC() +const DocItemLayout = ({ children }: PropsWithChildren): React.JSX.Element => { + const docTOC = useDocTOC() - return ( -
-
- -
-
- - - {docTOC.mobile} - {children} - {/* */} -
- -
-
- {docTOC.desktop && ( -
{docTOC.desktop}
- )} -
- ) + return ( +
+
+ +
+
+ + + {docTOC.mobile} + {children} + {/* */} +
+ +
+
+ {docTOC.desktop &&
{docTOC.desktop}
} +
+ ) } + +export default DocItemLayout diff --git a/crowdsec-docs/src/ui/tooltip.tsx b/crowdsec-docs/src/ui/tooltip.tsx index 804a570fa..4cd06c711 100644 --- a/crowdsec-docs/src/ui/tooltip.tsx +++ b/crowdsec-docs/src/ui/tooltip.tsx @@ -1,7 +1,6 @@ -import * as React from "react" import * as TooltipPrimitive from "@radix-ui/react-tooltip" - import { cn } from "@site/src/utils" +import React from "react" const TooltipProvider = TooltipPrimitive.Provider @@ -12,8 +11,8 @@ const TooltipTrigger = TooltipPrimitive.Trigger const ToolTipArrow = TooltipPrimitive.Arrow const TooltipContent = React.forwardRef< - React.ElementRef, - React.ComponentPropsWithoutRef + React.ElementRef, + React.ComponentPropsWithoutRef >(({ className, sideOffset = 4, ...props }, ref) => ( CrowdSec diff --git a/crowdsec-docs/unversioned/bouncers/blocklist-mirror.mdx b/crowdsec-docs/unversioned/bouncers/blocklist-mirror.mdx index d1e6467eb..e9ce43125 100644 --- a/crowdsec-docs/unversioned/bouncers/blocklist-mirror.mdx +++ b/crowdsec-docs/unversioned/bouncers/blocklist-mirror.mdx @@ -7,7 +7,7 @@ sidebar_position: 7 import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; import useBaseUrl from '@docusaurus/useBaseUrl'; -import RemediationSupportBadges from '@site/src/components/RemediationSupportBadges.tsx'; +import RemediationSupportBadges from '@site/src/components/remediation-support-badge';

diff --git a/crowdsec-docs/unversioned/bouncers/cloudflare-workers.mdx b/crowdsec-docs/unversioned/bouncers/cloudflare-workers.mdx index 9906816fb..b26bd6c90 100644 --- a/crowdsec-docs/unversioned/bouncers/cloudflare-workers.mdx +++ b/crowdsec-docs/unversioned/bouncers/cloudflare-workers.mdx @@ -6,7 +6,7 @@ title: CrowdSec Cloudflare Worker import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; import useBaseUrl from '@docusaurus/useBaseUrl'; -import RemediationSupportBadges from '@site/src/components/RemediationSupportBadges.tsx'; +import RemediationSupportBadges from '@site/src/components/remediation-support-badge'; diff --git a/crowdsec-docs/unversioned/bouncers/cloudflare.mdx b/crowdsec-docs/unversioned/bouncers/cloudflare.mdx index 45236aa3f..bbfaaa961 100644 --- a/crowdsec-docs/unversioned/bouncers/cloudflare.mdx +++ b/crowdsec-docs/unversioned/bouncers/cloudflare.mdx @@ -6,7 +6,7 @@ title: Cloudflare import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; import useBaseUrl from '@docusaurus/useBaseUrl'; -import RemediationSupportBadges from '@site/src/components/RemediationSupportBadges.tsx'; +import RemediationSupportBadges from '@site/src/components/remediation-support-badge';

diff --git a/crowdsec-docs/unversioned/bouncers/custom.mdx b/crowdsec-docs/unversioned/bouncers/custom.mdx index bdde1f4ca..9591e6b52 100644 --- a/crowdsec-docs/unversioned/bouncers/custom.mdx +++ b/crowdsec-docs/unversioned/bouncers/custom.mdx @@ -7,7 +7,7 @@ sidebar_position: 5 import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; import useBaseUrl from '@docusaurus/useBaseUrl'; -import RemediationSupportBadges from '@site/src/components/RemediationSupportBadges.tsx'; +import RemediationSupportBadges from '@site/src/components/remediation-support-badge';

diff --git a/crowdsec-docs/unversioned/bouncers/fastly.mdx b/crowdsec-docs/unversioned/bouncers/fastly.mdx index ea5f50d3a..02d897c19 100644 --- a/crowdsec-docs/unversioned/bouncers/fastly.mdx +++ b/crowdsec-docs/unversioned/bouncers/fastly.mdx @@ -6,7 +6,7 @@ title: Fastly import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; import useBaseUrl from '@docusaurus/useBaseUrl'; -import RemediationSupportBadges from '@site/src/components/RemediationSupportBadges.tsx'; +import RemediationSupportBadges from '@site/src/components/remediation-support-badge';

diff --git a/crowdsec-docs/unversioned/bouncers/firewall.mdx b/crowdsec-docs/unversioned/bouncers/firewall.mdx index d859e817e..5072dfb47 100644 --- a/crowdsec-docs/unversioned/bouncers/firewall.mdx +++ b/crowdsec-docs/unversioned/bouncers/firewall.mdx @@ -7,7 +7,7 @@ sidebar_position: 1 import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; import useBaseUrl from '@docusaurus/useBaseUrl'; -import RemediationSupportBadges from '@site/src/components/RemediationSupportBadges.tsx'; +import RemediationSupportBadges from '@site/src/components/remediation-support-badge';

diff --git a/crowdsec-docs/unversioned/bouncers/haproxy.mdx b/crowdsec-docs/unversioned/bouncers/haproxy.mdx index b2acb224d..1c142acb6 100644 --- a/crowdsec-docs/unversioned/bouncers/haproxy.mdx +++ b/crowdsec-docs/unversioned/bouncers/haproxy.mdx @@ -6,7 +6,7 @@ title: HAProxy import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; import useBaseUrl from '@docusaurus/useBaseUrl'; -import RemediationSupportBadges from '@site/src/components/RemediationSupportBadges.tsx'; +import RemediationSupportBadges from '@site/src/components/remediation-support-badge';

CrowdSec diff --git a/crowdsec-docs/unversioned/bouncers/ingress-nginx.mdx b/crowdsec-docs/unversioned/bouncers/ingress-nginx.mdx index 00143e8fa..4df587bb0 100644 --- a/crowdsec-docs/unversioned/bouncers/ingress-nginx.mdx +++ b/crowdsec-docs/unversioned/bouncers/ingress-nginx.mdx @@ -7,7 +7,7 @@ sidebar_position: 1 import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; import useBaseUrl from '@docusaurus/useBaseUrl'; -import RemediationSupportBadges from '@site/src/components/RemediationSupportBadges.tsx'; +import RemediationSupportBadges from '@site/src/components/remediation-support-badge';

CrowdSec diff --git a/crowdsec-docs/unversioned/bouncers/magento.mdx b/crowdsec-docs/unversioned/bouncers/magento.mdx index 4ae69b8ae..2db828b77 100644 --- a/crowdsec-docs/unversioned/bouncers/magento.mdx +++ b/crowdsec-docs/unversioned/bouncers/magento.mdx @@ -7,7 +7,7 @@ sidebar_position: 1 import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; import useBaseUrl from '@docusaurus/useBaseUrl'; -import RemediationSupportBadges from '@site/src/components/RemediationSupportBadges.tsx'; +import RemediationSupportBadges from '@site/src/components/remediation-support-badge';

CrowdSec diff --git a/crowdsec-docs/unversioned/bouncers/misp-feed-generator.mdx b/crowdsec-docs/unversioned/bouncers/misp-feed-generator.mdx index 1eb2bf29b..ae58bc5c9 100644 --- a/crowdsec-docs/unversioned/bouncers/misp-feed-generator.mdx +++ b/crowdsec-docs/unversioned/bouncers/misp-feed-generator.mdx @@ -7,7 +7,7 @@ sidebar_position: 7 import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; import useBaseUrl from '@docusaurus/useBaseUrl'; -import RemediationSupportBadges from '@site/src/components/RemediationSupportBadges.tsx'; +import RemediationSupportBadges from '@site/src/components/remediation-support-badge';

CrowdSec diff --git a/crowdsec-docs/unversioned/bouncers/nginx.mdx b/crowdsec-docs/unversioned/bouncers/nginx.mdx index 56f90ae27..d6f86cae0 100644 --- a/crowdsec-docs/unversioned/bouncers/nginx.mdx +++ b/crowdsec-docs/unversioned/bouncers/nginx.mdx @@ -7,7 +7,7 @@ sidebar_position: 1 import Tabs from "@theme/Tabs"; import TabItem from "@theme/TabItem"; import useBaseUrl from "@docusaurus/useBaseUrl"; -import RemediationSupportBadges from '@site/src/components/RemediationSupportBadges.tsx'; +import RemediationSupportBadges from '@site/src/components/remediation-support-badge';

CrowdSec diff --git a/crowdsec-docs/unversioned/bouncers/php-lib.mdx b/crowdsec-docs/unversioned/bouncers/php-lib.mdx index a4199717e..aa9d2440f 100644 --- a/crowdsec-docs/unversioned/bouncers/php-lib.mdx +++ b/crowdsec-docs/unversioned/bouncers/php-lib.mdx @@ -7,7 +7,7 @@ sidebar_position: 1 import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; import useBaseUrl from '@docusaurus/useBaseUrl'; -import RemediationSupportBadges from '@site/src/components/RemediationSupportBadges.tsx'; +import RemediationSupportBadges from '@site/src/components/remediation-support-badge';

CrowdSec diff --git a/crowdsec-docs/unversioned/bouncers/php.mdx b/crowdsec-docs/unversioned/bouncers/php.mdx index 28e1045d5..288d75721 100644 --- a/crowdsec-docs/unversioned/bouncers/php.mdx +++ b/crowdsec-docs/unversioned/bouncers/php.mdx @@ -7,7 +7,7 @@ sidebar_position: 1 import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; import useBaseUrl from '@docusaurus/useBaseUrl'; -import RemediationSupportBadges from '@site/src/components/RemediationSupportBadges.tsx'; +import RemediationSupportBadges from '@site/src/components/remediation-support-badge';

CrowdSec diff --git a/crowdsec-docs/unversioned/bouncers/windows-firewall.mdx b/crowdsec-docs/unversioned/bouncers/windows-firewall.mdx index 5be9f2fb6..9d99dd11a 100644 --- a/crowdsec-docs/unversioned/bouncers/windows-firewall.mdx +++ b/crowdsec-docs/unversioned/bouncers/windows-firewall.mdx @@ -6,7 +6,7 @@ title: Windows Firewall import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; import useBaseUrl from '@docusaurus/useBaseUrl'; -import RemediationSupportBadges from '@site/src/components/RemediationSupportBadges.tsx'; +import RemediationSupportBadges from '@site/src/components/remediation-support-badge';

CrowdSec diff --git a/crowdsec-docs/unversioned/bouncers/wordpress.mdx b/crowdsec-docs/unversioned/bouncers/wordpress.mdx index 963bbee11..392ce4bf5 100644 --- a/crowdsec-docs/unversioned/bouncers/wordpress.mdx +++ b/crowdsec-docs/unversioned/bouncers/wordpress.mdx @@ -6,7 +6,7 @@ title: WordPress Plugin import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; import useBaseUrl from '@docusaurus/useBaseUrl'; -import RemediationSupportBadges from '@site/src/components/RemediationSupportBadges.tsx'; +import RemediationSupportBadges from '@site/src/components/remediation-support-badge';

CrowdSec From 18f37ee5005c1bafff90c61ad39df7e457be1e62 Mon Sep 17 00:00:00 2001 From: Roussange Alexandre Date: Tue, 8 Jul 2025 10:04:39 +0200 Subject: [PATCH 3/9] refactor: :recycle: move all file to tsx and remove module.css when it was possible --- biome.json | 20 +- crowdsec-docs/components.json | 19 +- .../getting_started/{intro.md => intro.mdx} | 4 - crowdsec-docs/docusaurus.config.ts | 56 +- crowdsec-docs/package-lock.json | 39 +- crowdsec-docs/package.json | 6 +- crowdsec-docs/sidebars.ts | 8 +- crowdsec-docs/sidebarsUnversioned.ts | 8 +- .../src/components/academy-promo.tsx | 12 +- crowdsec-docs/src/components/console-ad.tsx | 17 +- .../src/components/console-promo.tsx | 47 +- .../src/components/formatted-tabs.tsx | 36 +- .../src/components/get-to-know-us.tsx | 89 --- .../src/components/github-icon-renderer.tsx | 14 +- .../home-page/HomepageFeatures.module.css | 15 - .../src/components/home-page/features.tsx | 24 +- .../components/home-page/get-to-know-us.tsx | 84 ++ .../src/components/home-page/home-item.tsx | 30 + .../src/components/home-page/quick-start.tsx | 94 +++ crowdsec-docs/src/components/quick-start.tsx | 106 --- .../RemediationFeatures.module.css | 23 - .../components/remediation-features/index.tsx | 15 +- .../components/remediation-support-badge.tsx | 46 +- crowdsec-docs/src/components/table-render.tsx | 54 +- crowdsec-docs/src/css/custom.css | 743 +++++++++--------- crowdsec-docs/src/pages/index.module.css | 26 - crowdsec-docs/src/pages/index.tsx | 62 +- crowdsec-docs/src/theme/Root.tsx | 10 +- crowdsec-docs/src/theme/TOC/index.tsx | 39 +- crowdsec-docs/src/theme/TOC/styles.module.css | 16 - crowdsec-docs/src/theme/Tabs/index.js | 124 --- .../src/theme/Tabs/styles.module.css | 7 - .../src/theme/doc-item/layout/index.tsx | 59 +- .../theme/doc-item/layout/styles.module.css | 10 - crowdsec-docs/src/theme/tabs/index.tsx | 122 +++ crowdsec-docs/src/ui/button.tsx | 50 ++ crowdsec-docs/src/ui/card.tsx | 35 + crowdsec-docs/src/utils/index.ts | 6 +- crowdsec-docs/tailwind.config.js | 120 ++- .../blocklists/security_engine.mdx | 2 +- .../unversioned/console/cti/ip_report.mdx | 12 +- 41 files changed, 1176 insertions(+), 1133 deletions(-) rename crowdsec-docs/docs/getting_started/{intro.md => intro.mdx} (91%) delete mode 100644 crowdsec-docs/src/components/get-to-know-us.tsx delete mode 100644 crowdsec-docs/src/components/home-page/HomepageFeatures.module.css create mode 100644 crowdsec-docs/src/components/home-page/get-to-know-us.tsx create mode 100644 crowdsec-docs/src/components/home-page/home-item.tsx create mode 100644 crowdsec-docs/src/components/home-page/quick-start.tsx delete mode 100644 crowdsec-docs/src/components/quick-start.tsx delete mode 100644 crowdsec-docs/src/components/remediation-features/RemediationFeatures.module.css delete mode 100644 crowdsec-docs/src/pages/index.module.css delete mode 100644 crowdsec-docs/src/theme/TOC/styles.module.css delete mode 100644 crowdsec-docs/src/theme/Tabs/index.js delete mode 100644 crowdsec-docs/src/theme/Tabs/styles.module.css delete mode 100644 crowdsec-docs/src/theme/doc-item/layout/styles.module.css create mode 100644 crowdsec-docs/src/theme/tabs/index.tsx create mode 100644 crowdsec-docs/src/ui/button.tsx create mode 100644 crowdsec-docs/src/ui/card.tsx diff --git a/biome.json b/biome.json index 38668d395..c5492e6ff 100644 --- a/biome.json +++ b/biome.json @@ -3,7 +3,14 @@ "vcs": { "enabled": false, "clientKind": "git", "useIgnoreFile": false }, "files": { "ignoreUnknown": false, - "includes": ["crowdsec-docs/**/*.ts", "crowdsec-docs/**/*.tsx", "!**/node_modules/**", "!crowdsec-docs/plugins/**"] + "includes": [ + "crowdsec-docs/**/*.ts", + "crowdsec-docs/**/*.tsx", + "crowdsec-docs/**/*.css", + "!**/node_modules/**", + "!crowdsec-docs/plugins/**", + "!crowdsec-docs/build/**" + ] }, "formatter": { "enabled": true, @@ -32,7 +39,7 @@ "jsxQuoteStyle": "double", "quoteProperties": "asNeeded", "trailingCommas": "es5", - "semicolons": "asNeeded", + "semicolons": "always", "arrowParentheses": "always", "bracketSameLine": false, "quoteStyle": "double", @@ -41,6 +48,15 @@ } }, "html": { "formatter": { "selfCloseVoidElements": "always" } }, + "css": { + "formatter": { + "enabled": true, + "indentStyle": "tab", + "indentWidth": 4, + "lineEnding": "lf", + "lineWidth": 140 + } + }, "assist": { "enabled": true, "actions": { "source": { "organizeImports": "on" } } diff --git a/crowdsec-docs/components.json b/crowdsec-docs/components.json index 29c557ca6..d0bef0b64 100644 --- a/crowdsec-docs/components.json +++ b/crowdsec-docs/components.json @@ -3,18 +3,19 @@ "tailwind": { "config": "tailwind.config.js", "css": "src/css/custom.css", - "baseColor": "neutral", - "prefix": "tw-", - "cssVariables": false + "baseColor": "gray", + "prefix": "", + "cssVariables": true }, "rsc": true, "aliases": { - "utils": "@/src/utils", - "components": "@/src/components", - "ui": "@/src/ui", - "hooks": "@/src/hooks", - "lib": "@/src/lib" + "utils": "@site/src/utils", + "components": "@site/src/components", + "ui": "@site/src/ui", + "hooks": "@site/src/hooks", + "lib": "@site/src/lib" }, - "style": "default" + "style": "default", + "iconLibrary": "lucide" } \ No newline at end of file diff --git a/crowdsec-docs/docs/getting_started/intro.md b/crowdsec-docs/docs/getting_started/intro.mdx similarity index 91% rename from crowdsec-docs/docs/getting_started/intro.md rename to crowdsec-docs/docs/getting_started/intro.mdx index f8af6f022..1fac6df0e 100644 --- a/crowdsec-docs/docs/getting_started/intro.md +++ b/crowdsec-docs/docs/getting_started/intro.mdx @@ -6,10 +6,6 @@ sidebar_position: 1 # Security Engine -:::info -You may see Security Engine referred to as "agent" in the documentation/videos and "machines" within cscli commands. -::: - The Security Engine is a core component of CrowdSec. It is the component that will analyze logs and will expose an API endpoint for the remediation components to get the decisions made by the engine. ## Supported Platforms diff --git a/crowdsec-docs/docusaurus.config.ts b/crowdsec-docs/docusaurus.config.ts index 758402591..2610ada99 100644 --- a/crowdsec-docs/docusaurus.config.ts +++ b/crowdsec-docs/docusaurus.config.ts @@ -1,10 +1,10 @@ -import type * as Preset from "@docusaurus/preset-classic" -import type { NavbarItem } from "@docusaurus/theme-common" -import type { Config } from "@docusaurus/types" -import { themes } from "prism-react-renderer" +import type * as Preset from "@docusaurus/preset-classic"; +import type { NavbarItem } from "@docusaurus/theme-common"; +import type { Config } from "@docusaurus/types"; +import { themes } from "prism-react-renderer"; -import tailwindPlugin from "./plugins/tailwind-config" -import { ctiApiSidebar, guidesSideBar, remediationSideBar } from "./sidebarsUnversioned" +import tailwindPlugin from "./plugins/tailwind-config"; +import { ctiApiSidebar, guidesSideBar, remediationSideBar } from "./sidebarsUnversioned"; const generateCurrentAndNextRedirects = (s) => [ { @@ -15,44 +15,44 @@ const generateCurrentAndNextRedirects = (s) => [ from: `/docs/next/${s}`, to: `/u/${s}`, }, -] +]; function handleSidebarItems(items) { - const arr = [] + const arr = []; for (const item of items) { if (typeof item === "string") { - arr.push(...generateCurrentAndNextRedirects(item)) + arr.push(...generateCurrentAndNextRedirects(item)); } else if (typeof item === "object") { - arr.push(...backportRedirect(item)) + arr.push(...backportRedirect(item)); } } - return arr + return arr; } const backportRedirect = (s) => { - const arr = [] + const arr = []; if (typeof s === "string") { - arr.push(...generateCurrentAndNextRedirects(s)) - return arr + arr.push(...generateCurrentAndNextRedirects(s)); + return arr; } - const { id, link, items } = s + const { id, link, items } = s; if (id) { - arr.push(...generateCurrentAndNextRedirects(id)) + arr.push(...generateCurrentAndNextRedirects(id)); } if (link?.id) { - arr.push(...generateCurrentAndNextRedirects(link.id)) + arr.push(...generateCurrentAndNextRedirects(link.id)); } if (items) { - arr.push(...handleSidebarItems(items)) + arr.push(...handleSidebarItems(items)); } - return arr -} + return arr; +}; -const currentYear = new Date().getFullYear() +const currentYear = new Date().getFullYear(); const ACADEMY_URL = `https://academy.crowdsec.net/courses?${ process.env.NODE_ENV === "production" ? "utm_source=docs&utm_medium=menu&utm_campaign=top-menu&utm_id=academydocs" : "" -}` +}`; const NAVBAR_ITEMS: NavbarItem[] = [ { @@ -116,7 +116,7 @@ const NAVBAR_ITEMS: NavbarItem[] = [ position: "right", className: "header-hub-link", }, -] +]; const FOOTER_LINKS = [ { @@ -143,7 +143,7 @@ const FOOTER_LINKS = [ }, ], }, -] +]; const redirects = [ ...[ @@ -155,7 +155,7 @@ const redirects = [ { from: "/docs/next/troubleshooting", to: "/u/troubleshooting/intro" }, { from: "/docs/faq", to: "/u/troubleshooting/intro" }, { from: "/docs/next/faq", to: "/u/troubleshooting/intro" }, -] +]; const config: Config = { future: { @@ -250,7 +250,7 @@ const config: Config = { editUrl: "https://github.com/crowdsecurity/crowdsec-docs/edit/main/crowdsec-docs/", }, theme: { - customCss: require.resolve("./src/css/custom.css"), + customCss: "./src/css/custom.css", }, } satisfies Preset.Options, ], @@ -270,6 +270,6 @@ const config: Config = { ["@docusaurus/plugin-client-redirects", { redirects }], tailwindPlugin, ], -} +}; -export default config +export default config; diff --git a/crowdsec-docs/package-lock.json b/crowdsec-docs/package-lock.json index 2ba1bbcf1..265eb99ae 100644 --- a/crowdsec-docs/package-lock.json +++ b/crowdsec-docs/package-lock.json @@ -22,8 +22,10 @@ "@mui/icons-material": "^5.11.16", "@mui/material": "^5.13.4", "@mui/x-date-pickers": "^6.18.0", + "@radix-ui/react-slot": "^1.2.3", "@radix-ui/react-tooltip": "^1.1.2", - "class-variance-authority": "^0.7.0", + "animate-css": "^1.3.4", + "class-variance-authority": "^0.7.1", "clsx": "^2.1.1", "docusaurus-plugin-zooming": "^1.0.0", "lucide-react": "^0.441.0", @@ -31,7 +33,7 @@ "prism-react-renderer": "^2.4.0", "react": "^18.3.1", "react-dom": "^18.3.1", - "tailwind-merge": "^2.5.2", + "tailwind-merge": "^2.6.0", "tailwindcss-animate": "^1.0.7" }, "devDependencies": { @@ -5320,9 +5322,9 @@ } }, "node_modules/@radix-ui/react-slot": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.0.tgz", - "integrity": "sha512-ujc+V6r0HNDviYqIK3rW4ffgYiZ8g5DEHrGJVk4x7kTlLXRDILnKX9vAUYeIsLOoDpDJ0ujpqMkjH4w2ofuo6w==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz", + "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==", "license": "MIT", "dependencies": { "@radix-ui/react-compose-refs": "1.1.2" @@ -5524,6 +5526,24 @@ } } }, + "node_modules/@radix-ui/react-tooltip/node_modules/@radix-ui/react-slot": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.0.tgz", + "integrity": "sha512-ujc+V6r0HNDviYqIK3rW4ffgYiZ8g5DEHrGJVk4x7kTlLXRDILnKX9vAUYeIsLOoDpDJ0ujpqMkjH4w2ofuo6w==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, "node_modules/@radix-ui/react-tooltip/node_modules/@radix-ui/react-visually-hidden": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/@radix-ui/react-visually-hidden/-/react-visually-hidden-1.1.3.tgz", @@ -7370,6 +7390,15 @@ "algoliasearch": ">= 3.1 < 6" } }, + "node_modules/animate-css": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/animate-css/-/animate-css-1.3.4.tgz", + "integrity": "sha512-dd1Ht6/YQHcNbq0znIT6dG8uhO7Ce+VIIhZUhjsryXsMPJQz3bZg7Q2eNzLwipb25bRZslGb2myio5mScd1TFg==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/Wombosvideo" + } + }, "node_modules/ansi-align": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", diff --git a/crowdsec-docs/package.json b/crowdsec-docs/package.json index 76cad2c1e..65e018791 100644 --- a/crowdsec-docs/package.json +++ b/crowdsec-docs/package.json @@ -30,9 +30,11 @@ "@mui/icons-material": "^5.11.16", "@mui/material": "^5.13.4", "@mui/x-date-pickers": "^6.18.0", + "@radix-ui/react-slot": "^1.2.3", "@radix-ui/react-popover": "^1.1.14", "@radix-ui/react-tooltip": "^1.1.2", - "class-variance-authority": "^0.7.0", + "animate-css": "^1.3.4", + "class-variance-authority": "^0.7.1", "clsx": "^2.1.1", "docusaurus-plugin-zooming": "^1.0.0", "lucide-react": "^0.441.0", @@ -40,7 +42,7 @@ "prism-react-renderer": "^2.4.0", "react": "^18.3.1", "react-dom": "^18.3.1", - "tailwind-merge": "^2.5.2", + "tailwind-merge": "^2.6.0", "tailwindcss-animate": "^1.0.7" }, "devDependencies": { diff --git a/crowdsec-docs/sidebars.ts b/crowdsec-docs/sidebars.ts index c49753e23..47e4f92d5 100644 --- a/crowdsec-docs/sidebars.ts +++ b/crowdsec-docs/sidebars.ts @@ -1,6 +1,6 @@ -import type { SidebarsConfig } from "@docusaurus/plugin-content-docs" +import type { SidebarsConfig } from "@docusaurus/plugin-content-docs"; -type SidebarConfig = SidebarsConfig[string] +type SidebarConfig = SidebarsConfig[string]; const sidebarsConfig: SidebarConfig = { // By default, Docusaurus generates a sidebar from the docs folder structure @@ -767,6 +767,6 @@ const sidebarsConfig: SidebarConfig = { { type: "doc", id: "appsec/benchmark", label: "Benchmark" }, { type: "doc", id: "appsec/troubleshooting" }, ], -} +}; -export default sidebarsConfig +export default sidebarsConfig; diff --git a/crowdsec-docs/sidebarsUnversioned.ts b/crowdsec-docs/sidebarsUnversioned.ts index 74ee65bef..3e6e1d951 100644 --- a/crowdsec-docs/sidebarsUnversioned.ts +++ b/crowdsec-docs/sidebarsUnversioned.ts @@ -1,6 +1,6 @@ -import type { SidebarsConfig } from "@docusaurus/plugin-content-docs" +import type { SidebarsConfig } from "@docusaurus/plugin-content-docs"; -type SidebarConfig = SidebarsConfig[string] +type SidebarConfig = SidebarsConfig[string]; const sidebarsUnversionedConfig: SidebarConfig = { ctiApiSidebar: [ @@ -656,7 +656,7 @@ const sidebarsUnversionedConfig: SidebarConfig = { ], } -export default sidebarsUnversionedConfig +export default sidebarsUnversionedConfig; export const { ctiApiSidebar, @@ -667,4 +667,4 @@ export const { serviceApiSideBar, guidesSideBar, gettingStarted, -} = sidebarsUnversionedConfig +} = sidebarsUnversionedConfig; diff --git a/crowdsec-docs/src/components/academy-promo.tsx b/crowdsec-docs/src/components/academy-promo.tsx index afdc262d7..dc6b20d89 100644 --- a/crowdsec-docs/src/components/academy-promo.tsx +++ b/crowdsec-docs/src/components/academy-promo.tsx @@ -1,11 +1,11 @@ -import React from "react" +import React from "react"; const AcademyPromo = ({ ...props }): React.JSX.Element => { - const LINK = `https://academy.crowdsec.net/course/${props.course}${process.env.NODE_ENV === "production" ? props.utm : " "}` + const LINK = `https://academy.crowdsec.net/course/${props.course}${process.env.NODE_ENV === "production" ? props.utm : " "}`; return (


-
+
{!!props.title &&

{props.title}

}
@@ -27,7 +27,7 @@ const AcademyPromo = ({ ...props }): React.JSX.Element => {

- ) -} + ); +}; -export default AcademyPromo +export default AcademyPromo; diff --git a/crowdsec-docs/src/components/console-ad.tsx b/crowdsec-docs/src/components/console-ad.tsx index f094ad883..e7451ad63 100644 --- a/crowdsec-docs/src/components/console-ad.tsx +++ b/crowdsec-docs/src/components/console-ad.tsx @@ -1,23 +1,24 @@ -import useBaseUrl from "@docusaurus/useBaseUrl" -import ThemedImage from "@theme/ThemedImage" -import React from "react" +import useBaseUrl from "@docusaurus/useBaseUrl"; +import ThemedImage from "@theme/ThemedImage"; +import React from "react"; const SIGNUP_LINK = `https://app.crowdsec.net/signup${ process.env.NODE_ENV === "production" ? "?mtm_campaign=Console&mtm_source=docs&mtm_medium=tocAd&mtm_content=Console" : "" -}` +}`; const ConsoleAd = (): React.JSX.Element => { return ( - + - ) -} + ); +}; -export default ConsoleAd +export default ConsoleAd; diff --git a/crowdsec-docs/src/components/console-promo.tsx b/crowdsec-docs/src/components/console-promo.tsx index 93ef72b19..d32e5c091 100644 --- a/crowdsec-docs/src/components/console-promo.tsx +++ b/crowdsec-docs/src/components/console-promo.tsx @@ -1,26 +1,29 @@ -import Link from "@docusaurus/Link" -import useBaseUrl from "@docusaurus/useBaseUrl" -import React from "react" +import useBaseUrl from "@docusaurus/useBaseUrl"; +import { Button } from "@site/src/ui/button"; +import { Card, CardContent, CardHeader } from "@site/src/ui/card"; +import React from "react"; const ConsolePromo = ({ ...props }): React.JSX.Element => { - const url = useBaseUrl(`/img/${props.image}`) + const url = useBaseUrl(`/img/${props.image}`); return ( -
-
- {props.title ? ( -

{props.title}

- ) : null} - {props.description ?

{props.description}

: null} - - {props.text ?? "Get Started"} - -
- {props.image ? {props.title} : null} -
- ) -} + + {props.title ?

{props.title}

: null}
+ +
+ {props.description ?

{props.description}

: null} + +
-export default ConsolePromo + {props.image ? {props.title} : null} +
+
+ ); +}; + +export default ConsolePromo; diff --git a/crowdsec-docs/src/components/formatted-tabs.tsx b/crowdsec-docs/src/components/formatted-tabs.tsx index f2543a2fa..6c848ed29 100644 --- a/crowdsec-docs/src/components/formatted-tabs.tsx +++ b/crowdsec-docs/src/components/formatted-tabs.tsx @@ -1,8 +1,8 @@ -import { cibDocker, cibKubernetes, cibLinux, cibPowershell, cibWindows, cilDollar, cilShortText } from "@coreui/icons" -import CodeBlock from "@theme/CodeBlock" -import TabItem from "@theme/TabItem" -import Tabs from "@theme/Tabs" -import React from "react" +import { cibDocker, cibKubernetes, cibLinux, cibPowershell, cibWindows, cilDollar, cilShortText } from "@coreui/icons"; +import CodeBlock from "@theme/CodeBlock"; +import TabItem from "@theme/TabItem"; +import Tabs from "@theme/Tabs"; +import React from "react"; /* * This component is used to display code snippets for both Unix and Windows operating systems. @@ -13,36 +13,36 @@ import React from "react" * The cmd prop is used to display the code snippet for Windows Command Prompt. */ const FormattedTabs = ({ ...props }): React.JSX.Element => { - const values = [] - let defaultValue = "" + const values = []; + let defaultValue = ""; if (props.bash !== undefined) { - defaultValue = "nix" - values.push({ label: "Linux/Freebsd", value: "nix", icon: cibLinux }) + defaultValue = "nix"; + values.push({ label: "Linux/Freebsd", value: "nix", icon: cibLinux }); } if (props.powershell !== undefined) { if (defaultValue === "") { - defaultValue = "windows" + defaultValue = "windows"; } - values.push({ label: "Windows", value: "windows", icon: cibWindows }) + values.push({ label: "Windows", value: "windows", icon: cibWindows }); } if (props.docker !== undefined || props.dockerCompose !== undefined) { if (defaultValue === "") { - defaultValue = "docker" + defaultValue = "docker"; } - values.push({ label: "Docker", value: "docker", icon: cibDocker }) + values.push({ label: "Docker", value: "docker", icon: cibDocker }); } if (props.k8s !== undefined || props.yaml !== undefined) { if (defaultValue === "") { - defaultValue = "kubernetes" + defaultValue = "kubernetes"; } values.push({ label: "Kubernetes", value: "kubernetes", icon: cibKubernetes, - }) + }); } return ( @@ -123,7 +123,7 @@ const FormattedTabs = ({ ...props }): React.JSX.Element => { {props.k8s !== undefined ? {props.k8s} : null} - ) -} + ); +}; -export default FormattedTabs +export default FormattedTabs; diff --git a/crowdsec-docs/src/components/get-to-know-us.tsx b/crowdsec-docs/src/components/get-to-know-us.tsx deleted file mode 100644 index 68a9c43bb..000000000 --- a/crowdsec-docs/src/components/get-to-know-us.tsx +++ /dev/null @@ -1,89 +0,0 @@ -import Link from "@docusaurus/Link" -import React from "react" - -type StaticData = { - icon: React.FC> - title: string - description: string - link: string -} - -const staticData: StaticData[] = [ - { - icon: () => CrowdSec logo, - title: "What is CrowdSec?", - description: "Data curated solution with a bunch of millions IPs detected by our large community.", - link: "https://www.crowdsec.net", - }, - { - icon: () => security engines, - title: "Security Engines", - description: "Secure yourself.", - link: "/docs/intro", - }, - { - icon: () => πŸ–₯️, - title: "CrowdSec Console", - description: "Manage and monitor your security.", - link: "/u/console/intro", - }, - { - icon: () => πŸ§‘πŸ»β€πŸ’», - title: "CrowdSec CLI", - description: "Use our command line interface.", - link: "/docs/cscli/", - }, - { - icon: () => Web application firewall, - title: "CrowdSec WAF", - description: "Protect your web applications.", - link: "/docs/appsec/intro", - }, - { - icon: () => blocklists, - title: "Blocklists", - description: "Block thousands of IPs.", - link: "/u/blocklists/intro", - }, - { - icon: () => world API, - title: "APIs", - description: "Integrate with your tools.", - link: "/u/cti_api/intro", - }, -] - -const GetToKnowUs = (): React.JSX.Element => { - return ( -
-

Get to know us!

- -
- {staticData.map((props, index) => ( - -
- - - - -
- {props.title} -

{props.description}

-
-
- - ))} -
-
- ) -} - -export default GetToKnowUs diff --git a/crowdsec-docs/src/components/github-icon-renderer.tsx b/crowdsec-docs/src/components/github-icon-renderer.tsx index 9f7f6ba19..30b1bd96a 100644 --- a/crowdsec-docs/src/components/github-icon-renderer.tsx +++ b/crowdsec-docs/src/components/github-icon-renderer.tsx @@ -1,18 +1,18 @@ -import { cibGithub } from "@coreui/icons" -import CIcon from "@coreui/icons-react" -import React from "react" +import { cibGithub } from "@coreui/icons"; +import CIcon from "@coreui/icons-react"; +import React from "react"; const GithubIconRender = ({ ...props }): React.JSX.Element => { return (
- +

Github

- ) -} + ); +}; -export default GithubIconRender +export default GithubIconRender; diff --git a/crowdsec-docs/src/components/home-page/HomepageFeatures.module.css b/crowdsec-docs/src/components/home-page/HomepageFeatures.module.css deleted file mode 100644 index bd22cd3f9..000000000 --- a/crowdsec-docs/src/components/home-page/HomepageFeatures.module.css +++ /dev/null @@ -1,15 +0,0 @@ -/* stylelint-disable docusaurus/copyright-header */ - -.features { - display: flex; - align-items: center; - padding: 2rem 0; - width: 100%; - background-color: #2E2BAE; - color: white; -} - -.featureSvg { - height: 200px; - width: 200px; -} diff --git a/crowdsec-docs/src/components/home-page/features.tsx b/crowdsec-docs/src/components/home-page/features.tsx index bac7e3256..6ebfb6aa0 100644 --- a/crowdsec-docs/src/components/home-page/features.tsx +++ b/crowdsec-docs/src/components/home-page/features.tsx @@ -1,6 +1,4 @@ -import clsx from "clsx" -import React from "react" -import styles from "./HomepageFeatures.module.css" +import React from "react"; const FEATURES_LIST = [ { @@ -59,27 +57,27 @@ const FEATURES_LIST = [ //open-source //detect here apply there //block anything, not just ips -] +]; const Feature = ({ Svg, title, description, link }): React.JSX.Element => { return ( -
-
+
+ -
+

{title}

{description}

- ) -} + ); +}; const HomepageFeatures = () => ( -
+
{FEATURES_LIST.map((props) => ( @@ -88,6 +86,6 @@ const HomepageFeatures = () => (
-) +); -export default HomepageFeatures +export default HomepageFeatures; diff --git a/crowdsec-docs/src/components/home-page/get-to-know-us.tsx b/crowdsec-docs/src/components/home-page/get-to-know-us.tsx new file mode 100644 index 000000000..d984afc2f --- /dev/null +++ b/crowdsec-docs/src/components/home-page/get-to-know-us.tsx @@ -0,0 +1,84 @@ +import React from "react"; +import { HomePageItem } from "./home-item"; + +type StaticData = { + icon: React.FC>; + title: string; + description: string; + link: string; +}; + +const staticData: StaticData[] = [ + { + icon: () => CrowdSec logo, + title: "What is CrowdSec?", + description: "Data curated solution with a bunch of millions IPs detected by our large community.", + link: "https://www.crowdsec.net", + }, + { + icon: () => security engines, + title: "Security Engines", + description: "Secure yourself.", + link: "/docs/intro", + }, + { + icon: () => πŸ–₯️, + title: "CrowdSec Console", + description: "Manage and monitor your security.", + link: "/u/console/intro", + }, + { + icon: () => πŸ§‘πŸ»β€πŸ’», + title: "CrowdSec CLI", + description: "Use our command line interface.", + link: "/docs/cscli/", + }, + { + icon: () => Web application firewall, + title: "CrowdSec WAF", + description: "Protect your web applications.", + link: "/docs/appsec/intro", + }, + { + icon: () => blocklists, + title: "Blocklists", + description: "Block thousands of IPs.", + link: "/u/blocklists/intro", + }, + { + icon: () => world API, + title: "APIs", + description: "Integrate with your tools.", + link: "/u/cti_api/intro", + }, +]; + +const GetToKnowUs = (): React.JSX.Element => { + return ( +
+

Get to know us!

+ +
+
+ +
+ {staticData.slice(1, staticData.length).map((props) => ( + + ))} +
+
+ ); +}; + +export default GetToKnowUs; diff --git a/crowdsec-docs/src/components/home-page/home-item.tsx b/crowdsec-docs/src/components/home-page/home-item.tsx new file mode 100644 index 000000000..8fe21e553 --- /dev/null +++ b/crowdsec-docs/src/components/home-page/home-item.tsx @@ -0,0 +1,30 @@ +import CIcon from "@coreui/icons-react"; +import Link from "@docusaurus/Link"; +import React from "react"; + +type Props = { + title: string; + description: string; + link: string; + // biome-ignore lint/suspicious/noExplicitAny: We need to allow any icon type here, as it can be a React component or an icon from CIcon. + icon: any; +}; + +export const HomePageItem = (props: Props): React.JSX.Element => ( + +
+ + {(!Array.isArray(props.icon) && ) || } + + +
+ {props.title} + {props.description &&

{props.description}

} +
+
+ +); diff --git a/crowdsec-docs/src/components/home-page/quick-start.tsx b/crowdsec-docs/src/components/home-page/quick-start.tsx new file mode 100644 index 000000000..6d2756f39 --- /dev/null +++ b/crowdsec-docs/src/components/home-page/quick-start.tsx @@ -0,0 +1,94 @@ +import cibApple from "@site/static/img/logo/apple-colored.svg"; +import cibDocker from "@site/static/img/logo/docker-colored.svg"; +import cibFreebsd from "@site/static/img/logo/freebsd-colored.svg"; +import cibKubernetes from "@site/static/img/logo/kubernetes-colored.svg"; +import cibLinux from "@site/static/img/logo/linux-colored.svg"; +import cibWindows from "@site/static/img/logo/windows-colored.svg"; +import opnsenseLogo from "@site/static/img/logo-opnsense.svg"; +import pfSenseLogo from "@site/static/img/logo-pfsense.svg"; +import whmLogo from "@site/static/img/logo-whm.svg"; +import React from "react"; +import { HomePageItem } from "./home-item"; + +type StaticData = { + icon: React.ComponentType>; + text: string; + link: string; +}; + +const staticData: StaticData[] = [ + { + icon: cibLinux, + text: "Linux", + link: "/u/getting_started/installation/linux", + }, + { + icon: cibWindows, + text: "Windows", + link: "/u/getting_started/installation/windows", + }, + { + icon: cibFreebsd, + text: "FreeBSD", + link: "/u/getting_started/installation/freebsd", + }, + { + icon: cibApple, + text: "macOS", + link: "/u/getting_started/installation/macos", + }, + { + icon: cibDocker, + text: "Docker", + link: "/u/getting_started/installation/docker", + }, + { + icon: cibKubernetes, + text: "Kubernetes", + link: "/u/getting_started/installation/kubernetes", + }, + { + icon: opnsenseLogo, + text: "OPNsense", + link: "/u/getting_started/installation/opnsense", + }, + { + icon: pfSenseLogo, + text: "pfSense", + link: "/u/getting_started/installation/pfsense", + }, + { + icon: whmLogo, + text: "WHM", + link: "/u/getting_started/installation/whm", + }, + // Experimental, not linking to it + // { + // icon: cloudwaysLogo, + // text: "Cloudways", + // link: "/u/getting_started/installation/cloudways", + // }, +]; + +const QuickStart = (): React.JSX.Element => { + return ( +
+
+

Select your environment

+

We can secure your stack. Just select your platform and get started.

+
+ +
+ {staticData.map((props) => ( + + ))} +
+

+ *Logos and trademarks, such as the logos above, are the property of their respective owners and are used here for + identification purposes only. +

+
+ ); +}; + +export default QuickStart; diff --git a/crowdsec-docs/src/components/quick-start.tsx b/crowdsec-docs/src/components/quick-start.tsx deleted file mode 100644 index e579d7aee..000000000 --- a/crowdsec-docs/src/components/quick-start.tsx +++ /dev/null @@ -1,106 +0,0 @@ -import CIcon from "@coreui/icons-react" -import Link from "@docusaurus/Link" -import cibApple from "@site/static/img/logo/apple-colored.svg" -import cibDocker from "@site/static/img/logo/docker-colored.svg" -import cibFreebsd from "@site/static/img/logo/freebsd-colored.svg" -import cibKubernetes from "@site/static/img/logo/kubernetes-colored.svg" -import cibLinux from "@site/static/img/logo/linux-colored.svg" -import cibWindows from "@site/static/img/logo/windows-colored.svg" -import opnsenseLogo from "@site/static/img/logo-opnsense.svg" -import pfSenseLogo from "@site/static/img/logo-pfsense.svg" -import whmLogo from "@site/static/img/logo-whm.svg" -import React from "react" - -const staticData = [ - { - icon: cibLinux, - text: "Linux", - link: "/u/getting_started/installation/linux", - }, - { - icon: cibWindows, - text: "Windows", - link: "/u/getting_started/installation/windows", - }, - { - icon: cibFreebsd, - text: "FreeBSD", - link: "/u/getting_started/installation/freebsd", - }, - { - icon: cibApple, - text: "macOS", - link: "/u/getting_started/installation/macos", - }, - { - icon: cibDocker, - text: "Docker", - link: "/u/getting_started/installation/docker", - }, - { - icon: cibKubernetes, - text: "Kubernetes", - link: "/u/getting_started/installation/kubernetes", - }, - { - icon: opnsenseLogo, - text: "OPNsense", - link: "/u/getting_started/installation/opnsense", - }, - { - icon: pfSenseLogo, - text: "pfSense", - link: "/u/getting_started/installation/pfsense", - }, - { - icon: whmLogo, - text: "WHM", - link: "/u/getting_started/installation/whm", - }, - // Experimental, not linking to it - // { - // icon: cloudwaysLogo, - // text: "Cloudways", - // link: "/u/getting_started/installation/cloudways", - // }, -] - -const QuickStart = (): React.JSX.Element => { - return ( -
-
-

Select your environment

-

- We can secure your stack. Just select your platform and get started. -

-
- -
- {staticData.map((props) => ( - -
- - {(!Array.isArray(props.icon) && ) || ( - // biome-ignore lint/suspicious/noExplicitAny: We need to cast to any for CIcon to work with icons - - )} - - - {props.text} -
- - ))} -
-

- *Logos and trademarks, such as the logos above, are the property of their respective owners and are used here for - identification purposes only. -

-
- ) -} - -export default QuickStart diff --git a/crowdsec-docs/src/components/remediation-features/RemediationFeatures.module.css b/crowdsec-docs/src/components/remediation-features/RemediationFeatures.module.css deleted file mode 100644 index a0ea4fce0..000000000 --- a/crowdsec-docs/src/components/remediation-features/RemediationFeatures.module.css +++ /dev/null @@ -1,23 +0,0 @@ -/* stylelint-disable docusaurus/copyright-header */ - -.remediations { - display: flex; - align-items: center; - padding: 2rem 0; - width: 100%; - background-color: #4442c7; - color: white; - text-align: center; - align-items: center; - justify-content: center; - } - - .remediationsSvg { - height: 200px; - width: 200px; - } - - .container.row { - justify-content: center; - } - diff --git a/crowdsec-docs/src/components/remediation-features/index.tsx b/crowdsec-docs/src/components/remediation-features/index.tsx index 6a0a34aa3..91fe1950e 100644 --- a/crowdsec-docs/src/components/remediation-features/index.tsx +++ b/crowdsec-docs/src/components/remediation-features/index.tsx @@ -1,18 +1,17 @@ -import useBaseUrl from "@docusaurus/useBaseUrl" -import React from "react" -import styles from "./RemediationFeatures.module.css" +import useBaseUrl from "@docusaurus/useBaseUrl"; +import React from "react"; const RemediationFeatures = (): React.JSX.Element => { return ( -
+

Examples of detected behaviors

-
+
Remediation Features
- ) -} + ); +}; -export default RemediationFeatures +export default RemediationFeatures; diff --git a/crowdsec-docs/src/components/remediation-support-badge.tsx b/crowdsec-docs/src/components/remediation-support-badge.tsx index d66f354d2..434041fbf 100644 --- a/crowdsec-docs/src/components/remediation-support-badge.tsx +++ b/crowdsec-docs/src/components/remediation-support-badge.tsx @@ -1,35 +1,35 @@ -import { ToolTipArrow, Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from "@site/src/ui/tooltip" -import { clsx } from "clsx" -import React from "react" +import { ToolTipArrow, Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from "@site/src/ui/tooltip"; +import { clsx } from "clsx"; +import React from "react"; type RemediationSupportBadgesProps = { - Prometheus: boolean // Prometheus is a boolean that controls the color of the Prometheus bubble - MTLS: boolean // MTLS is a boolean that controls the color of the MTLS bubble - Mode: boolean // Mode is a boolean that controls the color of the Mode bubble - Metrics: boolean // Metrics is a boolean that controls the color of the Metrics bubble - Appsec?: boolean // Appsec is a boolean that controls the color of the AppSec bubble -} + Prometheus: boolean; // Prometheus is a boolean that controls the color of the Prometheus bubble + MTLS: boolean; // MTLS is a boolean that controls the color of the MTLS bubble + Mode: boolean; // Mode is a boolean that controls the color of the Mode bubble + Metrics: boolean; // Metrics is a boolean that controls the color of the Metrics bubble + Appsec?: boolean; // Appsec is a boolean that controls the color of the AppSec bubble +}; const RemediationSupportBadge = ({ title, description, support }: { title: string; description: string; support: string }) => { //ugly, for test - const colorClass = support === "Unsupported" ? "tw-bg-red-400" : "tw-bg-green-400" + const colorClass = support === "Unsupported" ? "bg-red-400" : "bg-green-400"; return ( -
- {title} - {support} +
+ {title} + {support}

{description}

- +
- ) -} + ); +}; export default function RemediationSupportBadges({ MTLS, @@ -38,14 +38,14 @@ export default function RemediationSupportBadges({ Mode, Appsec, }: Readonly): React.JSX.Element { - const mtlsSupport = MTLS ? "Supported" : "Unsupported" - const metricsSupport = Metrics ? "Supported" : "Unsupported" - const prometheusSupport = Prometheus ? "Supported" : "Unsupported" - const modeSupport = Mode ? "Live & Stream" : "Stream only" - const appsecSupport = Appsec !== undefined && Appsec ? "Supported" : "Unsupported" + const mtlsSupport = MTLS ? "Supported" : "Unsupported"; + const metricsSupport = Metrics ? "Supported" : "Unsupported"; + const prometheusSupport = Prometheus ? "Supported" : "Unsupported"; + const modeSupport = Mode ? "Live & Stream" : "Stream only"; + const appsecSupport = Appsec !== undefined && Appsec ? "Supported" : "Unsupported"; return ( -
+
{Appsec !== undefined && (
- ) + ); } diff --git a/crowdsec-docs/src/components/table-render.tsx b/crowdsec-docs/src/components/table-render.tsx index 69abc2729..d35bbf4bb 100644 --- a/crowdsec-docs/src/components/table-render.tsx +++ b/crowdsec-docs/src/components/table-render.tsx @@ -1,15 +1,15 @@ -import BrowserOnly from "@docusaurus/BrowserOnly" -import { useColorMode } from "@docusaurus/theme-common" -import { createTheme, ThemeProvider } from "@mui/material" -import { MaterialReactTable } from "material-react-table" -import React, { useEffect, useMemo, useState } from "react" +import BrowserOnly from "@docusaurus/BrowserOnly"; +import { useColorMode } from "@docusaurus/theme-common"; +import { createTheme, ThemeProvider } from "@mui/material"; +import { MaterialReactTable } from "material-react-table"; +import React, { useEffect, useMemo, useState } from "react"; const TableRender = ({ columns, url, include = [], exclude = [] }): React.JSX.Element => { - const [jsonContent, setJsonContent] = useState([]) - const { colorMode } = useColorMode() + const [jsonContent, setJsonContent] = useState([]); + const { colorMode } = useColorMode(); const theme = useMemo(() => { - const isLight = colorMode === "light" + const isLight = colorMode === "light"; return createTheme({ palette: { @@ -18,35 +18,35 @@ const TableRender = ({ columns, url, include = [], exclude = [] }): React.JSX.El default: isLight ? "rgb(255,255,255)" : "#1b1b1d", }, }, - }) - }, [colorMode]) + }); + }, [colorMode]); useEffect(() => { fetch(url) .then((res) => res.json()) .then((data) => { - const updatedData = [] - const names = [] + const updatedData = []; + const names = []; Object.keys(data).forEach((key) => { // filter duplicate names - const item = data[key] - const name = item.name + const item = data[key]; + const name = item.name; for (const element of exclude) { if (name.includes(element)) { - return + return; } } for (const element of include) { if (!name.includes(element)) { - return + return; } } if (names.includes(name)) { - return + return; } - names.push(name) + names.push(name); updatedData.push({ ...item, // flattening list of strings into CSV strings allow global filtering on them @@ -54,16 +54,16 @@ const TableRender = ({ columns, url, include = [], exclude = [] }): React.JSX.El ...(item.behaviors ? { behaviors: item.behaviors.join("\n") } : {}), ...(item.mitre_attacks ? { mitre_attacks: item.mitre_attacks.join("\n") } : {}), ...(item.cves ? { cves: item.cves.join("\n") } : {}), - }) - }) + }); + }); - setJsonContent(updatedData) - }) + setJsonContent(updatedData); + }); // execute this fetch only once (on mount) - }, [include, exclude, url]) + }, [include, exclude, url]); if (!columns || !jsonContent) { - return null + return null; } return ( @@ -85,7 +85,7 @@ const TableRender = ({ columns, url, include = [], exclude = [] }): React.JSX.El )} - ) -} + ); +}; -export default TableRender +export default TableRender; diff --git a/crowdsec-docs/src/css/custom.css b/crowdsec-docs/src/css/custom.css index eb75ff394..e983f3ae0 100644 --- a/crowdsec-docs/src/css/custom.css +++ b/crowdsec-docs/src/css/custom.css @@ -1,527 +1,552 @@ -@import url('https://fonts.googleapis.com/css2?family=Instrument+Sans:ital,wght@0,400..700;1,400..700&display=swap'); +@import url("https://fonts.googleapis.com/css2?family=Instrument+Sans:ital,wght@0,400..700;1,400..700&display=swap"); -@tailwind base; -@tailwind components; -@tailwind utilities; +@import "tailwindcss/base"; +@import "tailwindcss/components"; +@import "tailwindcss/utilities"; -/* stylelint-disable docusaurus/copyright-header */ /** * Any CSS included here will be global. The classic template * bundles Infima by default. Infima is a CSS framework designed to * work well for content-centric websites. */ +/* COLORS */ +@layer base { + /* // Zeplin https://app.zeplin.io/project/655e038b64d81b7bd89cdadb/screen/65a7e811a2ae29e2fbb62a17 */ + :root { + /* Gray */ + --color-gray-50: 248 250 252; + --color-gray-100: 241 245 249; + --color-gray-200: 226 232 240; + --color-gray-300: 203 213 225; + --color-gray-400: 148 163 184; + --color-gray-500: 100 116 139; + --color-gray-600: 71 85 105; + --color-gray-700: 46 59 77; + --color-gray-800: 22 30 47; + --color-gray-900: 16 24 39; + --color-gray-950: 4 4 31; + + /* Complementary */ + --color-red: 227 13 20; + --color-green: 31 168 81; + --color-orange: 240 111 5; + --color-yellow: 168 143 16; + --color-premium: 248 171 19; + --color-platinum: 251 217 131; + + /* Shadcn colors */ + --background: 252 253 253; + --foreground: 52 52 59; + --card: 255 255 255; + --card-foreground: 52 52 59; + --popover: 255 255 255; + --popover-foreground: 52 52 59; + --primary: 120 102 201; + --primary-foreground: 251 251 251; + --secondary: 247 247 247; + --secondary-foreground: 52 52 59; + --info: 224 178 90; + --info-foreground: 52 52 59; + --muted: 247 247 247; + --muted-foreground: 142 142 142; + --accent: 247 247 247; + --accent-foreground: 52 52 59; + --destructive: 220 38 38; + --destructive-foreground: 220 38 38; + --border: 171 177 184; + --input: 255 255 255; + --ring: 180 180 180; + --chart-1: 255 159 64; + --chart-2: 75 192 192; + --chart-3: 54 162 235; + --chart-4: 153 102 255; + --chart-5: 255 99 132; + --radius: 0.625rem; + --sidebar: 251 251 251; + --sidebar-foreground: 52 52 59; + --sidebar-primary: 120 102 201; + --sidebar-primary-foreground: 251 251 251; + --sidebar-accent: 247 247 247; + --sidebar-accent-foreground: 52 52 59; + --sidebar-border: 235 235 235; + --sidebar-ring: 180 180 180; + } + + html[data-theme="dark"] { + /* Gray */ + --color-gray-50: 4 4 31; + --color-gray-100: 16 24 39; + --color-gray-200: 22 30 47; + --color-gray-300: 46 59 77; + --color-gray-400: 71 85 105; + --color-gray-500: 100 116 139; + --color-gray-600: 148 163 184; + --color-gray-700: 203 213 225; + --color-gray-800: 226 232 240; + --color-gray-900: 241 245 249; + --colors-gray-950: 248 250 252; + + /* Complementary */ + --color-red: 245 91 96; + --color-green: 113 229 155; + --color-orange: 252 168 100; + --color-yellow: 227 195 95; + --color-premium: 248 171 19; + --color-platinum: 251 217 131; + } +} + +html[data-theme="dark"], +.dark { + /* Shadcn */ + --background: 16 24 39; + --foreground: 250 251 251; + --card: 22 33 47; + --card-foreground: 250 251 251; + --popover: 40 44 80; + --popover-foreground: 250 251 251; + --primary: 133 149 208; + --primary-foreground: 52 52 52; + --secondary: 224 178 90; + --secondary-foreground: 250 251 251; + --info: 224 178 90; + --info-foreground: 250 251 251; + --muted: 69 69 69; + --muted-foreground: 180 180 180; + --accent: 69 69 69; + --accent-foreground: 250 251 251; + --destructive: 133 72 60; + --destructive-foreground: 191 107 95; + --border: 46 59 77; + --input: 33 36 66; + --ring: 112 112 112; + --chart-1: 90 93 175; + --chart-2: 123 212 156; + --chart-3: 227 181 95; + --chart-4: 180 99 179; + --chart-5: 189 122 86; + --sidebar: 52 52 52; + --sidebar-foreground: 250 251 251; + --sidebar-primary: 133 149 208; + --sidebar-primary-foreground: 250 251 251; + --sidebar-accent: 69 69 69; + --sidebar-accent-foreground: 250 251 251; + --sidebar-border: 56 63 98; + --sidebar-ring: 112 112 112; +} + +* { + @apply border-border outline-ring/50; +} + +body, +#__docusaurus { + @apply bg-background text-foreground; +} + +@theme inline { + --color-background: var(--background); + --color-foreground: var(--foreground); + --color-card: var(--card); + --color-card-foreground: var(--card-foreground); + --color-popover: var(--popover); + --color-popover-foreground: var(--popover-foreground); + --color-primary: var(--primary); + --color-primary-foreground: var(--primary-foreground); + --color-secondary: var(--secondary); + --color-secondary-foreground: var(--secondary-foreground); + --color-info: var(--info); + --color-info-foreground: var(--info-foreground); + --color-muted: var(--muted); + --color-muted-foreground: var(--muted-foreground); + --color-accent: var(--accent); + --color-accent-foreground: var(--accent-foreground); + --color-destructive: var(--destructive); + --color-destructive-foreground: var(--destructive-foreground); + --color-border: var(--border); + --color-input: var(--input); + --color-ring: var(--ring); + --color-chart-1: var(--chart-1); + --color-chart-2: var(--chart-2); + --color-chart-3: var(--chart-3); + --color-chart-4: var(--chart-4); + --color-chart-5: var(--chart-5); + --radius-sm: calc(var(--radius) - 4px); + --radius-md: calc(var(--radius) - 2px); + --radius-lg: var(--radius); + --radius-xl: calc(var(--radius) + 4px); + --color-sidebar: var(--sidebar); + --color-sidebar-foreground: var(--sidebar-foreground); + --color-sidebar-primary: var(--sidebar-primary); + --color-sidebar-primary-foreground: var(--sidebar-primary-foreground); + --color-sidebar-accent: var(--sidebar-accent); + --color-sidebar-accent-foreground: var(--sidebar-accent-foreground); + --color-sidebar-border: var(--sidebar-border); + --color-sidebar-ring: var(--sidebar-ring); +} + /* You can override the default Infima variables here. */ :root { - --ifm-color-primary: #F8AB13; - --ifm-global-shadow-md: 0px; - --docusaurus-highlighted-code-line-bg: rgba(0, 0, 0, 0.1); - --ifm-code-font-size: 95%; - --docusaurus-announcement-bar-height: 2.5rem !important; - --ifm-font-family-base: 'Instrument Sans', sans-serif; /* For body text */ - --ifm-font-family-monospace: 'Courier New', monospace; /* For code blocks */ -} + /* Docusaurus global colors */ + --docusaurus-announcement-bar-height: 2.5rem !important; + --docusaurus-highlighted-code-line-bg: rgba(0, 0, 0, 0.1); -/* COLORS */ + /* IFM Theme color overrides */ + --ifm-color-primary: rgb(var(--primary)); + --ifm-global-shadow-md: 0px; + --ifm-code-font-size: 95%; + --ifm-font-family-base: "Instrument Sans", sans-serif; /* For body text */ + --ifm-font-family-monospace: "Courier New", monospace; /* For code blocks */ + --ifm-dropdown-background-color: rgb(var(--card)); -@layer base { - /* // Zeplin https://app.zeplin.io/project/655e038b64d81b7bd89cdadb/screen/65a7e811a2ae29e2fbb62a17 */ - :root { - /* Primary */ - --color-primary: 82 71 179; /* Purple */ - --color-primary-50: 237 236 247; - --color-primary-100: 220 218 240; - --color-primary-200: 186 181 225; - --color-primary-300: 151 145 209; - --color-primary-400: 117 108 194; - --color-primary-500: 82 71 179; - --color-primary-600: 66 57 143; - --color-primary-700: 49 43 107; - --color-primary-800: 33 28 72; - --color-primary-900: 16 14 36; - --color-primary-night: 16 14 36; - --color-text-primary: 82 71 179; - --color-border-primary: 82 71 179; - - /* Secondary */ - --color-secondary: 159 107 4; /* Sunburst Orange */ - --color-secondary-50: 245 240 229; - --color-secondary-100: 236 225 205; - --color-secondary-200: 217 196 155; - --color-secondary-300: 197 166 104; - --color-secondary-400: 178 137 54; - --color-secondary-500: 159 107 4; - --color-secondary-600: 127 86 3; - --color-secondary-700: 95 64 2; - --color-secondary-800: 64 43 2; - --color-secondary-900: 32 21 1; - - /* Gray */ - --color-gray-50: 248 250 252; - --color-gray-100: 241 245 249; - --color-gray-200: 226 232 240; - --color-gray-300: 203 213 225; - --color-gray-400: 148 163 184; - --color-gray-500: 100 116 139; - --color-gray-600: 71 85 105; - --color-gray-700: 46 59 77; - --color-gray-800: 22 30 47; - --color-gray-900: 16 24 39; - --color-gray-950: 4 4 31; - - /* Zeplin Primary and Secondary */ - --color-alpa-primary: 17 24 28; - --color-alpa-secondary: 84 89 100; - /* Primary color in light mode in Zeplin */ - --color-alpa-light-primary: 17 24 28; - /* Primary color in dark mode in Zeplin */ - --color-alpa-dark-primary: 249 250 250; - /* Secondary color in light mode in Zeplin */ - --color-alpa-light-secondary: 84 89 100; - /* Secondary color in dark mode in Zeplin */ - --color-alpa-dark-secondary: 176 181 191; - /* Dark Theme/Dark+ color in Zeplin */ - --color-alpa-darker: 4 4 31; - - /* Complementary */ - --color-red: 227 13 20; - --color-green: 31 168 81; - --color-orange: 240 111 5; - --color-yellow: 168 143 16; - --color-premium: 248 171 19; - --color-platinum: 251 217 131; - - /* Components */ - --color-background-card: 255 255 255; - --color-background-color: 248 249 251; - --color-dark-color: 231 234 238; - - /* Corpo website colors */ - --color-corpo-dark: 15 15 41; - --color-corpo-gray: 56 56 78; - - /* Light premium radial gradient */ - --premium-radial-gradient: radial-gradient( - 50% 100% at top, - rgb(251 208 124), - rgb(250 193 80) - ); - - /* From Dark secondary (300 to 400) */ - - --platinum-linear-gradient: linear-gradient(-45deg, rgba(var(--color-premium)), #acacac); - } - - .dark { - /* Primary */ - --color-primary: 136 139 206; - --color-primary-50: 27 28 41; - --color-primary-100: 54 56 82; - --color-primary-200: 82 83 172; - --color-primary-300: 109 111 165; - --color-primary-400: 136 139 206; - --color-primary-500: 160 162 216; - --color-primary-600: 184 185 226; - --color-primary-700: 207 209 235; - --color-primary-800: 231 232 245; - --color-primary-900: 243 243 250; - --color-primary-night: 27 28 41; - --color-text-primary: 136 139 206; - --color-border-primary: 184 185 226; - - /* Secondary */ - --color-secondary: 249 177 36; - --color-secondary-50: 254 247 233; - --color-secondary-100: 254 239 211; - --color-secondary-200: 253 224 167; - --color-secondary-300: 251 208 124; - --color-secondary-400: 250 193 80; - --color-secondary-500: 249 177 36; - --color-secondary-600: 199 142 29; - --color-secondary-700: 149 106 22; - --color-secondary-800: 100 71 14; - --color-secondary-900: 50 35 7; - - /* Gray */ - --color-gray-50: 4 4 31; - --color-gray-100: 16 24 39; - --color-gray-200: 22 30 47; - --color-gray-300: 46 59 77; - --color-gray-400: 71 85 105; - --color-gray-500: 100 116 139; - --color-gray-600: 148 163 184; - --color-gray-700: 203 213 225; - --color-gray-800: 226 232 240; - --color-gray-900: 241 245 249; - --colors-gray-950: 248 250 252; - - /* Zeplin Primary and Secondary */ - --color-alpa-primary: 249 250 250; - --color-alpa-secondary: 176 181 191; - - /* Complementary */ - --color-red: 245 91 96; - --color-green: 113 229 155; - --color-orange: 252 168 100; - --color-yellow: 227 195 95; - --color-premium: 248 171 19; - --color-platinum: 251 217 131; - - /* Components */ - --color-background-card: 22 33 47; - --color-background-color: 16 24 39; - --color-dark-color: 4 4 31; - - /* Light premium radial gradient */ - --premium-radial-gradient: radial-gradient( - 50% 100% at top, - rgb(var(--color-secondary-400)), - rgb(var(--color-secondary-500)) - ); - } + /* Algolia global search colors */ + --docsearch-searchbox-background: rgb(var(--input)); } - html[data-theme="light"] .menu__link--active { - --ifm-menu-color-active: #4E4A99; + --ifm-menu-color-active: rgb(var(--primary)); } html[data-theme="light"] .navbar-sidebar__item .menu__list .menu__link--active { - --ifm-menu-color-active: #F8AB13; -} - -html[data-theme="light"] .table-of-contents__link--active { - --ifm-color-primary: #4E4A99; + --ifm-menu-color-active: rgb(var(--secondary)); } html[data-theme="light"] .tabs__item--active { - --ifm-color-primary: #4E4A99; - --ifm-tabs-color-active: #4E4A99; - border-bottom: 2px solid var(--ifm-color-primary); + --ifm-color-primary: rgb(var(--primary)); + --ifm-tabs-color-active: rgb(var(--primary)); + border-bottom: 2px solid rgb(var(--primary)); } html[data-theme="light"] .table-of-contents__link:hover { - --ifm-color-primary: #4E4A99; + --ifm-color-primary: rgb(var(--primary)); } html[data-theme="light"] .breadcrumbs__link { - --ifm-breadcrumb-color-active: #4E4A99; - --ifm-link-hover-color: #4E4A99; + --ifm-breadcrumb-color-active: rgb(var(--primary)); + --ifm-link-hover-color: rgb(var(--primary)); } -html[data-theme="light"] .dropdown__link--active, html[data-theme="light"] .dropdown__link--active:hover { - --ifm-link-color: #4E4A99; +html[data-theme="light"] .dropdown__link--active, +html[data-theme="light"] .dropdown__link--active:hover { + --ifm-link-color: rgb(var(--primary)); } html[data-theme="dark"] { - --docusaurus-highlighted-code-line-bg: rgba(255, 255, 255, 0.1); - /* --ifm-color-primary: #F8AB13; */ + --docusaurus-highlighted-code-line-bg: rgba(255, 255, 255, 0.1); } .docusaurus-highlight-code-line { - background-color: rgba(0, 0, 0, 0.1); - display: block; - margin: 0 calc(-1 * var(--ifm-pre-padding)); - padding: 0 var(--ifm-pre-padding); + @apply bg-background block; + margin: 0 calc(-1 * var(--ifm-pre-padding)); + padding: 0 var(--ifm-pre-padding); } html[data-theme="dark"] .docusaurus-highlight-code-line { - background-color: rgba(0, 0, 0, 0.3); + @apply bg-background; } /* custom CSS */ div.markdown { - text-align: justify; + @apply text-justify; } a { - color: rgb(var(--color-primary)); + @apply text-primary; } blockquote { - --ifm-blockquote-border-color: rgb(var(--color-primary)); - --ifm-blockquote-background-color: transparent; + --ifm-blockquote-border-color: rgb(var(--primary)); + --ifm-blockquote-background-color: transparent; } -.navbar__link { - --ifm-navbar-link-hover-color: #F8AB13; +.navbar { + @apply border-b border-border border-solid; } -.footer, .navbar, .navbar-sidebar { - background-color: rgb(22 33 47); - --ifm-navbar-link-color: #fff; - --ifm-menu-color: #fff; +.navbar__link { + --ifm-navbar-link-hover-color: rgb(var(--primary)); } -html[data-theme="dark"] .footer, html[data-theme="dark"] .navbar, html[data-theme="dark"] .navbar-sidebar { - background-color: rgb(22 33 47); +.footer, +.navbar, +.navbar-sidebar { + @apply bg-card text-foreground border-border/80; + --ifm-navbar-link-color: rgb(var(--foreground)); + --ifm-menu-color: rgb(var(--foreground)); } -.footer__copyright { - color: rgb(var(--color-gray-300)); +.navbar { + @apply border border-b border-solid; } - -/** Patch some colors **/ -button[class*='toggleButton']:hover { - background-color: transparent; +.footer { + @apply border-0 border-t border-solid; } -svg[class*='toggleIcon'][class*='lightToggleIcon'] { - color: #fff !important; +.footer__copyright { + @apply text-foreground/80 text-sm; } -svg[class*='toggleIcon'][class*='ToggleIcon']:hover { - color: var(--ifm-color-primary) !important; +.footer a { + @apply text-foreground hover:text-primary; } -.navbar__toggle svg { - color: #fff !important; +/** Patch some colors **/ +button[class*="toggleButton"]:hover { + @apply bg-transparent; } -.navbar-sidebar__back { - color: #fff !important; +svg[class*="toggleIcon"][class*="ToggleIcon"]:hover { + @apply !text-primary; } +.navbar__toggle svg, +.navbar-sidebar__back, +svg[class*="toggleIcon"][class*="lightToggleIcon"] { + @apply !text-foreground; +} -html[data-theme="light"] .navbar-sidebar__item > .menu__list .menu__link--sublist-caret::after, html[data-theme="light"] .navbar-sidebar__item > .menu__list .menu__caret::before { - --ifm-menu-link-sublist-icon-filter: none; - --ifm-menu-link-sublist-icon: url('data:image/svg+xml;utf8,') +html[data-theme="light"] .navbar-sidebar__item > .menu__list .menu__link--sublist-caret::after, +html[data-theme="light"] .navbar-sidebar__item > .menu__list .menu__caret::before { + --ifm-menu-link-sublist-icon-filter: none; + --ifm-menu-link-sublist-icon: url('data:image/svg+xml;utf8,'); } .header-discord-link:before { - content: "Discord"; - padding-left: 1.5rem !important; - padding-right: 0 !important; - background: no-repeat left/22% - url("data:image/svg+xml,%3C%3Fxml%20version%3D%221.0%22%3F%3E%3Csvg%20fill%3D%22%23ffffff%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20%20viewBox%3D%220%200%2024%2024%22%20width%3D%2224px%22%20height%3D%2224px%22%3E%20%20%20%20%3Cpath%20d%3D%22M19.952%2C5.672c-1.904-1.531-4.916-1.79-5.044-1.801c-0.201-0.017-0.392%2C0.097-0.474%2C0.281%20c-0.006%2C0.012-0.072%2C0.163-0.145%2C0.398c1.259%2C0.212%2C2.806%2C0.64%2C4.206%2C1.509c0.224%2C0.139%2C0.293%2C0.434%2C0.154%2C0.659%20c-0.09%2C0.146-0.247%2C0.226-0.407%2C0.226c-0.086%2C0-0.173-0.023-0.252-0.072C15.584%2C5.38%2C12.578%2C5.305%2C12%2C5.305S8.415%2C5.38%2C6.011%2C6.872%20c-0.225%2C0.14-0.519%2C0.07-0.659-0.154c-0.14-0.225-0.07-0.519%2C0.154-0.659c1.4-0.868%2C2.946-1.297%2C4.206-1.509%20c-0.074-0.236-0.14-0.386-0.145-0.398C9.484%2C3.968%2C9.294%2C3.852%2C9.092%2C3.872c-0.127%2C0.01-3.139%2C0.269-5.069%2C1.822%20C3.015%2C6.625%2C1%2C12.073%2C1%2C16.783c0%2C0.083%2C0.022%2C0.165%2C0.063%2C0.237c1.391%2C2.443%2C5.185%2C3.083%2C6.05%2C3.111c0.005%2C0%2C0.01%2C0%2C0.015%2C0%20c0.153%2C0%2C0.297-0.073%2C0.387-0.197l0.875-1.202c-2.359-0.61-3.564-1.645-3.634-1.706c-0.198-0.175-0.217-0.477-0.042-0.675%20c0.175-0.198%2C0.476-0.217%2C0.674-0.043c0.029%2C0.026%2C2.248%2C1.909%2C6.612%2C1.909c4.372%2C0%2C6.591-1.891%2C6.613-1.91%20c0.198-0.172%2C0.5-0.154%2C0.674%2C0.045c0.174%2C0.198%2C0.155%2C0.499-0.042%2C0.673c-0.07%2C0.062-1.275%2C1.096-3.634%2C1.706l0.875%2C1.202%20c0.09%2C0.124%2C0.234%2C0.197%2C0.387%2C0.197c0.005%2C0%2C0.01%2C0%2C0.015%2C0c0.865-0.027%2C4.659-0.667%2C6.05-3.111%20C22.978%2C16.947%2C23%2C16.866%2C23%2C16.783C23%2C12.073%2C20.985%2C6.625%2C19.952%2C5.672z%20M8.891%2C14.87c-0.924%2C0-1.674-0.857-1.674-1.913%20s0.749-1.913%2C1.674-1.913s1.674%2C0.857%2C1.674%2C1.913S9.816%2C14.87%2C8.891%2C14.87z%20M15.109%2C14.87c-0.924%2C0-1.674-0.857-1.674-1.913%20s0.749-1.913%2C1.674-1.913c0.924%2C0%2C1.674%2C0.857%2C1.674%2C1.913S16.033%2C14.87%2C15.109%2C14.87z%22%2F%3E%3C%2Fsvg%3E"); + content: "Discord"; + padding-left: 1.5rem !important; + padding-right: 0 !important; + background: + no-repeat left / 22% + url("data:image/svg+xml,%3C%3Fxml%20version%3D%221.0%22%3F%3E%3Csvg%20fill%3D%22%23ffffff%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20%20viewBox%3D%220%200%2024%2024%22%20width%3D%2224px%22%20height%3D%2224px%22%3E%20%20%20%20%3Cpath%20d%3D%22M19.952%2C5.672c-1.904-1.531-4.916-1.79-5.044-1.801c-0.201-0.017-0.392%2C0.097-0.474%2C0.281%20c-0.006%2C0.012-0.072%2C0.163-0.145%2C0.398c1.259%2C0.212%2C2.806%2C0.64%2C4.206%2C1.509c0.224%2C0.139%2C0.293%2C0.434%2C0.154%2C0.659%20c-0.09%2C0.146-0.247%2C0.226-0.407%2C0.226c-0.086%2C0-0.173-0.023-0.252-0.072C15.584%2C5.38%2C12.578%2C5.305%2C12%2C5.305S8.415%2C5.38%2C6.011%2C6.872%20c-0.225%2C0.14-0.519%2C0.07-0.659-0.154c-0.14-0.225-0.07-0.519%2C0.154-0.659c1.4-0.868%2C2.946-1.297%2C4.206-1.509%20c-0.074-0.236-0.14-0.386-0.145-0.398C9.484%2C3.968%2C9.294%2C3.852%2C9.092%2C3.872c-0.127%2C0.01-3.139%2C0.269-5.069%2C1.822%20C3.015%2C6.625%2C1%2C12.073%2C1%2C16.783c0%2C0.083%2C0.022%2C0.165%2C0.063%2C0.237c1.391%2C2.443%2C5.185%2C3.083%2C6.05%2C3.111c0.005%2C0%2C0.01%2C0%2C0.015%2C0%20c0.153%2C0%2C0.297-0.073%2C0.387-0.197l0.875-1.202c-2.359-0.61-3.564-1.645-3.634-1.706c-0.198-0.175-0.217-0.477-0.042-0.675%20c0.175-0.198%2C0.476-0.217%2C0.674-0.043c0.029%2C0.026%2C2.248%2C1.909%2C6.612%2C1.909c4.372%2C0%2C6.591-1.891%2C6.613-1.91%20c0.198-0.172%2C0.5-0.154%2C0.674%2C0.045c0.174%2C0.198%2C0.155%2C0.499-0.042%2C0.673c-0.07%2C0.062-1.275%2C1.096-3.634%2C1.706l0.875%2C1.202%20c0.09%2C0.124%2C0.234%2C0.197%2C0.387%2C0.197c0.005%2C0%2C0.01%2C0%2C0.015%2C0c0.865-0.027%2C4.659-0.667%2C6.05-3.111%20C22.978%2C16.947%2C23%2C16.866%2C23%2C16.783C23%2C12.073%2C20.985%2C6.625%2C19.952%2C5.672z%20M8.891%2C14.87c-0.924%2C0-1.674-0.857-1.674-1.913%20s0.749-1.913%2C1.674-1.913s1.674%2C0.857%2C1.674%2C1.913S9.816%2C14.87%2C8.891%2C14.87z%20M15.109%2C14.87c-0.924%2C0-1.674-0.857-1.674-1.913%20s0.749-1.913%2C1.674-1.913c0.924%2C0%2C1.674%2C0.857%2C1.674%2C1.913S16.033%2C14.87%2C15.109%2C14.87z%22%2F%3E%3C%2Fsvg%3E"); } .header-github-link:before { - content: "GitHub"; - padding-left: 1.5rem !important; - padding-right: 0 !important; - background: no-repeat left/22% - url("data:image/svg+xml,%3Csvg viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill='white' d='M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12'/%3E%3C/svg%3E"); + content: "GitHub"; + padding-left: 1.5rem !important; + padding-right: 0 !important; + background: + no-repeat left / 22% + url("data:image/svg+xml,%3Csvg viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill='white' d='M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12'/%3E%3C/svg%3E"); } .header-discourse-link:before { - content: "Forum"; - padding-left: 1.5rem !important; - padding-right: 0 !important; - background: no-repeat left/22% - url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20width%3D%2222%22%20height%3D%2222%22%20preserveAspectRatio%3D%22xMidYMid%20meet%22%20viewBox%3D%220%200%2024%2024%22%3E%3Cpath%20d%3D%22M12.077%203C7.149%203%203%206.96%203%2011.843V21l9.075-.01c4.928%200%208.925-4.11%208.925-8.993C21%207.113%2017%203%2012.077%203zm3.92%2012.859a5.568%205.568%200%200%201-6.102%201.043l-3.595.805l1.001-3.192a5.435%205.435%200%200%201%20.11-5.415a5.55%205.55%200%200%201%204.753-2.678v.001h.006a5.533%205.533%200%200%201%205.131%203.438a5.442%205.442%200%200%201-1.304%205.998z%22%20fill%3D%22white%22%2F%3E%3C%2Fsvg%3E"); + content: "Forum"; + padding-left: 1.5rem !important; + padding-right: 0 !important; + background: + no-repeat left / 22% + url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20width%3D%2222%22%20height%3D%2222%22%20preserveAspectRatio%3D%22xMidYMid%20meet%22%20viewBox%3D%220%200%2024%2024%22%3E%3Cpath%20d%3D%22M12.077%203C7.149%203%203%206.96%203%2011.843V21l9.075-.01c4.928%200%208.925-4.11%208.925-8.993C21%207.113%2017%203%2012.077%203zm3.92%2012.859a5.568%205.568%200%200%201-6.102%201.043l-3.595.805l1.001-3.192a5.435%205.435%200%200%201%20.11-5.415a5.55%205.55%200%200%201%204.753-2.678v.001h.006a5.533%205.533%200%200%201%205.131%203.438a5.442%205.442%200%200%201-1.304%205.998z%22%20fill%3D%22white%22%2F%3E%3C%2Fsvg%3E"); } .header-hub-link:before { - content: "Hub"; - padding-left: 1.7rem !important; - background: no-repeat left/33% - url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 275.05 249.82' %3E%3Cstyle%3E%3C!%5BCDATA%5B.C%7Bletter-spacing:-0.04em%7D%5D%5D%3E%3C/style%3E%3Cpath d='M39.26 178.8a20.79 20.79 0 0 1-7 4.92 24 24 0 0 1-9.76 1.84 23.7 23.7 0 0 1-9.86-1.9 20.78 20.78 0 0 1-7-5 21.06 21.06 0 0 1-4.21-7.07A24 24 0 0 1 0 163.47a24.34 24.34 0 0 1 1.41-8.14 21 21 0 0 1 4.21-7.09 20.78 20.78 0 0 1 7-5 23.7 23.7 0 0 1 9.86-1.9 23.64 23.64 0 0 1 9.76 1.87 20.72 20.72 0 0 1 7 5l-5.1 4.24a14.52 14.52 0 0 0-4.92-3.57 16.37 16.37 0 0 0-6.88-1.35 14.84 14.84 0 0 0-14 8.25 17.57 17.57 0 0 0 0 15.33 14.85 14.85 0 0 0 14 8.24 16.65 16.65 0 0 0 6.79-1.29 14.39 14.39 0 0 0 4.87-3.44l5.09 4.24zm2.45-25.49h6.21v3.13a9.62 9.62 0 0 1 2.33-1.81 13.23 13.23 0 0 1 2.89-1.23 18.62 18.62 0 0 1 3.14-.65 16.42 16.42 0 0 1 3.13-.06v6a15.17 15.17 0 0 0-5.65.37 7.41 7.41 0 0 0-3.51 2.15 8.42 8.42 0 0 0-1.81 3.56 19.24 19.24 0 0 0-.52 4.67v15.06h-6.21zM75 185.19a16.52 16.52 0 0 1-9.15-2.39 15.31 15.31 0 0 1-5.5-6 17.42 17.42 0 0 1-1.84-7.8 16.7 16.7 0 0 1 1.81-7.8 15.59 15.59 0 0 1 5.5-6 16.39 16.39 0 0 1 9.18-2.4 16.42 16.42 0 0 1 9.19 2.4 15.67 15.67 0 0 1 5.5 6 16.7 16.7 0 0 1 1.81 7.8 17.55 17.55 0 0 1-1.84 7.8 15.39 15.39 0 0 1-5.5 6 16.53 16.53 0 0 1-9.16 2.39zm0-27.77a9.23 9.23 0 0 0-5.71 1.72 10.8 10.8 0 0 0-3.41 4.27 14.13 14.13 0 0 0 0 11.12 10.73 10.73 0 0 0 3.41 4.27 10.35 10.35 0 0 0 11.43 0 10.82 10.82 0 0 0 3.41-4.27 14.24 14.24 0 0 0 0-11.12 10.89 10.89 0 0 0-3.41-4.27 9.26 9.26 0 0 0-5.72-1.72zm49 19.48l6.51-23.53h7.31l-10.2 31.21h-7.31l-6.45-24-6.45 24h-7.31l-10.2-31.21h7.31l6.51 23.53 6.52-23.53h7.12zm39.79-35.33h6.27v43h-6.27v-4.43a12.91 12.91 0 0 1-4.7 3.81 15 15 0 0 1-11.61.56 15.41 15.41 0 0 1-9-8.3 19 19 0 0 1 0-14.5 15.38 15.38 0 0 1 9-8.29 15.09 15.09 0 0 1 11.63.55 12.86 12.86 0 0 1 4.71 3.81zm-10.23 15.85a9.82 9.82 0 0 0-4.5 1 9.61 9.61 0 0 0-3.22 2.62 11.21 11.21 0 0 0-1.93 3.71 14.37 14.37 0 0 0 0 8.48 11.36 11.36 0 0 0 1.93 3.72 9.7 9.7 0 0 0 3.22 2.61 10.82 10.82 0 0 0 9 0 9.7 9.7 0 0 0 3.22-2.61 11.36 11.36 0 0 0 1.93-3.72 14.36 14.36 0 0 0 0-8.48 11.21 11.21 0 0 0-1.93-3.71 9.61 9.61 0 0 0-3.22-2.62 9.85 9.85 0 0 0-4.5-1zm37.26-16.09a28.52 28.52 0 0 1 9.22 1.56 33 33 0 0 1 7.68 3.9l-3.44 3.94-.74.86a21.17 21.17 0 0 0-7-3.78 18.59 18.59 0 0 0-6.45-.83 13 13 0 0 0-5.19 1.32 7.92 7.92 0 0 0-3.19 2.7 3.84 3.84 0 0 0-.49 3.26 5.56 5.56 0 0 0 2.88 3 30.3 30.3 0 0 0 6.05 2.49q3.42 1 6.73 2.21a32.23 32.23 0 0 1 6 2.89 10.15 10.15 0 0 1 4 4.51 11.41 11.41 0 0 1 1 3.84 10.55 10.55 0 0 1-.58 4.21 8.33 8.33 0 0 1-1.48 2.67 11.45 11.45 0 0 1-2.27 2.12 17.44 17.44 0 0 1-5.84 2.58 28.66 28.66 0 0 1-6.2.86 33.14 33.14 0 0 1-5.32-.4 24.81 24.81 0 0 1-4.76-1.23 25.47 25.47 0 0 1-4.48-2.15 31.86 31.86 0 0 1-4.49-3.28l3.38-3.87.86-1a24.25 24.25 0 0 0 7.56 4.77 23.32 23.32 0 0 0 8.41 1.32 10.3 10.3 0 0 0 4.64-1.08 8.57 8.57 0 0 0 3.29-2.64 4.07 4.07 0 0 0 .71-3.35c-.27-1.19-1.26-2.29-3-3.32a22.84 22.84 0 0 0-4.27-1.87l-5.16-1.66-5.29-1.81a23.21 23.21 0 0 1-4.67-2.37 11.79 11.79 0 0 1-3.31-3.25 7.6 7.6 0 0 1-1.2-4.52 10.62 10.62 0 0 1 1.5-5.47 13.24 13.24 0 0 1 3.75-3.93 17.11 17.11 0 0 1 5.19-2.39 21.53 21.53 0 0 1 5.84-.8zm35.88 39.13a9.5 9.5 0 0 0 5.13-1.32 9.93 9.93 0 0 0 3.35-3.41l4.54 3.5a14.91 14.91 0 0 1-5.28 4.27 17.06 17.06 0 0 1-7.74 1.63 18 18 0 0 1-6.64-1.14 15.19 15.19 0 0 1-4.94-3.07 14.82 14.82 0 0 1-3.26-4.45 17.51 17.51 0 0 1 0-15.12 14.82 14.82 0 0 1 3.26-4.45 15.36 15.36 0 0 1 4.94-3.07 19.88 19.88 0 0 1 13.27 0 15.3 15.3 0 0 1 4.95 3.07 14.82 14.82 0 0 1 3.26 4.45 17.53 17.53 0 0 1 1.56 9.9h-26.41a13.65 13.65 0 0 0 1.07 3.5 10.56 10.56 0 0 0 2 2.95 9 9 0 0 0 3 2 10.16 10.16 0 0 0 4 .74zm10.14-13.88a14 14 0 0 0-1.08-3.51 10.51 10.51 0 0 0-2-2.94 8.89 8.89 0 0 0-3-2 11 11 0 0 0-7.92 0 8.89 8.89 0 0 0-3 2 10.51 10.51 0 0 0-2 2.94 13.6 13.6 0 0 0-1.07 3.51h20.15zm32.93 16.89a17.1 17.1 0 0 1-7.87 1.66 16.44 16.44 0 0 1-9.15-2.4 15.22 15.22 0 0 1-5.5-6 17.42 17.42 0 0 1-1.84-7.8 16.67 16.67 0 0 1 1.81-7.8 15.52 15.52 0 0 1 5.5-6 16.39 16.39 0 0 1 9.18-2.4 17.1 17.1 0 0 1 7.87 1.66 15 15 0 0 1 5.28 4.36l-4.55 3.57a10.1 10.1 0 0 0-3.37-3.54 9.51 9.51 0 0 0-5.23-1.38 9.16 9.16 0 0 0-5.71 1.72 10.8 10.8 0 0 0-3.41 4.27 14.13 14.13 0 0 0 0 11.12 10.8 10.8 0 0 0 3.41 4.27 9.16 9.16 0 0 0 5.71 1.72 9.51 9.51 0 0 0 5.23-1.38 10.15 10.15 0 0 0 3.37-3.53l4.55 3.56a14.91 14.91 0 0 1-5.28 4.32z' fill='%23fff'/%3E%3Cpath d='M110 117.18l-.72 6.65h.06l.66-6.65z' fill='%233e3978'/%3E%3Ctext class='C' transform='translate(83.51 237.44)' fill='%23fff' font-size='61' font-family='BellinzoRegularRegular,Bellinzo Regular'%3EHub%3C/text%3E%3Cg fill='%23fff'%3E%3Cpath d='M102.63 63.66a20.63 20.63 0 0 1 1.69 3.48h0a27.11 27.11 0 0 0-2.14-5.92c-1.56-3-3.86-2.86-5.3 0a29.14 29.14 0 0 0-2.14 6 23.85 23.85 0 0 1 1.68-3.55c1.69-2.87 4.39-2.99 6.21-.01zm73.63 0a21.42 21.42 0 0 1 1.74 3.48h0a26.6 26.6 0 0 0-2.14-5.92c-1.55-3-3.85-2.86-5.29 0a29.14 29.14 0 0 0-2.14 6 23.85 23.85 0 0 1 1.68-3.55c1.63-2.87 4.33-2.99 6.15-.01zM140 46.06a27.85 27.85 0 0 1 2.37 5.32 34.92 34.92 0 0 0-2.77-7.78c-1.94-3.72-4.81-3.57-6.61 0a37.88 37.88 0 0 0-2.77 7.9 30.88 30.88 0 0 1 2.36-5.44c1.99-3.57 5.22-3.72 7.42 0zM95 67.82a5.51 5.51 0 0 0 3.59 4.59l.13 4 .46 4.78c.19 1.13.48 1.08.66 0 .25-1.52.32-3.15.46-4.78a39 39 0 0 0 .12-4 5.5 5.5 0 0 0 3.6-4.59 9.08 9.08 0 0 1-9 0z'/%3E%3Cpath d='M168.63 67.82a5.5 5.5 0 0 0 3.6 4.59 39 39 0 0 0 .12 4l.46 4.78c.2 1.13.48 1.08.66 0 .25-1.52.32-3.15.46-4.78l.13-4a5.51 5.51 0 0 0 3.59-4.59 9.08 9.08 0 0 1-9 0zM188 75.94c1 4.27 2.23 13.48 3.5 24.14C190.43 90 189.28 81 188 75.94zm-46.18-24.07a11.36 11.36 0 0 1-11.25 0c.52 2.88 2.27 5.13 4.49 5.71l.15 5.05.58 6c.24 1.41.59 1.35.82 0 .31-1.9.4-3.93.57-6 .14-1.66.18-3.35.16-5.05 2.21-.58 3.97-2.83 4.48-5.71zM98.54 72.41l.13 4 .46 4.78c.19 1.13.48 1.08.66 0 .25-1.52.32-3.15.46-4.78a39 39 0 0 0 .12-4 5.5 5.5 0 0 0 3.6-4.59 9.08 9.08 0 0 1-9 0 5.51 5.51 0 0 0 3.57 4.59zm60.6 19.68c-1.59-13.3-3.15-24.78-4.37-30.1a7.1 7.1 0 0 0 6.87-5.84h0a8.19 8.19 0 0 0 .12-1.11h.2a4.47 4.47 0 0 0 2.74-8.18 7.1 7.1 0 0 0-1.8-13.51 4.47 4.47 0 0 0-3.43-7.22 7.17 7.17 0 0 0 2.87-2.52c1.67-2.61 1.94-14.4-4-22-2.44-3.12-4.83-1.24-5 .89-.47 6.52-.52 11.42-2.22 17a4.46 4.46 0 0 0-7.92-2.05 7.1 7.1 0 0 0-14 0 4.47 4.47 0 0 0-7.94 2c-1.69-5.59-1.75-10.49-2.22-17-.15-2.13-2.54-4-5-.89-5.93 7.58-5.66 19.37-4 22a7.17 7.17 0 0 0 2.87 2.52 4.48 4.48 0 0 0-3.43 7.22 7.1 7.1 0 0 0-1.79 13.51 4.47 4.47 0 0 0 2.73 8.18h.21a6.36 6.36 0 0 0 .11 1.07h0a7.1 7.1 0 0 0 7 5.89h0c-2 8.51-5 32.87-7.43 55.17l-.66 6.65a842.28 842.28 0 0 1 26.64-.42c9 0 17.83.14 26.22.41l-.67-6.27-2.7-25.4zm-14.58-40a5.88 5.88 0 0 1-2.39-1.17c.7 2.78 1.21 5.61 1.93 8.44a45.15 45.15 0 0 1 1.22 7.43c.31 3.86-2.22 7.19-5.39 7.19h-7.47c-3.17 0-5.7-3.33-5.39-7.19a46.23 46.23 0 0 1 1.22-7.43c.66-2.61 1.17-5.23 1.81-7.8a8.31 8.31 0 0 1-3.84 1 44.4 44.4 0 0 1-6.91-.45 4.78 4.78 0 0 1-4-3.37c-.59-1.69-1-3.45-1.59-5.14a14.16 14.16 0 0 0-1.21-2.09 2.41 2.41 0 0 1-.42-.89v-3.86a38.54 38.54 0 0 1 12.17-1.54 27 27 0 0 1 8.8 1.61 10.09 10.09 0 0 0 7.18 0 30 30 0 0 1 13.6-1.44c2.45.22 4.87.76 7.35 1.16v4.08c0 .29-.13.74-.33.82-1 .45-1.11 1.36-1.35 2.25a84.99 84.99 0 0 1-1.41 4.71 5.44 5.44 0 0 1-4.38 3.79 20.06 20.06 0 0 1-9.2-.1zm-29.92 15.64a5.53 5.53 0 0 1-1.13.36 16.1 16.1 0 0 1-7.34-.08 4.61 4.61 0 0 1-1.92-.94l1.55 6.77a36.86 36.86 0 0 1 1 6c.24 3.1-1.78 5.77-4.33 5.77h-6c-2.55 0-4.58-2.67-4.33-5.77a36.86 36.86 0 0 1 1-6l1.45-6.26a6.48 6.48 0 0 1-3.08.79A34.29 34.29 0 0 1 86 68a3.85 3.85 0 0 1-3.22-2.71l-1.28-4.12a10.81 10.81 0 0 0-1-1.67 1.73 1.73 0 0 1-.33-.72v-3.09a30.28 30.28 0 0 1 9.75-1.23 21.25 21.25 0 0 1 7.06 1.29 8.11 8.11 0 0 0 5.76 0 19.87 19.87 0 0 1 2.74-.81 6.47 6.47 0 0 1-.79-7.68 9.11 9.11 0 0 1-2.18-11 5.59 5.59 0 0 0-3-.86 5.7 5.7 0 0 0-5.64 4.88 3.58 3.58 0 0 0-6.37 1.62c-1.35-4.48-1.4-8.41-1.77-13.64-.12-1.7-2-3.21-4-.71-4.75 6.08-4.54 15.53-3.2 17.63a5.86 5.86 0 0 0 2.3 2A3.58 3.58 0 0 0 78 53a5.69 5.69 0 0 0-1.4 10.82 3.59 3.59 0 0 0 2.19 6.56h.17a6 6 0 0 0 .09.86h0A5.69 5.69 0 0 0 84.66 76h0c-1.58 6.82-4 26.36-6 44.24l-.53 5.38c9-.74 18.89-1.31 29.48-1.68l.69-6.94 2.87-24.67 3.47-24.6z'/%3E%3Cpath d='M199.39 58.62a5.7 5.7 0 0 0-4.83-5.62 3.58 3.58 0 0 0-2.75-5.79 5.86 5.86 0 0 0 2.3-2c1.34-2.1 1.55-11.55-3.2-17.63-2-2.5-3.87-1-4 .71-.37 5.23-.41 9.16-1.77 13.64a3.59 3.59 0 0 0-6.36-1.64 5.69 5.69 0 0 0-8.78-3.92 9.1 9.1 0 0 1-2.23 10.9 6.44 6.44 0 0 1-.66 7.54 21.08 21.08 0 0 1 3.54 1 8.11 8.11 0 0 0 5.76 0 24.1 24.1 0 0 1 10.91-1.15c2 .17 3.91.6 5.9.93v3.27c0 .23-.11.59-.26.66-.82.36-.9 1.09-1.09 1.8a63 63 0 0 1-1.13 3.78 4.35 4.35 0 0 1-3.51 3 16.1 16.1 0 0 1-7.34-.08 4.67 4.67 0 0 1-1.92-.94c.56 2.23 1 4.5 1.55 6.77a36.86 36.86 0 0 1 1 6c.25 3.1-1.78 5.77-4.33 5.77h-6c-2.55 0-4.57-2.67-4.33-5.77a36.86 36.86 0 0 1 1-6c.53-2.09.94-4.19 1.45-6.26a6.48 6.48 0 0 1-3.08.79 34.29 34.29 0 0 1-5.54-.35 3.78 3.78 0 0 1-1.84-.74c1.52 9.16 3.53 25.4 6.18 50.05l.29 2.62q.19 1.9.42 3.93c10.62.37 20.57.94 29.58 1.68l-.55-5.07-2.17-20.41c-1.33-10.67-2.6-19.88-3.6-24.15a5.7 5.7 0 0 0 5.51-4.68h0a6.69 6.69 0 0 0 .09-.9h.17a3.59 3.59 0 0 0 2.23-6.54 5.69 5.69 0 0 0 3.39-5.2zm-36.87 65.19h.15q-.33-3.09-.67-6.27l-2.86-25.45 2.71 25.45.67 6.27z'/%3E%3Cpath d='M154.77 62c1.22 5.32 2.78 16.8 4.37 30.1-1.39-12.56-2.82-23.86-4.37-30.1zm-44.45 55.17l-.72 6.65h.06l.66-6.65z'/%3E%3C/g%3E%3C/svg%3E"); + content: "Hub"; + padding-left: 1.7rem !important; + background: + no-repeat left / 33% + url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 275.05 249.82' %3E%3Cstyle%3E%3C!%5BCDATA%5B.C%7Bletter-spacing:-0.04em%7D%5D%5D%3E%3C/style%3E%3Cpath d='M39.26 178.8a20.79 20.79 0 0 1-7 4.92 24 24 0 0 1-9.76 1.84 23.7 23.7 0 0 1-9.86-1.9 20.78 20.78 0 0 1-7-5 21.06 21.06 0 0 1-4.21-7.07A24 24 0 0 1 0 163.47a24.34 24.34 0 0 1 1.41-8.14 21 21 0 0 1 4.21-7.09 20.78 20.78 0 0 1 7-5 23.7 23.7 0 0 1 9.86-1.9 23.64 23.64 0 0 1 9.76 1.87 20.72 20.72 0 0 1 7 5l-5.1 4.24a14.52 14.52 0 0 0-4.92-3.57 16.37 16.37 0 0 0-6.88-1.35 14.84 14.84 0 0 0-14 8.25 17.57 17.57 0 0 0 0 15.33 14.85 14.85 0 0 0 14 8.24 16.65 16.65 0 0 0 6.79-1.29 14.39 14.39 0 0 0 4.87-3.44l5.09 4.24zm2.45-25.49h6.21v3.13a9.62 9.62 0 0 1 2.33-1.81 13.23 13.23 0 0 1 2.89-1.23 18.62 18.62 0 0 1 3.14-.65 16.42 16.42 0 0 1 3.13-.06v6a15.17 15.17 0 0 0-5.65.37 7.41 7.41 0 0 0-3.51 2.15 8.42 8.42 0 0 0-1.81 3.56 19.24 19.24 0 0 0-.52 4.67v15.06h-6.21zM75 185.19a16.52 16.52 0 0 1-9.15-2.39 15.31 15.31 0 0 1-5.5-6 17.42 17.42 0 0 1-1.84-7.8 16.7 16.7 0 0 1 1.81-7.8 15.59 15.59 0 0 1 5.5-6 16.39 16.39 0 0 1 9.18-2.4 16.42 16.42 0 0 1 9.19 2.4 15.67 15.67 0 0 1 5.5 6 16.7 16.7 0 0 1 1.81 7.8 17.55 17.55 0 0 1-1.84 7.8 15.39 15.39 0 0 1-5.5 6 16.53 16.53 0 0 1-9.16 2.39zm0-27.77a9.23 9.23 0 0 0-5.71 1.72 10.8 10.8 0 0 0-3.41 4.27 14.13 14.13 0 0 0 0 11.12 10.73 10.73 0 0 0 3.41 4.27 10.35 10.35 0 0 0 11.43 0 10.82 10.82 0 0 0 3.41-4.27 14.24 14.24 0 0 0 0-11.12 10.89 10.89 0 0 0-3.41-4.27 9.26 9.26 0 0 0-5.72-1.72zm49 19.48l6.51-23.53h7.31l-10.2 31.21h-7.31l-6.45-24-6.45 24h-7.31l-10.2-31.21h7.31l6.51 23.53 6.52-23.53h7.12zm39.79-35.33h6.27v43h-6.27v-4.43a12.91 12.91 0 0 1-4.7 3.81 15 15 0 0 1-11.61.56 15.41 15.41 0 0 1-9-8.3 19 19 0 0 1 0-14.5 15.38 15.38 0 0 1 9-8.29 15.09 15.09 0 0 1 11.63.55 12.86 12.86 0 0 1 4.71 3.81zm-10.23 15.85a9.82 9.82 0 0 0-4.5 1 9.61 9.61 0 0 0-3.22 2.62 11.21 11.21 0 0 0-1.93 3.71 14.37 14.37 0 0 0 0 8.48 11.36 11.36 0 0 0 1.93 3.72 9.7 9.7 0 0 0 3.22 2.61 10.82 10.82 0 0 0 9 0 9.7 9.7 0 0 0 3.22-2.61 11.36 11.36 0 0 0 1.93-3.72 14.36 14.36 0 0 0 0-8.48 11.21 11.21 0 0 0-1.93-3.71 9.61 9.61 0 0 0-3.22-2.62 9.85 9.85 0 0 0-4.5-1zm37.26-16.09a28.52 28.52 0 0 1 9.22 1.56 33 33 0 0 1 7.68 3.9l-3.44 3.94-.74.86a21.17 21.17 0 0 0-7-3.78 18.59 18.59 0 0 0-6.45-.83 13 13 0 0 0-5.19 1.32 7.92 7.92 0 0 0-3.19 2.7 3.84 3.84 0 0 0-.49 3.26 5.56 5.56 0 0 0 2.88 3 30.3 30.3 0 0 0 6.05 2.49q3.42 1 6.73 2.21a32.23 32.23 0 0 1 6 2.89 10.15 10.15 0 0 1 4 4.51 11.41 11.41 0 0 1 1 3.84 10.55 10.55 0 0 1-.58 4.21 8.33 8.33 0 0 1-1.48 2.67 11.45 11.45 0 0 1-2.27 2.12 17.44 17.44 0 0 1-5.84 2.58 28.66 28.66 0 0 1-6.2.86 33.14 33.14 0 0 1-5.32-.4 24.81 24.81 0 0 1-4.76-1.23 25.47 25.47 0 0 1-4.48-2.15 31.86 31.86 0 0 1-4.49-3.28l3.38-3.87.86-1a24.25 24.25 0 0 0 7.56 4.77 23.32 23.32 0 0 0 8.41 1.32 10.3 10.3 0 0 0 4.64-1.08 8.57 8.57 0 0 0 3.29-2.64 4.07 4.07 0 0 0 .71-3.35c-.27-1.19-1.26-2.29-3-3.32a22.84 22.84 0 0 0-4.27-1.87l-5.16-1.66-5.29-1.81a23.21 23.21 0 0 1-4.67-2.37 11.79 11.79 0 0 1-3.31-3.25 7.6 7.6 0 0 1-1.2-4.52 10.62 10.62 0 0 1 1.5-5.47 13.24 13.24 0 0 1 3.75-3.93 17.11 17.11 0 0 1 5.19-2.39 21.53 21.53 0 0 1 5.84-.8zm35.88 39.13a9.5 9.5 0 0 0 5.13-1.32 9.93 9.93 0 0 0 3.35-3.41l4.54 3.5a14.91 14.91 0 0 1-5.28 4.27 17.06 17.06 0 0 1-7.74 1.63 18 18 0 0 1-6.64-1.14 15.19 15.19 0 0 1-4.94-3.07 14.82 14.82 0 0 1-3.26-4.45 17.51 17.51 0 0 1 0-15.12 14.82 14.82 0 0 1 3.26-4.45 15.36 15.36 0 0 1 4.94-3.07 19.88 19.88 0 0 1 13.27 0 15.3 15.3 0 0 1 4.95 3.07 14.82 14.82 0 0 1 3.26 4.45 17.53 17.53 0 0 1 1.56 9.9h-26.41a13.65 13.65 0 0 0 1.07 3.5 10.56 10.56 0 0 0 2 2.95 9 9 0 0 0 3 2 10.16 10.16 0 0 0 4 .74zm10.14-13.88a14 14 0 0 0-1.08-3.51 10.51 10.51 0 0 0-2-2.94 8.89 8.89 0 0 0-3-2 11 11 0 0 0-7.92 0 8.89 8.89 0 0 0-3 2 10.51 10.51 0 0 0-2 2.94 13.6 13.6 0 0 0-1.07 3.51h20.15zm32.93 16.89a17.1 17.1 0 0 1-7.87 1.66 16.44 16.44 0 0 1-9.15-2.4 15.22 15.22 0 0 1-5.5-6 17.42 17.42 0 0 1-1.84-7.8 16.67 16.67 0 0 1 1.81-7.8 15.52 15.52 0 0 1 5.5-6 16.39 16.39 0 0 1 9.18-2.4 17.1 17.1 0 0 1 7.87 1.66 15 15 0 0 1 5.28 4.36l-4.55 3.57a10.1 10.1 0 0 0-3.37-3.54 9.51 9.51 0 0 0-5.23-1.38 9.16 9.16 0 0 0-5.71 1.72 10.8 10.8 0 0 0-3.41 4.27 14.13 14.13 0 0 0 0 11.12 10.8 10.8 0 0 0 3.41 4.27 9.16 9.16 0 0 0 5.71 1.72 9.51 9.51 0 0 0 5.23-1.38 10.15 10.15 0 0 0 3.37-3.53l4.55 3.56a14.91 14.91 0 0 1-5.28 4.32z' fill='%23fff'/%3E%3Cpath d='M110 117.18l-.72 6.65h.06l.66-6.65z' fill='%233e3978'/%3E%3Ctext class='C' transform='translate(83.51 237.44)' fill='%23fff' font-size='61' font-family='BellinzoRegularRegular,Bellinzo Regular'%3EHub%3C/text%3E%3Cg fill='%23fff'%3E%3Cpath d='M102.63 63.66a20.63 20.63 0 0 1 1.69 3.48h0a27.11 27.11 0 0 0-2.14-5.92c-1.56-3-3.86-2.86-5.3 0a29.14 29.14 0 0 0-2.14 6 23.85 23.85 0 0 1 1.68-3.55c1.69-2.87 4.39-2.99 6.21-.01zm73.63 0a21.42 21.42 0 0 1 1.74 3.48h0a26.6 26.6 0 0 0-2.14-5.92c-1.55-3-3.85-2.86-5.29 0a29.14 29.14 0 0 0-2.14 6 23.85 23.85 0 0 1 1.68-3.55c1.63-2.87 4.33-2.99 6.15-.01zM140 46.06a27.85 27.85 0 0 1 2.37 5.32 34.92 34.92 0 0 0-2.77-7.78c-1.94-3.72-4.81-3.57-6.61 0a37.88 37.88 0 0 0-2.77 7.9 30.88 30.88 0 0 1 2.36-5.44c1.99-3.57 5.22-3.72 7.42 0zM95 67.82a5.51 5.51 0 0 0 3.59 4.59l.13 4 .46 4.78c.19 1.13.48 1.08.66 0 .25-1.52.32-3.15.46-4.78a39 39 0 0 0 .12-4 5.5 5.5 0 0 0 3.6-4.59 9.08 9.08 0 0 1-9 0z'/%3E%3Cpath d='M168.63 67.82a5.5 5.5 0 0 0 3.6 4.59 39 39 0 0 0 .12 4l.46 4.78c.2 1.13.48 1.08.66 0 .25-1.52.32-3.15.46-4.78l.13-4a5.51 5.51 0 0 0 3.59-4.59 9.08 9.08 0 0 1-9 0zM188 75.94c1 4.27 2.23 13.48 3.5 24.14C190.43 90 189.28 81 188 75.94zm-46.18-24.07a11.36 11.36 0 0 1-11.25 0c.52 2.88 2.27 5.13 4.49 5.71l.15 5.05.58 6c.24 1.41.59 1.35.82 0 .31-1.9.4-3.93.57-6 .14-1.66.18-3.35.16-5.05 2.21-.58 3.97-2.83 4.48-5.71zM98.54 72.41l.13 4 .46 4.78c.19 1.13.48 1.08.66 0 .25-1.52.32-3.15.46-4.78a39 39 0 0 0 .12-4 5.5 5.5 0 0 0 3.6-4.59 9.08 9.08 0 0 1-9 0 5.51 5.51 0 0 0 3.57 4.59zm60.6 19.68c-1.59-13.3-3.15-24.78-4.37-30.1a7.1 7.1 0 0 0 6.87-5.84h0a8.19 8.19 0 0 0 .12-1.11h.2a4.47 4.47 0 0 0 2.74-8.18 7.1 7.1 0 0 0-1.8-13.51 4.47 4.47 0 0 0-3.43-7.22 7.17 7.17 0 0 0 2.87-2.52c1.67-2.61 1.94-14.4-4-22-2.44-3.12-4.83-1.24-5 .89-.47 6.52-.52 11.42-2.22 17a4.46 4.46 0 0 0-7.92-2.05 7.1 7.1 0 0 0-14 0 4.47 4.47 0 0 0-7.94 2c-1.69-5.59-1.75-10.49-2.22-17-.15-2.13-2.54-4-5-.89-5.93 7.58-5.66 19.37-4 22a7.17 7.17 0 0 0 2.87 2.52 4.48 4.48 0 0 0-3.43 7.22 7.1 7.1 0 0 0-1.79 13.51 4.47 4.47 0 0 0 2.73 8.18h.21a6.36 6.36 0 0 0 .11 1.07h0a7.1 7.1 0 0 0 7 5.89h0c-2 8.51-5 32.87-7.43 55.17l-.66 6.65a842.28 842.28 0 0 1 26.64-.42c9 0 17.83.14 26.22.41l-.67-6.27-2.7-25.4zm-14.58-40a5.88 5.88 0 0 1-2.39-1.17c.7 2.78 1.21 5.61 1.93 8.44a45.15 45.15 0 0 1 1.22 7.43c.31 3.86-2.22 7.19-5.39 7.19h-7.47c-3.17 0-5.7-3.33-5.39-7.19a46.23 46.23 0 0 1 1.22-7.43c.66-2.61 1.17-5.23 1.81-7.8a8.31 8.31 0 0 1-3.84 1 44.4 44.4 0 0 1-6.91-.45 4.78 4.78 0 0 1-4-3.37c-.59-1.69-1-3.45-1.59-5.14a14.16 14.16 0 0 0-1.21-2.09 2.41 2.41 0 0 1-.42-.89v-3.86a38.54 38.54 0 0 1 12.17-1.54 27 27 0 0 1 8.8 1.61 10.09 10.09 0 0 0 7.18 0 30 30 0 0 1 13.6-1.44c2.45.22 4.87.76 7.35 1.16v4.08c0 .29-.13.74-.33.82-1 .45-1.11 1.36-1.35 2.25a84.99 84.99 0 0 1-1.41 4.71 5.44 5.44 0 0 1-4.38 3.79 20.06 20.06 0 0 1-9.2-.1zm-29.92 15.64a5.53 5.53 0 0 1-1.13.36 16.1 16.1 0 0 1-7.34-.08 4.61 4.61 0 0 1-1.92-.94l1.55 6.77a36.86 36.86 0 0 1 1 6c.24 3.1-1.78 5.77-4.33 5.77h-6c-2.55 0-4.58-2.67-4.33-5.77a36.86 36.86 0 0 1 1-6l1.45-6.26a6.48 6.48 0 0 1-3.08.79A34.29 34.29 0 0 1 86 68a3.85 3.85 0 0 1-3.22-2.71l-1.28-4.12a10.81 10.81 0 0 0-1-1.67 1.73 1.73 0 0 1-.33-.72v-3.09a30.28 30.28 0 0 1 9.75-1.23 21.25 21.25 0 0 1 7.06 1.29 8.11 8.11 0 0 0 5.76 0 19.87 19.87 0 0 1 2.74-.81 6.47 6.47 0 0 1-.79-7.68 9.11 9.11 0 0 1-2.18-11 5.59 5.59 0 0 0-3-.86 5.7 5.7 0 0 0-5.64 4.88 3.58 3.58 0 0 0-6.37 1.62c-1.35-4.48-1.4-8.41-1.77-13.64-.12-1.7-2-3.21-4-.71-4.75 6.08-4.54 15.53-3.2 17.63a5.86 5.86 0 0 0 2.3 2A3.58 3.58 0 0 0 78 53a5.69 5.69 0 0 0-1.4 10.82 3.59 3.59 0 0 0 2.19 6.56h.17a6 6 0 0 0 .09.86h0A5.69 5.69 0 0 0 84.66 76h0c-1.58 6.82-4 26.36-6 44.24l-.53 5.38c9-.74 18.89-1.31 29.48-1.68l.69-6.94 2.87-24.67 3.47-24.6z'/%3E%3Cpath d='M199.39 58.62a5.7 5.7 0 0 0-4.83-5.62 3.58 3.58 0 0 0-2.75-5.79 5.86 5.86 0 0 0 2.3-2c1.34-2.1 1.55-11.55-3.2-17.63-2-2.5-3.87-1-4 .71-.37 5.23-.41 9.16-1.77 13.64a3.59 3.59 0 0 0-6.36-1.64 5.69 5.69 0 0 0-8.78-3.92 9.1 9.1 0 0 1-2.23 10.9 6.44 6.44 0 0 1-.66 7.54 21.08 21.08 0 0 1 3.54 1 8.11 8.11 0 0 0 5.76 0 24.1 24.1 0 0 1 10.91-1.15c2 .17 3.91.6 5.9.93v3.27c0 .23-.11.59-.26.66-.82.36-.9 1.09-1.09 1.8a63 63 0 0 1-1.13 3.78 4.35 4.35 0 0 1-3.51 3 16.1 16.1 0 0 1-7.34-.08 4.67 4.67 0 0 1-1.92-.94c.56 2.23 1 4.5 1.55 6.77a36.86 36.86 0 0 1 1 6c.25 3.1-1.78 5.77-4.33 5.77h-6c-2.55 0-4.57-2.67-4.33-5.77a36.86 36.86 0 0 1 1-6c.53-2.09.94-4.19 1.45-6.26a6.48 6.48 0 0 1-3.08.79 34.29 34.29 0 0 1-5.54-.35 3.78 3.78 0 0 1-1.84-.74c1.52 9.16 3.53 25.4 6.18 50.05l.29 2.62q.19 1.9.42 3.93c10.62.37 20.57.94 29.58 1.68l-.55-5.07-2.17-20.41c-1.33-10.67-2.6-19.88-3.6-24.15a5.7 5.7 0 0 0 5.51-4.68h0a6.69 6.69 0 0 0 .09-.9h.17a3.59 3.59 0 0 0 2.23-6.54 5.69 5.69 0 0 0 3.39-5.2zm-36.87 65.19h.15q-.33-3.09-.67-6.27l-2.86-25.45 2.71 25.45.67 6.27z'/%3E%3Cpath d='M154.77 62c1.22 5.32 2.78 16.8 4.37 30.1-1.39-12.56-2.82-23.86-4.37-30.1zm-44.45 55.17l-.72 6.65h.06l.66-6.65z'/%3E%3C/g%3E%3C/svg%3E"); } - /* On wide screens (desktop), remove text content for icon-only display */ @media (min-width: 1401px) { - .header-discord-link:before, - .header-github-link:before, - .header-discourse-link:before { - content: ""; - padding-left: 0.7rem; - padding-right: 0.8rem; - background-position: center; - background-size: 80%; - } + .header-discord-link:before, + .header-github-link:before, + .header-discourse-link:before { + content: ""; + padding-left: 0.7rem; + padding-right: 0.8rem; + background-position: center; + background-size: 80%; + } } .header-console-link:before { - content: "Console"; - padding-left: 1.5rem !important; - padding-right: 0 !important; - background: no-repeat left/22% - url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20width%3D%2222%22%20height%3D%2222%22%20preserveAspectRatio%3D%22xMidYMid%20meet%22%20viewBox%3D%220%200%2032%2032%22%3E%3Cpath%20d%3D%22M4%2020v2h4.586L2%2028.586L3.414%2030L10%2023.414V28h2v-8H4z%22%20fill%3D%22white%22%2F%3E%3Cpath%20d%3D%22M24%2021h2v5h-2z%22%20fill%3D%22white%22%2F%3E%3Cpath%20d%3D%22M20%2016h2v10h-2z%22%20fill%3D%22white%22%2F%3E%3Cpath%20d%3D%22M16%2018h2v8h-2z%22%20fill%3D%22white%22%2F%3E%3Cpath%20d%3D%22M28%202H4a2.002%202.002%200%200%200-2%202v12h2v-3h24.001l.001%2015H16v2h12a2.003%202.003%200%200%200%202-2V4a2.002%202.002%200%200%200-2-2zm-16%209H4V4h8zm2%200V4h14v7z%22%20fill%3D%22white%22%2F%3E%3C%2Fsvg%3E"); + content: "Console"; + padding-left: 1.5rem !important; + padding-right: 0 !important; + background: + no-repeat left / 22% + url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20width%3D%2222%22%20height%3D%2222%22%20preserveAspectRatio%3D%22xMidYMid%20meet%22%20viewBox%3D%220%200%2032%2032%22%3E%3Cpath%20d%3D%22M4%2020v2h4.586L2%2028.586L3.414%2030L10%2023.414V28h2v-8H4z%22%20fill%3D%22white%22%2F%3E%3Cpath%20d%3D%22M24%2021h2v5h-2z%22%20fill%3D%22white%22%2F%3E%3Cpath%20d%3D%22M20%2016h2v10h-2z%22%20fill%3D%22white%22%2F%3E%3Cpath%20d%3D%22M16%2018h2v8h-2z%22%20fill%3D%22white%22%2F%3E%3Cpath%20d%3D%22M28%202H4a2.002%202.002%200%200%200-2%202v12h2v-3h24.001l.001%2015H16v2h12a2.003%202.003%200%200%200%202-2V4a2.002%202.002%200%200%200-2-2zm-16%209H4V4h8zm2%200V4h14v7z%22%20fill%3D%22white%22%2F%3E%3C%2Fsvg%3E"); } .navbar__items--right .navbar__link:hover { - opacity: 0.6; + @apply opacity-60; } .navbar { - white-space: nowrap; + @apply whitespace-nowrap; } .navbar__items--right .navbar__link:before { - padding-left: 0.7rem; - padding-right: 0.8rem; - height: 24px; + @apply px-3 h-6; } .navbar__items--right .navbar__link { - padding-left: 1rem; - padding-right: 0; + @apply pl-4 pr-0; } @media (max-width: 1400px) { - .navbar__items--right .navbar__link { - display: none; - } + .navbar__items--right .navbar__link { + display: none; + } } /* Announcement Bar */ -div[class^='announcementBar'] > div[class^='content'] { - font-size: 100%; +div[class^="announcementBar"] > div[class^="content"] { + font-size: 100%; } -div[class^='announcementBar'] { - height: 100%; - border-bottom: 0px; +div[class^="announcementBar"] { + height: 100%; + border-bottom: 0px; } @media screen and (max-width: 996px) { - :root { - --ifm-font-size-base: 18px; - } - article header h1 { - font-size: 1.5rem !important; - } - .hero .hero__title { - font-size: 2.5rem; - } + :root { + --ifm-font-size-base: 1rem; + } + article header h1 { + font-size: 1.5rem !important; + } + .hero .hero__title { + font-size: 2.5rem; + } } @media screen and (min-width: 997px) { - :root { - --ifm-font-size-base: 17px; - } - article header h1 { - font-size: 2rem !important; - } + :root { + --ifm-font-size-base: 1rem; + } + article header h1 { + font-size: 2rem !important; + } } /* Header Dropdown Menu */ + +.dropdown__menu { + @apply shadow-md border-gray-100 dark:shadow-none border border-solid dark:border-gray-300; +} + .dropdown__link { - font-size: inherit; + font-size: inherit; } .table-of-contents__link--active { - border-left: 4px solid var(--ifm-color-primary); - color: var(--ifm-font-color-base); - margin-left: -16px; - padding-left: 12px; + @apply text-foreground border-secondary border-solid border-0 border-l-4 -ml-4 px-3; } - .icon { - display: inline-block; - color: inherit; - text-align: center; - fill: currentColor; + color: inherit; + fill: currentColor; + @apply inline-block text-center; } .icon:not(.icon-c-s):not(.icon-custom-size) { - width: 1rem; - height: 1rem; - font-size: 1rem; + width: 1rem; + height: 1rem; + font-size: 1rem; } .icon:not(.icon-c-s):not(.icon-custom-size).icon-xxl { - width: 2rem; - height: 2rem; - font-size: 2rem; + width: 2rem; + height: 2rem; + font-size: 2rem; } .icon:not(.icon-c-s):not(.icon-custom-size).icon-3xl { - width: 3rem; - height: 3rem; - font-size: 3rem; + width: 3rem; + height: 3rem; + font-size: 3rem; } .icon:not(.icon-c-s):not(.icon-custom-size).icon-4xl { - width: 4rem; - height: 4rem; - font-size: 4rem; + width: 4rem; + height: 4rem; + font-size: 4rem; } .icon:not(.icon-c-s):not(.icon-custom-size).icon-5xl { - width: 5rem; - height: 5rem; - font-size: 5rem; + width: 5rem; + height: 5rem; + font-size: 5rem; } .icon:not(.icon-c-s):not(.icon-custom-size).icon-6xl { - width: 6rem; - height: 6rem; - font-size: 6rem; + width: 6rem; + height: 6rem; + font-size: 6rem; } .icon:not(.icon-c-s):not(.icon-custom-size).icon-7xl { - width: 7rem; - height: 7rem; - font-size: 7rem; + width: 7rem; + height: 7rem; + font-size: 7rem; } .icon:not(.icon-c-s):not(.icon-custom-size).icon-8xl { - width: 8rem; - height: 8rem; - font-size: 8rem; + width: 8rem; + height: 8rem; + font-size: 8rem; } .icon:not(.icon-c-s):not(.icon-custom-size).icon-9xl { - width: 9rem; - height: 9rem; - font-size: 9rem; + width: 9rem; + height: 9rem; + font-size: 9rem; } .icon:not(.icon-c-s):not(.icon-custom-size).icon-xl { - width: 1.5rem; - height: 1.5rem; - font-size: 1.5rem; + width: 1.5rem; + height: 1.5rem; + font-size: 1.5rem; } .icon:not(.icon-c-s):not(.icon-custom-size).icon-lg { - width: 1.25rem; - height: 1.25rem; - font-size: 1.25rem; + width: 1.25rem; + height: 1.25rem; + font-size: 1.25rem; } .icon:not(.icon-c-s):not(.icon-custom-size).icon-sm { - width: 0.875rem; - height: 0.875rem; - font-size: 0.875rem; + width: 0.875rem; + height: 0.875rem; + font-size: 0.875rem; } .visually-hidden, .visually-hidden-focusable:not(:focus):not(:focus-within) { - position: absolute!important; - width: 1px!important; - height: 1px!important; - padding: 0!important; - margin: -1px!important; - overflow: hidden!important; - clip: rect(0,0,0,0)!important; - white-space: nowrap!important; - border: 0!important; + position: absolute !important; + width: 1px !important; + height: 1px !important; + padding: 0 !important; + margin: -1px !important; + overflow: hidden !important; + clip: rect(0, 0, 0, 0) !important; + white-space: nowrap !important; + border: 0 !important; } /* Quick guide specific CSS /u/getting_started/... */ .sideBarItemRecommended a::after { - content: "Rec."; - display: inline-block; - margin-left: 0.5em; - padding: 0.1em 0.5em; - background-color: #007bff; - color: white; - border-radius: 999px; - font-size: 0.6em; - vertical-align: middle; - transform: rotate(0deg) !important; /* force reset to counter act UL accordion transform */ + content: "Rec."; + display: inline-block; + margin-left: 0.5em; + padding: 0.1em 0.5em; + background-color: #007bff; + color: white; + border-radius: 999px; + font-size: 0.6em; + vertical-align: middle; + transform: rotate(0deg) !important; /* force reset to counter act UL accordion transform */ } .sideBarItemOptional a::after { - content: "Opt."; - display: inline-block; - margin-left: 0.5em; - padding: 0.1em 0.5em; - background-color: #ffc107; - color: black; - border-radius: 999px; - font-size: 0.6em; - vertical-align: middle; - transform: rotate(0deg) !important; /* force reset to counter act UL accordion transform */ + content: "Opt."; + display: inline-block; + margin-left: 0.5em; + padding: 0.1em 0.5em; + background-color: #ffc107; + color: black; + border-radius: 999px; + font-size: 0.6em; + vertical-align: middle; + transform: rotate(0deg) !important; /* force reset to counter act UL accordion transform */ } diff --git a/crowdsec-docs/src/pages/index.module.css b/crowdsec-docs/src/pages/index.module.css deleted file mode 100644 index be2ea52ef..000000000 --- a/crowdsec-docs/src/pages/index.module.css +++ /dev/null @@ -1,26 +0,0 @@ -/* stylelint-disable docusaurus/copyright-header */ - -/** - * CSS files with the .module.css suffix will be treated as CSS modules - * and scoped locally. - */ - -.heroBanner { - padding: 4rem 0; - text-align: center; - position: relative; - overflow: hidden; -} - -@media screen and (max-width: 966px) { - .heroBanner { - padding: 2rem; - } -} - -.buttons { - display: flex; - align-items: center; - justify-content: center; - margin-top: 2rem; -} diff --git a/crowdsec-docs/src/pages/index.tsx b/crowdsec-docs/src/pages/index.tsx index fb2505383..f6337999b 100644 --- a/crowdsec-docs/src/pages/index.tsx +++ b/crowdsec-docs/src/pages/index.tsx @@ -1,45 +1,35 @@ -import Link from "@docusaurus/Link" -import Layout from "@theme/Layout" -import clsx from "clsx" -import type React from "react" -import GetToKnowUs from "../components/get-to-know-us" -import QuickStart from "../components/quick-start" -import styles from "./index.module.css" +import Link from "@docusaurus/Link"; +import Layout from "@theme/Layout"; +import React from "react"; +import GetToKnowUs from "../components/home-page/get-to-know-us"; +import QuickStart from "../components/home-page/quick-start"; +import { Button } from "../ui/button"; const HomePageHeader = (): React.JSX.Element => { return ( -
-
-
+
+ {/*
*/} +
-
-
-

Welcome to the CrowdSec Documentation

-

+

+
+

Welcome to the CrowdSec Documentation

+

CrowdSec provides open source solution for detecting and blocking malicious IPs, safeguarding both infrastructure and application security.

- CrowdSec Logo + CrowdSec Logo
-
- - Get started +
+ + - - Explore the Console + + - - Online Sandbox + +
@@ -49,15 +39,15 @@ const HomePageHeader = (): React.JSX.Element => {
- ) -} + ); +}; const HomePage = () => { return ( - ) -} + ); +}; -export default HomePage +export default HomePage; diff --git a/crowdsec-docs/src/theme/Root.tsx b/crowdsec-docs/src/theme/Root.tsx index 085d75f38..79d66bbf3 100644 --- a/crowdsec-docs/src/theme/Root.tsx +++ b/crowdsec-docs/src/theme/Root.tsx @@ -1,13 +1,13 @@ -import { useStorageSlot } from "@docusaurus/theme-common" -import type React from "react" -import CookieConsent from "../../plugins/gtag/theme/cookieconsent" +import { useStorageSlot } from "@docusaurus/theme-common"; +import React from "react"; +import CookieConsent from "../../plugins/gtag/theme/cookieconsent"; export default function Root({ children }): React.JSX.Element { - const [value, _] = useStorageSlot("docusaurus.cookieConsent") + const [value, _] = useStorageSlot("docusaurus.cookieConsent"); return ( <> {children} {value === null && } - ) + ); } diff --git a/crowdsec-docs/src/theme/TOC/index.tsx b/crowdsec-docs/src/theme/TOC/index.tsx index 6995a2ae0..88ed93ad3 100644 --- a/crowdsec-docs/src/theme/TOC/index.tsx +++ b/crowdsec-docs/src/theme/TOC/index.tsx @@ -1,23 +1,24 @@ -// Import necessary components and modules - -import ConsoleAd from "@site/src/components/console-ad" -import TOCItems from "@theme/TOCItems" -import clsx from "clsx" -import type React from "react" -import styles from "./styles.module.css" +import ConsoleAd from "@site/src/components/console-ad"; +import TOCItems from "@theme/TOCItems"; +import clsx from "clsx"; +import React from "react"; // Define custom classNames -const LINK_CLASS_NAME = "table-of-contents__link toc-highlight" -const LINK_ACTIVE_CLASS_NAME = "table-of-contents__link--active" +const LINK_CLASS_NAME = "table-of-contents__link toc-highlight"; +const LINK_ACTIVE_CLASS_NAME = "table-of-contents__link--active"; -// Modified TOC component -const TOC = ({ className, ...props }): React.JSX.Element => { - return ( -
- - -
- ) -} +// Modified Table of Contents component +const TableOfContent = ({ className, ...props }): React.JSX.Element => ( + +); -export default TOC +export default TableOfContent; diff --git a/crowdsec-docs/src/theme/TOC/styles.module.css b/crowdsec-docs/src/theme/TOC/styles.module.css deleted file mode 100644 index 4b5d9f462..000000000 --- a/crowdsec-docs/src/theme/TOC/styles.module.css +++ /dev/null @@ -1,16 +0,0 @@ -.tableOfContents { - max-height: calc(100vh - (var(--ifm-navbar-height) + 2rem)); - overflow-y: auto; - position: sticky; - top: calc(var(--ifm-navbar-height) + 1rem); -} - -@media (max-width: 996px) { - .tableOfContents { - display: none; - } - - .docItemContainer { - padding: 0 0.3rem; - } -} diff --git a/crowdsec-docs/src/theme/Tabs/index.js b/crowdsec-docs/src/theme/Tabs/index.js deleted file mode 100644 index 34ab15ebb..000000000 --- a/crowdsec-docs/src/theme/Tabs/index.js +++ /dev/null @@ -1,124 +0,0 @@ -import React, {cloneElement} from 'react'; -import clsx from 'clsx'; -import { - useScrollPositionBlocker, - useTabs, - sanitizeTabsChildren, -} from '@docusaurus/theme-common/internal'; -import useIsBrowser from '@docusaurus/useIsBrowser'; -import styles from './styles.module.css'; -import CIcon from '@coreui/icons-react'; -function TabList({className, block, selectedValue, selectValue, tabValues}) { - const tabRefs = []; - const {blockElementScrollPositionUntilNextRender} = - useScrollPositionBlocker(); - const handleTabChange = (event) => { - const newTab = event.currentTarget; - const newTabIndex = tabRefs.indexOf(newTab); - const newTabValue = tabValues[newTabIndex].value; - if (newTabValue !== selectedValue) { - blockElementScrollPositionUntilNextRender(newTab); - selectValue(newTabValue); - } - }; - const handleKeydown = (event) => { - let focusElement = null; - switch (event.key) { - case 'Enter': { - handleTabChange(event); - break; - } - case 'ArrowRight': { - const nextTab = tabRefs.indexOf(event.currentTarget) + 1; - focusElement = tabRefs[nextTab] ?? tabRefs[0]; - break; - } - case 'ArrowLeft': { - const prevTab = tabRefs.indexOf(event.currentTarget) - 1; - focusElement = tabRefs[prevTab] ?? tabRefs[tabRefs.length - 1]; - break; - } - default: - break; - } - focusElement?.focus(); - }; - return ( -
    - {tabValues.map(({value, label, attributes, icon}) => ( -
  • tabRefs.push(tabControl)} - onKeyDown={handleKeydown} - onClick={handleTabChange} - {...attributes} - className={clsx('tabs__item', styles.tabItem, attributes?.className, { - 'tabs__item--active': selectedValue === value, - })}> - - {!!icon && } {label ?? value} - -
  • - ))} -
- ); -} -function TabContent({lazy, children, selectedValue}) { - const childTabs = (Array.isArray(children) ? children : [children]).filter( - Boolean, - ); - if (lazy) { - const selectedTabItem = childTabs.find( - (tabItem) => tabItem.props.value === selectedValue, - ); - if (!selectedTabItem) { - // fail-safe or fail-fast? not sure what's best here - return null; - } - return cloneElement(selectedTabItem, {className: 'margin-top--md'}); - } - return ( -
- {childTabs.map((tabItem, i) => - cloneElement(tabItem, { - key: i, - hidden: tabItem.props.value !== selectedValue, - }), - )} -
- ); -} -function TabsComponent(props) { - const tabs = useTabs(props); - return ( -
- - -
- ); -} -export default function Tabs(props) { - const isBrowser = useIsBrowser(); - return ( - - {sanitizeTabsChildren(props.children)} - - ); -} diff --git a/crowdsec-docs/src/theme/Tabs/styles.module.css b/crowdsec-docs/src/theme/Tabs/styles.module.css deleted file mode 100644 index 0c79270e7..000000000 --- a/crowdsec-docs/src/theme/Tabs/styles.module.css +++ /dev/null @@ -1,7 +0,0 @@ -.tabList { - margin-bottom: var(--ifm-leading); -} - -.tabItem { - margin-top: 0 !important; -} diff --git a/crowdsec-docs/src/theme/doc-item/layout/index.tsx b/crowdsec-docs/src/theme/doc-item/layout/index.tsx index f62c97d89..2be1c9001 100644 --- a/crowdsec-docs/src/theme/doc-item/layout/index.tsx +++ b/crowdsec-docs/src/theme/doc-item/layout/index.tsx @@ -1,57 +1,56 @@ // Import necessary components and modules -import { useDoc } from "@docusaurus/plugin-content-docs/client" -import { useWindowSize } from "@docusaurus/theme-common" -import DocBreadcrumbs from "@theme/DocBreadcrumbs" -import DocItemContent from "@theme/DocItem/Content" -import DocItemPaginator from "@theme/DocItem/Paginator" -import DocItemTOCDesktop from "@theme/DocItem/TOC/Desktop" -import DocItemTOCMobile from "@theme/DocItem/TOC/Mobile" -import DocVersionBadge from "@theme/DocVersionBadge" -import DocVersionBanner from "@theme/DocVersionBanner" -import clsx from "clsx" -import type { PropsWithChildren } from "react" -import React from "react" -import styles from "./styles.module.css" +import { useDoc } from "@docusaurus/plugin-content-docs/client"; +import { useWindowSize } from "@docusaurus/theme-common"; +import DocBreadcrumbs from "@theme/DocBreadcrumbs"; +import DocItemContent from "@theme/DocItem/Content"; +import DocItemPaginator from "@theme/DocItem/Paginator"; +import DocItemTOCDesktop from "@theme/DocItem/TOC/Desktop"; +import DocItemTOCMobile from "@theme/DocItem/TOC/Mobile"; +import DocVersionBadge from "@theme/DocVersionBadge"; +import DocVersionBanner from "@theme/DocVersionBanner"; +import clsx from "clsx"; +import type { PropsWithChildren } from "react"; +import React from "react"; // Function to decide whether to render the TOC on mobile or desktop -const useDocTOC = () => { - const { frontMatter, toc } = useDoc() - const windowSize = useWindowSize() - const hidden = frontMatter.hide_table_of_contents - const canRender = !hidden && toc.length > 0 - const mobile = canRender ? : undefined - const desktop = windowSize === "desktop" || windowSize === "ssr" ? : undefined +const useDocTableOfContent = () => { + const { frontMatter, toc } = useDoc(); + const windowSize = useWindowSize(); + const hidden = frontMatter.hide_table_of_contents; + const canRender = !hidden && toc.length > 0; + const mobile = canRender ? : undefined; + const desktop = windowSize === "desktop" || windowSize === "ssr" ? : undefined; return { hidden, mobile, desktop, - } -} + }; +}; // Modified DocItemLayout component const DocItemLayout = ({ children }: PropsWithChildren): React.JSX.Element => { - const docTOC = useDocTOC() + const docTableOfContent = useDocTableOfContent(); return (
-
+
-
+
- {docTOC.mobile} + {docTableOfContent.mobile} {children} {/* */}
- {docTOC.desktop &&
{docTOC.desktop}
} + {docTableOfContent.desktop &&
{docTableOfContent.desktop}
}
- ) -} + ); +}; -export default DocItemLayout +export default DocItemLayout; diff --git a/crowdsec-docs/src/theme/doc-item/layout/styles.module.css b/crowdsec-docs/src/theme/doc-item/layout/styles.module.css deleted file mode 100644 index d5aaec132..000000000 --- a/crowdsec-docs/src/theme/doc-item/layout/styles.module.css +++ /dev/null @@ -1,10 +0,0 @@ -.docItemContainer header + *, -.docItemContainer article > *:first-child { - margin-top: 0; -} - -@media (min-width: 997px) { - .docItemCol { - max-width: 75% !important; - } -} diff --git a/crowdsec-docs/src/theme/tabs/index.tsx b/crowdsec-docs/src/theme/tabs/index.tsx new file mode 100644 index 000000000..0a0107154 --- /dev/null +++ b/crowdsec-docs/src/theme/tabs/index.tsx @@ -0,0 +1,122 @@ +import CIcon from "@coreui/icons-react"; +import { sanitizeTabsChildren, useScrollPositionBlocker, useTabs } from "@docusaurus/theme-common/internal"; +import useIsBrowser from "@docusaurus/useIsBrowser"; +import clsx from "clsx"; +import React, { cloneElement } from "react"; + +const TabList = ({ className, block, selectedValue, selectValue, tabValues }): React.JSX.Element => { + const tabRefs = []; + const { blockElementScrollPositionUntilNextRender } = useScrollPositionBlocker(); + const handleTabChange = (event) => { + const newTab = event.currentTarget; + const newTabIndex = tabRefs.indexOf(newTab); + const newTabValue = tabValues[newTabIndex].value; + if (newTabValue !== selectedValue) { + blockElementScrollPositionUntilNextRender(newTab); + selectValue(newTabValue); + } + }; + const handleKeydown = (event) => { + let focusElement = null; + switch (event.key) { + case "Enter": { + handleTabChange(event); + break; + } + case "ArrowRight": { + const nextTab = tabRefs.indexOf(event.currentTarget) + 1; + focusElement = tabRefs[nextTab] ?? tabRefs[0]; + break; + } + case "ArrowLeft": { + const prevTab = tabRefs.indexOf(event.currentTarget) - 1; + focusElement = tabRefs[prevTab] ?? tabRefs[tabRefs.length - 1]; + break; + } + default: + break; + } + focusElement?.focus(); + }; + return ( +
+ {tabValues.map(({ value, label, attributes, icon }) => ( +
tabRefs.push(tabControl)} + onKeyDown={handleKeydown} + onClick={handleTabChange} + {...attributes} + className={clsx("tabs__item !mt-0", attributes?.className, { + "tabs__item--active": selectedValue === value, + })} + > + + {!!icon && } {label ?? value} + +
+ ))} +
+ ); +}; +function TabContent({ lazy, children, selectedValue }) { + const childTabs = (Array.isArray(children) ? children : [children]).filter(Boolean); + if (lazy) { + const selectedTabItem = childTabs.find((tabItem) => tabItem.props.value === selectedValue); + if (!selectedTabItem) { + // fail-safe or fail-fast? not sure what's best here + return null; + } + return cloneElement(selectedTabItem, { className: "margin-top--md" }); + } + return ( +
+ {childTabs.map((tabItem) => + cloneElement(tabItem, { + key: tabItem.props.value, + hidden: tabItem.props.value !== selectedValue, + }) + )} +
+ ); +} +function TabsComponent(props) { + const tabs = useTabs(props); + return ( +
+ + +
+ ); +} +export default function Tabs(props) { + const isBrowser = useIsBrowser(); + return ( + + {sanitizeTabsChildren(props.children)} + + ); +} diff --git a/crowdsec-docs/src/ui/button.tsx b/crowdsec-docs/src/ui/button.tsx new file mode 100644 index 000000000..2f085033e --- /dev/null +++ b/crowdsec-docs/src/ui/button.tsx @@ -0,0 +1,50 @@ +import { Slot } from "@radix-ui/react-slot"; +import { cn } from "@site/src/utils/index"; +import { cva, type VariantProps } from "class-variance-authority"; +import * as React from "react"; + +const buttonVariants = cva( + "border-0 inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-semibold transition-colors disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0 cursor-pointer", + { + variants: { + variant: { + default: "bg-gray-900 text-gray-50 hover:bg-gray-900/90 dark:bg-gray-50 dark:text-gray-900 dark:hover:bg-gray-50/90", + destructive: "bg-red-500 text-gray-50 hover:bg-red-500/90 dark:bg-red-900 dark:text-gray-50 dark:hover:bg-red-900/90", + outline: + "border border-gray-200 bg-white hover:bg-gray-100 hover:text-gray-900 dark:border-gray-800 dark:bg-transparent dark:hover:bg-gray-800 dark:hover:text-gray-50", + secondary: "bg-gray-100 text-gray-900 hover:bg-gray-100/80 dark:bg-gray-800 dark:text-gray-50 dark:hover:bg-gray-800/80", + ghost: "hover:bg-gray-100 hover:text-gray-900 dark:hover:bg-gray-800 dark:hover:text-gray-50", + link: "text-foreground dark:text-foreground bg-transparent hover:bg-gray-200 dark:hover:bg-gray-300 active:bg-gray-100 dark:active:bg-gray-400", + }, + size: { + default: "h-10 px-4 py-2", + sm: "h-9 rounded-md px-3", + lg: "h-11 rounded-md px-8", + icon: "h-10 w-10", + }, + color: { + default: "", + primary: + "bg-primary text-primary-foreground hover:bg-primary/90 dark:hover:bg-primary/90 dark:bg-primary dark:text-primary-foreground", + secondary: "bg-secondary text-secondary-foreground hover:bg-secondary/90 dark:hover:bg-secondary", + }, + }, + defaultVariants: { + variant: "default", + size: "default", + color: "default", + }, + } +); + +export interface ButtonProps extends Omit, "color">, VariantProps { + asChild?: boolean; +} + +const Button = React.forwardRef(({ className, variant, size, asChild = false, color, ...props }, ref) => { + const Comp = asChild ? Slot : "button"; + return ; +}); +Button.displayName = "Button"; + +export { Button, buttonVariants }; diff --git a/crowdsec-docs/src/ui/card.tsx b/crowdsec-docs/src/ui/card.tsx new file mode 100644 index 000000000..49f2020ab --- /dev/null +++ b/crowdsec-docs/src/ui/card.tsx @@ -0,0 +1,35 @@ +import { cn } from "@site/src/utils"; + +import * as React from "react"; + +const Card = React.forwardRef>(({ className, ...props }, ref) => ( +
+)); +Card.displayName = "Card"; + +const CardHeader = React.forwardRef>(({ className, ...props }, ref) => ( +
+)); +CardHeader.displayName = "CardHeader"; + +const CardTitle = React.forwardRef>(({ className, ...props }, ref) => ( +
+)); +CardTitle.displayName = "CardTitle"; + +const CardDescription = React.forwardRef>(({ className, ...props }, ref) => ( +
+)); +CardDescription.displayName = "CardDescription"; + +const CardContent = React.forwardRef>(({ className, ...props }, ref) => ( +
+)); +CardContent.displayName = "CardContent"; + +const CardFooter = React.forwardRef>(({ className, ...props }, ref) => ( +
+)); +CardFooter.displayName = "CardFooter"; + +export { Card, CardHeader, CardFooter, CardTitle, CardDescription, CardContent }; diff --git a/crowdsec-docs/src/utils/index.ts b/crowdsec-docs/src/utils/index.ts index 5e1abdf42..ac680b303 100644 --- a/crowdsec-docs/src/utils/index.ts +++ b/crowdsec-docs/src/utils/index.ts @@ -1,6 +1,6 @@ -import { type ClassValue, clsx } from "clsx" -import { twMerge } from "tailwind-merge" +import { type ClassValue, clsx } from "clsx"; +import { twMerge } from "tailwind-merge"; export function cn(...inputs: ClassValue[]) { - return twMerge(clsx(inputs)) + return twMerge(clsx(inputs)); } diff --git a/crowdsec-docs/tailwind.config.js b/crowdsec-docs/tailwind.config.js index 3b938379a..c9e4ea610 100644 --- a/crowdsec-docs/tailwind.config.js +++ b/crowdsec-docs/tailwind.config.js @@ -1,72 +1,56 @@ /** @type {import('tailwindcss').Config} */ module.exports = { - corePlugins: { - preflight: false, - }, - darkMode: ["class", '[data-theme="dark"]'], - content: [ - "./src/**/*.{js,jsx,ts,tsx,mdx}", - "./unversioned/**/*.{js,jsx,ts,tsx,mdx}", - "./versioned_docs/**/*.{js,jsx,ts,tsx,mdx}", - ], - theme: { - extend: { - colors: { - primary: `rgb(var(--color-primary) / )`, - "primary-50": `rgb(var(--color-primary-50) / )`, - "primary-100": `rgb(var(--color-primary-100) / )`, - "primary-200": `rgb(var(--color-primary-200) / )`, - "primary-300": `rgb(var(--color-primary-300) / )`, - "primary-400": `rgb(var(--color-primary-400) / )`, - "primary-500": `rgb(var(--color-primary-500) / )`, - "primary-600": `rgb(var(--color-primary-600) / )`, - "primary-700": `rgb(var(--color-primary-700) / )`, - "primary-800": `rgb(var(--color-primary-800) / )`, - "primary-900": `rgb(var(--color-primary-900) / )`, - secondary: `rgb(var(--color-secondary) / )`, - "secondary-50": `rgb(var(--color-secondary-50) / )`, - "secondary-100": `rgb(var(--color-secondary-100) / )`, - "secondary-200": `rgb(var(--color-secondary-200) / )`, - "secondary-300": `rgb(var(--color-secondary-300) / )`, - "secondary-400": `rgb(var(--color-secondary-400) / )`, - "secondary-500": `rgb(var(--color-secondary-500) / )`, - "secondary-600": `rgb(var(--color-secondary-600) / )`, - "secondary-700": `rgb(var(--color-secondary-700) / )`, - "secondary-800": `rgb(var(--color-secondary-800) / )`, - "secondary-900": `rgb(var(--color-secondary-900) / )`, - gray: { - 50: `rgb(var(--color-gray-50) / )`, - 100: `rgb(var(--color-gray-100) / )`, - 200: `rgb(var(--color-gray-200) / )`, - 300: `rgb(var(--color-gray-300) / )`, - 400: `rgb(var(--color-gray-400) / )`, - 500: `rgb(var(--color-gray-500) / )`, - 600: `rgb(var(--color-gray-600) / )`, - 700: `rgb(var(--color-gray-700) / )`, - 800: `rgb(var(--color-gray-800) / )`, - 900: `rgb(var(--color-gray-900) / )`, - 950: `rgb(var(--color-gray-950) / )`, - }, - danger: `rgb(var(--color-red) / )`, - success: `rgb(var(--color-green) / )`, - premium: `rgb(var(--color-premium) / )`, - platinum: `rgb(var(--color-platinum) / )`, - card: `rgb(var(--color-background-card) / )`, - // Zeplin primary and secondary - "alpa-primary": `rgb(var(--color-alpa-primary) / )`, - "alpa-secondary": `rgb(var(--color-alpa-secondary) / )`, - "alpa-dark": `rgb(var(--color-dark-color) / )`, - "alpa-light-primary": `rgb(var(--color-alpa-light-primary) / )`, - "alpa-light-secondary": `rgb(var(--color-alpa-light-secondary) / )`, - "alpa-dark-darker": `rgb(var(--color-alpa-darker) / )`, - "alpa-dark-primary": `rgb(var(--color-alpa-dark-primary) / )`, - "alpa-dark-secondary": `rgb(var(--color-alpa-dark-secondary) / )`, - }, - backgroundImage: () => ({ - landing: "url('/img/landing-page-bg.webp')", - }), + corePlugins: { + preflight: false, + }, + darkMode: ["class", '[data-theme="dark"]'], + content: [ + "./src/**/*.{js,jsx,ts,tsx,mdx}", + "./unversioned/**/*.{js,jsx,ts,tsx,mdx}", + "./versioned_docs/**/*.{js,jsx,ts,tsx,mdx}", + ], + theme: { + extend: { + colors: { + primary: `rgb(var(--primary) / )`, + "primary-foreground": `rgb(var(--primary-foreground) / )`, + secondary: `rgb(var(--secondary) / )`, + "secondary-foreground": `rgb(var(--secondary-foreground) / )`, + info: `rgb(var(--info) / )`, + "info-foreground": `rgb(var(--info-foreground) / )`, + gray: { + 50: `rgb(var(--color-gray-50) / )`, + 100: `rgb(var(--color-gray-100) / )`, + 200: `rgb(var(--color-gray-200) / )`, + 300: `rgb(var(--color-gray-300) / )`, + 400: `rgb(var(--color-gray-400) / )`, + 500: `rgb(var(--color-gray-500) / )`, + 600: `rgb(var(--color-gray-600) / )`, + 700: `rgb(var(--color-gray-700) / )`, + 800: `rgb(var(--color-gray-800) / )`, + 900: `rgb(var(--color-gray-900) / )`, + 950: `rgb(var(--color-gray-950) / )`, }, + danger: `rgb(var(--color-red) / )`, + border: `rgb(var(--border) / )`, + ring: `rgb(var(--color-primary) / )`, + background: `rgb(var(--background) / )`, + foreground: `rgb(var(--foreground) / )`, + success: `rgb(var(--color-green) / )`, + premium: `rgb(var(--color-premium) / )`, + platinum: `rgb(var(--color-platinum) / )`, + card: `rgb(var(--card) / )`, + "card-foreground": `rgb(var(--card-foreground) / )`, + }, + backgroundImage: () => ({ + landing: "url('/img/landing-page-bg.webp')", + }), + scale: { + 99: "0.99", + 101: "1.01", + }, }, - plugins: [require("tailwindcss-animate")], - prefix: "tw-", // This is the prefix for the tailwind classes to not clash with docusarus classes -} + }, + plugins: [require("tailwindcss-animate")], + prefix: "", // This is the prefix for the tailwind classes to not clash with docusarus classes +}; diff --git a/crowdsec-docs/unversioned/blocklists/security_engine.mdx b/crowdsec-docs/unversioned/blocklists/security_engine.mdx index f28463199..8cf5273cd 100644 --- a/crowdsec-docs/unversioned/blocklists/security_engine.mdx +++ b/crowdsec-docs/unversioned/blocklists/security_engine.mdx @@ -3,7 +3,7 @@ id: security_engine title: Security Engine --- -import QuickStart from '@site/src/components/quick-start' +import QuickStart from '@site/src/components/home-page/quick-start' This page is used to reference other pages into a single guide. It is not meant to be used as a standalone page. diff --git a/crowdsec-docs/unversioned/console/cti/ip_report.mdx b/crowdsec-docs/unversioned/console/cti/ip_report.mdx index 03141b191..70c076f8d 100644 --- a/crowdsec-docs/unversioned/console/cti/ip_report.mdx +++ b/crowdsec-docs/unversioned/console/cti/ip_report.mdx @@ -15,12 +15,12 @@ The title section prominently displays the **IP address** and its **status**, in ![CTI Report Title](/img/console/cti/report/title.png) -- **Malicious:** The IP has been verified as actively malicious. Immediate remediation is recommended. -- **Suspicious:** This IP has been flagged in many reports and is a potential threat. Further investigation and use of CAPTCHA is recommended. -- **Known:** This IP has been flagged in some reports but we don't have sufficient information yet to conclusively determine the threat level. -- **Benign:** This IP has been flagged as benign and poses no threat. -- **Safe:** This IP belongs to a legitimate service. Activity is not malicious. -- **Unknown:** This IP is either unknown or has not been reported in the past three months. +- **Malicious:** The IP has been verified as actively malicious. Immediate remediation is recommended. +- **Suspicious:** This IP has been flagged in many reports and is a potential threat. Further investigation and use of CAPTCHA is recommended. +- **Known:** This IP has been flagged in some reports but we don't have sufficient information yet to conclusively determine the threat level. +- **Benign:** This IP has been flagged as benign and poses no threat. +- **Safe:** This IP belongs to a legitimate service. Activity is not malicious. +- **Unknown:** This IP is either unknown or has not been reported in the past three months. ### Key Information From 0f3f4a795bd6ffe3ced63228f701d340383e07ce Mon Sep 17 00:00:00 2001 From: Roussange Alexandre Date: Tue, 8 Jul 2025 10:22:01 +0200 Subject: [PATCH 4/9] refactor :recycle: rebase on master --- crowdsec-docs/docs/getting_started/intro.mdx | 4 + crowdsec-docs/package-lock.json | 2553 ++++++++++-------- crowdsec-docs/package.json | 11 +- crowdsec-docs/sidebarsUnversioned.ts | 1301 +++++---- crowdsec-docs/src/ui/hybridtooltip.tsx | 65 +- crowdsec-docs/src/ui/popover.tsx | 47 +- crowdsec-docs/src/ui/tooltip.tsx | 38 +- 7 files changed, 2108 insertions(+), 1911 deletions(-) diff --git a/crowdsec-docs/docs/getting_started/intro.mdx b/crowdsec-docs/docs/getting_started/intro.mdx index 1fac6df0e..f8af6f022 100644 --- a/crowdsec-docs/docs/getting_started/intro.mdx +++ b/crowdsec-docs/docs/getting_started/intro.mdx @@ -6,6 +6,10 @@ sidebar_position: 1 # Security Engine +:::info +You may see Security Engine referred to as "agent" in the documentation/videos and "machines" within cscli commands. +::: + The Security Engine is a core component of CrowdSec. It is the component that will analyze logs and will expose an API endpoint for the remediation components to get the decisions made by the engine. ## Supported Platforms diff --git a/crowdsec-docs/package-lock.json b/crowdsec-docs/package-lock.json index 265eb99ae..f747c34ec 100644 --- a/crowdsec-docs/package-lock.json +++ b/crowdsec-docs/package-lock.json @@ -22,9 +22,10 @@ "@mui/icons-material": "^5.11.16", "@mui/material": "^5.13.4", "@mui/x-date-pickers": "^6.18.0", + "@radix-ui/react-popover": "^1.0.7", "@radix-ui/react-slot": "^1.2.3", - "@radix-ui/react-tooltip": "^1.1.2", - "animate-css": "^1.3.4", + "@radix-ui/react-tooltip": "^1.2.7", + "animate.css": "^4.1.1", "class-variance-authority": "^0.7.1", "clsx": "^2.1.1", "docusaurus-plugin-zooming": "^1.0.0", @@ -41,7 +42,7 @@ "@docusaurus/module-type-aliases": "^3.8.1", "@docusaurus/tsconfig": "^3.8.1", "@docusaurus/types": "^3.8.1", - "autoprefixer": "^10.4.20", + "autoprefixer": "^10.4.21", "postcss": "^8.4.47", "tailwindcss": "^3.4.14", "typescript": "^5.8.3" @@ -93,99 +94,99 @@ } }, "node_modules/@algolia/client-abtesting": { - "version": "5.29.0", - "resolved": "https://registry.npmjs.org/@algolia/client-abtesting/-/client-abtesting-5.29.0.tgz", - "integrity": "sha512-AM/6LYMSTnZvAT5IarLEKjYWOdV+Fb+LVs8JRq88jn8HH6bpVUtjWdOZXqX1hJRXuCAY8SdQfb7F8uEiMNXdYQ==", + "version": "5.31.0", + "resolved": "https://registry.npmjs.org/@algolia/client-abtesting/-/client-abtesting-5.31.0.tgz", + "integrity": "sha512-J+wZq5uotbisEsbKmXv79dsENI/AW6IZWIvfTqebE6QcH/S2yGDeNh6b4qa4koJ1eQx7+wKkLMfZ+nOZpBWclA==", "license": "MIT", "dependencies": { - "@algolia/client-common": "5.29.0", - "@algolia/requester-browser-xhr": "5.29.0", - "@algolia/requester-fetch": "5.29.0", - "@algolia/requester-node-http": "5.29.0" + "@algolia/client-common": "5.31.0", + "@algolia/requester-browser-xhr": "5.31.0", + "@algolia/requester-fetch": "5.31.0", + "@algolia/requester-node-http": "5.31.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/client-analytics": { - "version": "5.29.0", - "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-5.29.0.tgz", - "integrity": "sha512-La34HJh90l0waw3wl5zETO8TuukeUyjcXhmjYZL3CAPLggmKv74mobiGRIb+mmBENybiFDXf/BeKFLhuDYWMMQ==", + "version": "5.31.0", + "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-5.31.0.tgz", + "integrity": "sha512-zxz9ooi6HsMG7gS7xCG9NkUlWkpwMT/oYr8+cojchB98pEmn3OqHA7KaY1w8GKqKXNM4MiQD15N2/aZhDa9b9g==", "license": "MIT", "dependencies": { - "@algolia/client-common": "5.29.0", - "@algolia/requester-browser-xhr": "5.29.0", - "@algolia/requester-fetch": "5.29.0", - "@algolia/requester-node-http": "5.29.0" + "@algolia/client-common": "5.31.0", + "@algolia/requester-browser-xhr": "5.31.0", + "@algolia/requester-fetch": "5.31.0", + "@algolia/requester-node-http": "5.31.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/client-common": { - "version": "5.29.0", - "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-5.29.0.tgz", - "integrity": "sha512-T0lzJH/JiCxQYtCcnWy7Jf1w/qjGDXTi2npyF9B9UsTvXB97GRC6icyfXxe21mhYvhQcaB1EQ/J2575FXxi2rA==", + "version": "5.31.0", + "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-5.31.0.tgz", + "integrity": "sha512-lO6oZLEPiCgtUcUHIFyfrRvcS8iB3Je1LqW3c04anjrCO7dqhkccXHC/5XuH0fIW4l7V5AtbPS2tpJGtRp1NJw==", "license": "MIT", "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/client-insights": { - "version": "5.29.0", - "resolved": "https://registry.npmjs.org/@algolia/client-insights/-/client-insights-5.29.0.tgz", - "integrity": "sha512-A39F1zmHY9aev0z4Rt3fTLcGN5AG1VsVUkVWy6yQG5BRDScktH+U5m3zXwThwniBTDV1HrPgiGHZeWb67GkR2Q==", + "version": "5.31.0", + "resolved": "https://registry.npmjs.org/@algolia/client-insights/-/client-insights-5.31.0.tgz", + "integrity": "sha512-gwWTW4CMM6pov3aJv2a+Ex4v7fWG9wtey43qWBq5rABk3p3uYYFkzfylrht18rcq1zA99Wxo8UEireExHuzs2w==", "license": "MIT", "dependencies": { - "@algolia/client-common": "5.29.0", - "@algolia/requester-browser-xhr": "5.29.0", - "@algolia/requester-fetch": "5.29.0", - "@algolia/requester-node-http": "5.29.0" + "@algolia/client-common": "5.31.0", + "@algolia/requester-browser-xhr": "5.31.0", + "@algolia/requester-fetch": "5.31.0", + "@algolia/requester-node-http": "5.31.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/client-personalization": { - "version": "5.29.0", - "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-5.29.0.tgz", - "integrity": "sha512-ibxmh2wKKrzu5du02gp8CLpRMeo+b/75e4ORct98CT7mIxuYFXowULwCd6cMMkz/R0LpKXIbTUl15UL5soaiUQ==", + "version": "5.31.0", + "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-5.31.0.tgz", + "integrity": "sha512-3G8ZpoLCgrcuILTQGVU9WXxUmK4R8uUmAiU31Qqd/pkta/9J8DHQjNh+Fs/i27ls2YxQq36GqXvVM2eoQFmFJw==", "license": "MIT", "dependencies": { - "@algolia/client-common": "5.29.0", - "@algolia/requester-browser-xhr": "5.29.0", - "@algolia/requester-fetch": "5.29.0", - "@algolia/requester-node-http": "5.29.0" + "@algolia/client-common": "5.31.0", + "@algolia/requester-browser-xhr": "5.31.0", + "@algolia/requester-fetch": "5.31.0", + "@algolia/requester-node-http": "5.31.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/client-query-suggestions": { - "version": "5.29.0", - "resolved": "https://registry.npmjs.org/@algolia/client-query-suggestions/-/client-query-suggestions-5.29.0.tgz", - "integrity": "sha512-VZq4/AukOoJC2WSwF6J5sBtt+kImOoBwQc1nH3tgI+cxJBg7B77UsNC+jT6eP2dQCwGKBBRTmtPLUTDDnHpMgA==", + "version": "5.31.0", + "resolved": "https://registry.npmjs.org/@algolia/client-query-suggestions/-/client-query-suggestions-5.31.0.tgz", + "integrity": "sha512-+YIHy+n+x2/DqRdnrPv2Eck2pbZ4Q5Lu1mWpwOUZ2u2XG6JVQx0goePomtYl8evsDGspDRZJPpGD+CFJboe0gQ==", "license": "MIT", "dependencies": { - "@algolia/client-common": "5.29.0", - "@algolia/requester-browser-xhr": "5.29.0", - "@algolia/requester-fetch": "5.29.0", - "@algolia/requester-node-http": "5.29.0" + "@algolia/client-common": "5.31.0", + "@algolia/requester-browser-xhr": "5.31.0", + "@algolia/requester-fetch": "5.31.0", + "@algolia/requester-node-http": "5.31.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/client-search": { - "version": "5.29.0", - "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-5.29.0.tgz", - "integrity": "sha512-cZ0Iq3OzFUPpgszzDr1G1aJV5UMIZ4VygJ2Az252q4Rdf5cQMhYEIKArWY/oUjMhQmosM8ygOovNq7gvA9CdCg==", + "version": "5.31.0", + "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-5.31.0.tgz", + "integrity": "sha512-2I79ICkuTqbXeK5RGSmzCN1Uj86NghWxaWt41lIcFk1OXuUWhyXTxC2fN5M8ASRBf/qWSeXr6AzL8jb3opya3g==", "license": "MIT", "dependencies": { - "@algolia/client-common": "5.29.0", - "@algolia/requester-browser-xhr": "5.29.0", - "@algolia/requester-fetch": "5.29.0", - "@algolia/requester-node-http": "5.29.0" + "@algolia/client-common": "5.31.0", + "@algolia/requester-browser-xhr": "5.31.0", + "@algolia/requester-fetch": "5.31.0", + "@algolia/requester-node-http": "5.31.0" }, "engines": { "node": ">= 14.0.0" @@ -198,81 +199,81 @@ "license": "MIT" }, "node_modules/@algolia/ingestion": { - "version": "1.29.0", - "resolved": "https://registry.npmjs.org/@algolia/ingestion/-/ingestion-1.29.0.tgz", - "integrity": "sha512-scBXn0wO5tZCxmO6evfa7A3bGryfyOI3aoXqSQBj5SRvNYXaUlFWQ/iKI70gRe/82ICwE0ICXbHT/wIvxOW7vw==", + "version": "1.31.0", + "resolved": "https://registry.npmjs.org/@algolia/ingestion/-/ingestion-1.31.0.tgz", + "integrity": "sha512-HiBWdO7ztzgFoR+SnbHq0iBQtDUusRZPSVMkPIR/MNbNJrH/OhrCsxk6Y7dUvQAIjypKmFl38raf1XEKz9fdUA==", "license": "MIT", "dependencies": { - "@algolia/client-common": "5.29.0", - "@algolia/requester-browser-xhr": "5.29.0", - "@algolia/requester-fetch": "5.29.0", - "@algolia/requester-node-http": "5.29.0" + "@algolia/client-common": "5.31.0", + "@algolia/requester-browser-xhr": "5.31.0", + "@algolia/requester-fetch": "5.31.0", + "@algolia/requester-node-http": "5.31.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/monitoring": { - "version": "1.29.0", - "resolved": "https://registry.npmjs.org/@algolia/monitoring/-/monitoring-1.29.0.tgz", - "integrity": "sha512-FGWWG9jLFhsKB7YiDjM2dwQOYnWu//7Oxrb2vT96N7+s+hg1mdHHfHNRyEudWdxd4jkMhBjeqNA21VbTiOIPVg==", + "version": "1.31.0", + "resolved": "https://registry.npmjs.org/@algolia/monitoring/-/monitoring-1.31.0.tgz", + "integrity": "sha512-ifrQ3BMg7Z4EGBPouUINd7xVU2ySTrJ2FtuAoiRHaZ7rT1Kp56JW40kuHiCvmDI4ZBaIzrQuGxWYKUZ29QWR6g==", "license": "MIT", "dependencies": { - "@algolia/client-common": "5.29.0", - "@algolia/requester-browser-xhr": "5.29.0", - "@algolia/requester-fetch": "5.29.0", - "@algolia/requester-node-http": "5.29.0" + "@algolia/client-common": "5.31.0", + "@algolia/requester-browser-xhr": "5.31.0", + "@algolia/requester-fetch": "5.31.0", + "@algolia/requester-node-http": "5.31.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/recommend": { - "version": "5.29.0", - "resolved": "https://registry.npmjs.org/@algolia/recommend/-/recommend-5.29.0.tgz", - "integrity": "sha512-xte5+mpdfEARAu61KXa4ewpjchoZuJlAlvQb8ptK6hgHlBHDnYooy1bmOFpokaAICrq/H9HpoqNUX71n+3249A==", + "version": "5.31.0", + "resolved": "https://registry.npmjs.org/@algolia/recommend/-/recommend-5.31.0.tgz", + "integrity": "sha512-dA94TKQ9FiZ8E1BlpfAMVKC3XimhDBjNFLPR3w5eRgSXymJbbK93xr/LrhyCWHbJPxtUcJvaO+Xg0pFKP+HZvw==", "license": "MIT", "dependencies": { - "@algolia/client-common": "5.29.0", - "@algolia/requester-browser-xhr": "5.29.0", - "@algolia/requester-fetch": "5.29.0", - "@algolia/requester-node-http": "5.29.0" + "@algolia/client-common": "5.31.0", + "@algolia/requester-browser-xhr": "5.31.0", + "@algolia/requester-fetch": "5.31.0", + "@algolia/requester-node-http": "5.31.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/requester-browser-xhr": { - "version": "5.29.0", - "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-5.29.0.tgz", - "integrity": "sha512-og+7Em75aPHhahEUScq2HQ3J7ULN63Levtd87BYMpn6Im5d5cNhaC4QAUsXu6LWqxRPgh4G+i+wIb6tVhDhg2A==", + "version": "5.31.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-5.31.0.tgz", + "integrity": "sha512-akbqE63Scw3dttQatKhjiHdFXpqihCCpcAciIHpdebw3/zWfb+e/Tkf6tDv/05AGcG5BHC365dp8LIl9+NchSA==", "license": "MIT", "dependencies": { - "@algolia/client-common": "5.29.0" + "@algolia/client-common": "5.31.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/requester-fetch": { - "version": "5.29.0", - "resolved": "https://registry.npmjs.org/@algolia/requester-fetch/-/requester-fetch-5.29.0.tgz", - "integrity": "sha512-JCxapz7neAy8hT/nQpCvOrI5JO8VyQ1kPvBiaXWNC1prVq0UMYHEL52o1BsPvtXfdQ7BVq19OIq6TjOI06mV/w==", + "version": "5.31.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-fetch/-/requester-fetch-5.31.0.tgz", + "integrity": "sha512-qYOEOCIqXvbVKNTabgKmPFltpNxB1U38hhrMEbypyOc/X9zjdxnVi/dqZ+jKsYY4X7MSQTtowLK4AR++OdMD/g==", "license": "MIT", "dependencies": { - "@algolia/client-common": "5.29.0" + "@algolia/client-common": "5.31.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/requester-node-http": { - "version": "5.29.0", - "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-5.29.0.tgz", - "integrity": "sha512-lVBD81RBW5VTdEYgnzCz7Pf9j2H44aymCP+/eHGJu4vhU+1O8aKf3TVBgbQr5UM6xoe8IkR/B112XY6YIG2vtg==", + "version": "5.31.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-5.31.0.tgz", + "integrity": "sha512-eq8uTVUc/E7YIOqTVfXgGQ3ZSsAWqZZHy5ntuwm6WxnvdcAyhyzRo0sncX1zWFkFpNGvJ8xyONDWq/Ef2e31Tg==", "license": "MIT", "dependencies": { - "@algolia/client-common": "5.29.0" + "@algolia/client-common": "5.31.0" }, "engines": { "node": ">= 14.0.0" @@ -318,30 +319,30 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.27.5", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.27.5.tgz", - "integrity": "sha512-KiRAp/VoJaWkkte84TvUd9qjdbZAdiqyvMxrGl1N6vzFogKmaLgoM3L1kgtLicp2HP5fBJS8JrZKLVIZGVJAVg==", + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.0.tgz", + "integrity": "sha512-60X7qkglvrap8mn1lh2ebxXdZYtUcpd7gsmy9kLaBJ4i/WdY8PqTSdxyA8qraikqKQK5C1KRBKXqznrVapyNaw==", "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.27.4", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.27.4.tgz", - "integrity": "sha512-bXYxrXFubeYdvB0NhD/NBB3Qi6aZeV20GOWVI47t2dkecCEoneR4NPVcb7abpXDEvejgrUfFtG6vG/zxAKmg+g==", + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.0.tgz", + "integrity": "sha512-UlLAnTPrFdNGoFtbSXwcGFQBtQZJCNjaN6hQNP3UPvuNXT1i82N26KL3dZeIpNalWywr9IuQuncaAfUaS1g6sQ==", "license": "MIT", "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.27.1", - "@babel/generator": "^7.27.3", + "@babel/generator": "^7.28.0", "@babel/helper-compilation-targets": "^7.27.2", "@babel/helper-module-transforms": "^7.27.3", - "@babel/helpers": "^7.27.4", - "@babel/parser": "^7.27.4", + "@babel/helpers": "^7.27.6", + "@babel/parser": "^7.28.0", "@babel/template": "^7.27.2", - "@babel/traverse": "^7.27.4", - "@babel/types": "^7.27.3", + "@babel/traverse": "^7.28.0", + "@babel/types": "^7.28.0", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -366,15 +367,15 @@ } }, "node_modules/@babel/generator": { - "version": "7.27.5", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.27.5.tgz", - "integrity": "sha512-ZGhA37l0e/g2s1Cnzdix0O3aLYm66eF8aufiVteOgnwxgnRP8GoyMj7VWsgWnQbVKXyge7hqrFh2K2TQM6t1Hw==", + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.0.tgz", + "integrity": "sha512-lJjzvrbEeWrhB4P3QBsH7tey117PjLZnDbLiQEKjQ/fNJTjuq4HSqgFA+UNSwZT8D7dxxbnuSBMsa1lrWzKlQg==", "license": "MIT", "dependencies": { - "@babel/parser": "^7.27.5", - "@babel/types": "^7.27.3", - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25", + "@babel/parser": "^7.28.0", + "@babel/types": "^7.28.0", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", "jsesc": "^3.0.2" }, "engines": { @@ -475,21 +476,30 @@ } }, "node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.6.4", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.4.tgz", - "integrity": "sha512-jljfR1rGnXXNWnmQg2K3+bvhkxB51Rl32QRaOTuwwjviGrHzIbSc8+x9CpraDtbT7mfyjXObULP4w/adunNwAw==", + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.5.tgz", + "integrity": "sha512-uJnGFcPsWQK8fvjgGP5LZUZZsYGIoPeRjSF5PGwrelYgq7Q15/Ft9NGFp1zglwgIv//W0uG4BevRuSJRyylZPg==", "license": "MIT", "dependencies": { - "@babel/helper-compilation-targets": "^7.22.6", - "@babel/helper-plugin-utils": "^7.22.5", - "debug": "^4.1.1", + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-plugin-utils": "^7.27.1", + "debug": "^4.4.1", "lodash.debounce": "^4.0.8", - "resolve": "^1.14.2" + "resolve": "^1.22.10" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, + "node_modules/@babel/helper-globals": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", + "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/helper-member-expression-to-functions": { "version": "7.27.1", "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.27.1.tgz", @@ -656,12 +666,12 @@ } }, "node_modules/@babel/parser": { - "version": "7.27.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.27.5.tgz", - "integrity": "sha512-OsQd175SxWkGlzbny8J3K8TnnDD0N3lrIUtB92xwyRpzaenGZhxDvxN/JgU00U3CDZNj9tPuDJ5H0WS4Nt3vKg==", + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.0.tgz", + "integrity": "sha512-jVZGvOxOuNSsuQuLRTh13nU0AogFlw32w/MT+LV6D3sP5WdbW61E77RnkbaO2dUvmPAYrBDJXGn5gGS6tH4j8g==", "license": "MIT", "dependencies": { - "@babel/types": "^7.27.3" + "@babel/types": "^7.28.0" }, "bin": { "parser": "bin/babel-parser.js" @@ -865,14 +875,14 @@ } }, "node_modules/@babel/plugin-transform-async-generator-functions": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.27.1.tgz", - "integrity": "sha512-eST9RrwlpaoJBDHShc+DS2SG4ATTi2MYNb4OxYkf3n+7eb49LWpnS+HSpVfW4x927qQwgk8A2hGNVaajAEw0EA==", + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.28.0.tgz", + "integrity": "sha512-BEOdvX4+M765icNPZeidyADIvQ1m1gmunXufXxvRESy/jNNyfovIqUyE7MVgGBjWktCoJlzvFA1To2O4ymIO3Q==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-remap-async-to-generator": "^7.27.1", - "@babel/traverse": "^7.27.1" + "@babel/traverse": "^7.28.0" }, "engines": { "node": ">=6.9.0" @@ -914,9 +924,9 @@ } }, "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.27.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.27.5.tgz", - "integrity": "sha512-JF6uE2s67f0y2RZcm2kpAUEbD50vH62TyWVebxwHAlbSdM49VqPz8t4a1uIjp4NIOIZ4xzLfjY5emt/RCyC7TQ==", + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.28.0.tgz", + "integrity": "sha512-gKKnwjpdx5sER/wl0WN0efUBFzF/56YZO0RJrSYP4CljXnP31ByY7fol89AzomdlLNzI36AvOTmYHsnZTCkq8Q==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" @@ -961,17 +971,17 @@ } }, "node_modules/@babel/plugin-transform-classes": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.27.1.tgz", - "integrity": "sha512-7iLhfFAubmpeJe/Wo2TVuDrykh/zlWXLzPNdL0Jqn/Xu8R3QQ8h9ff8FQoISZOsw74/HFqFI7NX63HN7QFIHKA==", + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.28.0.tgz", + "integrity": "sha512-IjM1IoJNw72AZFlj33Cu8X0q2XK/6AaVC3jQu+cgQ5lThWD5ajnuUAml80dqRmOhmPkTH8uAwnpMu9Rvj0LTRA==", "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.27.1", - "@babel/helper-compilation-targets": "^7.27.1", + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-globals": "^7.28.0", "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-replace-supers": "^7.27.1", - "@babel/traverse": "^7.27.1", - "globals": "^11.1.0" + "@babel/traverse": "^7.28.0" }, "engines": { "node": ">=6.9.0" @@ -997,12 +1007,13 @@ } }, "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.27.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.27.3.tgz", - "integrity": "sha512-s4Jrok82JpiaIprtY2nHsYmrThKvvwgHwjgd7UMiYhZaN0asdXNLr0y+NjTfkA7SyQE5i2Fb7eawUOZmLvyqOA==", + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.28.0.tgz", + "integrity": "sha512-v1nrSMBiKcodhsyJ4Gf+Z0U/yawmJDBOTpEB3mcQY52r9RIyPneGyAS/yM6seP/8I+mWI3elOMtT5dB8GJVs+A==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/traverse": "^7.28.0" }, "engines": { "node": ">=6.9.0" @@ -1073,6 +1084,22 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-transform-explicit-resource-management": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-explicit-resource-management/-/plugin-transform-explicit-resource-management-7.28.0.tgz", + "integrity": "sha512-K8nhUcn3f6iB+P3gwCv/no7OdzOZQcKchW6N389V6PD8NUWKZHzndOd9sPDVbMoBsbmjMqlB4L9fm+fEFNVlwQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/plugin-transform-destructuring": "^7.28.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, "node_modules/@babel/plugin-transform-exponentiation-operator": { "version": "7.27.1", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.27.1.tgz", @@ -1324,15 +1351,16 @@ } }, "node_modules/@babel/plugin-transform-object-rest-spread": { - "version": "7.27.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.27.3.tgz", - "integrity": "sha512-7ZZtznF9g4l2JCImCo5LNKFHB5eXnN39lLtLY5Tg+VkR0jwOt7TBciMckuiQIOIW7L5tkQOCh3bVGYeXgMx52Q==", + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.28.0.tgz", + "integrity": "sha512-9VNGikXxzu5eCiQjdE4IZn8sb9q7Xsk5EXLDBKUYg1e/Tve8/05+KJEtcxGxAgCY5t/BpKQM+JEL/yT4tvgiUA==", "license": "MIT", "dependencies": { "@babel/helper-compilation-targets": "^7.27.2", "@babel/helper-plugin-utils": "^7.27.1", - "@babel/plugin-transform-destructuring": "^7.27.3", - "@babel/plugin-transform-parameters": "^7.27.1" + "@babel/plugin-transform-destructuring": "^7.28.0", + "@babel/plugin-transform-parameters": "^7.27.7", + "@babel/traverse": "^7.28.0" }, "engines": { "node": ">=6.9.0" @@ -1389,9 +1417,9 @@ } }, "node_modules/@babel/plugin-transform-parameters": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.27.1.tgz", - "integrity": "sha512-018KRk76HWKeZ5l4oTj2zPpSh+NbGdt0st5S6x0pga6HgrjBOJb24mMDHorFopOOd6YHkLgOZ+zaCjZGPO4aKg==", + "version": "7.27.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.27.7.tgz", + "integrity": "sha512-qBkYTYCb76RRxUM6CcZA5KRu8K4SM8ajzVeUgVdMVO9NN9uI/GaVmBg/WKJJGnNokV9SY8FxNOVWGXzqzUidBg==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" @@ -1467,9 +1495,9 @@ } }, "node_modules/@babel/plugin-transform-react-display-name": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.27.1.tgz", - "integrity": "sha512-p9+Vl3yuHPmkirRrg021XiP+EETmPMQTLr6Ayjj85RLNEbb3Eya/4VI0vAdzQG9SEAl2Lnt7fy5lZyMzjYoZQQ==", + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.28.0.tgz", + "integrity": "sha512-D6Eujc2zMxKjfa4Zxl4GHMsmhKKZ9VpcqIchJLvwTxad9zWIYulwYItBovpDOoNLISpcZSXoDJ5gaGbQUDqViA==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" @@ -1532,9 +1560,9 @@ } }, "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.27.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.27.5.tgz", - "integrity": "sha512-uhB8yHerfe3MWnuLAhEbeQ4afVoqv8BQsPqrTv7e/jZ9y00kJL6l9a/f4OWaKxotmjzewfEyXE1vgDJenkQ2/Q==", + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.28.0.tgz", + "integrity": "sha512-LOAozRVbqxEVjSKfhGnuLoE4Kz4Oc5UJzuvFUhSsQzdCdaAQu06mG8zDv2GFSerM62nImUZ7K92vxnQcLSDlCQ==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" @@ -1578,16 +1606,16 @@ } }, "node_modules/@babel/plugin-transform-runtime": { - "version": "7.27.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.27.4.tgz", - "integrity": "sha512-D68nR5zxU64EUzV8i7T3R5XP0Xhrou/amNnddsRQssx6GrTLdZl1rLxyjtVZBd+v/NVX4AbTPOB5aU8thAZV1A==", + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.28.0.tgz", + "integrity": "sha512-dGopk9nZrtCs2+nfIem25UuHyt5moSJamArzIoh9/vezUQPmYDOzjaHDCkAzuGJibCIkPup8rMT2+wYB6S73cA==", "license": "MIT", "dependencies": { "@babel/helper-module-imports": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1", - "babel-plugin-polyfill-corejs2": "^0.4.10", - "babel-plugin-polyfill-corejs3": "^0.11.0", - "babel-plugin-polyfill-regenerator": "^0.6.1", + "babel-plugin-polyfill-corejs2": "^0.4.14", + "babel-plugin-polyfill-corejs3": "^0.13.0", + "babel-plugin-polyfill-regenerator": "^0.6.5", "semver": "^6.3.1" }, "engines": { @@ -1683,12 +1711,12 @@ } }, "node_modules/@babel/plugin-transform-typescript": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.27.1.tgz", - "integrity": "sha512-Q5sT5+O4QUebHdbwKedFBEwRLb02zJ7r4A5Gg2hUoLuU3FjdMcyqcywqUrLCaDsFCxzokf7u9kuy7qz51YUuAg==", + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.28.0.tgz", + "integrity": "sha512-4AEiDEBPIZvLQaWlc9liCavE0xRM0dNca41WtBeM3jgFptfUOSG9z0uteLhq6+3rq+WB6jIvUwKDTpXEHPJ2Vg==", "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-annotate-as-pure": "^7.27.3", "@babel/helper-create-class-features-plugin": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", @@ -1765,12 +1793,12 @@ } }, "node_modules/@babel/preset-env": { - "version": "7.27.2", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.27.2.tgz", - "integrity": "sha512-Ma4zSuYSlGNRlCLO+EAzLnCmJK2vdstgv+n7aUP+/IKZrOfWHOJVdSJtuub8RzHTj3ahD37k5OKJWvzf16TQyQ==", + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.28.0.tgz", + "integrity": "sha512-VmaxeGOwuDqzLl5JUkIRM1X2Qu2uKGxHEQWh+cvvbl7JuJRgKGJSfsEF/bUaxFhJl/XAyxBe7q7qSuTbKFuCyg==", "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.27.2", + "@babel/compat-data": "^7.28.0", "@babel/helper-compilation-targets": "^7.27.2", "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-validator-option": "^7.27.1", @@ -1784,19 +1812,20 @@ "@babel/plugin-syntax-import-attributes": "^7.27.1", "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", "@babel/plugin-transform-arrow-functions": "^7.27.1", - "@babel/plugin-transform-async-generator-functions": "^7.27.1", + "@babel/plugin-transform-async-generator-functions": "^7.28.0", "@babel/plugin-transform-async-to-generator": "^7.27.1", "@babel/plugin-transform-block-scoped-functions": "^7.27.1", - "@babel/plugin-transform-block-scoping": "^7.27.1", + "@babel/plugin-transform-block-scoping": "^7.28.0", "@babel/plugin-transform-class-properties": "^7.27.1", "@babel/plugin-transform-class-static-block": "^7.27.1", - "@babel/plugin-transform-classes": "^7.27.1", + "@babel/plugin-transform-classes": "^7.28.0", "@babel/plugin-transform-computed-properties": "^7.27.1", - "@babel/plugin-transform-destructuring": "^7.27.1", + "@babel/plugin-transform-destructuring": "^7.28.0", "@babel/plugin-transform-dotall-regex": "^7.27.1", "@babel/plugin-transform-duplicate-keys": "^7.27.1", "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.27.1", "@babel/plugin-transform-dynamic-import": "^7.27.1", + "@babel/plugin-transform-explicit-resource-management": "^7.28.0", "@babel/plugin-transform-exponentiation-operator": "^7.27.1", "@babel/plugin-transform-export-namespace-from": "^7.27.1", "@babel/plugin-transform-for-of": "^7.27.1", @@ -1813,15 +1842,15 @@ "@babel/plugin-transform-new-target": "^7.27.1", "@babel/plugin-transform-nullish-coalescing-operator": "^7.27.1", "@babel/plugin-transform-numeric-separator": "^7.27.1", - "@babel/plugin-transform-object-rest-spread": "^7.27.2", + "@babel/plugin-transform-object-rest-spread": "^7.28.0", "@babel/plugin-transform-object-super": "^7.27.1", "@babel/plugin-transform-optional-catch-binding": "^7.27.1", "@babel/plugin-transform-optional-chaining": "^7.27.1", - "@babel/plugin-transform-parameters": "^7.27.1", + "@babel/plugin-transform-parameters": "^7.27.7", "@babel/plugin-transform-private-methods": "^7.27.1", "@babel/plugin-transform-private-property-in-object": "^7.27.1", "@babel/plugin-transform-property-literals": "^7.27.1", - "@babel/plugin-transform-regenerator": "^7.27.1", + "@babel/plugin-transform-regenerator": "^7.28.0", "@babel/plugin-transform-regexp-modifiers": "^7.27.1", "@babel/plugin-transform-reserved-words": "^7.27.1", "@babel/plugin-transform-shorthand-properties": "^7.27.1", @@ -1834,10 +1863,10 @@ "@babel/plugin-transform-unicode-regex": "^7.27.1", "@babel/plugin-transform-unicode-sets-regex": "^7.27.1", "@babel/preset-modules": "0.1.6-no-external-plugins", - "babel-plugin-polyfill-corejs2": "^0.4.10", - "babel-plugin-polyfill-corejs3": "^0.11.0", - "babel-plugin-polyfill-regenerator": "^0.6.1", - "core-js-compat": "^3.40.0", + "babel-plugin-polyfill-corejs2": "^0.4.14", + "babel-plugin-polyfill-corejs3": "^0.13.0", + "babel-plugin-polyfill-regenerator": "^0.6.5", + "core-js-compat": "^3.43.0", "semver": "^6.3.1" }, "engines": { @@ -1910,24 +1939,21 @@ } }, "node_modules/@babel/runtime": { - "version": "7.27.0", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.27.0.tgz", - "integrity": "sha512-VtPOkrdPHZsKc/clNqyi9WUA8TINkZ4cGk63UUE3u4pmB2k+ZMQRDuIOagv8UVd6j7k0T3+RRIb7beKTebNbcw==", + "version": "7.27.6", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.27.6.tgz", + "integrity": "sha512-vbavdySgbTTrmFE+EsiqUTzlOr5bzlnJtUv9PynGCAKvfQqjIXbvFdumPM/GxMDfyuGMJaJAU6TO4zc1Jf1i8Q==", "license": "MIT", - "dependencies": { - "regenerator-runtime": "^0.14.0" - }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/runtime-corejs3": { - "version": "7.27.6", - "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.27.6.tgz", - "integrity": "sha512-vDVrlmRAY8z9Ul/HxT+8ceAru95LQgkSKiXkSYZvqtbkPSfhZJgpRp45Cldbh1GJ1kxzQkI70AqyrTI58KpaWQ==", + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.28.0.tgz", + "integrity": "sha512-nlIXnSqLcBij8K8TtkxbBJgfzfvi75V1pAKSM7dUXejGw12vJAqez74jZrHTsJ3Z+Aczc5Q/6JgNjKRMsVU44g==", "license": "MIT", "dependencies": { - "core-js-pure": "^3.30.2" + "core-js-pure": "^3.43.0" }, "engines": { "node": ">=6.9.0" @@ -1948,27 +1974,27 @@ } }, "node_modules/@babel/traverse": { - "version": "7.27.4", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.27.4.tgz", - "integrity": "sha512-oNcu2QbHqts9BtOWJosOVJapWjBDSxGCpFvikNR5TGDYDQf3JwpIoMzIKrvfoti93cLfPJEG4tH9SPVeyCGgdA==", + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.0.tgz", + "integrity": "sha512-mGe7UK5wWyh0bKRfupsUchrQGqvDbZDbKJw+kcRGSmdHVYrv+ltd0pnpDTVpiTqnaBru9iEvA8pz8W46v0Amwg==", "license": "MIT", "dependencies": { "@babel/code-frame": "^7.27.1", - "@babel/generator": "^7.27.3", - "@babel/parser": "^7.27.4", + "@babel/generator": "^7.28.0", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.28.0", "@babel/template": "^7.27.2", - "@babel/types": "^7.27.3", - "debug": "^4.3.1", - "globals": "^11.1.0" + "@babel/types": "^7.28.0", + "debug": "^4.3.1" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/types": { - "version": "7.27.6", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.27.6.tgz", - "integrity": "sha512-ETyHEk2VHHvl9b9jZP5IHPavHYk57EhanlRRuae9XCpb/j5bDCbPPMOBfCWhnl/7EDJz0jEMCi/RhccCE8r1+Q==", + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.0.tgz", + "integrity": "sha512-jYnje+JyZG5YThjHiF28oT4SIZLnYOcSBb6+SDaFIyzDVSkXQmQQYclJ2R+YxcdmK0AX6x1E5OQNtuh3jHDrUg==", "license": "MIT", "dependencies": { "@babel/helper-string-parser": "^7.27.1", @@ -2324,9 +2350,9 @@ } }, "node_modules/@csstools/postcss-cascade-layers": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-cascade-layers/-/postcss-cascade-layers-5.0.1.tgz", - "integrity": "sha512-XOfhI7GShVcKiKwmPAnWSqd2tBR0uxt+runAxttbSp/LY2U16yAVPmAf7e9q4JJ0d+xMNmpwNDLBXnmRCl3HMQ==", + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/@csstools/postcss-cascade-layers/-/postcss-cascade-layers-5.0.2.tgz", + "integrity": "sha512-nWBE08nhO8uWl6kSAeCx4im7QfVko3zLrtgWZY4/bP87zrSPpSyN/3W3TDqz1jJuH+kbKOHXg5rJnK+ZVYcFFg==", "funding": [ { "type": "github", @@ -3474,57 +3500,6 @@ "react-dom": "^18.0.0 || ^19.0.0" } }, - "node_modules/@docusaurus/core/node_modules/@docusaurus/mdx-loader": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/@docusaurus/mdx-loader/-/mdx-loader-3.8.1.tgz", - "integrity": "sha512-DZRhagSFRcEq1cUtBMo4TKxSNo/W6/s44yhr8X+eoXqCLycFQUylebOMPseHi5tc4fkGJqwqpWJLz6JStU9L4w==", - "license": "MIT", - "dependencies": { - "@docusaurus/logger": "3.8.1", - "@docusaurus/utils": "3.8.1", - "@docusaurus/utils-validation": "3.8.1", - "@mdx-js/mdx": "^3.0.0", - "@slorber/remark-comment": "^1.0.0", - "escape-html": "^1.0.3", - "estree-util-value-to-estree": "^3.0.1", - "file-loader": "^6.2.0", - "fs-extra": "^11.1.1", - "image-size": "^2.0.2", - "mdast-util-mdx": "^3.0.0", - "mdast-util-to-string": "^4.0.0", - "rehype-raw": "^7.0.0", - "remark-directive": "^3.0.0", - "remark-emoji": "^4.0.0", - "remark-frontmatter": "^5.0.0", - "remark-gfm": "^4.0.0", - "stringify-object": "^3.3.0", - "tslib": "^2.6.0", - "unified": "^11.0.3", - "unist-util-visit": "^5.0.0", - "url-loader": "^4.1.1", - "vfile": "^6.0.1", - "webpack": "^5.88.1" - }, - "engines": { - "node": ">=18.0" - }, - "peerDependencies": { - "react": "^18.0.0 || ^19.0.0", - "react-dom": "^18.0.0 || ^19.0.0" - } - }, - "node_modules/@docusaurus/core/node_modules/image-size": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/image-size/-/image-size-2.0.2.tgz", - "integrity": "sha512-IRqXKlaXwgSMAMtpNzZa1ZAe8m+Sa1770Dhk8VkSsP9LS+iHD62Zd8FQKs8fbPiagBE7BzoFX23cxFnwshpV6w==", - "license": "MIT", - "bin": { - "image-size": "bin/image-size.js" - }, - "engines": { - "node": ">=16.x" - } - }, "node_modules/@docusaurus/cssnano-preset": { "version": "3.8.1", "resolved": "https://registry.npmjs.org/@docusaurus/cssnano-preset/-/cssnano-preset-3.8.1.tgz", @@ -3576,6 +3551,45 @@ "node": ">=18.0" } }, + "node_modules/@docusaurus/mdx-loader": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/@docusaurus/mdx-loader/-/mdx-loader-3.8.1.tgz", + "integrity": "sha512-DZRhagSFRcEq1cUtBMo4TKxSNo/W6/s44yhr8X+eoXqCLycFQUylebOMPseHi5tc4fkGJqwqpWJLz6JStU9L4w==", + "license": "MIT", + "dependencies": { + "@docusaurus/logger": "3.8.1", + "@docusaurus/utils": "3.8.1", + "@docusaurus/utils-validation": "3.8.1", + "@mdx-js/mdx": "^3.0.0", + "@slorber/remark-comment": "^1.0.0", + "escape-html": "^1.0.3", + "estree-util-value-to-estree": "^3.0.1", + "file-loader": "^6.2.0", + "fs-extra": "^11.1.1", + "image-size": "^2.0.2", + "mdast-util-mdx": "^3.0.0", + "mdast-util-to-string": "^4.0.0", + "rehype-raw": "^7.0.0", + "remark-directive": "^3.0.0", + "remark-emoji": "^4.0.0", + "remark-frontmatter": "^5.0.0", + "remark-gfm": "^4.0.0", + "stringify-object": "^3.3.0", + "tslib": "^2.6.0", + "unified": "^11.0.3", + "unist-util-visit": "^5.0.0", + "url-loader": "^4.1.1", + "vfile": "^6.0.1", + "webpack": "^5.88.1" + }, + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, "node_modules/@docusaurus/module-type-aliases": { "version": "3.8.1", "resolved": "https://registry.npmjs.org/@docusaurus/module-type-aliases/-/module-type-aliases-3.8.1.tgz", @@ -3653,57 +3667,6 @@ "react-dom": "^18.0.0 || ^19.0.0" } }, - "node_modules/@docusaurus/plugin-content-blog/node_modules/@docusaurus/mdx-loader": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/@docusaurus/mdx-loader/-/mdx-loader-3.8.1.tgz", - "integrity": "sha512-DZRhagSFRcEq1cUtBMo4TKxSNo/W6/s44yhr8X+eoXqCLycFQUylebOMPseHi5tc4fkGJqwqpWJLz6JStU9L4w==", - "license": "MIT", - "dependencies": { - "@docusaurus/logger": "3.8.1", - "@docusaurus/utils": "3.8.1", - "@docusaurus/utils-validation": "3.8.1", - "@mdx-js/mdx": "^3.0.0", - "@slorber/remark-comment": "^1.0.0", - "escape-html": "^1.0.3", - "estree-util-value-to-estree": "^3.0.1", - "file-loader": "^6.2.0", - "fs-extra": "^11.1.1", - "image-size": "^2.0.2", - "mdast-util-mdx": "^3.0.0", - "mdast-util-to-string": "^4.0.0", - "rehype-raw": "^7.0.0", - "remark-directive": "^3.0.0", - "remark-emoji": "^4.0.0", - "remark-frontmatter": "^5.0.0", - "remark-gfm": "^4.0.0", - "stringify-object": "^3.3.0", - "tslib": "^2.6.0", - "unified": "^11.0.3", - "unist-util-visit": "^5.0.0", - "url-loader": "^4.1.1", - "vfile": "^6.0.1", - "webpack": "^5.88.1" - }, - "engines": { - "node": ">=18.0" - }, - "peerDependencies": { - "react": "^18.0.0 || ^19.0.0", - "react-dom": "^18.0.0 || ^19.0.0" - } - }, - "node_modules/@docusaurus/plugin-content-blog/node_modules/image-size": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/image-size/-/image-size-2.0.2.tgz", - "integrity": "sha512-IRqXKlaXwgSMAMtpNzZa1ZAe8m+Sa1770Dhk8VkSsP9LS+iHD62Zd8FQKs8fbPiagBE7BzoFX23cxFnwshpV6w==", - "license": "MIT", - "bin": { - "image-size": "bin/image-size.js" - }, - "engines": { - "node": ">=16.x" - } - }, "node_modules/@docusaurus/plugin-content-docs": { "version": "3.8.1", "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-docs/-/plugin-content-docs-3.8.1.tgz", @@ -3737,35 +3700,19 @@ "react-dom": "^18.0.0 || ^19.0.0" } }, - "node_modules/@docusaurus/plugin-content-docs/node_modules/@docusaurus/mdx-loader": { + "node_modules/@docusaurus/plugin-content-pages": { "version": "3.8.1", - "resolved": "https://registry.npmjs.org/@docusaurus/mdx-loader/-/mdx-loader-3.8.1.tgz", - "integrity": "sha512-DZRhagSFRcEq1cUtBMo4TKxSNo/W6/s44yhr8X+eoXqCLycFQUylebOMPseHi5tc4fkGJqwqpWJLz6JStU9L4w==", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-pages/-/plugin-content-pages-3.8.1.tgz", + "integrity": "sha512-a+V6MS2cIu37E/m7nDJn3dcxpvXb6TvgdNI22vJX8iUTp8eoMoPa0VArEbWvCxMY/xdC26WzNv4wZ6y0iIni/w==", "license": "MIT", "dependencies": { - "@docusaurus/logger": "3.8.1", + "@docusaurus/core": "3.8.1", + "@docusaurus/mdx-loader": "3.8.1", + "@docusaurus/types": "3.8.1", "@docusaurus/utils": "3.8.1", "@docusaurus/utils-validation": "3.8.1", - "@mdx-js/mdx": "^3.0.0", - "@slorber/remark-comment": "^1.0.0", - "escape-html": "^1.0.3", - "estree-util-value-to-estree": "^3.0.1", - "file-loader": "^6.2.0", "fs-extra": "^11.1.1", - "image-size": "^2.0.2", - "mdast-util-mdx": "^3.0.0", - "mdast-util-to-string": "^4.0.0", - "rehype-raw": "^7.0.0", - "remark-directive": "^3.0.0", - "remark-emoji": "^4.0.0", - "remark-frontmatter": "^5.0.0", - "remark-gfm": "^4.0.0", - "stringify-object": "^3.3.0", "tslib": "^2.6.0", - "unified": "^11.0.3", - "unist-util-visit": "^5.0.0", - "url-loader": "^4.1.1", - "vfile": "^6.0.1", "webpack": "^5.88.1" }, "engines": { @@ -3776,32 +3723,34 @@ "react-dom": "^18.0.0 || ^19.0.0" } }, - "node_modules/@docusaurus/plugin-content-docs/node_modules/image-size": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/image-size/-/image-size-2.0.2.tgz", - "integrity": "sha512-IRqXKlaXwgSMAMtpNzZa1ZAe8m+Sa1770Dhk8VkSsP9LS+iHD62Zd8FQKs8fbPiagBE7BzoFX23cxFnwshpV6w==", + "node_modules/@docusaurus/plugin-css-cascade-layers": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-css-cascade-layers/-/plugin-css-cascade-layers-3.8.1.tgz", + "integrity": "sha512-VQ47xRxfNKjHS5ItzaVXpxeTm7/wJLFMOPo1BkmoMG4Cuz4nuI+Hs62+RMk1OqVog68Swz66xVPK8g9XTrBKRw==", "license": "MIT", - "bin": { - "image-size": "bin/image-size.js" + "dependencies": { + "@docusaurus/core": "3.8.1", + "@docusaurus/types": "3.8.1", + "@docusaurus/utils": "3.8.1", + "@docusaurus/utils-validation": "3.8.1", + "tslib": "^2.6.0" }, "engines": { - "node": ">=16.x" + "node": ">=18.0" } }, - "node_modules/@docusaurus/plugin-content-pages": { + "node_modules/@docusaurus/plugin-debug": { "version": "3.8.1", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-pages/-/plugin-content-pages-3.8.1.tgz", - "integrity": "sha512-a+V6MS2cIu37E/m7nDJn3dcxpvXb6TvgdNI22vJX8iUTp8eoMoPa0VArEbWvCxMY/xdC26WzNv4wZ6y0iIni/w==", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-debug/-/plugin-debug-3.8.1.tgz", + "integrity": "sha512-nT3lN7TV5bi5hKMB7FK8gCffFTBSsBsAfV84/v293qAmnHOyg1nr9okEw8AiwcO3bl9vije5nsUvP0aRl2lpaw==", "license": "MIT", "dependencies": { "@docusaurus/core": "3.8.1", - "@docusaurus/mdx-loader": "3.8.1", "@docusaurus/types": "3.8.1", "@docusaurus/utils": "3.8.1", - "@docusaurus/utils-validation": "3.8.1", "fs-extra": "^11.1.1", - "tslib": "^2.6.0", - "webpack": "^5.88.1" + "react-json-view-lite": "^2.3.0", + "tslib": "^2.6.0" }, "engines": { "node": ">=18.0" @@ -3811,102 +3760,14 @@ "react-dom": "^18.0.0 || ^19.0.0" } }, - "node_modules/@docusaurus/plugin-content-pages/node_modules/@docusaurus/mdx-loader": { + "node_modules/@docusaurus/plugin-google-analytics": { "version": "3.8.1", - "resolved": "https://registry.npmjs.org/@docusaurus/mdx-loader/-/mdx-loader-3.8.1.tgz", - "integrity": "sha512-DZRhagSFRcEq1cUtBMo4TKxSNo/W6/s44yhr8X+eoXqCLycFQUylebOMPseHi5tc4fkGJqwqpWJLz6JStU9L4w==", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-analytics/-/plugin-google-analytics-3.8.1.tgz", + "integrity": "sha512-Hrb/PurOJsmwHAsfMDH6oVpahkEGsx7F8CWMjyP/dw1qjqmdS9rcV1nYCGlM8nOtD3Wk/eaThzUB5TSZsGz+7Q==", "license": "MIT", "dependencies": { - "@docusaurus/logger": "3.8.1", - "@docusaurus/utils": "3.8.1", - "@docusaurus/utils-validation": "3.8.1", - "@mdx-js/mdx": "^3.0.0", - "@slorber/remark-comment": "^1.0.0", - "escape-html": "^1.0.3", - "estree-util-value-to-estree": "^3.0.1", - "file-loader": "^6.2.0", - "fs-extra": "^11.1.1", - "image-size": "^2.0.2", - "mdast-util-mdx": "^3.0.0", - "mdast-util-to-string": "^4.0.0", - "rehype-raw": "^7.0.0", - "remark-directive": "^3.0.0", - "remark-emoji": "^4.0.0", - "remark-frontmatter": "^5.0.0", - "remark-gfm": "^4.0.0", - "stringify-object": "^3.3.0", - "tslib": "^2.6.0", - "unified": "^11.0.3", - "unist-util-visit": "^5.0.0", - "url-loader": "^4.1.1", - "vfile": "^6.0.1", - "webpack": "^5.88.1" - }, - "engines": { - "node": ">=18.0" - }, - "peerDependencies": { - "react": "^18.0.0 || ^19.0.0", - "react-dom": "^18.0.0 || ^19.0.0" - } - }, - "node_modules/@docusaurus/plugin-content-pages/node_modules/image-size": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/image-size/-/image-size-2.0.2.tgz", - "integrity": "sha512-IRqXKlaXwgSMAMtpNzZa1ZAe8m+Sa1770Dhk8VkSsP9LS+iHD62Zd8FQKs8fbPiagBE7BzoFX23cxFnwshpV6w==", - "license": "MIT", - "bin": { - "image-size": "bin/image-size.js" - }, - "engines": { - "node": ">=16.x" - } - }, - "node_modules/@docusaurus/plugin-css-cascade-layers": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-css-cascade-layers/-/plugin-css-cascade-layers-3.8.1.tgz", - "integrity": "sha512-VQ47xRxfNKjHS5ItzaVXpxeTm7/wJLFMOPo1BkmoMG4Cuz4nuI+Hs62+RMk1OqVog68Swz66xVPK8g9XTrBKRw==", - "license": "MIT", - "dependencies": { - "@docusaurus/core": "3.8.1", - "@docusaurus/types": "3.8.1", - "@docusaurus/utils": "3.8.1", - "@docusaurus/utils-validation": "3.8.1", - "tslib": "^2.6.0" - }, - "engines": { - "node": ">=18.0" - } - }, - "node_modules/@docusaurus/plugin-debug": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-debug/-/plugin-debug-3.8.1.tgz", - "integrity": "sha512-nT3lN7TV5bi5hKMB7FK8gCffFTBSsBsAfV84/v293qAmnHOyg1nr9okEw8AiwcO3bl9vije5nsUvP0aRl2lpaw==", - "license": "MIT", - "dependencies": { - "@docusaurus/core": "3.8.1", - "@docusaurus/types": "3.8.1", - "@docusaurus/utils": "3.8.1", - "fs-extra": "^11.1.1", - "react-json-view-lite": "^2.3.0", - "tslib": "^2.6.0" - }, - "engines": { - "node": ">=18.0" - }, - "peerDependencies": { - "react": "^18.0.0 || ^19.0.0", - "react-dom": "^18.0.0 || ^19.0.0" - } - }, - "node_modules/@docusaurus/plugin-google-analytics": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-analytics/-/plugin-google-analytics-3.8.1.tgz", - "integrity": "sha512-Hrb/PurOJsmwHAsfMDH6oVpahkEGsx7F8CWMjyP/dw1qjqmdS9rcV1nYCGlM8nOtD3Wk/eaThzUB5TSZsGz+7Q==", - "license": "MIT", - "dependencies": { - "@docusaurus/core": "3.8.1", - "@docusaurus/types": "3.8.1", + "@docusaurus/core": "3.8.1", + "@docusaurus/types": "3.8.1", "@docusaurus/utils-validation": "3.8.1", "tslib": "^2.6.0" }, @@ -4075,57 +3936,6 @@ "react-dom": "^18.0.0 || ^19.0.0" } }, - "node_modules/@docusaurus/theme-classic/node_modules/@docusaurus/mdx-loader": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/@docusaurus/mdx-loader/-/mdx-loader-3.8.1.tgz", - "integrity": "sha512-DZRhagSFRcEq1cUtBMo4TKxSNo/W6/s44yhr8X+eoXqCLycFQUylebOMPseHi5tc4fkGJqwqpWJLz6JStU9L4w==", - "license": "MIT", - "dependencies": { - "@docusaurus/logger": "3.8.1", - "@docusaurus/utils": "3.8.1", - "@docusaurus/utils-validation": "3.8.1", - "@mdx-js/mdx": "^3.0.0", - "@slorber/remark-comment": "^1.0.0", - "escape-html": "^1.0.3", - "estree-util-value-to-estree": "^3.0.1", - "file-loader": "^6.2.0", - "fs-extra": "^11.1.1", - "image-size": "^2.0.2", - "mdast-util-mdx": "^3.0.0", - "mdast-util-to-string": "^4.0.0", - "rehype-raw": "^7.0.0", - "remark-directive": "^3.0.0", - "remark-emoji": "^4.0.0", - "remark-frontmatter": "^5.0.0", - "remark-gfm": "^4.0.0", - "stringify-object": "^3.3.0", - "tslib": "^2.6.0", - "unified": "^11.0.3", - "unist-util-visit": "^5.0.0", - "url-loader": "^4.1.1", - "vfile": "^6.0.1", - "webpack": "^5.88.1" - }, - "engines": { - "node": ">=18.0" - }, - "peerDependencies": { - "react": "^18.0.0 || ^19.0.0", - "react-dom": "^18.0.0 || ^19.0.0" - } - }, - "node_modules/@docusaurus/theme-classic/node_modules/image-size": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/image-size/-/image-size-2.0.2.tgz", - "integrity": "sha512-IRqXKlaXwgSMAMtpNzZa1ZAe8m+Sa1770Dhk8VkSsP9LS+iHD62Zd8FQKs8fbPiagBE7BzoFX23cxFnwshpV6w==", - "license": "MIT", - "bin": { - "image-size": "bin/image-size.js" - }, - "engines": { - "node": ">=16.x" - } - }, "node_modules/@docusaurus/theme-common": { "version": "3.8.1", "resolved": "https://registry.npmjs.org/@docusaurus/theme-common/-/theme-common-3.8.1.tgz", @@ -4154,57 +3964,6 @@ "react-dom": "^18.0.0 || ^19.0.0" } }, - "node_modules/@docusaurus/theme-common/node_modules/@docusaurus/mdx-loader": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/@docusaurus/mdx-loader/-/mdx-loader-3.8.1.tgz", - "integrity": "sha512-DZRhagSFRcEq1cUtBMo4TKxSNo/W6/s44yhr8X+eoXqCLycFQUylebOMPseHi5tc4fkGJqwqpWJLz6JStU9L4w==", - "license": "MIT", - "dependencies": { - "@docusaurus/logger": "3.8.1", - "@docusaurus/utils": "3.8.1", - "@docusaurus/utils-validation": "3.8.1", - "@mdx-js/mdx": "^3.0.0", - "@slorber/remark-comment": "^1.0.0", - "escape-html": "^1.0.3", - "estree-util-value-to-estree": "^3.0.1", - "file-loader": "^6.2.0", - "fs-extra": "^11.1.1", - "image-size": "^2.0.2", - "mdast-util-mdx": "^3.0.0", - "mdast-util-to-string": "^4.0.0", - "rehype-raw": "^7.0.0", - "remark-directive": "^3.0.0", - "remark-emoji": "^4.0.0", - "remark-frontmatter": "^5.0.0", - "remark-gfm": "^4.0.0", - "stringify-object": "^3.3.0", - "tslib": "^2.6.0", - "unified": "^11.0.3", - "unist-util-visit": "^5.0.0", - "url-loader": "^4.1.1", - "vfile": "^6.0.1", - "webpack": "^5.88.1" - }, - "engines": { - "node": ">=18.0" - }, - "peerDependencies": { - "react": "^18.0.0 || ^19.0.0", - "react-dom": "^18.0.0 || ^19.0.0" - } - }, - "node_modules/@docusaurus/theme-common/node_modules/image-size": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/image-size/-/image-size-2.0.2.tgz", - "integrity": "sha512-IRqXKlaXwgSMAMtpNzZa1ZAe8m+Sa1770Dhk8VkSsP9LS+iHD62Zd8FQKs8fbPiagBE7BzoFX23cxFnwshpV6w==", - "license": "MIT", - "bin": { - "image-size": "bin/image-size.js" - }, - "engines": { - "node": ">=16.x" - } - }, "node_modules/@docusaurus/theme-search-algolia": { "version": "3.8.1", "resolved": "https://registry.npmjs.org/@docusaurus/theme-search-algolia/-/theme-search-algolia-3.8.1.tgz", @@ -4355,6 +4114,37 @@ "node": ">=18.0" } }, + "node_modules/@emnapi/core": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.4.4.tgz", + "integrity": "sha512-A9CnAbC6ARNMKcIcrQwq6HeHCjpcBZ5wSx4U01WXCqEKlrzB9F9315WDNHkrs2xbx7YjjSxbUYxuN6EQzpcY2g==", + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/wasi-threads": "1.0.3", + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/runtime": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.4.4.tgz", + "integrity": "sha512-hHyapA4A3gPaDCNfiqyZUStTMqIkKRshqPIuDOXv1hcBnD4U3l8cP0T1HMCfGRxQ6V64TGCcoswChANyOAwbQg==", + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/wasi-threads": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.0.3.tgz", + "integrity": "sha512-8K5IFFsQqF9wQNJptGbS6FNKgUTsSRYnTqNCG1vPP8jFdjSv18n2mQfJpkt2Oibo9iBEzcDnDxNwKTzC7svlJw==", + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, "node_modules/@emotion/babel-plugin": { "version": "11.13.5", "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.13.5.tgz", @@ -4458,9 +4248,9 @@ "license": "MIT" }, "node_modules/@emotion/styled": { - "version": "11.14.0", - "resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-11.14.0.tgz", - "integrity": "sha512-XxfOnXFffatap2IyCeJyNov3kiDQWoR08gPUQxvbL7fxKryGBKUZUkG6Hz48DZwVrJSVh9sJboyV1Ds4OW6SgA==", + "version": "11.14.1", + "resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-11.14.1.tgz", + "integrity": "sha512-qEEJt42DuToa3gurlH4Qqc1kVpNq8wO8cJtDzU46TjlzWjDlsVyevtYCRijVq3SrHsROS+gVQ8Fnea108GnKzw==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.18.3", @@ -4508,31 +4298,31 @@ "license": "MIT" }, "node_modules/@floating-ui/core": { - "version": "1.6.9", - "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.9.tgz", - "integrity": "sha512-uMXCuQ3BItDUbAMhIXw7UPXRfAlOAvZzdK9BWpE60MCn+Svt3aLn9jsPTi/WNGlRUu2uI0v5S7JiIUsbsvh3fw==", + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.7.2.tgz", + "integrity": "sha512-wNB5ooIKHQc+Kui96jE/n69rHFWAVoxn5CAzL1Xdd8FG03cgY3MLO+GF9U3W737fYDSgPWA6MReKhBQBop6Pcw==", "license": "MIT", "dependencies": { - "@floating-ui/utils": "^0.2.9" + "@floating-ui/utils": "^0.2.10" } }, "node_modules/@floating-ui/dom": { - "version": "1.6.13", - "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.13.tgz", - "integrity": "sha512-umqzocjDgNRGTuO7Q8CU32dkHkECqI8ZdMZ5Swb6QAM0t5rnlrN3lGo1hdpscRd3WS8T6DKYK4ephgIH9iRh3w==", + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.7.2.tgz", + "integrity": "sha512-7cfaOQuCS27HD7DX+6ib2OrnW+b4ZBwDNnCcT0uTyidcmyWb03FnQqJybDBoCnpdxwBSfA94UAYlRCt7mV+TbA==", "license": "MIT", "dependencies": { - "@floating-ui/core": "^1.6.0", - "@floating-ui/utils": "^0.2.9" + "@floating-ui/core": "^1.7.2", + "@floating-ui/utils": "^0.2.10" } }, "node_modules/@floating-ui/react-dom": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.2.tgz", - "integrity": "sha512-06okr5cgPzMNBy+Ycse2A6udMi4bqwW/zgBF/rwjcNqWkyr82Mcg8b0vjX8OJpZFy/FKjJmw6wV7t44kK6kW7A==", + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.4.tgz", + "integrity": "sha512-JbbpPhp38UmXDDAu60RJmbeme37Jbgsm7NrHGgzYYFKmblzRUh6Pa641dII6LsjwF4XlScDrde2UAzDo/b9KPw==", "license": "MIT", "dependencies": { - "@floating-ui/dom": "^1.0.0" + "@floating-ui/dom": "^1.7.2" }, "peerDependencies": { "react": ">=16.8.0", @@ -4540,9 +4330,9 @@ } }, "node_modules/@floating-ui/utils": { - "version": "0.2.9", - "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.9.tgz", - "integrity": "sha512-MDWhGtE+eHw5JW7lq4qhc5yRLS11ERl1c7Z6Xd0a58DozHES6EnNNwUWbMiG4J9Cgj053Bhk8zvlhFYKVhULwg==", + "version": "0.2.10", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.10.tgz", + "integrity": "sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ==", "license": "MIT" }, "node_modules/@hapi/hoek": { @@ -4634,17 +4424,13 @@ } }, "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz", - "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", + "version": "0.3.12", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.12.tgz", + "integrity": "sha512-OuLGC46TjB5BbN1dH8JULVVZY4WTdkF7tV9Ys6wLL1rubZnCMstOhNHueU5bLCrnRuDhKPDM4g6sw4Bel5Gzqg==", "license": "MIT", "dependencies": { - "@jridgewell/set-array": "^1.2.1", - "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/sourcemap-codec": "^1.5.0", "@jridgewell/trace-mapping": "^0.3.24" - }, - "engines": { - "node": ">=6.0.0" } }, "node_modules/@jridgewell/resolve-uri": { @@ -4656,19 +4442,10 @@ "node": ">=6.0.0" } }, - "node_modules/@jridgewell/set-array": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", - "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, "node_modules/@jridgewell/source-map": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz", - "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==", + "version": "0.3.10", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.10.tgz", + "integrity": "sha512-0pPkgz9dY+bijgistcTTJ5mR+ocqRXLuhXHYdzoMmmoJ2C9S46RCm2GMUbatPEUK9Yjy26IrAy8D/M00lLkv+Q==", "license": "MIT", "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", @@ -4676,15 +4453,15 @@ } }, "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", - "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.4.tgz", + "integrity": "sha512-VT2+G1VQs/9oz078bLrYbecdZKs912zQlkelYpuf+SXF+QvZDYJlbx/LSx+meSAwdDFnF8FVXW92AVjjkVmgFw==", "license": "MIT" }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.25", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", - "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "version": "0.3.29", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.29.tgz", + "integrity": "sha512-uw6guiW/gcAGPDhLmd77/6lW8QLeiV5RUTsAX46Db6oLhGaVj4lhnPwb184s1bkc8kdVg/+h988dro8GRDpmYQ==", "license": "MIT", "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", @@ -4760,56 +4537,56 @@ } }, "node_modules/@module-federation/error-codes": { - "version": "0.14.3", - "resolved": "https://registry.npmjs.org/@module-federation/error-codes/-/error-codes-0.14.3.tgz", - "integrity": "sha512-sBJ3XKU9g5Up31jFeXPFsD8AgORV7TLO/cCSMuRewSfgYbG/3vSKLJmfHrO6+PvjZSb9VyV2UaF02ojktW65vw==", + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/@module-federation/error-codes/-/error-codes-0.15.0.tgz", + "integrity": "sha512-CFJSF+XKwTcy0PFZ2l/fSUpR4z247+Uwzp1sXVkdIfJ/ATsnqf0Q01f51qqSEA6MYdQi6FKos9FIcu3dCpQNdg==", "license": "MIT" }, "node_modules/@module-federation/runtime": { - "version": "0.14.3", - "resolved": "https://registry.npmjs.org/@module-federation/runtime/-/runtime-0.14.3.tgz", - "integrity": "sha512-7ZHpa3teUDVhraYdxQGkfGHzPbjna4LtwbpudgzAxSLLFxLDNanaxCuSeIgSM9c+8sVUNC9kvzUgJEZB0krPJw==", + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/@module-federation/runtime/-/runtime-0.15.0.tgz", + "integrity": "sha512-dTPsCNum9Bhu3yPOcrPYq0YnM9eCMMMNB1wuiqf1+sFbQlNApF0vfZxooqz3ln0/MpgE0jerVvFsLVGfqvC9Ug==", "license": "MIT", "dependencies": { - "@module-federation/error-codes": "0.14.3", - "@module-federation/runtime-core": "0.14.3", - "@module-federation/sdk": "0.14.3" + "@module-federation/error-codes": "0.15.0", + "@module-federation/runtime-core": "0.15.0", + "@module-federation/sdk": "0.15.0" } }, "node_modules/@module-federation/runtime-core": { - "version": "0.14.3", - "resolved": "https://registry.npmjs.org/@module-federation/runtime-core/-/runtime-core-0.14.3.tgz", - "integrity": "sha512-xMFQXflLVW/AJTWb4soAFP+LB4XuhE7ryiLIX8oTyUoBBgV6U2OPghnFljPjeXbud72O08NYlQ1qsHw1kN/V8Q==", + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/@module-federation/runtime-core/-/runtime-core-0.15.0.tgz", + "integrity": "sha512-RYzI61fRDrhyhaEOXH3AgIGlHiot0wPFXu7F43cr+ZnTi+VlSYWLdlZ4NBuT9uV6JSmH54/c+tEZm5SXgKR2sQ==", "license": "MIT", "dependencies": { - "@module-federation/error-codes": "0.14.3", - "@module-federation/sdk": "0.14.3" + "@module-federation/error-codes": "0.15.0", + "@module-federation/sdk": "0.15.0" } }, "node_modules/@module-federation/runtime-tools": { - "version": "0.14.3", - "resolved": "https://registry.npmjs.org/@module-federation/runtime-tools/-/runtime-tools-0.14.3.tgz", - "integrity": "sha512-QBETX7iMYXdSa3JtqFlYU+YkpymxETZqyIIRiqg0gW+XGpH3jgU68yjrme2NBJp7URQi/CFZG8KWtfClk0Pjgw==", + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/@module-federation/runtime-tools/-/runtime-tools-0.15.0.tgz", + "integrity": "sha512-kzFn3ObUeBp5vaEtN1WMxhTYBuYEErxugu1RzFUERD21X3BZ+b4cWwdFJuBDlsmVjctIg/QSOoZoPXRKAO0foA==", "license": "MIT", "dependencies": { - "@module-federation/runtime": "0.14.3", - "@module-federation/webpack-bundler-runtime": "0.14.3" + "@module-federation/runtime": "0.15.0", + "@module-federation/webpack-bundler-runtime": "0.15.0" } }, "node_modules/@module-federation/sdk": { - "version": "0.14.3", - "resolved": "https://registry.npmjs.org/@module-federation/sdk/-/sdk-0.14.3.tgz", - "integrity": "sha512-THJZMfbXpqjQOLblCQ8jjcBFFXsGRJwUWE9l/Q4SmuCSKMgAwie7yLT0qSGrHmyBYrsUjAuy+xNB4nfKP0pnGw==", + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/@module-federation/sdk/-/sdk-0.15.0.tgz", + "integrity": "sha512-PWiYbGcJrKUD6JZiEPihrXhV3bgXdll4bV7rU+opV7tHaun+Z0CdcawjZ82Xnpb8MCPGmqHwa1MPFeUs66zksw==", "license": "MIT" }, "node_modules/@module-federation/webpack-bundler-runtime": { - "version": "0.14.3", - "resolved": "https://registry.npmjs.org/@module-federation/webpack-bundler-runtime/-/webpack-bundler-runtime-0.14.3.tgz", - "integrity": "sha512-hIyJFu34P7bY2NeMIUHAS/mYUHEY71VTAsN0A0AqEJFSVPszheopu9VdXq0VDLrP9KQfuXT8SDxeYeJXyj0mgA==", + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/@module-federation/webpack-bundler-runtime/-/webpack-bundler-runtime-0.15.0.tgz", + "integrity": "sha512-i+3wu2Ljh2TmuUpsnjwZVupOVqV50jP0ndA8PSP4gwMKlgdGeaZ4VH5KkHAXGr2eiYUxYLMrJXz1+eILJqeGDg==", "license": "MIT", "dependencies": { - "@module-federation/runtime": "0.14.3", - "@module-federation/sdk": "0.14.3" + "@module-federation/runtime": "0.15.0", + "@module-federation/sdk": "0.15.0" } }, "node_modules/@mui/base": { @@ -4876,9 +4653,9 @@ } }, "node_modules/@mui/core-downloads-tracker": { - "version": "5.17.1", - "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-5.17.1.tgz", - "integrity": "sha512-OcZj+cs6EfUD39IoPBOgN61zf1XFVY+imsGoBDwXeSq2UHJZE3N59zzBOVjclck91Ne3e9gudONOeILvHCIhUA==", + "version": "5.18.0", + "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-5.18.0.tgz", + "integrity": "sha512-jbhwoQ1AY200PSSOrNXmrFCaSDSJWP7qk6urkTmIirvRXDROkqe+QwcLlUiw/PrREwsIF/vm3/dAXvjlMHF0RA==", "license": "MIT", "funding": { "type": "opencollective", @@ -4886,9 +4663,9 @@ } }, "node_modules/@mui/icons-material": { - "version": "5.17.1", - "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-5.17.1.tgz", - "integrity": "sha512-CN86LocjkunFGG0yPlO4bgqHkNGgaEOEc3X/jG5Bzm401qYw79/SaLrofA7yAKCCXAGdIGnLoMHohc3+ubs95A==", + "version": "5.18.0", + "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-5.18.0.tgz", + "integrity": "sha512-1s0vEZj5XFXDMmz3Arl/R7IncFqJ+WQ95LDp1roHWGDE2oCO3IS4/hmiOv1/8SD9r6B7tv9GLiqVZYHo+6PkTg==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.23.9" @@ -4912,14 +4689,14 @@ } }, "node_modules/@mui/material": { - "version": "5.17.1", - "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.17.1.tgz", - "integrity": "sha512-2B33kQf+GmPnrvXXweWAx+crbiUEsxCdCN979QDYnlH9ox4pd+0/IBriWLV+l6ORoBF60w39cWjFnJYGFdzXcw==", + "version": "5.18.0", + "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.18.0.tgz", + "integrity": "sha512-bbH/HaJZpFtXGvWg3TsBWG4eyt3gah3E7nCNU8GLyRjVoWcA91Vm/T+sjHfUcwgJSw9iLtucfHBoq+qW/T30aA==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.23.9", - "@mui/core-downloads-tracker": "^5.17.1", - "@mui/system": "^5.17.1", + "@mui/core-downloads-tracker": "^5.18.0", + "@mui/system": "^5.18.0", "@mui/types": "~7.2.15", "@mui/utils": "^5.17.1", "@popperjs/core": "^2.11.8", @@ -4984,13 +4761,14 @@ } }, "node_modules/@mui/styled-engine": { - "version": "5.16.14", - "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.16.14.tgz", - "integrity": "sha512-UAiMPZABZ7p8mUW4akDV6O7N3+4DatStpXMZwPlt+H/dA0lt67qawN021MNND+4QTpjaiMYxbhKZeQcyWCbuKw==", + "version": "5.18.0", + "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.18.0.tgz", + "integrity": "sha512-BN/vKV/O6uaQh2z5rXV+MBlVrEkwoS/TK75rFQ2mjxA7+NBo8qtTAOA4UaM0XeJfn7kh2wZ+xQw2HAx0u+TiBg==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.23.9", "@emotion/cache": "^11.13.5", + "@emotion/serialize": "^1.3.3", "csstype": "^3.1.3", "prop-types": "^15.8.1" }, @@ -5016,14 +4794,14 @@ } }, "node_modules/@mui/system": { - "version": "5.17.1", - "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.17.1.tgz", - "integrity": "sha512-aJrmGfQpyF0U4D4xYwA6ueVtQcEMebET43CUmKMP7e7iFh3sMIF3sBR0l8Urb4pqx1CBjHAaWgB0ojpND4Q3Jg==", + "version": "5.18.0", + "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.18.0.tgz", + "integrity": "sha512-ojZGVcRWqWhu557cdO3pWHloIGJdzVtxs3rk0F9L+x55LsUjcMUVkEhiF7E4TMxZoF9MmIHGGs0ZX3FDLAf0Xw==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.23.9", "@mui/private-theming": "^5.17.1", - "@mui/styled-engine": "^5.16.14", + "@mui/styled-engine": "^5.18.0", "@mui/types": "~7.2.15", "@mui/utils": "^5.17.1", "clsx": "^2.1.0", @@ -5165,6 +4943,18 @@ } } }, + "node_modules/@napi-rs/wasm-runtime": { + "version": "0.2.11", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.11.tgz", + "integrity": "sha512-9DPkXtvHydrcOsopiYpUgPHpmj0HWZKMUnL2dZqpvC42lsratuBG06V5ipyno0fUek5VlFsNQ+AcFATSrJXgMA==", + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "^1.4.3", + "@emnapi/runtime": "^1.4.3", + "@tybys/wasm-util": "^0.9.0" + } + }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -5219,105 +5009,335 @@ "node": ">=12.22.0" } }, - "node_modules/@pnpm/network.ca-file": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@pnpm/network.ca-file/-/network.ca-file-1.0.2.tgz", - "integrity": "sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA==", + "node_modules/@pnpm/network.ca-file": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@pnpm/network.ca-file/-/network.ca-file-1.0.2.tgz", + "integrity": "sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA==", + "license": "MIT", + "dependencies": { + "graceful-fs": "4.2.10" + }, + "engines": { + "node": ">=12.22.0" + } + }, + "node_modules/@pnpm/network.ca-file/node_modules/graceful-fs": { + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", + "license": "ISC" + }, + "node_modules/@pnpm/npm-conf": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/@pnpm/npm-conf/-/npm-conf-2.3.1.tgz", + "integrity": "sha512-c83qWb22rNRuB0UaVCI0uRPNRr8Z0FWnEIvT47jiHAmOIUHbBOg5XvV7pM5x+rKn9HRpjxquDbXYSXr3fAKFcw==", + "license": "MIT", + "dependencies": { + "@pnpm/config.env-replace": "^1.1.0", + "@pnpm/network.ca-file": "^1.0.1", + "config-chain": "^1.1.11" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@polka/url": { + "version": "1.0.0-next.29", + "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.29.tgz", + "integrity": "sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==", + "license": "MIT" + }, + "node_modules/@popperjs/core": { + "version": "2.11.8", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", + "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/popperjs" + } + }, + "node_modules/@radix-ui/primitive": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.2.tgz", + "integrity": "sha512-XnbHrrprsNqZKQhStrSwgRUQzoCI1glLzdw79xiZPoofhGICeZRSQ3dIxAKH1gb3OHfNf4d6f+vAv3kil2eggA==", + "license": "MIT" + }, + "node_modules/@radix-ui/react-compose-refs": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.2.tgz", + "integrity": "sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-context": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.2.tgz", + "integrity": "sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-focus-guards": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-1.1.2.tgz", + "integrity": "sha512-fyjAACV62oPV925xFCrH8DR5xWhg9KYtJT4s3u54jxp+L/hbpTY2kIeEFFbFe+a/HCE94zGQMZLIpVTPVZDhaA==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-id": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.1.1.tgz", + "integrity": "sha512-kGkGegYIdQsOb4XjsfM97rXsiHaBwco+hFI66oO4s9LU+PLAC5oJ7khdOVFxkhsmlbpUqDAvXw11CluXP+jkHg==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-popover": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/@radix-ui/react-popover/-/react-popover-1.1.14.tgz", + "integrity": "sha512-ODz16+1iIbGUfFEfKx2HTPKizg2MN39uIOV8MXeHnmdd3i/N9Wt7vU46wbHsqA0xoaQyXVcs0KIlBdOA2Y95bw==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.2", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-dismissable-layer": "1.1.10", + "@radix-ui/react-focus-guards": "1.1.2", + "@radix-ui/react-focus-scope": "1.1.7", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-popper": "1.2.7", + "@radix-ui/react-portal": "1.1.9", + "@radix-ui/react-presence": "1.1.4", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-slot": "1.2.3", + "@radix-ui/react-use-controllable-state": "1.2.2", + "aria-hidden": "^1.2.4", + "react-remove-scroll": "^2.6.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-popover/node_modules/@radix-ui/react-dismissable-layer": { + "version": "1.1.10", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.10.tgz", + "integrity": "sha512-IM1zzRV4W3HtVgftdQiiOmA0AdJlCtMLe00FXaHwgt3rAnNsIyDqshvkIW3hj/iu5hu8ERP7KIYki6NkqDxAwQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.2", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-callback-ref": "1.1.1", + "@radix-ui/react-use-escape-keydown": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-popover/node_modules/@radix-ui/react-focus-scope": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.1.7.tgz", + "integrity": "sha512-t2ODlkXBQyn7jkl6TNaw/MtVEVvIGelJDCG41Okq/KwUsJBwQ4XVZsHAVUkK4mBv3ewiAS3PGuUWuY2BoK4ZUw==", "license": "MIT", "dependencies": { - "graceful-fs": "4.2.10" + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-callback-ref": "1.1.1" }, - "engines": { - "node": ">=12.22.0" + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } } }, - "node_modules/@pnpm/network.ca-file/node_modules/graceful-fs": { - "version": "4.2.10", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", - "license": "ISC" - }, - "node_modules/@pnpm/npm-conf": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/@pnpm/npm-conf/-/npm-conf-2.3.1.tgz", - "integrity": "sha512-c83qWb22rNRuB0UaVCI0uRPNRr8Z0FWnEIvT47jiHAmOIUHbBOg5XvV7pM5x+rKn9HRpjxquDbXYSXr3fAKFcw==", + "node_modules/@radix-ui/react-popover/node_modules/@radix-ui/react-popper": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@radix-ui/react-popper/-/react-popper-1.2.7.tgz", + "integrity": "sha512-IUFAccz1JyKcf/RjB552PlWwxjeCJB8/4KxT7EhBHOJM+mN7LdW+B3kacJXILm32xawcMMjb2i0cIZpo+f9kiQ==", "license": "MIT", "dependencies": { - "@pnpm/config.env-replace": "^1.1.0", - "@pnpm/network.ca-file": "^1.0.1", - "config-chain": "^1.1.11" + "@floating-ui/react-dom": "^2.0.0", + "@radix-ui/react-arrow": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-callback-ref": "1.1.1", + "@radix-ui/react-use-layout-effect": "1.1.1", + "@radix-ui/react-use-rect": "1.1.1", + "@radix-ui/react-use-size": "1.1.1", + "@radix-ui/rect": "1.1.1" }, - "engines": { - "node": ">=12" + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } } }, - "node_modules/@polka/url": { - "version": "1.0.0-next.29", - "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.29.tgz", - "integrity": "sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==", - "license": "MIT" - }, - "node_modules/@popperjs/core": { - "version": "2.11.8", - "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", - "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", + "node_modules/@radix-ui/react-popover/node_modules/@radix-ui/react-popper/node_modules/@radix-ui/react-arrow": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/@radix-ui/react-arrow/-/react-arrow-1.1.7.tgz", + "integrity": "sha512-F+M1tLhO+mlQaOWspE8Wstg+z6PwxwRd8oQ8IXceWz92kfAmalTRf0EjrouQeo7QssEPfCn05B4Ihs1K9WQ/7w==", "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/popperjs" + "dependencies": { + "@radix-ui/react-primitive": "2.1.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } } }, - "node_modules/@radix-ui/primitive": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.2.tgz", - "integrity": "sha512-XnbHrrprsNqZKQhStrSwgRUQzoCI1glLzdw79xiZPoofhGICeZRSQ3dIxAKH1gb3OHfNf4d6f+vAv3kil2eggA==", - "license": "MIT" - }, - "node_modules/@radix-ui/react-compose-refs": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.2.tgz", - "integrity": "sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg==", + "node_modules/@radix-ui/react-popover/node_modules/@radix-ui/react-portal": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.1.9.tgz", + "integrity": "sha512-bpIxvq03if6UNwXZ+HTK71JLh4APvnXntDc6XOX8UVq4XQOVl7lwok0AvIl+b8zgCw3fSaVTZMpAPPagXbKmHQ==", "license": "MIT", + "dependencies": { + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-layout-effect": "1.1.1" + }, "peerDependencies": { "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "peerDependenciesMeta": { "@types/react": { "optional": true + }, + "@types/react-dom": { + "optional": true } } }, - "node_modules/@radix-ui/react-context": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.2.tgz", - "integrity": "sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA==", + "node_modules/@radix-ui/react-popover/node_modules/@radix-ui/react-presence": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.1.4.tgz", + "integrity": "sha512-ueDqRbdc4/bkaQT3GIpLQssRlFgWaL/U2z/S31qRwwLWoxHLgry3SIfCwhxeQNbirEUXFa+lq3RL3oBYXtcmIA==", "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-use-layout-effect": "1.1.1" + }, "peerDependencies": { "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "peerDependenciesMeta": { "@types/react": { "optional": true + }, + "@types/react-dom": { + "optional": true } } }, - "node_modules/@radix-ui/react-id": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.1.1.tgz", - "integrity": "sha512-kGkGegYIdQsOb4XjsfM97rXsiHaBwco+hFI66oO4s9LU+PLAC5oJ7khdOVFxkhsmlbpUqDAvXw11CluXP+jkHg==", + "node_modules/@radix-ui/react-popover/node_modules/@radix-ui/react-primitive": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.3.tgz", + "integrity": "sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ==", "license": "MIT", "dependencies": { - "@radix-ui/react-use-layout-effect": "1.1.1" + "@radix-ui/react-slot": "1.2.3" }, "peerDependencies": { "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "peerDependenciesMeta": { "@types/react": { "optional": true + }, + "@types/react-dom": { + "optional": true } } }, @@ -5340,23 +5360,23 @@ } }, "node_modules/@radix-ui/react-tooltip": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-tooltip/-/react-tooltip-1.2.0.tgz", - "integrity": "sha512-b1Sdc75s7zN9B8ONQTGBSHL3XS8+IcjcOIY51fhM4R1Hx8s0YbgqgyNZiri4qcYMVZK8hfCZVBiyCm7N9rs0rw==", + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@radix-ui/react-tooltip/-/react-tooltip-1.2.7.tgz", + "integrity": "sha512-Ap+fNYwKTYJ9pzqW+Xe2HtMRbQ/EeWkj2qykZ6SuEV4iS/o1bZI5ssJbk4D2r8XuDuOBVz/tIx2JObtuqU+5Zw==", "license": "MIT", "dependencies": { "@radix-ui/primitive": "1.1.2", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-dismissable-layer": "1.1.6", + "@radix-ui/react-dismissable-layer": "1.1.10", "@radix-ui/react-id": "1.1.1", - "@radix-ui/react-popper": "1.2.3", - "@radix-ui/react-portal": "1.1.5", - "@radix-ui/react-presence": "1.1.3", - "@radix-ui/react-primitive": "2.0.3", - "@radix-ui/react-slot": "1.2.0", - "@radix-ui/react-use-controllable-state": "1.1.1", - "@radix-ui/react-visually-hidden": "1.1.3" + "@radix-ui/react-popper": "1.2.7", + "@radix-ui/react-portal": "1.1.9", + "@radix-ui/react-presence": "1.1.4", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-slot": "1.2.3", + "@radix-ui/react-use-controllable-state": "1.2.2", + "@radix-ui/react-visually-hidden": "1.2.3" }, "peerDependencies": { "@types/react": "*", @@ -5374,14 +5394,14 @@ } }, "node_modules/@radix-ui/react-tooltip/node_modules/@radix-ui/react-dismissable-layer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.6.tgz", - "integrity": "sha512-7gpgMT2gyKym9Jz2ZhlRXSg2y6cNQIK8d/cqBZ0RBCaps8pFryCWXiUKI+uHGFrhMrbGUP7U6PWgiXzIxoyF3Q==", + "version": "1.1.10", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.10.tgz", + "integrity": "sha512-IM1zzRV4W3HtVgftdQiiOmA0AdJlCtMLe00FXaHwgt3rAnNsIyDqshvkIW3hj/iu5hu8ERP7KIYki6NkqDxAwQ==", "license": "MIT", "dependencies": { "@radix-ui/primitive": "1.1.2", "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-primitive": "2.0.3", + "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-use-callback-ref": "1.1.1", "@radix-ui/react-use-escape-keydown": "1.1.1" }, @@ -5401,16 +5421,16 @@ } }, "node_modules/@radix-ui/react-tooltip/node_modules/@radix-ui/react-popper": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-popper/-/react-popper-1.2.3.tgz", - "integrity": "sha512-iNb9LYUMkne9zIahukgQmHlSBp9XWGeQQ7FvUGNk45ywzOb6kQa+Ca38OphXlWDiKvyneo9S+KSJsLfLt8812A==", + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@radix-ui/react-popper/-/react-popper-1.2.7.tgz", + "integrity": "sha512-IUFAccz1JyKcf/RjB552PlWwxjeCJB8/4KxT7EhBHOJM+mN7LdW+B3kacJXILm32xawcMMjb2i0cIZpo+f9kiQ==", "license": "MIT", "dependencies": { "@floating-ui/react-dom": "^2.0.0", - "@radix-ui/react-arrow": "1.1.3", + "@radix-ui/react-arrow": "1.1.7", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-primitive": "2.0.3", + "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-use-callback-ref": "1.1.1", "@radix-ui/react-use-layout-effect": "1.1.1", "@radix-ui/react-use-rect": "1.1.1", @@ -5433,12 +5453,12 @@ } }, "node_modules/@radix-ui/react-tooltip/node_modules/@radix-ui/react-popper/node_modules/@radix-ui/react-arrow": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-arrow/-/react-arrow-1.1.3.tgz", - "integrity": "sha512-2dvVU4jva0qkNZH6HHWuSz5FN5GeU5tymvCgutF8WaXz9WnD1NgUhy73cqzkjkN4Zkn8lfTPv5JIfrC221W+Nw==", + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/@radix-ui/react-arrow/-/react-arrow-1.1.7.tgz", + "integrity": "sha512-F+M1tLhO+mlQaOWspE8Wstg+z6PwxwRd8oQ8IXceWz92kfAmalTRf0EjrouQeo7QssEPfCn05B4Ihs1K9WQ/7w==", "license": "MIT", "dependencies": { - "@radix-ui/react-primitive": "2.0.3" + "@radix-ui/react-primitive": "2.1.3" }, "peerDependencies": { "@types/react": "*", @@ -5456,12 +5476,12 @@ } }, "node_modules/@radix-ui/react-tooltip/node_modules/@radix-ui/react-portal": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.1.5.tgz", - "integrity": "sha512-ps/67ZqsFm+Mb6lSPJpfhRLrVL2i2fntgCmGMqqth4eaGUf+knAuuRtWVJrNjUhExgmdRqftSgzpf0DF0n6yXA==", + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.1.9.tgz", + "integrity": "sha512-bpIxvq03if6UNwXZ+HTK71JLh4APvnXntDc6XOX8UVq4XQOVl7lwok0AvIl+b8zgCw3fSaVTZMpAPPagXbKmHQ==", "license": "MIT", "dependencies": { - "@radix-ui/react-primitive": "2.0.3", + "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-use-layout-effect": "1.1.1" }, "peerDependencies": { @@ -5480,9 +5500,9 @@ } }, "node_modules/@radix-ui/react-tooltip/node_modules/@radix-ui/react-presence": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.1.3.tgz", - "integrity": "sha512-IrVLIhskYhH3nLvtcBLQFZr61tBG7wx7O3kEmdzcYwRGAEBmBicGGL7ATzNgruYJ3xBTbuzEEq9OXJM3PAX3tA==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.1.4.tgz", + "integrity": "sha512-ueDqRbdc4/bkaQT3GIpLQssRlFgWaL/U2z/S31qRwwLWoxHLgry3SIfCwhxeQNbirEUXFa+lq3RL3oBYXtcmIA==", "license": "MIT", "dependencies": { "@radix-ui/react-compose-refs": "1.1.2", @@ -5504,12 +5524,12 @@ } }, "node_modules/@radix-ui/react-tooltip/node_modules/@radix-ui/react-primitive": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.0.3.tgz", - "integrity": "sha512-Pf/t/GkndH7CQ8wE2hbkXA+WyZ83fhQQn5DDmwDiDo6AwN/fhaH8oqZ0jRjMrO2iaMhDi6P1HRx6AZwyMinY1g==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.3.tgz", + "integrity": "sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ==", "license": "MIT", "dependencies": { - "@radix-ui/react-slot": "1.2.0" + "@radix-ui/react-slot": "1.2.3" }, "peerDependencies": { "@types/react": "*", @@ -5526,31 +5546,13 @@ } } }, - "node_modules/@radix-ui/react-tooltip/node_modules/@radix-ui/react-slot": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.0.tgz", - "integrity": "sha512-ujc+V6r0HNDviYqIK3rW4ffgYiZ8g5DEHrGJVk4x7kTlLXRDILnKX9vAUYeIsLOoDpDJ0ujpqMkjH4w2ofuo6w==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-compose-refs": "1.1.2" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, "node_modules/@radix-ui/react-tooltip/node_modules/@radix-ui/react-visually-hidden": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-visually-hidden/-/react-visually-hidden-1.1.3.tgz", - "integrity": "sha512-oXSF3ZQRd5fvomd9hmUCb2EHSZbPp3ZSHAHJJU/DlF9XoFkJBBW8RHU/E8WEH+RbSfJd/QFA0sl8ClJXknBwHQ==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-visually-hidden/-/react-visually-hidden-1.2.3.tgz", + "integrity": "sha512-pzJq12tEaaIhqjbzpCuv/OypJY/BPavOofm+dbab+MHLajy277+1lLm6JFcGgF5eskJ6mquGirhXY2GD/8u8Ug==", "license": "MIT", "dependencies": { - "@radix-ui/react-primitive": "2.0.3" + "@radix-ui/react-primitive": "2.1.3" }, "peerDependencies": { "@types/react": "*", @@ -5583,12 +5585,31 @@ } }, "node_modules/@radix-ui/react-use-controllable-state": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.1.1.tgz", - "integrity": "sha512-YnEXIy8/ga01Y1PN0VfaNH//MhA91JlEGVBDxDzROqwrAtG5Yr2QGEPz8A/rJA3C7ZAHryOYGaUv8fLSW2H/mg==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.2.2.tgz", + "integrity": "sha512-BjasUjixPFdS+NKkypcyyN5Pmg83Olst0+c6vGov0diwTEo6mgdqVR6hxcEgFuh4QrAs7Rc+9KuGJ9TVCj0Zzg==", "license": "MIT", "dependencies": { - "@radix-ui/react-use-callback-ref": "1.1.1" + "@radix-ui/react-use-effect-event": "0.0.2", + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-effect-event": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-effect-event/-/react-use-effect-event-0.0.2.tgz", + "integrity": "sha512-Qp8WbZOBe+blgpuUT+lw2xheLP8q0oatc9UpmiemEICxGvFLYmHm9QowVZGHtJlGbS6A6yJ3iViad/2cVjnOiA==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-layout-effect": "1.1.1" }, "peerDependencies": { "@types/react": "*", @@ -5676,26 +5697,27 @@ "license": "MIT" }, "node_modules/@rspack/binding": { - "version": "1.3.15", - "resolved": "https://registry.npmjs.org/@rspack/binding/-/binding-1.3.15.tgz", - "integrity": "sha512-utNPuJglLO5lW9XbwIqjB7+2ilMo6JkuVLTVdnNVKU94FW7asn9F/qV+d+MgjUVqU1QPCGm0NuGO9xhbgeJ7pg==", + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/@rspack/binding/-/binding-1.4.5.tgz", + "integrity": "sha512-hO7DrZMMOyzwK7EEYfHMJmWhsNjeYLr39pEnXOWeuCCcwus6e/QNSSf2m/2mSFf0JeINwQqHkA1JvJEZ5JSj6g==", "license": "MIT", "optionalDependencies": { - "@rspack/binding-darwin-arm64": "1.3.15", - "@rspack/binding-darwin-x64": "1.3.15", - "@rspack/binding-linux-arm64-gnu": "1.3.15", - "@rspack/binding-linux-arm64-musl": "1.3.15", - "@rspack/binding-linux-x64-gnu": "1.3.15", - "@rspack/binding-linux-x64-musl": "1.3.15", - "@rspack/binding-win32-arm64-msvc": "1.3.15", - "@rspack/binding-win32-ia32-msvc": "1.3.15", - "@rspack/binding-win32-x64-msvc": "1.3.15" + "@rspack/binding-darwin-arm64": "1.4.5", + "@rspack/binding-darwin-x64": "1.4.5", + "@rspack/binding-linux-arm64-gnu": "1.4.5", + "@rspack/binding-linux-arm64-musl": "1.4.5", + "@rspack/binding-linux-x64-gnu": "1.4.5", + "@rspack/binding-linux-x64-musl": "1.4.5", + "@rspack/binding-wasm32-wasi": "1.4.5", + "@rspack/binding-win32-arm64-msvc": "1.4.5", + "@rspack/binding-win32-ia32-msvc": "1.4.5", + "@rspack/binding-win32-x64-msvc": "1.4.5" } }, "node_modules/@rspack/binding-darwin-arm64": { - "version": "1.3.15", - "resolved": "https://registry.npmjs.org/@rspack/binding-darwin-arm64/-/binding-darwin-arm64-1.3.15.tgz", - "integrity": "sha512-f+DnVRENRdVe+ufpZeqTtWAUDSTnP48jVo7x9KWsXf8XyJHUi+eHKEPrFoy1HvL1/k5yJ3HVnFBh1Hb9cNIwSg==", + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/@rspack/binding-darwin-arm64/-/binding-darwin-arm64-1.4.5.tgz", + "integrity": "sha512-rK8mJ+85cXrGSTZvr5vqI17TDimAUWYjl0T+JEg5MTqRNbpyovbGHbrrsQyIicwaFOS1wWkaLrBolC/+/FLUeg==", "cpu": [ "arm64" ], @@ -5706,9 +5728,9 @@ ] }, "node_modules/@rspack/binding-darwin-x64": { - "version": "1.3.15", - "resolved": "https://registry.npmjs.org/@rspack/binding-darwin-x64/-/binding-darwin-x64-1.3.15.tgz", - "integrity": "sha512-TfUvEIBqYUT2OK01BYXb2MNcZeZIhAnJy/5aj0qV0uy4KlvwW63HYcKWa1sFd4Ac7bnGShDkanvP3YEuHOFOyg==", + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/@rspack/binding-darwin-x64/-/binding-darwin-x64-1.4.5.tgz", + "integrity": "sha512-6eOhh18VD8x5+SJrs/K6XiDw+FYffzDMsI3Sz78mQW5xvHYzN3HJxIw7oG7UYXqF5I2yORmqvdxV1aAnv8Fc4g==", "cpu": [ "x64" ], @@ -5719,9 +5741,9 @@ ] }, "node_modules/@rspack/binding-linux-arm64-gnu": { - "version": "1.3.15", - "resolved": "https://registry.npmjs.org/@rspack/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.3.15.tgz", - "integrity": "sha512-D/YjYk9snKvYm1Elotq8/GsEipB4ZJWVv/V8cZ+ohhFNOPzygENi6JfyI06TryBTQiN0/JDZqt/S9RaWBWnMqw==", + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/@rspack/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.4.5.tgz", + "integrity": "sha512-vnz5OItcPREgz+hVqx14HRf0aJQ7yI/2ZEbeTC+Y1JSCbeYAcu6NXYVXDwTOgCNOp1AdMR+rmItHWiJ7goI//Q==", "cpu": [ "arm64" ], @@ -5732,9 +5754,9 @@ ] }, "node_modules/@rspack/binding-linux-arm64-musl": { - "version": "1.3.15", - "resolved": "https://registry.npmjs.org/@rspack/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.3.15.tgz", - "integrity": "sha512-lJbBsPMOiR0hYPCSM42yp7QiZjfo0ALtX7ws2wURpsQp3BMfRVAmXU3Ixpo2XCRtG1zj8crHaCmAWOJTS0smsA==", + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/@rspack/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.4.5.tgz", + "integrity": "sha512-E4dUEDpAsQ5jTvt8AXs0VY3vxTzSf07CM5zi797VaFzZzbcZqAoBmlAxYTSyl7/BgAxHSg8AYJS5c8l03vXM4w==", "cpu": [ "arm64" ], @@ -5745,9 +5767,9 @@ ] }, "node_modules/@rspack/binding-linux-x64-gnu": { - "version": "1.3.15", - "resolved": "https://registry.npmjs.org/@rspack/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.3.15.tgz", - "integrity": "sha512-qGB8ucHklrzNg6lsAS36VrBsCbOw0acgpQNqTE5cuHWrp1Pu3GFTRiFEogenxEmzoRbohMZt0Ev5grivrcgKBQ==", + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/@rspack/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.4.5.tgz", + "integrity": "sha512-XQxibZY+joqRfoJQwT1sfN68pRExOvJniWBUJfov6ShG/DFSVbMJ2UTwv5pbruIXA/lLnk7KblPdF8pO0WWQvw==", "cpu": [ "x64" ], @@ -5758,9 +5780,9 @@ ] }, "node_modules/@rspack/binding-linux-x64-musl": { - "version": "1.3.15", - "resolved": "https://registry.npmjs.org/@rspack/binding-linux-x64-musl/-/binding-linux-x64-musl-1.3.15.tgz", - "integrity": "sha512-qRn6e40fLQP+N2rQD8GAj/h4DakeTIho32VxTIaHRVuzw68ZD7VmKkwn55ssN370ejmey35ZdoNFNE12RBrMZA==", + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/@rspack/binding-linux-x64-musl/-/binding-linux-x64-musl-1.4.5.tgz", + "integrity": "sha512-bOZmkCZamOz/+D3AA3uHII3rLIx4WtPk+KbDe3nfIVHhgxUK1nmv0vHtKzDA5iplucJ4ha/Rx9TEFyRwnBJH0A==", "cpu": [ "x64" ], @@ -5770,10 +5792,23 @@ "linux" ] }, + "node_modules/@rspack/binding-wasm32-wasi": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/@rspack/binding-wasm32-wasi/-/binding-wasm32-wasi-1.4.5.tgz", + "integrity": "sha512-LRyln0jg2FblwFQg+0lPVc/bvDeo3A3EVWQtsTtOwjb4cjAG/Zqo5Q0VobaJTKgBOF9eAHTo9IL92SSj433+Eg==", + "cpu": [ + "wasm32" + ], + "license": "MIT", + "optional": true, + "dependencies": { + "@napi-rs/wasm-runtime": "^0.2.11" + } + }, "node_modules/@rspack/binding-win32-arm64-msvc": { - "version": "1.3.15", - "resolved": "https://registry.npmjs.org/@rspack/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.3.15.tgz", - "integrity": "sha512-7uJ7dWhO1nWXJiCss6Rslz8hoAxAhFpwpbWja3eHgRb7O4NPHg6MWw63AQSI2aFVakreenfu9yXQqYfpVWJ2dA==", + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/@rspack/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.4.5.tgz", + "integrity": "sha512-JWc15Mof/aC41UQSZLwa6oEsPYaYCApW0152Abhnt27qir2pfqYcT5qWt26OJvFDJoe+KzpIG1H91yJviChYYw==", "cpu": [ "arm64" ], @@ -5784,9 +5819,9 @@ ] }, "node_modules/@rspack/binding-win32-ia32-msvc": { - "version": "1.3.15", - "resolved": "https://registry.npmjs.org/@rspack/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-1.3.15.tgz", - "integrity": "sha512-UsaWTYCjDiSCB0A0qETgZk4QvhwfG8gCrO4SJvA+QSEWOmgSai1YV70prFtLLIiyT9mDt1eU3tPWl1UWPRU/EQ==", + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/@rspack/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-1.4.5.tgz", + "integrity": "sha512-PpyNunP8zC5AQtF3Pww7F41bwoJwmGzdJuv2lk/3l74UhjhT4Ac4/dmEaKiYeOr69PPlCtn7Des9VEFufYAZAQ==", "cpu": [ "ia32" ], @@ -5797,9 +5832,9 @@ ] }, "node_modules/@rspack/binding-win32-x64-msvc": { - "version": "1.3.15", - "resolved": "https://registry.npmjs.org/@rspack/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.3.15.tgz", - "integrity": "sha512-ZnDIc9Es8EF94MirPDN+hOMt7tkb8nMEbRJFKLMmNd0ElNPgsql+1cY5SqyGRH1hsKB87KfSUQlhFiKZvzbfIg==", + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/@rspack/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.4.5.tgz", + "integrity": "sha512-elzpVGJW0W9DTkfJ7JyvMyi2Rbot5Q6rVBBKSh0lRWhZE/LnDJ/1WkS/9yER8XPGjO7umP1hD72ML1SoBddXmA==", "cpu": [ "x64" ], @@ -5810,13 +5845,13 @@ ] }, "node_modules/@rspack/core": { - "version": "1.3.15", - "resolved": "https://registry.npmjs.org/@rspack/core/-/core-1.3.15.tgz", - "integrity": "sha512-QuElIC8jXSKWAp0LSx18pmbhA7NiA5HGoVYesmai90UVxz98tud0KpMxTVCg+0lrLrnKZfCWN9kwjCxM5pGnrA==", + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/@rspack/core/-/core-1.4.5.tgz", + "integrity": "sha512-4OlxGQ4yPbAOYbVStMotaYrydm8r5VbLByrmQ34LNBYIDSmwaBmHQVMYGIesuGW681pr139XwInKvsoAoW6VTA==", "license": "MIT", "dependencies": { - "@module-federation/runtime-tools": "0.14.3", - "@rspack/binding": "1.3.15", + "@module-federation/runtime-tools": "0.15.0", + "@rspack/binding": "1.4.5", "@rspack/lite-tapable": "1.0.1" }, "engines": { @@ -6148,14 +6183,14 @@ } }, "node_modules/@swc/core": { - "version": "1.11.21", - "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.11.21.tgz", - "integrity": "sha512-/Y3BJLcwd40pExmdar8MH2UGGvCBrqNN7hauOMckrEX2Ivcbv3IMhrbGX4od1dnF880Ed8y/E9aStZCIQi0EGw==", + "version": "1.12.11", + "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.12.11.tgz", + "integrity": "sha512-P3GM+0lqjFctcp5HhR9mOcvLSX3SptI9L1aux0Fuvgt8oH4f92rCUrkodAa0U2ktmdjcyIiG37xg2mb/dSCYSA==", "hasInstallScript": true, "license": "Apache-2.0", "dependencies": { "@swc/counter": "^0.1.3", - "@swc/types": "^0.1.21" + "@swc/types": "^0.1.23" }, "engines": { "node": ">=10" @@ -6165,16 +6200,16 @@ "url": "https://opencollective.com/swc" }, "optionalDependencies": { - "@swc/core-darwin-arm64": "1.11.21", - "@swc/core-darwin-x64": "1.11.21", - "@swc/core-linux-arm-gnueabihf": "1.11.21", - "@swc/core-linux-arm64-gnu": "1.11.21", - "@swc/core-linux-arm64-musl": "1.11.21", - "@swc/core-linux-x64-gnu": "1.11.21", - "@swc/core-linux-x64-musl": "1.11.21", - "@swc/core-win32-arm64-msvc": "1.11.21", - "@swc/core-win32-ia32-msvc": "1.11.21", - "@swc/core-win32-x64-msvc": "1.11.21" + "@swc/core-darwin-arm64": "1.12.11", + "@swc/core-darwin-x64": "1.12.11", + "@swc/core-linux-arm-gnueabihf": "1.12.11", + "@swc/core-linux-arm64-gnu": "1.12.11", + "@swc/core-linux-arm64-musl": "1.12.11", + "@swc/core-linux-x64-gnu": "1.12.11", + "@swc/core-linux-x64-musl": "1.12.11", + "@swc/core-win32-arm64-msvc": "1.12.11", + "@swc/core-win32-ia32-msvc": "1.12.11", + "@swc/core-win32-x64-msvc": "1.12.11" }, "peerDependencies": { "@swc/helpers": ">=0.5.17" @@ -6186,9 +6221,9 @@ } }, "node_modules/@swc/core-darwin-arm64": { - "version": "1.11.21", - "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.11.21.tgz", - "integrity": "sha512-v6gjw9YFWvKulCw3ZA1dY+LGMafYzJksm1mD4UZFZ9b36CyHFowYVYug1ajYRIRqEvvfIhHUNV660zTLoVFR8g==", + "version": "1.12.11", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.12.11.tgz", + "integrity": "sha512-J19Jj9Y5x/N0loExH7W0OI9OwwoVyxutDdkyq1o/kgXyBqmmzV7Y/Q9QekI2Fm/qc5mNeAdP7aj4boY4AY/JPw==", "cpu": [ "arm64" ], @@ -6202,9 +6237,9 @@ } }, "node_modules/@swc/core-darwin-x64": { - "version": "1.11.21", - "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.11.21.tgz", - "integrity": "sha512-CUiTiqKlzskwswrx9Ve5NhNoab30L1/ScOfQwr1duvNlFvarC8fvQSgdtpw2Zh3MfnfNPpyLZnYg7ah4kbT9JQ==", + "version": "1.12.11", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.12.11.tgz", + "integrity": "sha512-PTuUQrfStQ6cjW+uprGO2lpQHy84/l0v+GqRqq8s/jdK55rFRjMfCeyf6FAR0l6saO5oNOQl+zWR1aNpj8pMQw==", "cpu": [ "x64" ], @@ -6218,9 +6253,9 @@ } }, "node_modules/@swc/core-linux-arm-gnueabihf": { - "version": "1.11.21", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.11.21.tgz", - "integrity": "sha512-YyBTAFM/QPqt1PscD8hDmCLnqPGKmUZpqeE25HXY8OLjl2MUs8+O4KjwPZZ+OGxpdTbwuWFyMoxjcLy80JODvg==", + "version": "1.12.11", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.12.11.tgz", + "integrity": "sha512-poxBq152HsupOtnZilenvHmxZ9a8SRj4LtfxUnkMDNOGrZR9oxbQNwEzNKfi3RXEcXz+P8c0Rai1ubBazXv8oQ==", "cpu": [ "arm" ], @@ -6234,9 +6269,9 @@ } }, "node_modules/@swc/core-linux-arm64-gnu": { - "version": "1.11.21", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.11.21.tgz", - "integrity": "sha512-DQD+ooJmwpNsh4acrftdkuwl5LNxxg8U4+C/RJNDd7m5FP9Wo4c0URi5U0a9Vk/6sQNh9aSGcYChDpqCDWEcBw==", + "version": "1.12.11", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.12.11.tgz", + "integrity": "sha512-y1HNamR/D0Hc8xIE910ysyLe269UYiGaQPoLjQS0phzWFfWdMj9bHM++oydVXZ4RSWycO7KyJ3uvw4NilvyMKQ==", "cpu": [ "arm64" ], @@ -6250,9 +6285,9 @@ } }, "node_modules/@swc/core-linux-arm64-musl": { - "version": "1.11.21", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.11.21.tgz", - "integrity": "sha512-y1L49+snt1a1gLTYPY641slqy55QotPdtRK9Y6jMi4JBQyZwxC8swWYlQWb+MyILwxA614fi62SCNZNznB3XSA==", + "version": "1.12.11", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.12.11.tgz", + "integrity": "sha512-LlBxPh/32pyQsu2emMEOFRm7poEFLsw12Y1mPY7FWZiZeptomKSOSHRzKDz9EolMiV4qhK1caP1lvW4vminYgQ==", "cpu": [ "arm64" ], @@ -6266,9 +6301,9 @@ } }, "node_modules/@swc/core-linux-x64-gnu": { - "version": "1.11.21", - "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.11.21.tgz", - "integrity": "sha512-NesdBXv4CvVEaFUlqKj+GA4jJMNUzK2NtKOrUNEtTbXaVyNiXjFCSaDajMTedEB0jTAd9ybB0aBvwhgkJUWkWA==", + "version": "1.12.11", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.12.11.tgz", + "integrity": "sha512-bOjiZB8O/1AzHkzjge1jqX62HGRIpOHqFUrGPfAln/NC6NR+Z2A78u3ixV7k5KesWZFhCV0YVGJL+qToL27myA==", "cpu": [ "x64" ], @@ -6282,9 +6317,9 @@ } }, "node_modules/@swc/core-linux-x64-musl": { - "version": "1.11.21", - "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.11.21.tgz", - "integrity": "sha512-qFV60pwpKVOdmX67wqQzgtSrUGWX9Cibnp1CXyqZ9Mmt8UyYGvmGu7p6PMbTyX7vdpVUvWVRf8DzrW2//wmVHg==", + "version": "1.12.11", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.12.11.tgz", + "integrity": "sha512-4dzAtbT/m3/UjF045+33gLiHd8aSXJDoqof7gTtu4q0ZyAf7XJ3HHspz+/AvOJLVo4FHHdFcdXhmo/zi1nFn8A==", "cpu": [ "x64" ], @@ -6298,9 +6333,9 @@ } }, "node_modules/@swc/core-win32-arm64-msvc": { - "version": "1.11.21", - "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.11.21.tgz", - "integrity": "sha512-DJJe9k6gXR/15ZZVLv1SKhXkFst8lYCeZRNHH99SlBodvu4slhh/MKQ6YCixINRhCwliHrpXPym8/5fOq8b7Ig==", + "version": "1.12.11", + "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.12.11.tgz", + "integrity": "sha512-h8HiwBZErKvCAmjW92JvQp0iOqm6bncU4ac5jxBGkRApabpUenNJcj3h2g5O6GL5K6T9/WhnXE5gyq/s1fhPQg==", "cpu": [ "arm64" ], @@ -6314,9 +6349,9 @@ } }, "node_modules/@swc/core-win32-ia32-msvc": { - "version": "1.11.21", - "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.11.21.tgz", - "integrity": "sha512-TqEXuy6wedId7bMwLIr9byds+mKsaXVHctTN88R1UIBPwJA92Pdk0uxDgip0pEFzHB/ugU27g6d8cwUH3h2eIw==", + "version": "1.12.11", + "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.12.11.tgz", + "integrity": "sha512-1pwr325mXRNUhxTtXmx1IokV5SiRL+6iDvnt3FRXj+X5UvXXKtg2zeyftk+03u8v8v8WUr5I32hIypVJPTNxNg==", "cpu": [ "ia32" ], @@ -6330,9 +6365,9 @@ } }, "node_modules/@swc/core-win32-x64-msvc": { - "version": "1.11.21", - "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.11.21.tgz", - "integrity": "sha512-BT9BNNbMxdpUM1PPAkYtviaV0A8QcXttjs2MDtOeSqqvSJaPtyM+Fof2/+xSwQDmDEFzbGCcn75M5+xy3lGqpA==", + "version": "1.12.11", + "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.12.11.tgz", + "integrity": "sha512-5gggWo690Gvs7XiPxAmb5tHwzB9RTVXUV7AWoGb6bmyUd1OXYaebQF0HAOtade5jIoNhfQMQJ7QReRgt/d2jAA==", "cpu": [ "x64" ], @@ -6352,9 +6387,9 @@ "license": "Apache-2.0" }, "node_modules/@swc/html": { - "version": "1.11.21", - "resolved": "https://registry.npmjs.org/@swc/html/-/html-1.11.21.tgz", - "integrity": "sha512-hW8Dk1jlLfngjMIz9uNVlEwPbMZd1GUYq0Lq19D8pAt6FYWwdB/pB93z1Kh/Z2RA9c+GXNYfuoq8UbEOgTMRMg==", + "version": "1.12.11", + "resolved": "https://registry.npmjs.org/@swc/html/-/html-1.12.11.tgz", + "integrity": "sha512-J45O3rOyxpYsllPvKNcght+LJbaxWaILZJY0DtqhKKbS/HtXatLpflXOl0cAZrlV0YYQNW7UsBwO3ZOIcCGfkQ==", "license": "Apache-2.0", "dependencies": { "@swc/counter": "^0.1.3" @@ -6363,22 +6398,22 @@ "node": ">=14" }, "optionalDependencies": { - "@swc/html-darwin-arm64": "1.11.21", - "@swc/html-darwin-x64": "1.11.21", - "@swc/html-linux-arm-gnueabihf": "1.11.21", - "@swc/html-linux-arm64-gnu": "1.11.21", - "@swc/html-linux-arm64-musl": "1.11.21", - "@swc/html-linux-x64-gnu": "1.11.21", - "@swc/html-linux-x64-musl": "1.11.21", - "@swc/html-win32-arm64-msvc": "1.11.21", - "@swc/html-win32-ia32-msvc": "1.11.21", - "@swc/html-win32-x64-msvc": "1.11.21" + "@swc/html-darwin-arm64": "1.12.11", + "@swc/html-darwin-x64": "1.12.11", + "@swc/html-linux-arm-gnueabihf": "1.12.11", + "@swc/html-linux-arm64-gnu": "1.12.11", + "@swc/html-linux-arm64-musl": "1.12.11", + "@swc/html-linux-x64-gnu": "1.12.11", + "@swc/html-linux-x64-musl": "1.12.11", + "@swc/html-win32-arm64-msvc": "1.12.11", + "@swc/html-win32-ia32-msvc": "1.12.11", + "@swc/html-win32-x64-msvc": "1.12.11" } }, "node_modules/@swc/html-darwin-arm64": { - "version": "1.11.21", - "resolved": "https://registry.npmjs.org/@swc/html-darwin-arm64/-/html-darwin-arm64-1.11.21.tgz", - "integrity": "sha512-b4RwP927+h1rtIxpgXBoENsQ+xuVKvHyt2jxWnzfptARMcU11bGLpop5PzF2OEz4ikt1yXWyiEWEh9HOLLslNw==", + "version": "1.12.11", + "resolved": "https://registry.npmjs.org/@swc/html-darwin-arm64/-/html-darwin-arm64-1.12.11.tgz", + "integrity": "sha512-Lqu4Y07jl+IVS5NTv0bsMuj9W2HkW6DDQUJW4YXODaVGN8kxitYBUKb0pTNwDzT/73lwNEi2foxryTQtIw86hQ==", "cpu": [ "arm64" ], @@ -6392,9 +6427,9 @@ } }, "node_modules/@swc/html-darwin-x64": { - "version": "1.11.21", - "resolved": "https://registry.npmjs.org/@swc/html-darwin-x64/-/html-darwin-x64-1.11.21.tgz", - "integrity": "sha512-NHHM0fZxQQgv5eFAnJdyLoqhMGVAjq9Q5faSGPAz5nAEVx1ki3KhFM5ZDt8kyDkTjQ50Mv19dJKDCSWdkGTGJg==", + "version": "1.12.11", + "resolved": "https://registry.npmjs.org/@swc/html-darwin-x64/-/html-darwin-x64-1.12.11.tgz", + "integrity": "sha512-nVNAkQ2pChsR1v2O2EDZAOFYtSwPK+2o9WbQNnYW0jJi0foPtbU5RXvNlVjuqsvSg1MQ7D4U2nzNXF3tXol1Vg==", "cpu": [ "x64" ], @@ -6408,9 +6443,9 @@ } }, "node_modules/@swc/html-linux-arm-gnueabihf": { - "version": "1.11.21", - "resolved": "https://registry.npmjs.org/@swc/html-linux-arm-gnueabihf/-/html-linux-arm-gnueabihf-1.11.21.tgz", - "integrity": "sha512-bbnB2ZjeGWzh9LHHTjg3mSg+L9XC6tB9OXgIcXlzqeWdfvJqq8mMLRd03Rj2LXHfcvHEAbz/ZNQFdvNvZ8HmQg==", + "version": "1.12.11", + "resolved": "https://registry.npmjs.org/@swc/html-linux-arm-gnueabihf/-/html-linux-arm-gnueabihf-1.12.11.tgz", + "integrity": "sha512-ao0853lDM9WWTNpMD3j/QfvMSUzJTrjZRCWko/+OhgdzFi0srcRyrSWiAS1CC7tdlZy5cXQbNQeUBsjWdzO8LA==", "cpu": [ "arm" ], @@ -6424,9 +6459,9 @@ } }, "node_modules/@swc/html-linux-arm64-gnu": { - "version": "1.11.21", - "resolved": "https://registry.npmjs.org/@swc/html-linux-arm64-gnu/-/html-linux-arm64-gnu-1.11.21.tgz", - "integrity": "sha512-Dpv/zP3bLi8Ffvz/97B2chlK2akS9fqN4YP/Jf9ahjB1IgbQtD9Abr5ByCt8Y+8GQXKdc05gsU9nApKNVoerTw==", + "version": "1.12.11", + "resolved": "https://registry.npmjs.org/@swc/html-linux-arm64-gnu/-/html-linux-arm64-gnu-1.12.11.tgz", + "integrity": "sha512-MhWRHHzxzdRZRQD8MdH1IsYWABbFjD5uTzTI8vOc3LajbOe5w6Lygb6h4gHaXJryhYXvh2DRTHzDW9tavkBOug==", "cpu": [ "arm64" ], @@ -6440,9 +6475,9 @@ } }, "node_modules/@swc/html-linux-arm64-musl": { - "version": "1.11.21", - "resolved": "https://registry.npmjs.org/@swc/html-linux-arm64-musl/-/html-linux-arm64-musl-1.11.21.tgz", - "integrity": "sha512-qnnBkScssiZrohrtLeyk3YRy7JA0AB2+5CrtyWk1IhyS+q8nyVMKQlEJE/1g2LBVAQZDTXR6h9udlEKnX5sL2A==", + "version": "1.12.11", + "resolved": "https://registry.npmjs.org/@swc/html-linux-arm64-musl/-/html-linux-arm64-musl-1.12.11.tgz", + "integrity": "sha512-ea6mcjJR56cPcDdxI8woUV86ngHrv9/BpFDQo1A0eeSQfQFeRRMaTD2jD5BAFrv5ECgf/yN2VZBinHywVVYnvA==", "cpu": [ "arm64" ], @@ -6456,9 +6491,9 @@ } }, "node_modules/@swc/html-linux-x64-gnu": { - "version": "1.11.21", - "resolved": "https://registry.npmjs.org/@swc/html-linux-x64-gnu/-/html-linux-x64-gnu-1.11.21.tgz", - "integrity": "sha512-+5LH2ChaWG/EA9/Jq6yflwizulo6pU7+5N4v5rYAOBIyGJPcyN/mQQlmOw2Kc4PWC1ASBNU/GWLoKGp+EuC04g==", + "version": "1.12.11", + "resolved": "https://registry.npmjs.org/@swc/html-linux-x64-gnu/-/html-linux-x64-gnu-1.12.11.tgz", + "integrity": "sha512-Op3fFsagdOXq78NJMtQlkN6nQyre1h/NT6yHQhNns9MvsbqwGUYVlt3oio1dhPxqWxrKYOFEzI5DIayMq/870A==", "cpu": [ "x64" ], @@ -6472,9 +6507,9 @@ } }, "node_modules/@swc/html-linux-x64-musl": { - "version": "1.11.21", - "resolved": "https://registry.npmjs.org/@swc/html-linux-x64-musl/-/html-linux-x64-musl-1.11.21.tgz", - "integrity": "sha512-gMtXkPwh9kjnTsykbD+4K6LajZNmhCadXEPtJHMmx1iNxovSHmKdYkX1t8HYtysB6QD+uQdmA3wPh2LBVHoKoA==", + "version": "1.12.11", + "resolved": "https://registry.npmjs.org/@swc/html-linux-x64-musl/-/html-linux-x64-musl-1.12.11.tgz", + "integrity": "sha512-RII4slH21EuJcr1E9LMy6K7VQHNAXA2EMCEeiVEnjT/vqBESeyMcxNnrv4SxzlKZDD+doQO6QMHe4AfO/lCGKw==", "cpu": [ "x64" ], @@ -6488,9 +6523,9 @@ } }, "node_modules/@swc/html-win32-arm64-msvc": { - "version": "1.11.21", - "resolved": "https://registry.npmjs.org/@swc/html-win32-arm64-msvc/-/html-win32-arm64-msvc-1.11.21.tgz", - "integrity": "sha512-SiFBEhAPI/bSTEm6vJO9EawTLaCCiGsVR2PWM8x1fU4fZlf97JKOJr5W2lwCFSG0r2jO+HAr1IZB0SaF58ierg==", + "version": "1.12.11", + "resolved": "https://registry.npmjs.org/@swc/html-win32-arm64-msvc/-/html-win32-arm64-msvc-1.12.11.tgz", + "integrity": "sha512-vdcNdmxjZpbuJ5ORxRbNGO3Vj7OR8AQOykcs2/SrlvTWgZ3wqTNi8GDCUkmKU/TuGMzuOUMNC0SOY5uwR0paqg==", "cpu": [ "arm64" ], @@ -6504,9 +6539,9 @@ } }, "node_modules/@swc/html-win32-ia32-msvc": { - "version": "1.11.21", - "resolved": "https://registry.npmjs.org/@swc/html-win32-ia32-msvc/-/html-win32-ia32-msvc-1.11.21.tgz", - "integrity": "sha512-ke3z9lEp9JqFT906SkU1ap8aE8BYrCxGDULYqqYPjsD0cov/Je4H/qwXkTJ9VkD9RENljKwoisAXfCuBeIoxvQ==", + "version": "1.12.11", + "resolved": "https://registry.npmjs.org/@swc/html-win32-ia32-msvc/-/html-win32-ia32-msvc-1.12.11.tgz", + "integrity": "sha512-7LJsxSePjlVJl8klwwotEtMrlcwOqjUWht5U0wkg9D7x+sqkwj2clTEzaGFJBrPGuhAJnZwiK0ktaVWqTDTo0A==", "cpu": [ "ia32" ], @@ -6520,9 +6555,9 @@ } }, "node_modules/@swc/html-win32-x64-msvc": { - "version": "1.11.21", - "resolved": "https://registry.npmjs.org/@swc/html-win32-x64-msvc/-/html-win32-x64-msvc-1.11.21.tgz", - "integrity": "sha512-UBzKWLt2hQpYPnq5o5tPGwtNVE18jUdCt4Wm59e00JBZgP2IMRO3/BYzmvYmGfNbKzDUGWDeSWpe+MRt9gPPVA==", + "version": "1.12.11", + "resolved": "https://registry.npmjs.org/@swc/html-win32-x64-msvc/-/html-win32-x64-msvc-1.12.11.tgz", + "integrity": "sha512-wuOYXuFFGpb702NPfy7AoazjhFHj/Y6WAl8JGO3fG7iAx3xDeJh2KpDFb0jk40kDii+jV8drwN11LKwUfOGTiQ==", "cpu": [ "x64" ], @@ -6536,9 +6571,9 @@ } }, "node_modules/@swc/types": { - "version": "0.1.21", - "resolved": "https://registry.npmjs.org/@swc/types/-/types-0.1.21.tgz", - "integrity": "sha512-2YEtj5HJVbKivud9N4bpPBAyZhj4S2Ipe5LkUG94alTpr7in/GU/EARgPAd3BwU+YOmFVJC2+kjqhGRi3r0ZpQ==", + "version": "0.1.23", + "resolved": "https://registry.npmjs.org/@swc/types/-/types-0.1.23.tgz", + "integrity": "sha512-u1iIVZV9Q0jxY+yM2vw/hZGDNudsN85bBpTqzAQ9rzkxW9D+e3aEM4Han+ow518gSewkXgjmEK0BD79ZcNVgPw==", "license": "Apache-2.0", "dependencies": { "@swc/counter": "^0.1.3" @@ -6641,10 +6676,20 @@ "node": ">=10.13.0" } }, + "node_modules/@tybys/wasm-util": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.9.0.tgz", + "integrity": "sha512-6+7nlbMVX/PVDCwaIQ8nTOPveOcFLSt8GcXdx8hD0bt39uWxYT88uXzqTd4fTvqta7oeUJqudepapKNt2DYJFw==", + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, "node_modules/@types/body-parser": { - "version": "1.19.5", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz", - "integrity": "sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==", + "version": "1.19.6", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.6.tgz", + "integrity": "sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==", "license": "MIT", "dependencies": { "@types/connect": "*", @@ -6709,9 +6754,9 @@ } }, "node_modules/@types/estree": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.7.tgz", - "integrity": "sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", "license": "MIT" }, "node_modules/@types/estree-jsx": { @@ -6724,9 +6769,9 @@ } }, "node_modules/@types/express": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz", - "integrity": "sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==", + "version": "4.17.23", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.23.tgz", + "integrity": "sha512-Crp6WY9aTYP3qPi2wGDo9iUe/rceX01UMhnF1jmwDcKCFM6cx7YhGP/Mpr3y9AASpfHixIG0E6azCcL5OcDHsQ==", "license": "MIT", "dependencies": { "@types/body-parser": "*", @@ -6793,9 +6838,9 @@ "license": "MIT" }, "node_modules/@types/http-errors": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz", - "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.5.tgz", + "integrity": "sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==", "license": "MIT" }, "node_modules/@types/http-proxy": { @@ -6865,18 +6910,18 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "22.14.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.14.1.tgz", - "integrity": "sha512-u0HuPQwe/dHrItgHHpmw3N2fYCR6x4ivMNbPHRkBVP4CvN+kiRrKHWk3i8tXiO/joPwXLMYvF9TTF0eqgHIuOw==", + "version": "24.0.10", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.0.10.tgz", + "integrity": "sha512-ENHwaH+JIRTDIEEbDK6QSQntAYGtbvdDXnMXnZaZ6k13Du1dPMmprkEHIL7ok2Wl2aZevetwTAb5S+7yIF+enA==", "license": "MIT", "dependencies": { - "undici-types": "~6.21.0" + "undici-types": "~7.8.0" } }, "node_modules/@types/node-forge": { - "version": "1.3.11", - "resolved": "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.11.tgz", - "integrity": "sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==", + "version": "1.3.12", + "resolved": "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.12.tgz", + "integrity": "sha512-a0ToKlRVnUw3aXKQq2F+krxZKq7B8LEQijzPn5RdFAMatARD2JX9o8FBpMXOOrjob0uc13aN+V/AXniOXW4d9A==", "license": "MIT", "dependencies": { "@types/node": "*" @@ -6895,15 +6940,15 @@ "license": "MIT" }, "node_modules/@types/prop-types": { - "version": "15.7.14", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.14.tgz", - "integrity": "sha512-gNMvNH49DJ7OJYv+KAKn0Xp45p8PLl6zo2YnvDIbTd4J6MER2BmWN49TG7n9LvkyihINxeKW8+3bfS2yDC9dzQ==", + "version": "15.7.15", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.15.tgz", + "integrity": "sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==", "license": "MIT" }, "node_modules/@types/qs": { - "version": "6.9.18", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.18.tgz", - "integrity": "sha512-kK7dgTYDyGqS+e2Q4aK9X3D7q234CIZ1Bv0q/7Z5IwRDoADNU81xXJK/YVyLbLTZCoIwUoDoffFeF+p/eIklAA==", + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.14.0.tgz", + "integrity": "sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ==", "license": "MIT" }, "node_modules/@types/range-parser": { @@ -6913,9 +6958,9 @@ "license": "MIT" }, "node_modules/@types/react": { - "version": "18.3.20", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.20.tgz", - "integrity": "sha512-IPaCZN7PShZK/3t6Q87pfTkRm6oLTd4vztyoj+cbHUF1g3FfVb2tFIL79uCRKEfv16AhqDMBywP2VW3KIZUvcg==", + "version": "18.3.23", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.23.tgz", + "integrity": "sha512-/LDXMQh55EzZQ0uVAZmKKhfENivEvWz6E+EYzh+/MCjMhNsotd+ZHhBGIjFDTi6+fz0OhQQQLbTgdQIxxCsC0w==", "license": "MIT", "dependencies": { "@types/prop-types": "*", @@ -6979,9 +7024,9 @@ } }, "node_modules/@types/send": { - "version": "0.17.4", - "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz", - "integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==", + "version": "0.17.5", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.5.tgz", + "integrity": "sha512-z6F2D3cOStZvuk2SaP6YrwkNO65iTZcwA2ZkSABegdkAh/lf+Aa/YQndZVfmEXT5vgAp6zv06VQ3ejSVjAny4w==", "license": "MIT", "dependencies": { "@types/mime": "^1", @@ -6998,9 +7043,9 @@ } }, "node_modules/@types/serve-static": { - "version": "1.15.7", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.7.tgz", - "integrity": "sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==", + "version": "1.15.8", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.8.tgz", + "integrity": "sha512-roei0UY3LhpOJvjbIP6ZZFngyLKl5dskOtDhxY5THRSpO+ZI+nzJ+m5yUMzGrp89YRa7lvknKkMYjqQFGwA7Sg==", "license": "MIT", "dependencies": { "@types/http-errors": "*", @@ -7255,9 +7300,9 @@ } }, "node_modules/acorn": { - "version": "8.14.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.1.tgz", - "integrity": "sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==", + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", "license": "MIT", "bin": { "acorn": "bin/acorn" @@ -7355,24 +7400,24 @@ } }, "node_modules/algoliasearch": { - "version": "5.29.0", - "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-5.29.0.tgz", - "integrity": "sha512-E2l6AlTWGznM2e7vEE6T6hzObvEyXukxMOlBmVlMyixZyK1umuO/CiVc6sDBbzVH0oEviCE5IfVY1oZBmccYPQ==", - "license": "MIT", - "dependencies": { - "@algolia/client-abtesting": "5.29.0", - "@algolia/client-analytics": "5.29.0", - "@algolia/client-common": "5.29.0", - "@algolia/client-insights": "5.29.0", - "@algolia/client-personalization": "5.29.0", - "@algolia/client-query-suggestions": "5.29.0", - "@algolia/client-search": "5.29.0", - "@algolia/ingestion": "1.29.0", - "@algolia/monitoring": "1.29.0", - "@algolia/recommend": "5.29.0", - "@algolia/requester-browser-xhr": "5.29.0", - "@algolia/requester-fetch": "5.29.0", - "@algolia/requester-node-http": "5.29.0" + "version": "5.31.0", + "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-5.31.0.tgz", + "integrity": "sha512-LBpwGyNPOcprdu1OnRtgaWeKLjnDR3T+vp64WRiQEgHYACIXgU+djAvj88m3OQc+6MfWbw7rKUjXtdRMLfU7Aw==", + "license": "MIT", + "dependencies": { + "@algolia/client-abtesting": "5.31.0", + "@algolia/client-analytics": "5.31.0", + "@algolia/client-common": "5.31.0", + "@algolia/client-insights": "5.31.0", + "@algolia/client-personalization": "5.31.0", + "@algolia/client-query-suggestions": "5.31.0", + "@algolia/client-search": "5.31.0", + "@algolia/ingestion": "1.31.0", + "@algolia/monitoring": "1.31.0", + "@algolia/recommend": "5.31.0", + "@algolia/requester-browser-xhr": "5.31.0", + "@algolia/requester-fetch": "5.31.0", + "@algolia/requester-node-http": "5.31.0" }, "engines": { "node": ">= 14.0.0" @@ -7390,14 +7435,11 @@ "algoliasearch": ">= 3.1 < 6" } }, - "node_modules/animate-css": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/animate-css/-/animate-css-1.3.4.tgz", - "integrity": "sha512-dd1Ht6/YQHcNbq0znIT6dG8uhO7Ce+VIIhZUhjsryXsMPJQz3bZg7Q2eNzLwipb25bRZslGb2myio5mScd1TFg==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/Wombosvideo" - } + "node_modules/animate.css": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/animate.css/-/animate.css-4.1.1.tgz", + "integrity": "sha512-+mRmCTv6SbCmtYJCN4faJMNFVNN5EuCTTprDTAo7YzIGji2KADmakjVA3+8mVDkZ2Bf09vayB35lSQIex2+QaQ==", + "license": "MIT" }, "node_modules/ansi-align": { "version": "3.0.1", @@ -7522,6 +7564,18 @@ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "license": "Python-2.0" }, + "node_modules/aria-hidden": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.6.tgz", + "integrity": "sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/array-flatten": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", @@ -7650,13 +7704,13 @@ } }, "node_modules/babel-plugin-polyfill-corejs2": { - "version": "0.4.13", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.13.tgz", - "integrity": "sha512-3sX/eOms8kd3q2KZ6DAhKPc0dgm525Gqq5NtWKZ7QYYZEv57OQ54KtblzJzH1lQF/eQxO8KjWGIK9IPUJNus5g==", + "version": "0.4.14", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.14.tgz", + "integrity": "sha512-Co2Y9wX854ts6U8gAAPXfn0GmAyctHuK8n0Yhfjd6t30g7yvKjspvvOo9yG+z52PZRgFErt7Ka2pYnXCjLKEpg==", "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.22.6", - "@babel/helper-define-polyfill-provider": "^0.6.4", + "@babel/compat-data": "^7.27.7", + "@babel/helper-define-polyfill-provider": "^0.6.5", "semver": "^6.3.1" }, "peerDependencies": { @@ -7673,25 +7727,25 @@ } }, "node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.11.1.tgz", - "integrity": "sha512-yGCqvBT4rwMczo28xkH/noxJ6MZ4nJfkVYdoDaC/utLtWrXxv27HVrzAeSbqR8SxDsp46n0YF47EbHoixy6rXQ==", + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.13.0.tgz", + "integrity": "sha512-U+GNwMdSFgzVmfhNm8GJUX88AadB3uo9KpJqS3FaqNIPKgySuvMb+bHPsOmmuWyIcuqZj/pzt1RUIUZns4y2+A==", "license": "MIT", "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.6.3", - "core-js-compat": "^3.40.0" + "@babel/helper-define-polyfill-provider": "^0.6.5", + "core-js-compat": "^3.43.0" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, "node_modules/babel-plugin-polyfill-regenerator": { - "version": "0.6.4", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.4.tgz", - "integrity": "sha512-7gD3pRadPrbjhjLyxebmx/WrFYcuSjZ0XbdUujQMZ/fcE9oeewk2U/7PCvez84UeuK3oSjmPZ0Ch0dlupQvGzw==", + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.5.tgz", + "integrity": "sha512-ISqQ2frbiNU9vIJkzg7dlPpznPZ4jOiUQ1uSmB0fEHeowtN3COYRsXr/xexn64NpU13P06jc/L5TgiJXOgrbEg==", "license": "MIT", "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.6.4" + "@babel/helper-define-polyfill-provider": "^0.6.5" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" @@ -7849,9 +7903,9 @@ } }, "node_modules/browserslist": { - "version": "4.25.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.25.0.tgz", - "integrity": "sha512-PJ8gYKeS5e/whHBh8xrwYK+dAvEj7JXtz6uTucnMRB8OiGTsKccFekoRrjajPBHV8oOY+2tI4uxeceSimKwMFA==", + "version": "4.25.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.25.1.tgz", + "integrity": "sha512-KGj0KoOMXLpSNkkEI6Z6mShmQy0bc1I+T7K9N81k4WWMrfz+6fQ6es80B/YLAeRoKvjYE1YSHHOW1qe9xIVzHw==", "funding": [ { "type": "opencollective", @@ -7868,8 +7922,8 @@ ], "license": "MIT", "dependencies": { - "caniuse-lite": "^1.0.30001718", - "electron-to-chromium": "^1.5.160", + "caniuse-lite": "^1.0.30001726", + "electron-to-chromium": "^1.5.173", "node-releases": "^2.0.19", "update-browserslist-db": "^1.1.3" }, @@ -8022,9 +8076,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001723", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001723.tgz", - "integrity": "sha512-1R/elMjtehrFejxwmexeXAtae5UO9iSyFn6G/I806CYC/BLyyBk1EPhrKBkWhy6wM6Xnm47dSJQec+tLJ39WHw==", + "version": "1.0.30001727", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001727.tgz", + "integrity": "sha512-pB68nIHmbN6L/4C6MH1DokyR3bYqFwjaSs/sWDHGj4CTcFtQUQMuJftVwWkXq7mNWOybD3KhUv3oWHoGxgP14Q==", "funding": [ { "type": "opencollective", @@ -8467,6 +8521,12 @@ "proto-list": "~1.2.1" } }, + "node_modules/config-chain/node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "license": "ISC" + }, "node_modules/configstore": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/configstore/-/configstore-6.0.0.tgz", @@ -8623,9 +8683,9 @@ } }, "node_modules/core-js": { - "version": "3.41.0", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.41.0.tgz", - "integrity": "sha512-SJ4/EHwS36QMJd6h/Rg+GyR4A5xE0FSI3eZ+iBVpfqf1x0eTSg1smWLHrA+2jQThZSh97fmSgFSU8B61nxosxA==", + "version": "3.44.0", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.44.0.tgz", + "integrity": "sha512-aFCtd4l6GvAXwVEh3XbbVqJGHDJt0OZRa+5ePGx3LLwi12WfexqQxcsohb2wgsa/92xtl19Hd66G/L+TaAxDMw==", "hasInstallScript": true, "license": "MIT", "funding": { @@ -8634,12 +8694,12 @@ } }, "node_modules/core-js-compat": { - "version": "3.43.0", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.43.0.tgz", - "integrity": "sha512-2GML2ZsCc5LR7hZYz4AXmjQw8zuy2T//2QntwdnpuYI7jteT6GVYJL7F6C2C57R7gSYrcqVW3lAALefdbhBLDA==", + "version": "3.44.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.44.0.tgz", + "integrity": "sha512-JepmAj2zfl6ogy34qfWtcE7nHKAJnKsQFRn++scjVS2bZFllwptzw61BZcZFYBPpUznLfAvh0LGhxKppk04ClA==", "license": "MIT", "dependencies": { - "browserslist": "^4.25.0" + "browserslist": "^4.25.1" }, "funding": { "type": "opencollective", @@ -8647,9 +8707,9 @@ } }, "node_modules/core-js-pure": { - "version": "3.43.0", - "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.43.0.tgz", - "integrity": "sha512-i/AgxU2+A+BbJdMxh3v7/vxi2SbFqxiFmg6VsDwYB4jkucrd1BZNA9a9gphC0fYMG5IBSgQcbQnk865VCLe7xA==", + "version": "3.44.0", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.44.0.tgz", + "integrity": "sha512-gvMQAGB4dfVUxpYD0k3Fq8J+n5bB6Ytl15lqlZrOIXFzxOhtPaObfkQGHtMRdyjIf7z2IeNULwi1jEwyS+ltKQ==", "hasInstallScript": true, "license": "MIT", "funding": { @@ -8944,9 +9004,9 @@ } }, "node_modules/css-select": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", - "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.2.2.tgz", + "integrity": "sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==", "license": "BSD-2-Clause", "dependencies": { "boolbase": "^1.0.0", @@ -8973,9 +9033,9 @@ } }, "node_modules/css-what": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", - "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.2.2.tgz", + "integrity": "sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==", "license": "BSD-2-Clause", "engines": { "node": ">= 6" @@ -8985,9 +9045,9 @@ } }, "node_modules/cssdb": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-8.3.0.tgz", - "integrity": "sha512-c7bmItIg38DgGjSwDPZOYF/2o0QU/sSgkWOMyl8votOfgFuyiFKWPesmCGEsrGLxEA9uL540cp8LdaGEjUGsZQ==", + "version": "8.3.1", + "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-8.3.1.tgz", + "integrity": "sha512-XnDRQMXucLueX92yDe0LPKupXetWoFOgawr4O4X41l5TltgK2NVbJJVDnnOywDYfW1sTJ28AcXGKOqdRKwCcmQ==", "funding": [ { "type": "opencollective", @@ -9155,9 +9215,9 @@ "license": "MIT" }, "node_modules/debug": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", - "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", "license": "MIT", "dependencies": { "ms": "^2.1.3" @@ -9172,9 +9232,9 @@ } }, "node_modules/decode-named-character-reference": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.1.0.tgz", - "integrity": "sha512-Wy+JTSbFThEOXQIR2L6mxJvEs+veIzpmqD7ynWxMXGpnk3smkHQOp6forLdHsKpAMW9iJpaBBIxz285t1n1C3w==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.2.0.tgz", + "integrity": "sha512-c6fcElNV6ShtZXmsgNgFFV5tVX2PaV4g+MOAkb8eXHvn6sryJBrZa9r0zV6+dtTyoCKxtDy5tyQ5ZwQuidtd+Q==", "license": "MIT", "dependencies": { "character-entities": "^2.0.0" @@ -9322,9 +9382,9 @@ } }, "node_modules/detect-libc": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz", - "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.4.tgz", + "integrity": "sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==", "license": "Apache-2.0", "engines": { "node": ">=8" @@ -9336,6 +9396,12 @@ "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", "license": "MIT" }, + "node_modules/detect-node-es": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz", + "integrity": "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==", + "license": "MIT" + }, "node_modules/detect-port": { "version": "1.6.1", "resolved": "https://registry.npmjs.org/detect-port/-/detect-port-1.6.1.tgz", @@ -9556,9 +9622,9 @@ "license": "MIT" }, "node_modules/electron-to-chromium": { - "version": "1.5.170", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.170.tgz", - "integrity": "sha512-GP+M7aeluQo9uAyiTCxgIj/j+PrWhMlY7LFVj8prlsPljd0Fdg9AprlfUi+OCSFWy9Y5/2D/Jrj9HS8Z4rpKWA==", + "version": "1.5.180", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.180.tgz", + "integrity": "sha512-ED+GEyEh3kYMwt2faNmgMB0b8O5qtATGgR4RmRsIp4T6p7B8vdMbIedYndnvZfsaXvSzegtpfqRMDNCjjiSduA==", "license": "ISC" }, "node_modules/emoji-regex": { @@ -9602,9 +9668,9 @@ } }, "node_modules/enhanced-resolve": { - "version": "5.18.1", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.1.tgz", - "integrity": "sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg==", + "version": "5.18.2", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.2.tgz", + "integrity": "sha512-6Jw4sE1maoRJo3q8MsSIn2onJFbLTOjY9hlx4DZXmOKvLRd1Ok2kXmAGXaafL2+ijsJZ1ClYbl/pmqr9+k4iUQ==", "license": "MIT", "dependencies": { "graceful-fs": "^4.2.4", @@ -9654,9 +9720,9 @@ } }, "node_modules/es-module-lexer": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.6.0.tgz", - "integrity": "sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz", + "integrity": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==", "license": "MIT" }, "node_modules/es-object-atoms": { @@ -9876,9 +9942,9 @@ } }, "node_modules/estree-util-value-to-estree": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/estree-util-value-to-estree/-/estree-util-value-to-estree-3.3.3.tgz", - "integrity": "sha512-Db+m1WSD4+mUO7UgMeKkAwdbfNWwIxLt48XF2oFU9emPfXkIu+k5/nlOj313v7wqtAPo0f9REhUvznFrPkG8CQ==", + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/estree-util-value-to-estree/-/estree-util-value-to-estree-3.4.0.tgz", + "integrity": "sha512-Zlp+gxis+gCfK12d3Srl2PdX2ybsEA8ZYy6vQGVQTNNYLEGRQQ56XB64bjemN8kxIKXP1nC9ip4Z+ILy9LGzvQ==", "license": "MIT", "dependencies": { "@types/estree": "^1.0.0" @@ -10549,6 +10615,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/get-nonce": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-nonce/-/get-nonce-1.0.1.tgz", + "integrity": "sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/get-own-enumerable-property-symbols": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz", @@ -10587,21 +10662,20 @@ "license": "ISC" }, "node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", "license": "ISC", "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" }, - "engines": { - "node": "*" + "bin": { + "glob": "dist/esm/bin.mjs" }, "funding": { "url": "https://github.com/sponsors/isaacs" @@ -10625,6 +10699,30 @@ "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", "license": "BSD-2-Clause" }, + "node_modules/glob/node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/glob/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/global-dirs": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.1.tgz", @@ -10640,24 +10738,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/global-dirs/node_modules/ini": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", - "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", - "license": "ISC", - "engines": { - "node": ">=10" - } - }, - "node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, "node_modules/globby": { "version": "11.1.0", "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", @@ -11272,9 +11352,9 @@ } }, "node_modules/http-cache-semantics": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", - "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz", + "integrity": "sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==", "license": "BSD-2-Clause" }, "node_modules/http-deceiver": { @@ -11410,6 +11490,18 @@ "node": ">= 4" } }, + "node_modules/image-size": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-2.0.2.tgz", + "integrity": "sha512-IRqXKlaXwgSMAMtpNzZa1ZAe8m+Sa1770Dhk8VkSsP9LS+iHD62Zd8FQKs8fbPiagBE7BzoFX23cxFnwshpV6w==", + "license": "MIT", + "bin": { + "image-size": "bin/image-size.js" + }, + "engines": { + "node": ">=16.x" + } + }, "node_modules/import-fresh": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", @@ -11480,10 +11572,13 @@ "license": "ISC" }, "node_modules/ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "license": "ISC" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", + "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", + "license": "ISC", + "engines": { + "node": ">=10" + } }, "node_modules/inline-style-parser": { "version": "0.2.4", @@ -12018,9 +12113,9 @@ } }, "node_modules/lightningcss": { - "version": "1.29.3", - "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.29.3.tgz", - "integrity": "sha512-GlOJwTIP6TMIlrTFsxTerwC0W6OpQpCGuX1ECRLBUVRh6fpJH3xTqjCjRgQHTb4ZXexH9rtHou1Lf03GKzmhhQ==", + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.30.1.tgz", + "integrity": "sha512-xi6IyHML+c9+Q3W0S4fCQJOym42pyurFiJUHEcEyHS0CeKzia4yZDEsLlqOFykxOdHpNy0NmvVO31vcSqAxJCg==", "license": "MPL-2.0", "dependencies": { "detect-libc": "^2.0.3" @@ -12033,22 +12128,22 @@ "url": "https://opencollective.com/parcel" }, "optionalDependencies": { - "lightningcss-darwin-arm64": "1.29.3", - "lightningcss-darwin-x64": "1.29.3", - "lightningcss-freebsd-x64": "1.29.3", - "lightningcss-linux-arm-gnueabihf": "1.29.3", - "lightningcss-linux-arm64-gnu": "1.29.3", - "lightningcss-linux-arm64-musl": "1.29.3", - "lightningcss-linux-x64-gnu": "1.29.3", - "lightningcss-linux-x64-musl": "1.29.3", - "lightningcss-win32-arm64-msvc": "1.29.3", - "lightningcss-win32-x64-msvc": "1.29.3" + "lightningcss-darwin-arm64": "1.30.1", + "lightningcss-darwin-x64": "1.30.1", + "lightningcss-freebsd-x64": "1.30.1", + "lightningcss-linux-arm-gnueabihf": "1.30.1", + "lightningcss-linux-arm64-gnu": "1.30.1", + "lightningcss-linux-arm64-musl": "1.30.1", + "lightningcss-linux-x64-gnu": "1.30.1", + "lightningcss-linux-x64-musl": "1.30.1", + "lightningcss-win32-arm64-msvc": "1.30.1", + "lightningcss-win32-x64-msvc": "1.30.1" } }, "node_modules/lightningcss-darwin-arm64": { - "version": "1.29.3", - "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.29.3.tgz", - "integrity": "sha512-fb7raKO3pXtlNbQbiMeEu8RbBVHnpyqAoxTyTRMEWFQWmscGC2wZxoHzZ+YKAepUuKT9uIW5vL2QbFivTgprZg==", + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.30.1.tgz", + "integrity": "sha512-c8JK7hyE65X1MHMN+Viq9n11RRC7hgin3HhYKhrMyaXflk5GVplZ60IxyoVtzILeKr+xAJwg6zK6sjTBJ0FKYQ==", "cpu": [ "arm64" ], @@ -12066,9 +12161,9 @@ } }, "node_modules/lightningcss-darwin-x64": { - "version": "1.29.3", - "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.29.3.tgz", - "integrity": "sha512-KF2XZ4ZdmDGGtEYmx5wpzn6u8vg7AdBHaEOvDKu8GOs7xDL/vcU2vMKtTeNe1d4dogkDdi3B9zC77jkatWBwEQ==", + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.30.1.tgz", + "integrity": "sha512-k1EvjakfumAQoTfcXUcHQZhSpLlkAuEkdMBsI/ivWw9hL+7FtilQc0Cy3hrx0AAQrVtQAbMI7YjCgYgvn37PzA==", "cpu": [ "x64" ], @@ -12086,9 +12181,9 @@ } }, "node_modules/lightningcss-freebsd-x64": { - "version": "1.29.3", - "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.29.3.tgz", - "integrity": "sha512-VUWeVf+V1UM54jv9M4wen9vMlIAyT69Krl9XjI8SsRxz4tdNV/7QEPlW6JASev/pYdiynUCW0pwaFquDRYdxMw==", + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.30.1.tgz", + "integrity": "sha512-kmW6UGCGg2PcyUE59K5r0kWfKPAVy4SltVeut+umLCFoJ53RdCUWxcRDzO1eTaxf/7Q2H7LTquFHPL5R+Gjyig==", "cpu": [ "x64" ], @@ -12106,9 +12201,9 @@ } }, "node_modules/lightningcss-linux-arm-gnueabihf": { - "version": "1.29.3", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.29.3.tgz", - "integrity": "sha512-UhgZ/XVNfXQVEJrMIWeK1Laj8KbhjbIz7F4znUk7G4zeGw7TRoJxhb66uWrEsonn1+O45w//0i0Fu0wIovYdYg==", + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.30.1.tgz", + "integrity": "sha512-MjxUShl1v8pit+6D/zSPq9S9dQ2NPFSQwGvxBCYaBYLPlCWuPh9/t1MRS8iUaR8i+a6w7aps+B4N0S1TYP/R+Q==", "cpu": [ "arm" ], @@ -12126,9 +12221,9 @@ } }, "node_modules/lightningcss-linux-arm64-gnu": { - "version": "1.29.3", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.29.3.tgz", - "integrity": "sha512-Pqau7jtgJNmQ/esugfmAT1aCFy/Gxc92FOxI+3n+LbMHBheBnk41xHDhc0HeYlx9G0xP5tK4t0Koy3QGGNqypw==", + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.30.1.tgz", + "integrity": "sha512-gB72maP8rmrKsnKYy8XUuXi/4OctJiuQjcuqWNlJQ6jZiWqtPvqFziskH3hnajfvKB27ynbVCucKSm2rkQp4Bw==", "cpu": [ "arm64" ], @@ -12146,9 +12241,9 @@ } }, "node_modules/lightningcss-linux-arm64-musl": { - "version": "1.29.3", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.29.3.tgz", - "integrity": "sha512-dxakOk66pf7KLS7VRYFO7B8WOJLecE5OPL2YOk52eriFd/yeyxt2Km5H0BjLfElokIaR+qWi33gB8MQLrdAY3A==", + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.30.1.tgz", + "integrity": "sha512-jmUQVx4331m6LIX+0wUhBbmMX7TCfjF5FoOH6SD1CttzuYlGNVpA7QnrmLxrsub43ClTINfGSYyHe2HWeLl5CQ==", "cpu": [ "arm64" ], @@ -12166,9 +12261,9 @@ } }, "node_modules/lightningcss-linux-x64-gnu": { - "version": "1.29.3", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.29.3.tgz", - "integrity": "sha512-ySZTNCpbfbK8rqpKJeJR2S0g/8UqqV3QnzcuWvpI60LWxnFN91nxpSSwCbzfOXkzKfar9j5eOuOplf+klKtINg==", + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.30.1.tgz", + "integrity": "sha512-piWx3z4wN8J8z3+O5kO74+yr6ze/dKmPnI7vLqfSqI8bccaTGY5xiSGVIJBDd5K5BHlvVLpUB3S2YCfelyJ1bw==", "cpu": [ "x64" ], @@ -12186,9 +12281,9 @@ } }, "node_modules/lightningcss-linux-x64-musl": { - "version": "1.29.3", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.29.3.tgz", - "integrity": "sha512-3pVZhIzW09nzi10usAXfIGTTSTYQ141dk88vGFNCgawIzayiIzZQxEcxVtIkdvlEq2YuFsL9Wcj/h61JHHzuFQ==", + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.30.1.tgz", + "integrity": "sha512-rRomAK7eIkL+tHY0YPxbc5Dra2gXlI63HL+v1Pdi1a3sC+tJTcFrHX+E86sulgAXeI7rSzDYhPSeHHjqFhqfeQ==", "cpu": [ "x64" ], @@ -12206,9 +12301,9 @@ } }, "node_modules/lightningcss-win32-arm64-msvc": { - "version": "1.29.3", - "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.29.3.tgz", - "integrity": "sha512-VRnkAvtIkeWuoBJeGOTrZxsNp4HogXtcaaLm8agmbYtLDOhQdpgxW6NjZZjDXbvGF+eOehGulXZ3C1TiwHY4QQ==", + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.30.1.tgz", + "integrity": "sha512-mSL4rqPi4iXq5YVqzSsJgMVFENoa4nGTT/GjO2c0Yl9OuQfPsIfncvLrEW6RbbB24WtZ3xP/2CCmI3tNkNV4oA==", "cpu": [ "arm64" ], @@ -12226,9 +12321,9 @@ } }, "node_modules/lightningcss-win32-x64-msvc": { - "version": "1.29.3", - "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.29.3.tgz", - "integrity": "sha512-IszwRPu2cPnDQsZpd7/EAr0x2W7jkaWqQ1SwCVIZ/tSbZVXPLt6k8s6FkcyBjViCzvB5CW0We0QbbP7zp2aBjQ==", + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.30.1.tgz", + "integrity": "sha512-PVqXh48wh4T53F/1CCu8PIPCxLzWyCnn/9T5W1Jpmdy5h9Cwd+0YQS6/LwhHXSafuc61/xg9Lv5OrCby6a++jg==", "cpu": [ "x64" ], @@ -14945,9 +15040,9 @@ } }, "node_modules/normalize-url": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-8.0.1.tgz", - "integrity": "sha512-IO9QvjUMWxPQQhs60oOu10CRkWCiZzSUkzbXGGV9pviYl1fXYcvkzQ5jV9z8Y6un8ARoVRl4EtC6v6jNqbaJ/w==", + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-8.0.2.tgz", + "integrity": "sha512-Ee/R3SyN4BuynXcnTaekmaVdbDAEiNrHqjQIA37mHU8G9pf7aaAD4ZX3XjBLo6rsdcxA/gtkcNYZLt30ACgynw==", "license": "MIT", "engines": { "node": ">=14.16" @@ -15391,12 +15486,12 @@ "license": "ISC" }, "node_modules/parse5": { - "version": "7.2.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.2.1.tgz", - "integrity": "sha512-BuBYQYlv1ckiPdQi/ohiivi9Sagc9JG+Ozs0r7b/0iK3sKmrb0b9FdWdBbOdx6hBCM/F9Ir82ofnBhtZOjCRPQ==", + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz", + "integrity": "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==", "license": "MIT", "dependencies": { - "entities": "^4.5.0" + "entities": "^6.0.0" }, "funding": { "url": "https://github.com/inikulin/parse5?sponsor=1" @@ -15415,6 +15510,18 @@ "url": "https://github.com/inikulin/parse5?sponsor=1" } }, + "node_modules/parse5/node_modules/entities": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", + "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, "node_modules/parseurl": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", @@ -16842,9 +16949,9 @@ } }, "node_modules/postcss-preset-env": { - "version": "10.2.3", - "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-10.2.3.tgz", - "integrity": "sha512-zlQN1yYmA7lFeM1wzQI14z97mKoM8qGng+198w1+h6sCud/XxOjcKtApY9jWr7pXNS3yHDEafPlClSsWnkY8ow==", + "version": "10.2.4", + "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-10.2.4.tgz", + "integrity": "sha512-q+lXgqmTMdB0Ty+EQ31SuodhdfZetUlwCA/F0zRcd/XdxjzI+Rl2JhZNz5US2n/7t9ePsvuhCnEN4Bmu86zXlA==", "funding": [ { "type": "github", @@ -16857,7 +16964,7 @@ ], "license": "MIT-0", "dependencies": { - "@csstools/postcss-cascade-layers": "^5.0.1", + "@csstools/postcss-cascade-layers": "^5.0.2", "@csstools/postcss-color-function": "^4.0.10", "@csstools/postcss-color-mix-function": "^3.0.10", "@csstools/postcss-color-mix-variadic-function-arguments": "^1.0.0", @@ -17215,9 +17322,9 @@ "license": "MIT" }, "node_modules/property-information": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/property-information/-/property-information-7.0.0.tgz", - "integrity": "sha512-7D/qOz/+Y4X/rzSB6jKxKUsQnphO046ei8qxG59mtM3RG3DHgTK81HrxrmoDVINJb8NKT5ZsRbwHvQ6B68Iyhg==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-7.1.0.tgz", + "integrity": "sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==", "license": "MIT", "funding": { "type": "github", @@ -17380,6 +17487,12 @@ "rc": "cli.js" } }, + "node_modules/rc/node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "license": "ISC" + }, "node_modules/rc/node_modules/strip-json-comments": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", @@ -17485,6 +17598,53 @@ "webpack": ">=4.41.1 || 5.x" } }, + "node_modules/react-remove-scroll": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.7.1.tgz", + "integrity": "sha512-HpMh8+oahmIdOuS5aFKKY6Pyog+FNaZV/XyJOq7b4YFwsFHe5yYfdbIalI4k3vU2nSDql7YskmUseHsRrJqIPA==", + "license": "MIT", + "dependencies": { + "react-remove-scroll-bar": "^2.3.7", + "react-style-singleton": "^2.2.3", + "tslib": "^2.1.0", + "use-callback-ref": "^1.3.3", + "use-sidecar": "^1.1.3" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-remove-scroll-bar": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.8.tgz", + "integrity": "sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q==", + "license": "MIT", + "dependencies": { + "react-style-singleton": "^2.2.2", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, "node_modules/react-router": { "version": "5.3.4", "resolved": "https://registry.npmjs.org/react-router/-/react-router-5.3.4.tgz", @@ -17542,6 +17702,28 @@ "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", "license": "MIT" }, + "node_modules/react-style-singleton": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.2.3.tgz", + "integrity": "sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ==", + "license": "MIT", + "dependencies": { + "get-nonce": "^1.0.0", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, "node_modules/react-transition-group": { "version": "4.4.5", "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz", @@ -17675,12 +17857,6 @@ "node": ">=4" } }, - "node_modules/regenerator-runtime": { - "version": "0.14.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", - "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", - "license": "MIT" - }, "node_modules/regexpu-core": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.2.0.tgz", @@ -18163,6 +18339,27 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/rimraf/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/rtlcss": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/rtlcss/-/rtlcss-4.3.0.tgz", @@ -18252,9 +18449,9 @@ "license": "Apache-2.0" }, "node_modules/schema-utils": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.0.tgz", - "integrity": "sha512-Gf9qqc58SpCA/xdziiHz35F4GNIWYWZrEshUc/G/r5BnLph6xpKuLeoJoQuj5WfBIx/eQLf+hmVPYHaxJu7V2g==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.2.tgz", + "integrity": "sha512-Gn/JaSk/Mt9gYubxTtSn/QCV4em9mpAPiR1rqy/Ocu19u/G9J5WWdNoUT4SiV6mFC3y6cxyFcFwdzPM3FgxGAQ==", "license": "MIT", "dependencies": { "@types/json-schema": "^7.0.9", @@ -18310,9 +18507,9 @@ } }, "node_modules/semver": { - "version": "7.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", - "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", "license": "ISC", "bin": { "semver": "bin/semver.js" @@ -18579,9 +18776,9 @@ } }, "node_modules/shell-quote": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.2.tgz", - "integrity": "sha512-AzqKpGKjrj7EM6rKVQEPpB288oCfnrEIuyoT9cyF4nmGa7V8Zk6f7RRqYisX8X9m+Q7bd632aZW4ky7EhbQztA==", + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.3.tgz", + "integrity": "sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==", "license": "MIT", "engines": { "node": ">= 0.4" @@ -19032,18 +19229,18 @@ } }, "node_modules/style-to-js": { - "version": "1.1.16", - "resolved": "https://registry.npmjs.org/style-to-js/-/style-to-js-1.1.16.tgz", - "integrity": "sha512-/Q6ld50hKYPH3d/r6nr117TZkHR0w0kGGIVfpG9N6D8NymRPM9RqCUv4pRpJ62E5DqOYx2AFpbZMyCPnjQCnOw==", + "version": "1.1.17", + "resolved": "https://registry.npmjs.org/style-to-js/-/style-to-js-1.1.17.tgz", + "integrity": "sha512-xQcBGDxJb6jjFCTzvQtfiPn6YvvP2O8U1MDIPNfJQlWMYfktPy+iGsHE7cssjs7y84d9fQaK4UF3RIJaAHSoYA==", "license": "MIT", "dependencies": { - "style-to-object": "1.0.8" + "style-to-object": "1.0.9" } }, "node_modules/style-to-object": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-1.0.8.tgz", - "integrity": "sha512-xT47I/Eo0rwJmaXC4oilDGDWLohVhR6o/xAQcPQN8q6QBuZVL8qMYL85kLmST5cPjAorwvqIA4qXTRQoYHaL6g==", + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-1.0.9.tgz", + "integrity": "sha512-G4qppLgKu/k6FwRpHiGiKPaPTFcG3g4wNVX/Qsfu+RqQM30E7Tyu/TEgxcL9PNLF5pdRLwQdE3YKKf+KF2Dzlw==", "license": "MIT", "dependencies": { "inline-style-parser": "0.2.4" @@ -19093,15 +19290,6 @@ "node": ">=16 || 14 >=14.17" } }, - "node_modules/sucrase/node_modules/brace-expansion": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, "node_modules/sucrase/node_modules/commander": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", @@ -19111,41 +19299,6 @@ "node": ">= 6" } }, - "node_modules/sucrase/node_modules/glob": { - "version": "10.4.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", - "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", - "license": "ISC", - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/sucrase/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -19292,22 +19445,22 @@ } }, "node_modules/tapable": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", - "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.2.tgz", + "integrity": "sha512-Re10+NauLTMCudc7T5WLFLAwDhQ0JWdrMK+9B2M8zR5hRExKmsRDCBA7/aV/pNJFltmBFO5BAMlQFi/vq3nKOg==", "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/terser": { - "version": "5.39.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.39.0.tgz", - "integrity": "sha512-LBAhFyLho16harJoWMg/nZsQYgTrg5jXOn2nCYjRUcZZEdE3qa2zb8QEDRUGVZBW4rlazf2fxkg8tztybTaqWw==", + "version": "5.43.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.43.1.tgz", + "integrity": "sha512-+6erLbBm0+LROX2sPXlUYx/ux5PyE9K/a92Wrt6oA+WDAoFTdpHE5tCYCI5PNzq2y8df4rA+QgHLJuR4jNymsg==", "license": "BSD-2-Clause", "dependencies": { "@jridgewell/source-map": "^0.3.3", - "acorn": "^8.8.2", + "acorn": "^8.14.0", "commander": "^2.20.0", "source-map-support": "~0.5.20" }, @@ -19567,9 +19720,9 @@ } }, "node_modules/undici-types": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", - "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.8.0.tgz", + "integrity": "sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw==", "license": "MIT" }, "node_modules/unicode-canonical-property-names-ecmascript": { @@ -19964,6 +20117,49 @@ "url": "https://opencollective.com/webpack" } }, + "node_modules/use-callback-ref": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.3.tgz", + "integrity": "sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/use-sidecar": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/use-sidecar/-/use-sidecar-1.1.3.tgz", + "integrity": "sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ==", + "license": "MIT", + "dependencies": { + "detect-node-es": "^1.1.0", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", @@ -20074,9 +20270,9 @@ } }, "node_modules/watchpack": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.2.tgz", - "integrity": "sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw==", + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.4.tgz", + "integrity": "sha512-c5EGNOiyxxV5qmTtAB7rbiXxi1ooX1pQKMLX/MIabJjRA0SJBQOjKF+KSVfHkr9U1cADPon0mRiVe/riyaiDUA==", "license": "MIT", "dependencies": { "glob-to-regexp": "^0.4.1", @@ -20106,13 +20302,14 @@ } }, "node_modules/webpack": { - "version": "5.99.5", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.99.5.tgz", - "integrity": "sha512-q+vHBa6H9qwBLUlHL4Y7L0L1/LlyBKZtS9FHNCQmtayxjI5RKC9yD8gpvLeqGv5lCQp1Re04yi0MF40pf30Pvg==", + "version": "5.99.9", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.99.9.tgz", + "integrity": "sha512-brOPwM3JnmOa+7kd3NsmOUOwbDAj8FT9xDsG3IW0MgbN9yZV7Oi/s/+MNQ/EcSMqw7qfoRyXPoeEWT8zLVdVGg==", "license": "MIT", "dependencies": { "@types/eslint-scope": "^3.7.7", "@types/estree": "^1.0.6", + "@types/json-schema": "^7.0.15", "@webassemblyjs/ast": "^1.14.1", "@webassemblyjs/wasm-edit": "^1.14.1", "@webassemblyjs/wasm-parser": "^1.14.1", @@ -20129,7 +20326,7 @@ "loader-runner": "^4.2.0", "mime-types": "^2.1.27", "neo-async": "^2.6.2", - "schema-utils": "^4.3.0", + "schema-utils": "^4.3.2", "tapable": "^2.1.1", "terser-webpack-plugin": "^5.3.11", "watchpack": "^2.4.1", @@ -20299,9 +20496,9 @@ } }, "node_modules/webpack-dev-server/node_modules/ws": { - "version": "8.18.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.1.tgz", - "integrity": "sha512-RKW2aJZMXeMxVpnZ6bck+RswznaxmzdULiBr6KY7XkTnW8uvt0iT9H5DkHUChXrc+uurzwa0rVI16n/Xzjdz1w==", + "version": "8.18.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz", + "integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==", "license": "MIT", "engines": { "node": ">=10.0.0" @@ -20334,9 +20531,9 @@ } }, "node_modules/webpack-sources": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", - "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.3.3.tgz", + "integrity": "sha512-yd1RBzSGanHkitROoPFd6qsrxt+oFhg/129YzheDGqeustzX0vTZJZsSsQjVQC4yzBQ56K55XU8gaNCtIzOnTg==", "license": "MIT", "engines": { "node": ">=10.13.0" @@ -20658,15 +20855,15 @@ "license": "ISC" }, "node_modules/yaml": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.7.1.tgz", - "integrity": "sha512-10ULxpnOCQXxJvBgxsn9ptjq6uviG/htZKk9veJGhlqn3w/DxQ631zFF+nlQXLwmImeS5amR2dl2U8sg6U9jsQ==", + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.0.tgz", + "integrity": "sha512-4lLa/EcQCB0cJkyts+FpIRx5G/llPxfP6VQU5KByHEhLxY3IJCH0f0Hy1MHI8sClTvsIb8qwRJ6R/ZdlDJ/leQ==", "license": "ISC", "bin": { "yaml": "bin.mjs" }, "engines": { - "node": ">= 14" + "node": ">= 14.6" } }, "node_modules/yocto-queue": { diff --git a/crowdsec-docs/package.json b/crowdsec-docs/package.json index 65e018791..b7ce2fd9a 100644 --- a/crowdsec-docs/package.json +++ b/crowdsec-docs/package.json @@ -30,10 +30,10 @@ "@mui/icons-material": "^5.11.16", "@mui/material": "^5.13.4", "@mui/x-date-pickers": "^6.18.0", + "@radix-ui/react-popover": "^1.0.7", "@radix-ui/react-slot": "^1.2.3", - "@radix-ui/react-popover": "^1.1.14", - "@radix-ui/react-tooltip": "^1.1.2", - "animate-css": "^1.3.4", + "@radix-ui/react-tooltip": "^1.2.7", + "animate.css": "^4.1.1", "class-variance-authority": "^0.7.1", "clsx": "^2.1.1", "docusaurus-plugin-zooming": "^1.0.0", @@ -50,11 +50,14 @@ "@docusaurus/module-type-aliases": "^3.8.1", "@docusaurus/tsconfig": "^3.8.1", "@docusaurus/types": "^3.8.1", - "autoprefixer": "^10.4.20", + "autoprefixer": "^10.4.21", "postcss": "^8.4.47", "tailwindcss": "^3.4.14", "typescript": "^5.8.3" }, + "resolutions": { + "@types/react": "^18.3.0" + }, "browserslist": { "production": [ ">0.5%", diff --git a/crowdsec-docs/sidebarsUnversioned.ts b/crowdsec-docs/sidebarsUnversioned.ts index 3e6e1d951..1f30cc6de 100644 --- a/crowdsec-docs/sidebarsUnversioned.ts +++ b/crowdsec-docs/sidebarsUnversioned.ts @@ -3,658 +3,655 @@ import type { SidebarsConfig } from "@docusaurus/plugin-content-docs"; type SidebarConfig = SidebarsConfig[string]; const sidebarsUnversionedConfig: SidebarConfig = { - ctiApiSidebar: [ - { - type: "doc", - label: "Introduction", - id: "cti_api/intro", - }, - { - type: "doc", - label: "Getting Started", - id: "cti_api/getting_started", - }, - { - type: "category", - label: "Taxonomy", - items: [ - "cti_api/taxonomy/intro", - "cti_api/taxonomy/cti_object", - "cti_api/taxonomy/scores", - "cti_api/taxonomy/scenarios", - "cti_api/taxonomy/behaviors", - "cti_api/taxonomy/classifications", - "cti_api/taxonomy/false_positives", - "cti_api/taxonomy/benign", - ], - }, - { - type: "link", - label: "Swagger", - href: "https://crowdsecurity.github.io/cti-api/", - }, - { - type: "category", - label: "Integrations", - link: { - type: "doc", - id: "cti_api/integration_intro", - }, - items: [ - "cti_api/integration_ipdex", - "cti_api/integration_chrome", - "cti_api/integration_gigasheet", - "cti_api/integration_intelowl", - "cti_api/integration_maltego", - "cti_api/integration_misp", - "cti_api/integration_msticpy", - "cti_api/integration_opencti", - "cti_api/integration_paloalto_xsoar", - "cti_api/integration_qradar", - "cti_api/integration_securitycopilot", - "cti_api/integration_sekoia_xdr", - "cti_api/integration_splunk_siem", - "cti_api/integration_splunk_soar", - "cti_api/integration_thehive", - ], - }, - { - type: "doc", - label: "Search Queries", - id: "cti_api/search_queries", - }, - ], - consoleSidebar: [ - { - type: "doc", - label: "Introduction", - id: "console/intro", - }, - { - type: "doc", - label: "Getting Started", - id: "console/getting_started", - }, - { - type: "category", - label: "Security Engine", - link: { - type: "doc", - id: "console/security_engines/dashboard", - }, - items: [ - { - type: "doc", - label: "Dashboard", - id: "console/security_engines/dashboard", - }, - { - type: "doc", - label: "Filter And Sort", - id: "console/security_engines/filter_and_sort", - }, - { - type: "doc", - label: "Pending Security Engines", - id: "console/security_engines/pending_security_engines", - }, - { - type: "doc", - label: "Name and Tags", - id: "console/security_engines/name_and_tags", - }, - { - type: "doc", - label: "Transferring an Engine", - id: "console/security_engines/transfer_engine", - }, - { - type: "doc", - label: "Archiving an Engine", - id: "console/security_engines/archive_engine", - }, - { - type: "doc", - label: "Removing an Engine", - id: "console/security_engines/remove_engine", - }, - { - type: "doc", - label: "Troubleshooting Hints πŸ…", - id: "console/security_engines/troubleshooting", - }, - { - type: "doc", - label: "Am I Under Attack πŸ…", - id: "console/security_engines/am_i_under_attack", - }, - { - type: "doc", - label: "Select multiple organizations πŸ§ͺ", - id: "console/security_engines/select_multiple_organizations", - }, - { - type: "doc", - label: "Details page", - id: "console/security_engines/details_page", - }, - ], - }, - { - label: "Blocklists", - type: "doc", - id: "blocklists/intro", - }, - { - type: "category", - label: "Alerts", - link: { - type: "doc", - id: "console/alerts/intro", - }, - items: [ - { - type: "doc", - label: "Introduction", - id: "console/alerts/intro", - }, - { - type: "doc", - label: "Visualizer", - id: "console/alerts/visualizer", - }, - { - type: "doc", - label: "Alerts analysis", - id: "console/alerts/alerts_analysis", - }, - { - type: "doc", - label: "Alerts contexts", - id: "console/alerts/alerts_contexts", - }, - { - type: "doc", - label: "Background Noise πŸ…", - id: "console/alerts/background_noise", - }, - { - type: "doc", - label: "Quotas", - id: "console/alerts/quotas", - }, - ], - }, - { - type: "doc", - label: "Remediation Metrics", - id: "console/remediation_metrics", - }, - { - type: "category", - label: "CTI", - items: [ - { - type: "doc", - label: "Getting started", - id: "console/cti/getting_started", - }, - { - type: "doc", - label: "CTI API Keys", - id: "console/cti/cti_api_keys", - }, - { - type: "doc", - label: "IP report", - id: "console/cti/ip_report", - }, - { - type: "doc", - label: "Advanced search", - id: "console/cti/advanced_search", - }, - { - type: "doc", - label: "FAQ", - id: "console/cti/faq", - }, - ], - }, - { - type: "category", - label: "Decision", - link: { - type: "doc", - id: "console/decisions/decisions_intro", - }, - items: [ - { - type: "doc", - id: "console/decisions/decisions_management", - label: "Decisions Management πŸ…", - }, - ], - }, - { - type: "category", - label: "Centralized Allowlists πŸ…", - link: { - type: "doc", - id: "console/allowlists", - }, - items: [], - }, - { - type: "category", - label: "Enterprise plan πŸ…", - items: [ - { - type: "doc", - label: "Enterprise support πŸ…", - id: "console/enterprise_plan/enterprise_support", - }, - { - type: "doc", - label: "Invoices πŸ…", - id: "console/enterprise_plan/enterprise_invoices", - }, - ], - }, - { - type: "category", - label: "Threat Forecast πŸ…", - link: { - type: "doc", - id: "console/threat_forecast", - }, - items: [], - }, - { - type: "link", - label: "Service API πŸ…", - href: "/u/service_api/getting_started", - }, - { - type: "category", - label: "Notification integrations πŸ…", - items: [ - { - type: "doc", - label: "Overview", - id: "console/notification_integrations/overview", - }, - { - type: "doc", - label: "Notification Rule", - id: "console/notification_integrations/rule", - }, - { - type: "doc", - label: "Slack", - id: "console/notification_integrations/slack", - }, - { - type: "doc", - label: "Webhook", - id: "console/notification_integrations/webhook", - }, - ], - }, - ], - remediationSideBar: [ - { - type: "doc", - id: "bouncers/intro", - }, - { - type: "doc", - label: "AWS WAF", - id: "bouncers/aws_waf", - }, - { - type: "doc", - label: "Apache", - id: "bouncers/apache_bouncer", - }, - { - type: "doc", - label: "BlockList Mirror", - id: "bouncers/blocklist-mirror", - }, - { - type: "doc", - label: "Cloudflare", - id: "bouncers/cloudflare", - }, - { - type: "doc", - label: "Cloudflare Workers", - id: "bouncers/cloudflare-workers", - }, - { - type: "doc", - label: "Custom", - id: "bouncers/custom", - }, - { - type: "doc", - label: "Fastly", - id: "bouncers/fastly", - }, - { - type: "doc", - label: "Firewall", - id: "bouncers/firewall", - }, - { - type: "doc", - label: "HAProxy", - id: "bouncers/haproxy", - }, - { - type: "doc", - label: "Ingress Nginx", - id: "bouncers/ingress-nginx", - }, - { - type: "doc", - label: "Magento 2", - id: "bouncers/magento", - }, - { - type: "doc", - label: "MISP Feed Generator", - id: "bouncers/misp-feed-generator", - }, - { - type: "doc", - label: "Nginx", - id: "bouncers/nginx", - }, - { - type: "doc", - label: "OpenResty", - id: "bouncers/openresty", - }, - { - type: "doc", - label: "PHP", - id: "bouncers/php", - }, - { - type: "doc", - label: "PHP Library", - id: "bouncers/php-lib", - }, - { - type: "doc", - label: "Windows Firewall", - id: "bouncers/windows_firewall", - }, - { - type: "doc", - label: "Wordpress", - id: "bouncers/wordpress", - }, - { - type: "link", - label: "Third Party", - href: "https://hub.crowdsec.net/browse/#bouncers", - }, - // { - // "type": "doc", - // "label": "Contributing", - // "id": "bouncers/contributing/contributing_bouncers" - // }, - ], - blocklistsSideBar: [ - { - type: "doc", - id: "blocklists/intro", - label: "Introduction", - }, - { - type: "doc", - id: "blocklists/getting_started", - label: "Getting Started", - }, - { - type: "doc", - label: "Featured", - id: "console/blocklists/featured", - }, - { - type: "doc", - label: "Catalog", - id: "console/blocklists/catalog", - }, - { - type: "doc", - label: "Details", - id: "console/blocklists/details", - }, - { - type: "doc", - label: "Subscription", - id: "console/blocklists/subscription", - }, - { - type: "doc", - label: "Security Engine", - id: "blocklists/security_engine", - }, - { - type: "category", - link: { - type: "doc", - id: "integrations/intro", - }, - label: "Integrations", - items: [ - "integrations/checkpoint", - "integrations/cisco", - "integrations/f5", - "integrations/fortinet", - "integrations/genericfirewall", - "integrations/juniper", - "integrations/mikrotik", - "integrations/opnsense", - "integrations/paloalto", - "integrations/pfsense", - "integrations/remediationcomponent", - "integrations/sophos", - ], - }, - ], - troubleshootingSideBar: [ - { - type: "doc", - id: "troubleshooting/intro", - label: "Introduction", - }, - { - type: "doc", - id: "troubleshooting/security_engine", - label: "Security Engine", - }, - { - type: "doc", - id: "troubleshooting/remediation_components", - label: "Remediation Components", - }, - { - type: "doc", - id: "troubleshooting/cti", - label: "CTI", - }, - ], - serviceApiSideBar: [ - { - type: "doc", - id: "service_api/getting_started", - label: "Getting Started", - }, - { - type: "category", - label: "Quickstart", - items: [ - "service_api/quickstart/authentication", - "service_api/quickstart/blocklists", - "service_api/quickstart/integrations", - "service_api/quickstart/allowlists", - "service_api/quickstart/metrics", - ], - }, - { - type: "category", - label: "SDKs", - items: [ - { - type: "doc", - label: "Python", - id: "service_api/sdks/python", - }, - ], - }, - { - type: "link", - label: "Swagger", - href: "https://admin.api.crowdsec.net/v1/docs#/", - }, - { - type: "link", - label: "Redoc", - href: "https://admin.api.crowdsec.net/v1/redoc", - }, - { - type: "doc", - id: "service_api/faq", - label: "FAQ", - }, - ], - guidesSideBar: [ - "user_guides/intro", - { - type: "category", - label: "Management", - items: [ - "user_guides/hub_mgmt", - "user_guides/decisions_mgmt", - "user_guides/bouncers_configuration", - "user_guides/machines_mgmt", - "user_guides/lapi_mgmt", - ], - }, - "user_guides/building", - "user_guides/replay_mode", - "user_guides/cscli_explain", - "user_guides/cscli_macos", - "user_guides/multiserver_setup", - "user_guides/consuming_fastly_logs", - "user_guides/alert_context", - "user_guides/log_centralization", - ], - gettingStarted: [ - { - type: "doc", - id: "getting_started/intro", - label: "🧭 Introduction", - }, - { - type: "category", - label: "πŸ“¦ Installation", - items: [ - "getting_started/installation/linux", - "getting_started/installation/freebsd", - "getting_started/installation/windows", - "getting_started/installation/macos", - "getting_started/installation/docker", - "getting_started/installation/kubernetes", - "getting_started/installation/pfsense", - "getting_started/installation/opnsense", - "getting_started/installation/whm", - ], - }, - { - type: "doc", - id: "getting_started/health_check", - label: "🩺 Stack Health-Check", - }, - { - type: "category", - label: "πŸ’‘ Post Installation Steps", - link: { - type: "doc", - id: "getting_started/next_steps", - }, - items: [ - { - type: "category", - label: "CrowdSec Console", - link: { - type: "doc", - id: "getting_started/post_installation/console", - }, - items: [ - "getting_started/post_installation/console_blocklists", - "getting_started/post_installation/console_hub", - ], - className: "sideBarItemRecommended", // to display tag - }, - { - type: "doc", - id: "getting_started/post_installation/whitelists", - label: "Whitelisting IPs", - className: "sideBarItemRecommended", - }, - { - type: "category", - label: "Acquisition", - className: "sideBarItemOptional", - link: { - type: "doc", - id: "getting_started/post_installation/acquisition", - }, - items: [ - { - type: "doc", - id: "getting_started/post_installation/acquisition_new", - label: "Adding a new Acquisition", - }, - { - type: "doc", - id: "getting_started/post_installation/acquisition_troubleshoot", - label: "Acquisition issues 🚨", - }, - ], - }, - { - type: "doc", - id: "getting_started/post_installation/profiles", - label: "Profiles", - className: "sideBarItemOptional", - }, - { - type: "doc", - id: "getting_started/post_installation/metrics", - label: "Metrics", - className: "sideBarItemOptional", - }, - { - type: "doc", - id: "getting_started/post_installation/troubleshoot", - label: "General Troubleshooting 🚨", - }, - ], - }, - { - type: "link", - label: "πŸ› οΈ Technical Documentation", - href: "/docs/next/intro", - }, - ], -} + ctiApiSidebar: [ + { + type: "doc", + label: "Introduction", + id: "cti_api/intro", + }, + { + type: "doc", + label: "Getting Started", + id: "cti_api/getting_started", + }, + { + type: "category", + label: "Taxonomy", + items: [ + "cti_api/taxonomy/intro", + "cti_api/taxonomy/cti_object", + "cti_api/taxonomy/scores", + "cti_api/taxonomy/scenarios", + "cti_api/taxonomy/behaviors", + "cti_api/taxonomy/classifications", + "cti_api/taxonomy/false_positives", + "cti_api/taxonomy/benign", + ], + }, + { + type: "link", + label: "Swagger", + href: "https://crowdsecurity.github.io/cti-api/", + }, + { + type: "category", + label: "Integrations", + link: { + type: "doc", + id: "cti_api/integration_intro", + }, + items: [ + "cti_api/integration_ipdex", + "cti_api/integration_chrome", + "cti_api/integration_gigasheet", + "cti_api/integration_intelowl", + "cti_api/integration_maltego", + "cti_api/integration_misp", + "cti_api/integration_msticpy", + "cti_api/integration_opencti", + "cti_api/integration_paloalto_xsoar", + "cti_api/integration_qradar", + "cti_api/integration_securitycopilot", + "cti_api/integration_sekoia_xdr", + "cti_api/integration_splunk_siem", + "cti_api/integration_splunk_soar", + "cti_api/integration_thehive", + ], + }, + { + type: "doc", + label: "Search Queries", + id: "cti_api/search_queries", + }, + ], + consoleSidebar: [ + { + type: "doc", + label: "Introduction", + id: "console/intro", + }, + { + type: "doc", + label: "Getting Started", + id: "console/getting_started", + }, + { + type: "category", + label: "Security Engine", + link: { + type: "doc", + id: "console/security_engines/dashboard", + }, + items: [ + { + type: "doc", + label: "Dashboard", + id: "console/security_engines/dashboard", + }, + { + type: "doc", + label: "Filter And Sort", + id: "console/security_engines/filter_and_sort", + }, + { + type: "doc", + label: "Pending Security Engines", + id: "console/security_engines/pending_security_engines", + }, + { + type: "doc", + label: "Name and Tags", + id: "console/security_engines/name_and_tags", + }, + { + type: "doc", + label: "Transferring an Engine", + id: "console/security_engines/transfer_engine", + }, + { + type: "doc", + label: "Archiving an Engine", + id: "console/security_engines/archive_engine", + }, + { + type: "doc", + label: "Removing an Engine", + id: "console/security_engines/remove_engine", + }, + { + type: "doc", + label: "Troubleshooting Hints πŸ…", + id: "console/security_engines/troubleshooting", + }, + { + type: "doc", + label: "Am I Under Attack πŸ…", + id: "console/security_engines/am_i_under_attack", + }, + { + type: "doc", + label: "Select multiple organizations πŸ§ͺ", + id: "console/security_engines/select_multiple_organizations", + }, + { + type: "doc", + label: "Details page", + id: "console/security_engines/details_page", + }, + ], + }, + { + label: "Blocklists", + type: "doc", + id: "blocklists/intro", + }, + { + type: "category", + label: "Alerts", + link: { + type: "doc", + id: "console/alerts/intro", + }, + items: [ + { + type: "doc", + label: "Introduction", + id: "console/alerts/intro", + }, + { + type: "doc", + label: "Visualizer", + id: "console/alerts/visualizer", + }, + { + type: "doc", + label: "Alerts analysis", + id: "console/alerts/alerts_analysis", + }, + { + type: "doc", + label: "Alerts contexts", + id: "console/alerts/alerts_contexts", + }, + { + type: "doc", + label: "Background Noise πŸ…", + id: "console/alerts/background_noise", + }, + { + type: "doc", + label: "Quotas", + id: "console/alerts/quotas", + }, + ], + }, + { + type: "doc", + label: "Remediation Metrics", + id: "console/remediation_metrics", + }, + { + type: "category", + label: "CTI", + items: [ + { + type: "doc", + label: "Getting started", + id: "console/cti/getting_started", + }, + { + type: "doc", + label: "CTI API Keys", + id: "console/cti/cti_api_keys", + }, + { + type: "doc", + label: "IP report", + id: "console/cti/ip_report", + }, + { + type: "doc", + label: "Advanced search", + id: "console/cti/advanced_search", + }, + { + type: "doc", + label: "FAQ", + id: "console/cti/faq", + }, + ], + }, + { + type: "category", + label: "Decision", + link: { + type: "doc", + id: "console/decisions/decisions_intro", + }, + items: [ + { + type: "doc", + id: "console/decisions/decisions_management", + label: "Decisions Management πŸ…", + }, + ], + }, + { + type: "category", + label: "Centralized Allowlists πŸ…", + link: { + type: "doc", + id: "console/allowlists", + }, + items: [], + }, + { + type: "category", + label: "Enterprise plan πŸ…", + items: [ + { + type: "doc", + label: "Enterprise support πŸ…", + id: "console/enterprise_plan/enterprise_support", + }, + { + type: "doc", + label: "Invoices πŸ…", + id: "console/enterprise_plan/enterprise_invoices", + }, + ], + }, + { + type: "category", + label: "Threat Forecast πŸ…", + link: { + type: "doc", + id: "console/threat_forecast", + }, + items: [], + }, + { + type: "link", + label: "Service API πŸ…", + href: "/u/service_api/getting_started", + }, + { + type: "category", + label: "Notification integrations πŸ…", + items: [ + { + type: "doc", + label: "Overview", + id: "console/notification_integrations/overview", + }, + { + type: "doc", + label: "Notification Rule", + id: "console/notification_integrations/rule", + }, + { + type: "doc", + label: "Slack", + id: "console/notification_integrations/slack", + }, + { + type: "doc", + label: "Webhook", + id: "console/notification_integrations/webhook", + }, + ], + }, + ], + remediationSideBar: [ + { + type: "doc", + id: "bouncers/intro", + }, + { + type: "doc", + label: "AWS WAF", + id: "bouncers/aws_waf", + }, + { + type: "doc", + label: "Apache", + id: "bouncers/apache_bouncer", + }, + { + type: "doc", + label: "BlockList Mirror", + id: "bouncers/blocklist-mirror", + }, + { + type: "doc", + label: "Cloudflare", + id: "bouncers/cloudflare", + }, + { + type: "doc", + label: "Cloudflare Workers", + id: "bouncers/cloudflare-workers", + }, + { + type: "doc", + label: "Custom", + id: "bouncers/custom", + }, + { + type: "doc", + label: "Fastly", + id: "bouncers/fastly", + }, + { + type: "doc", + label: "Firewall", + id: "bouncers/firewall", + }, + { + type: "doc", + label: "HAProxy", + id: "bouncers/haproxy", + }, + { + type: "doc", + label: "Ingress Nginx", + id: "bouncers/ingress-nginx", + }, + { + type: "doc", + label: "Magento 2", + id: "bouncers/magento", + }, + { + type: "doc", + label: "MISP Feed Generator", + id: "bouncers/misp-feed-generator", + }, + { + type: "doc", + label: "Nginx", + id: "bouncers/nginx", + }, + { + type: "doc", + label: "OpenResty", + id: "bouncers/openresty", + }, + { + type: "doc", + label: "PHP", + id: "bouncers/php", + }, + { + type: "doc", + label: "PHP Library", + id: "bouncers/php-lib", + }, + { + type: "doc", + label: "Windows Firewall", + id: "bouncers/windows_firewall", + }, + { + type: "doc", + label: "Wordpress", + id: "bouncers/wordpress", + }, + { + type: "link", + label: "Third Party", + href: "https://hub.crowdsec.net/browse/#bouncers", + }, + // { + // "type": "doc", + // "label": "Contributing", + // "id": "bouncers/contributing/contributing_bouncers" + // }, + ], + blocklistsSideBar: [ + { + type: "doc", + id: "blocklists/intro", + label: "Introduction", + }, + { + type: "doc", + id: "blocklists/getting_started", + label: "Getting Started", + }, + { + type: "doc", + label: "Featured", + id: "console/blocklists/featured", + }, + { + type: "doc", + label: "Catalog", + id: "console/blocklists/catalog", + }, + { + type: "doc", + label: "Details", + id: "console/blocklists/details", + }, + { + type: "doc", + label: "Subscription", + id: "console/blocklists/subscription", + }, + { + type: "doc", + label: "Security Engine", + id: "blocklists/security_engine", + }, + { + type: "category", + link: { + type: "doc", + id: "integrations/intro", + }, + label: "Integrations", + items: [ + "integrations/checkpoint", + "integrations/cisco", + "integrations/f5", + "integrations/fortinet", + "integrations/genericfirewall", + "integrations/juniper", + "integrations/mikrotik", + "integrations/opnsense", + "integrations/paloalto", + "integrations/pfsense", + "integrations/remediationcomponent", + "integrations/sophos", + ], + }, + ], + troubleshootingSideBar: [ + { + type: "doc", + id: "troubleshooting/intro", + label: "Introduction", + }, + { + type: "doc", + id: "troubleshooting/security_engine", + label: "Security Engine", + }, + { + type: "doc", + id: "troubleshooting/remediation_components", + label: "Remediation Components", + }, + { + type: "doc", + id: "troubleshooting/cti", + label: "CTI", + }, + ], + serviceApiSideBar: [ + { + type: "doc", + id: "service_api/getting_started", + label: "Getting Started", + }, + { + type: "category", + label: "Quickstart", + items: [ + "service_api/quickstart/authentication", + "service_api/quickstart/blocklists", + "service_api/quickstart/integrations", + "service_api/quickstart/allowlists", + "service_api/quickstart/metrics", + ], + }, + { + type: "category", + label: "SDKs", + items: [ + { + type: "doc", + label: "Python", + id: "service_api/sdks/python", + }, + ], + }, + { + type: "link", + label: "Swagger", + href: "https://admin.api.crowdsec.net/v1/docs#/", + }, + { + type: "link", + label: "Redoc", + href: "https://admin.api.crowdsec.net/v1/redoc", + }, + { + type: "doc", + id: "service_api/faq", + label: "FAQ", + }, + ], + guidesSideBar: [ + "user_guides/intro", + { + type: "category", + label: "Management", + items: [ + "user_guides/hub_mgmt", + "user_guides/decisions_mgmt", + "user_guides/bouncers_configuration", + "user_guides/machines_mgmt", + "user_guides/lapi_mgmt", + ], + }, + "user_guides/building", + "user_guides/replay_mode", + "user_guides/cscli_explain", + "user_guides/cscli_macos", + "user_guides/multiserver_setup", + "user_guides/consuming_fastly_logs", + "user_guides/alert_context", + "user_guides/log_centralization", + ], + gettingStarted: [ + { + type: "doc", + id: "getting_started/intro", + label: "🧭 Introduction", + }, + { + type: "category", + label: "πŸ“¦ Installation", + items: [ + "getting_started/installation/linux", + "getting_started/installation/freebsd", + "getting_started/installation/windows", + "getting_started/installation/macos", + "getting_started/installation/docker", + "getting_started/installation/kubernetes", + "getting_started/installation/pfsense", + "getting_started/installation/opnsense", + "getting_started/installation/whm", + ], + }, + { + type: "doc", + id: "getting_started/health_check", + label: "🩺 Stack Health-Check", + }, + { + type: "category", + label: "πŸ’‘ Post Installation Steps", + link: { + type: "doc", + id: "getting_started/next_steps", + }, + items: [ + { + type: "category", + label: "CrowdSec Console", + link: { + type: "doc", + id: "getting_started/post_installation/console", + }, + items: ["getting_started/post_installation/console_blocklists", "getting_started/post_installation/console_hub"], + className: "sideBarItemRecommended", // to display tag + }, + { + type: "doc", + id: "getting_started/post_installation/whitelists", + label: "Whitelisting IPs", + className: "sideBarItemRecommended", + }, + { + type: "category", + label: "Acquisition", + className: "sideBarItemOptional", + link: { + type: "doc", + id: "getting_started/post_installation/acquisition", + }, + items: [ + { + type: "doc", + id: "getting_started/post_installation/acquisition_new", + label: "Adding a new Acquisition", + }, + { + type: "doc", + id: "getting_started/post_installation/acquisition_troubleshoot", + label: "Acquisition issues 🚨", + }, + ], + }, + { + type: "doc", + id: "getting_started/post_installation/profiles", + label: "Profiles", + className: "sideBarItemOptional", + }, + { + type: "doc", + id: "getting_started/post_installation/metrics", + label: "Metrics", + className: "sideBarItemOptional", + }, + { + type: "doc", + id: "getting_started/post_installation/troubleshoot", + label: "General Troubleshooting 🚨", + }, + ], + }, + { + type: "link", + label: "πŸ› οΈ Technical Documentation", + href: "/docs/next/intro", + }, + ], +}; export default sidebarsUnversionedConfig; diff --git a/crowdsec-docs/src/ui/hybridtooltip.tsx b/crowdsec-docs/src/ui/hybridtooltip.tsx index 44b32e9dc..b28de4e1c 100644 --- a/crowdsec-docs/src/ui/hybridtooltip.tsx +++ b/crowdsec-docs/src/ui/hybridtooltip.tsx @@ -1,52 +1,49 @@ -'use client'; +"use client"; -import React from 'react'; -import { PropsWithChildren, createContext, useContext, useEffect, useState } from 'react'; -import { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider } from './tooltip'; -import { Popover, PopoverTrigger, PopoverContent } from './popover'; -import { TooltipContentProps, TooltipProps, TooltipTriggerProps } from '@radix-ui/react-tooltip'; -import { PopoverContentProps, PopoverProps, PopoverTriggerProps } from '@radix-ui/react-popover'; +import { PopoverContentProps, PopoverProps, PopoverTriggerProps } from "@radix-ui/react-popover"; +import { TooltipContentProps, TooltipProps, TooltipTriggerProps } from "@radix-ui/react-tooltip"; +import React, { createContext, PropsWithChildren, useContext, useEffect, useState } from "react"; +import { Popover, PopoverContent, PopoverTrigger } from "./popover"; +import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from "./tooltip"; const TouchContext = createContext(undefined); const useTouch = () => useContext(TouchContext); -export const TouchProvider = (props: PropsWithChildren) => { - const [isTouch, setTouch] = useState(); - - useEffect(() => { - setTouch(window.matchMedia('(pointer: coarse)').matches); - }, []); - - // Conditionally provide the appropriate provider - return ( - - {isTouch ? ( - // Popover doesn't need a provider - <>{props.children} - ) : ( - // Tooltip needs TooltipProvider - - {props.children} - - )} - - ); +export const TouchProvider = (props: PropsWithChildren): React.JSX.Element => { + const [isTouch, setTouch] = useState(); + + useEffect(() => { + setTouch(window.matchMedia("(pointer: coarse)").matches); + }, []); + + // Conditionally provide the appropriate provider + return ( + + {isTouch ? ( + // Popover doesn't need a provider + props.children + ) : ( + // Tooltip needs TooltipProvider + {props.children} + )} + + ); }; export const HybridTooltip = (props: TooltipProps & PopoverProps) => { - const isTouch = useTouch(); + const isTouch = useTouch(); - return isTouch ? : ; + return isTouch ? : ; }; export const HybridTooltipTrigger = (props: TooltipTriggerProps & PopoverTriggerProps) => { - const isTouch = useTouch(); + const isTouch = useTouch(); - return isTouch ? : ; + return isTouch ? : ; }; export const HybridTooltipContent = (props: TooltipContentProps & PopoverContentProps) => { - const isTouch = useTouch(); + const isTouch = useTouch(); - return isTouch ? : ; + return isTouch ? : ; }; diff --git a/crowdsec-docs/src/ui/popover.tsx b/crowdsec-docs/src/ui/popover.tsx index 19d0c8ae8..46794a93b 100644 --- a/crowdsec-docs/src/ui/popover.tsx +++ b/crowdsec-docs/src/ui/popover.tsx @@ -1,31 +1,30 @@ -"use client" +"use client"; -import * as React from "react" -import * as PopoverPrimitive from "@radix-ui/react-popover" +import * as PopoverPrimitive from "@radix-ui/react-popover"; +import { cn } from "@site/src/utils/index"; +import * as React from "react"; -import { cn } from "@site/src/utils/index" +const Popover = PopoverPrimitive.Root; -const Popover = PopoverPrimitive.Root - -const PopoverTrigger = PopoverPrimitive.Trigger +const PopoverTrigger = PopoverPrimitive.Trigger; const PopoverContent = React.forwardRef< - React.ElementRef, - React.ComponentPropsWithoutRef + React.ElementRef, + React.ComponentPropsWithoutRef >(({ className, align = "center", sideOffset = 4, ...props }, ref) => ( - - - -)) -PopoverContent.displayName = PopoverPrimitive.Content.displayName + + + +)); +PopoverContent.displayName = PopoverPrimitive.Content.displayName; -export { Popover, PopoverTrigger, PopoverContent } +export { Popover, PopoverTrigger, PopoverContent }; diff --git a/crowdsec-docs/src/ui/tooltip.tsx b/crowdsec-docs/src/ui/tooltip.tsx index 4cd06c711..44f66cc69 100644 --- a/crowdsec-docs/src/ui/tooltip.tsx +++ b/crowdsec-docs/src/ui/tooltip.tsx @@ -1,29 +1,29 @@ -import * as TooltipPrimitive from "@radix-ui/react-tooltip" -import { cn } from "@site/src/utils" -import React from "react" +import * as TooltipPrimitive from "@radix-ui/react-tooltip"; +import { cn } from "@site/src/utils"; +import React from "react"; -const TooltipProvider = TooltipPrimitive.Provider +const TooltipProvider = TooltipPrimitive.Provider; -const Tooltip = TooltipPrimitive.Root +const Tooltip = TooltipPrimitive.Root; -const TooltipTrigger = TooltipPrimitive.Trigger +const TooltipTrigger = TooltipPrimitive.Trigger; -const ToolTipArrow = TooltipPrimitive.Arrow +const ToolTipArrow = TooltipPrimitive.Arrow; const TooltipContent = React.forwardRef< React.ElementRef, React.ComponentPropsWithoutRef >(({ className, sideOffset = 4, ...props }, ref) => ( - -)) -TooltipContent.displayName = TooltipPrimitive.Content.displayName + +)); +TooltipContent.displayName = TooltipPrimitive.Content.displayName; -export { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider, ToolTipArrow } +export { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider, ToolTipArrow }; From 4ff8b9fcccbdc965608ab3d2c13763f55fc34a21 Mon Sep 17 00:00:00 2001 From: Roussange Alexandre Date: Tue, 8 Jul 2025 11:10:29 +0200 Subject: [PATCH 5/9] feat(ui): :lipstick: update footer design --- crowdsec-docs/src/css/custom.css | 15 +----- .../src/theme/Footer/Copyright/index.tsx | 10 ++++ .../src/theme/Footer/Layout/index.tsx | 26 ++++++++++ .../src/theme/Footer/LinkItem/index.tsx | 27 +++++++++++ .../theme/Footer/Links/MultiColumn/index.tsx | 48 +++++++++++++++++++ .../src/theme/Footer/Links/Simple/index.tsx | 37 ++++++++++++++ .../src/theme/Footer/Links/index.tsx | 9 ++++ crowdsec-docs/src/theme/Footer/Logo/index.tsx | 36 ++++++++++++++ .../src/theme/Footer/Logo/styles.module.css | 9 ++++ crowdsec-docs/src/theme/Footer/index.tsx | 25 ++++++++++ 10 files changed, 228 insertions(+), 14 deletions(-) create mode 100644 crowdsec-docs/src/theme/Footer/Copyright/index.tsx create mode 100644 crowdsec-docs/src/theme/Footer/Layout/index.tsx create mode 100644 crowdsec-docs/src/theme/Footer/LinkItem/index.tsx create mode 100644 crowdsec-docs/src/theme/Footer/Links/MultiColumn/index.tsx create mode 100644 crowdsec-docs/src/theme/Footer/Links/Simple/index.tsx create mode 100644 crowdsec-docs/src/theme/Footer/Links/index.tsx create mode 100644 crowdsec-docs/src/theme/Footer/Logo/index.tsx create mode 100644 crowdsec-docs/src/theme/Footer/Logo/styles.module.css create mode 100644 crowdsec-docs/src/theme/Footer/index.tsx diff --git a/crowdsec-docs/src/css/custom.css b/crowdsec-docs/src/css/custom.css index e983f3ae0..b8a369a56 100644 --- a/crowdsec-docs/src/css/custom.css +++ b/crowdsec-docs/src/css/custom.css @@ -264,7 +264,6 @@ blockquote { --ifm-navbar-link-hover-color: rgb(var(--primary)); } -.footer, .navbar, .navbar-sidebar { @apply bg-card text-foreground border-border/80; @@ -273,19 +272,7 @@ blockquote { } .navbar { - @apply border border-b border-solid; -} - -.footer { - @apply border-0 border-t border-solid; -} - -.footer__copyright { - @apply text-foreground/80 text-sm; -} - -.footer a { - @apply text-foreground hover:text-primary; + @apply border border-b border-solid; } /** Patch some colors **/ diff --git a/crowdsec-docs/src/theme/Footer/Copyright/index.tsx b/crowdsec-docs/src/theme/Footer/Copyright/index.tsx new file mode 100644 index 000000000..9f9636759 --- /dev/null +++ b/crowdsec-docs/src/theme/Footer/Copyright/index.tsx @@ -0,0 +1,10 @@ +import type { Props } from "@theme/Footer/Copyright"; +import React from "react"; + +export default function FooterCopyright({ copyright }: Readonly): React.JSX.Element { + return ( +
+

{copyright}, Inc. All rights reserved.

+
+ ); +} diff --git a/crowdsec-docs/src/theme/Footer/Layout/index.tsx b/crowdsec-docs/src/theme/Footer/Layout/index.tsx new file mode 100644 index 000000000..e24fa9391 --- /dev/null +++ b/crowdsec-docs/src/theme/Footer/Layout/index.tsx @@ -0,0 +1,26 @@ +import type { Props } from "@theme/Footer/Layout"; +import React from "react"; + +export default function FooterLayout({ links, logo, copyright }: Readonly): React.JSX.Element { + return ( +
+
+
+ CrowdSec Logo +
+

CrowdSec

+

Safer together.

+
+
+ + {links} + {(logo || copyright) && ( +
+ {logo &&
{logo}
} + {copyright} +
+ )} +
+
+ ); +} diff --git a/crowdsec-docs/src/theme/Footer/LinkItem/index.tsx b/crowdsec-docs/src/theme/Footer/LinkItem/index.tsx new file mode 100644 index 000000000..9d6590aa3 --- /dev/null +++ b/crowdsec-docs/src/theme/Footer/LinkItem/index.tsx @@ -0,0 +1,27 @@ +import Link from "@docusaurus/Link"; +import useBaseUrl from "@docusaurus/useBaseUrl"; +import type { Props } from "@theme/Footer/LinkItem"; +import clsx from "clsx"; +import React from "react"; + +export default function FooterLinkItem({ item }: Readonly): React.JSX.Element { + const { to, href, label, prependBaseUrlToHref, className, ...props } = item; + const toUrl = useBaseUrl(to); + const normalizedHref = useBaseUrl(href, { forcePrependBaseUrl: true }); + + return ( + + {label} + + ); +} diff --git a/crowdsec-docs/src/theme/Footer/Links/MultiColumn/index.tsx b/crowdsec-docs/src/theme/Footer/Links/MultiColumn/index.tsx new file mode 100644 index 000000000..ce60fac59 --- /dev/null +++ b/crowdsec-docs/src/theme/Footer/Links/MultiColumn/index.tsx @@ -0,0 +1,48 @@ +import { ThemeClassNames } from "@docusaurus/theme-common"; +import LinkItem from "@theme/Footer/LinkItem"; +import type { Props } from "@theme/Footer/Links/MultiColumn"; +import clsx from "clsx"; +import React from "react"; + +type ColumnType = Props["columns"][number]; +type ColumnItemType = ColumnType["items"][number]; + +const ColumnLinkItem = ({ item }: { item: ColumnItemType }): React.JSX.Element => { + return item.html ? ( +
  • + ) : ( +
  • + +
  • + ); +}; + +const Column = ({ column }: Readonly<{ column: ColumnType }>): React.JSX.Element => { + return ( +
    +
    {column.title}
    +
      + {column.items.map((item, i) => ( + // biome-ignore lint/suspicious/noArrayIndexKey: We use the index as a key here because the columns are static and do not change. + + ))} +
    +
    + ); +}; + +export default function FooterLinksMultiColumn({ columns }: Readonly): React.JSX.Element { + return ( +
    + {columns.map((column, i) => ( + // biome-ignore lint/suspicious/noArrayIndexKey: We use the index as a key here because the columns are static and do not change. + + ))} +
    + ); +} diff --git a/crowdsec-docs/src/theme/Footer/Links/Simple/index.tsx b/crowdsec-docs/src/theme/Footer/Links/Simple/index.tsx new file mode 100644 index 000000000..10bec6870 --- /dev/null +++ b/crowdsec-docs/src/theme/Footer/Links/Simple/index.tsx @@ -0,0 +1,37 @@ +import LinkItem from "@theme/Footer/LinkItem"; +import type { Props } from "@theme/Footer/Links/Simple"; +import clsx from "clsx"; +import React from "react"; + +function Separator() { + return Β·; +} + +function SimpleLinkItem({ item }: { item: Props["links"][number] }) { + return item.html ? ( + + ) : ( + + ); +} + +export default function FooterLinksSimple({ links }: Readonly): React.JSX.Element { + return ( +
    +
    + {links.map((item, i) => ( + // biome-ignore lint/suspicious/noArrayIndexKey: We use the index as a key here because the links are static and do not change. + + + {links.length !== i + 1 && } + + ))} +
    +
    + ); +} diff --git a/crowdsec-docs/src/theme/Footer/Links/index.tsx b/crowdsec-docs/src/theme/Footer/Links/index.tsx new file mode 100644 index 000000000..7a0029786 --- /dev/null +++ b/crowdsec-docs/src/theme/Footer/Links/index.tsx @@ -0,0 +1,9 @@ +import { isMultiColumnFooterLinks } from "@docusaurus/theme-common"; +import type { Props } from "@theme/Footer/Links"; +import FooterLinksMultiColumn from "@theme/Footer/Links/MultiColumn"; +import FooterLinksSimple from "@theme/Footer/Links/Simple"; +import React from "react"; + +export default function FooterLinks({ links }: Props): React.JSX.Element { + return isMultiColumnFooterLinks(links) ? : ; +} diff --git a/crowdsec-docs/src/theme/Footer/Logo/index.tsx b/crowdsec-docs/src/theme/Footer/Logo/index.tsx new file mode 100644 index 000000000..3315d73e8 --- /dev/null +++ b/crowdsec-docs/src/theme/Footer/Logo/index.tsx @@ -0,0 +1,36 @@ +import Link from "@docusaurus/Link"; +import { useBaseUrlUtils } from "@docusaurus/useBaseUrl"; +import type { Props } from "@theme/Footer/Logo"; +import ThemedImage from "@theme/ThemedImage"; +import clsx from "clsx"; +import React, { type ReactNode } from "react"; + +import styles from "./styles.module.css"; + +const LogoImage = ({ logo }: Readonly): React.JSX.Element => { + const { withBaseUrl } = useBaseUrlUtils(); + const sources = { + light: withBaseUrl(logo.src), + dark: withBaseUrl(logo.srcDark ?? logo.src), + }; + return ( + + ); +}; + +export default function FooterLogo({ logo }: Props): ReactNode { + return logo.href ? ( + + + + ) : ( + + ); +} diff --git a/crowdsec-docs/src/theme/Footer/Logo/styles.module.css b/crowdsec-docs/src/theme/Footer/Logo/styles.module.css new file mode 100644 index 000000000..faf0e60f3 --- /dev/null +++ b/crowdsec-docs/src/theme/Footer/Logo/styles.module.css @@ -0,0 +1,9 @@ +.footerLogoLink { + opacity: 0.5; + transition: opacity var(--ifm-transition-fast) + var(--ifm-transition-timing-default); +} + +.footerLogoLink:hover { + opacity: 1; +} diff --git a/crowdsec-docs/src/theme/Footer/index.tsx b/crowdsec-docs/src/theme/Footer/index.tsx new file mode 100644 index 000000000..347644981 --- /dev/null +++ b/crowdsec-docs/src/theme/Footer/index.tsx @@ -0,0 +1,25 @@ +import { useThemeConfig } from "@docusaurus/theme-common"; +import FooterCopyright from "@theme/Footer/Copyright"; +import FooterLayout from "@theme/Footer/Layout"; +import FooterLinks from "@theme/Footer/Links"; +import FooterLogo from "@theme/Footer/Logo"; +import React, { type ReactNode } from "react"; + +function Footer(): ReactNode { + const { footer } = useThemeConfig(); + if (!footer) { + return null; + } + const { copyright, links, logo, style } = footer; + + return ( + 0 && } + logo={logo && } + copyright={copyright && } + /> + ); +} + +export default React.memo(Footer); From 40ec1117781eecd0642c678c6d0c3f117a173a34 Mon Sep 17 00:00:00 2001 From: Roussange Alexandre Date: Tue, 8 Jul 2025 12:35:15 +0200 Subject: [PATCH 6/9] =?UTF-8?q?feat=20=F0=9F=92=84update=20alert=20and=20c?= =?UTF-8?q?ode=20UI?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- crowdsec-docs/docusaurus.config.ts | 1 + crowdsec-docs/src/css/custom.css | 75 ++++++++++++++++++- .../src/theme/Admonition/Layout/index.tsx | 36 +++++++++ .../theme/Admonition/Layout/styles.module.css | 34 +++++++++ .../src/theme/Footer/Logo/styles.module.css | 7 +- crowdsec-docs/src/ui/card.tsx | 9 ++- crowdsec-docs/tailwind.config.js | 1 + 7 files changed, 156 insertions(+), 7 deletions(-) create mode 100644 crowdsec-docs/src/theme/Admonition/Layout/index.tsx create mode 100644 crowdsec-docs/src/theme/Admonition/Layout/styles.module.css diff --git a/crowdsec-docs/docusaurus.config.ts b/crowdsec-docs/docusaurus.config.ts index 2610ada99..84a3c868f 100644 --- a/crowdsec-docs/docusaurus.config.ts +++ b/crowdsec-docs/docusaurus.config.ts @@ -224,6 +224,7 @@ const config: Config = { }, prism: { theme: themes.shadesOfPurple, + darkTheme: themes.vsDark, additionalLanguages: ["bash", "yaml", "json"], }, } satisfies Preset.ThemeConfig, diff --git a/crowdsec-docs/src/css/custom.css b/crowdsec-docs/src/css/custom.css index b8a369a56..96a905d51 100644 --- a/crowdsec-docs/src/css/custom.css +++ b/crowdsec-docs/src/css/custom.css @@ -42,10 +42,11 @@ --card-foreground: 52 52 59; --popover: 255 255 255; --popover-foreground: 52 52 59; - --primary: 120 102 201; + --primary: 82 71 179; --primary-foreground: 251 251 251; - --secondary: 247 247 247; + --secondary: 159 107 4; --secondary-foreground: 52 52 59; + --premium: 248 171 19; --info: 224 178 90; --info-foreground: 52 52 59; --muted: 247 247 247; @@ -110,6 +111,7 @@ html[data-theme="dark"], --primary-foreground: 52 52 52; --secondary: 224 178 90; --secondary-foreground: 250 251 251; + --premium: 248 171 19; --info: 224 178 90; --info-foreground: 250 251 251; --muted: 69 69 69; @@ -537,3 +539,72 @@ div[class^="announcementBar"] { vertical-align: middle; transform: rotate(0deg) !important; /* force reset to counter act UL accordion transform */ } + +/* 🚩 Alert component */ + +.alert { + @apply bg-background dark:bg-gray-100 text-foreground dark:text-foreground border border-solid border-border rounded-lg p-4 mb-4 text-sm; +} + +.alert p { + @apply mb-1; +} + +.alert svg { + @apply !w-5 !h-5 mb-0; +} + +.alert--info { + @apply bg-cyan-50 dark:bg-cyan-900/10 text-cyan-900 dark:text-cyan-100 border-cyan-200 dark:border-cyan-700; +} + +.alert--info svg { + @apply !fill-cyan-500 dark:fill-cyan-200; +} + +.alert--warning { + @apply bg-amber-100 dark:bg-amber-900/10 text-amber-900 dark:text-amber-100 border-amber-200 dark:border-amber-700; +} + +.alert--warning svg { + @apply fill-amber-400 dark:fill-amber-200; +} + +.alert--success { + @apply bg-emerald-100 dark:bg-emerald-900/10 text-emerald-900 dark:text-emerald-100 border-emerald-200 dark:border-emerald-700; +} + +.alert--success svg { + @apply fill-emerald-400 dark:fill-emerald-200; +} + +.alert--danger { + @apply bg-red-100 dark:bg-red-900/10 text-red-900 dark:text-red-100 border-red-200 dark:border-red-700; +} + +.alert--danger svg { + @apply fill-red-400 dark:fill-red-200; +} + +/* πŸ’» Code blocks */ + +.prism-code { + @apply !bg-primary dark:!bg-gray-50 text-gray-900 dark:text-gray-100 p-4 mb-4 overflow-x-auto rounded-lg border border-solid border-border; +} + +pre { + @apply rounded-lg font-semibold; +} + +.prism-code .token.plain { + @apply text-white dark:text-foreground; +} + +.prism-code .token.function, +.prism-code .assign-left.variable { + @apply !text-premium dark:!text-secondary; +} + +code:not(.prism-code code) { + @apply bg-gray-100 dark:bg-gray-50 border-primary/20 border-solid border text-primary px-1 py-0.5 rounded-md font-semibold; +} diff --git a/crowdsec-docs/src/theme/Admonition/Layout/index.tsx b/crowdsec-docs/src/theme/Admonition/Layout/index.tsx new file mode 100644 index 000000000..d911a62fb --- /dev/null +++ b/crowdsec-docs/src/theme/Admonition/Layout/index.tsx @@ -0,0 +1,36 @@ +import { ThemeClassNames } from "@docusaurus/theme-common"; +import type { Props } from "@theme/Admonition/Layout"; +import clsx from "clsx"; +import React, { type ReactNode } from "react"; + +import styles from "./styles.module.css"; + +function AdmonitionContainer({ type, className, children }: Pick & { children: ReactNode }) { + return ( +
    + {children} +
    + ); +} + +function AdmonitionHeading({ icon }: Readonly>) { + return ( +
    + {icon} +
    + ); +} + +function AdmonitionContent({ children }: Pick) { + return children ?
    {children}
    : null; +} + +export default function AdmonitionLayout(props: Readonly): React.JSX.Element { + const { type, icon, title, children, className } = props; + return ( + + {title || icon ? : null} + {children} + + ); +} diff --git a/crowdsec-docs/src/theme/Admonition/Layout/styles.module.css b/crowdsec-docs/src/theme/Admonition/Layout/styles.module.css new file mode 100644 index 000000000..3a0f3d404 --- /dev/null +++ b/crowdsec-docs/src/theme/Admonition/Layout/styles.module.css @@ -0,0 +1,34 @@ +.admonition { + margin-bottom: 1em; +} + +.admonitionHeading { + font: var(--ifm-heading-font-weight) var(--ifm-h5-font-size) / var(--ifm-heading-line-height) var(--ifm-heading-font-family); + text-transform: uppercase; +} + +/* Heading alone without content (does not handle fragment content) */ +.admonitionHeading:not(:last-child) { + margin-bottom: 0.3rem; +} + +.admonitionHeading code { + text-transform: none; +} + +.admonitionIcon { + display: inline-block; + vertical-align: middle; + margin-right: 0.4em; +} + +.admonitionIcon svg { + display: inline-block; + height: 1.6em; + width: 1.6em; + fill: var(--ifm-alert-foreground-color); +} + +.admonitionContent > :last-child { + margin-bottom: 0; +} diff --git a/crowdsec-docs/src/theme/Footer/Logo/styles.module.css b/crowdsec-docs/src/theme/Footer/Logo/styles.module.css index faf0e60f3..7b30361fa 100644 --- a/crowdsec-docs/src/theme/Footer/Logo/styles.module.css +++ b/crowdsec-docs/src/theme/Footer/Logo/styles.module.css @@ -1,9 +1,8 @@ .footerLogoLink { - opacity: 0.5; - transition: opacity var(--ifm-transition-fast) - var(--ifm-transition-timing-default); + opacity: 0.5; + transition: opacity var(--ifm-transition-fast) var(--ifm-transition-timing-default); } .footerLogoLink:hover { - opacity: 1; + opacity: 1; } diff --git a/crowdsec-docs/src/ui/card.tsx b/crowdsec-docs/src/ui/card.tsx index 49f2020ab..3b7be9b63 100644 --- a/crowdsec-docs/src/ui/card.tsx +++ b/crowdsec-docs/src/ui/card.tsx @@ -3,7 +3,14 @@ import { cn } from "@site/src/utils"; import * as React from "react"; const Card = React.forwardRef>(({ className, ...props }, ref) => ( -
    +
    )); Card.displayName = "Card"; diff --git a/crowdsec-docs/tailwind.config.js b/crowdsec-docs/tailwind.config.js index c9e4ea610..1d8d946fe 100644 --- a/crowdsec-docs/tailwind.config.js +++ b/crowdsec-docs/tailwind.config.js @@ -18,6 +18,7 @@ module.exports = { "secondary-foreground": `rgb(var(--secondary-foreground) / )`, info: `rgb(var(--info) / )`, "info-foreground": `rgb(var(--info-foreground) / )`, + premium: `rgb(var(--premium) / )`, gray: { 50: `rgb(var(--color-gray-50) / )`, 100: `rgb(var(--color-gray-100) / )`, From 8b514995cf6f2dfc647fdb56b5498a3d42d56639 Mon Sep 17 00:00:00 2001 From: Roussange Alexandre Date: Tue, 8 Jul 2025 14:40:50 +0200 Subject: [PATCH 7/9] =?UTF-8?q?fix=20=E2=99=BB=EF=B8=8F=20PR=20feedbacks?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- crowdsec-docs/docusaurus.config.ts | 15 ++++++++++----- .../src/components/UnderlineTooltip.js | 19 ------------------- .../src/components/underline-tooltip.tsx | 17 +++++++++++++++++ crowdsec-docs/src/css/custom.css | 17 +++++++++-------- crowdsec-docs/src/ui/hybridtooltip.tsx | 8 +++++++- crowdsec-docs/src/ui/popover.tsx | 2 +- crowdsec-docs/src/ui/tooltip.tsx | 2 +- crowdsec-docs/tailwind.config.js | 7 ++++++- .../getting_started/introduction.mdx | 2 +- 9 files changed, 52 insertions(+), 37 deletions(-) delete mode 100644 crowdsec-docs/src/components/UnderlineTooltip.js create mode 100644 crowdsec-docs/src/components/underline-tooltip.tsx diff --git a/crowdsec-docs/docusaurus.config.ts b/crowdsec-docs/docusaurus.config.ts index 84a3c868f..85f51092c 100644 --- a/crowdsec-docs/docusaurus.config.ts +++ b/crowdsec-docs/docusaurus.config.ts @@ -99,22 +99,22 @@ const NAVBAR_ITEMS: NavbarItem[] = [ { href: "https://github.com/crowdsecurity/crowdsec", position: "right", - className: "header-github-link header-icon-link", + className: "header-github-link header-icon-link invert dark:invert-0", }, { href: "https://discord.gg/wGN7ShmEE8", position: "right", - className: "header-discord-link", + className: "header-discord-link invert dark:invert-0", }, { href: "https://discourse.crowdsec.net", position: "right", - className: "header-discourse-link", + className: "header-discourse-link invert dark:invert-0", }, { href: "https://hub.crowdsec.net/", position: "right", - className: "header-hub-link", + className: "header-hub-link dark:invert", }, ]; @@ -187,10 +187,15 @@ const config: Config = { ], themeConfig: { image: "img/crowdsec_og_image.png", + colorMode: { + defaultMode: "dark", + disableSwitch: false, + respectPrefersColorScheme: true, + }, announcementBar: { id: "banner_docs", content: - 'Learn how to guard your webserver in real-time with the CrowdSec WAF', + 'Learn how to guard your webserver in real-time with the CrowdSec WAF', backgroundColor: "#F8AB13", textColor: "#131132", isCloseable: true, diff --git a/crowdsec-docs/src/components/UnderlineTooltip.js b/crowdsec-docs/src/components/UnderlineTooltip.js deleted file mode 100644 index 529df26b2..000000000 --- a/crowdsec-docs/src/components/UnderlineTooltip.js +++ /dev/null @@ -1,19 +0,0 @@ -import React from 'react'; -import { TouchProvider, HybridTooltip, HybridTooltipTrigger, HybridTooltipContent } from '@site/src/ui/hybridtooltip'; - -export default function UnderlineTooltip({ children, tooltip }) { - return ( - - - - - {children} - - - -

    {tooltip}

    -
    -
    -
    - ); -} \ No newline at end of file diff --git a/crowdsec-docs/src/components/underline-tooltip.tsx b/crowdsec-docs/src/components/underline-tooltip.tsx new file mode 100644 index 000000000..8e2c49f42 --- /dev/null +++ b/crowdsec-docs/src/components/underline-tooltip.tsx @@ -0,0 +1,17 @@ +import { HybridTooltip, HybridTooltipContent, HybridTooltipTrigger, TouchProvider } from "@site/src/ui/hybridtooltip"; +import React from "react"; + +export default function UnderlineTooltip({ children, tooltip }): React.JSX.Element { + return ( + + + + + {children} + + + {tooltip} + + + ); +} diff --git a/crowdsec-docs/src/css/custom.css b/crowdsec-docs/src/css/custom.css index 96a905d51..0b29ff669 100644 --- a/crowdsec-docs/src/css/custom.css +++ b/crowdsec-docs/src/css/custom.css @@ -328,9 +328,10 @@ html[data-theme="light"] .navbar-sidebar__item > .menu__list .menu__caret::befor .header-hub-link:before { content: "Hub"; padding-left: 1.7rem !important; + color: black; background: no-repeat left / 33% - url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 275.05 249.82' %3E%3Cstyle%3E%3C!%5BCDATA%5B.C%7Bletter-spacing:-0.04em%7D%5D%5D%3E%3C/style%3E%3Cpath d='M39.26 178.8a20.79 20.79 0 0 1-7 4.92 24 24 0 0 1-9.76 1.84 23.7 23.7 0 0 1-9.86-1.9 20.78 20.78 0 0 1-7-5 21.06 21.06 0 0 1-4.21-7.07A24 24 0 0 1 0 163.47a24.34 24.34 0 0 1 1.41-8.14 21 21 0 0 1 4.21-7.09 20.78 20.78 0 0 1 7-5 23.7 23.7 0 0 1 9.86-1.9 23.64 23.64 0 0 1 9.76 1.87 20.72 20.72 0 0 1 7 5l-5.1 4.24a14.52 14.52 0 0 0-4.92-3.57 16.37 16.37 0 0 0-6.88-1.35 14.84 14.84 0 0 0-14 8.25 17.57 17.57 0 0 0 0 15.33 14.85 14.85 0 0 0 14 8.24 16.65 16.65 0 0 0 6.79-1.29 14.39 14.39 0 0 0 4.87-3.44l5.09 4.24zm2.45-25.49h6.21v3.13a9.62 9.62 0 0 1 2.33-1.81 13.23 13.23 0 0 1 2.89-1.23 18.62 18.62 0 0 1 3.14-.65 16.42 16.42 0 0 1 3.13-.06v6a15.17 15.17 0 0 0-5.65.37 7.41 7.41 0 0 0-3.51 2.15 8.42 8.42 0 0 0-1.81 3.56 19.24 19.24 0 0 0-.52 4.67v15.06h-6.21zM75 185.19a16.52 16.52 0 0 1-9.15-2.39 15.31 15.31 0 0 1-5.5-6 17.42 17.42 0 0 1-1.84-7.8 16.7 16.7 0 0 1 1.81-7.8 15.59 15.59 0 0 1 5.5-6 16.39 16.39 0 0 1 9.18-2.4 16.42 16.42 0 0 1 9.19 2.4 15.67 15.67 0 0 1 5.5 6 16.7 16.7 0 0 1 1.81 7.8 17.55 17.55 0 0 1-1.84 7.8 15.39 15.39 0 0 1-5.5 6 16.53 16.53 0 0 1-9.16 2.39zm0-27.77a9.23 9.23 0 0 0-5.71 1.72 10.8 10.8 0 0 0-3.41 4.27 14.13 14.13 0 0 0 0 11.12 10.73 10.73 0 0 0 3.41 4.27 10.35 10.35 0 0 0 11.43 0 10.82 10.82 0 0 0 3.41-4.27 14.24 14.24 0 0 0 0-11.12 10.89 10.89 0 0 0-3.41-4.27 9.26 9.26 0 0 0-5.72-1.72zm49 19.48l6.51-23.53h7.31l-10.2 31.21h-7.31l-6.45-24-6.45 24h-7.31l-10.2-31.21h7.31l6.51 23.53 6.52-23.53h7.12zm39.79-35.33h6.27v43h-6.27v-4.43a12.91 12.91 0 0 1-4.7 3.81 15 15 0 0 1-11.61.56 15.41 15.41 0 0 1-9-8.3 19 19 0 0 1 0-14.5 15.38 15.38 0 0 1 9-8.29 15.09 15.09 0 0 1 11.63.55 12.86 12.86 0 0 1 4.71 3.81zm-10.23 15.85a9.82 9.82 0 0 0-4.5 1 9.61 9.61 0 0 0-3.22 2.62 11.21 11.21 0 0 0-1.93 3.71 14.37 14.37 0 0 0 0 8.48 11.36 11.36 0 0 0 1.93 3.72 9.7 9.7 0 0 0 3.22 2.61 10.82 10.82 0 0 0 9 0 9.7 9.7 0 0 0 3.22-2.61 11.36 11.36 0 0 0 1.93-3.72 14.36 14.36 0 0 0 0-8.48 11.21 11.21 0 0 0-1.93-3.71 9.61 9.61 0 0 0-3.22-2.62 9.85 9.85 0 0 0-4.5-1zm37.26-16.09a28.52 28.52 0 0 1 9.22 1.56 33 33 0 0 1 7.68 3.9l-3.44 3.94-.74.86a21.17 21.17 0 0 0-7-3.78 18.59 18.59 0 0 0-6.45-.83 13 13 0 0 0-5.19 1.32 7.92 7.92 0 0 0-3.19 2.7 3.84 3.84 0 0 0-.49 3.26 5.56 5.56 0 0 0 2.88 3 30.3 30.3 0 0 0 6.05 2.49q3.42 1 6.73 2.21a32.23 32.23 0 0 1 6 2.89 10.15 10.15 0 0 1 4 4.51 11.41 11.41 0 0 1 1 3.84 10.55 10.55 0 0 1-.58 4.21 8.33 8.33 0 0 1-1.48 2.67 11.45 11.45 0 0 1-2.27 2.12 17.44 17.44 0 0 1-5.84 2.58 28.66 28.66 0 0 1-6.2.86 33.14 33.14 0 0 1-5.32-.4 24.81 24.81 0 0 1-4.76-1.23 25.47 25.47 0 0 1-4.48-2.15 31.86 31.86 0 0 1-4.49-3.28l3.38-3.87.86-1a24.25 24.25 0 0 0 7.56 4.77 23.32 23.32 0 0 0 8.41 1.32 10.3 10.3 0 0 0 4.64-1.08 8.57 8.57 0 0 0 3.29-2.64 4.07 4.07 0 0 0 .71-3.35c-.27-1.19-1.26-2.29-3-3.32a22.84 22.84 0 0 0-4.27-1.87l-5.16-1.66-5.29-1.81a23.21 23.21 0 0 1-4.67-2.37 11.79 11.79 0 0 1-3.31-3.25 7.6 7.6 0 0 1-1.2-4.52 10.62 10.62 0 0 1 1.5-5.47 13.24 13.24 0 0 1 3.75-3.93 17.11 17.11 0 0 1 5.19-2.39 21.53 21.53 0 0 1 5.84-.8zm35.88 39.13a9.5 9.5 0 0 0 5.13-1.32 9.93 9.93 0 0 0 3.35-3.41l4.54 3.5a14.91 14.91 0 0 1-5.28 4.27 17.06 17.06 0 0 1-7.74 1.63 18 18 0 0 1-6.64-1.14 15.19 15.19 0 0 1-4.94-3.07 14.82 14.82 0 0 1-3.26-4.45 17.51 17.51 0 0 1 0-15.12 14.82 14.82 0 0 1 3.26-4.45 15.36 15.36 0 0 1 4.94-3.07 19.88 19.88 0 0 1 13.27 0 15.3 15.3 0 0 1 4.95 3.07 14.82 14.82 0 0 1 3.26 4.45 17.53 17.53 0 0 1 1.56 9.9h-26.41a13.65 13.65 0 0 0 1.07 3.5 10.56 10.56 0 0 0 2 2.95 9 9 0 0 0 3 2 10.16 10.16 0 0 0 4 .74zm10.14-13.88a14 14 0 0 0-1.08-3.51 10.51 10.51 0 0 0-2-2.94 8.89 8.89 0 0 0-3-2 11 11 0 0 0-7.92 0 8.89 8.89 0 0 0-3 2 10.51 10.51 0 0 0-2 2.94 13.6 13.6 0 0 0-1.07 3.51h20.15zm32.93 16.89a17.1 17.1 0 0 1-7.87 1.66 16.44 16.44 0 0 1-9.15-2.4 15.22 15.22 0 0 1-5.5-6 17.42 17.42 0 0 1-1.84-7.8 16.67 16.67 0 0 1 1.81-7.8 15.52 15.52 0 0 1 5.5-6 16.39 16.39 0 0 1 9.18-2.4 17.1 17.1 0 0 1 7.87 1.66 15 15 0 0 1 5.28 4.36l-4.55 3.57a10.1 10.1 0 0 0-3.37-3.54 9.51 9.51 0 0 0-5.23-1.38 9.16 9.16 0 0 0-5.71 1.72 10.8 10.8 0 0 0-3.41 4.27 14.13 14.13 0 0 0 0 11.12 10.8 10.8 0 0 0 3.41 4.27 9.16 9.16 0 0 0 5.71 1.72 9.51 9.51 0 0 0 5.23-1.38 10.15 10.15 0 0 0 3.37-3.53l4.55 3.56a14.91 14.91 0 0 1-5.28 4.32z' fill='%23fff'/%3E%3Cpath d='M110 117.18l-.72 6.65h.06l.66-6.65z' fill='%233e3978'/%3E%3Ctext class='C' transform='translate(83.51 237.44)' fill='%23fff' font-size='61' font-family='BellinzoRegularRegular,Bellinzo Regular'%3EHub%3C/text%3E%3Cg fill='%23fff'%3E%3Cpath d='M102.63 63.66a20.63 20.63 0 0 1 1.69 3.48h0a27.11 27.11 0 0 0-2.14-5.92c-1.56-3-3.86-2.86-5.3 0a29.14 29.14 0 0 0-2.14 6 23.85 23.85 0 0 1 1.68-3.55c1.69-2.87 4.39-2.99 6.21-.01zm73.63 0a21.42 21.42 0 0 1 1.74 3.48h0a26.6 26.6 0 0 0-2.14-5.92c-1.55-3-3.85-2.86-5.29 0a29.14 29.14 0 0 0-2.14 6 23.85 23.85 0 0 1 1.68-3.55c1.63-2.87 4.33-2.99 6.15-.01zM140 46.06a27.85 27.85 0 0 1 2.37 5.32 34.92 34.92 0 0 0-2.77-7.78c-1.94-3.72-4.81-3.57-6.61 0a37.88 37.88 0 0 0-2.77 7.9 30.88 30.88 0 0 1 2.36-5.44c1.99-3.57 5.22-3.72 7.42 0zM95 67.82a5.51 5.51 0 0 0 3.59 4.59l.13 4 .46 4.78c.19 1.13.48 1.08.66 0 .25-1.52.32-3.15.46-4.78a39 39 0 0 0 .12-4 5.5 5.5 0 0 0 3.6-4.59 9.08 9.08 0 0 1-9 0z'/%3E%3Cpath d='M168.63 67.82a5.5 5.5 0 0 0 3.6 4.59 39 39 0 0 0 .12 4l.46 4.78c.2 1.13.48 1.08.66 0 .25-1.52.32-3.15.46-4.78l.13-4a5.51 5.51 0 0 0 3.59-4.59 9.08 9.08 0 0 1-9 0zM188 75.94c1 4.27 2.23 13.48 3.5 24.14C190.43 90 189.28 81 188 75.94zm-46.18-24.07a11.36 11.36 0 0 1-11.25 0c.52 2.88 2.27 5.13 4.49 5.71l.15 5.05.58 6c.24 1.41.59 1.35.82 0 .31-1.9.4-3.93.57-6 .14-1.66.18-3.35.16-5.05 2.21-.58 3.97-2.83 4.48-5.71zM98.54 72.41l.13 4 .46 4.78c.19 1.13.48 1.08.66 0 .25-1.52.32-3.15.46-4.78a39 39 0 0 0 .12-4 5.5 5.5 0 0 0 3.6-4.59 9.08 9.08 0 0 1-9 0 5.51 5.51 0 0 0 3.57 4.59zm60.6 19.68c-1.59-13.3-3.15-24.78-4.37-30.1a7.1 7.1 0 0 0 6.87-5.84h0a8.19 8.19 0 0 0 .12-1.11h.2a4.47 4.47 0 0 0 2.74-8.18 7.1 7.1 0 0 0-1.8-13.51 4.47 4.47 0 0 0-3.43-7.22 7.17 7.17 0 0 0 2.87-2.52c1.67-2.61 1.94-14.4-4-22-2.44-3.12-4.83-1.24-5 .89-.47 6.52-.52 11.42-2.22 17a4.46 4.46 0 0 0-7.92-2.05 7.1 7.1 0 0 0-14 0 4.47 4.47 0 0 0-7.94 2c-1.69-5.59-1.75-10.49-2.22-17-.15-2.13-2.54-4-5-.89-5.93 7.58-5.66 19.37-4 22a7.17 7.17 0 0 0 2.87 2.52 4.48 4.48 0 0 0-3.43 7.22 7.1 7.1 0 0 0-1.79 13.51 4.47 4.47 0 0 0 2.73 8.18h.21a6.36 6.36 0 0 0 .11 1.07h0a7.1 7.1 0 0 0 7 5.89h0c-2 8.51-5 32.87-7.43 55.17l-.66 6.65a842.28 842.28 0 0 1 26.64-.42c9 0 17.83.14 26.22.41l-.67-6.27-2.7-25.4zm-14.58-40a5.88 5.88 0 0 1-2.39-1.17c.7 2.78 1.21 5.61 1.93 8.44a45.15 45.15 0 0 1 1.22 7.43c.31 3.86-2.22 7.19-5.39 7.19h-7.47c-3.17 0-5.7-3.33-5.39-7.19a46.23 46.23 0 0 1 1.22-7.43c.66-2.61 1.17-5.23 1.81-7.8a8.31 8.31 0 0 1-3.84 1 44.4 44.4 0 0 1-6.91-.45 4.78 4.78 0 0 1-4-3.37c-.59-1.69-1-3.45-1.59-5.14a14.16 14.16 0 0 0-1.21-2.09 2.41 2.41 0 0 1-.42-.89v-3.86a38.54 38.54 0 0 1 12.17-1.54 27 27 0 0 1 8.8 1.61 10.09 10.09 0 0 0 7.18 0 30 30 0 0 1 13.6-1.44c2.45.22 4.87.76 7.35 1.16v4.08c0 .29-.13.74-.33.82-1 .45-1.11 1.36-1.35 2.25a84.99 84.99 0 0 1-1.41 4.71 5.44 5.44 0 0 1-4.38 3.79 20.06 20.06 0 0 1-9.2-.1zm-29.92 15.64a5.53 5.53 0 0 1-1.13.36 16.1 16.1 0 0 1-7.34-.08 4.61 4.61 0 0 1-1.92-.94l1.55 6.77a36.86 36.86 0 0 1 1 6c.24 3.1-1.78 5.77-4.33 5.77h-6c-2.55 0-4.58-2.67-4.33-5.77a36.86 36.86 0 0 1 1-6l1.45-6.26a6.48 6.48 0 0 1-3.08.79A34.29 34.29 0 0 1 86 68a3.85 3.85 0 0 1-3.22-2.71l-1.28-4.12a10.81 10.81 0 0 0-1-1.67 1.73 1.73 0 0 1-.33-.72v-3.09a30.28 30.28 0 0 1 9.75-1.23 21.25 21.25 0 0 1 7.06 1.29 8.11 8.11 0 0 0 5.76 0 19.87 19.87 0 0 1 2.74-.81 6.47 6.47 0 0 1-.79-7.68 9.11 9.11 0 0 1-2.18-11 5.59 5.59 0 0 0-3-.86 5.7 5.7 0 0 0-5.64 4.88 3.58 3.58 0 0 0-6.37 1.62c-1.35-4.48-1.4-8.41-1.77-13.64-.12-1.7-2-3.21-4-.71-4.75 6.08-4.54 15.53-3.2 17.63a5.86 5.86 0 0 0 2.3 2A3.58 3.58 0 0 0 78 53a5.69 5.69 0 0 0-1.4 10.82 3.59 3.59 0 0 0 2.19 6.56h.17a6 6 0 0 0 .09.86h0A5.69 5.69 0 0 0 84.66 76h0c-1.58 6.82-4 26.36-6 44.24l-.53 5.38c9-.74 18.89-1.31 29.48-1.68l.69-6.94 2.87-24.67 3.47-24.6z'/%3E%3Cpath d='M199.39 58.62a5.7 5.7 0 0 0-4.83-5.62 3.58 3.58 0 0 0-2.75-5.79 5.86 5.86 0 0 0 2.3-2c1.34-2.1 1.55-11.55-3.2-17.63-2-2.5-3.87-1-4 .71-.37 5.23-.41 9.16-1.77 13.64a3.59 3.59 0 0 0-6.36-1.64 5.69 5.69 0 0 0-8.78-3.92 9.1 9.1 0 0 1-2.23 10.9 6.44 6.44 0 0 1-.66 7.54 21.08 21.08 0 0 1 3.54 1 8.11 8.11 0 0 0 5.76 0 24.1 24.1 0 0 1 10.91-1.15c2 .17 3.91.6 5.9.93v3.27c0 .23-.11.59-.26.66-.82.36-.9 1.09-1.09 1.8a63 63 0 0 1-1.13 3.78 4.35 4.35 0 0 1-3.51 3 16.1 16.1 0 0 1-7.34-.08 4.67 4.67 0 0 1-1.92-.94c.56 2.23 1 4.5 1.55 6.77a36.86 36.86 0 0 1 1 6c.25 3.1-1.78 5.77-4.33 5.77h-6c-2.55 0-4.57-2.67-4.33-5.77a36.86 36.86 0 0 1 1-6c.53-2.09.94-4.19 1.45-6.26a6.48 6.48 0 0 1-3.08.79 34.29 34.29 0 0 1-5.54-.35 3.78 3.78 0 0 1-1.84-.74c1.52 9.16 3.53 25.4 6.18 50.05l.29 2.62q.19 1.9.42 3.93c10.62.37 20.57.94 29.58 1.68l-.55-5.07-2.17-20.41c-1.33-10.67-2.6-19.88-3.6-24.15a5.7 5.7 0 0 0 5.51-4.68h0a6.69 6.69 0 0 0 .09-.9h.17a3.59 3.59 0 0 0 2.23-6.54 5.69 5.69 0 0 0 3.39-5.2zm-36.87 65.19h.15q-.33-3.09-.67-6.27l-2.86-25.45 2.71 25.45.67 6.27z'/%3E%3Cpath d='M154.77 62c1.22 5.32 2.78 16.8 4.37 30.1-1.39-12.56-2.82-23.86-4.37-30.1zm-44.45 55.17l-.72 6.65h.06l.66-6.65z'/%3E%3C/g%3E%3C/svg%3E"); + url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 275.05 249.82' %3E%3Cstyle%3E%3C!%5BCDATA%5B.C%7Bletter-spacing:-0.04em%7D%5D%5D%3E%3C/style%3E%3Cpath d='M39.26 178.8a20.79 20.79 0 0 1-7 4.92 24 24 0 0 1-9.76 1.84 23.7 23.7 0 0 1-9.86-1.9 20.78 20.78 0 0 1-7-5 21.06 21.06 0 0 1-4.21-7.07A24 24 0 0 1 0 163.47a24.34 24.34 0 0 1 1.41-8.14 21 21 0 0 1 4.21-7.09 20.78 20.78 0 0 1 7-5 23.7 23.7 0 0 1 9.86-1.9 23.64 23.64 0 0 1 9.76 1.87 20.72 20.72 0 0 1 7 5l-5.1 4.24a14.52 14.52 0 0 0-4.92-3.57 16.37 16.37 0 0 0-6.88-1.35 14.84 14.84 0 0 0-14 8.25 17.57 17.57 0 0 0 0 15.33 14.85 14.85 0 0 0 14 8.24 16.65 16.65 0 0 0 6.79-1.29 14.39 14.39 0 0 0 4.87-3.44l5.09 4.24zm2.45-25.49h6.21v3.13a9.62 9.62 0 0 1 2.33-1.81 13.23 13.23 0 0 1 2.89-1.23 18.62 18.62 0 0 1 3.14-.65 16.42 16.42 0 0 1 3.13-.06v6a15.17 15.17 0 0 0-5.65.37 7.41 7.41 0 0 0-3.51 2.15 8.42 8.42 0 0 0-1.81 3.56 19.24 19.24 0 0 0-.52 4.67v15.06h-6.21zM75 185.19a16.52 16.52 0 0 1-9.15-2.39 15.31 15.31 0 0 1-5.5-6 17.42 17.42 0 0 1-1.84-7.8 16.7 16.7 0 0 1 1.81-7.8 15.59 15.59 0 0 1 5.5-6 16.39 16.39 0 0 1 9.18-2.4 16.42 16.42 0 0 1 9.19 2.4 15.67 15.67 0 0 1 5.5 6 16.7 16.7 0 0 1 1.81 7.8 17.55 17.55 0 0 1-1.84 7.8 15.39 15.39 0 0 1-5.5 6 16.53 16.53 0 0 1-9.16 2.39zm0-27.77a9.23 9.23 0 0 0-5.71 1.72 10.8 10.8 0 0 0-3.41 4.27 14.13 14.13 0 0 0 0 11.12 10.73 10.73 0 0 0 3.41 4.27 10.35 10.35 0 0 0 11.43 0 10.82 10.82 0 0 0 3.41-4.27 14.24 14.24 0 0 0 0-11.12 10.89 10.89 0 0 0-3.41-4.27 9.26 9.26 0 0 0-5.72-1.72zm49 19.48l6.51-23.53h7.31l-10.2 31.21h-7.31l-6.45-24-6.45 24h-7.31l-10.2-31.21h7.31l6.51 23.53 6.52-23.53h7.12zm39.79-35.33h6.27v43h-6.27v-4.43a12.91 12.91 0 0 1-4.7 3.81 15 15 0 0 1-11.61.56 15.41 15.41 0 0 1-9-8.3 19 19 0 0 1 0-14.5 15.38 15.38 0 0 1 9-8.29 15.09 15.09 0 0 1 11.63.55 12.86 12.86 0 0 1 4.71 3.81zm-10.23 15.85a9.82 9.82 0 0 0-4.5 1 9.61 9.61 0 0 0-3.22 2.62 11.21 11.21 0 0 0-1.93 3.71 14.37 14.37 0 0 0 0 8.48 11.36 11.36 0 0 0 1.93 3.72 9.7 9.7 0 0 0 3.22 2.61 10.82 10.82 0 0 0 9 0 9.7 9.7 0 0 0 3.22-2.61 11.36 11.36 0 0 0 1.93-3.72 14.36 14.36 0 0 0 0-8.48 11.21 11.21 0 0 0-1.93-3.71 9.61 9.61 0 0 0-3.22-2.62 9.85 9.85 0 0 0-4.5-1zm37.26-16.09a28.52 28.52 0 0 1 9.22 1.56 33 33 0 0 1 7.68 3.9l-3.44 3.94-.74.86a21.17 21.17 0 0 0-7-3.78 18.59 18.59 0 0 0-6.45-.83 13 13 0 0 0-5.19 1.32 7.92 7.92 0 0 0-3.19 2.7 3.84 3.84 0 0 0-.49 3.26 5.56 5.56 0 0 0 2.88 3 30.3 30.3 0 0 0 6.05 2.49q3.42 1 6.73 2.21a32.23 32.23 0 0 1 6 2.89 10.15 10.15 0 0 1 4 4.51 11.41 11.41 0 0 1 1 3.84 10.55 10.55 0 0 1-.58 4.21 8.33 8.33 0 0 1-1.48 2.67 11.45 11.45 0 0 1-2.27 2.12 17.44 17.44 0 0 1-5.84 2.58 28.66 28.66 0 0 1-6.2.86 33.14 33.14 0 0 1-5.32-.4 24.81 24.81 0 0 1-4.76-1.23 25.47 25.47 0 0 1-4.48-2.15 31.86 31.86 0 0 1-4.49-3.28l3.38-3.87.86-1a24.25 24.25 0 0 0 7.56 4.77 23.32 23.32 0 0 0 8.41 1.32 10.3 10.3 0 0 0 4.64-1.08 8.57 8.57 0 0 0 3.29-2.64 4.07 4.07 0 0 0 .71-3.35c-.27-1.19-1.26-2.29-3-3.32a22.84 22.84 0 0 0-4.27-1.87l-5.16-1.66-5.29-1.81a23.21 23.21 0 0 1-4.67-2.37 11.79 11.79 0 0 1-3.31-3.25 7.6 7.6 0 0 1-1.2-4.52 10.62 10.62 0 0 1 1.5-5.47 13.24 13.24 0 0 1 3.75-3.93 17.11 17.11 0 0 1 5.19-2.39 21.53 21.53 0 0 1 5.84-.8zm35.88 39.13a9.5 9.5 0 0 0 5.13-1.32 9.93 9.93 0 0 0 3.35-3.41l4.54 3.5a14.91 14.91 0 0 1-5.28 4.27 17.06 17.06 0 0 1-7.74 1.63 18 18 0 0 1-6.64-1.14 15.19 15.19 0 0 1-4.94-3.07 14.82 14.82 0 0 1-3.26-4.45 17.51 17.51 0 0 1 0-15.12 14.82 14.82 0 0 1 3.26-4.45 15.36 15.36 0 0 1 4.94-3.07 19.88 19.88 0 0 1 13.27 0 15.3 15.3 0 0 1 4.95 3.07 14.82 14.82 0 0 1 3.26 4.45 17.53 17.53 0 0 1 1.56 9.9h-26.41a13.65 13.65 0 0 0 1.07 3.5 10.56 10.56 0 0 0 2 2.95 9 9 0 0 0 3 2 10.16 10.16 0 0 0 4 .74zm10.14-13.88a14 14 0 0 0-1.08-3.51 10.51 10.51 0 0 0-2-2.94 8.89 8.89 0 0 0-3-2 11 11 0 0 0-7.92 0 8.89 8.89 0 0 0-3 2 10.51 10.51 0 0 0-2 2.94 13.6 13.6 0 0 0-1.07 3.51h20.15zm32.93 16.89a17.1 17.1 0 0 1-7.87 1.66 16.44 16.44 0 0 1-9.15-2.4 15.22 15.22 0 0 1-5.5-6 17.42 17.42 0 0 1-1.84-7.8 16.67 16.67 0 0 1 1.81-7.8 15.52 15.52 0 0 1 5.5-6 16.39 16.39 0 0 1 9.18-2.4 17.1 17.1 0 0 1 7.87 1.66 15 15 0 0 1 5.28 4.36l-4.55 3.57a10.1 10.1 0 0 0-3.37-3.54 9.51 9.51 0 0 0-5.23-1.38 9.16 9.16 0 0 0-5.71 1.72 10.8 10.8 0 0 0-3.41 4.27 14.13 14.13 0 0 0 0 11.12 10.8 10.8 0 0 0 3.41 4.27 9.16 9.16 0 0 0 5.71 1.72 9.51 9.51 0 0 0 5.23-1.38 10.15 10.15 0 0 0 3.37-3.53l4.55 3.56a14.91 14.91 0 0 1-5.28 4.32z' fill='black'/%3E%3Cpath d='M110 117.18l-.72 6.65h.06l.66-6.65z' fill='black' /%3E%3Ctext class='C' transform='translate(83.51 237.44)' fill='black' font-size='61' font-family='BellinzoRegularRegular,Bellinzo Regular'%3EHub%3C/text%3E%3Cg fill='black' %3E%3Cpath d='M102.63 63.66a20.63 20.63 0 0 1 1.69 3.48h0a27.11 27.11 0 0 0-2.14-5.92c-1.56-3-3.86-2.86-5.3 0a29.14 29.14 0 0 0-2.14 6 23.85 23.85 0 0 1 1.68-3.55c1.69-2.87 4.39-2.99 6.21-.01zm73.63 0a21.42 21.42 0 0 1 1.74 3.48h0a26.6 26.6 0 0 0-2.14-5.92c-1.55-3-3.85-2.86-5.29 0a29.14 29.14 0 0 0-2.14 6 23.85 23.85 0 0 1 1.68-3.55c1.63-2.87 4.33-2.99 6.15-.01zM140 46.06a27.85 27.85 0 0 1 2.37 5.32 34.92 34.92 0 0 0-2.77-7.78c-1.94-3.72-4.81-3.57-6.61 0a37.88 37.88 0 0 0-2.77 7.9 30.88 30.88 0 0 1 2.36-5.44c1.99-3.57 5.22-3.72 7.42 0zM95 67.82a5.51 5.51 0 0 0 3.59 4.59l.13 4 .46 4.78c.19 1.13.48 1.08.66 0 .25-1.52.32-3.15.46-4.78a39 39 0 0 0 .12-4 5.5 5.5 0 0 0 3.6-4.59 9.08 9.08 0 0 1-9 0z'/%3E%3Cpath d='M168.63 67.82a5.5 5.5 0 0 0 3.6 4.59 39 39 0 0 0 .12 4l.46 4.78c.2 1.13.48 1.08.66 0 .25-1.52.32-3.15.46-4.78l.13-4a5.51 5.51 0 0 0 3.59-4.59 9.08 9.08 0 0 1-9 0zM188 75.94c1 4.27 2.23 13.48 3.5 24.14C190.43 90 189.28 81 188 75.94zm-46.18-24.07a11.36 11.36 0 0 1-11.25 0c.52 2.88 2.27 5.13 4.49 5.71l.15 5.05.58 6c.24 1.41.59 1.35.82 0 .31-1.9.4-3.93.57-6 .14-1.66.18-3.35.16-5.05 2.21-.58 3.97-2.83 4.48-5.71zM98.54 72.41l.13 4 .46 4.78c.19 1.13.48 1.08.66 0 .25-1.52.32-3.15.46-4.78a39 39 0 0 0 .12-4 5.5 5.5 0 0 0 3.6-4.59 9.08 9.08 0 0 1-9 0 5.51 5.51 0 0 0 3.57 4.59zm60.6 19.68c-1.59-13.3-3.15-24.78-4.37-30.1a7.1 7.1 0 0 0 6.87-5.84h0a8.19 8.19 0 0 0 .12-1.11h.2a4.47 4.47 0 0 0 2.74-8.18 7.1 7.1 0 0 0-1.8-13.51 4.47 4.47 0 0 0-3.43-7.22 7.17 7.17 0 0 0 2.87-2.52c1.67-2.61 1.94-14.4-4-22-2.44-3.12-4.83-1.24-5 .89-.47 6.52-.52 11.42-2.22 17a4.46 4.46 0 0 0-7.92-2.05 7.1 7.1 0 0 0-14 0 4.47 4.47 0 0 0-7.94 2c-1.69-5.59-1.75-10.49-2.22-17-.15-2.13-2.54-4-5-.89-5.93 7.58-5.66 19.37-4 22a7.17 7.17 0 0 0 2.87 2.52 4.48 4.48 0 0 0-3.43 7.22 7.1 7.1 0 0 0-1.79 13.51 4.47 4.47 0 0 0 2.73 8.18h.21a6.36 6.36 0 0 0 .11 1.07h0a7.1 7.1 0 0 0 7 5.89h0c-2 8.51-5 32.87-7.43 55.17l-.66 6.65a842.28 842.28 0 0 1 26.64-.42c9 0 17.83.14 26.22.41l-.67-6.27-2.7-25.4zm-14.58-40a5.88 5.88 0 0 1-2.39-1.17c.7 2.78 1.21 5.61 1.93 8.44a45.15 45.15 0 0 1 1.22 7.43c.31 3.86-2.22 7.19-5.39 7.19h-7.47c-3.17 0-5.7-3.33-5.39-7.19a46.23 46.23 0 0 1 1.22-7.43c.66-2.61 1.17-5.23 1.81-7.8a8.31 8.31 0 0 1-3.84 1 44.4 44.4 0 0 1-6.91-.45 4.78 4.78 0 0 1-4-3.37c-.59-1.69-1-3.45-1.59-5.14a14.16 14.16 0 0 0-1.21-2.09 2.41 2.41 0 0 1-.42-.89v-3.86a38.54 38.54 0 0 1 12.17-1.54 27 27 0 0 1 8.8 1.61 10.09 10.09 0 0 0 7.18 0 30 30 0 0 1 13.6-1.44c2.45.22 4.87.76 7.35 1.16v4.08c0 .29-.13.74-.33.82-1 .45-1.11 1.36-1.35 2.25a84.99 84.99 0 0 1-1.41 4.71 5.44 5.44 0 0 1-4.38 3.79 20.06 20.06 0 0 1-9.2-.1zm-29.92 15.64a5.53 5.53 0 0 1-1.13.36 16.1 16.1 0 0 1-7.34-.08 4.61 4.61 0 0 1-1.92-.94l1.55 6.77a36.86 36.86 0 0 1 1 6c.24 3.1-1.78 5.77-4.33 5.77h-6c-2.55 0-4.58-2.67-4.33-5.77a36.86 36.86 0 0 1 1-6l1.45-6.26a6.48 6.48 0 0 1-3.08.79A34.29 34.29 0 0 1 86 68a3.85 3.85 0 0 1-3.22-2.71l-1.28-4.12a10.81 10.81 0 0 0-1-1.67 1.73 1.73 0 0 1-.33-.72v-3.09a30.28 30.28 0 0 1 9.75-1.23 21.25 21.25 0 0 1 7.06 1.29 8.11 8.11 0 0 0 5.76 0 19.87 19.87 0 0 1 2.74-.81 6.47 6.47 0 0 1-.79-7.68 9.11 9.11 0 0 1-2.18-11 5.59 5.59 0 0 0-3-.86 5.7 5.7 0 0 0-5.64 4.88 3.58 3.58 0 0 0-6.37 1.62c-1.35-4.48-1.4-8.41-1.77-13.64-.12-1.7-2-3.21-4-.71-4.75 6.08-4.54 15.53-3.2 17.63a5.86 5.86 0 0 0 2.3 2A3.58 3.58 0 0 0 78 53a5.69 5.69 0 0 0-1.4 10.82 3.59 3.59 0 0 0 2.19 6.56h.17a6 6 0 0 0 .09.86h0A5.69 5.69 0 0 0 84.66 76h0c-1.58 6.82-4 26.36-6 44.24l-.53 5.38c9-.74 18.89-1.31 29.48-1.68l.69-6.94 2.87-24.67 3.47-24.6z'/%3E%3Cpath d='M199.39 58.62a5.7 5.7 0 0 0-4.83-5.62 3.58 3.58 0 0 0-2.75-5.79 5.86 5.86 0 0 0 2.3-2c1.34-2.1 1.55-11.55-3.2-17.63-2-2.5-3.87-1-4 .71-.37 5.23-.41 9.16-1.77 13.64a3.59 3.59 0 0 0-6.36-1.64 5.69 5.69 0 0 0-8.78-3.92 9.1 9.1 0 0 1-2.23 10.9 6.44 6.44 0 0 1-.66 7.54 21.08 21.08 0 0 1 3.54 1 8.11 8.11 0 0 0 5.76 0 24.1 24.1 0 0 1 10.91-1.15c2 .17 3.91.6 5.9.93v3.27c0 .23-.11.59-.26.66-.82.36-.9 1.09-1.09 1.8a63 63 0 0 1-1.13 3.78 4.35 4.35 0 0 1-3.51 3 16.1 16.1 0 0 1-7.34-.08 4.67 4.67 0 0 1-1.92-.94c.56 2.23 1 4.5 1.55 6.77a36.86 36.86 0 0 1 1 6c.25 3.1-1.78 5.77-4.33 5.77h-6c-2.55 0-4.57-2.67-4.33-5.77a36.86 36.86 0 0 1 1-6c.53-2.09.94-4.19 1.45-6.26a6.48 6.48 0 0 1-3.08.79 34.29 34.29 0 0 1-5.54-.35 3.78 3.78 0 0 1-1.84-.74c1.52 9.16 3.53 25.4 6.18 50.05l.29 2.62q.19 1.9.42 3.93c10.62.37 20.57.94 29.58 1.68l-.55-5.07-2.17-20.41c-1.33-10.67-2.6-19.88-3.6-24.15a5.7 5.7 0 0 0 5.51-4.68h0a6.69 6.69 0 0 0 .09-.9h.17a3.59 3.59 0 0 0 2.23-6.54 5.69 5.69 0 0 0 3.39-5.2zm-36.87 65.19h.15q-.33-3.09-.67-6.27l-2.86-25.45 2.71 25.45.67 6.27z'/%3E%3Cpath d='M154.77 62c1.22 5.32 2.78 16.8 4.37 30.1-1.39-12.56-2.82-23.86-4.37-30.1zm-44.45 55.17l-.72 6.65h.06l.66-6.65z'/%3E%3C/g%3E%3C/svg%3E"); } /* On wide screens (desktop), remove text content for icon-only display */ @@ -563,33 +564,33 @@ div[class^="announcementBar"] { } .alert--warning { - @apply bg-amber-100 dark:bg-amber-900/10 text-amber-900 dark:text-amber-100 border-amber-200 dark:border-amber-700; + @apply bg-amber-50 dark:bg-amber-900/10 text-amber-900 dark:text-amber-100 border-amber-200 dark:border-amber-700; } .alert--warning svg { - @apply fill-amber-400 dark:fill-amber-200; + @apply !fill-amber-500 dark:fill-amber-200; } .alert--success { - @apply bg-emerald-100 dark:bg-emerald-900/10 text-emerald-900 dark:text-emerald-100 border-emerald-200 dark:border-emerald-700; + @apply bg-emerald-50 dark:bg-emerald-900/10 text-emerald-900 dark:text-emerald-100 border-emerald-200 dark:border-emerald-700; } .alert--success svg { - @apply fill-emerald-400 dark:fill-emerald-200; + @apply !fill-emerald-500 dark:fill-emerald-200; } .alert--danger { - @apply bg-red-100 dark:bg-red-900/10 text-red-900 dark:text-red-100 border-red-200 dark:border-red-700; + @apply bg-red-50 dark:bg-red-900/10 text-red-900 dark:text-red-100 border-red-200 dark:border-red-700; } .alert--danger svg { - @apply fill-red-400 dark:fill-red-200; + @apply fill-red-500 dark:fill-red-200; } /* πŸ’» Code blocks */ .prism-code { - @apply !bg-primary dark:!bg-gray-50 text-gray-900 dark:text-gray-100 p-4 mb-4 overflow-x-auto rounded-lg border border-solid border-border; + @apply !bg-primary dark:!bg-gray-50 text-gray-900 dark:text-gray-100 p-4 mb-4 overflow-x-auto rounded-lg border border-solid border-border/80; } pre { diff --git a/crowdsec-docs/src/ui/hybridtooltip.tsx b/crowdsec-docs/src/ui/hybridtooltip.tsx index b28de4e1c..642a0592c 100644 --- a/crowdsec-docs/src/ui/hybridtooltip.tsx +++ b/crowdsec-docs/src/ui/hybridtooltip.tsx @@ -2,6 +2,7 @@ import { PopoverContentProps, PopoverProps, PopoverTriggerProps } from "@radix-ui/react-popover"; import { TooltipContentProps, TooltipProps, TooltipTriggerProps } from "@radix-ui/react-tooltip"; +import clsx from "clsx"; import React, { createContext, PropsWithChildren, useContext, useEffect, useState } from "react"; import { Popover, PopoverContent, PopoverTrigger } from "./popover"; import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from "./tooltip"; @@ -45,5 +46,10 @@ export const HybridTooltipTrigger = (props: TooltipTriggerProps & PopoverTrigger export const HybridTooltipContent = (props: TooltipContentProps & PopoverContentProps) => { const isTouch = useTouch(); - return isTouch ? : ; + const newClassName = clsx( + props.className, + "bg-background dark:bg-gray-50 border border-border/40 dark:border-border border-solid rounded-md px-2 text-sm dark:font-medium" + ); + + return isTouch ? : ; }; diff --git a/crowdsec-docs/src/ui/popover.tsx b/crowdsec-docs/src/ui/popover.tsx index 46794a93b..0baf1a5eb 100644 --- a/crowdsec-docs/src/ui/popover.tsx +++ b/crowdsec-docs/src/ui/popover.tsx @@ -18,7 +18,7 @@ const PopoverContent = React.forwardRef< align={align} sideOffset={sideOffset} className={cn( - "tw-z-50 tw-w-72 tw-rounded-md tw-border tw-border-neutral-200 tw-bg-neutral-100 tw-p-4 tw-text-neutral-950 tw-shadow-md tw-outline-none data-[state=open]:tw-animate-in data-[state=closed]:tw-animate-out data-[state=closed]:tw-fade-out-0 data-[state=open]:tw-fade-in-0 data-[state=closed]:tw-zoom-out-95 data-[state=open]:tw-zoom-in-95 data-[side=bottom]:tw-slide-in-from-top-2 data-[side=left]:tw-slide-in-from-right-2 data-[side=right]:tw-slide-in-from-left-2 data-[side=top]:tw-slide-in-from-bottom-2 tw-origin-[--radix-popover-content-transform-origin] dark:tw-border-neutral-800 dark:tw-bg-neutral-950 dark:tw-text-neutral-50", + "z-50 w-72 rounded-md border border-neutral-200 bg-neutral-100 p-4 text-neutral-950 shadow-md outline-none data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 origin-[--radix-popover-content-transform-origin] dark:border-neutral-800 dark:bg-neutral-950 dark:text-neutral-50", className )} {...props} diff --git a/crowdsec-docs/src/ui/tooltip.tsx b/crowdsec-docs/src/ui/tooltip.tsx index 44f66cc69..c018a7383 100644 --- a/crowdsec-docs/src/ui/tooltip.tsx +++ b/crowdsec-docs/src/ui/tooltip.tsx @@ -18,7 +18,7 @@ const TooltipContent = React.forwardRef< ref={ref} sideOffset={sideOffset} className={cn( - "tw-z-50 tw-overflow-hidden tw-rounded-md tw-border tw-border-neutral-200 tw-bg-neutral-100 tw-px-3 tw-py-1.5 tw-text-sm tw-text-neutral-950 tw-shadow-md tw-animate-in tw-fade-in-0 tw-zoom-in-95 data-[state=closed]:tw-animate-out data-[state=closed]:tw-fade-out-0 data-[state=closed]:tw-zoom-out-95 data-[side=bottom]:tw-slide-in-from-top-2 data-[side=left]:tw-slide-in-from-right-2 data-[side=right]:tw-slide-in-from-left-2 data-[side=top]:tw-slide-in-from-bottom-2 dark:tw-border-neutral-800 dark:tw-bg-neutral-950 dark:tw-text-neutral-50", + "z-50 overflow-hidden rounded-md border border-neutral-200 bg-neutral-100 px-3 py-1.5 text-sm text-neutral-950 shadow-md animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 dark:border-neutral-800 dark:bg-neutral-950 dark:text-neutral-50", className )} {...props} diff --git a/crowdsec-docs/tailwind.config.js b/crowdsec-docs/tailwind.config.js index 1d8d946fe..e1de857a0 100644 --- a/crowdsec-docs/tailwind.config.js +++ b/crowdsec-docs/tailwind.config.js @@ -38,7 +38,6 @@ module.exports = { background: `rgb(var(--background) / )`, foreground: `rgb(var(--foreground) / )`, success: `rgb(var(--color-green) / )`, - premium: `rgb(var(--color-premium) / )`, platinum: `rgb(var(--color-platinum) / )`, card: `rgb(var(--card) / )`, "card-foreground": `rgb(var(--card-foreground) / )`, @@ -52,6 +51,12 @@ module.exports = { }, }, }, + safelist: [ + { + pattern: /invert(-0)?/, + variants: ["dark", "light", "before"], + }, + ], plugins: [require("tailwindcss-animate")], prefix: "", // This is the prefix for the tailwind classes to not clash with docusarus classes }; diff --git a/crowdsec-docs/unversioned/getting_started/introduction.mdx b/crowdsec-docs/unversioned/getting_started/introduction.mdx index b6788a4e5..ba82a3dbe 100644 --- a/crowdsec-docs/unversioned/getting_started/introduction.mdx +++ b/crowdsec-docs/unversioned/getting_started/introduction.mdx @@ -5,7 +5,7 @@ sidebar_position: 1 --- import useBaseUrl from "@docusaurus/useBaseUrl" -import UnderlineTooltip from "@site/src/components/UnderlineTooltip" +import UnderlineTooltip from "@site/src/components/underline-tooltip" ## What is CrowdSec Security Engine? From 9587785df7dd0f9915ba7c374344391085fc0380 Mon Sep 17 00:00:00 2001 From: Roussange Alexandre Date: Tue, 8 Jul 2025 15:24:17 +0200 Subject: [PATCH 8/9] refactor :recycle: refactor custom.css into smaller css files --- crowdsec-docs/src/css/alerts.css | 49 +++ crowdsec-docs/src/css/code.css | 22 + crowdsec-docs/src/css/colors.css | 186 +++++++++ crowdsec-docs/src/css/custom.css | 381 +----------------- crowdsec-docs/src/css/navbar.css | 119 ++++++ .../getting_started/health_check.mdx | 16 +- 6 files changed, 389 insertions(+), 384 deletions(-) create mode 100644 crowdsec-docs/src/css/alerts.css create mode 100644 crowdsec-docs/src/css/code.css create mode 100644 crowdsec-docs/src/css/colors.css create mode 100644 crowdsec-docs/src/css/navbar.css diff --git a/crowdsec-docs/src/css/alerts.css b/crowdsec-docs/src/css/alerts.css new file mode 100644 index 000000000..020265122 --- /dev/null +++ b/crowdsec-docs/src/css/alerts.css @@ -0,0 +1,49 @@ +/* 🚩 Alert Components */ + +.alert { + @apply bg-background dark:bg-gray-100 text-foreground dark:text-foreground border border-solid border-border rounded-lg p-4 mb-4 text-sm; +} + +.alert p:last-of-type { + @apply mb-2; +} + +.alert summary:before { + top: 0.2rem !important; +} + +.alert svg { + @apply !w-5 !h-5 mb-0; +} + +.alert--info { + @apply bg-cyan-50 dark:bg-cyan-900/10 text-cyan-900 dark:text-cyan-100 border-cyan-200 dark:border-cyan-700; +} + +.alert--info svg { + @apply !fill-cyan-500 dark:!fill-cyan-200; +} + +.alert--warning { + @apply bg-amber-50 dark:bg-amber-900/10 text-amber-900 dark:text-amber-100 border-amber-200 dark:border-amber-700; +} + +.alert--warning svg { + @apply !fill-amber-500 dark:!fill-amber-200; +} + +.alert--success { + @apply bg-emerald-50 dark:bg-emerald-900/10 text-emerald-900 dark:text-emerald-100 border-emerald-200 dark:border-emerald-700; +} + +.alert--success svg { + @apply !fill-emerald-500 dark:!fill-emerald-200; +} + +.alert--danger { + @apply bg-red-50 dark:bg-red-900/10 text-red-900 dark:text-red-100 border-red-200 dark:border-red-700; +} + +.alert--danger svg { + @apply !fill-red-500 dark:!fill-red-200; +} diff --git a/crowdsec-docs/src/css/code.css b/crowdsec-docs/src/css/code.css new file mode 100644 index 000000000..d0846cc98 --- /dev/null +++ b/crowdsec-docs/src/css/code.css @@ -0,0 +1,22 @@ +/* πŸ’» Code blocks */ + +.prism-code { + @apply !bg-primary dark:!bg-gray-50 text-gray-900 dark:text-gray-100 p-4 mb-4 overflow-x-auto rounded-lg border border-solid border-border/80; +} + +pre { + @apply rounded-lg font-semibold; +} + +.prism-code .token.plain { + @apply text-white dark:text-foreground; +} + +.prism-code .token.function, +.prism-code .assign-left.variable { + @apply !text-premium dark:!text-secondary; +} + +code:not(.prism-code code) { + @apply bg-gray-100 dark:bg-gray-50 border-primary/20 border-solid border text-primary px-1 py-0.5 rounded-md font-semibold; +} diff --git a/crowdsec-docs/src/css/colors.css b/crowdsec-docs/src/css/colors.css new file mode 100644 index 000000000..d492de108 --- /dev/null +++ b/crowdsec-docs/src/css/colors.css @@ -0,0 +1,186 @@ +/* COLORS */ +@layer base { + /* // Zeplin https://app.zeplin.io/project/655e038b64d81b7bd89cdadb/screen/65a7e811a2ae29e2fbb62a17 */ + :root { + /* Gray */ + --color-gray-50: 248 250 252; + --color-gray-100: 241 245 249; + --color-gray-200: 226 232 240; + --color-gray-300: 203 213 225; + --color-gray-400: 148 163 184; + --color-gray-500: 100 116 139; + --color-gray-600: 71 85 105; + --color-gray-700: 46 59 77; + --color-gray-800: 22 30 47; + --color-gray-900: 16 24 39; + --color-gray-950: 4 4 31; + + /* Complementary */ + --color-red: 227 13 20; + --color-green: 31 168 81; + --color-orange: 240 111 5; + --color-yellow: 168 143 16; + --color-premium: 248 171 19; + --color-platinum: 251 217 131; + + /* Shadcn colors */ + --background: 252 253 253; + --foreground: 52 52 59; + --card: 255 255 255; + --card-foreground: 52 52 59; + --popover: 255 255 255; + --popover-foreground: 52 52 59; + --primary: 82 71 179; + --primary-foreground: 251 251 251; + --secondary: 159 107 4; + --secondary-foreground: 52 52 59; + --premium: 248 171 19; + --info: 224 178 90; + --info-foreground: 52 52 59; + --muted: 247 247 247; + --muted-foreground: 142 142 142; + --accent: 247 247 247; + --accent-foreground: 52 52 59; + --destructive: 220 38 38; + --destructive-foreground: 220 38 38; + --border: 171 177 184; + --input: 255 255 255; + --ring: 180 180 180; + --chart-1: 255 159 64; + --chart-2: 75 192 192; + --chart-3: 54 162 235; + --chart-4: 153 102 255; + --chart-5: 255 99 132; + --radius: 0.625rem; + --sidebar: 251 251 251; + --sidebar-foreground: 52 52 59; + --sidebar-primary: 120 102 201; + --sidebar-primary-foreground: 251 251 251; + --sidebar-accent: 247 247 247; + --sidebar-accent-foreground: 52 52 59; + --sidebar-border: 235 235 235; + --sidebar-ring: 180 180 180; + } + + html[data-theme="dark"] { + /* Gray */ + --color-gray-50: 4 4 31; + --color-gray-100: 16 24 39; + --color-gray-200: 22 30 47; + --color-gray-300: 46 59 77; + --color-gray-400: 71 85 105; + --color-gray-500: 100 116 139; + --color-gray-600: 148 163 184; + --color-gray-700: 203 213 225; + --color-gray-800: 226 232 240; + --color-gray-900: 241 245 249; + --colors-gray-950: 248 250 252; + + /* Complementary */ + --color-red: 245 91 96; + --color-green: 113 229 155; + --color-orange: 252 168 100; + --color-yellow: 227 195 95; + --color-premium: 248 171 19; + --color-platinum: 251 217 131; + } +} + +html[data-theme="dark"], +.dark { + /* Shadcn */ + --background: 16 24 39; + --foreground: 250 251 251; + --card: 22 33 47; + --card-foreground: 250 251 251; + --popover: 40 44 80; + --popover-foreground: 250 251 251; + --primary: 133 149 208; + --primary-foreground: 52 52 52; + --secondary: 224 178 90; + --secondary-foreground: 250 251 251; + --premium: 248 171 19; + --info: 224 178 90; + --info-foreground: 250 251 251; + --muted: 69 69 69; + --muted-foreground: 180 180 180; + --accent: 69 69 69; + --accent-foreground: 250 251 251; + --destructive: 133 72 60; + --destructive-foreground: 191 107 95; + --border: 46 59 77; + --input: 33 36 66; + --ring: 112 112 112; + --chart-1: 90 93 175; + --chart-2: 123 212 156; + --chart-3: 227 181 95; + --chart-4: 180 99 179; + --chart-5: 189 122 86; + --sidebar: 52 52 52; + --sidebar-foreground: 250 251 251; + --sidebar-primary: 133 149 208; + --sidebar-primary-foreground: 250 251 251; + --sidebar-accent: 69 69 69; + --sidebar-accent-foreground: 250 251 251; + --sidebar-border: 56 63 98; + --sidebar-ring: 112 112 112; +} + +@theme inline { + --color-background: var(--background); + --color-foreground: var(--foreground); + --color-card: var(--card); + --color-card-foreground: var(--card-foreground); + --color-popover: var(--popover); + --color-popover-foreground: var(--popover-foreground); + --color-primary: var(--primary); + --color-primary-foreground: var(--primary-foreground); + --color-secondary: var(--secondary); + --color-secondary-foreground: var(--secondary-foreground); + --color-info: var(--info); + --color-info-foreground: var(--info-foreground); + --color-muted: var(--muted); + --color-muted-foreground: var(--muted-foreground); + --color-accent: var(--accent); + --color-accent-foreground: var(--accent-foreground); + --color-destructive: var(--destructive); + --color-destructive-foreground: var(--destructive-foreground); + --color-border: var(--border); + --color-input: var(--input); + --color-ring: var(--ring); + --color-chart-1: var(--chart-1); + --color-chart-2: var(--chart-2); + --color-chart-3: var(--chart-3); + --color-chart-4: var(--chart-4); + --color-chart-5: var(--chart-5); + --radius-sm: calc(var(--radius) - 4px); + --radius-md: calc(var(--radius) - 2px); + --radius-lg: var(--radius); + --radius-xl: calc(var(--radius) + 4px); + --color-sidebar: var(--sidebar); + --color-sidebar-foreground: var(--sidebar-foreground); + --color-sidebar-primary: var(--sidebar-primary); + --color-sidebar-primary-foreground: var(--sidebar-primary-foreground); + --color-sidebar-accent: var(--sidebar-accent); + --color-sidebar-accent-foreground: var(--sidebar-accent-foreground); + --color-sidebar-border: var(--sidebar-border); + --color-sidebar-ring: var(--sidebar-ring); +} + +/* You can override the default Infima variables here. */ +:root { + /* Docusaurus global colors */ + --docusaurus-announcement-bar-height: 2.5rem !important; + --docusaurus-highlighted-code-line-bg: rgba(0, 0, 0, 0.1); + + /* IFM Theme color overrides */ + --ifm-color-primary: rgb(var(--primary)); + --ifm-global-shadow-md: 0px; + --ifm-code-font-size: 95%; + --ifm-font-family-base: "Instrument Sans", sans-serif; /* For body text */ + --ifm-font-family-monospace: "Courier New", monospace; /* For code blocks */ + --ifm-dropdown-background-color: rgb(var(--card)); + + /* Algolia global search colors */ + --docsearch-searchbox-background: rgb(var(--input)); +} diff --git a/crowdsec-docs/src/css/custom.css b/crowdsec-docs/src/css/custom.css index 0b29ff669..b35406569 100644 --- a/crowdsec-docs/src/css/custom.css +++ b/crowdsec-docs/src/css/custom.css @@ -4,140 +4,17 @@ @import "tailwindcss/components"; @import "tailwindcss/utilities"; +@import url("colors.css"); /* SHOULD BE ON TOP */ +@import url("alerts.css"); +@import url("code.css"); +@import url("navbar.css"); + /** * Any CSS included here will be global. The classic template * bundles Infima by default. Infima is a CSS framework designed to * work well for content-centric websites. */ -/* COLORS */ -@layer base { - /* // Zeplin https://app.zeplin.io/project/655e038b64d81b7bd89cdadb/screen/65a7e811a2ae29e2fbb62a17 */ - :root { - /* Gray */ - --color-gray-50: 248 250 252; - --color-gray-100: 241 245 249; - --color-gray-200: 226 232 240; - --color-gray-300: 203 213 225; - --color-gray-400: 148 163 184; - --color-gray-500: 100 116 139; - --color-gray-600: 71 85 105; - --color-gray-700: 46 59 77; - --color-gray-800: 22 30 47; - --color-gray-900: 16 24 39; - --color-gray-950: 4 4 31; - - /* Complementary */ - --color-red: 227 13 20; - --color-green: 31 168 81; - --color-orange: 240 111 5; - --color-yellow: 168 143 16; - --color-premium: 248 171 19; - --color-platinum: 251 217 131; - - /* Shadcn colors */ - --background: 252 253 253; - --foreground: 52 52 59; - --card: 255 255 255; - --card-foreground: 52 52 59; - --popover: 255 255 255; - --popover-foreground: 52 52 59; - --primary: 82 71 179; - --primary-foreground: 251 251 251; - --secondary: 159 107 4; - --secondary-foreground: 52 52 59; - --premium: 248 171 19; - --info: 224 178 90; - --info-foreground: 52 52 59; - --muted: 247 247 247; - --muted-foreground: 142 142 142; - --accent: 247 247 247; - --accent-foreground: 52 52 59; - --destructive: 220 38 38; - --destructive-foreground: 220 38 38; - --border: 171 177 184; - --input: 255 255 255; - --ring: 180 180 180; - --chart-1: 255 159 64; - --chart-2: 75 192 192; - --chart-3: 54 162 235; - --chart-4: 153 102 255; - --chart-5: 255 99 132; - --radius: 0.625rem; - --sidebar: 251 251 251; - --sidebar-foreground: 52 52 59; - --sidebar-primary: 120 102 201; - --sidebar-primary-foreground: 251 251 251; - --sidebar-accent: 247 247 247; - --sidebar-accent-foreground: 52 52 59; - --sidebar-border: 235 235 235; - --sidebar-ring: 180 180 180; - } - - html[data-theme="dark"] { - /* Gray */ - --color-gray-50: 4 4 31; - --color-gray-100: 16 24 39; - --color-gray-200: 22 30 47; - --color-gray-300: 46 59 77; - --color-gray-400: 71 85 105; - --color-gray-500: 100 116 139; - --color-gray-600: 148 163 184; - --color-gray-700: 203 213 225; - --color-gray-800: 226 232 240; - --color-gray-900: 241 245 249; - --colors-gray-950: 248 250 252; - - /* Complementary */ - --color-red: 245 91 96; - --color-green: 113 229 155; - --color-orange: 252 168 100; - --color-yellow: 227 195 95; - --color-premium: 248 171 19; - --color-platinum: 251 217 131; - } -} - -html[data-theme="dark"], -.dark { - /* Shadcn */ - --background: 16 24 39; - --foreground: 250 251 251; - --card: 22 33 47; - --card-foreground: 250 251 251; - --popover: 40 44 80; - --popover-foreground: 250 251 251; - --primary: 133 149 208; - --primary-foreground: 52 52 52; - --secondary: 224 178 90; - --secondary-foreground: 250 251 251; - --premium: 248 171 19; - --info: 224 178 90; - --info-foreground: 250 251 251; - --muted: 69 69 69; - --muted-foreground: 180 180 180; - --accent: 69 69 69; - --accent-foreground: 250 251 251; - --destructive: 133 72 60; - --destructive-foreground: 191 107 95; - --border: 46 59 77; - --input: 33 36 66; - --ring: 112 112 112; - --chart-1: 90 93 175; - --chart-2: 123 212 156; - --chart-3: 227 181 95; - --chart-4: 180 99 179; - --chart-5: 189 122 86; - --sidebar: 52 52 52; - --sidebar-foreground: 250 251 251; - --sidebar-primary: 133 149 208; - --sidebar-primary-foreground: 250 251 251; - --sidebar-accent: 69 69 69; - --sidebar-accent-foreground: 250 251 251; - --sidebar-border: 56 63 98; - --sidebar-ring: 112 112 112; -} - * { @apply border-border outline-ring/50; } @@ -147,65 +24,6 @@ body, @apply bg-background text-foreground; } -@theme inline { - --color-background: var(--background); - --color-foreground: var(--foreground); - --color-card: var(--card); - --color-card-foreground: var(--card-foreground); - --color-popover: var(--popover); - --color-popover-foreground: var(--popover-foreground); - --color-primary: var(--primary); - --color-primary-foreground: var(--primary-foreground); - --color-secondary: var(--secondary); - --color-secondary-foreground: var(--secondary-foreground); - --color-info: var(--info); - --color-info-foreground: var(--info-foreground); - --color-muted: var(--muted); - --color-muted-foreground: var(--muted-foreground); - --color-accent: var(--accent); - --color-accent-foreground: var(--accent-foreground); - --color-destructive: var(--destructive); - --color-destructive-foreground: var(--destructive-foreground); - --color-border: var(--border); - --color-input: var(--input); - --color-ring: var(--ring); - --color-chart-1: var(--chart-1); - --color-chart-2: var(--chart-2); - --color-chart-3: var(--chart-3); - --color-chart-4: var(--chart-4); - --color-chart-5: var(--chart-5); - --radius-sm: calc(var(--radius) - 4px); - --radius-md: calc(var(--radius) - 2px); - --radius-lg: var(--radius); - --radius-xl: calc(var(--radius) + 4px); - --color-sidebar: var(--sidebar); - --color-sidebar-foreground: var(--sidebar-foreground); - --color-sidebar-primary: var(--sidebar-primary); - --color-sidebar-primary-foreground: var(--sidebar-primary-foreground); - --color-sidebar-accent: var(--sidebar-accent); - --color-sidebar-accent-foreground: var(--sidebar-accent-foreground); - --color-sidebar-border: var(--sidebar-border); - --color-sidebar-ring: var(--sidebar-ring); -} - -/* You can override the default Infima variables here. */ -:root { - /* Docusaurus global colors */ - --docusaurus-announcement-bar-height: 2.5rem !important; - --docusaurus-highlighted-code-line-bg: rgba(0, 0, 0, 0.1); - - /* IFM Theme color overrides */ - --ifm-color-primary: rgb(var(--primary)); - --ifm-global-shadow-md: 0px; - --ifm-code-font-size: 95%; - --ifm-font-family-base: "Instrument Sans", sans-serif; /* For body text */ - --ifm-font-family-monospace: "Courier New", monospace; /* For code blocks */ - --ifm-dropdown-background-color: rgb(var(--card)); - - /* Algolia global search colors */ - --docsearch-searchbox-background: rgb(var(--input)); -} - html[data-theme="light"] .menu__link--active { --ifm-menu-color-active: rgb(var(--primary)); } @@ -258,126 +76,6 @@ blockquote { --ifm-blockquote-background-color: transparent; } -.navbar { - @apply border-b border-border border-solid; -} - -.navbar__link { - --ifm-navbar-link-hover-color: rgb(var(--primary)); -} - -.navbar, -.navbar-sidebar { - @apply bg-card text-foreground border-border/80; - --ifm-navbar-link-color: rgb(var(--foreground)); - --ifm-menu-color: rgb(var(--foreground)); -} - -.navbar { - @apply border border-b border-solid; -} - -/** Patch some colors **/ -button[class*="toggleButton"]:hover { - @apply bg-transparent; -} - -svg[class*="toggleIcon"][class*="ToggleIcon"]:hover { - @apply !text-primary; -} - -.navbar__toggle svg, -.navbar-sidebar__back, -svg[class*="toggleIcon"][class*="lightToggleIcon"] { - @apply !text-foreground; -} - -html[data-theme="light"] .navbar-sidebar__item > .menu__list .menu__link--sublist-caret::after, -html[data-theme="light"] .navbar-sidebar__item > .menu__list .menu__caret::before { - --ifm-menu-link-sublist-icon-filter: none; - --ifm-menu-link-sublist-icon: url('data:image/svg+xml;utf8,'); -} - -.header-discord-link:before { - content: "Discord"; - padding-left: 1.5rem !important; - padding-right: 0 !important; - background: - no-repeat left / 22% - url("data:image/svg+xml,%3C%3Fxml%20version%3D%221.0%22%3F%3E%3Csvg%20fill%3D%22%23ffffff%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20%20viewBox%3D%220%200%2024%2024%22%20width%3D%2224px%22%20height%3D%2224px%22%3E%20%20%20%20%3Cpath%20d%3D%22M19.952%2C5.672c-1.904-1.531-4.916-1.79-5.044-1.801c-0.201-0.017-0.392%2C0.097-0.474%2C0.281%20c-0.006%2C0.012-0.072%2C0.163-0.145%2C0.398c1.259%2C0.212%2C2.806%2C0.64%2C4.206%2C1.509c0.224%2C0.139%2C0.293%2C0.434%2C0.154%2C0.659%20c-0.09%2C0.146-0.247%2C0.226-0.407%2C0.226c-0.086%2C0-0.173-0.023-0.252-0.072C15.584%2C5.38%2C12.578%2C5.305%2C12%2C5.305S8.415%2C5.38%2C6.011%2C6.872%20c-0.225%2C0.14-0.519%2C0.07-0.659-0.154c-0.14-0.225-0.07-0.519%2C0.154-0.659c1.4-0.868%2C2.946-1.297%2C4.206-1.509%20c-0.074-0.236-0.14-0.386-0.145-0.398C9.484%2C3.968%2C9.294%2C3.852%2C9.092%2C3.872c-0.127%2C0.01-3.139%2C0.269-5.069%2C1.822%20C3.015%2C6.625%2C1%2C12.073%2C1%2C16.783c0%2C0.083%2C0.022%2C0.165%2C0.063%2C0.237c1.391%2C2.443%2C5.185%2C3.083%2C6.05%2C3.111c0.005%2C0%2C0.01%2C0%2C0.015%2C0%20c0.153%2C0%2C0.297-0.073%2C0.387-0.197l0.875-1.202c-2.359-0.61-3.564-1.645-3.634-1.706c-0.198-0.175-0.217-0.477-0.042-0.675%20c0.175-0.198%2C0.476-0.217%2C0.674-0.043c0.029%2C0.026%2C2.248%2C1.909%2C6.612%2C1.909c4.372%2C0%2C6.591-1.891%2C6.613-1.91%20c0.198-0.172%2C0.5-0.154%2C0.674%2C0.045c0.174%2C0.198%2C0.155%2C0.499-0.042%2C0.673c-0.07%2C0.062-1.275%2C1.096-3.634%2C1.706l0.875%2C1.202%20c0.09%2C0.124%2C0.234%2C0.197%2C0.387%2C0.197c0.005%2C0%2C0.01%2C0%2C0.015%2C0c0.865-0.027%2C4.659-0.667%2C6.05-3.111%20C22.978%2C16.947%2C23%2C16.866%2C23%2C16.783C23%2C12.073%2C20.985%2C6.625%2C19.952%2C5.672z%20M8.891%2C14.87c-0.924%2C0-1.674-0.857-1.674-1.913%20s0.749-1.913%2C1.674-1.913s1.674%2C0.857%2C1.674%2C1.913S9.816%2C14.87%2C8.891%2C14.87z%20M15.109%2C14.87c-0.924%2C0-1.674-0.857-1.674-1.913%20s0.749-1.913%2C1.674-1.913c0.924%2C0%2C1.674%2C0.857%2C1.674%2C1.913S16.033%2C14.87%2C15.109%2C14.87z%22%2F%3E%3C%2Fsvg%3E"); -} - -.header-github-link:before { - content: "GitHub"; - padding-left: 1.5rem !important; - padding-right: 0 !important; - background: - no-repeat left / 22% - url("data:image/svg+xml,%3Csvg viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill='white' d='M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12'/%3E%3C/svg%3E"); -} - -.header-discourse-link:before { - content: "Forum"; - padding-left: 1.5rem !important; - padding-right: 0 !important; - background: - no-repeat left / 22% - url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20width%3D%2222%22%20height%3D%2222%22%20preserveAspectRatio%3D%22xMidYMid%20meet%22%20viewBox%3D%220%200%2024%2024%22%3E%3Cpath%20d%3D%22M12.077%203C7.149%203%203%206.96%203%2011.843V21l9.075-.01c4.928%200%208.925-4.11%208.925-8.993C21%207.113%2017%203%2012.077%203zm3.92%2012.859a5.568%205.568%200%200%201-6.102%201.043l-3.595.805l1.001-3.192a5.435%205.435%200%200%201%20.11-5.415a5.55%205.55%200%200%201%204.753-2.678v.001h.006a5.533%205.533%200%200%201%205.131%203.438a5.442%205.442%200%200%201-1.304%205.998z%22%20fill%3D%22white%22%2F%3E%3C%2Fsvg%3E"); -} - -.header-hub-link:before { - content: "Hub"; - padding-left: 1.7rem !important; - color: black; - background: - no-repeat left / 33% - url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 275.05 249.82' %3E%3Cstyle%3E%3C!%5BCDATA%5B.C%7Bletter-spacing:-0.04em%7D%5D%5D%3E%3C/style%3E%3Cpath d='M39.26 178.8a20.79 20.79 0 0 1-7 4.92 24 24 0 0 1-9.76 1.84 23.7 23.7 0 0 1-9.86-1.9 20.78 20.78 0 0 1-7-5 21.06 21.06 0 0 1-4.21-7.07A24 24 0 0 1 0 163.47a24.34 24.34 0 0 1 1.41-8.14 21 21 0 0 1 4.21-7.09 20.78 20.78 0 0 1 7-5 23.7 23.7 0 0 1 9.86-1.9 23.64 23.64 0 0 1 9.76 1.87 20.72 20.72 0 0 1 7 5l-5.1 4.24a14.52 14.52 0 0 0-4.92-3.57 16.37 16.37 0 0 0-6.88-1.35 14.84 14.84 0 0 0-14 8.25 17.57 17.57 0 0 0 0 15.33 14.85 14.85 0 0 0 14 8.24 16.65 16.65 0 0 0 6.79-1.29 14.39 14.39 0 0 0 4.87-3.44l5.09 4.24zm2.45-25.49h6.21v3.13a9.62 9.62 0 0 1 2.33-1.81 13.23 13.23 0 0 1 2.89-1.23 18.62 18.62 0 0 1 3.14-.65 16.42 16.42 0 0 1 3.13-.06v6a15.17 15.17 0 0 0-5.65.37 7.41 7.41 0 0 0-3.51 2.15 8.42 8.42 0 0 0-1.81 3.56 19.24 19.24 0 0 0-.52 4.67v15.06h-6.21zM75 185.19a16.52 16.52 0 0 1-9.15-2.39 15.31 15.31 0 0 1-5.5-6 17.42 17.42 0 0 1-1.84-7.8 16.7 16.7 0 0 1 1.81-7.8 15.59 15.59 0 0 1 5.5-6 16.39 16.39 0 0 1 9.18-2.4 16.42 16.42 0 0 1 9.19 2.4 15.67 15.67 0 0 1 5.5 6 16.7 16.7 0 0 1 1.81 7.8 17.55 17.55 0 0 1-1.84 7.8 15.39 15.39 0 0 1-5.5 6 16.53 16.53 0 0 1-9.16 2.39zm0-27.77a9.23 9.23 0 0 0-5.71 1.72 10.8 10.8 0 0 0-3.41 4.27 14.13 14.13 0 0 0 0 11.12 10.73 10.73 0 0 0 3.41 4.27 10.35 10.35 0 0 0 11.43 0 10.82 10.82 0 0 0 3.41-4.27 14.24 14.24 0 0 0 0-11.12 10.89 10.89 0 0 0-3.41-4.27 9.26 9.26 0 0 0-5.72-1.72zm49 19.48l6.51-23.53h7.31l-10.2 31.21h-7.31l-6.45-24-6.45 24h-7.31l-10.2-31.21h7.31l6.51 23.53 6.52-23.53h7.12zm39.79-35.33h6.27v43h-6.27v-4.43a12.91 12.91 0 0 1-4.7 3.81 15 15 0 0 1-11.61.56 15.41 15.41 0 0 1-9-8.3 19 19 0 0 1 0-14.5 15.38 15.38 0 0 1 9-8.29 15.09 15.09 0 0 1 11.63.55 12.86 12.86 0 0 1 4.71 3.81zm-10.23 15.85a9.82 9.82 0 0 0-4.5 1 9.61 9.61 0 0 0-3.22 2.62 11.21 11.21 0 0 0-1.93 3.71 14.37 14.37 0 0 0 0 8.48 11.36 11.36 0 0 0 1.93 3.72 9.7 9.7 0 0 0 3.22 2.61 10.82 10.82 0 0 0 9 0 9.7 9.7 0 0 0 3.22-2.61 11.36 11.36 0 0 0 1.93-3.72 14.36 14.36 0 0 0 0-8.48 11.21 11.21 0 0 0-1.93-3.71 9.61 9.61 0 0 0-3.22-2.62 9.85 9.85 0 0 0-4.5-1zm37.26-16.09a28.52 28.52 0 0 1 9.22 1.56 33 33 0 0 1 7.68 3.9l-3.44 3.94-.74.86a21.17 21.17 0 0 0-7-3.78 18.59 18.59 0 0 0-6.45-.83 13 13 0 0 0-5.19 1.32 7.92 7.92 0 0 0-3.19 2.7 3.84 3.84 0 0 0-.49 3.26 5.56 5.56 0 0 0 2.88 3 30.3 30.3 0 0 0 6.05 2.49q3.42 1 6.73 2.21a32.23 32.23 0 0 1 6 2.89 10.15 10.15 0 0 1 4 4.51 11.41 11.41 0 0 1 1 3.84 10.55 10.55 0 0 1-.58 4.21 8.33 8.33 0 0 1-1.48 2.67 11.45 11.45 0 0 1-2.27 2.12 17.44 17.44 0 0 1-5.84 2.58 28.66 28.66 0 0 1-6.2.86 33.14 33.14 0 0 1-5.32-.4 24.81 24.81 0 0 1-4.76-1.23 25.47 25.47 0 0 1-4.48-2.15 31.86 31.86 0 0 1-4.49-3.28l3.38-3.87.86-1a24.25 24.25 0 0 0 7.56 4.77 23.32 23.32 0 0 0 8.41 1.32 10.3 10.3 0 0 0 4.64-1.08 8.57 8.57 0 0 0 3.29-2.64 4.07 4.07 0 0 0 .71-3.35c-.27-1.19-1.26-2.29-3-3.32a22.84 22.84 0 0 0-4.27-1.87l-5.16-1.66-5.29-1.81a23.21 23.21 0 0 1-4.67-2.37 11.79 11.79 0 0 1-3.31-3.25 7.6 7.6 0 0 1-1.2-4.52 10.62 10.62 0 0 1 1.5-5.47 13.24 13.24 0 0 1 3.75-3.93 17.11 17.11 0 0 1 5.19-2.39 21.53 21.53 0 0 1 5.84-.8zm35.88 39.13a9.5 9.5 0 0 0 5.13-1.32 9.93 9.93 0 0 0 3.35-3.41l4.54 3.5a14.91 14.91 0 0 1-5.28 4.27 17.06 17.06 0 0 1-7.74 1.63 18 18 0 0 1-6.64-1.14 15.19 15.19 0 0 1-4.94-3.07 14.82 14.82 0 0 1-3.26-4.45 17.51 17.51 0 0 1 0-15.12 14.82 14.82 0 0 1 3.26-4.45 15.36 15.36 0 0 1 4.94-3.07 19.88 19.88 0 0 1 13.27 0 15.3 15.3 0 0 1 4.95 3.07 14.82 14.82 0 0 1 3.26 4.45 17.53 17.53 0 0 1 1.56 9.9h-26.41a13.65 13.65 0 0 0 1.07 3.5 10.56 10.56 0 0 0 2 2.95 9 9 0 0 0 3 2 10.16 10.16 0 0 0 4 .74zm10.14-13.88a14 14 0 0 0-1.08-3.51 10.51 10.51 0 0 0-2-2.94 8.89 8.89 0 0 0-3-2 11 11 0 0 0-7.92 0 8.89 8.89 0 0 0-3 2 10.51 10.51 0 0 0-2 2.94 13.6 13.6 0 0 0-1.07 3.51h20.15zm32.93 16.89a17.1 17.1 0 0 1-7.87 1.66 16.44 16.44 0 0 1-9.15-2.4 15.22 15.22 0 0 1-5.5-6 17.42 17.42 0 0 1-1.84-7.8 16.67 16.67 0 0 1 1.81-7.8 15.52 15.52 0 0 1 5.5-6 16.39 16.39 0 0 1 9.18-2.4 17.1 17.1 0 0 1 7.87 1.66 15 15 0 0 1 5.28 4.36l-4.55 3.57a10.1 10.1 0 0 0-3.37-3.54 9.51 9.51 0 0 0-5.23-1.38 9.16 9.16 0 0 0-5.71 1.72 10.8 10.8 0 0 0-3.41 4.27 14.13 14.13 0 0 0 0 11.12 10.8 10.8 0 0 0 3.41 4.27 9.16 9.16 0 0 0 5.71 1.72 9.51 9.51 0 0 0 5.23-1.38 10.15 10.15 0 0 0 3.37-3.53l4.55 3.56a14.91 14.91 0 0 1-5.28 4.32z' fill='black'/%3E%3Cpath d='M110 117.18l-.72 6.65h.06l.66-6.65z' fill='black' /%3E%3Ctext class='C' transform='translate(83.51 237.44)' fill='black' font-size='61' font-family='BellinzoRegularRegular,Bellinzo Regular'%3EHub%3C/text%3E%3Cg fill='black' %3E%3Cpath d='M102.63 63.66a20.63 20.63 0 0 1 1.69 3.48h0a27.11 27.11 0 0 0-2.14-5.92c-1.56-3-3.86-2.86-5.3 0a29.14 29.14 0 0 0-2.14 6 23.85 23.85 0 0 1 1.68-3.55c1.69-2.87 4.39-2.99 6.21-.01zm73.63 0a21.42 21.42 0 0 1 1.74 3.48h0a26.6 26.6 0 0 0-2.14-5.92c-1.55-3-3.85-2.86-5.29 0a29.14 29.14 0 0 0-2.14 6 23.85 23.85 0 0 1 1.68-3.55c1.63-2.87 4.33-2.99 6.15-.01zM140 46.06a27.85 27.85 0 0 1 2.37 5.32 34.92 34.92 0 0 0-2.77-7.78c-1.94-3.72-4.81-3.57-6.61 0a37.88 37.88 0 0 0-2.77 7.9 30.88 30.88 0 0 1 2.36-5.44c1.99-3.57 5.22-3.72 7.42 0zM95 67.82a5.51 5.51 0 0 0 3.59 4.59l.13 4 .46 4.78c.19 1.13.48 1.08.66 0 .25-1.52.32-3.15.46-4.78a39 39 0 0 0 .12-4 5.5 5.5 0 0 0 3.6-4.59 9.08 9.08 0 0 1-9 0z'/%3E%3Cpath d='M168.63 67.82a5.5 5.5 0 0 0 3.6 4.59 39 39 0 0 0 .12 4l.46 4.78c.2 1.13.48 1.08.66 0 .25-1.52.32-3.15.46-4.78l.13-4a5.51 5.51 0 0 0 3.59-4.59 9.08 9.08 0 0 1-9 0zM188 75.94c1 4.27 2.23 13.48 3.5 24.14C190.43 90 189.28 81 188 75.94zm-46.18-24.07a11.36 11.36 0 0 1-11.25 0c.52 2.88 2.27 5.13 4.49 5.71l.15 5.05.58 6c.24 1.41.59 1.35.82 0 .31-1.9.4-3.93.57-6 .14-1.66.18-3.35.16-5.05 2.21-.58 3.97-2.83 4.48-5.71zM98.54 72.41l.13 4 .46 4.78c.19 1.13.48 1.08.66 0 .25-1.52.32-3.15.46-4.78a39 39 0 0 0 .12-4 5.5 5.5 0 0 0 3.6-4.59 9.08 9.08 0 0 1-9 0 5.51 5.51 0 0 0 3.57 4.59zm60.6 19.68c-1.59-13.3-3.15-24.78-4.37-30.1a7.1 7.1 0 0 0 6.87-5.84h0a8.19 8.19 0 0 0 .12-1.11h.2a4.47 4.47 0 0 0 2.74-8.18 7.1 7.1 0 0 0-1.8-13.51 4.47 4.47 0 0 0-3.43-7.22 7.17 7.17 0 0 0 2.87-2.52c1.67-2.61 1.94-14.4-4-22-2.44-3.12-4.83-1.24-5 .89-.47 6.52-.52 11.42-2.22 17a4.46 4.46 0 0 0-7.92-2.05 7.1 7.1 0 0 0-14 0 4.47 4.47 0 0 0-7.94 2c-1.69-5.59-1.75-10.49-2.22-17-.15-2.13-2.54-4-5-.89-5.93 7.58-5.66 19.37-4 22a7.17 7.17 0 0 0 2.87 2.52 4.48 4.48 0 0 0-3.43 7.22 7.1 7.1 0 0 0-1.79 13.51 4.47 4.47 0 0 0 2.73 8.18h.21a6.36 6.36 0 0 0 .11 1.07h0a7.1 7.1 0 0 0 7 5.89h0c-2 8.51-5 32.87-7.43 55.17l-.66 6.65a842.28 842.28 0 0 1 26.64-.42c9 0 17.83.14 26.22.41l-.67-6.27-2.7-25.4zm-14.58-40a5.88 5.88 0 0 1-2.39-1.17c.7 2.78 1.21 5.61 1.93 8.44a45.15 45.15 0 0 1 1.22 7.43c.31 3.86-2.22 7.19-5.39 7.19h-7.47c-3.17 0-5.7-3.33-5.39-7.19a46.23 46.23 0 0 1 1.22-7.43c.66-2.61 1.17-5.23 1.81-7.8a8.31 8.31 0 0 1-3.84 1 44.4 44.4 0 0 1-6.91-.45 4.78 4.78 0 0 1-4-3.37c-.59-1.69-1-3.45-1.59-5.14a14.16 14.16 0 0 0-1.21-2.09 2.41 2.41 0 0 1-.42-.89v-3.86a38.54 38.54 0 0 1 12.17-1.54 27 27 0 0 1 8.8 1.61 10.09 10.09 0 0 0 7.18 0 30 30 0 0 1 13.6-1.44c2.45.22 4.87.76 7.35 1.16v4.08c0 .29-.13.74-.33.82-1 .45-1.11 1.36-1.35 2.25a84.99 84.99 0 0 1-1.41 4.71 5.44 5.44 0 0 1-4.38 3.79 20.06 20.06 0 0 1-9.2-.1zm-29.92 15.64a5.53 5.53 0 0 1-1.13.36 16.1 16.1 0 0 1-7.34-.08 4.61 4.61 0 0 1-1.92-.94l1.55 6.77a36.86 36.86 0 0 1 1 6c.24 3.1-1.78 5.77-4.33 5.77h-6c-2.55 0-4.58-2.67-4.33-5.77a36.86 36.86 0 0 1 1-6l1.45-6.26a6.48 6.48 0 0 1-3.08.79A34.29 34.29 0 0 1 86 68a3.85 3.85 0 0 1-3.22-2.71l-1.28-4.12a10.81 10.81 0 0 0-1-1.67 1.73 1.73 0 0 1-.33-.72v-3.09a30.28 30.28 0 0 1 9.75-1.23 21.25 21.25 0 0 1 7.06 1.29 8.11 8.11 0 0 0 5.76 0 19.87 19.87 0 0 1 2.74-.81 6.47 6.47 0 0 1-.79-7.68 9.11 9.11 0 0 1-2.18-11 5.59 5.59 0 0 0-3-.86 5.7 5.7 0 0 0-5.64 4.88 3.58 3.58 0 0 0-6.37 1.62c-1.35-4.48-1.4-8.41-1.77-13.64-.12-1.7-2-3.21-4-.71-4.75 6.08-4.54 15.53-3.2 17.63a5.86 5.86 0 0 0 2.3 2A3.58 3.58 0 0 0 78 53a5.69 5.69 0 0 0-1.4 10.82 3.59 3.59 0 0 0 2.19 6.56h.17a6 6 0 0 0 .09.86h0A5.69 5.69 0 0 0 84.66 76h0c-1.58 6.82-4 26.36-6 44.24l-.53 5.38c9-.74 18.89-1.31 29.48-1.68l.69-6.94 2.87-24.67 3.47-24.6z'/%3E%3Cpath d='M199.39 58.62a5.7 5.7 0 0 0-4.83-5.62 3.58 3.58 0 0 0-2.75-5.79 5.86 5.86 0 0 0 2.3-2c1.34-2.1 1.55-11.55-3.2-17.63-2-2.5-3.87-1-4 .71-.37 5.23-.41 9.16-1.77 13.64a3.59 3.59 0 0 0-6.36-1.64 5.69 5.69 0 0 0-8.78-3.92 9.1 9.1 0 0 1-2.23 10.9 6.44 6.44 0 0 1-.66 7.54 21.08 21.08 0 0 1 3.54 1 8.11 8.11 0 0 0 5.76 0 24.1 24.1 0 0 1 10.91-1.15c2 .17 3.91.6 5.9.93v3.27c0 .23-.11.59-.26.66-.82.36-.9 1.09-1.09 1.8a63 63 0 0 1-1.13 3.78 4.35 4.35 0 0 1-3.51 3 16.1 16.1 0 0 1-7.34-.08 4.67 4.67 0 0 1-1.92-.94c.56 2.23 1 4.5 1.55 6.77a36.86 36.86 0 0 1 1 6c.25 3.1-1.78 5.77-4.33 5.77h-6c-2.55 0-4.57-2.67-4.33-5.77a36.86 36.86 0 0 1 1-6c.53-2.09.94-4.19 1.45-6.26a6.48 6.48 0 0 1-3.08.79 34.29 34.29 0 0 1-5.54-.35 3.78 3.78 0 0 1-1.84-.74c1.52 9.16 3.53 25.4 6.18 50.05l.29 2.62q.19 1.9.42 3.93c10.62.37 20.57.94 29.58 1.68l-.55-5.07-2.17-20.41c-1.33-10.67-2.6-19.88-3.6-24.15a5.7 5.7 0 0 0 5.51-4.68h0a6.69 6.69 0 0 0 .09-.9h.17a3.59 3.59 0 0 0 2.23-6.54 5.69 5.69 0 0 0 3.39-5.2zm-36.87 65.19h.15q-.33-3.09-.67-6.27l-2.86-25.45 2.71 25.45.67 6.27z'/%3E%3Cpath d='M154.77 62c1.22 5.32 2.78 16.8 4.37 30.1-1.39-12.56-2.82-23.86-4.37-30.1zm-44.45 55.17l-.72 6.65h.06l.66-6.65z'/%3E%3C/g%3E%3C/svg%3E"); -} - -/* On wide screens (desktop), remove text content for icon-only display */ -@media (min-width: 1401px) { - .header-discord-link:before, - .header-github-link:before, - .header-discourse-link:before { - content: ""; - padding-left: 0.7rem; - padding-right: 0.8rem; - background-position: center; - background-size: 80%; - } -} - -.header-console-link:before { - content: "Console"; - padding-left: 1.5rem !important; - padding-right: 0 !important; - background: - no-repeat left / 22% - url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20width%3D%2222%22%20height%3D%2222%22%20preserveAspectRatio%3D%22xMidYMid%20meet%22%20viewBox%3D%220%200%2032%2032%22%3E%3Cpath%20d%3D%22M4%2020v2h4.586L2%2028.586L3.414%2030L10%2023.414V28h2v-8H4z%22%20fill%3D%22white%22%2F%3E%3Cpath%20d%3D%22M24%2021h2v5h-2z%22%20fill%3D%22white%22%2F%3E%3Cpath%20d%3D%22M20%2016h2v10h-2z%22%20fill%3D%22white%22%2F%3E%3Cpath%20d%3D%22M16%2018h2v8h-2z%22%20fill%3D%22white%22%2F%3E%3Cpath%20d%3D%22M28%202H4a2.002%202.002%200%200%200-2%202v12h2v-3h24.001l.001%2015H16v2h12a2.003%202.003%200%200%200%202-2V4a2.002%202.002%200%200%200-2-2zm-16%209H4V4h8zm2%200V4h14v7z%22%20fill%3D%22white%22%2F%3E%3C%2Fsvg%3E"); -} - -.navbar__items--right .navbar__link:hover { - @apply opacity-60; -} - -.navbar { - @apply whitespace-nowrap; -} - -.navbar__items--right .navbar__link:before { - @apply px-3 h-6; -} - -.navbar__items--right .navbar__link { - @apply pl-4 pr-0; -} - -@media (max-width: 1400px) { - .navbar__items--right .navbar__link { - display: none; - } -} - /* Announcement Bar */ div[class^="announcementBar"] > div[class^="content"] { font-size: 100%; @@ -540,72 +238,3 @@ div[class^="announcementBar"] { vertical-align: middle; transform: rotate(0deg) !important; /* force reset to counter act UL accordion transform */ } - -/* 🚩 Alert component */ - -.alert { - @apply bg-background dark:bg-gray-100 text-foreground dark:text-foreground border border-solid border-border rounded-lg p-4 mb-4 text-sm; -} - -.alert p { - @apply mb-1; -} - -.alert svg { - @apply !w-5 !h-5 mb-0; -} - -.alert--info { - @apply bg-cyan-50 dark:bg-cyan-900/10 text-cyan-900 dark:text-cyan-100 border-cyan-200 dark:border-cyan-700; -} - -.alert--info svg { - @apply !fill-cyan-500 dark:fill-cyan-200; -} - -.alert--warning { - @apply bg-amber-50 dark:bg-amber-900/10 text-amber-900 dark:text-amber-100 border-amber-200 dark:border-amber-700; -} - -.alert--warning svg { - @apply !fill-amber-500 dark:fill-amber-200; -} - -.alert--success { - @apply bg-emerald-50 dark:bg-emerald-900/10 text-emerald-900 dark:text-emerald-100 border-emerald-200 dark:border-emerald-700; -} - -.alert--success svg { - @apply !fill-emerald-500 dark:fill-emerald-200; -} - -.alert--danger { - @apply bg-red-50 dark:bg-red-900/10 text-red-900 dark:text-red-100 border-red-200 dark:border-red-700; -} - -.alert--danger svg { - @apply fill-red-500 dark:fill-red-200; -} - -/* πŸ’» Code blocks */ - -.prism-code { - @apply !bg-primary dark:!bg-gray-50 text-gray-900 dark:text-gray-100 p-4 mb-4 overflow-x-auto rounded-lg border border-solid border-border/80; -} - -pre { - @apply rounded-lg font-semibold; -} - -.prism-code .token.plain { - @apply text-white dark:text-foreground; -} - -.prism-code .token.function, -.prism-code .assign-left.variable { - @apply !text-premium dark:!text-secondary; -} - -code:not(.prism-code code) { - @apply bg-gray-100 dark:bg-gray-50 border-primary/20 border-solid border text-primary px-1 py-0.5 rounded-md font-semibold; -} diff --git a/crowdsec-docs/src/css/navbar.css b/crowdsec-docs/src/css/navbar.css new file mode 100644 index 000000000..8fc1200ee --- /dev/null +++ b/crowdsec-docs/src/css/navbar.css @@ -0,0 +1,119 @@ +.navbar { + @apply border-b border-border border-solid; +} + +.navbar__link { + --ifm-navbar-link-hover-color: rgb(var(--primary)); +} + +.navbar, +.navbar-sidebar { + @apply bg-card text-foreground border-border/80; + --ifm-navbar-link-color: rgb(var(--foreground)); + --ifm-menu-color: rgb(var(--foreground)); +} + +.navbar { + @apply border border-b border-solid; +} + +/** Patch some colors **/ +button[class*="toggleButton"]:hover { + @apply bg-transparent; +} + +svg[class*="toggleIcon"][class*="ToggleIcon"]:hover { + @apply !text-primary; +} + +.navbar__toggle svg, +.navbar-sidebar__back, +svg[class*="toggleIcon"][class*="lightToggleIcon"] { + @apply !text-foreground; +} + +html[data-theme="light"] .navbar-sidebar__item > .menu__list .menu__link--sublist-caret::after, +html[data-theme="light"] .navbar-sidebar__item > .menu__list .menu__caret::before { + --ifm-menu-link-sublist-icon-filter: none; + --ifm-menu-link-sublist-icon: url('data:image/svg+xml;utf8,'); +} + +.header-discord-link:before { + content: "Discord"; + padding-left: 1.5rem !important; + padding-right: 0 !important; + background: + no-repeat left / 22% + url("data:image/svg+xml,%3C%3Fxml%20version%3D%221.0%22%3F%3E%3Csvg%20fill%3D%22%23ffffff%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20%20viewBox%3D%220%200%2024%2024%22%20width%3D%2224px%22%20height%3D%2224px%22%3E%20%20%20%20%3Cpath%20d%3D%22M19.952%2C5.672c-1.904-1.531-4.916-1.79-5.044-1.801c-0.201-0.017-0.392%2C0.097-0.474%2C0.281%20c-0.006%2C0.012-0.072%2C0.163-0.145%2C0.398c1.259%2C0.212%2C2.806%2C0.64%2C4.206%2C1.509c0.224%2C0.139%2C0.293%2C0.434%2C0.154%2C0.659%20c-0.09%2C0.146-0.247%2C0.226-0.407%2C0.226c-0.086%2C0-0.173-0.023-0.252-0.072C15.584%2C5.38%2C12.578%2C5.305%2C12%2C5.305S8.415%2C5.38%2C6.011%2C6.872%20c-0.225%2C0.14-0.519%2C0.07-0.659-0.154c-0.14-0.225-0.07-0.519%2C0.154-0.659c1.4-0.868%2C2.946-1.297%2C4.206-1.509%20c-0.074-0.236-0.14-0.386-0.145-0.398C9.484%2C3.968%2C9.294%2C3.852%2C9.092%2C3.872c-0.127%2C0.01-3.139%2C0.269-5.069%2C1.822%20C3.015%2C6.625%2C1%2C12.073%2C1%2C16.783c0%2C0.083%2C0.022%2C0.165%2C0.063%2C0.237c1.391%2C2.443%2C5.185%2C3.083%2C6.05%2C3.111c0.005%2C0%2C0.01%2C0%2C0.015%2C0%20c0.153%2C0%2C0.297-0.073%2C0.387-0.197l0.875-1.202c-2.359-0.61-3.564-1.645-3.634-1.706c-0.198-0.175-0.217-0.477-0.042-0.675%20c0.175-0.198%2C0.476-0.217%2C0.674-0.043c0.029%2C0.026%2C2.248%2C1.909%2C6.612%2C1.909c4.372%2C0%2C6.591-1.891%2C6.613-1.91%20c0.198-0.172%2C0.5-0.154%2C0.674%2C0.045c0.174%2C0.198%2C0.155%2C0.499-0.042%2C0.673c-0.07%2C0.062-1.275%2C1.096-3.634%2C1.706l0.875%2C1.202%20c0.09%2C0.124%2C0.234%2C0.197%2C0.387%2C0.197c0.005%2C0%2C0.01%2C0%2C0.015%2C0c0.865-0.027%2C4.659-0.667%2C6.05-3.111%20C22.978%2C16.947%2C23%2C16.866%2C23%2C16.783C23%2C12.073%2C20.985%2C6.625%2C19.952%2C5.672z%20M8.891%2C14.87c-0.924%2C0-1.674-0.857-1.674-1.913%20s0.749-1.913%2C1.674-1.913s1.674%2C0.857%2C1.674%2C1.913S9.816%2C14.87%2C8.891%2C14.87z%20M15.109%2C14.87c-0.924%2C0-1.674-0.857-1.674-1.913%20s0.749-1.913%2C1.674-1.913c0.924%2C0%2C1.674%2C0.857%2C1.674%2C1.913S16.033%2C14.87%2C15.109%2C14.87z%22%2F%3E%3C%2Fsvg%3E"); +} + +.header-github-link:before { + content: "GitHub"; + padding-left: 1.5rem !important; + padding-right: 0 !important; + background: + no-repeat left / 22% + url("data:image/svg+xml,%3Csvg viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill='white' d='M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12'/%3E%3C/svg%3E"); +} + +.header-discourse-link:before { + content: "Forum"; + padding-left: 1.5rem !important; + padding-right: 0 !important; + background: + no-repeat left / 22% + url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20width%3D%2222%22%20height%3D%2222%22%20preserveAspectRatio%3D%22xMidYMid%20meet%22%20viewBox%3D%220%200%2024%2024%22%3E%3Cpath%20d%3D%22M12.077%203C7.149%203%203%206.96%203%2011.843V21l9.075-.01c4.928%200%208.925-4.11%208.925-8.993C21%207.113%2017%203%2012.077%203zm3.92%2012.859a5.568%205.568%200%200%201-6.102%201.043l-3.595.805l1.001-3.192a5.435%205.435%200%200%201%20.11-5.415a5.55%205.55%200%200%201%204.753-2.678v.001h.006a5.533%205.533%200%200%201%205.131%203.438a5.442%205.442%200%200%201-1.304%205.998z%22%20fill%3D%22white%22%2F%3E%3C%2Fsvg%3E"); +} + +.header-hub-link:before { + content: "Hub"; + padding-left: 1.7rem !important; + color: black; + background: + no-repeat left / 33% + url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 275.05 249.82' %3E%3Cstyle%3E%3C!%5BCDATA%5B.C%7Bletter-spacing:-0.04em%7D%5D%5D%3E%3C/style%3E%3Cpath d='M39.26 178.8a20.79 20.79 0 0 1-7 4.92 24 24 0 0 1-9.76 1.84 23.7 23.7 0 0 1-9.86-1.9 20.78 20.78 0 0 1-7-5 21.06 21.06 0 0 1-4.21-7.07A24 24 0 0 1 0 163.47a24.34 24.34 0 0 1 1.41-8.14 21 21 0 0 1 4.21-7.09 20.78 20.78 0 0 1 7-5 23.7 23.7 0 0 1 9.86-1.9 23.64 23.64 0 0 1 9.76 1.87 20.72 20.72 0 0 1 7 5l-5.1 4.24a14.52 14.52 0 0 0-4.92-3.57 16.37 16.37 0 0 0-6.88-1.35 14.84 14.84 0 0 0-14 8.25 17.57 17.57 0 0 0 0 15.33 14.85 14.85 0 0 0 14 8.24 16.65 16.65 0 0 0 6.79-1.29 14.39 14.39 0 0 0 4.87-3.44l5.09 4.24zm2.45-25.49h6.21v3.13a9.62 9.62 0 0 1 2.33-1.81 13.23 13.23 0 0 1 2.89-1.23 18.62 18.62 0 0 1 3.14-.65 16.42 16.42 0 0 1 3.13-.06v6a15.17 15.17 0 0 0-5.65.37 7.41 7.41 0 0 0-3.51 2.15 8.42 8.42 0 0 0-1.81 3.56 19.24 19.24 0 0 0-.52 4.67v15.06h-6.21zM75 185.19a16.52 16.52 0 0 1-9.15-2.39 15.31 15.31 0 0 1-5.5-6 17.42 17.42 0 0 1-1.84-7.8 16.7 16.7 0 0 1 1.81-7.8 15.59 15.59 0 0 1 5.5-6 16.39 16.39 0 0 1 9.18-2.4 16.42 16.42 0 0 1 9.19 2.4 15.67 15.67 0 0 1 5.5 6 16.7 16.7 0 0 1 1.81 7.8 17.55 17.55 0 0 1-1.84 7.8 15.39 15.39 0 0 1-5.5 6 16.53 16.53 0 0 1-9.16 2.39zm0-27.77a9.23 9.23 0 0 0-5.71 1.72 10.8 10.8 0 0 0-3.41 4.27 14.13 14.13 0 0 0 0 11.12 10.73 10.73 0 0 0 3.41 4.27 10.35 10.35 0 0 0 11.43 0 10.82 10.82 0 0 0 3.41-4.27 14.24 14.24 0 0 0 0-11.12 10.89 10.89 0 0 0-3.41-4.27 9.26 9.26 0 0 0-5.72-1.72zm49 19.48l6.51-23.53h7.31l-10.2 31.21h-7.31l-6.45-24-6.45 24h-7.31l-10.2-31.21h7.31l6.51 23.53 6.52-23.53h7.12zm39.79-35.33h6.27v43h-6.27v-4.43a12.91 12.91 0 0 1-4.7 3.81 15 15 0 0 1-11.61.56 15.41 15.41 0 0 1-9-8.3 19 19 0 0 1 0-14.5 15.38 15.38 0 0 1 9-8.29 15.09 15.09 0 0 1 11.63.55 12.86 12.86 0 0 1 4.71 3.81zm-10.23 15.85a9.82 9.82 0 0 0-4.5 1 9.61 9.61 0 0 0-3.22 2.62 11.21 11.21 0 0 0-1.93 3.71 14.37 14.37 0 0 0 0 8.48 11.36 11.36 0 0 0 1.93 3.72 9.7 9.7 0 0 0 3.22 2.61 10.82 10.82 0 0 0 9 0 9.7 9.7 0 0 0 3.22-2.61 11.36 11.36 0 0 0 1.93-3.72 14.36 14.36 0 0 0 0-8.48 11.21 11.21 0 0 0-1.93-3.71 9.61 9.61 0 0 0-3.22-2.62 9.85 9.85 0 0 0-4.5-1zm37.26-16.09a28.52 28.52 0 0 1 9.22 1.56 33 33 0 0 1 7.68 3.9l-3.44 3.94-.74.86a21.17 21.17 0 0 0-7-3.78 18.59 18.59 0 0 0-6.45-.83 13 13 0 0 0-5.19 1.32 7.92 7.92 0 0 0-3.19 2.7 3.84 3.84 0 0 0-.49 3.26 5.56 5.56 0 0 0 2.88 3 30.3 30.3 0 0 0 6.05 2.49q3.42 1 6.73 2.21a32.23 32.23 0 0 1 6 2.89 10.15 10.15 0 0 1 4 4.51 11.41 11.41 0 0 1 1 3.84 10.55 10.55 0 0 1-.58 4.21 8.33 8.33 0 0 1-1.48 2.67 11.45 11.45 0 0 1-2.27 2.12 17.44 17.44 0 0 1-5.84 2.58 28.66 28.66 0 0 1-6.2.86 33.14 33.14 0 0 1-5.32-.4 24.81 24.81 0 0 1-4.76-1.23 25.47 25.47 0 0 1-4.48-2.15 31.86 31.86 0 0 1-4.49-3.28l3.38-3.87.86-1a24.25 24.25 0 0 0 7.56 4.77 23.32 23.32 0 0 0 8.41 1.32 10.3 10.3 0 0 0 4.64-1.08 8.57 8.57 0 0 0 3.29-2.64 4.07 4.07 0 0 0 .71-3.35c-.27-1.19-1.26-2.29-3-3.32a22.84 22.84 0 0 0-4.27-1.87l-5.16-1.66-5.29-1.81a23.21 23.21 0 0 1-4.67-2.37 11.79 11.79 0 0 1-3.31-3.25 7.6 7.6 0 0 1-1.2-4.52 10.62 10.62 0 0 1 1.5-5.47 13.24 13.24 0 0 1 3.75-3.93 17.11 17.11 0 0 1 5.19-2.39 21.53 21.53 0 0 1 5.84-.8zm35.88 39.13a9.5 9.5 0 0 0 5.13-1.32 9.93 9.93 0 0 0 3.35-3.41l4.54 3.5a14.91 14.91 0 0 1-5.28 4.27 17.06 17.06 0 0 1-7.74 1.63 18 18 0 0 1-6.64-1.14 15.19 15.19 0 0 1-4.94-3.07 14.82 14.82 0 0 1-3.26-4.45 17.51 17.51 0 0 1 0-15.12 14.82 14.82 0 0 1 3.26-4.45 15.36 15.36 0 0 1 4.94-3.07 19.88 19.88 0 0 1 13.27 0 15.3 15.3 0 0 1 4.95 3.07 14.82 14.82 0 0 1 3.26 4.45 17.53 17.53 0 0 1 1.56 9.9h-26.41a13.65 13.65 0 0 0 1.07 3.5 10.56 10.56 0 0 0 2 2.95 9 9 0 0 0 3 2 10.16 10.16 0 0 0 4 .74zm10.14-13.88a14 14 0 0 0-1.08-3.51 10.51 10.51 0 0 0-2-2.94 8.89 8.89 0 0 0-3-2 11 11 0 0 0-7.92 0 8.89 8.89 0 0 0-3 2 10.51 10.51 0 0 0-2 2.94 13.6 13.6 0 0 0-1.07 3.51h20.15zm32.93 16.89a17.1 17.1 0 0 1-7.87 1.66 16.44 16.44 0 0 1-9.15-2.4 15.22 15.22 0 0 1-5.5-6 17.42 17.42 0 0 1-1.84-7.8 16.67 16.67 0 0 1 1.81-7.8 15.52 15.52 0 0 1 5.5-6 16.39 16.39 0 0 1 9.18-2.4 17.1 17.1 0 0 1 7.87 1.66 15 15 0 0 1 5.28 4.36l-4.55 3.57a10.1 10.1 0 0 0-3.37-3.54 9.51 9.51 0 0 0-5.23-1.38 9.16 9.16 0 0 0-5.71 1.72 10.8 10.8 0 0 0-3.41 4.27 14.13 14.13 0 0 0 0 11.12 10.8 10.8 0 0 0 3.41 4.27 9.16 9.16 0 0 0 5.71 1.72 9.51 9.51 0 0 0 5.23-1.38 10.15 10.15 0 0 0 3.37-3.53l4.55 3.56a14.91 14.91 0 0 1-5.28 4.32z' fill='black'/%3E%3Cpath d='M110 117.18l-.72 6.65h.06l.66-6.65z' fill='black' /%3E%3Ctext class='C' transform='translate(83.51 237.44)' fill='black' font-size='61' font-family='BellinzoRegularRegular,Bellinzo Regular'%3EHub%3C/text%3E%3Cg fill='black' %3E%3Cpath d='M102.63 63.66a20.63 20.63 0 0 1 1.69 3.48h0a27.11 27.11 0 0 0-2.14-5.92c-1.56-3-3.86-2.86-5.3 0a29.14 29.14 0 0 0-2.14 6 23.85 23.85 0 0 1 1.68-3.55c1.69-2.87 4.39-2.99 6.21-.01zm73.63 0a21.42 21.42 0 0 1 1.74 3.48h0a26.6 26.6 0 0 0-2.14-5.92c-1.55-3-3.85-2.86-5.29 0a29.14 29.14 0 0 0-2.14 6 23.85 23.85 0 0 1 1.68-3.55c1.63-2.87 4.33-2.99 6.15-.01zM140 46.06a27.85 27.85 0 0 1 2.37 5.32 34.92 34.92 0 0 0-2.77-7.78c-1.94-3.72-4.81-3.57-6.61 0a37.88 37.88 0 0 0-2.77 7.9 30.88 30.88 0 0 1 2.36-5.44c1.99-3.57 5.22-3.72 7.42 0zM95 67.82a5.51 5.51 0 0 0 3.59 4.59l.13 4 .46 4.78c.19 1.13.48 1.08.66 0 .25-1.52.32-3.15.46-4.78a39 39 0 0 0 .12-4 5.5 5.5 0 0 0 3.6-4.59 9.08 9.08 0 0 1-9 0z'/%3E%3Cpath d='M168.63 67.82a5.5 5.5 0 0 0 3.6 4.59 39 39 0 0 0 .12 4l.46 4.78c.2 1.13.48 1.08.66 0 .25-1.52.32-3.15.46-4.78l.13-4a5.51 5.51 0 0 0 3.59-4.59 9.08 9.08 0 0 1-9 0zM188 75.94c1 4.27 2.23 13.48 3.5 24.14C190.43 90 189.28 81 188 75.94zm-46.18-24.07a11.36 11.36 0 0 1-11.25 0c.52 2.88 2.27 5.13 4.49 5.71l.15 5.05.58 6c.24 1.41.59 1.35.82 0 .31-1.9.4-3.93.57-6 .14-1.66.18-3.35.16-5.05 2.21-.58 3.97-2.83 4.48-5.71zM98.54 72.41l.13 4 .46 4.78c.19 1.13.48 1.08.66 0 .25-1.52.32-3.15.46-4.78a39 39 0 0 0 .12-4 5.5 5.5 0 0 0 3.6-4.59 9.08 9.08 0 0 1-9 0 5.51 5.51 0 0 0 3.57 4.59zm60.6 19.68c-1.59-13.3-3.15-24.78-4.37-30.1a7.1 7.1 0 0 0 6.87-5.84h0a8.19 8.19 0 0 0 .12-1.11h.2a4.47 4.47 0 0 0 2.74-8.18 7.1 7.1 0 0 0-1.8-13.51 4.47 4.47 0 0 0-3.43-7.22 7.17 7.17 0 0 0 2.87-2.52c1.67-2.61 1.94-14.4-4-22-2.44-3.12-4.83-1.24-5 .89-.47 6.52-.52 11.42-2.22 17a4.46 4.46 0 0 0-7.92-2.05 7.1 7.1 0 0 0-14 0 4.47 4.47 0 0 0-7.94 2c-1.69-5.59-1.75-10.49-2.22-17-.15-2.13-2.54-4-5-.89-5.93 7.58-5.66 19.37-4 22a7.17 7.17 0 0 0 2.87 2.52 4.48 4.48 0 0 0-3.43 7.22 7.1 7.1 0 0 0-1.79 13.51 4.47 4.47 0 0 0 2.73 8.18h.21a6.36 6.36 0 0 0 .11 1.07h0a7.1 7.1 0 0 0 7 5.89h0c-2 8.51-5 32.87-7.43 55.17l-.66 6.65a842.28 842.28 0 0 1 26.64-.42c9 0 17.83.14 26.22.41l-.67-6.27-2.7-25.4zm-14.58-40a5.88 5.88 0 0 1-2.39-1.17c.7 2.78 1.21 5.61 1.93 8.44a45.15 45.15 0 0 1 1.22 7.43c.31 3.86-2.22 7.19-5.39 7.19h-7.47c-3.17 0-5.7-3.33-5.39-7.19a46.23 46.23 0 0 1 1.22-7.43c.66-2.61 1.17-5.23 1.81-7.8a8.31 8.31 0 0 1-3.84 1 44.4 44.4 0 0 1-6.91-.45 4.78 4.78 0 0 1-4-3.37c-.59-1.69-1-3.45-1.59-5.14a14.16 14.16 0 0 0-1.21-2.09 2.41 2.41 0 0 1-.42-.89v-3.86a38.54 38.54 0 0 1 12.17-1.54 27 27 0 0 1 8.8 1.61 10.09 10.09 0 0 0 7.18 0 30 30 0 0 1 13.6-1.44c2.45.22 4.87.76 7.35 1.16v4.08c0 .29-.13.74-.33.82-1 .45-1.11 1.36-1.35 2.25a84.99 84.99 0 0 1-1.41 4.71 5.44 5.44 0 0 1-4.38 3.79 20.06 20.06 0 0 1-9.2-.1zm-29.92 15.64a5.53 5.53 0 0 1-1.13.36 16.1 16.1 0 0 1-7.34-.08 4.61 4.61 0 0 1-1.92-.94l1.55 6.77a36.86 36.86 0 0 1 1 6c.24 3.1-1.78 5.77-4.33 5.77h-6c-2.55 0-4.58-2.67-4.33-5.77a36.86 36.86 0 0 1 1-6l1.45-6.26a6.48 6.48 0 0 1-3.08.79A34.29 34.29 0 0 1 86 68a3.85 3.85 0 0 1-3.22-2.71l-1.28-4.12a10.81 10.81 0 0 0-1-1.67 1.73 1.73 0 0 1-.33-.72v-3.09a30.28 30.28 0 0 1 9.75-1.23 21.25 21.25 0 0 1 7.06 1.29 8.11 8.11 0 0 0 5.76 0 19.87 19.87 0 0 1 2.74-.81 6.47 6.47 0 0 1-.79-7.68 9.11 9.11 0 0 1-2.18-11 5.59 5.59 0 0 0-3-.86 5.7 5.7 0 0 0-5.64 4.88 3.58 3.58 0 0 0-6.37 1.62c-1.35-4.48-1.4-8.41-1.77-13.64-.12-1.7-2-3.21-4-.71-4.75 6.08-4.54 15.53-3.2 17.63a5.86 5.86 0 0 0 2.3 2A3.58 3.58 0 0 0 78 53a5.69 5.69 0 0 0-1.4 10.82 3.59 3.59 0 0 0 2.19 6.56h.17a6 6 0 0 0 .09.86h0A5.69 5.69 0 0 0 84.66 76h0c-1.58 6.82-4 26.36-6 44.24l-.53 5.38c9-.74 18.89-1.31 29.48-1.68l.69-6.94 2.87-24.67 3.47-24.6z'/%3E%3Cpath d='M199.39 58.62a5.7 5.7 0 0 0-4.83-5.62 3.58 3.58 0 0 0-2.75-5.79 5.86 5.86 0 0 0 2.3-2c1.34-2.1 1.55-11.55-3.2-17.63-2-2.5-3.87-1-4 .71-.37 5.23-.41 9.16-1.77 13.64a3.59 3.59 0 0 0-6.36-1.64 5.69 5.69 0 0 0-8.78-3.92 9.1 9.1 0 0 1-2.23 10.9 6.44 6.44 0 0 1-.66 7.54 21.08 21.08 0 0 1 3.54 1 8.11 8.11 0 0 0 5.76 0 24.1 24.1 0 0 1 10.91-1.15c2 .17 3.91.6 5.9.93v3.27c0 .23-.11.59-.26.66-.82.36-.9 1.09-1.09 1.8a63 63 0 0 1-1.13 3.78 4.35 4.35 0 0 1-3.51 3 16.1 16.1 0 0 1-7.34-.08 4.67 4.67 0 0 1-1.92-.94c.56 2.23 1 4.5 1.55 6.77a36.86 36.86 0 0 1 1 6c.25 3.1-1.78 5.77-4.33 5.77h-6c-2.55 0-4.57-2.67-4.33-5.77a36.86 36.86 0 0 1 1-6c.53-2.09.94-4.19 1.45-6.26a6.48 6.48 0 0 1-3.08.79 34.29 34.29 0 0 1-5.54-.35 3.78 3.78 0 0 1-1.84-.74c1.52 9.16 3.53 25.4 6.18 50.05l.29 2.62q.19 1.9.42 3.93c10.62.37 20.57.94 29.58 1.68l-.55-5.07-2.17-20.41c-1.33-10.67-2.6-19.88-3.6-24.15a5.7 5.7 0 0 0 5.51-4.68h0a6.69 6.69 0 0 0 .09-.9h.17a3.59 3.59 0 0 0 2.23-6.54 5.69 5.69 0 0 0 3.39-5.2zm-36.87 65.19h.15q-.33-3.09-.67-6.27l-2.86-25.45 2.71 25.45.67 6.27z'/%3E%3Cpath d='M154.77 62c1.22 5.32 2.78 16.8 4.37 30.1-1.39-12.56-2.82-23.86-4.37-30.1zm-44.45 55.17l-.72 6.65h.06l.66-6.65z'/%3E%3C/g%3E%3C/svg%3E"); +} + +/* On wide screens (desktop), remove text content for icon-only display */ +@media (min-width: 1401px) { + .header-discord-link:before, + .header-github-link:before, + .header-discourse-link:before { + content: ""; + padding-left: 0.7rem; + padding-right: 0.8rem; + background-position: center; + background-size: 80%; + } +} + +.header-console-link:before { + content: "Console"; + padding-left: 1.5rem !important; + padding-right: 0 !important; + background: + no-repeat left / 22% + url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20width%3D%2222%22%20height%3D%2222%22%20preserveAspectRatio%3D%22xMidYMid%20meet%22%20viewBox%3D%220%200%2032%2032%22%3E%3Cpath%20d%3D%22M4%2020v2h4.586L2%2028.586L3.414%2030L10%2023.414V28h2v-8H4z%22%20fill%3D%22white%22%2F%3E%3Cpath%20d%3D%22M24%2021h2v5h-2z%22%20fill%3D%22white%22%2F%3E%3Cpath%20d%3D%22M20%2016h2v10h-2z%22%20fill%3D%22white%22%2F%3E%3Cpath%20d%3D%22M16%2018h2v8h-2z%22%20fill%3D%22white%22%2F%3E%3Cpath%20d%3D%22M28%202H4a2.002%202.002%200%200%200-2%202v12h2v-3h24.001l.001%2015H16v2h12a2.003%202.003%200%200%200%202-2V4a2.002%202.002%200%200%200-2-2zm-16%209H4V4h8zm2%200V4h14v7z%22%20fill%3D%22white%22%2F%3E%3C%2Fsvg%3E"); +} + +.navbar__items--right .navbar__link:hover { + @apply opacity-60; +} + +.navbar { + @apply whitespace-nowrap; +} + +.navbar__items--right .navbar__link:before { + @apply px-3 h-6; +} + +.navbar__items--right .navbar__link { + @apply pl-4 pr-0; +} + +@media (max-width: 1400px) { + .navbar__items--right .navbar__link { + display: none; + } +} diff --git a/crowdsec-docs/unversioned/getting_started/health_check.mdx b/crowdsec-docs/unversioned/getting_started/health_check.mdx index 233614b02..6bf9c3cb5 100644 --- a/crowdsec-docs/unversioned/getting_started/health_check.mdx +++ b/crowdsec-docs/unversioned/getting_started/health_check.mdx @@ -121,15 +121,15 @@ Were all the tests related to your setup successful? 🚨 If this check fails, don’t worry -- the results will point you to the right area to troubleshoot: -
    - 🐞 If this command fails entirely, go to the [**CrowdSec Service Troubleshooting section**](#troubleshooting_service) -
    -
    - 🐞 If your acquisition sources don't appear, check the [**Acquisition Troubleshooting section**](#troubleshooting_acquisition) -
    -
    + :::warning + 🐞 If this command fails entirely, go to the [**CrowdSec Service Troubleshooting section**](#troubleshooting_service) + ::: + :::warning + 🐞 If your acquisition sources don't appear, check the [**Acquisition Troubleshooting section**](#troubleshooting_acquisition) + ::: + :::warning 🐞 If parsing fails, check the [**Collection Troubleshooting section****](#troubleshooting_collection) -
    + ::: From 1a637c168aee5685486912aa83239c1a96ec2026 Mon Sep 17 00:00:00 2001 From: Roussange Alexandre Date: Tue, 8 Jul 2025 16:55:39 +0200 Subject: [PATCH 9/9] feat: :lipstick: update premium badges and sidebar chevrons --- crowdsec-docs/sidebarsUnversioned.ts | 70 ++++-- .../components/remediation-support-badge.tsx | 26 +- crowdsec-docs/src/css/colors.css | 13 + .../theme/DocSidebarItem/Category/index.tsx | 230 ++++++++++++++++++ .../src/theme/DocSidebarItem/Link/index.tsx | 56 +++++ crowdsec-docs/src/theme/Root.tsx | 5 +- crowdsec-docs/src/ui/badge.tsx | 30 +++ crowdsec-docs/src/ui/hybridtooltip.tsx | 4 +- ...ckground_noise.md => background_noise.mdx} | 13 +- .../unversioned/console/allowlists.mdx | 11 +- ...decisions_intro.md => decisions_intro.mdx} | 15 +- ...management.md => decisions_management.mdx} | 25 +- .../enterprise_plan/enterprise_invoices.mdx | 12 +- .../enterprise_plan/enterprise_support.mdx | 6 +- .../notification_integrations/overview.mdx | 9 +- .../notification_integrations/rule.mdx | 6 +- ..._under_attack.md => am_i_under_attack.mdx} | 6 +- .../security_engines/troubleshooting.md | 10 +- ...threat_forecast.md => threat_forecast.mdx} | 12 +- .../service_api/getting_started.mdx | 8 +- 20 files changed, 489 insertions(+), 78 deletions(-) create mode 100644 crowdsec-docs/src/theme/DocSidebarItem/Category/index.tsx create mode 100644 crowdsec-docs/src/theme/DocSidebarItem/Link/index.tsx create mode 100644 crowdsec-docs/src/ui/badge.tsx rename crowdsec-docs/unversioned/console/alerts/{background_noise.md => background_noise.mdx} (77%) rename crowdsec-docs/unversioned/console/decisions/{decisions_intro.md => decisions_intro.mdx} (69%) rename crowdsec-docs/unversioned/console/decisions/{decisions_management.md => decisions_management.mdx} (81%) rename crowdsec-docs/unversioned/console/security_engines/{am_i_under_attack.md => am_i_under_attack.mdx} (96%) rename crowdsec-docs/unversioned/console/{threat_forecast.md => threat_forecast.mdx} (85%) diff --git a/crowdsec-docs/sidebarsUnversioned.ts b/crowdsec-docs/sidebarsUnversioned.ts index 1f30cc6de..cca567e2c 100644 --- a/crowdsec-docs/sidebarsUnversioned.ts +++ b/crowdsec-docs/sidebarsUnversioned.ts @@ -120,13 +120,16 @@ const sidebarsUnversionedConfig: SidebarConfig = { }, { type: "doc", - label: "Troubleshooting Hints πŸ…", + label: "Troubleshooting Hints", id: "console/security_engines/troubleshooting", }, { type: "doc", - label: "Am I Under Attack πŸ…", + label: "Am I Under Attack", id: "console/security_engines/am_i_under_attack", + customProps: { + tag: "premium", + }, }, { type: "doc", @@ -175,8 +178,11 @@ const sidebarsUnversionedConfig: SidebarConfig = { }, { type: "doc", - label: "Background Noise πŸ…", + label: "Background Noise", id: "console/alerts/background_noise", + customProps: { + tag: "premium", + }, }, { type: "doc", @@ -232,62 +238,84 @@ const sidebarsUnversionedConfig: SidebarConfig = { { type: "doc", id: "console/decisions/decisions_management", - label: "Decisions Management πŸ…", + label: "Management", + customProps: { + tag: "premium", + }, }, ], }, { - type: "category", - label: "Centralized Allowlists πŸ…", - link: { - type: "doc", - id: "console/allowlists", + id: "console/allowlists", + type: "doc", + label: "Centralized Allowlists", + customProps: { + tag: "premium", }, - items: [], }, { type: "category", - label: "Enterprise plan πŸ…", + label: "Enterprise plan", + customProps: { + tag: "premium", + }, items: [ { type: "doc", - label: "Enterprise support πŸ…", + label: "Enterprise support", id: "console/enterprise_plan/enterprise_support", + customProps: { + tag: "premium", + }, }, { type: "doc", - label: "Invoices πŸ…", + label: "Invoices", id: "console/enterprise_plan/enterprise_invoices", + customProps: { + tag: "premium", + }, }, ], }, { - type: "category", - label: "Threat Forecast πŸ…", - link: { - type: "doc", - id: "console/threat_forecast", + id: "console/threat_forecast", + type: "doc", + label: "Threat Forecast", + customProps: { + tag: "premium", }, - items: [], }, { type: "link", - label: "Service API πŸ…", + label: "Service API", href: "/u/service_api/getting_started", + customProps: { + tag: "premium", + }, }, { type: "category", - label: "Notification integrations πŸ…", + label: "Notification integrations", + customProps: { + tag: "premium", + }, items: [ { type: "doc", label: "Overview", id: "console/notification_integrations/overview", + customProps: { + tag: "premium", + }, }, { type: "doc", label: "Notification Rule", id: "console/notification_integrations/rule", + customProps: { + tag: "premium", + }, }, { type: "doc", diff --git a/crowdsec-docs/src/components/remediation-support-badge.tsx b/crowdsec-docs/src/components/remediation-support-badge.tsx index 434041fbf..c83d10329 100644 --- a/crowdsec-docs/src/components/remediation-support-badge.tsx +++ b/crowdsec-docs/src/components/remediation-support-badge.tsx @@ -14,20 +14,18 @@ const RemediationSupportBadge = ({ title, description, support }: { title: strin //ugly, for test const colorClass = support === "Unsupported" ? "bg-red-400" : "bg-green-400"; return ( - - - -
    - {title} - {support} -
    -
    - -

    {description}

    - -
    -
    -
    + + +
    + {title} + {support} +
    +
    + +

    {description}

    + +
    +
    ); }; diff --git a/crowdsec-docs/src/css/colors.css b/crowdsec-docs/src/css/colors.css index d492de108..1b627880f 100644 --- a/crowdsec-docs/src/css/colors.css +++ b/crowdsec-docs/src/css/colors.css @@ -184,3 +184,16 @@ html[data-theme="dark"], /* Algolia global search colors */ --docsearch-searchbox-background: rgb(var(--input)); } + +.platinum-tag-gradient { + background: rgba(213 176 80 / 100%); + /* biome-ignore lint/suspicious/noDuplicateProperties: This is intentional */ + background: linear-gradient( + 90deg, + rgba(213 176 80 / 100%) 0%, + rgba(203 161 53 / 100%) 25%, + rgba(255 222 138 / 100%) 50%, + rgba(203 161 53 / 100%) 75%, + rgba(213 176 80 / 100%) 100% + ); +} diff --git a/crowdsec-docs/src/theme/DocSidebarItem/Category/index.tsx b/crowdsec-docs/src/theme/DocSidebarItem/Category/index.tsx new file mode 100644 index 000000000..5ad37769c --- /dev/null +++ b/crowdsec-docs/src/theme/DocSidebarItem/Category/index.tsx @@ -0,0 +1,230 @@ +import Link from "@docusaurus/Link"; +import { findFirstSidebarItemLink, isActiveSidebarItem, useDocSidebarItemsExpandedState } from "@docusaurus/plugin-content-docs/client"; +import { translate } from "@docusaurus/Translate"; +import { Collapsible, ThemeClassNames, useCollapsible, usePrevious, useThemeConfig } from "@docusaurus/theme-common"; +import { isSamePath } from "@docusaurus/theme-common/internal"; +import useIsBrowser from "@docusaurus/useIsBrowser"; +import { Badge } from "@site/src/ui/badge"; +import { Tooltip } from "@site/src/ui/tooltip"; +import type { Props } from "@theme/DocSidebarItem/Category"; +import DocSidebarItems from "@theme/DocSidebarItems"; +import clsx from "clsx"; +import { ChevronRight } from "lucide-react"; +import React, { type ComponentProps, useEffect, useMemo } from "react"; + +// If we navigate to a category and it becomes active, it should automatically +// expand itself +function useAutoExpandActiveCategory({ + isActive, + collapsed, + updateCollapsed, +}: { + isActive: boolean; + collapsed: boolean; + updateCollapsed: (b: boolean) => void; +}) { + const wasActive = usePrevious(isActive); + useEffect(() => { + const justBecameActive = isActive && !wasActive; + if (justBecameActive && collapsed) { + updateCollapsed(false); + } + }, [isActive, wasActive, collapsed, updateCollapsed]); +} + +/** + * When a collapsible category has no link, we still link it to its first child + * during SSR as a temporary fallback. This allows to be able to navigate inside + * the category even when JS fails to load, is delayed or simply disabled + * React hydration becomes an optional progressive enhancement + * see https://github.com/facebookincubator/infima/issues/36#issuecomment-772543188 + * see https://github.com/facebook/docusaurus/issues/3030 + */ +function useCategoryHrefWithSSRFallback(item: Props["item"]): string | undefined { + const isBrowser = useIsBrowser(); + return useMemo(() => { + if (item.href && !item.linkUnlisted) { + return item.href; + } + // In these cases, it's not necessary to render a fallback + // We skip the "findFirstCategoryLink" computation + if (isBrowser || !item.collapsible) { + return undefined; + } + return findFirstSidebarItemLink(item); + }, [item, isBrowser]); +} + +function CollapseButton({ + collapsed, + categoryLabel, + onClick, +}: Readonly<{ + collapsed: boolean; + categoryLabel: string; + onClick: ComponentProps<"button">["onClick"]; +}>) { + return ( + + ); +} + +export default function DocSidebarItemCategory({ + item, + onItemClick, + activePath, + level, + index, + ...props +}: Readonly): React.JSX.Element { + const { items, label, collapsible, className, href, customProps } = item; + const { + docs: { + sidebar: { autoCollapseCategories }, + }, + } = useThemeConfig(); + const tag = customProps?.tag; + const isPremium = tag === "premium"; + const hrefWithSSRFallback = useCategoryHrefWithSSRFallback(item); + + const isActive = isActiveSidebarItem(item, activePath); + const isCurrentPage = isSamePath(href, activePath); + + const { collapsed, setCollapsed } = useCollapsible({ + // Active categories are always initialized as expanded. The default + // (`item.collapsed`) is only used for non-active categories. + initialState: () => { + if (!collapsible) { + return false; + } + return isActive ? false : item.collapsed; + }, + }); + + const { expandedItem, setExpandedItem } = useDocSidebarItemsExpandedState(); + // Use this instead of `setCollapsed`, because it is also reactive + const updateCollapsed = (toCollapsed: boolean = !collapsed) => { + setExpandedItem(toCollapsed ? null : index); + setCollapsed(toCollapsed); + }; + useAutoExpandActiveCategory({ isActive, collapsed, updateCollapsed }); + useEffect(() => { + if (collapsible && expandedItem != null && expandedItem !== index && autoCollapseCategories) { + setCollapsed(true); + } + }, [collapsible, expandedItem, index, setCollapsed, autoCollapseCategories]); + + return ( +
  • +
    + { + onItemClick?.(item); + if (href) { + // When already on the category's page, we collapse it + // We don't use "isActive" because it would collapse the + // category even when we browse a children element + // See https://github.com/facebook/docusaurus/issues/11213 + if (isCurrentPage) { + e.preventDefault(); + updateCollapsed(); + } else { + // When navigating to a new category, we always expand + // see https://github.com/facebook/docusaurus/issues/10854#issuecomment-2609616182 + updateCollapsed(false); + } + } else { + e.preventDefault(); + updateCollapsed(); + } + } + : () => { + onItemClick?.(item); + } + } + aria-current={isCurrentPage ? "page" : undefined} + role={collapsible && !href ? "button" : undefined} + aria-expanded={collapsible && !href ? !collapsed : undefined} + href={collapsible ? (hrefWithSSRFallback ?? "#") : hrefWithSSRFallback} + {...props} + > + {label} + {!collapsible && isPremium && ( + + + Premium + + + )} + + + {collapsible && ( + { + e.preventDefault(); + updateCollapsed(); + }} + /> + )} +
    + + + + +
  • + ); +} diff --git a/crowdsec-docs/src/theme/DocSidebarItem/Link/index.tsx b/crowdsec-docs/src/theme/DocSidebarItem/Link/index.tsx new file mode 100644 index 000000000..58b9ded8a --- /dev/null +++ b/crowdsec-docs/src/theme/DocSidebarItem/Link/index.tsx @@ -0,0 +1,56 @@ +import isInternalUrl from "@docusaurus/isInternalUrl"; +import Link from "@docusaurus/Link"; +import { isActiveSidebarItem } from "@docusaurus/plugin-content-docs/client"; +import { ThemeClassNames } from "@docusaurus/theme-common"; +import { Badge } from "@site/src/ui/badge"; +import type { Props } from "@theme/DocSidebarItem/Link"; +import IconExternalLink from "@theme/Icon/ExternalLink"; +import clsx from "clsx"; +import React from "react"; + +export default function DocSidebarItemLink({ item, onItemClick, activePath, level, index, ...props }: Readonly): React.JSX.Element { + const { href, label, className, autoAddBaseUrl, customProps } = item; + const isActive = isActiveSidebarItem(item, activePath); + const isInternalLink = isInternalUrl(href); + const tag = customProps?.tag; + + console.log(label, tag); + + return ( +
  • + onItemClick(item) : undefined, + })} + {...props} + > + {label} + {tag === "premium" && ( + + Premium + + )} + {!isInternalLink && } + +
  • + ); +} diff --git a/crowdsec-docs/src/theme/Root.tsx b/crowdsec-docs/src/theme/Root.tsx index 79d66bbf3..0be88125c 100644 --- a/crowdsec-docs/src/theme/Root.tsx +++ b/crowdsec-docs/src/theme/Root.tsx @@ -1,13 +1,14 @@ import { useStorageSlot } from "@docusaurus/theme-common"; import React from "react"; import CookieConsent from "../../plugins/gtag/theme/cookieconsent"; +import { TooltipProvider } from "../ui/tooltip"; export default function Root({ children }): React.JSX.Element { const [value, _] = useStorageSlot("docusaurus.cookieConsent"); return ( - <> + {children} {value === null && } - + ); } diff --git a/crowdsec-docs/src/ui/badge.tsx b/crowdsec-docs/src/ui/badge.tsx new file mode 100644 index 000000000..b230af09b --- /dev/null +++ b/crowdsec-docs/src/ui/badge.tsx @@ -0,0 +1,30 @@ +import { cn } from "@site/src/utils/index"; +import { cva, type VariantProps } from "class-variance-authority"; +import * as React from "react"; + +const badgeVariants = cva( + "inline-flex items-center rounded-full border px-2.5 py-0.5 text-xs font-semibold transition-colors " + + "focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-xs", + { + variants: { + variant: { + default: "border-transparent bg-primary text-primary-foreground hover:bg-primary/80", + secondary: "border-transparent bg-secondary text-secondary-foreground hover:bg-secondary/80", + destructive: "border-transparent bg-destructive text-destructive-foreground hover:bg-destructive/80", + outline: "text-foreground", + premium: "platinum-tag-gradient !text-black", + }, + }, + defaultVariants: { + variant: "default", + }, + } +); + +export interface BadgeProps extends React.HTMLAttributes, VariantProps {} + +function Badge({ className, variant, ...props }: BadgeProps) { + return
    ; +} + +export { Badge, badgeVariants }; diff --git a/crowdsec-docs/src/ui/hybridtooltip.tsx b/crowdsec-docs/src/ui/hybridtooltip.tsx index 642a0592c..6ce93ec6f 100644 --- a/crowdsec-docs/src/ui/hybridtooltip.tsx +++ b/crowdsec-docs/src/ui/hybridtooltip.tsx @@ -11,10 +11,10 @@ const TouchContext = createContext(undefined); const useTouch = () => useContext(TouchContext); export const TouchProvider = (props: PropsWithChildren): React.JSX.Element => { - const [isTouch, setTouch] = useState(); + const [isTouch, setIsTouch] = useState(); useEffect(() => { - setTouch(window.matchMedia("(pointer: coarse)").matches); + setIsTouch(window.matchMedia("(pointer: coarse)").matches); }, []); // Conditionally provide the appropriate provider diff --git a/crowdsec-docs/unversioned/console/alerts/background_noise.md b/crowdsec-docs/unversioned/console/alerts/background_noise.mdx similarity index 77% rename from crowdsec-docs/unversioned/console/alerts/background_noise.md rename to crowdsec-docs/unversioned/console/alerts/background_noise.mdx index e71bcbb0c..8e37f7c54 100644 --- a/crowdsec-docs/unversioned/console/alerts/background_noise.md +++ b/crowdsec-docs/unversioned/console/alerts/background_noise.mdx @@ -3,9 +3,14 @@ title: Background Noise Filtering πŸ… description: Focus on alerts that matter. --- -The back noise filter is designed to eliminate irrelevant background sounds, enabling users to concentrate on important alerts. +import { Badge } from "@site/src/ui/badge"; + +
    + CrowdSec Premium Feature +
    -> πŸ… Premium feature + +The back noise filter is designed to eliminate irrelevant background sounds, enabling users to concentrate on important alerts. ### Introduction @@ -23,8 +28,8 @@ This targeted approach ensures you're not overwhelmed by the volume of informati The ability to fine-tune your alert system’s sensitivity to background noise is a game-changer in cybersecurity monitoring. Our customizable noise filter settings give you control over what you deem relevant. -- **Low Cancellation**: Setting the filter to a lower sensitivity allows all alerts, including the most widespread, to be visible. This setting ensures you miss nothing, providing a broad security net. -- **High Cancellation**: Increasing the filter’s sensitivity sharpens your focus on alerts from IPs directly targeting your network. This refined approach is critical for those who wish to concentrate on direct threats, significantly reducing the volume of alerts to those with the highest relevance. +- **Low Cancellation**: Setting the filter to a lower sensitivity allows all alerts, including the most widespread, to be visible. This setting ensures you miss nothing, providing a broad security net. +- **High Cancellation**: Increasing the filter’s sensitivity sharpens your focus on alerts from IPs directly targeting your network. This refined approach is critical for those who wish to concentrate on direct threats, significantly reducing the volume of alerts to those with the highest relevance. ![Background Noise Filtering](/img/console/alerts/background-noise-finetune.png) diff --git a/crowdsec-docs/unversioned/console/allowlists.mdx b/crowdsec-docs/unversioned/console/allowlists.mdx index 5808a4099..46f64da64 100644 --- a/crowdsec-docs/unversioned/console/allowlists.mdx +++ b/crowdsec-docs/unversioned/console/allowlists.mdx @@ -1,6 +1,13 @@ -# Centralized allowlists +--- +id: allowlists +title: Centralized Allowlists +--- -> 🌟 Premium feature +import { Badge } from "@site/src/ui/badge"; + +
    + CrowdSec Premium Feature +
    Centralized allowlists is a powerful feature that allows you to manage allowlists across all your security engines and integrations from a single location. For free, you can still use [allowlist](next/local_api/centralized_allowlists) locally. diff --git a/crowdsec-docs/unversioned/console/decisions/decisions_intro.md b/crowdsec-docs/unversioned/console/decisions/decisions_intro.mdx similarity index 69% rename from crowdsec-docs/unversioned/console/decisions/decisions_intro.md rename to crowdsec-docs/unversioned/console/decisions/decisions_intro.mdx index 7ace6c125..5784d4173 100644 --- a/crowdsec-docs/unversioned/console/decisions/decisions_intro.md +++ b/crowdsec-docs/unversioned/console/decisions/decisions_intro.mdx @@ -6,16 +6,20 @@ sidebar_position: 1 ## Console Management -> 🌟 Premium feature +import { Badge } from "@site/src/ui/badge"; + +
    + CrowdSec Premium Feature +
    The CrowdSec Security Engine is now able to receive instructions from the console. This is done via a polling API, it means that the CrowdSec Local API will use long polling to get orders from the CrowdSec Console. Currently, only 4 orders are available: - - Adding decisions from the console - - Delete decisions from the console - - Force pull the community-blocklist/third party list when an instance subscribe/unsubscribe to a blocklist in the Console - - Reauth to CAPI, when for example an instance is added to a tag +- Adding decisions from the console +- Delete decisions from the console +- Force pull the community-blocklist/third party list when an instance subscribe/unsubscribe to a blocklist in the Console +- Reauth to CAPI, when for example an instance is added to a tag ## Enable console management @@ -28,6 +32,7 @@ It may take up to 30 minutes for CrowdSec to detect a plan upgrade or downgrade. ::: We need to enable the option on the LAPI side: + ```bash sudo cscli console enable console_management sudo systemctl restart crowdsec diff --git a/crowdsec-docs/unversioned/console/decisions/decisions_management.md b/crowdsec-docs/unversioned/console/decisions/decisions_management.mdx similarity index 81% rename from crowdsec-docs/unversioned/console/decisions/decisions_management.md rename to crowdsec-docs/unversioned/console/decisions/decisions_management.mdx index 4b3d6871f..889cb2d19 100644 --- a/crowdsec-docs/unversioned/console/decisions/decisions_management.md +++ b/crowdsec-docs/unversioned/console/decisions/decisions_management.mdx @@ -4,31 +4,37 @@ title: Decisions Management sidebar_position: 1 --- +import { Badge } from "@site/src/ui/badge"; + +
    + CrowdSec Premium Feature +
    + + :::info -If running a version before v1.6.9, this feature needs the *console_management* feature activated on your Security Engine. +If running a version before v1.6.9, this feature needs the _console_management_ feature activated on your Security Engine. Activate it to make sure actions from the **decision management** are applied **immediately**. Check the instructions to activate it [HERE](/u/console/decisions/decisions_intro). ::: + ## Console Management CrowdSec Local API is able to receive or delete local decisions from the Console. -> 🌟 Premium feature ### Adding decision From the Console, it is possible to add a decision for your whole organization, for instances that belong to a tag or to one or more instances. - - Click on the "Add a decision" button in the "Decisions" tab: +- Click on the "Add a decision" button in the "Decisions" tab: ![Add decision button](/img/add_decision_button.png) - - Then enter the IP address you want to ban, the remediation type, the duration, a reason and select the target of this decision: ->In this example, we are adding a __ban__ decision on __192.168.1.1__ for __4h__ because it is a __Bad IP__, to my two instances. +- Then enter the IP address you want to ban, the remediation type, the duration, a reason and select the target of this decision: + > In this example, we are adding a **ban** decision on **192.168.1.1** for **4h** because it is a **Bad IP**, to my two instances. ![Add decision](/img/add_decision_to_machines.png) - And we can see in the CrowdSec Local API logs that we received this new decision: ```bash title="/var/log/crowdsec.log" @@ -46,14 +52,13 @@ sudo cscli decisions list β”‚ 51093289 β”‚ console β”‚ ip:192.168.1.1 β”‚ Bad IP β”‚ ban β”‚ β”‚ β”‚ 0 β”‚ 3h55m45.776620725s β”‚ 13404 β”‚ ``` - ### Deleting decision - - Go to the decision you want to delete. You can then choose if you want to delete the decision on all the machines, or only on the specified machine: +- Go to the decision you want to delete. You can then choose if you want to delete the decision on all the machines, or only on the specified machine: ![Delete decision](/img/delete_decision.png) - - And confirm that you want to delete it: +- And confirm that you want to delete it: ![Delete decision confirm](/img/delete_decision_confirm.png) @@ -62,4 +67,4 @@ And we can see that our CrowdSec Local API received the order to delete the deci ```bash time="31-03-2023 11:41:52" level=info msg="Decision from 'console' for '192.168.1.1' (ban) has been deleted" time="31-03-2023 11:42:01" level=info msg="sync decisions: 1 deleted decisions to push" interval=10 source=papi -``` \ No newline at end of file +``` diff --git a/crowdsec-docs/unversioned/console/enterprise_plan/enterprise_invoices.mdx b/crowdsec-docs/unversioned/console/enterprise_plan/enterprise_invoices.mdx index 180768d2b..539243918 100644 --- a/crowdsec-docs/unversioned/console/enterprise_plan/enterprise_invoices.mdx +++ b/crowdsec-docs/unversioned/console/enterprise_plan/enterprise_invoices.mdx @@ -1,9 +1,17 @@ --- id: enterprise_invoices -title: Invoices πŸ… +title: Invoices --- -# Find and download your invoices +import { Badge } from "@site/src/ui/badge"; + +
    + CrowdSec Premium Feature +
    + + + +## Find and download your invoices :::warning To access invoices, you need to be an **organization owner** diff --git a/crowdsec-docs/unversioned/console/enterprise_plan/enterprise_support.mdx b/crowdsec-docs/unversioned/console/enterprise_plan/enterprise_support.mdx index f81b658b6..55eef4fa5 100644 --- a/crowdsec-docs/unversioned/console/enterprise_plan/enterprise_support.mdx +++ b/crowdsec-docs/unversioned/console/enterprise_plan/enterprise_support.mdx @@ -3,9 +3,11 @@ id: enterprise_support title: Enterprise Support --- -# Enterprise Support +import { Badge } from "@site/src/ui/badge"; -> 🌟 Premium feature +
    + CrowdSec Premium Feature +
    The CrowdSec Console now offers **Enterprise Support** for users on qualifying plans. This feature allows enterprise users to connect directly with our support team via a built-in chat within the CrowdSec Console. diff --git a/crowdsec-docs/unversioned/console/notification_integrations/overview.mdx b/crowdsec-docs/unversioned/console/notification_integrations/overview.mdx index f4df4dffa..4e5ccb7e1 100644 --- a/crowdsec-docs/unversioned/console/notification_integrations/overview.mdx +++ b/crowdsec-docs/unversioned/console/notification_integrations/overview.mdx @@ -3,9 +3,16 @@ id: overview title: Overview --- +import { Badge } from "@site/src/ui/badge"; + +
    + CrowdSec Premium Feature +
    + + Discover all the available notification integrations in CrowdSec. Each integration is designed to help you receive alerts and notifications to various platforms, ensuring you stay informed about security events and incidents. Available [here](https://app.crowdsec.net/settings/integrations). -> 🌟 Premium feature. CrowdSec allows you to be linked to any notification integration. However, you need to be a ⭐ Premium organization to unlock the full potential of the notification integrations. +> CrowdSec allows you to be linked to any notification integration. However, you need to be a ⭐ Premium organization to unlock the full potential of the notification integrations. ## Available Integrations diff --git a/crowdsec-docs/unversioned/console/notification_integrations/rule.mdx b/crowdsec-docs/unversioned/console/notification_integrations/rule.mdx index 53187550f..8c3c30512 100644 --- a/crowdsec-docs/unversioned/console/notification_integrations/rule.mdx +++ b/crowdsec-docs/unversioned/console/notification_integrations/rule.mdx @@ -3,7 +3,11 @@ id: rule title: Notification rule --- -> 🌟 Premium feature. +import { Badge } from "@site/src/ui/badge"; + +
    + CrowdSec Premium Feature +
    Notification rules allow you to customize the alerts and notifications you receive from your CrowdSec Console. By setting up specific rules, you can ensure that you are only notified about events that are relevant to your organization. diff --git a/crowdsec-docs/unversioned/console/security_engines/am_i_under_attack.md b/crowdsec-docs/unversioned/console/security_engines/am_i_under_attack.mdx similarity index 96% rename from crowdsec-docs/unversioned/console/security_engines/am_i_under_attack.md rename to crowdsec-docs/unversioned/console/security_engines/am_i_under_attack.mdx index 3378cf8fb..19f4e36d6 100644 --- a/crowdsec-docs/unversioned/console/security_engines/am_i_under_attack.md +++ b/crowdsec-docs/unversioned/console/security_engines/am_i_under_attack.mdx @@ -5,7 +5,11 @@ description: Alerting you when a surge of attack is hitting you ## Introduction -> 🌟 **Premium Feature** +import { Badge } from "@site/src/ui/badge"; + +
    + CrowdSec Premium Feature +
    The **"Am I Under Attack?"** feature enables enterprise organizations’ owners to receive real-time alerts about potential cyber threats and attack surges. By detecting unusual attack patterns and notifying security teams immediately, this feature helps mitigate risks and reduce response time, ensuring that your team focuses on significant anomalies without being overwhelmed by routine notifications. diff --git a/crowdsec-docs/unversioned/console/security_engines/troubleshooting.md b/crowdsec-docs/unversioned/console/security_engines/troubleshooting.md index 90f09c871..2f8694cc0 100644 --- a/crowdsec-docs/unversioned/console/security_engines/troubleshooting.md +++ b/crowdsec-docs/unversioned/console/security_engines/troubleshooting.md @@ -1,19 +1,17 @@ --- -title: Troubleshooting Hints πŸ… +title: Troubleshooting Hints description: Troubleshooting Security Engines --- ## Introduction -> πŸ… **Premium Feature** - This feature simplifies cybersecurity management by providing a quick, comprehensive view of Security Engines requiring immediate action. It's designed for efficiency, enabling you to identify critical issues such as outdated or inactive components with just one click. This functionality ensures streamlined, focused security maintenance, ideal for teams with many servers to monitor simultaneously. This feature will detect the following behaviors needing your remediation attention: -- **Inactive Remediation component**: Inactive Remediation Components detected. Affected Security Engines may be unprotected. Please review for possible Engine or machine configuration issues. -- **No alerts received within the last 24 hours**: Security Engines have not shared alerts during the previous 24 hours. This could indicate an issue with your machine or monitoring setup. Please validate your setup. -- **Security Engines to update**: Security Engines are out of date. This may compromise your security. Please update to the latest version as soon as possible. +- **Inactive Remediation component**: Inactive Remediation Components detected. Affected Security Engines may be unprotected. Please review for possible Engine or machine configuration issues. +- **No alerts received within the last 24 hours**: Security Engines have not shared alerts during the previous 24 hours. This could indicate an issue with your machine or monitoring setup. Please validate your setup. +- **Security Engines to update**: Security Engines are out of date. This may compromise your security. Please update to the latest version as soon as possible. ## Usage diff --git a/crowdsec-docs/unversioned/console/threat_forecast.md b/crowdsec-docs/unversioned/console/threat_forecast.mdx similarity index 85% rename from crowdsec-docs/unversioned/console/threat_forecast.md rename to crowdsec-docs/unversioned/console/threat_forecast.mdx index e7f1bfe36..dd109a774 100644 --- a/crowdsec-docs/unversioned/console/threat_forecast.md +++ b/crowdsec-docs/unversioned/console/threat_forecast.mdx @@ -1,6 +1,14 @@ -# Threat Forecast +--- +id: threat_forecast +title: Threat Forecast +--- -> 🌟 Premium feature + +import { Badge } from "@site/src/ui/badge"; + +
    + CrowdSec Premium Feature +
    The Threat Forecast is a special blocklist for enterprise organizations. It provides an additional layer of security on top of the community blocklist. In contrast to the community blocklist it is generated on a per-organization basis to deliver more precise protection based on the signals shared by the organization. diff --git a/crowdsec-docs/unversioned/service_api/getting_started.mdx b/crowdsec-docs/unversioned/service_api/getting_started.mdx index 1b96cd805..22d77a337 100644 --- a/crowdsec-docs/unversioned/service_api/getting_started.mdx +++ b/crowdsec-docs/unversioned/service_api/getting_started.mdx @@ -7,9 +7,11 @@ import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; import useBaseUrl from '@docusaurus/useBaseUrl'; -:::info -This is an [enterprise plan](https://www.crowdsec.net/pricing) feature -::: +import { Badge } from "@site/src/ui/badge"; + +
    + CrowdSec Premium Feature +
    ## What is the Service API ?