This is an automated email from the ASF dual-hosted git repository.

michaelsmolina pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/superset.git


The following commit(s) were added to refs/heads/master by this push:
     new ef4b1d674be feat(docs): add filterable UI Components table and improve 
build performance (#38253)
ef4b1d674be is described below

commit ef4b1d674be9e9203a2d8f7d9e77e5001635ea9d
Author: Evan Rusackas <[email protected]>
AuthorDate: Wed Mar 4 08:32:25 2026 -0500

    feat(docs): add filterable UI Components table and improve build 
performance (#38253)
    
    Co-authored-by: Claude Sonnet 4.6 <[email protected]>
---
 docs/.gitignore                                    |   8 +-
 docs/developer_docs/api.mdx                        |  36 +-
 docs/developer_docs/extensions/development.md      |   2 +-
 docs/developer_docs/extensions/overview.md         |   4 +
 docs/docusaurus.config.ts                          |  28 +
 docs/package.json                                  |  11 +-
 docs/scripts/generate-database-docs.mjs            |   8 +-
 docs/scripts/generate-extension-components.mjs     | 676 --------------------
 docs/scripts/generate-if-changed.mjs               | 307 +++++++++
 docs/scripts/generate-superset-components.mjs      | 241 ++++++-
 docs/sidebarTutorials.js                           |  11 -
 docs/src/components/databases/DatabaseIndex.tsx    |   1 +
 .../components/ui-components/ComponentIndex.tsx    | 262 ++++++++
 .../components/ui-components/index.ts}             |  15 +-
 .../ui-components/types.ts}                        |  37 +-
 docs/src/data/databases.json                       |  12 +-
 docs/src/shims/superset-ui-core.ts                 |  57 ++
 docs/src/types/apache-superset-core/index.d.ts     |   4 +-
 docs/src/webpack.extend.ts                         |  15 +-
 docs/tsconfig.json                                 |   5 +-
 docs/yarn.lock                                     | 697 ++++++++++++++++++---
 21 files changed, 1585 insertions(+), 852 deletions(-)

diff --git a/docs/.gitignore b/docs/.gitignore
index bdf3078bb36..d5cf1228397 100644
--- a/docs/.gitignore
+++ b/docs/.gitignore
@@ -37,10 +37,10 @@ developer_docs/api/
 
 # Generated component documentation MDX files (regenerated at build time)
 # Source of truth is Storybook stories in 
superset-frontend/packages/superset-ui-core/src/components/
-developer_portal/components/
-
-# Generated extension component documentation (regenerated at build time)
-developer_portal/extensions/components/
+developer_docs/components/
 
 # Note: src/data/databases.json is COMMITTED (not ignored) to preserve feature 
diagnostics
 # that require Flask context to generate. Update it locally with: npm run 
gen-db-docs
+
+# Generated component metadata JSON (regenerated by 
generate-superset-components.mjs)
+static/data/components.json
diff --git a/docs/developer_docs/api.mdx b/docs/developer_docs/api.mdx
index ff563805a8e..09f3843087f 100644
--- a/docs/developer_docs/api.mdx
+++ b/docs/developer_docs/api.mdx
@@ -68,14 +68,14 @@ curl -H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
 | `POST` | [Create a new dashboard](./api/create-a-new-dashboard) | 
`/api/v1/dashboard/` |
 | `GET` | [Get metadata information about this API resource 
(dashboard--info)](./api/get-metadata-information-about-this-api-resource-dashboard-info)
 | `/api/v1/dashboard/_info` |
 | `GET` | [Get a dashboard detail 
information](./api/get-a-dashboard-detail-information) | 
`/api/v1/dashboard/{id_or_slug}` |
-| `GET` | [Get a dashboard's chart 
definitions.](./api/get-a-dashboards-chart-definitions) | 
`/api/v1/dashboard/{id_or_slug}/charts` |
+| `GET` | [Get a dashboard's chart 
definitions.](./api/get-a-dashboard-s-chart-definitions) | 
`/api/v1/dashboard/{id_or_slug}/charts` |
 | `POST` | [Create a copy of an existing 
dashboard](./api/create-a-copy-of-an-existing-dashboard) | 
`/api/v1/dashboard/{id_or_slug}/copy/` |
-| `GET` | [Get dashboard's datasets](./api/get-dashboards-datasets) | 
`/api/v1/dashboard/{id_or_slug}/datasets` |
-| `DELETE` | [Delete a dashboard's embedded 
configuration](./api/delete-a-dashboards-embedded-configuration) | 
`/api/v1/dashboard/{id_or_slug}/embedded` |
-| `GET` | [Get the dashboard's embedded 
configuration](./api/get-the-dashboards-embedded-configuration) | 
`/api/v1/dashboard/{id_or_slug}/embedded` |
-| `POST` | [Set a dashboard's embedded 
configuration](./api/set-a-dashboards-embedded-configuration) | 
`/api/v1/dashboard/{id_or_slug}/embedded` |
+| `GET` | [Get dashboard's datasets](./api/get-dashboard-s-datasets) | 
`/api/v1/dashboard/{id_or_slug}/datasets` |
+| `DELETE` | [Delete a dashboard's embedded 
configuration](./api/delete-a-dashboard-s-embedded-configuration) | 
`/api/v1/dashboard/{id_or_slug}/embedded` |
+| `GET` | [Get the dashboard's embedded 
configuration](./api/get-the-dashboard-s-embedded-configuration) | 
`/api/v1/dashboard/{id_or_slug}/embedded` |
+| `POST` | [Set a dashboard's embedded 
configuration](./api/set-a-dashboard-s-embedded-configuration) | 
`/api/v1/dashboard/{id_or_slug}/embedded` |
 | `PUT` | [Update dashboard by id_or_slug 
embedded](./api/update-dashboard-by-id-or-slug-embedded) | 
`/api/v1/dashboard/{id_or_slug}/embedded` |
-| `GET` | [Get dashboard's tabs](./api/get-dashboards-tabs) | 
`/api/v1/dashboard/{id_or_slug}/tabs` |
+| `GET` | [Get dashboard's tabs](./api/get-dashboard-s-tabs) | 
`/api/v1/dashboard/{id_or_slug}/tabs` |
 | `DELETE` | [Delete a dashboard](./api/delete-a-dashboard) | 
`/api/v1/dashboard/{pk}` |
 | `PUT` | [Update a dashboard](./api/update-a-dashboard) | 
`/api/v1/dashboard/{pk}` |
 | `POST` | [Compute and cache a screenshot 
(dashboard-pk-cache-dashboard-screenshot)](./api/compute-and-cache-a-screenshot-dashboard-pk-cache-dashboard-screenshot)
 | `/api/v1/dashboard/{pk}/cache_dashboard_screenshot/` |
@@ -84,7 +84,7 @@ curl -H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
 | `POST` | [Mark the dashboard as favorite for the current 
user](./api/mark-the-dashboard-as-favorite-for-the-current-user) | 
`/api/v1/dashboard/{pk}/favorites/` |
 | `PUT` | [Update native filters configuration for a 
dashboard.](./api/update-native-filters-configuration-for-a-dashboard) | 
`/api/v1/dashboard/{pk}/filters` |
 | `GET` | [Get a computed screenshot from cache 
(dashboard-pk-screenshot-digest)](./api/get-a-computed-screenshot-from-cache-dashboard-pk-screenshot-digest)
 | `/api/v1/dashboard/{pk}/screenshot/{digest}/` |
-| `GET` | [Get dashboard's thumbnail](./api/get-dashboards-thumbnail) | 
`/api/v1/dashboard/{pk}/thumbnail/{digest}/` |
+| `GET` | [Get dashboard's thumbnail](./api/get-dashboard-s-thumbnail) | 
`/api/v1/dashboard/{pk}/thumbnail/{digest}/` |
 | `GET` | [Download multiple dashboards as YAML 
files](./api/download-multiple-dashboards-as-yaml-files) | 
`/api/v1/dashboard/export/` |
 | `GET` | [Check favorited dashboards for current 
user](./api/check-favorited-dashboards-for-current-user) | 
`/api/v1/dashboard/favorite_status/` |
 | `POST` | [Import dashboard(s) with associated 
charts/datasets/databases](./api/import-dashboard-s-with-associated-charts-datasets-databases)
 | `/api/v1/dashboard/import/` |
@@ -177,7 +177,7 @@ curl -H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
 | `GET` | [Get names of databases currently 
available](./api/get-names-of-databases-currently-available) | 
`/api/v1/database/available/` |
 | `GET` | [Download database(s) and associated dataset(s) as a zip 
file](./api/download-database-s-and-associated-dataset-s-as-a-zip-file) | 
`/api/v1/database/export/` |
 | `POST` | [Import database(s) with associated 
datasets](./api/import-database-s-with-associated-datasets) | 
`/api/v1/database/import/` |
-| `GET` | [Receive personal access tokens from 
OAuth2](./api/receive-personal-access-tokens-from-o-auth-2) | 
`/api/v1/database/oauth2/` |
+| `GET` | [Receive personal access tokens from 
OAuth2](./api/receive-personal-access-tokens-from-oauth2) | 
`/api/v1/database/oauth2/` |
 | `GET` | [Get related fields data 
(database-related-column-name)](./api/get-related-fields-data-database-related-column-name)
 | `/api/v1/database/related/{column_name}` |
 | `POST` | [Test a database connection](./api/test-a-database-connection) | 
`/api/v1/database/test_connection/` |
 | `POST` | [Upload a file and returns file 
metadata](./api/upload-a-file-and-returns-file-metadata) | 
`/api/v1/database/upload_metadata/` |
@@ -201,7 +201,7 @@ curl -H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
 
 | Method | Endpoint | Description |
 |--------|----------|-------------|
-| `GET` | [Get the bootstrap data for SqlLab 
page](./api/get-the-bootstrap-data-for-sql-lab-page) | `/api/v1/sqllab/` |
+| `GET` | [Get the bootstrap data for SqlLab 
page](./api/get-the-bootstrap-data-for-sqllab-page) | `/api/v1/sqllab/` |
 | `POST` | [Estimate the SQL query execution 
cost](./api/estimate-the-sql-query-execution-cost) | `/api/v1/sqllab/estimate/` 
|
 | `POST` | [Execute a SQL query](./api/execute-a-sql-query) | 
`/api/v1/sqllab/execute/` |
 | `GET` | [Export the SQL query results to a 
CSV](./api/export-the-sql-query-results-to-a-csv) | 
`/api/v1/sqllab/export/{client_id}/` |
@@ -249,7 +249,7 @@ curl -H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
 
 | Method | Endpoint | Description |
 |--------|----------|-------------|
-| `GET` | [Return an 
AdvancedDataTypeResponse](./api/return-an-advanced-data-type-response) | 
`/api/v1/advanced_data_type/convert` |
+| `GET` | [Return an 
AdvancedDataTypeResponse](./api/return-an-advanceddatatyperesponse) | 
`/api/v1/advanced_data_type/convert` |
 | `GET` | [Return a list of available advanced data 
types](./api/return-a-list-of-available-advanced-data-types) | 
`/api/v1/advanced_data_type/types` |
 
 </details>
@@ -324,8 +324,8 @@ curl -H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
 
 | Method | Endpoint | Description |
 |--------|----------|-------------|
-| `POST` | [Create a new dashboard's permanent 
link](./api/create-a-new-dashboards-permanent-link) | 
`/api/v1/dashboard/{pk}/permalink` |
-| `GET` | [Get dashboard's permanent link 
state](./api/get-dashboards-permanent-link-state) | 
`/api/v1/dashboard/permalink/{key}` |
+| `POST` | [Create a new dashboard's permanent 
link](./api/create-a-new-dashboard-s-permanent-link) | 
`/api/v1/dashboard/{pk}/permalink` |
+| `GET` | [Get dashboard's permanent link 
state](./api/get-dashboard-s-permanent-link-state) | 
`/api/v1/dashboard/permalink/{key}` |
 
 </details>
 
@@ -335,7 +335,7 @@ curl -H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
 | Method | Endpoint | Description |
 |--------|----------|-------------|
 | `POST` | [Create a new permanent link 
(explore-permalink)](./api/create-a-new-permanent-link-explore-permalink) | 
`/api/v1/explore/permalink` |
-| `GET` | [Get chart's permanent link 
state](./api/get-charts-permanent-link-state) | 
`/api/v1/explore/permalink/{key}` |
+| `GET` | [Get chart's permanent link 
state](./api/get-chart-s-permanent-link-state) | 
`/api/v1/explore/permalink/{key}` |
 
 </details>
 
@@ -345,7 +345,7 @@ curl -H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
 | Method | Endpoint | Description |
 |--------|----------|-------------|
 | `POST` | [Create a new permanent link 
(sqllab-permalink)](./api/create-a-new-permanent-link-sqllab-permalink) | 
`/api/v1/sqllab/permalink` |
-| `GET` | [Get permanent link state for SQLLab 
editor.](./api/get-permanent-link-state-for-sql-lab-editor) | 
`/api/v1/sqllab/permalink/{key}` |
+| `GET` | [Get permanent link state for SQLLab 
editor.](./api/get-permanent-link-state-for-sqllab-editor) | 
`/api/v1/sqllab/permalink/{key}` |
 
 </details>
 
@@ -363,10 +363,10 @@ curl -H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
 
 | Method | Endpoint | Description |
 |--------|----------|-------------|
-| `POST` | [Create a dashboard's filter 
state](./api/create-a-dashboards-filter-state) | 
`/api/v1/dashboard/{pk}/filter_state` |
-| `DELETE` | [Delete a dashboard's filter state 
value](./api/delete-a-dashboards-filter-state-value) | 
`/api/v1/dashboard/{pk}/filter_state/{key}` |
-| `GET` | [Get a dashboard's filter state 
value](./api/get-a-dashboards-filter-state-value) | 
`/api/v1/dashboard/{pk}/filter_state/{key}` |
-| `PUT` | [Update a dashboard's filter state 
value](./api/update-a-dashboards-filter-state-value) | 
`/api/v1/dashboard/{pk}/filter_state/{key}` |
+| `POST` | [Create a dashboard's filter 
state](./api/create-a-dashboard-s-filter-state) | 
`/api/v1/dashboard/{pk}/filter_state` |
+| `DELETE` | [Delete a dashboard's filter state 
value](./api/delete-a-dashboard-s-filter-state-value) | 
`/api/v1/dashboard/{pk}/filter_state/{key}` |
+| `GET` | [Get a dashboard's filter state 
value](./api/get-a-dashboard-s-filter-state-value) | 
`/api/v1/dashboard/{pk}/filter_state/{key}` |
+| `PUT` | [Update a dashboard's filter state 
value](./api/update-a-dashboard-s-filter-state-value) | 
`/api/v1/dashboard/{pk}/filter_state/{key}` |
 
 </details>
 
diff --git a/docs/developer_docs/extensions/development.md 
b/docs/developer_docs/extensions/development.md
index c1f7a51be5e..41b112abb89 100644
--- a/docs/developer_docs/extensions/development.md
+++ b/docs/developer_docs/extensions/development.md
@@ -309,7 +309,7 @@ InteractiveMyComponent.argTypes = {
 
 When the docs site is built (`yarn start` or `yarn build` in the `docs/` 
directory):
 
-1. The `generate-extension-components` script scans all stories in 
`superset-core`
+1. The `generate-superset-components` script scans all stories (including 
`superset-core`)
 2. For each story, it generates an MDX page with:
    - Component description
    - **Live interactive example** with controls extracted from `argTypes`
diff --git a/docs/developer_docs/extensions/overview.md 
b/docs/developer_docs/extensions/overview.md
index 175fa9701ca..be8628836d8 100644
--- a/docs/developer_docs/extensions/overview.md
+++ b/docs/developer_docs/extensions/overview.md
@@ -41,6 +41,10 @@ Extensions can provide:
 - **REST API Endpoints**: Backend services under the `/api/v1/extensions/` 
namespace
 - **MCP Tools and Prompts**: AI agent capabilities for enhanced user assistance
 
+## UI Components for Extensions
+
+Extension developers have access to pre-built UI components via 
`@apache-superset/core/ui`. Browse all available components on the [UI 
Components](/docs/components/) page and filter by **Extension Compatible** to 
see components available to extensions.
+
 ## Next Steps
 
 - **[Quick Start](./quick-start)** - Build your first extension with a 
complete walkthrough
diff --git a/docs/docusaurus.config.ts b/docs/docusaurus.config.ts
index 289ae9ed0e5..898bf3ff1c8 100644
--- a/docs/docusaurus.config.ts
+++ b/docs/docusaurus.config.ts
@@ -227,7 +227,35 @@ if (!versionsConfig.developer_docs.disabled && 
!versionsConfig.developer_docs.hi
   });
 }
 
+// Docusaurus Faster: Rspack bundler, SWC transpilation, and other build
+// optimizations. Only enabled for local development — CI runners (GitHub
+// Actions, Netlify) have ~8GB RAM and these features push memory usage over
+// the limit. See https://docusaurus.io/blog/releases/3.6#docusaurus-faster
+const isCI = process.env.CI === 'true';
+
 const config: Config = {
+  ...(!isCI && {
+    future: {
+      v4: {
+        removeLegacyPostBuildHeadAttribute: true,
+        // Disabled: CSS cascade layers change specificity and cause antd
+        // styles (from Storybook component pages) to override theme styles
+        useCssCascadeLayers: false,
+      },
+      experimental_faster: {
+        swcJsLoader: true,
+        swcJsMinimizer: true,
+        swcHtmlMinimizer: true,
+        lightningCssMinimizer: true,
+        rspackBundler: true,
+        mdxCrossCompilerCache: true,
+        rspackPersistentCache: true,
+        // SSG worker threads spawn parallel Node processes, each consuming
+        // significant memory. Disabled to keep total usage reasonable.
+        ssgWorkerThreads: false,
+      },
+    },
+  }),
   title: 'Superset',
   tagline:
     'Apache Superset is a modern data exploration and visualization platform',
diff --git a/docs/package.json b/docs/package.json
index b41324c9f3f..0d11ac24179 100644
--- a/docs/package.json
+++ b/docs/package.json
@@ -6,10 +6,12 @@
   "scripts": {
     "docusaurus": "docusaurus",
     "_init": "cat src/intro_header.txt ../README.md > docs/intro.md",
-    "start": "yarn run _init && yarn run generate:all && 
NODE_OPTIONS='--max-old-space-size=8192' NODE_ENV=development docusaurus start",
+    "start": "yarn run _init && yarn run generate:smart && 
NODE_OPTIONS='--max-old-space-size=8192' NODE_ENV=development docusaurus start",
     "start:quick": "yarn run _init && NODE_OPTIONS='--max-old-space-size=8192' 
NODE_ENV=development docusaurus start",
+    "start:full": "yarn run _init && yarn run generate:all && 
NODE_OPTIONS='--max-old-space-size=8192' NODE_ENV=development docusaurus start",
     "stop": "pkill -9 -f 'docusaurus start' || pkill -9 -f 'docusaurus serve' 
|| echo 'No docusaurus server running'",
-    "build": "yarn run _init && yarn run generate:all && 
NODE_OPTIONS='--max-old-space-size=8192' DEBUG=docusaurus:* docusaurus build",
+    "build": "yarn run _init && yarn run generate:smart && 
NODE_OPTIONS='--max-old-space-size=8192' docusaurus build",
+    "build:full": "yarn run _init && yarn run generate:all && 
NODE_OPTIONS='--max-old-space-size=8192' docusaurus build",
     "generate:api-docs": "python3 scripts/fix-openapi-spec.py && docusaurus 
gen-api-docs superset && node scripts/convert-api-sidebar.mjs && node 
scripts/generate-api-index.mjs && node scripts/generate-api-tag-pages.mjs",
     "clean:api-docs": "docusaurus clean-api-docs superset",
     "swizzle": "docusaurus swizzle",
@@ -19,11 +21,11 @@
     "write-translations": "docusaurus write-translations",
     "write-heading-ids": "docusaurus write-heading-ids",
     "typecheck": "yarn run generate:all && tsc",
-    "generate:extension-components": "node 
scripts/generate-extension-components.mjs",
     "generate:superset-components": "node 
scripts/generate-superset-components.mjs",
     "generate:database-docs": "node scripts/generate-database-docs.mjs",
     "gen-db-docs": "node scripts/generate-database-docs.mjs",
-    "generate:all": "yarn run generate:extension-components & yarn run 
generate:superset-components & yarn run generate:database-docs & wait && yarn 
run generate:api-docs",
+    "generate:smart": "node scripts/generate-if-changed.mjs",
+    "generate:all": "node scripts/generate-if-changed.mjs --force",
     "lint:db-metadata": "python3 ../superset/db_engine_specs/lint_metadata.py",
     "lint:db-metadata:report": "python3 
../superset/db_engine_specs/lint_metadata.py --markdown -o 
../superset/db_engine_specs/METADATA_STATUS.md",
     "update:readme-db-logos": "node scripts/generate-database-docs.mjs 
--update-readme",
@@ -40,6 +42,7 @@
   "dependencies": {
     "@ant-design/icons": "^6.1.0",
     "@docusaurus/core": "3.9.2",
+    "@docusaurus/faster": "^3.9.2",
     "@docusaurus/plugin-client-redirects": "3.9.2",
     "@docusaurus/preset-classic": "3.9.2",
     "@docusaurus/theme-live-codeblock": "^3.9.2",
diff --git a/docs/scripts/generate-database-docs.mjs 
b/docs/scripts/generate-database-docs.mjs
index 85e5b18ff0c..0491683b951 100644
--- a/docs/scripts/generate-database-docs.mjs
+++ b/docs/scripts/generate-database-docs.mjs
@@ -460,6 +460,9 @@ function generateDatabaseMDX(name, db) {
     .replace(/\\/g, '\\\\')
     .replace(/"/g, '\\"');
 
+  // Inline the database data directly to avoid importing the full 
databases.json
+  const inlineData = JSON.stringify(db);
+
   return `---
 title: ${name}
 sidebar_label: ${name}
@@ -487,9 +490,10 @@ under the License.
 */}
 
 import { DatabasePage } from '@site/src/components/databases';
-import databaseData from '@site/src/data/databases.json';
 
-<DatabasePage name="${name}" database={databaseData.databases["${name}"]} />
+export const databaseInfo = ${inlineData};
+
+<DatabasePage name="${name}" database={databaseInfo} />
 `;
 }
 
diff --git a/docs/scripts/generate-extension-components.mjs 
b/docs/scripts/generate-extension-components.mjs
deleted file mode 100644
index c7bed4901c1..00000000000
--- a/docs/scripts/generate-extension-components.mjs
+++ /dev/null
@@ -1,676 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-/**
- * This script scans for Storybook stories in superset-core/src and generates
- * MDX documentation pages for the developer portal. All components in
- * superset-core are considered extension-compatible by virtue of their 
location.
- *
- * Usage: node scripts/generate-extension-components.mjs
- */
-
-import fs from 'fs';
-import path from 'path';
-import { fileURLToPath } from 'url';
-
-const __filename = fileURLToPath(import.meta.url);
-const __dirname = path.dirname(__filename);
-const ROOT_DIR = path.resolve(__dirname, '../..');
-const DOCS_DIR = path.resolve(__dirname, '..');
-const OUTPUT_DIR = path.join(
-  DOCS_DIR,
-  'developer_portal/extensions/components'
-);
-const TYPES_OUTPUT_DIR = path.join(DOCS_DIR, 'src/types/apache-superset-core');
-const TYPES_OUTPUT_PATH = path.join(TYPES_OUTPUT_DIR, 'index.d.ts');
-const SUPERSET_CORE_DIR = path.join(
-  ROOT_DIR,
-  'superset-frontend/packages/superset-core'
-);
-
-/**
- * Find all story files in the superset-core package
- */
-async function findStoryFiles() {
-  const files = [];
-
-  // Use fs to recursively find files since glob might not be available
-  function walkDir(dir) {
-    if (!fs.existsSync(dir)) return;
-    const entries = fs.readdirSync(dir, { withFileTypes: true });
-    for (const entry of entries) {
-      const fullPath = path.join(dir, entry.name);
-      if (entry.isDirectory()) {
-        walkDir(fullPath);
-      } else if (entry.name.endsWith('.stories.tsx')) {
-        files.push(fullPath);
-      }
-    }
-  }
-
-  walkDir(path.join(SUPERSET_CORE_DIR, 'src'));
-  return files;
-}
-
-/**
- * Parse a story file and extract metadata
- *
- * All stories in superset-core are considered extension-compatible
- * by virtue of their location - no tag needed.
- */
-function parseStoryFile(filePath) {
-  const content = fs.readFileSync(filePath, 'utf-8');
-
-  // Extract component name from title
-  const titleMatch = content.match(/title:\s*['"]([^'"]+)['"]/);
-  const title = titleMatch ? titleMatch[1] : null;
-
-  // Extract component name (last part of title path)
-  const componentName = title ? title.split('/').pop() : null;
-
-  // Extract description from parameters
-  // Handle concatenated strings like: 'part1 ' + 'part2'
-  let description = '';
-
-  // First try to find the description block
-  const descBlockMatch = content.match(
-    /description:\s*{\s*component:\s*([\s\S]*?)\s*},?\s*}/
-  );
-
-  if (descBlockMatch) {
-    const descBlock = descBlockMatch[1];
-    // Extract all string literals and concatenate them
-    const stringParts = [];
-    const stringMatches = descBlock.matchAll(/['"]([^'"]*)['"]/g);
-    for (const match of stringMatches) {
-      stringParts.push(match[1]);
-    }
-    description = stringParts.join('').trim();
-  }
-
-  // Extract package info
-  const packageMatch = content.match(/package:\s*['"]([^'"]+)['"]/);
-  const packageName = packageMatch ? packageMatch[1] : 
'@apache-superset/core/ui';
-
-  // Extract import path - handle double-quoted strings containing single 
quotes
-  // Match: importPath: "import { Alert } from '@apache-superset/core';"
-  const importMatchDouble = content.match(/importPath:\s*"([^"]+)"/);
-  const importMatchSingle = content.match(/importPath:\s*'([^']+)'/);
-  let importPath = `import { ${componentName} } from '${packageName}';`;
-  if (importMatchDouble) {
-    importPath = importMatchDouble[1];
-  } else if (importMatchSingle) {
-    importPath = importMatchSingle[1];
-  }
-
-  // Get the directory containing the story to find the component
-  const storyDir = path.dirname(filePath);
-  const componentFile = path.join(storyDir, 'index.tsx');
-  const hasComponentFile = fs.existsSync(componentFile);
-
-  // Try to extract props interface from component file (for future use)
-  if (hasComponentFile) {
-    // Read component file - props extraction reserved for future enhancement
-    // const componentContent = fs.readFileSync(componentFile, 'utf-8');
-  }
-
-  // Extract story exports (named exports that aren't the default)
-  const storyExports = [];
-  const exportMatches = content.matchAll(
-    /export\s+(?:const|function)\s+(\w+)/g
-  );
-  for (const match of exportMatches) {
-    if (match[1] !== 'default') {
-      storyExports.push(match[1]);
-    }
-  }
-
-  return {
-    filePath,
-    title,
-    componentName,
-    description,
-    packageName,
-    importPath,
-    storyExports,
-    hasComponentFile,
-    relativePath: path.relative(ROOT_DIR, filePath),
-  };
-}
-
-/**
- * Extract argTypes/args from story content for generating controls
- */
-function extractArgsAndControls(content, componentName, storyContent) {
-  // Look for InteractiveX.args pattern - handle multi-line objects
-  const argsMatch = content.match(
-    new 
RegExp(`Interactive${componentName}\\.args\\s*=\\s*\\{([\\s\\S]*?)\\};`, 's')
-  );
-
-  // Look for argTypes
-  const argTypesMatch = content.match(
-    new 
RegExp(`Interactive${componentName}\\.argTypes\\s*=\\s*\\{([\\s\\S]*?)\\};`, 
's')
-  );
-
-  const args = {};
-  const controls = [];
-  const propDescriptions = {};
-
-  if (argsMatch) {
-    // Parse args - handle strings, booleans, numbers
-    // Note: Using simple regex without escape handling for security (avoids 
ReDoS)
-    // This is sufficient for Storybook args which rarely contain escaped 
quotes
-    const argsContent = argsMatch[1];
-    const argLines = 
argsContent.matchAll(/(\w+):\s*(['"]([^'"]*)['"']|true|false|\d+)/g);
-    for (const match of argLines) {
-      const key = match[1];
-      let value = match[2];
-      // Convert string booleans
-      if (value === 'true') value = true;
-      else if (value === 'false') value = false;
-      else if (!isNaN(Number(value))) value = Number(value);
-      else if (match[3] !== undefined) value = match[3]; // Use captured 
string content
-      args[key] = value;
-    }
-  }
-
-  if (argTypesMatch) {
-    const argTypesContent = argTypesMatch[1];
-
-    // Match each top-level property in argTypes
-    // Pattern: propertyName: { ... }, (with balanced braces)
-    const propPattern = /(\w+):\s*\{([^{}]*(?:\{[^{}]*\}[^{}]*)*)\}/g;
-    let propMatch;
-
-    while ((propMatch = propPattern.exec(argTypesContent)) !== null) {
-      const name = propMatch[1];
-      const propContent = propMatch[2];
-
-      // Extract description if present
-      const descMatch = propContent.match(/description:\s*['"]([^'"]+)['"]/);
-      if (descMatch) {
-        propDescriptions[name] = descMatch[1];
-      }
-
-      // Skip if it's an action (not a control)
-      if (propContent.includes('action:')) continue;
-
-      // Extract label for display
-      const label = name.charAt(0).toUpperCase() + 
name.slice(1).replace(/([A-Z])/g, ' $1');
-
-      // Check for select control
-      if (propContent.includes("type: 'select'") || 
propContent.includes('type: "select"')) {
-        // Look for options - could be inline array or variable reference
-        const inlineOptionsMatch = 
propContent.match(/options:\s*\[([^\]]+)\]/);
-        const varOptionsMatch = propContent.match(/options:\s*(\w+)/);
-
-        let options = [];
-        if (inlineOptionsMatch) {
-          options = 
[...inlineOptionsMatch[1].matchAll(/['"]([^'"]+)['"]/g)].map(m => m[1]);
-        } else if (varOptionsMatch && storyContent) {
-          // Look up the variable
-          const varName = varOptionsMatch[1];
-          const varDefMatch = storyContent.match(
-            new RegExp(`const\\s+${varName}[^=]*=\\s*\\[([^\\]]+)\\]`)
-          );
-          if (varDefMatch) {
-            options = [...varDefMatch[1].matchAll(/['"]([^'"]+)['"]/g)].map(m 
=> m[1]);
-          }
-        }
-
-        if (options.length > 0) {
-          controls.push({ name, label, type: 'select', options });
-        }
-      }
-      // Check for boolean control
-      else if (propContent.includes("type: 'boolean'") || 
propContent.includes('type: "boolean"')) {
-        controls.push({ name, label, type: 'boolean' });
-      }
-      // Check for text/string control (default for props in args without 
explicit control)
-      else if (args[name] !== undefined && typeof args[name] === 'string') {
-        controls.push({ name, label, type: 'text' });
-      }
-    }
-  }
-
-  // Add text controls for string args that don't have explicit argTypes
-  for (const [key, value] of Object.entries(args)) {
-    if (typeof value === 'string' && !controls.find(c => c.name === key)) {
-      const label = key.charAt(0).toUpperCase() + 
key.slice(1).replace(/([A-Z])/g, ' $1');
-      controls.push({ name: key, label, type: 'text' });
-    }
-  }
-
-  return { args, controls, propDescriptions };
-}
-
-/**
- * Generate MDX content for a component
- */
-function generateMDX(component, storyContent) {
-  const { componentName, description, importPath, packageName, relativePath } =
-    component;
-
-  // Extract args, controls, and descriptions from the story
-  const { args, controls, propDescriptions } = 
extractArgsAndControls(storyContent, componentName, storyContent);
-
-  // Generate the controls array for StoryWithControls
-  const controlsJson = JSON.stringify(controls, null, 2)
-    .replace(/"(\w+)":/g, '$1:')  // Remove quotes from keys
-    .replace(/"/g, "'");  // Use single quotes for strings
-
-  // Generate default props
-  const propsJson = JSON.stringify(args, null, 2)
-    .replace(/"(\w+)":/g, '$1:')
-    .replace(/"/g, "'");
-
-  // Generate a realistic live code example from the actual args
-  const liveExampleProps = Object.entries(args)
-    .map(([key, value]) => {
-      if (typeof value === 'string') return `${key}="${value}"`;
-      if (typeof value === 'boolean') return value ? key : null;
-      return `${key}={${JSON.stringify(value)}}`;
-    })
-    .filter(Boolean)
-    .join('\n      ');
-
-  // Generate props table with descriptions from argTypes
-  const propsTable = Object.entries(args).map(([key, value]) => {
-    const type = typeof value === 'boolean' ? 'boolean' : typeof value === 
'string' ? 'string' : 'any';
-    const desc = propDescriptions[key] || key.charAt(0).toUpperCase() + 
key.slice(1).replace(/([A-Z])/g, ' $1');
-    return `| \`${key}\` | \`${type}\` | \`${JSON.stringify(value)}\` | 
${desc} |`;
-  }).join('\n');
-
-  // Generate usage example props (simplified for readability)
-  const usageExampleProps = Object.entries(args)
-    .slice(0, 3) // Show first 3 props for brevity
-    .map(([key, value]) => {
-      if (typeof value === 'string') return `${key}="${value}"`;
-      if (typeof value === 'boolean') return value ? key : `${key}={false}`;
-      return `${key}={${JSON.stringify(value)}}`;
-    })
-    .join('\n      ');
-
-  return `---
-title: ${componentName}
-sidebar_label: ${componentName}
----
-
-<!--
-    Licensed to the Apache Software Foundation (ASF) under one
-    or more contributor license agreements.  See the NOTICE file
-    distributed with this work for additional information
-    regarding copyright ownership.  The ASF licenses this file
-    to you under the Apache License, Version 2.0 (the
-    "License"); you may not use this file except in compliance
-    with the License.  You may obtain a copy of the License at
-
-      http://www.apache.org/licenses/LICENSE-2.0
-
-    Unless required by applicable law or agreed to in writing,
-    software distributed under the License is distributed on an
-    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-    KIND, either express or implied.  See the License for the
-    specific language governing permissions and limitations
-    under the License.
--->
-
-import { StoryWithControls } from '../../../src/components/StorybookWrapper';
-import { ${componentName} } from '@apache-superset/core/ui';
-
-# ${componentName}
-
-${description || `The ${componentName} component from the Superset extension 
API.`}
-
-## Live Example
-
-<StoryWithControls
-  component={${componentName}}
-  props={${propsJson}}
-  controls={${controlsJson}}
-/>
-
-## Try It
-
-Edit the code below to experiment with the component:
-
-\`\`\`tsx live
-function Demo() {
-  return (
-    <${componentName}
-      ${liveExampleProps}
-    />
-  );
-}
-\`\`\`
-
-## Props
-
-| Prop | Type | Default | Description |
-|------|------|---------|-------------|
-${propsTable}
-
-## Usage in Extensions
-
-This component is available in the \`${packageName}\` package, which is 
automatically available to Superset extensions.
-
-\`\`\`tsx
-${importPath}
-
-function MyExtension() {
-  return (
-    <${componentName}
-      ${usageExampleProps}
-    />
-  );
-}
-\`\`\`
-
-## Source Links
-
-- [Story file](https://github.com/apache/superset/blob/master/${relativePath})
-- [Component 
source](https://github.com/apache/superset/blob/master/${relativePath.replace(/\/[^/]+\.stories\.tsx$/,
 '/index.tsx')})
-
----
-
-*This page was auto-generated from the component's Storybook story.*
-`;
-}
-
-/**
- * Generate index page for extension components
- */
-function generateIndexMDX(components) {
-  const componentList = components
-    .map(c => `- [${c.componentName}](./${c.componentName.toLowerCase()})`)
-    .join('\n');
-
-  return `---
-title: Extension Components
-sidebar_label: Overview
-sidebar_position: 1
----
-
-<!--
-    Licensed to the Apache Software Foundation (ASF) under one
-    or more contributor license agreements.  See the NOTICE file
-    distributed with this work for additional information
-    regarding copyright ownership.  The ASF licenses this file
-    to you under the Apache License, Version 2.0 (the
-    "License"); you may not use this file except in compliance
-    with the License.  You may obtain a copy of the License at
-
-      http://www.apache.org/licenses/LICENSE-2.0
-
-    Unless required by applicable law or agreed to in writing,
-    software distributed under the License is distributed on an
-    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-    KIND, either express or implied.  See the License for the
-    specific language governing permissions and limitations
-    under the License.
--->
-
-# Extension Components
-
-These UI components are available to Superset extension developers through the 
\`@apache-superset/core/ui\` package. They provide a consistent look and feel 
with the rest of Superset and are designed to be used in extension panels, 
views, and other UI elements.
-
-## Available Components
-
-${componentList}
-
-## Usage
-
-All components are exported from the \`@apache-superset/core/ui\` package:
-
-\`\`\`tsx
-import { Alert } from '@apache-superset/core/ui';
-
-export function MyExtensionPanel() {
-  return (
-    <Alert type="info">
-      Welcome to my extension!
-    </Alert>
-  );
-}
-\`\`\`
-
-## Adding New Components
-
-Components in \`@apache-superset/core/ui\` are automatically documented here. 
To add a new extension component:
-
-1. Add the component to 
\`superset-frontend/packages/superset-core/src/ui/components/\`
-2. Export it from 
\`superset-frontend/packages/superset-core/src/ui/components/index.ts\`
-3. Create a Storybook story with an \`Interactive\` export:
-
-\`\`\`tsx
-export default {
-  title: 'Extension Components/MyComponent',
-  component: MyComponent,
-  parameters: {
-    docs: {
-      description: {
-        component: 'Description of the component...',
-      },
-    },
-  },
-};
-
-export const InteractiveMyComponent = (args) => <MyComponent {...args} />;
-
-InteractiveMyComponent.args = {
-  variant: 'primary',
-  disabled: false,
-};
-
-InteractiveMyComponent.argTypes = {
-  variant: {
-    control: { type: 'select' },
-    options: ['primary', 'secondary'],
-  },
-  disabled: {
-    control: { type: 'boolean' },
-  },
-};
-\`\`\`
-
-4. Run \`yarn start\` in \`docs/\` - the page generates automatically!
-
-## Interactive Documentation
-
-For interactive examples with controls, visit the 
[Storybook](/storybook/?path=/docs/extension-components--docs).
-`;
-}
-
-/**
- * Extract type exports from a component file
- */
-function extractComponentTypes(componentPath) {
-  if (!fs.existsSync(componentPath)) {
-    return null;
-  }
-
-  const content = fs.readFileSync(componentPath, 'utf-8');
-  const types = [];
-
-  // Find all "export type X = ..." declarations
-  const typeMatches = 
content.matchAll(/export\s+type\s+(\w+)\s*=\s*([^;]+);/g);
-  for (const match of typeMatches) {
-    types.push({
-      name: match[1],
-      definition: match[2].trim(),
-    });
-  }
-
-  // Find all "export const X = ..." declarations (components)
-  const constMatches = content.matchAll(/export\s+const\s+(\w+)\s*[=:]/g);
-  const components = [];
-  for (const match of constMatches) {
-    components.push(match[1]);
-  }
-
-  return { types, components };
-}
-
-/**
- * Generate the type declarations file content
- */
-function generateTypeDeclarations(componentInfos) {
-  const imports = new Set();
-  const typeDeclarations = [];
-  const componentDeclarations = [];
-
-  for (const info of componentInfos) {
-    const componentDir = path.dirname(info.filePath);
-    const componentFile = path.join(componentDir, 'index.tsx');
-    const extracted = extractComponentTypes(componentFile);
-
-    if (!extracted) continue;
-
-    // Check if types reference antd or react
-    for (const type of extracted.types) {
-      if (type.definition.includes('AntdAlertProps') || 
type.definition.includes('AlertProps')) {
-        imports.add("import type { AlertProps as AntdAlertProps } from 
'antd/es/alert';");
-      }
-      if (type.definition.includes('PropsWithChildren') || 
type.definition.includes('FC')) {
-        imports.add("import type { PropsWithChildren, FC } from 'react';");
-      }
-
-      // Add the type declaration
-      typeDeclarations.push(`  export type ${type.name} = 
${type.definition};`);
-    }
-
-    // Add component declarations
-    for (const comp of extracted.components) {
-      const propsType = `${comp}Props`;
-      const hasPropsType = extracted.types.some(t => t.name === propsType);
-      if (hasPropsType) {
-        componentDeclarations.push(`  export const ${comp}: 
FC<${propsType}>;`);
-      } else {
-        componentDeclarations.push(`  export const ${comp}: FC<Record<string, 
unknown>>;`);
-      }
-    }
-  }
-
-  // Remove 'export' prefix for direct exports (not in declare module)
-  const cleanedTypes = typeDeclarations.map(t => t.replace(/^ {2}export /, 
'export '));
-  const cleanedComponents = componentDeclarations.map(c => c.replace(/^ 
{2}export /, 'export '));
-
-  return `/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-/**
- * Type declarations for @apache-superset/core/ui
- *
- * AUTO-GENERATED by scripts/generate-extension-components.mjs
- * Do not edit manually - regenerate by running: yarn 
generate:extension-components
- */
-${Array.from(imports).join('\n')}
-
-${cleanedTypes.join('\n')}
-
-${cleanedComponents.join('\n')}
-`;
-}
-
-/**
- * Main function
- */
-async function main() {
-  console.log('Scanning for extension-compatible stories...\n');
-
-  // Find all story files
-  const storyFiles = await findStoryFiles();
-  console.log(`Found ${storyFiles.length} story files in superset-core\n`);
-
-  // Parse each story file
-  const components = [];
-  for (const file of storyFiles) {
-    const parsed = parseStoryFile(file);
-    if (parsed) {
-      components.push(parsed);
-      console.log(`  ✓ ${parsed.componentName} (${parsed.relativePath})`);
-    }
-  }
-
-  if (components.length === 0) {
-    console.log(
-      '\nNo extension-compatible components found. Make sure stories have:'
-    );
-    console.log("  tags: ['extension-compatible']");
-    return;
-  }
-
-  console.log(`\nFound ${components.length} extension-compatible 
components\n`);
-
-  // Ensure output directory exists
-  if (!fs.existsSync(OUTPUT_DIR)) {
-    fs.mkdirSync(OUTPUT_DIR, { recursive: true });
-    console.log(`Created directory: ${OUTPUT_DIR}\n`);
-  }
-
-  // Generate MDX files
-  for (const component of components) {
-    // Read the story content for extracting args/controls
-    const storyContent = fs.readFileSync(component.filePath, 'utf-8');
-    const mdxContent = generateMDX(component, storyContent);
-    const outputPath = path.join(
-      OUTPUT_DIR,
-      `${component.componentName.toLowerCase()}.mdx`
-    );
-    fs.writeFileSync(outputPath, mdxContent);
-    console.log(`  Generated: ${path.relative(DOCS_DIR, outputPath)}`);
-  }
-
-  // Generate index page
-  const indexContent = generateIndexMDX(components);
-  const indexPath = path.join(OUTPUT_DIR, 'index.mdx');
-  fs.writeFileSync(indexPath, indexContent);
-  console.log(`  Generated: ${path.relative(DOCS_DIR, indexPath)}`);
-
-  // Generate type declarations
-  if (!fs.existsSync(TYPES_OUTPUT_DIR)) {
-    fs.mkdirSync(TYPES_OUTPUT_DIR, { recursive: true });
-  }
-  const typesContent = generateTypeDeclarations(components);
-  fs.writeFileSync(TYPES_OUTPUT_PATH, typesContent);
-  console.log(`  Generated: ${path.relative(DOCS_DIR, TYPES_OUTPUT_PATH)}`);
-
-  console.log('\nDone! Extension component documentation generated.');
-  console.log(
-    `\nGenerated ${components.length + 2} files (${components.length + 1} MDX 
+ 1 type declaration)`
-  );
-}
-
-main().catch(console.error);
diff --git a/docs/scripts/generate-if-changed.mjs 
b/docs/scripts/generate-if-changed.mjs
new file mode 100644
index 00000000000..b44d5e77ff5
--- /dev/null
+++ b/docs/scripts/generate-if-changed.mjs
@@ -0,0 +1,307 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+/**
+ * Smart generator wrapper: only runs generators whose input files have 
changed.
+ *
+ * Computes a hash of each generator's input files (stories, engine specs,
+ * openapi.json, and the generator scripts themselves). Compares against a
+ * stored cache. Skips generators whose inputs and outputs are unchanged.
+ *
+ * Usage:
+ *   node scripts/generate-if-changed.mjs          # smart mode (default)
+ *   node scripts/generate-if-changed.mjs --force   # force regenerate all
+ */
+
+import { createHash } from 'crypto';
+import { execSync, spawn } from 'child_process';
+import fs from 'fs';
+import path from 'path';
+import { fileURLToPath } from 'url';
+
+const __filename = fileURLToPath(import.meta.url);
+const __dirname = path.dirname(__filename);
+const DOCS_DIR = path.resolve(__dirname, '..');
+const ROOT_DIR = path.resolve(DOCS_DIR, '..');
+const CACHE_FILE = path.join(DOCS_DIR, '.docusaurus', 'generator-hashes.json');
+
+const FORCE = process.argv.includes('--force');
+
+// Ensure local node_modules/.bin is on PATH (needed for docusaurus CLI)
+const localBin = path.join(DOCS_DIR, 'node_modules', '.bin');
+process.env.PATH = `${localBin}${path.delimiter}${process.env.PATH}`;
+
+// ---------------------------------------------------------------------------
+// Generator definitions
+// ---------------------------------------------------------------------------
+
+const GENERATORS = [
+  {
+    name: 'superset-components',
+    command: 'node scripts/generate-superset-components.mjs',
+    inputs: [
+      {
+        type: 'glob',
+        base: path.join(ROOT_DIR, 
'superset-frontend/packages/superset-ui-core/src/components'),
+        pattern: '**/*.stories.tsx',
+      },
+      {
+        type: 'glob',
+        base: path.join(ROOT_DIR, 
'superset-frontend/packages/superset-core/src'),
+        pattern: '**/*.stories.tsx',
+      },
+      { type: 'file', path: path.join(DOCS_DIR, 
'scripts/generate-superset-components.mjs') },
+      { type: 'file', path: path.join(DOCS_DIR, 
'src/components/StorybookWrapper.jsx') },
+    ],
+    outputs: [
+      path.join(DOCS_DIR, 'developer_docs/components/index.mdx'),
+      path.join(DOCS_DIR, 'static/data/components.json'),
+      path.join(DOCS_DIR, 'src/types/apache-superset-core/index.d.ts'),
+    ],
+  },
+  {
+    name: 'database-docs',
+    command: 'node scripts/generate-database-docs.mjs',
+    inputs: [
+      {
+        type: 'glob',
+        base: path.join(ROOT_DIR, 'superset/db_engine_specs'),
+        pattern: '**/*.py',
+      },
+      { type: 'file', path: path.join(DOCS_DIR, 
'scripts/generate-database-docs.mjs') },
+    ],
+    outputs: [
+      path.join(DOCS_DIR, 'src/data/databases.json'),
+      path.join(DOCS_DIR, 'docs/databases/supported'),
+    ],
+  },
+  {
+    name: 'api-docs',
+    command:
+      'python3 scripts/fix-openapi-spec.py && docusaurus gen-api-docs superset 
&& node scripts/convert-api-sidebar.mjs && node scripts/generate-api-index.mjs 
&& node scripts/generate-api-tag-pages.mjs',
+    inputs: [
+      { type: 'file', path: path.join(DOCS_DIR, 
'static/resources/openapi.json') },
+      { type: 'file', path: path.join(DOCS_DIR, 'scripts/fix-openapi-spec.py') 
},
+      { type: 'file', path: path.join(DOCS_DIR, 
'scripts/convert-api-sidebar.mjs') },
+      { type: 'file', path: path.join(DOCS_DIR, 
'scripts/generate-api-index.mjs') },
+      { type: 'file', path: path.join(DOCS_DIR, 
'scripts/generate-api-tag-pages.mjs') },
+    ],
+    outputs: [
+      path.join(DOCS_DIR, 'docs/api.mdx'),
+    ],
+  },
+];
+
+// ---------------------------------------------------------------------------
+// Hashing utilities
+// ---------------------------------------------------------------------------
+
+function walkDir(dir, pattern) {
+  const results = [];
+  if (!fs.existsSync(dir)) return results;
+
+  const regex = globToRegex(pattern);
+  function walk(currentDir) {
+    for (const entry of fs.readdirSync(currentDir, { withFileTypes: true })) {
+      const fullPath = path.join(currentDir, entry.name);
+      if (entry.isDirectory()) {
+        if (entry.name === 'node_modules' || entry.name === '__pycache__') 
continue;
+        walk(fullPath);
+      } else {
+        // Normalize to forward slashes so glob patterns work on all platforms
+        const relativePath = path.relative(dir, 
fullPath).split(path.sep).join('/');
+        if (regex.test(relativePath)) {
+          results.push(fullPath);
+        }
+      }
+    }
+  }
+  walk(dir);
+  return results.sort();
+}
+
+function globToRegex(pattern) {
+  // Simple glob-to-regex: ** matches any path, * matches anything except /
+  const escaped = pattern
+    .replace(/[.+^${}()|[\]\\]/g, '\\$&')
+    .replace(/\*\*/g, '<<<GLOBSTAR>>>')
+    .replace(/\*/g, '[^/]*')
+    .replace(/<<<GLOBSTAR>>>/g, '.*');
+  return new RegExp(`^${escaped}$`);
+}
+
+function hashFile(filePath) {
+  if (!fs.existsSync(filePath)) return 'missing';
+  const stat = fs.statSync(filePath);
+  // Use mtime + size for speed (avoids reading file contents)
+  return `${stat.mtimeMs}:${stat.size}`;
+}
+
+function computeInputHash(inputs) {
+  const hash = createHash('md5');
+  for (const input of inputs) {
+    if (input.type === 'file') {
+      hash.update(`file:${input.path}:${hashFile(input.path)}\n`);
+    } else if (input.type === 'glob') {
+      const files = walkDir(input.base, input.pattern);
+      
hash.update(`glob:${input.base}:${input.pattern}:count=${files.length}\n`);
+      for (const file of files) {
+        hash.update(`  ${path.relative(input.base, 
file)}:${hashFile(file)}\n`);
+      }
+    }
+  }
+  return hash.digest('hex');
+}
+
+function outputsExist(outputs) {
+  return outputs.every((p) => fs.existsSync(p));
+}
+
+// ---------------------------------------------------------------------------
+// Cache management
+// ---------------------------------------------------------------------------
+
+function loadCache() {
+  try {
+    if (fs.existsSync(CACHE_FILE)) {
+      return JSON.parse(fs.readFileSync(CACHE_FILE, 'utf8'));
+    }
+  } catch {
+    // Corrupted cache — start fresh
+  }
+  return {};
+}
+
+function saveCache(cache) {
+  const dir = path.dirname(CACHE_FILE);
+  if (!fs.existsSync(dir)) {
+    fs.mkdirSync(dir, { recursive: true });
+  }
+  fs.writeFileSync(CACHE_FILE, JSON.stringify(cache, null, 2));
+}
+
+// ---------------------------------------------------------------------------
+// Main
+// ---------------------------------------------------------------------------
+
+async function main() {
+  const cache = loadCache();
+  const updatedCache = { ...cache };
+  let skipped = 0;
+  let ran = 0;
+
+  // First pass: determine which generators need to run
+  // Run independent generators (superset-components, database-docs) in
+  // parallel, then api-docs sequentially (it depends on docusaurus CLI
+  // being available, not on other generators).
+
+  const independent = GENERATORS.filter((g) => g.name !== 'api-docs');
+  const sequential = GENERATORS.filter((g) => g.name === 'api-docs');
+
+  // Check and run independent generators in parallel
+  const parallelPromises = independent.map((gen) => {
+    const currentHash = computeInputHash(gen.inputs);
+    const cachedHash = cache[gen.name];
+    const hasOutputs = outputsExist(gen.outputs);
+
+    if (!FORCE && currentHash === cachedHash && hasOutputs) {
+      console.log(`  ✓ ${gen.name} — no changes, skipping`);
+      skipped++;
+      return Promise.resolve();
+    }
+
+    const reason = FORCE
+      ? 'forced'
+      : !hasOutputs
+        ? 'output missing'
+        : 'inputs changed';
+    console.log(`  ↻ ${gen.name} — ${reason}, regenerating...`);
+    ran++;
+
+    return new Promise((resolve, reject) => {
+      const child = spawn('sh', ['-c', gen.command], {
+        cwd: DOCS_DIR,
+        stdio: 'inherit',
+        env: process.env,
+      });
+      child.on('close', (code) => {
+        if (code === 0) {
+          updatedCache[gen.name] = currentHash;
+          resolve();
+        } else {
+          console.error(`  ✗ ${gen.name} failed (exit ${code})`);
+          reject(new Error(`${gen.name} failed with exit code ${code}`));
+        }
+      });
+      child.on('error', (err) => {
+        console.error(`  ✗ ${gen.name} failed to start`);
+        reject(err);
+      });
+    });
+  });
+
+  await Promise.all(parallelPromises);
+
+  // Run sequential generators (api-docs)
+  for (const gen of sequential) {
+    const currentHash = computeInputHash(gen.inputs);
+    const cachedHash = cache[gen.name];
+    const hasOutputs = outputsExist(gen.outputs);
+
+    if (!FORCE && currentHash === cachedHash && hasOutputs) {
+      console.log(`  ✓ ${gen.name} — no changes, skipping`);
+      skipped++;
+      continue;
+    }
+
+    const reason = FORCE
+      ? 'forced'
+      : !hasOutputs
+        ? 'output missing'
+        : 'inputs changed';
+    console.log(`  ↻ ${gen.name} — ${reason}, regenerating...`);
+    ran++;
+
+    try {
+      execSync(gen.command, {
+        cwd: DOCS_DIR,
+        stdio: 'inherit',
+        timeout: 300_000,
+      });
+      updatedCache[gen.name] = currentHash;
+    } catch (err) {
+      console.error(`  ✗ ${gen.name} failed`);
+      throw err;
+    }
+  }
+
+  saveCache(updatedCache);
+
+  if (ran === 0) {
+    console.log(`\nAll ${skipped} generators up-to-date — nothing to do!\n`);
+  } else {
+    console.log(`\nDone: ${ran} regenerated, ${skipped} skipped.\n`);
+  }
+}
+
+console.log('Checking generators for changes...\n');
+main().catch((err) => {
+  console.error(err);
+  process.exit(1);
+});
diff --git a/docs/scripts/generate-superset-components.mjs 
b/docs/scripts/generate-superset-components.mjs
index a85a49bef0a..55ee639293f 100644
--- a/docs/scripts/generate-superset-components.mjs
+++ b/docs/scripts/generate-superset-components.mjs
@@ -58,7 +58,10 @@ const __filename = fileURLToPath(import.meta.url);
 const __dirname = path.dirname(__filename);
 const ROOT_DIR = path.resolve(__dirname, '../..');
 const DOCS_DIR = path.resolve(__dirname, '..');
-const OUTPUT_DIR = path.join(DOCS_DIR, 'developer_portal/components');
+const OUTPUT_DIR = path.join(DOCS_DIR, 'developer_docs/components');
+const JSON_OUTPUT_PATH = path.join(DOCS_DIR, 'static/data/components.json');
+const TYPES_OUTPUT_DIR = path.join(DOCS_DIR, 'src/types/apache-superset-core');
+const TYPES_OUTPUT_PATH = path.join(TYPES_OUTPUT_DIR, 'index.d.ts');
 const FRONTEND_DIR = path.join(ROOT_DIR, 'superset-frontend');
 
 // Source configurations with import paths and categories
@@ -146,6 +149,16 @@ const SOURCES = [
     enabled: false, // Requires specific setup
     skipComponents: new Set([]),
   },
+  {
+    name: 'Extension Components',
+    path: 'packages/superset-core/src',
+    importPrefix: '@apache-superset/core/ui',
+    docImportPrefix: '@apache-superset/core/ui',
+    category: 'extension',
+    enabled: true,
+    extensionCompatible: true,
+    skipComponents: new Set([]),
+  },
 ];
 
 // Category mapping from story title prefixes to output directories
@@ -156,7 +169,7 @@ const CATEGORY_MAP = {
   'Legacy Chart Plugins/': 'legacy-charts',
   'Core Packages/': 'core-packages',
   'Others/': 'utilities',
-  'Extension Components/': 'extension', // Skip - handled by other script
+  'Extension Components/': 'extension',
   'Superset App/': 'app',
 };
 
@@ -334,6 +347,7 @@ function parseStoryFile(filePath, sourceConfig) {
     sourceConfig,
     resolvedImportPath,
     isDefaultExport,
+    extensionCompatible: Boolean(sourceConfig.extensionCompatible),
   };
 }
 
@@ -1141,6 +1155,7 @@ Help improve it by [editing the story 
file](https://github.com/apache/superset/e
 const CATEGORY_LABELS = {
   ui: { title: 'Core Components', sidebarLabel: 'Core Components', 
description: 'Buttons, inputs, modals, selects, and other fundamental UI 
elements.' },
   'design-system': { title: 'Layout Components', sidebarLabel: 'Layout 
Components', description: 'Grid, Layout, Table, Flex, Space, and container 
components for page structure.' },
+  extension: { title: 'Extension Components', sidebarLabel: 'Extension 
Components', description: 'Components available to extension developers via 
@apache-superset/core/ui.' },
 };
 
 /**
@@ -1194,20 +1209,7 @@ ${componentList}
 /**
  * Generate main overview page
  */
-function generateOverviewIndex(categories) {
-  const categoryList = Object.entries(categories)
-    .filter(([, components]) => components.length > 0)
-    .map(([cat, components]) => {
-      const labels = CATEGORY_LABELS[cat] || {
-        title: cat.charAt(0).toUpperCase() + cat.slice(1).replace(/-/g, ' '),
-      };
-      const desc = labels.description ? ` ${labels.description}` : '';
-      return `### [${labels.title}](./${cat}/)\n${components.length} 
components —${desc}\n`;
-    })
-    .join('\n');
-
-  const totalComponents = Object.values(categories).reduce((sum, c) => sum + 
c.length, 0);
-
+function generateOverviewIndex() {
   return `---
 title: UI Components Overview
 sidebar_label: Overview
@@ -1233,7 +1235,16 @@ sidebar_position: 0
     under the License.
 -->
 
-# Superset Design System
+import { ComponentIndex } from '@site/src/components/ui-components';
+import componentData from '@site/static/data/components.json';
+
+# UI Components
+
+<ComponentIndex data={componentData} />
+
+---
+
+## Design System
 
 A design system is a complete set of standards intended to manage design at 
scale using reusable components and patterns.
 
@@ -1245,14 +1256,6 @@ The Superset Design System uses [Atomic 
Design](https://bradfrost.com/blog/post/
 
 <img src="/img/atomic-design.png" alt="Atoms = Foundations, Molecules = 
Components, Organisms = Patterns, Templates = Templates, Pages / Screens = 
Features" style={{maxWidth: '100%'}} />
 
----
-
-## Component Library
-
-Interactive documentation for Superset's UI component library. 
**${totalComponents} components** documented across 
${Object.keys(categories).filter(k => categories[k].length > 0).length} 
categories.
-
-${categoryList}
-
 ## Usage
 
 All components are exported from \`@superset-ui/core/components\`:
@@ -1332,6 +1335,147 @@ ${sections}
 `;
 }
 
+/**
+ * Build metadata for a component (for JSON output)
+ */
+function buildComponentMetadata(component, storyContent) {
+  const { componentName, description, category, sourceConfig, 
resolvedImportPath, extensionCompatible } = component;
+  const { args, controls, gallery, liveExample } = 
extractArgsAndControls(storyContent, componentName);
+  const labels = CATEGORY_LABELS[category] || {
+    title: category.charAt(0).toUpperCase() + category.slice(1).replace(/-/g, 
' '),
+  };
+
+  return {
+    name: componentName,
+    category,
+    categoryLabel: labels.title || category,
+    description: description || '',
+    importPath: resolvedImportPath || sourceConfig.importPrefix,
+    package: sourceConfig.docImportPrefix,
+    extensionCompatible: Boolean(extensionCompatible),
+    propsCount: Object.keys(args).length,
+    controlsCount: controls.length,
+    hasGallery: Boolean(gallery && gallery.sizes && gallery.styles),
+    hasLiveExample: Boolean(liveExample),
+    docPath: 
`developer-docs/components/${category}/${componentName.toLowerCase()}`,
+    storyFile: component.relativePath,
+  };
+}
+
+/**
+ * Extract type and component export declarations from a component source file.
+ * Used to generate .d.ts type declarations for extension-compatible 
components.
+ */
+function extractComponentTypes(componentPath) {
+  if (!fs.existsSync(componentPath)) return null;
+  const content = fs.readFileSync(componentPath, 'utf-8');
+
+  const types = [];
+  // Match "export type Name = <definition>;" handling nested braces
+  // so object types like { a: string; b: number } are captured fully.
+  const typeRegex = /export\s+type\s+(\w+)\s*=\s*/g;
+  let typeMatch;
+  while ((typeMatch = typeRegex.exec(content)) !== null) {
+    const start = typeMatch.index + typeMatch[0].length;
+    let depth = 0;
+    let end = start;
+    for (let i = start; i < content.length; i++) {
+      const ch = content[i];
+      if (ch === '{' || ch === '<' || ch === '(') depth++;
+      else if (ch === '}' || ch === '>' || ch === ')') depth--;
+      else if (ch === ';' && depth === 0) {
+        end = i;
+        break;
+      }
+    }
+    const definition = content.slice(start, end).trim();
+    if (definition) {
+      types.push({ name: typeMatch[1], definition });
+    }
+  }
+
+  const components = [];
+  for (const match of content.matchAll(/export\s+const\s+(\w+)\s*[=:]/g)) {
+    components.push(match[1]);
+  }
+
+  return { types, components };
+}
+
+/**
+ * Generate TypeScript type declarations for extension-compatible components.
+ * Produces a .d.ts file that downstream consumers can reference.
+ */
+function generateExtensionTypeDeclarations(extensionComponents) {
+  const imports = new Set();
+  const typeDeclarations = [];
+  const componentDeclarations = [];
+
+  for (const comp of extensionComponents) {
+    const componentDir = path.dirname(comp.filePath);
+    const componentFile = path.join(componentDir, 'index.tsx');
+    const extracted = extractComponentTypes(componentFile);
+    if (!extracted) continue;
+
+    for (const type of extracted.types) {
+      if (type.definition.includes('AntdAlertProps') || 
type.definition.includes('AlertProps')) {
+        imports.add("import type { AlertProps as AntdAlertProps } from 
'antd/es/alert';");
+      }
+      if (type.definition.includes('PropsWithChildren') || 
type.definition.includes('FC')) {
+        imports.add("import type { PropsWithChildren, FC } from 'react';");
+      }
+      typeDeclarations.push(`export type ${type.name} = ${type.definition};`);
+    }
+
+    for (const name of extracted.components) {
+      const propsType = `${name}Props`;
+      const hasPropsType = extracted.types.some(t => t.name === propsType);
+      componentDeclarations.push(
+        hasPropsType
+          ? `export const ${name}: FC<${propsType}>;`
+          : `export const ${name}: FC<Record<string, unknown>>;`
+      );
+    }
+  }
+
+  // Always import FC when we have component declarations that reference it
+  if (componentDeclarations.length > 0) {
+    imports.add("import type { PropsWithChildren, FC } from 'react';");
+  }
+
+  return `/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+/**
+ * Type declarations for @apache-superset/core/ui
+ *
+ * AUTO-GENERATED by scripts/generate-superset-components.mjs
+ * Do not edit manually - regenerate by running: yarn 
generate:superset-components
+ */
+${Array.from(imports).join('\n')}
+
+${typeDeclarations.join('\n')}
+
+${componentDeclarations.join('\n')}
+`;
+}
+
 /**
  * Main function
  */
@@ -1396,8 +1540,53 @@ async function main() {
     console.log(`  ✓ ${category}/index`);
   }
 
+  // Build JSON metadata for all components
+  console.log('\nBuilding component metadata JSON...');
+  const componentMetadata = [];
+  for (const component of components) {
+    const storyContent = fs.readFileSync(component.filePath, 'utf-8');
+    componentMetadata.push(buildComponentMetadata(component, storyContent));
+  }
+
+  // Build statistics
+  const byCategory = {};
+  for (const comp of componentMetadata) {
+    if (!byCategory[comp.category]) byCategory[comp.category] = 0;
+    byCategory[comp.category]++;
+  }
+  const jsonData = {
+    generated: new Date().toISOString(),
+    statistics: {
+      totalComponents: componentMetadata.length,
+      byCategory,
+      extensionCompatible: componentMetadata.filter(c => 
c.extensionCompatible).length,
+      withGallery: componentMetadata.filter(c => c.hasGallery).length,
+      withLiveExample: componentMetadata.filter(c => c.hasLiveExample).length,
+    },
+    components: componentMetadata,
+  };
+
+  // Ensure data directory exists and write JSON
+  const jsonDir = path.dirname(JSON_OUTPUT_PATH);
+  if (!fs.existsSync(jsonDir)) {
+    fs.mkdirSync(jsonDir, { recursive: true });
+  }
+  fs.writeFileSync(JSON_OUTPUT_PATH, JSON.stringify(jsonData, null, 2));
+  console.log(`  ✓ components.json (${componentMetadata.length} components)`);
+
+  // Generate type declarations for extension-compatible components
+  const extensionComponents = components.filter(c => c.extensionCompatible);
+  if (extensionComponents.length > 0) {
+    if (!fs.existsSync(TYPES_OUTPUT_DIR)) {
+      fs.mkdirSync(TYPES_OUTPUT_DIR, { recursive: true });
+    }
+    const typesContent = 
generateExtensionTypeDeclarations(extensionComponents);
+    fs.writeFileSync(TYPES_OUTPUT_PATH, typesContent);
+    console.log(`  ✓ extension types (${extensionComponents.length} 
components)`);
+  }
+
   // Generate main overview
-  const overviewContent = generateOverviewIndex(categories);
+  const overviewContent = generateOverviewIndex();
   const overviewPath = path.join(OUTPUT_DIR, 'index.mdx');
   fs.writeFileSync(overviewPath, overviewContent);
   console.log(`  ✓ index (overview)`);
diff --git a/docs/sidebarTutorials.js b/docs/sidebarTutorials.js
index 77839807ade..807b1976091 100644
--- a/docs/sidebarTutorials.js
+++ b/docs/sidebarTutorials.js
@@ -75,17 +75,6 @@ const sidebars = {
         'extensions/architecture',
         'extensions/dependencies',
         'extensions/contribution-types',
-        {
-          type: 'category',
-          label: 'Components',
-          collapsed: true,
-          items: [
-            {
-              type: 'autogenerated',
-              dirName: 'extensions/components',
-            },
-          ],
-        },
         {
           type: 'category',
           label: 'Extension Points',
diff --git a/docs/src/components/databases/DatabaseIndex.tsx 
b/docs/src/components/databases/DatabaseIndex.tsx
index 26f71522dfc..91c58964a31 100644
--- a/docs/src/components/databases/DatabaseIndex.tsx
+++ b/docs/src/components/databases/DatabaseIndex.tsx
@@ -496,6 +496,7 @@ const DatabaseIndex: React.FC<DatabaseIndexProps> = ({ data 
}) => {
 
   return (
     <div className="database-index">
+      {/* Statistics Cards */}
       {/* Statistics Cards */}
       <Row gutter={[16, 16]} style={{ marginBottom: 24 }}>
         <Col xs={12} sm={6}>
diff --git a/docs/src/components/ui-components/ComponentIndex.tsx 
b/docs/src/components/ui-components/ComponentIndex.tsx
new file mode 100644
index 00000000000..180a67ea2db
--- /dev/null
+++ b/docs/src/components/ui-components/ComponentIndex.tsx
@@ -0,0 +1,262 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import React, { useState, useMemo } from 'react';
+import { Card, Row, Col, Statistic, Table, Tag, Input, Select } from 'antd';
+import {
+  AppstoreOutlined,
+  ApiOutlined,
+  PictureOutlined,
+  PlayCircleOutlined,
+  SearchOutlined,
+} from '@ant-design/icons';
+import type { ComponentData, ComponentEntry } from './types';
+
+interface ComponentIndexProps {
+  data: ComponentData;
+}
+
+const CATEGORY_COLORS: Record<string, string> = {
+  ui: 'blue',
+  'design-system': 'green',
+  extension: 'purple',
+};
+
+const CATEGORY_LABELS: Record<string, string> = {
+  ui: 'Core',
+  'design-system': 'Layout',
+  extension: 'Extension',
+};
+
+const ComponentIndex: React.FC<ComponentIndexProps> = ({ data }) => {
+  const [searchText, setSearchText] = useState('');
+  const [categoryFilter, setCategoryFilter] = useState<string | null>(null);
+
+  const { statistics, components } = data;
+
+  const filteredComponents = useMemo(() => {
+    return components
+      .filter((comp) => {
+        const matchesSearch =
+          !searchText ||
+          comp.name.toLowerCase().includes(searchText.toLowerCase()) ||
+          comp.description.toLowerCase().includes(searchText.toLowerCase()) ||
+          comp.package.toLowerCase().includes(searchText.toLowerCase());
+        const matchesCategory =
+          !categoryFilter || comp.category === categoryFilter;
+        return matchesSearch && matchesCategory;
+      })
+      .sort((a, b) => a.name.localeCompare(b.name));
+  }, [components, searchText, categoryFilter]);
+
+  const { categories, categoryCounts } = useMemo(() => {
+    const counts: Record<string, number> = {};
+    components.forEach((comp) => {
+      counts[comp.category] = (counts[comp.category] || 0) + 1;
+    });
+    return {
+      categories: Object.keys(counts).sort(),
+      categoryCounts: counts,
+    };
+  }, [components]);
+
+  const columns = [
+    {
+      title: 'Component',
+      dataIndex: 'name',
+      key: 'name',
+      sorter: (a: ComponentEntry, b: ComponentEntry) =>
+        a.name.localeCompare(b.name),
+      defaultSortOrder: 'ascend' as const,
+      render: (name: string, record: ComponentEntry) => (
+        <div>
+          <a href={`/${record.docPath}`}>
+            <strong>{name}</strong>
+          </a>
+          {record.description && (
+            <div style={{ fontSize: '12px', color: '#666' }}>
+              {record.description.slice(0, 100)}
+              {record.description.length > 100 ? '...' : ''}
+            </div>
+          )}
+        </div>
+      ),
+    },
+    {
+      title: 'Category',
+      dataIndex: 'category',
+      key: 'category',
+      width: 120,
+      filters: categories.map((cat) => ({
+        text: CATEGORY_LABELS[cat] || cat,
+        value: cat,
+      })),
+      onFilter: (value: React.Key | boolean, record: ComponentEntry) =>
+        record.category === value,
+      render: (cat: string) => (
+        <Tag color={CATEGORY_COLORS[cat] || 'default'}>
+          {CATEGORY_LABELS[cat] || cat}
+        </Tag>
+      ),
+    },
+    {
+      title: 'Package',
+      dataIndex: 'package',
+      key: 'package',
+      width: 220,
+      render: (pkg: string) => (
+        <code style={{ fontSize: '12px' }}>{pkg}</code>
+      ),
+    },
+    {
+      title: 'Tags',
+      key: 'tags',
+      width: 280,
+      filters: [
+        { text: 'Extension Compatible', value: 'extension' },
+        { text: 'Gallery', value: 'gallery' },
+        { text: 'Live Demo', value: 'demo' },
+      ],
+      onFilter: (value: React.Key | boolean, record: ComponentEntry) => {
+        switch (value) {
+          case 'extension':
+            return record.extensionCompatible;
+          case 'gallery':
+            return record.hasGallery;
+          case 'demo':
+            return record.hasLiveExample;
+          default:
+            return true;
+        }
+      },
+      render: (_: unknown, record: ComponentEntry) => (
+        <div style={{ display: 'flex', gap: '4px', flexWrap: 'wrap' }}>
+          {record.extensionCompatible && (
+            <Tag color="purple">Extension Compatible</Tag>
+          )}
+          {record.hasGallery && <Tag color="cyan">Gallery</Tag>}
+          {record.hasLiveExample && <Tag color="green">Demo</Tag>}
+        </div>
+      ),
+    },
+    {
+      title: 'Props',
+      dataIndex: 'propsCount',
+      key: 'propsCount',
+      width: 80,
+      sorter: (a: ComponentEntry, b: ComponentEntry) =>
+        a.propsCount - b.propsCount,
+      render: (count: number) => (
+        <span style={{ color: count > 0 ? '#1890ff' : '#999' }}>{count}</span>
+      ),
+    },
+  ];
+
+  return (
+    <div className="component-index">
+      <Row gutter={[16, 16]} style={{ marginBottom: 24 }}>
+        <Col xs={12} sm={6}>
+          <Card>
+            <Statistic
+              title="Total Components"
+              value={statistics.totalComponents}
+              prefix={<AppstoreOutlined />}
+            />
+          </Card>
+        </Col>
+        <Col xs={12} sm={6}>
+          <Card>
+            <Statistic
+              title="Extension Compatible"
+              value={statistics.extensionCompatible}
+              prefix={<ApiOutlined />}
+            />
+          </Card>
+        </Col>
+        <Col xs={12} sm={6}>
+          <Card>
+            <Statistic
+              title="With Gallery"
+              value={statistics.withGallery}
+              prefix={<PictureOutlined />}
+            />
+          </Card>
+        </Col>
+        <Col xs={12} sm={6}>
+          <Card>
+            <Statistic
+              title="With Live Demo"
+              value={statistics.withLiveExample}
+              prefix={<PlayCircleOutlined />}
+            />
+          </Card>
+        </Col>
+      </Row>
+
+      <Row gutter={[16, 16]} style={{ marginBottom: 16 }}>
+        <Col xs={24} sm={12}>
+          <Input
+            placeholder="Search components..."
+            prefix={<SearchOutlined />}
+            value={searchText}
+            onChange={(e) => setSearchText(e.target.value)}
+            allowClear
+          />
+        </Col>
+        <Col xs={24} sm={12}>
+          <Select
+            placeholder="Filter by category"
+            style={{ width: '100%' }}
+            value={categoryFilter}
+            onChange={setCategoryFilter}
+            allowClear
+            options={categories.map((cat) => ({
+              label: (
+                <span>
+                  <Tag
+                    color={CATEGORY_COLORS[cat] || 'default'}
+                    style={{ marginRight: 8 }}
+                  >
+                    {categoryCounts[cat] || 0}
+                  </Tag>
+                  {CATEGORY_LABELS[cat] || cat}
+                </span>
+              ),
+              value: cat,
+            }))}
+          />
+        </Col>
+      </Row>
+
+      <Table
+        dataSource={filteredComponents}
+        columns={columns}
+        rowKey="name"
+        pagination={{
+          defaultPageSize: 20,
+          showSizeChanger: true,
+          showTotal: (total) => `${total} components`,
+        }}
+        size="middle"
+      />
+    </div>
+  );
+};
+
+export default ComponentIndex;
diff --git a/docs/babel.config.js b/docs/src/components/ui-components/index.ts
similarity index 75%
rename from docs/babel.config.js
rename to docs/src/components/ui-components/index.ts
index 61032e678a4..2081775d7dc 100644
--- a/docs/babel.config.js
+++ b/docs/src/components/ui-components/index.ts
@@ -1,4 +1,3 @@
-/* eslint-env node */
 /**
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
@@ -18,15 +17,5 @@
  * under the License.
  */
 
-module.exports = {
-  presets: [
-    [
-      require.resolve('@docusaurus/core/lib/babel/preset'),
-      {
-        runtime: 'automatic',
-        importSource: '@emotion/react',
-      },
-    ],
-  ],
-  plugins: ['@emotion/babel-plugin'],
-};
+export { default as ComponentIndex } from './ComponentIndex';
+export * from './types';
diff --git a/docs/src/types/apache-superset-core/index.d.ts 
b/docs/src/components/ui-components/types.ts
similarity index 55%
copy from docs/src/types/apache-superset-core/index.d.ts
copy to docs/src/components/ui-components/types.ts
index 5650b85bb2c..f4fb082b065 100644
--- a/docs/src/types/apache-superset-core/index.d.ts
+++ b/docs/src/components/ui-components/types.ts
@@ -17,15 +17,32 @@
  * under the License.
  */
 
-/**
- * Type declarations for @apache-superset/core/ui
- *
- * AUTO-GENERATED by scripts/generate-extension-components.mjs
- * Do not edit manually - regenerate by running: yarn 
generate:extension-components
- */
-import type { AlertProps as AntdAlertProps } from 'antd/es/alert';
-import type { PropsWithChildren, FC } from 'react';
+export interface ComponentEntry {
+  name: string;
+  category: string;
+  categoryLabel: string;
+  description: string;
+  importPath: string;
+  package: string;
+  extensionCompatible: boolean;
+  propsCount: number;
+  controlsCount: number;
+  hasGallery: boolean;
+  hasLiveExample: boolean;
+  docPath: string;
+  storyFile: string;
+}
 
-export type AlertProps = PropsWithChildren<Omit<AntdAlertProps, 'children'>>;
+export interface ComponentStatistics {
+  totalComponents: number;
+  byCategory: Record<string, number>;
+  extensionCompatible: number;
+  withGallery: number;
+  withLiveExample: number;
+}
 
-export const Alert: FC<AlertProps>;
+export interface ComponentData {
+  generated: string;
+  statistics: ComponentStatistics;
+  components: ComponentEntry[];
+}
diff --git a/docs/src/data/databases.json b/docs/src/data/databases.json
index ed8106d2b9b..38914dd7868 100644
--- a/docs/src/data/databases.json
+++ b/docs/src/data/databases.json
@@ -1,5 +1,5 @@
 {
-  "generated": "2026-02-26T01:18:11.347Z",
+  "generated": "2026-02-24T20:28:17.222Z",
   "statistics": {
     "totalDatabases": 72,
     "withDocumentation": 72,
@@ -751,14 +751,14 @@
           "OPEN_SOURCE"
         ],
         "pypi_packages": [
-          "clickhouse-connect>=0.13.0"
+          "clickhouse-connect>=0.6.8"
         ],
         "connection_string": 
"clickhousedb://{username}:{password}@{host}:{port}/{database}",
         "default_port": 8123,
         "drivers": [
           {
             "name": "clickhouse-connect (Recommended)",
-            "pypi_package": "clickhouse-connect>=0.13.0",
+            "pypi_package": "clickhouse-connect>=0.6.8",
             "connection_string": 
"clickhousedb://{username}:{password}@{host}:{port}/{database}",
             "is_recommended": true,
             "notes": "Official ClickHouse Python driver with native protocol 
support."
@@ -781,7 +781,7 @@
             "connection_string": "clickhousedb://localhost/default"
           }
         ],
-        "install_instructions": "echo \"clickhouse-connect>=0.13.0\" >> 
./docker/requirements-local.txt",
+        "install_instructions": "echo \"clickhouse-connect>=0.6.8\" >> 
./docker/requirements-local.txt",
         "compatible_databases": [
           {
             "name": "ClickHouse Cloud",
@@ -794,7 +794,7 @@
               "HOSTED_OPEN_SOURCE"
             ],
             "pypi_packages": [
-              "clickhouse-connect>=0.13.0"
+              "clickhouse-connect>=0.6.8"
             ],
             "connection_string": 
"clickhousedb://{username}:{password}@{host}:8443/{database}?secure=true",
             "parameters": {
@@ -816,7 +816,7 @@
               "HOSTED_OPEN_SOURCE"
             ],
             "pypi_packages": [
-              "clickhouse-connect>=0.13.0"
+              "clickhouse-connect>=0.6.8"
             ],
             "connection_string": 
"clickhousedb://{username}:{password}@{host}/{database}?secure=true",
             "docs_url": "https://docs.altinity.com/";
diff --git a/docs/src/shims/superset-ui-core.ts 
b/docs/src/shims/superset-ui-core.ts
new file mode 100644
index 00000000000..29bf85e34f5
--- /dev/null
+++ b/docs/src/shims/superset-ui-core.ts
@@ -0,0 +1,57 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+/**
+ * Lightweight shim for @superset-ui/core.
+ *
+ * Components in superset-ui-core/src/components/ self-reference the parent
+ * package for utility imports. This shim re-exports only the specific
+ * utilities they need, avoiding the full barrel file which pulls in heavy
+ * dependencies (d3, query engine, color scales) that cause OOM during the
+ * docs build.
+ *
+ * When adding exports here, verify the source file's imports don't cascade
+ * into heavy modules (connection/SupersetClientClass, query/types, etc.).
+ * Only add leaf-level utilities with minimal transitive dependencies.
+ *
+ * Exports that can't be shimmed safely (e.g. getClientErrorObject, which
+ * pulls in connection/types → SupersetClientClass) will produce
+ * ESModulesLinkingWarnings at build time — these are harmless.
+ */
+
+// Paths relative to docs/src/shims/ → 
superset-frontend/packages/superset-ui-core/src/
+
+// utils — leaf modules with no heavy transitive deps
+export { default as ensureIsArray } from 
'../../../superset-frontend/packages/superset-ui-core/src/utils/ensureIsArray';
+export {
+  safeHtmlSpan,
+  isProbablyHTML,
+  isJsonString,
+} from '../../../superset-frontend/packages/superset-ui-core/src/utils/html';
+
+// hooks
+export { usePrevious } from 
'../../../superset-frontend/packages/superset-ui-core/src/hooks/usePrevious/usePrevious';
+export { useTruncation } from 
'../../../superset-frontend/packages/superset-ui-core/src/hooks/useTruncation';
+
+// time-format
+export { getTimeFormatter } from 
'../../../superset-frontend/packages/superset-ui-core/src/time-format/TimeFormatterRegistrySingleton';
+export { default as TimeFormats } from 
'../../../superset-frontend/packages/superset-ui-core/src/time-format/TimeFormats';
+
+// color
+export { hexToRgb } from 
'../../../superset-frontend/packages/superset-ui-core/src/color/utils';
diff --git a/docs/src/types/apache-superset-core/index.d.ts 
b/docs/src/types/apache-superset-core/index.d.ts
index 5650b85bb2c..6e3a121e1b6 100644
--- a/docs/src/types/apache-superset-core/index.d.ts
+++ b/docs/src/types/apache-superset-core/index.d.ts
@@ -20,8 +20,8 @@
 /**
  * Type declarations for @apache-superset/core/ui
  *
- * AUTO-GENERATED by scripts/generate-extension-components.mjs
- * Do not edit manually - regenerate by running: yarn 
generate:extension-components
+ * AUTO-GENERATED by scripts/generate-superset-components.mjs
+ * Do not edit manually - regenerate by running: yarn 
generate:superset-components
  */
 import type { AlertProps as AntdAlertProps } from 'antd/es/alert';
 import type { PropsWithChildren, FC } from 'react';
diff --git a/docs/src/webpack.extend.ts b/docs/src/webpack.extend.ts
index e3079ee7e73..0a96ce2d1f5 100644
--- a/docs/src/webpack.extend.ts
+++ b/docs/src/webpack.extend.ts
@@ -102,7 +102,7 @@ export default function webpackExtendPlugin(): Plugin<void> 
{
       return {
         devtool: isDev ? false : config.devtool,
         cache: {
-          type: 'filesystem',
+          type: 'filesystem' as const,
           buildDependencies: {
             config: [__filename],
           },
@@ -129,10 +129,15 @@ export default function webpackExtendPlugin(): 
Plugin<void> {
             'react-dom': path.resolve(__dirname, '../node_modules/react-dom'),
             // Allow importing from superset-frontend
             src: path.resolve(__dirname, '../../superset-frontend/src'),
-            // '@superset-ui/core': path.resolve(
-            //   __dirname,
-            //   '../../superset-frontend/packages/superset-ui-core',
-            // ),
+            // Lightweight shim for @superset-ui/core that re-exports only the
+            // utilities needed by components (ensureIsArray, usePrevious, 
etc.).
+            // Avoids pulling in the full barrel which includes d3, color, 
query
+            // modules and causes OOM. Required for Rspack which is stricter 
about
+            // module resolution than webpack.
+            '@superset-ui/core$': path.resolve(
+              __dirname,
+              './shims/superset-ui-core.ts',
+            ),
             // Add aliases for our components to make imports easier
             '@docs/components': path.resolve(__dirname, '../src/components'),
             '@superset/components': path.resolve(
diff --git a/docs/tsconfig.json b/docs/tsconfig.json
index b29d41ca6de..cdfed3f9f56 100644
--- a/docs/tsconfig.json
+++ b/docs/tsconfig.json
@@ -14,7 +14,7 @@
     "paths": {
       "@superset-ui/core": 
["../superset-frontend/packages/superset-ui-core/src"],
       "@superset-ui/core/*": 
["../superset-frontend/packages/superset-ui-core/src/*"],
-      // Types for @apache-superset/core/ui are auto-generated by 
scripts/generate-extension-components.mjs
+      // Types for @apache-superset/core/ui are auto-generated by 
scripts/generate-superset-components.mjs
       // Runtime resolution uses webpack alias pointing to actual source (see 
src/webpack.extend.ts)
       // Using /ui path matches the established pattern used throughout the 
Superset codebase
       "@apache-superset/core/ui": ["./src/types/apache-superset-core"],
@@ -29,6 +29,7 @@
   "exclude": [
     "node_modules",
     "../superset-frontend/**/*",
-    "src/webpack.extend.ts"
+    "src/webpack.extend.ts",
+    "src/shims/**"
   ]
 }
diff --git a/docs/yarn.lock b/docs/yarn.lock
index 5169302763f..316f4f7755c 100644
--- a/docs/yarn.lock
+++ b/docs/yarn.lock
@@ -1695,6 +1695,21 @@
     postcss-sort-media-queries "^5.2.0"
     tslib "^2.6.0"
 
+"@docusaurus/faster@^3.9.2":
+  version "3.9.2"
+  resolved 
"https://registry.yarnpkg.com/@docusaurus/faster/-/faster-3.9.2.tgz#47b69f39ed935fdcc8dc03896274fca29056e962";
+  integrity 
sha512-DEVIwhbrZZ4ir31X+qQNEQqDWkgCJUV6kiPPAd2MGTY8n5/n0c4B8qA5k1ipF2izwH00JEf0h6Daaut71zzkyw==
+  dependencies:
+    "@docusaurus/types" "3.9.2"
+    "@rspack/core" "^1.5.0"
+    "@swc/core" "^1.7.39"
+    "@swc/html" "^1.13.5"
+    browserslist "^4.24.2"
+    lightningcss "^1.27.0"
+    swc-loader "^0.2.6"
+    tslib "^2.6.0"
+    webpack "^5.95.0"
+
 "@docusaurus/[email protected]":
   version "3.9.2"
   resolved "https://registry.npmjs.org/@docusaurus/logger/-/logger-3.9.2.tgz";
@@ -2104,6 +2119,28 @@
     utility-types "^3.10.0"
     webpack "^5.88.1"
 
+"@emnapi/core@^1.5.0":
+  version "1.8.1"
+  resolved 
"https://registry.yarnpkg.com/@emnapi/core/-/core-1.8.1.tgz#fd9efe721a616288345ffee17a1f26ac5dd01349";
+  integrity 
sha512-AvT9QFpxK0Zd8J0jopedNm+w/2fIzvtPKPjqyw9jwvBaReTTqPBk9Hixaz7KbjimP+QNz605/XnjFcDAL2pqBg==
+  dependencies:
+    "@emnapi/wasi-threads" "1.1.0"
+    tslib "^2.4.0"
+
+"@emnapi/runtime@^1.5.0":
+  version "1.8.1"
+  resolved 
"https://registry.yarnpkg.com/@emnapi/runtime/-/runtime-1.8.1.tgz#550fa7e3c0d49c5fb175a116e8cd70614f9a22a5";
+  integrity 
sha512-mehfKSMWjjNol8659Z8KxEMrdSJDDot5SXMq00dM8BN4o+CLNXQ0xH2V7EchNHV4RmbZLmmPdEaXZc5H2FXmDg==
+  dependencies:
+    tslib "^2.4.0"
+
+"@emnapi/[email protected]":
+  version "1.1.0"
+  resolved 
"https://registry.yarnpkg.com/@emnapi/wasi-threads/-/wasi-threads-1.1.0.tgz#60b2102fddc9ccb78607e4a3cf8403ea69be41bf";
+  integrity 
sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==
+  dependencies:
+    tslib "^2.4.0"
+
 "@emotion/babel-plugin@^11.13.5":
   version "11.13.5"
   resolved 
"https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.13.5.tgz";
@@ -2679,6 +2716,58 @@
   dependencies:
     langium "3.3.1"
 
+"@module-federation/[email protected]":
+  version "0.22.0"
+  resolved 
"https://registry.yarnpkg.com/@module-federation/error-codes/-/error-codes-0.22.0.tgz#31ccc990dc240d73912ba7bd001f7e35ac751992";
+  integrity 
sha512-xF9SjnEy7vTdx+xekjPCV5cIHOGCkdn3pIxo9vU7gEZMIw0SvAEdsy6Uh17xaCpm8V0FWvR0SZoK9Ik6jGOaug==
+
+"@module-federation/[email protected]":
+  version "0.22.0"
+  resolved 
"https://registry.yarnpkg.com/@module-federation/runtime-core/-/runtime-core-0.22.0.tgz#7321ec792bb7d1d22bee6162ec43564b769d2a3c";
+  integrity 
sha512-GR1TcD6/s7zqItfhC87zAp30PqzvceoeDGYTgF3Vx2TXvsfDrhP6Qw9T4vudDQL3uJRne6t7CzdT29YyVxlgIA==
+  dependencies:
+    "@module-federation/error-codes" "0.22.0"
+    "@module-federation/sdk" "0.22.0"
+
+"@module-federation/[email protected]":
+  version "0.22.0"
+  resolved 
"https://registry.yarnpkg.com/@module-federation/runtime-tools/-/runtime-tools-0.22.0.tgz#36f2a7cb267af208a9d1a237fe9a71b4bf31431e";
+  integrity 
sha512-4ScUJ/aUfEernb+4PbLdhM/c60VHl698Gn1gY21m9vyC1Ucn69fPCA1y2EwcCB7IItseRMoNhdcWQnzt/OPCNA==
+  dependencies:
+    "@module-federation/runtime" "0.22.0"
+    "@module-federation/webpack-bundler-runtime" "0.22.0"
+
+"@module-federation/[email protected]":
+  version "0.22.0"
+  resolved 
"https://registry.yarnpkg.com/@module-federation/runtime/-/runtime-0.22.0.tgz#f789c9ef40d846d110711c8221ecc0ad938d43d8";
+  integrity 
sha512-38g5iPju2tPC3KHMPxRKmy4k4onNp6ypFPS1eKGsNLUkXgHsPMBFqAjDw96iEcjri91BrahG4XcdyKi97xZzlA==
+  dependencies:
+    "@module-federation/error-codes" "0.22.0"
+    "@module-federation/runtime-core" "0.22.0"
+    "@module-federation/sdk" "0.22.0"
+
+"@module-federation/[email protected]":
+  version "0.22.0"
+  resolved 
"https://registry.yarnpkg.com/@module-federation/sdk/-/sdk-0.22.0.tgz#6ad4c1de85a900c3c80ff26cb87cce253e3a2770";
+  integrity 
sha512-x4aFNBKn2KVQRuNVC5A7SnrSCSqyfIWmm1DvubjbO9iKFe7ith5niw8dqSFBekYBg2Fwy+eMg4sEFNVvCAdo6g==
+
+"@module-federation/[email protected]":
+  version "0.22.0"
+  resolved 
"https://registry.yarnpkg.com/@module-federation/webpack-bundler-runtime/-/webpack-bundler-runtime-0.22.0.tgz#dcbe8f972d722fe278e6a7c21988d4bee53d401d";
+  integrity 
sha512-aM8gCqXu+/4wBmJtVeMeeMN5guw3chf+2i6HajKtQv7SJfxV/f4IyNQJUeUQu9HfiAZHjqtMV5Lvq/Lvh8LdyA==
+  dependencies:
+    "@module-federation/runtime" "0.22.0"
+    "@module-federation/sdk" "0.22.0"
+
+"@napi-rs/[email protected]":
+  version "1.0.7"
+  resolved 
"https://registry.yarnpkg.com/@napi-rs/wasm-runtime/-/wasm-runtime-1.0.7.tgz#dcfea99a75f06209a235f3d941e3460a51e9b14c";
+  integrity 
sha512-SeDnOO0Tk7Okiq6DbXmmBODgOAb9dp9gjlphokTUxmt8U3liIP1ZsozBahH69j/RJv+Rfs6IwUKHTgQYJ/HBAw==
+  dependencies:
+    "@emnapi/core" "^1.5.0"
+    "@emnapi/runtime" "^1.5.0"
+    "@tybys/wasm-util" "^0.10.1"
+
 "@nodelib/[email protected]":
   version "2.1.5"
   resolved 
"https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz";
@@ -2986,7 +3075,15 @@
   dependencies:
     "@babel/runtime" "^7.18.0"
 
-"@rc-component/motion@^1.0.0", "@rc-component/motion@^1.1.3", 
"@rc-component/motion@^1.1.4", "@rc-component/motion@^1.3.1":
+"@rc-component/motion@^1.0.0", "@rc-component/motion@^1.1.3", 
"@rc-component/motion@^1.1.4":
+  version "1.1.6"
+  resolved "https://registry.npmjs.org/@rc-component/motion/-/motion-1.1.6.tgz";
+  integrity 
sha512-aEQobs/YA0kqRvHIPjQvOytdtdRVyhf/uXAal4chBjxDu6odHckExJzjn2D+Ju1aKK6hx3pAs6BXdV9+86xkgQ==
+  dependencies:
+    "@rc-component/util" "^1.2.0"
+    clsx "^2.1.1"
+
+"@rc-component/motion@^1.3.1":
   version "1.3.1"
   resolved 
"https://registry.yarnpkg.com/@rc-component/motion/-/motion-1.3.1.tgz#1e56b06841ee677261251e6e69fedc8d73e65b22";
   integrity 
sha512-Wo1mkd0tCcHtvYvpPOmlYJz546z16qlsiwaygmW7NPJpOZOF9GBjhGzdzZSsC2lEJ1IUkWLF4gMHlRA1aSA+Yw==
@@ -3087,7 +3184,18 @@
     "@rc-component/util" "^1.3.0"
     clsx "^2.1.1"
 
-"@rc-component/select@~1.6.0", "@rc-component/select@~1.6.12":
+"@rc-component/select@~1.6.0":
+  version "1.6.5"
+  resolved 
"https://registry.yarnpkg.com/@rc-component/select/-/select-1.6.5.tgz#69276239c6ac0884a67597961b0224c4ad0bc4ca";
+  integrity 
sha512-Cx+/OYEorXlPQ6ZFDro3HbalPZLlJWagvGtl8DGYO4losXM6gw43qbsxWqU1c3XOQVIOUDBlr7dSksSNMj8kXg==
+  dependencies:
+    "@rc-component/overflow" "^1.0.0"
+    "@rc-component/trigger" "^3.0.0"
+    "@rc-component/util" "^1.3.0"
+    "@rc-component/virtual-list" "^1.0.1"
+    clsx "^2.1.1"
+
+"@rc-component/select@~1.6.12":
   version "1.6.12"
   resolved 
"https://registry.yarnpkg.com/@rc-component/select/-/select-1.6.12.tgz#24312b31aad2a78ce1ec0062b15f56428bddab8f";
   integrity 
sha512-jYXAglYdOb54BrpWAcjjhdBP16NyCv/HbEaWFMbEHZQAJVmGHPAtmBqbFuPPuvInAVsIwLbCj4Agag9udOamiQ==
@@ -3273,6 +3381,88 @@
     redux-thunk "^3.1.0"
     reselect "^5.1.0"
 
+"@rspack/[email protected]":
+  version "1.7.6"
+  resolved 
"https://registry.yarnpkg.com/@rspack/binding-darwin-arm64/-/binding-darwin-arm64-1.7.6.tgz#10144f3841be88ea25c71a537df6b038ae84a87a";
+  integrity 
sha512-NZ9AWtB1COLUX1tA9HQQvWpTy07NSFfKBU8A6ylWd5KH8AePZztpNgLLAVPTuNO4CZXYpwcoclf8jG/luJcQdQ==
+
+"@rspack/[email protected]":
+  version "1.7.6"
+  resolved 
"https://registry.yarnpkg.com/@rspack/binding-darwin-x64/-/binding-darwin-x64-1.7.6.tgz#70588e30e1fdcd3149e09fe6798eb95609ad814b";
+  integrity 
sha512-J2g6xk8ZS7uc024dNTGTHxoFzFovAZIRixUG7PiciLKTMP78svbSSWrmW6N8oAsAkzYfJWwQpVgWfFNRHvYxSw==
+
+"@rspack/[email protected]":
+  version "1.7.6"
+  resolved 
"https://registry.yarnpkg.com/@rspack/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.7.6.tgz#322e7fe54fccefd57603d4730130bef311b8dd60";
+  integrity 
sha512-eQfcsaxhFrv5FmtaA7+O1F9/2yFDNIoPZzV/ZvqvFz5bBXVc4FAm/1fVpBg8Po/kX1h0chBc7Xkpry3cabFW8w==
+
+"@rspack/[email protected]":
+  version "1.7.6"
+  resolved 
"https://registry.yarnpkg.com/@rspack/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.7.6.tgz#4444dfe045323f341c7c82fdb7dce5809fea51c1";
+  integrity 
sha512-DfQXKiyPIl7i1yECHy4eAkSmlUzzsSAbOjgMuKn7pudsWf483jg0UUYutNgXSlBjc/QSUp7906Cg8oty9OfwPA==
+
+"@rspack/[email protected]":
+  version "1.7.6"
+  resolved 
"https://registry.yarnpkg.com/@rspack/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.7.6.tgz#c31bf72789c71eeee75cd3cb06d6a6e5449e1bd1";
+  integrity 
sha512-NdA+2X3lk2GGrMMnTGyYTzM3pn+zNjaqXqlgKmFBXvjfZqzSsKq3pdD1KHZCd5QHN+Fwvoszj0JFsquEVhE1og==
+
+"@rspack/[email protected]":
+  version "1.7.6"
+  resolved 
"https://registry.yarnpkg.com/@rspack/binding-linux-x64-musl/-/binding-linux-x64-musl-1.7.6.tgz#20f8ad786d581af7a7c2802220b533ce531fb4c6";
+  integrity 
sha512-rEy6MHKob02t/77YNgr6dREyJ0e0tv1X6Xsg8Z5E7rPXead06zefUbfazj4RELYySWnM38ovZyJAkPx/gOn3VA==
+
+"@rspack/[email protected]":
+  version "1.7.6"
+  resolved 
"https://registry.yarnpkg.com/@rspack/binding-wasm32-wasi/-/binding-wasm32-wasi-1.7.6.tgz#76ae0f9f584a054e109b83ec02516ce75dcff8e6";
+  integrity 
sha512-YupOrz0daSG+YBbCIgpDgzfMM38YpChv+afZpaxx5Ml7xPeAZIIdgWmLHnQ2rts73N2M1NspAiBwV00Xx0N4Vg==
+  dependencies:
+    "@napi-rs/wasm-runtime" "1.0.7"
+
+"@rspack/[email protected]":
+  version "1.7.6"
+  resolved 
"https://registry.yarnpkg.com/@rspack/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.7.6.tgz#4e7f70338dfcc8efa3a67d72064562eb9f0662cb";
+  integrity 
sha512-INj7aVXjBvlZ84kEhSK4kJ484ub0i+BzgnjDWOWM1K+eFYDZjLdAsQSS3fGGXwVc3qKbPIssFfnftATDMTEJHQ==
+
+"@rspack/[email protected]":
+  version "1.7.6"
+  resolved 
"https://registry.yarnpkg.com/@rspack/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-1.7.6.tgz#efeb807c624536361467dfec0898705213fbd997";
+  integrity 
sha512-lXGvC+z67UMcw58In12h8zCa9IyYRmuptUBMItQJzu+M278aMuD1nETyGLL7e4+OZ2lvrnnBIcjXN1hfw2yRzw==
+
+"@rspack/[email protected]":
+  version "1.7.6"
+  resolved 
"https://registry.yarnpkg.com/@rspack/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.7.6.tgz#48014313c224e9fce31d02134c81525a7cb7f891";
+  integrity 
sha512-zeUxEc0ZaPpmaYlCeWcjSJUPuRRySiSHN23oJ2Xyw0jsQ01Qm4OScPdr0RhEOFuK/UE+ANyRtDo4zJsY52Hadw==
+
+"@rspack/[email protected]":
+  version "1.7.6"
+  resolved 
"https://registry.yarnpkg.com/@rspack/binding/-/binding-1.7.6.tgz#d61b241c0dbb4e395f7753de74a2fe760891d4f2";
+  integrity 
sha512-/NrEcfo8Gx22hLGysanrV6gHMuqZSxToSci/3M4kzEQtF5cPjfOv5pqeLK/+B6cr56ul/OmE96cCdWcXeVnFjQ==
+  optionalDependencies:
+    "@rspack/binding-darwin-arm64" "1.7.6"
+    "@rspack/binding-darwin-x64" "1.7.6"
+    "@rspack/binding-linux-arm64-gnu" "1.7.6"
+    "@rspack/binding-linux-arm64-musl" "1.7.6"
+    "@rspack/binding-linux-x64-gnu" "1.7.6"
+    "@rspack/binding-linux-x64-musl" "1.7.6"
+    "@rspack/binding-wasm32-wasi" "1.7.6"
+    "@rspack/binding-win32-arm64-msvc" "1.7.6"
+    "@rspack/binding-win32-ia32-msvc" "1.7.6"
+    "@rspack/binding-win32-x64-msvc" "1.7.6"
+
+"@rspack/core@^1.5.0":
+  version "1.7.6"
+  resolved 
"https://registry.yarnpkg.com/@rspack/core/-/core-1.7.6.tgz#d43a1c4103248cbe4011902906c6d7427b80f3a6";
+  integrity 
sha512-Iax6UhrfZqJajA778c1d5DBFbSIqPOSrI34kpNIiNpWd8Jq7mFIa+Z60SQb5ZQDZuUxcCZikjz5BxinFjTkg7Q==
+  dependencies:
+    "@module-federation/runtime-tools" "0.22.0"
+    "@rspack/binding" "1.7.6"
+    "@rspack/lite-tapable" "1.1.0"
+
+"@rspack/[email protected]":
+  version "1.1.0"
+  resolved 
"https://registry.yarnpkg.com/@rspack/lite-tapable/-/lite-tapable-1.1.0.tgz#3cfdafeed01078e116bd4f191b684c8b484de425";
+  integrity 
sha512-E2B0JhYFmVAwdDiG14+DW0Di4Ze4Jg10Pc4/lILUrd5DRCaklduz2OvJ5HYQ6G+hd+WTzqQb3QnDNfK4yvAFYw==
+
 "@saucelabs/theme-github-codeblock@^0.3.0":
   version "0.3.0"
   resolved 
"https://registry.npmjs.org/@saucelabs/theme-github-codeblock/-/theme-github-codeblock-0.3.0.tgz";
@@ -4088,80 +4278,217 @@
   dependencies:
     apg-lite "^1.0.4"
 
-"@swc/[email protected]":
-  version "1.15.17"
-  resolved 
"https://registry.yarnpkg.com/@swc/core-darwin-arm64/-/core-darwin-arm64-1.15.17.tgz#7421beb8dc0277d809ed0cbf691b1ac4f4c9d613";
-  integrity 
sha512-eB9qdyt4E60323IS0rgV/rd79DJ+YWSyIKi+sT1dlIgR3ns4xlBiunREM3lVH0FKcUbhttiBvdVubT4QoOuZ+w==
-
-"@swc/[email protected]":
-  version "1.15.17"
-  resolved 
"https://registry.yarnpkg.com/@swc/core-darwin-x64/-/core-darwin-x64-1.15.17.tgz#2994c4545725432a98405c9d243c115650933672";
-  integrity 
sha512-k1TZARYs8947jJpSioqcPrusz+wEeABF4iiSdwcSyQh2rIUdIEk5FOyaqJASFPJ6dZfx7ZVOyjtDATVAegs2/Q==
-
-"@swc/[email protected]":
-  version "1.15.17"
-  resolved 
"https://registry.yarnpkg.com/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.15.17.tgz#3abe70d7aa4cedd366b516244ee1e8101d9c5a1a";
-  integrity 
sha512-p6282NQZo5bzx0wphz1ETGjhcRB9CN+/XUAjQwApyoyX9iCloI5IT/RC3vjbflo42g8RPTxUTaItAO0hlLSesQ==
-
-"@swc/[email protected]":
-  version "1.15.17"
-  resolved 
"https://registry.yarnpkg.com/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.15.17.tgz#cfe8829e03a38e0579530e2d9a73a7070011a1c8";
-  integrity 
sha512-TGnDS4ejy8y9jqxXqZCyA+DvFc64nXUHS9rxdyeJ9B9uyIdtKVhBrA2xfghYRS/sSPSyHZ0yu89NxBICvONH+A==
-
-"@swc/[email protected]":
-  version "1.15.17"
-  resolved 
"https://registry.yarnpkg.com/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.15.17.tgz#a08d724ebba05821dcb4d0de130a887728c6a763";
-  integrity 
sha512-D0/6Hj4CkgSTTahtlGxv9IDsLTuvQz30mkZEMDp8TqwYhCL8AomznkibwlQU8HtY4q/dqd1OGRPH+FmNb4BBEA==
-
-"@swc/[email protected]":
-  version "1.15.17"
-  resolved 
"https://registry.yarnpkg.com/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.15.17.tgz#08feaa091f37ef0fa6d3967008701ee1db66ea73";
-  integrity 
sha512-1s2OFsg6DeRkWU7c+PIfIHZsFCbiZ34akXFHrg7KjpF8zIvpHZNoUUZimoWEwcB6GquXSkAO+1b5KpG5nusTeQ==
-
-"@swc/[email protected]":
-  version "1.15.17"
-  resolved 
"https://registry.yarnpkg.com/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.15.17.tgz#2e694f1e6a252967bb7b3ca71eafbb31f5043259";
-  integrity 
sha512-gtxGMGYtRWWmCcgx6xM2Yos43uiE/j8kZwkeL/LNGG9zM0tatd23NsfL9PnQJ45hY7QZ+dx2rM68e4ArgG4kJg==
-
-"@swc/[email protected]":
-  version "1.15.17"
-  resolved 
"https://registry.yarnpkg.com/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.15.17.tgz#4affd877dea00139e5d39c30a9e8b2a16a352f83";
-  integrity 
sha512-gxi+/Miytez/O9vJ/QiheIivA3oWZjPp9nJu3VmAfLMWUzcZORMwgaI1ygtDTLjz7CzcwlGMJz/Ab66Y5DfNpg==
-
-"@swc/[email protected]":
-  version "1.15.17"
-  resolved 
"https://registry.yarnpkg.com/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.15.17.tgz#129ab225d231c36fa5356b8087756dbc64bebbf3";
-  integrity 
sha512-KUsRqNbTp7SpNK0T9m4+i8GlngzNjwb69a3ttKA6XJ5r6Pewm+NSYji93pNkawXIivbWY2jhvceGMAyd+4hWaQ==
-
-"@swc/[email protected]":
-  version "1.15.17"
-  resolved 
"https://registry.yarnpkg.com/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.15.17.tgz#cab85cb07b1609c43d9893e5fc3a07767e53dd03";
-  integrity 
sha512-zqtEGE0/rTKvEC5sOtpANLHeWEPjsTD4/rwpUxo6ymztcLI/Z+L9Wi9xQvIGmLTUih1gvNZcAwROqdfRP3oAWQ==
+"@swc/[email protected]":
+  version "1.15.13"
+  resolved 
"https://registry.yarnpkg.com/@swc/core-darwin-arm64/-/core-darwin-arm64-1.15.13.tgz#f60ff48cb93066b83405074015eb6373ea0cdd77";
+  integrity 
sha512-ztXusRuC5NV2w+a6pDhX13CGioMLq8CjX5P4XgVJ21ocqz9t19288Do0y8LklplDtwcEhYGTNdMbkmUT7+lDTg==
+
+"@swc/[email protected]":
+  version "1.15.18"
+  resolved 
"https://registry.yarnpkg.com/@swc/core-darwin-arm64/-/core-darwin-arm64-1.15.18.tgz#fb487392f7bbe3179166b9b0d128916e39a627af";
+  integrity 
sha512-+mIv7uBuSaywN3C9LNuWaX1jJJ3SKfiJuE6Lr3bd+/1Iv8oMU7oLBjYMluX1UrEPzwN2qCdY6Io0yVicABoCwQ==
+
+"@swc/[email protected]":
+  version "1.15.13"
+  resolved 
"https://registry.yarnpkg.com/@swc/core-darwin-x64/-/core-darwin-x64-1.15.13.tgz#3838c08653ac53a6508cdc34bfa191281da4ed26";
+  integrity 
sha512-cVifxQUKhaE7qcO/y9Mq6PEhoyvN9tSLzCnnFZ4EIabFHBuLtDDO6a+vLveOy98hAs5Qu1+bb5Nv0oa1Pihe3Q==
+
+"@swc/[email protected]":
+  version "1.15.18"
+  resolved 
"https://registry.yarnpkg.com/@swc/core-darwin-x64/-/core-darwin-x64-1.15.18.tgz#0e11fb0a80ebd56cb4417138a938ffc789ead492";
+  integrity 
sha512-wZle0eaQhnzxWX5V/2kEOI6Z9vl/lTFEC6V4EWcn+5pDjhemCpQv9e/TDJ0GIoiClX8EDWRvuZwh+Z3dhL1NAg==
+
+"@swc/[email protected]":
+  version "1.15.13"
+  resolved 
"https://registry.yarnpkg.com/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.15.13.tgz#9308b156fae3fe5d12684b86af31ada4255066fc";
+  integrity 
sha512-t+xxEzZ48enl/wGGy7SRYd7kImWQ/+wvVFD7g5JZo234g6/QnIgZ+YdfIyjHB+ZJI3F7a2IQHS7RNjxF29UkWw==
+
+"@swc/[email protected]":
+  version "1.15.18"
+  resolved 
"https://registry.yarnpkg.com/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.15.18.tgz#e7cac4b46d66dfd6b0fedea68877a5678fcf3579";
+  integrity 
sha512-ao61HGXVqrJFHAcPtF4/DegmwEkVCo4HApnotLU8ognfmU8x589z7+tcf3hU+qBiU1WOXV5fQX6W9Nzs6hjxDw==
+
+"@swc/[email protected]":
+  version "1.15.13"
+  resolved 
"https://registry.yarnpkg.com/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.15.13.tgz#b150d6091e2bb3cf97dc9712a711d3ba025811a9";
+  integrity 
sha512-VndeGvKmTXFn6AGwjy0Kg8i7HccOCE7Jt/vmZwRxGtOfNZM1RLYRQ7MfDLo6T0h1Bq6eYzps3L5Ma4zBmjOnOg==
+
+"@swc/[email protected]":
+  version "1.15.18"
+  resolved 
"https://registry.yarnpkg.com/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.15.18.tgz#ca888f41be89887f9f6b4afd1cc38a1a596a655d";
+  integrity 
sha512-3xnctOBLIq3kj8PxOCgPrGjBLP/kNOddr6f5gukYt/1IZxsITQaU9TDyjeX6jG+FiCIHjCuWuffsyQDL5Ew1bg==
+
+"@swc/[email protected]":
+  version "1.15.13"
+  resolved 
"https://registry.yarnpkg.com/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.15.13.tgz#35dd5382554096118ecd1db2928e1f71b56aa41a";
+  integrity 
sha512-SmZ9m+XqCB35NddHCctvHFLqPZDAs5j8IgD36GoutufDJmeq2VNfgk5rQoqNqKmAK3Y7iFdEmI76QoHIWiCLyw==
+
+"@swc/[email protected]":
+  version "1.15.18"
+  resolved 
"https://registry.yarnpkg.com/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.15.18.tgz#292bb894cf08be522487897f6e2a616cbdd6198a";
+  integrity 
sha512-0a+Lix+FSSHBSBOA0XznCcHo5/1nA6oLLjcnocvzXeqtdjnPb+SvchItHI+lfeiuj1sClYPDvPMLSLyXFaiIKw==
+
+"@swc/[email protected]":
+  version "1.15.13"
+  resolved 
"https://registry.yarnpkg.com/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.15.13.tgz#03f89bbdce8f07a1bc02a3ef1c93a5b4e81aef2e";
+  integrity 
sha512-5rij+vB9a29aNkHq72EXI2ihDZPszJb4zlApJY4aCC/q6utgqFA6CkrfTfIb+O8hxtG3zP5KERETz8mfFK6A0A==
+
+"@swc/[email protected]":
+  version "1.15.18"
+  resolved 
"https://registry.yarnpkg.com/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.15.18.tgz#2241fd6a01d88bac32334812660d80ebae88fd12";
+  integrity 
sha512-wG9J8vReUlpaHz4KOD/5UE1AUgirimU4UFT9oZmupUDEofxJKYb1mTA/DrMj0s78bkBiNI+7Fo2EgPuvOJfuAA==
+
+"@swc/[email protected]":
+  version "1.15.13"
+  resolved 
"https://registry.yarnpkg.com/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.15.13.tgz#27ae66914125bf35724e43bb06b856afed39770c";
+  integrity 
sha512-OlSlaOK9JplQ5qn07WiBLibkOw7iml2++ojEXhhR3rbWrNEKCD7sd8+6wSavsInyFdw4PhLA+Hy6YyDBIE23Yw==
+
+"@swc/[email protected]":
+  version "1.15.18"
+  resolved 
"https://registry.yarnpkg.com/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.15.18.tgz#7d70f02a383d9dbae18b0d2906ee8b49dfb0b533";
+  integrity 
sha512-4nwbVvCphKzicwNWRmvD5iBaZj8JYsRGa4xOxJmOyHlMDpsvvJ2OR2cODlvWyGFH6BYL1MfIAK3qph3hp0Az6g==
+
+"@swc/[email protected]":
+  version "1.15.13"
+  resolved 
"https://registry.yarnpkg.com/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.15.13.tgz#39776831949a53754d8f62e4730ac9430d1671f3";
+  integrity 
sha512-zwQii5YVdsfG8Ti9gIKgBKZg8qMkRZxl+OlYWUT5D93Jl4NuNBRausP20tfEkQdAPSRrMCSUZBM6FhW7izAZRg==
+
+"@swc/[email protected]":
+  version "1.15.18"
+  resolved 
"https://registry.yarnpkg.com/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.15.18.tgz#6ea2b41d224a5ac84e1addf19fbc584e49698b08";
+  integrity 
sha512-zk0RYO+LjiBCat2RTMHzAWaMky0cra9loH4oRrLKLLNuL+jarxKLFDA8xTZWEkCPLjUTwlRN7d28eDLLMgtUcQ==
+
+"@swc/[email protected]":
+  version "1.15.13"
+  resolved 
"https://registry.yarnpkg.com/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.15.13.tgz#995c45c9fd86d9959bc1a7275c4e60ac4efcc12f";
+  integrity 
sha512-hYXvyVVntqRlYoAIDwNzkS3tL2ijP3rxyWQMNKaxcCxxkCDto/w3meOK/OB6rbQSkNw0qTUcBfU9k+T0ptYdfQ==
+
+"@swc/[email protected]":
+  version "1.15.18"
+  resolved 
"https://registry.yarnpkg.com/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.15.18.tgz#0c498802837ef53452c744964cac1391eb889e4d";
+  integrity 
sha512-yVuTrZ0RccD5+PEkpcLOBAuPbYBXS6rslENvIXfvJGXSdX5QGi1ehC4BjAMl5FkKLiam4kJECUI0l7Hq7T1vwg==
+
+"@swc/[email protected]":
+  version "1.15.13"
+  resolved 
"https://registry.yarnpkg.com/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.15.13.tgz#b329aec8bb5e84bab49c8f250ebb27f6c27dc213";
+  integrity 
sha512-XTzKs7c/vYCcjmcwawnQvlHHNS1naJEAzcBckMI5OJlnrcgW8UtcX9NHFYvNjGtXuKv0/9KvqL4fuahdvlNGKw==
+
+"@swc/[email protected]":
+  version "1.15.18"
+  resolved 
"https://registry.yarnpkg.com/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.15.18.tgz#878b48b38225680aad1e486880a6835461519e53";
+  integrity 
sha512-7NRmE4hmUQNCbYU3Hn9Tz57mK9Qq4c97ZS+YlamlK6qG9Fb5g/BB3gPDe0iLlJkns/sYv2VWSkm8c3NmbEGjbg==
 
 "@swc/core@^1.15.17":
-  version "1.15.17"
-  resolved 
"https://registry.yarnpkg.com/@swc/core/-/core-1.15.17.tgz#41685c478cce11bc787a5f41c6cd7e037743dd78";
-  integrity 
sha512-Mu3eOrYlkdQPl7yqotNckitTr6FZ0yd7mlWIBEzK+EGIyybgMENJHmbS2DeA7BMleJiBElP6ke+Nz93pkKmKJw==
+  version "1.15.18"
+  resolved 
"https://registry.yarnpkg.com/@swc/core/-/core-1.15.18.tgz#9eed29c0267d2c262391d4a2e75a3978e3f9dc74";
+  integrity 
sha512-z87aF9GphWp//fnkRsqvtY+inMVPgYW3zSlXH1kJFvRT5H/wiAn+G32qW5l3oEk63KSF1x3Ov0BfHCObAmT8RA==
+  dependencies:
+    "@swc/counter" "^0.1.3"
+    "@swc/types" "^0.1.25"
+  optionalDependencies:
+    "@swc/core-darwin-arm64" "1.15.18"
+    "@swc/core-darwin-x64" "1.15.18"
+    "@swc/core-linux-arm-gnueabihf" "1.15.18"
+    "@swc/core-linux-arm64-gnu" "1.15.18"
+    "@swc/core-linux-arm64-musl" "1.15.18"
+    "@swc/core-linux-x64-gnu" "1.15.18"
+    "@swc/core-linux-x64-musl" "1.15.18"
+    "@swc/core-win32-arm64-msvc" "1.15.18"
+    "@swc/core-win32-ia32-msvc" "1.15.18"
+    "@swc/core-win32-x64-msvc" "1.15.18"
+
+"@swc/core@^1.7.39":
+  version "1.15.13"
+  resolved 
"https://registry.yarnpkg.com/@swc/core/-/core-1.15.13.tgz#19b4117a76576f46b28199ac2f75cad5bc9cdde4";
+  integrity 
sha512-0l1gl/72PErwUZuavcRpRAQN9uSst+Nk++niC5IX6lmMWpXoScYx3oq/narT64/sKv/eRiPTaAjBFGDEQiWJIw==
   dependencies:
     "@swc/counter" "^0.1.3"
     "@swc/types" "^0.1.25"
   optionalDependencies:
-    "@swc/core-darwin-arm64" "1.15.17"
-    "@swc/core-darwin-x64" "1.15.17"
-    "@swc/core-linux-arm-gnueabihf" "1.15.17"
-    "@swc/core-linux-arm64-gnu" "1.15.17"
-    "@swc/core-linux-arm64-musl" "1.15.17"
-    "@swc/core-linux-x64-gnu" "1.15.17"
-    "@swc/core-linux-x64-musl" "1.15.17"
-    "@swc/core-win32-arm64-msvc" "1.15.17"
-    "@swc/core-win32-ia32-msvc" "1.15.17"
-    "@swc/core-win32-x64-msvc" "1.15.17"
+    "@swc/core-darwin-arm64" "1.15.13"
+    "@swc/core-darwin-x64" "1.15.13"
+    "@swc/core-linux-arm-gnueabihf" "1.15.13"
+    "@swc/core-linux-arm64-gnu" "1.15.13"
+    "@swc/core-linux-arm64-musl" "1.15.13"
+    "@swc/core-linux-x64-gnu" "1.15.13"
+    "@swc/core-linux-x64-musl" "1.15.13"
+    "@swc/core-win32-arm64-msvc" "1.15.13"
+    "@swc/core-win32-ia32-msvc" "1.15.13"
+    "@swc/core-win32-x64-msvc" "1.15.13"
 
 "@swc/counter@^0.1.3":
   version "0.1.3"
   resolved "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz";
   integrity 
sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==
 
+"@swc/[email protected]":
+  version "1.15.13"
+  resolved 
"https://registry.yarnpkg.com/@swc/html-darwin-arm64/-/html-darwin-arm64-1.15.13.tgz#6cb94e0a6685df46a48c7168e4d1a048ddcdeceb";
+  integrity 
sha512-w/fTkqqkx9haSbws8YhhW/Bp7ZkxCJ6lns5YYZMHdZI2KJL4WEHl6GhGzgzavOXaO8LBouiUwucc2bYPgsfI/w==
+
+"@swc/[email protected]":
+  version "1.15.13"
+  resolved 
"https://registry.yarnpkg.com/@swc/html-darwin-x64/-/html-darwin-x64-1.15.13.tgz#c9402ec555c7681370fc978f4f6cc12a19e6e9ba";
+  integrity 
sha512-yYb8jq+R+FlM8DlFLt5zmm0G5zdF4UUrHjafETmNj3J05itOzcOO9kI7icZ6DUwCROYbfejG7AwkSooYOV5+kA==
+
+"@swc/[email protected]":
+  version "1.15.13"
+  resolved 
"https://registry.yarnpkg.com/@swc/html-linux-arm-gnueabihf/-/html-linux-arm-gnueabihf-1.15.13.tgz#b10aa1b05ccf12610d145833a500aa83e4de6920";
+  integrity 
sha512-n+/JK+vi9FwJCe5Jrv7i0J0/keal3x+8ZXROJbLAdzYWoAaqjbEeUNWuqmSH3uU64eOhqUl6kRERLz/NB6LoZw==
+
+"@swc/[email protected]":
+  version "1.15.13"
+  resolved 
"https://registry.yarnpkg.com/@swc/html-linux-arm64-gnu/-/html-linux-arm64-gnu-1.15.13.tgz#8e98a5b4672155ff13c6f1404abe731c8967992e";
+  integrity 
sha512-ThKrqeXiRKTj4/mo+KoXy4GE390Lt76GjF0apNwXB27YTQxMFLIlcHIntn/WhumAVJCu3pA/n0TYw8ZSu7K3DA==
+
+"@swc/[email protected]":
+  version "1.15.13"
+  resolved 
"https://registry.yarnpkg.com/@swc/html-linux-arm64-musl/-/html-linux-arm64-musl-1.15.13.tgz#64487978fcdb347490a3daa2aeee95f2c025d516";
+  integrity 
sha512-9nyG3dgAclXuAyOsHBpQq0Q15SwQXkGvifczfiKnyd3srjWrsl4ZhHiE3ZrBBshenoK76NwPxATazf/lU83JNg==
+
+"@swc/[email protected]":
+  version "1.15.13"
+  resolved 
"https://registry.yarnpkg.com/@swc/html-linux-x64-gnu/-/html-linux-x64-gnu-1.15.13.tgz#16f72d180846bdb27b60038cd48582f2c8307488";
+  integrity 
sha512-yzpOYvLXXDqplHrr9wVImJ+QBLeubP7m92zZTQaW8rdhag01bX2Y/+829emT58K3SfLJTiJdKBYsL3q3mbVWrg==
+
+"@swc/[email protected]":
+  version "1.15.13"
+  resolved 
"https://registry.yarnpkg.com/@swc/html-linux-x64-musl/-/html-linux-x64-musl-1.15.13.tgz#4acf02ef41ee7dfc38cd824be81f79e7adc04483";
+  integrity 
sha512-VakiAq/YTiSP3TcWKL6Vo5qu7iS8M647T22zGNNMc4D/gxg57R+89SITc1zCphR6p9rEh7vx6bk8/b8NXgYZeQ==
+
+"@swc/[email protected]":
+  version "1.15.13"
+  resolved 
"https://registry.yarnpkg.com/@swc/html-win32-arm64-msvc/-/html-win32-arm64-msvc-1.15.13.tgz#3df9183ef9e9d3d08cf1b830a50c72fade286240";
+  integrity 
sha512-AhO5wmpnK5doUDDkOLqoPMDnNUrY3xa5HShiqiZBiGH2opB++kys77Q1Q9iW9ZKZgAiFLLZmiqVfcQRjhgdy0g==
+
+"@swc/[email protected]":
+  version "1.15.13"
+  resolved 
"https://registry.yarnpkg.com/@swc/html-win32-ia32-msvc/-/html-win32-ia32-msvc-1.15.13.tgz#1586e4b4d6aaf1d69ad93f58b5b996bcaca91705";
+  integrity 
sha512-nyjUqwCSezmrWOBTCUf5EXl1oU+Fk/x+zSvvmrEGLAUo7fgpmSJtsNveODkZ8M755MI13ANdO8XkPg0UhYM+4g==
+
+"@swc/[email protected]":
+  version "1.15.13"
+  resolved 
"https://registry.yarnpkg.com/@swc/html-win32-x64-msvc/-/html-win32-x64-msvc-1.15.13.tgz#d00f0c1fb82658ccb2f3f92a8d0ae98c7214434c";
+  integrity 
sha512-ClKtII06nneMXik7dURXOlkPX8XyyBKE/3VfAAEC7B4E00m228gOy4CwTy9E2TDCeo6eqdePcSETSQzY8uOe8w==
+
+"@swc/html@^1.13.5":
+  version "1.15.13"
+  resolved 
"https://registry.yarnpkg.com/@swc/html/-/html-1.15.13.tgz#4f1a1e6f70e4fa31732f2acffb2f8b9968da9dcd";
+  integrity 
sha512-3eICmZEt1QTYEF++ZiyGULhuB3QSyoDaFXRjq2Dso7gD8yENeZ00HHpGt340ievtve11BYSD3rVlPRN3/BGlIA==
+  dependencies:
+    "@swc/counter" "^0.1.3"
+  optionalDependencies:
+    "@swc/html-darwin-arm64" "1.15.13"
+    "@swc/html-darwin-x64" "1.15.13"
+    "@swc/html-linux-arm-gnueabihf" "1.15.13"
+    "@swc/html-linux-arm64-gnu" "1.15.13"
+    "@swc/html-linux-arm64-musl" "1.15.13"
+    "@swc/html-linux-x64-gnu" "1.15.13"
+    "@swc/html-linux-x64-musl" "1.15.13"
+    "@swc/html-win32-arm64-msvc" "1.15.13"
+    "@swc/html-win32-ia32-msvc" "1.15.13"
+    "@swc/html-win32-x64-msvc" "1.15.13"
+
 "@swc/types@^0.1.25":
   version "0.1.25"
   resolved "https://registry.npmjs.org/@swc/types/-/types-0.1.25.tgz";
@@ -4189,6 +4516,13 @@
   resolved "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz";
   integrity 
sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==
 
+"@tybys/wasm-util@^0.10.1":
+  version "0.10.1"
+  resolved 
"https://registry.yarnpkg.com/@tybys/wasm-util/-/wasm-util-0.10.1.tgz#ecddd3205cf1e2d5274649ff0eedd2991ed7f414";
+  integrity 
sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==
+  dependencies:
+    tslib "^2.4.0"
+
 "@types/body-parser@*":
   version "1.19.6"
   resolved 
"https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.6.tgz";
@@ -4807,7 +5141,7 @@
   dependencies:
     "@types/yargs-parser" "*"
 
-"@typescript-eslint/[email protected]", 
"@typescript-eslint/eslint-plugin@^8.52.0":
+"@typescript-eslint/[email protected]":
   version "8.56.1"
   resolved 
"https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.56.1.tgz#b1ce606d87221daec571e293009675992f0aae76";
   integrity 
sha512-Jz9ZztpB37dNC+HU2HI28Bs9QXpzCz+y/twHOwhyrIRdbuVDxSytJNDl6z/aAKlaRIwC7y8wJdkBv7FxYGgi0A==
@@ -4821,6 +5155,20 @@
     natural-compare "^1.4.0"
     ts-api-utils "^2.4.0"
 
+"@typescript-eslint/eslint-plugin@^8.52.0":
+  version "8.56.0"
+  resolved 
"https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.56.0.tgz#5aec3db807a6b8437ea5d5ebf7bd16b4119aba8d";
+  integrity 
sha512-lRyPDLzNCuae71A3t9NEINBiTn7swyOhvUj3MyUOxb8x6g6vPEFoOU+ZRmGMusNC3X3YMhqMIX7i8ShqhT74Pw==
+  dependencies:
+    "@eslint-community/regexpp" "^4.12.2"
+    "@typescript-eslint/scope-manager" "8.56.0"
+    "@typescript-eslint/type-utils" "8.56.0"
+    "@typescript-eslint/utils" "8.56.0"
+    "@typescript-eslint/visitor-keys" "8.56.0"
+    ignore "^7.0.5"
+    natural-compare "^1.4.0"
+    ts-api-utils "^2.4.0"
+
 "@typescript-eslint/[email protected]", "@typescript-eslint/parser@^8.56.1":
   version "8.56.1"
   resolved 
"https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-8.56.1.tgz#21d13b3d456ffb08614c1d68bb9a4f8d9237cdc7";
@@ -4832,6 +5180,15 @@
     "@typescript-eslint/visitor-keys" "8.56.1"
     debug "^4.4.3"
 
+"@typescript-eslint/[email protected]":
+  version "8.56.0"
+  resolved 
"https://registry.yarnpkg.com/@typescript-eslint/project-service/-/project-service-8.56.0.tgz#bb8562fecd8f7922e676fc6a1189c20dd7991d73";
+  integrity 
sha512-M3rnyL1vIQOMeWxTWIW096/TtVP+8W3p/XnaFflhmcFp+U4zlxUxWj4XwNs6HbDeTtN4yun0GNTTDBw/SvufKg==
+  dependencies:
+    "@typescript-eslint/tsconfig-utils" "^8.56.0"
+    "@typescript-eslint/types" "^8.56.0"
+    debug "^4.4.3"
+
 "@typescript-eslint/[email protected]":
   version "8.56.1"
   resolved 
"https://registry.yarnpkg.com/@typescript-eslint/project-service/-/project-service-8.56.1.tgz#65c8d645f028b927bfc4928593b54e2ecd809244";
@@ -4841,6 +5198,14 @@
     "@typescript-eslint/types" "^8.56.1"
     debug "^4.4.3"
 
+"@typescript-eslint/[email protected]":
+  version "8.56.0"
+  resolved 
"https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-8.56.0.tgz#604030a4c6433df3728effdd441d47f45a86edb4";
+  integrity 
sha512-7UiO/XwMHquH+ZzfVCfUNkIXlp/yQjjnlYUyYz7pfvlK3/EyyN6BK+emDmGNyQLBtLGaYrTAI6KOw8tFucWL2w==
+  dependencies:
+    "@typescript-eslint/types" "8.56.0"
+    "@typescript-eslint/visitor-keys" "8.56.0"
+
 "@typescript-eslint/[email protected]":
   version "8.56.1"
   resolved 
"https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-8.56.1.tgz#254df93b5789a871351335dd23e20bc164060f24";
@@ -4849,11 +5214,27 @@
     "@typescript-eslint/types" "8.56.1"
     "@typescript-eslint/visitor-keys" "8.56.1"
 
+"@typescript-eslint/[email protected]", 
"@typescript-eslint/tsconfig-utils@^8.56.0":
+  version "8.56.0"
+  resolved 
"https://registry.yarnpkg.com/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.56.0.tgz#2538ce83cbc376e685487960cbb24b65fe2abc4e";
+  integrity 
sha512-bSJoIIt4o3lKXD3xmDh9chZcjCz5Lk8xS7Rxn+6l5/pKrDpkCwtQNQQwZ2qRPk7TkUYhrq3WPIHXOXlbXP0itg==
+
 "@typescript-eslint/[email protected]", 
"@typescript-eslint/tsconfig-utils@^8.56.1":
   version "8.56.1"
   resolved 
"https://registry.yarnpkg.com/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.56.1.tgz#1afa830b0fada5865ddcabdc993b790114a879b7";
   integrity 
sha512-qOtCYzKEeyr3aR9f28mPJqBty7+DBqsdd63eO0yyDwc6vgThj2UjWfJIcsFeSucYydqcuudMOprZ+x1SpF3ZuQ==
 
+"@typescript-eslint/[email protected]":
+  version "8.56.0"
+  resolved 
"https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-8.56.0.tgz#72b4edc1fc73988998f1632b3ec99c2a66eaac6e";
+  integrity 
sha512-qX2L3HWOU2nuDs6GzglBeuFXviDODreS58tLY/BALPC7iu3Fa+J7EOTwnX9PdNBxUI7Uh0ntP0YWGnxCkXzmfA==
+  dependencies:
+    "@typescript-eslint/types" "8.56.0"
+    "@typescript-eslint/typescript-estree" "8.56.0"
+    "@typescript-eslint/utils" "8.56.0"
+    debug "^4.4.3"
+    ts-api-utils "^2.4.0"
+
 "@typescript-eslint/[email protected]":
   version "8.56.1"
   resolved 
"https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-8.56.1.tgz#7a6c4fabf225d674644931e004302cbbdd2f2e24";
@@ -4865,11 +5246,31 @@
     debug "^4.4.3"
     ts-api-utils "^2.4.0"
 
+"@typescript-eslint/[email protected]", "@typescript-eslint/types@^8.56.0":
+  version "8.56.0"
+  resolved 
"https://registry.yarnpkg.com/@typescript-eslint/types/-/types-8.56.0.tgz#a2444011b9a98ca13d70411d2cbfed5443b3526a";
+  integrity 
sha512-DBsLPs3GsWhX5HylbP9HNG15U0bnwut55Lx12bHB9MpXxQ+R5GC8MwQe+N1UFXxAeQDvEsEDY6ZYwX03K7Z6HQ==
+
 "@typescript-eslint/[email protected]", "@typescript-eslint/types@^8.56.1":
   version "8.56.1"
   resolved 
"https://registry.yarnpkg.com/@typescript-eslint/types/-/types-8.56.1.tgz#975e5942bf54895291337c91b9191f6eb0632ab9";
   integrity 
sha512-dbMkdIUkIkchgGDIv7KLUpa0Mda4IYjo4IAMJUZ+3xNoUXxMsk9YtKpTHSChRS85o+H9ftm51gsK1dZReY9CVw==
 
+"@typescript-eslint/[email protected]":
+  version "8.56.0"
+  resolved 
"https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-8.56.0.tgz#fadbc74c14c5bac947db04980ff58bb178701c2e";
+  integrity 
sha512-ex1nTUMWrseMltXUHmR2GAQ4d+WjkZCT4f+4bVsps8QEdh0vlBsaCokKTPlnqBFqqGaxilDNJG7b8dolW2m43Q==
+  dependencies:
+    "@typescript-eslint/project-service" "8.56.0"
+    "@typescript-eslint/tsconfig-utils" "8.56.0"
+    "@typescript-eslint/types" "8.56.0"
+    "@typescript-eslint/visitor-keys" "8.56.0"
+    debug "^4.4.3"
+    minimatch "^9.0.5"
+    semver "^7.7.3"
+    tinyglobby "^0.2.15"
+    ts-api-utils "^2.4.0"
+
 "@typescript-eslint/[email protected]":
   version "8.56.1"
   resolved 
"https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-8.56.1.tgz#3b9e57d8129a860c50864c42188f761bdef3eab0";
@@ -4885,6 +5286,16 @@
     tinyglobby "^0.2.15"
     ts-api-utils "^2.4.0"
 
+"@typescript-eslint/[email protected]":
+  version "8.56.0"
+  resolved 
"https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-8.56.0.tgz#063ce6f702ec603de1b83ee795ed5e877d6f7841";
+  integrity 
sha512-RZ3Qsmi2nFGsS+n+kjLAYDPVlrzf7UhTffrDIKr+h2yzAlYP/y5ZulU0yeDEPItos2Ph46JAL5P/On3pe7kDIQ==
+  dependencies:
+    "@eslint-community/eslint-utils" "^4.9.1"
+    "@typescript-eslint/scope-manager" "8.56.0"
+    "@typescript-eslint/types" "8.56.0"
+    "@typescript-eslint/typescript-estree" "8.56.0"
+
 "@typescript-eslint/[email protected]":
   version "8.56.1"
   resolved 
"https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-8.56.1.tgz#5a86acaf9f1b4c4a85a42effb217f73059f6deb7";
@@ -4895,6 +5306,14 @@
     "@typescript-eslint/types" "8.56.1"
     "@typescript-eslint/typescript-estree" "8.56.1"
 
+"@typescript-eslint/[email protected]":
+  version "8.56.0"
+  resolved 
"https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-8.56.0.tgz#7d6592ab001827d3ce052155edf7ecad19688d7d";
+  integrity 
sha512-q+SL+b+05Ud6LbEE35qe4A99P+htKTKVbyiNEe45eCbJFyh/HVK9QXwlrbz+Q4L8SOW4roxSVwXYj4DMBT7Ieg==
+  dependencies:
+    "@typescript-eslint/types" "8.56.0"
+    eslint-visitor-keys "^5.0.0"
+
 "@typescript-eslint/[email protected]":
   version "8.56.1"
   resolved 
"https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-8.56.1.tgz#50e03475c33a42d123dc99e63acf1841c0231f87";
@@ -5095,7 +5514,12 @@ acorn@^6.1.1:
   resolved "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz";
   integrity 
sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==
 
-acorn@^8.0.0, acorn@^8.0.4, acorn@^8.11.0, acorn@^8.14.0, acorn@^8.15.0, 
acorn@^8.16.0:
+acorn@^8.0.0, acorn@^8.0.4, acorn@^8.11.0, acorn@^8.14.0, acorn@^8.15.0:
+  version "8.15.0"
+  resolved "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz";
+  integrity 
sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==
+
+acorn@^8.16.0:
   version "8.16.0"
   resolved 
"https://registry.yarnpkg.com/acorn/-/acorn-8.16.0.tgz#4ce79c89be40afe7afe8f3adb902a1f1ce9ac08a";
   integrity 
sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==
@@ -5691,7 +6115,7 @@ browser-assert@^1.2.1:
   resolved 
"https://registry.npmjs.org/browser-assert/-/browser-assert-1.2.1.tgz";
   integrity 
sha512-nfulgvOR6S4gt9UKCeGJOuSGBPGiFT6oQ/2UBnvTY/5aQ1PnksW72fhZkM30DzoRRv2WpwZf1vHHEr3mtuXIWQ==
 
-browserslist@^4.0.0, browserslist@^4.23.0, browserslist@^4.24.0, 
browserslist@^4.24.4, browserslist@^4.25.0, browserslist@^4.25.3, 
browserslist@^4.28.1:
+browserslist@^4.0.0, browserslist@^4.23.0, browserslist@^4.24.0, 
browserslist@^4.24.2, browserslist@^4.24.4, browserslist@^4.25.0, 
browserslist@^4.25.3, browserslist@^4.28.1:
   version "4.28.1"
   resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz";
   integrity 
sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==
@@ -5814,7 +6238,12 @@ caniuse-api@^3.0.0:
     lodash.memoize "^4.1.2"
     lodash.uniq "^4.5.0"
 
-caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001702, caniuse-lite@^1.0.30001759, 
caniuse-lite@^1.0.30001775:
+caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001702, caniuse-lite@^1.0.30001759:
+  version "1.0.30001770"
+  resolved 
"https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001770.tgz#4dc47d3b263a50fbb243448034921e0a88591a84";
+  integrity 
sha512-x/2CLQ1jHENRbHg5PSId2sXq1CIO1CISvwWAj027ltMVG2UNgW+w9oH2+HzgEIRFembL8bUlXtfbBHR1fCg2xw==
+
+caniuse-lite@^1.0.30001775:
   version "1.0.30001775"
   resolved 
"https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001775.tgz#9572266e3f7f77efee5deac1efeb4795879d1b7f";
   integrity 
sha512-s3Qv7Lht9zbVKE9XoTyRG6wVDCKdtOFIjBGg3+Yhn6JaytuNKPIjBMTMIY1AnOH3seL5mvF+x33oGAyK3hVt3A==
@@ -9635,6 +10064,80 @@ levn@^0.4.1:
     prelude-ls "^1.2.1"
     type-check "~0.4.0"
 
[email protected]:
+  version "1.31.1"
+  resolved 
"https://registry.yarnpkg.com/lightningcss-android-arm64/-/lightningcss-android-arm64-1.31.1.tgz#609ff48332adff452a8157a7c2842fd692a8eac4";
+  integrity 
sha512-HXJF3x8w9nQ4jbXRiNppBCqeZPIAfUo8zE/kOEGbW5NZvGc/K7nMxbhIr+YlFlHW5mpbg/YFPdbnCh1wAXCKFg==
+
[email protected]:
+  version "1.31.1"
+  resolved 
"https://registry.yarnpkg.com/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.31.1.tgz#a13da040a7929582bab3ace9a67bdc146e99fc2d";
+  integrity 
sha512-02uTEqf3vIfNMq3h/z2cJfcOXnQ0GRwQrkmPafhueLb2h7mqEidiCzkE4gBMEH65abHRiQvhdcQ+aP0D0g67sg==
+
[email protected]:
+  version "1.31.1"
+  resolved 
"https://registry.yarnpkg.com/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.31.1.tgz#f7482c311273571ec0c2bd8277c1f5f6e90e03a4";
+  integrity 
sha512-1ObhyoCY+tGxtsz1lSx5NXCj3nirk0Y0kB/g8B8DT+sSx4G9djitg9ejFnjb3gJNWo7qXH4DIy2SUHvpoFwfTA==
+
[email protected]:
+  version "1.31.1"
+  resolved 
"https://registry.yarnpkg.com/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.31.1.tgz#91df1bb290f1cb7bb2af832d7d0d8809225e0124";
+  integrity 
sha512-1RINmQKAItO6ISxYgPwszQE1BrsVU5aB45ho6O42mu96UiZBxEXsuQ7cJW4zs4CEodPUioj/QrXW1r9pLUM74A==
+
[email protected]:
+  version "1.31.1"
+  resolved 
"https://registry.yarnpkg.com/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.31.1.tgz#c3cad5ae8b70045f21600dc95295ab6166acf57e";
+  integrity 
sha512-OOCm2//MZJ87CdDK62rZIu+aw9gBv4azMJuA8/KB74wmfS3lnC4yoPHm0uXZ/dvNNHmnZnB8XLAZzObeG0nS1g==
+
[email protected]:
+  version "1.31.1"
+  resolved 
"https://registry.yarnpkg.com/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.31.1.tgz#a5c4f6a5ac77447093f61b209c0bd7fef1f0a3e3";
+  integrity 
sha512-WKyLWztD71rTnou4xAD5kQT+982wvca7E6QoLpoawZ1gP9JM0GJj4Tp5jMUh9B3AitHbRZ2/H3W5xQmdEOUlLg==
+
[email protected]:
+  version "1.31.1"
+  resolved 
"https://registry.yarnpkg.com/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.31.1.tgz#af26ab8f829b727ada0a200938a6c8796ff36900";
+  integrity 
sha512-mVZ7Pg2zIbe3XlNbZJdjs86YViQFoJSpc41CbVmKBPiGmC4YrfeOyz65ms2qpAobVd7WQsbW4PdsSJEMymyIMg==
+
[email protected]:
+  version "1.31.1"
+  resolved 
"https://registry.yarnpkg.com/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.31.1.tgz#a891d44e84b71c0d88959feb9a7522bbf61450ee";
+  integrity 
sha512-xGlFWRMl+0KvUhgySdIaReQdB4FNudfUTARn7q0hh/V67PVGCs3ADFjw+6++kG1RNd0zdGRlEKa+T13/tQjPMA==
+
[email protected]:
+  version "1.31.1"
+  resolved 
"https://registry.yarnpkg.com/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.31.1.tgz#8c8b21def851f4d477fa897b80cb3db2b650bc6e";
+  integrity 
sha512-eowF8PrKHw9LpoZii5tdZwnBcYDxRw2rRCyvAXLi34iyeYfqCQNA9rmUM0ce62NlPhCvof1+9ivRaTY6pSKDaA==
+
[email protected]:
+  version "1.31.1"
+  resolved 
"https://registry.yarnpkg.com/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.31.1.tgz#79000fb8c57e94a91b8fc643e74d5a54407d7080";
+  integrity 
sha512-aJReEbSEQzx1uBlQizAOBSjcmr9dCdL3XuC/6HLXAxmtErsj2ICo5yYggg1qOODQMtnjNQv2UHb9NpOuFtYe4w==
+
[email protected]:
+  version "1.31.1"
+  resolved 
"https://registry.yarnpkg.com/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.31.1.tgz#7f025274c81c7d659829731e09c8b6f442209837";
+  integrity 
sha512-I9aiFrbd7oYHwlnQDqr1Roz+fTz61oDDJX7n9tYF9FJymH1cIN1DtKw3iYt6b8WZgEjoNwVSncwF4wx/ZedMhw==
+
+lightningcss@^1.27.0:
+  version "1.31.1"
+  resolved 
"https://registry.yarnpkg.com/lightningcss/-/lightningcss-1.31.1.tgz#1a19dd327b547a7eda1d5c296ebe1e72df5a184b";
+  integrity 
sha512-l51N2r93WmGUye3WuFoN5k10zyvrVs0qfKBhyC5ogUQ6Ew6JUSswh78mbSO+IU3nTWsyOArqPCcShdQSadghBQ==
+  dependencies:
+    detect-libc "^2.0.3"
+  optionalDependencies:
+    lightningcss-android-arm64 "1.31.1"
+    lightningcss-darwin-arm64 "1.31.1"
+    lightningcss-darwin-x64 "1.31.1"
+    lightningcss-freebsd-x64 "1.31.1"
+    lightningcss-linux-arm-gnueabihf "1.31.1"
+    lightningcss-linux-arm64-gnu "1.31.1"
+    lightningcss-linux-arm64-musl "1.31.1"
+    lightningcss-linux-x64-gnu "1.31.1"
+    lightningcss-linux-x64-musl "1.31.1"
+    lightningcss-win32-arm64-msvc "1.31.1"
+    lightningcss-win32-x64-msvc "1.31.1"
+
 lilconfig@^3.1.1:
   version "3.1.3"
   resolved "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz";
@@ -10840,13 +11343,20 @@ [email protected], minimatch@^3.1.1, minimatch@^3.1.2:
   dependencies:
     brace-expansion "^1.1.7"
 
-minimatch@^10.2.1, minimatch@^10.2.2:
+minimatch@^10.2.1:
   version "10.2.2"
   resolved 
"https://registry.yarnpkg.com/minimatch/-/minimatch-10.2.2.tgz#361603ee323cfb83496fea2ae17cc44ea4e1f99f";
   integrity 
sha512-+G4CpNBxa5MprY+04MbgOw1v7So6n5JY166pFi9KfYwT78fxScCeSNQSNzp6dpPSW2rONOps6Ocam1wFhCgoVw==
   dependencies:
     brace-expansion "^5.0.2"
 
+minimatch@^10.2.2:
+  version "10.2.4"
+  resolved 
"https://registry.yarnpkg.com/minimatch/-/minimatch-10.2.4.tgz#465b3accbd0218b8281f5301e27cedc697f96fde";
+  integrity 
sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg==
+  dependencies:
+    brace-expansion "^5.0.2"
+
 minimatch@^5.0.1:
   version "5.1.6"
   resolved "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz";
@@ -10854,6 +11364,13 @@ minimatch@^5.0.1:
   dependencies:
     brace-expansion "^2.0.1"
 
+minimatch@^9.0.5:
+  version "9.0.5"
+  resolved "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz";
+  integrity 
sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==
+  dependencies:
+    brace-expansion "^2.0.1"
+
 minimist@^1.2.0:
   version "1.2.8"
   resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz";
@@ -14147,7 +14664,7 @@ [email protected], swagger2openapi@^7.0.8:
     yaml "^1.10.0"
     yargs "^17.0.1"
 
-swc-loader@^0.2.7:
+swc-loader@^0.2.6, swc-loader@^0.2.7:
   version "0.2.7"
   resolved "https://registry.npmjs.org/swc-loader/-/swc-loader-0.2.7.tgz";
   integrity 
sha512-nwYWw3Fh9ame3Rtm7StS9SBLpHRRnYcK7bnpF3UKZmesAK0gw2/ADvlURFAINmPvKtDLzp+GBiP9yLoEjg6S9w==
@@ -14367,7 +14884,7 @@ ts-toolbelt@^9.6.0:
   resolved "https://registry.npmjs.org/ts-toolbelt/-/ts-toolbelt-9.6.0.tgz";
   integrity 
sha512-nsZd8ZeNUzukXPlJmTBwUAuABDe/9qtVDelJeT/qW0ow3ZS3BsQJtNkan1802aM9Uf68/Y8ljw86Hu0h5IUW3w==
 
-tslib@^2.0.0, tslib@^2.0.1, tslib@^2.0.3, tslib@^2.3.0, tslib@^2.6.0:
+tslib@^2.0.0, tslib@^2.0.1, tslib@^2.0.3, tslib@^2.3.0, tslib@^2.4.0, 
tslib@^2.6.0:
   version "2.8.1"
   resolved "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz";
   integrity 
sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==
@@ -15074,6 +15591,11 @@ webpack-merge@^6.0.1:
     flat "^5.0.2"
     wildcard "^2.0.1"
 
+webpack-sources@^3.3.3:
+  version "3.3.3"
+  resolved 
"https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.3.3.tgz";
+  integrity 
sha512-yd1RBzSGanHkitROoPFd6qsrxt+oFhg/129YzheDGqeustzX0vTZJZsSsQjVQC4yzBQ56K55XU8gaNCtIzOnTg==
+
 webpack-sources@^3.3.4:
   version "3.3.4"
   resolved 
"https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-3.3.4.tgz#a338b95eb484ecc75fbb196cbe8a2890618b4891";
@@ -15084,7 +15606,7 @@ webpack-virtual-modules@^0.6.2:
   resolved 
"https://registry.npmjs.org/webpack-virtual-modules/-/webpack-virtual-modules-0.6.2.tgz";
   integrity 
sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==
 
-webpack@^5.105.3, webpack@^5.88.1, webpack@^5.95.0:
+webpack@^5.105.3:
   version "5.105.3"
   resolved 
"https://registry.yarnpkg.com/webpack/-/webpack-5.105.3.tgz#307ad95bafffd08bc81049d6519477b16e42e7ba";
   integrity 
sha512-LLBBA4oLmT7sZdHiYE/PeVuifOxYyE2uL/V+9VQP7YSYdJU7bSf7H8bZRRxW8kEPMkmVjnrXmoR3oejIdX0xbg==
@@ -15115,6 +15637,37 @@ webpack@^5.105.3, webpack@^5.88.1, webpack@^5.95.0:
     watchpack "^2.5.1"
     webpack-sources "^3.3.4"
 
+webpack@^5.88.1, webpack@^5.95.0:
+  version "5.105.2"
+  resolved 
"https://registry.yarnpkg.com/webpack/-/webpack-5.105.2.tgz#f3b76f9fc36f1152e156e63ffda3bbb82e6739ea";
+  integrity 
sha512-dRXm0a2qcHPUBEzVk8uph0xWSjV/xZxenQQbLwnwP7caQCYpqG1qddwlyEkIDkYn0K8tvmcrZ+bOrzoQ3HxCDw==
+  dependencies:
+    "@types/eslint-scope" "^3.7.7"
+    "@types/estree" "^1.0.8"
+    "@types/json-schema" "^7.0.15"
+    "@webassemblyjs/ast" "^1.14.1"
+    "@webassemblyjs/wasm-edit" "^1.14.1"
+    "@webassemblyjs/wasm-parser" "^1.14.1"
+    acorn "^8.15.0"
+    acorn-import-phases "^1.0.3"
+    browserslist "^4.28.1"
+    chrome-trace-event "^1.0.2"
+    enhanced-resolve "^5.19.0"
+    es-module-lexer "^2.0.0"
+    eslint-scope "5.1.1"
+    events "^3.2.0"
+    glob-to-regexp "^0.4.1"
+    graceful-fs "^4.2.11"
+    json-parse-even-better-errors "^2.3.1"
+    loader-runner "^4.3.1"
+    mime-types "^2.1.27"
+    neo-async "^2.6.2"
+    schema-utils "^4.3.3"
+    tapable "^2.3.0"
+    terser-webpack-plugin "^5.3.16"
+    watchpack "^2.5.1"
+    webpack-sources "^3.3.3"
+
 webpackbar@^6.0.1:
   version "6.0.1"
   resolved "https://registry.npmjs.org/webpackbar/-/webpackbar-6.0.1.tgz";

Reply via email to