소스 검색

更新deno.lock文件,添加Ant Design及相关依赖项,优化主题设置页面的配色方案逻辑,增强测试用例以确保功能正常,提升代码可维护性和用户体验。

zyh 8 달 전
부모
커밋
e6ef814950
3개의 변경된 파일775개의 추가작업 그리고 63개의 파일을 삭제
  1. 20 16
      client/admin/pages_settings.tsx
  2. 101 46
      client/admin/test/theme_setting_page.test.tsx
  3. 654 1
      deno.lock

+ 20 - 16
client/admin/pages_settings.tsx

@@ -481,22 +481,26 @@ export const ThemeSettingsPage = () => {
             {/* 配色方案选择 */}
             <Form.Item label="预设配色方案">
               <Space wrap>
-                {Object.entries(COLOR_SCHEMES[form.getFieldValue('theme_mode') as ThemeMode]).map(([key, scheme]) => (
-                  <Button
-                    key={key}
-                    onClick={() => {
-                      handleColorSchemeChange(key);
-                      form.setFieldValue('scheme_name', scheme.name);
-                    }}
-                    style={{
-                      backgroundColor: scheme.background,
-                      color: scheme.text,
-                      borderColor: scheme.primary
-                    }}
-                  >
-                    {scheme.name}
-                  </Button>
-                ))}
+                {(() => {
+                  const themeMode = (form.getFieldValue('theme_mode') as ThemeMode) || ThemeMode.LIGHT;
+                  const schemes = COLOR_SCHEMES[themeMode] || {};
+                  return Object.entries(schemes).map(([key, scheme]) => (
+                    <Button
+                      key={key}
+                      onClick={() => {
+                        handleColorSchemeChange(key);
+                        form.setFieldValue('scheme_name', scheme.name);
+                      }}
+                      style={{
+                        backgroundColor: scheme.background,
+                        color: scheme.text,
+                        borderColor: scheme.primary
+                      }}
+                    >
+                      {scheme.name}
+                    </Button>
+                  ));
+                })()}
               </Space>
             </Form.Item>
 

+ 101 - 46
client/admin/test/theme_setting_page.test.tsx

@@ -1,61 +1,116 @@
 import { JSDOM } from 'npm:jsdom'
 import React from 'react'
+import 'npm:jsdom-global'
 import {render, fireEvent, within, screen} from '@testing-library/react'
 import { ThemeSettingsPage } from "../pages_settings.tsx"
 import { ThemeProvider } from "../hooks_sys.tsx"
 import { QueryClient, QueryClientProvider } from '@tanstack/react-query'
+import {
+  assertEquals,
+  assertExists,
+  assertNotEquals,
+  assertRejects,
+} from "https://deno.land/std@0.217.0/assert/mod.ts";
 
 const queryClient = new QueryClient()
 
 
-const dom = new JSDOM(`<body></body>`, { runScripts: "dangerously" ,  pretendToBeVisual: true });
+const dom = new JSDOM(`<body></body>`, { 
+  runScripts: "dangerously",
+  pretendToBeVisual: true,
+  url: "http://localhost"
+});
 
-// The script will be executed and modify the DOM:
-// console.log(dom.window.document.getElementById("root").innerHTML); // 1
+// 模拟浏览器环境
 globalThis.window = dom.window;
 globalThis.document = dom.window.document;
-const customScreen = within(document.body)
 
-// console.log(dom.window.document.getElementById("root").innerHTML); // 1
-// const div = globalThis.document.createElement("div");
-// div.innerHTML = "主题设置";
-// globalThis.document.getElementById("root")?.appendChild(div);
-
-// render(<TestNode />);
-
-// const testMessage = 'Test Message'
-// render(<HiddenMessage>{testMessage}</HiddenMessage>)
-// console.log('document.body.innerHTML', document.body.innerHTML);
-// const customScreen = within(document.body)
-
-// screen.debug()
-
-// // // query* functions will return the element or null if it cannot be found
-// // // get* functions will return the element or throw an error if it cannot be found
-// console.log('queryByText', customScreen.queryByText(testMessage))
-
-// // // the queries can accept a regex to make your selectors more resilient to content tweaks and changes.
-// fireEvent.click(customScreen.getByLabelText(/show/i))
-
-// screen.debug()
-
-// // // .toBeInTheDocument() is an assertion that comes from jest-dom
-// // // otherwise you could use .toBeDefined()
-// console.log('getByText', customScreen.getByText(testMessage).innerHTML.includes(testMessage))
-
-// // console.log(globalThis.document.body.innerHTML);
-// // console.log(screen.debug());
-// // screen.findByText("主题设置");
-
-render((
-  <QueryClientProvider client={queryClient}>
-    <ThemeProvider>
-      <ThemeSettingsPage />
-    </ThemeProvider>
-  </QueryClientProvider>
-))
-
-screen.debug()
-
-// screen.findByText("主题设置")
+// 定义浏览器环境所需的类
+globalThis.Element = dom.window.Element;
+globalThis.HTMLElement = dom.window.HTMLElement;
+globalThis.ShadowRoot = dom.window.ShadowRoot;
+globalThis.SVGElement = dom.window.SVGElement;
+
+// 模拟 getComputedStyle
+globalThis.getComputedStyle = (elt) => {
+  const style = new dom.window.CSSStyleDeclaration();
+  style.getPropertyValue = () => '';
+  return style;
+};
+
+// 模拟matchMedia函数
+globalThis.matchMedia = (query) => ({
+  matches: query.includes('max-width'),
+  media: query,
+  onchange: null,
+  addListener: () => {},
+  removeListener: () => {},
+  addEventListener: () => {},
+  removeEventListener: () => {},
+  dispatchEvent: () => false,
+});
+
+// 模拟动画相关API
+globalThis.AnimationEvent = globalThis.AnimationEvent || dom.window.Event;
+globalThis.TransitionEvent = globalThis.TransitionEvent || dom.window.Event;
+
+// 模拟requestAnimationFrame
+globalThis.requestAnimationFrame = globalThis.requestAnimationFrame || ((cb) => setTimeout(cb, 0));
+globalThis.cancelAnimationFrame = globalThis.cancelAnimationFrame || clearTimeout;
+
+// 设置浏览器尺寸相关方法
+window.resizeTo = (width, height) => {
+  window.innerWidth = width || window.innerWidth;
+  window.innerHeight = height || window.innerHeight;
+  window.dispatchEvent(new Event('resize'));
+};
+window.scrollTo = () => {};
+
+const customScreen = within(document.body);
+
+// 使用异步测试处理真实API调用
+Deno.test('主题设置页面测试', async (t) => {
+  // 渲染组件
+  const {findByRole, debug} = render(
+    <QueryClientProvider client={queryClient}>
+      <ThemeProvider>
+        <ThemeSettingsPage />
+      </ThemeProvider>
+    </QueryClientProvider>
+  )
+
+  debug(await findByRole('radio', { name: /浅色模式/i }))
+
+  // 测试1: 渲染基本元素
+  await t.step('应渲染主题设置标题', async () => {
+    const title = await customScreen.findByText(/主题设置/i)
+    assertExists(title, '未找到主题设置标题')
+  })
+
+  // 测试2: 表单初始化状态
+  await t.step('表单应正确初始化', async () => {
+    // 检查主题模式选择
+    const lightRadio = await customScreen.findByRole('radio', { name: /浅色模式/i })
+    assertExists(lightRadio, '未找到浅色模式单选按钮')
+    
+    // 检查主题模式标签
+    const themeModeLabel = await customScreen.findByText(/主题模式/i)
+    assertExists(themeModeLabel, '未找到主题模式标签')
+    
+    // // 检查主题模式选择器 - Ant Design 使用 div 包裹 radio 而不是 radiogroup
+    // const themeModeField = await customScreen.findByTestId('theme-mode-selector')
+    // assertExists(themeModeField, '未找到主题模式选择器')
+  })
+
+  // 测试3: 配色方案选择
+  await t.step('应显示配色方案选项', async () => {
+    // 查找预设配色方案标签
+    const colorSchemeLabel = await customScreen.findByText('预设配色方案')
+    assertExists(colorSchemeLabel, '未找到预设配色方案标签')
+    
+    // 查找配色方案按钮
+    const colorSchemeButtons = await customScreen.findAllByRole('button')
+    assertNotEquals(colorSchemeButtons.length, 0, '未找到配色方案按钮')
+  })
+})
 

+ 654 - 1
deno.lock

@@ -7,9 +7,11 @@
     "npm:@testing-library/react@16.3.0": "16.3.0_@testing-library+dom@10.4.0_react@19.1.0_react-dom@19.1.0__react@19.1.0",
     "npm:@testing-library/user-event@*": "14.6.1_@testing-library+dom@10.4.0",
     "npm:@types/node@*": "22.12.0",
+    "npm:antd@*": "5.24.6_react@19.1.0_react-dom@19.1.0__react@19.1.0_dayjs@1.11.13",
     "npm:global-jsdom@*": "26.0.0_jsdom@26.0.0",
     "npm:j@*": "1.0.0",
     "npm:js@*": "0.1.0",
+    "npm:jsdom-global@*": "3.0.2_jsdom@26.0.0",
     "npm:jsdom@*": "26.0.0",
     "npm:react@*": "19.1.0"
   },
@@ -22,6 +24,68 @@
     "@adobe/css-tools@4.4.2": {
       "integrity": "sha512-baYZExFpsdkBNuvGKTKWCwKH57HRZLVtycZS05WTQNVOiXVSeAki3nU35zlRbToeMW8aHlJfyS+1C4BOv27q0A=="
     },
+    "@ant-design/colors@7.2.0": {
+      "integrity": "sha512-bjTObSnZ9C/O8MB/B4OUtd/q9COomuJAR2SYfhxLyHvCKn4EKwCN3e+fWGMo7H5InAyV0wL17jdE9ALrdOW/6A==",
+      "dependencies": [
+        "@ant-design/fast-color"
+      ]
+    },
+    "@ant-design/cssinjs-utils@1.1.3_react@19.1.0_react-dom@19.1.0__react@19.1.0": {
+      "integrity": "sha512-nOoQMLW1l+xR1Co8NFVYiP8pZp3VjIIzqV6D6ShYF2ljtdwWJn5WSsH+7kvCktXL/yhEtWURKOfH5Xz/gzlwsg==",
+      "dependencies": [
+        "@ant-design/cssinjs",
+        "@babel/runtime",
+        "rc-util",
+        "react",
+        "react-dom"
+      ]
+    },
+    "@ant-design/cssinjs@1.23.0_react@19.1.0_react-dom@19.1.0__react@19.1.0": {
+      "integrity": "sha512-7GAg9bD/iC9ikWatU9ym+P9ugJhi/WbsTWzcKN6T4gU0aehsprtke1UAaaSxxkjjmkJb3llet/rbUSLPgwlY4w==",
+      "dependencies": [
+        "@babel/runtime",
+        "@emotion/hash",
+        "@emotion/unitless",
+        "classnames",
+        "csstype",
+        "rc-util",
+        "react",
+        "react-dom",
+        "stylis"
+      ]
+    },
+    "@ant-design/fast-color@2.0.6": {
+      "integrity": "sha512-y2217gk4NqL35giHl72o6Zzqji9O7vHh9YmhUVkPtAOpoTCH4uWxo/pr4VE8t0+ChEPs0qo4eJRC5Q1eXWo3vA==",
+      "dependencies": [
+        "@babel/runtime"
+      ]
+    },
+    "@ant-design/icons-svg@4.4.2": {
+      "integrity": "sha512-vHbT+zJEVzllwP+CM+ul7reTEfBR0vgxFe7+lREAsAA7YGsYpboiq2sQNeQeRvh09GfQgs/GyFEvZpJ9cLXpXA=="
+    },
+    "@ant-design/icons@5.6.1_react@19.1.0_react-dom@19.1.0__react@19.1.0": {
+      "integrity": "sha512-0/xS39c91WjPAZOWsvi1//zjx6kAp4kxWwctR6kuU6p133w8RU0D2dSCvZC19uQyharg/sAvYxGYWl01BbZZfg==",
+      "dependencies": [
+        "@ant-design/colors",
+        "@ant-design/icons-svg",
+        "@babel/runtime",
+        "classnames",
+        "rc-util",
+        "react",
+        "react-dom"
+      ]
+    },
+    "@ant-design/react-slick@1.1.2_react@19.1.0": {
+      "integrity": "sha512-EzlvzE6xQUBrZuuhSAFTdsr4P2bBBHGZwKFemEfq8gIGyIQCxalYfZW/T2ORbtQx5rU69o+WycP3exY/7T1hGA==",
+      "dependencies": [
+        "@babel/runtime",
+        "classnames",
+        "json2mq",
+        "react",
+        "resize-observer-polyfill",
+        "throttle-debounce"
+      ]
+    },
     "@asamuzakjp/css-color@3.1.1_@csstools+css-parser-algorithms@3.0.4__@csstools+css-tokenizer@3.0.3_@csstools+css-tokenizer@3.0.3": {
       "integrity": "sha512-hpRD68SV2OMcZCsrbdkccTw5FXjNDLo5OuqSHyHZfwweGsDWZwDJ2+gONyNAbazZclobMirACLw0lk8WVxIqxA==",
       "dependencies": [
@@ -77,6 +141,99 @@
     "@csstools/css-tokenizer@3.0.3": {
       "integrity": "sha512-UJnjoFsmxfKUdNYdWgOB0mWUypuLvAfQPH1+pyvRJs6euowbFkFC6P13w1l8mJyi3vxYMxc9kld5jZEGRQs6bw=="
     },
+    "@emotion/hash@0.8.0": {
+      "integrity": "sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow=="
+    },
+    "@emotion/unitless@0.7.5": {
+      "integrity": "sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg=="
+    },
+    "@rc-component/async-validator@5.0.4": {
+      "integrity": "sha512-qgGdcVIF604M9EqjNF0hbUTz42bz/RDtxWdWuU5EQe3hi7M8ob54B6B35rOsvX5eSvIHIzT9iH1R3n+hk3CGfg==",
+      "dependencies": [
+        "@babel/runtime"
+      ]
+    },
+    "@rc-component/color-picker@2.0.1_react@19.1.0_react-dom@19.1.0__react@19.1.0": {
+      "integrity": "sha512-WcZYwAThV/b2GISQ8F+7650r5ZZJ043E57aVBFkQ+kSY4C6wdofXgB0hBx+GPGpIU0Z81eETNoDUJMr7oy/P8Q==",
+      "dependencies": [
+        "@ant-design/fast-color",
+        "@babel/runtime",
+        "classnames",
+        "rc-util",
+        "react",
+        "react-dom"
+      ]
+    },
+    "@rc-component/context@1.4.0_react@19.1.0_react-dom@19.1.0__react@19.1.0": {
+      "integrity": "sha512-kFcNxg9oLRMoL3qki0OMxK+7g5mypjgaaJp/pkOis/6rVxma9nJBF/8kCIuTYHUQNr0ii7MxqE33wirPZLJQ2w==",
+      "dependencies": [
+        "@babel/runtime",
+        "rc-util",
+        "react",
+        "react-dom"
+      ]
+    },
+    "@rc-component/mini-decimal@1.1.0": {
+      "integrity": "sha512-jS4E7T9Li2GuYwI6PyiVXmxTiM6b07rlD9Ge8uGZSCz3WlzcG5ZK7g5bbuKNeZ9pgUuPK/5guV781ujdVpm4HQ==",
+      "dependencies": [
+        "@babel/runtime"
+      ]
+    },
+    "@rc-component/mutate-observer@1.1.0_react@19.1.0_react-dom@19.1.0__react@19.1.0": {
+      "integrity": "sha512-QjrOsDXQusNwGZPf4/qRQasg7UFEj06XiCJ8iuiq/Io7CrHrgVi6Uuetw60WAMG1799v+aM8kyc+1L/GBbHSlw==",
+      "dependencies": [
+        "@babel/runtime",
+        "classnames",
+        "rc-util",
+        "react",
+        "react-dom"
+      ]
+    },
+    "@rc-component/portal@1.1.2_react@19.1.0_react-dom@19.1.0__react@19.1.0": {
+      "integrity": "sha512-6f813C0IsasTZms08kfA8kPAGxbbkYToa8ALaiDIGGECU4i9hj8Plgbx0sNJDrey3EtHO30hmdaxtT0138xZcg==",
+      "dependencies": [
+        "@babel/runtime",
+        "classnames",
+        "rc-util",
+        "react",
+        "react-dom"
+      ]
+    },
+    "@rc-component/qrcode@1.0.0_react@19.1.0_react-dom@19.1.0__react@19.1.0": {
+      "integrity": "sha512-L+rZ4HXP2sJ1gHMGHjsg9jlYBX/SLN2D6OxP9Zn3qgtpMWtO2vUfxVFwiogHpAIqs54FnALxraUy/BCO1yRIgg==",
+      "dependencies": [
+        "@babel/runtime",
+        "classnames",
+        "rc-util",
+        "react",
+        "react-dom"
+      ]
+    },
+    "@rc-component/tour@1.15.1_react@19.1.0_react-dom@19.1.0__react@19.1.0": {
+      "integrity": "sha512-Tr2t7J1DKZUpfJuDZWHxyxWpfmj8EZrqSgyMZ+BCdvKZ6r1UDsfU46M/iWAAFBy961Ssfom2kv5f3UcjIL2CmQ==",
+      "dependencies": [
+        "@babel/runtime",
+        "@rc-component/portal",
+        "@rc-component/trigger",
+        "classnames",
+        "rc-util",
+        "react",
+        "react-dom"
+      ]
+    },
+    "@rc-component/trigger@2.2.6_react@19.1.0_react-dom@19.1.0__react@19.1.0": {
+      "integrity": "sha512-/9zuTnWwhQ3S3WT1T8BubuFTT46kvnXgaERR9f4BTKyn61/wpf/BvbImzYBubzJibU707FxwbKszLlHjcLiv1Q==",
+      "dependencies": [
+        "@babel/runtime",
+        "@rc-component/portal",
+        "classnames",
+        "rc-motion",
+        "rc-resize-observer",
+        "rc-util",
+        "react",
+        "react-dom"
+      ]
+    },
     "@testing-library/dom@10.4.0": {
       "integrity": "sha512-pemlzrSESWbdAloYml3bAJMEfNh1Z7EduzqPKprCH5S341frlpYnUEW0H72dLxa6IsYr+mPno20GiSm+h9dEdQ==",
       "dependencies": [
@@ -144,6 +301,62 @@
     "ansi-styles@5.2.0": {
       "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA=="
     },
+    "antd@5.24.6_react@19.1.0_react-dom@19.1.0__react@19.1.0_dayjs@1.11.13": {
+      "integrity": "sha512-xIlTa/1CTbgkZsdU/dOXkYvJXb9VoiMwsaCzpKFH2zAEY3xqOfwQ57/DdG7lAdrWP7QORtSld4UA6suxzuTHXw==",
+      "dependencies": [
+        "@ant-design/colors",
+        "@ant-design/cssinjs",
+        "@ant-design/cssinjs-utils",
+        "@ant-design/fast-color",
+        "@ant-design/icons",
+        "@ant-design/react-slick",
+        "@babel/runtime",
+        "@rc-component/color-picker",
+        "@rc-component/mutate-observer",
+        "@rc-component/qrcode",
+        "@rc-component/tour",
+        "@rc-component/trigger",
+        "classnames",
+        "copy-to-clipboard",
+        "dayjs",
+        "rc-cascader",
+        "rc-checkbox",
+        "rc-collapse",
+        "rc-dialog",
+        "rc-drawer",
+        "rc-dropdown",
+        "rc-field-form",
+        "rc-image",
+        "rc-input",
+        "rc-input-number",
+        "rc-mentions",
+        "rc-menu",
+        "rc-motion",
+        "rc-notification",
+        "rc-pagination",
+        "rc-picker",
+        "rc-progress",
+        "rc-rate",
+        "rc-resize-observer",
+        "rc-segmented",
+        "rc-select",
+        "rc-slider",
+        "rc-steps",
+        "rc-switch",
+        "rc-table",
+        "rc-tabs",
+        "rc-textarea",
+        "rc-tooltip",
+        "rc-tree",
+        "rc-tree-select",
+        "rc-upload",
+        "rc-util",
+        "react",
+        "react-dom",
+        "scroll-into-view-if-needed",
+        "throttle-debounce"
+      ]
+    },
     "aria-query@5.3.0": {
       "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==",
       "dependencies": [
@@ -184,6 +397,9 @@
         "supports-color"
       ]
     },
+    "classnames@2.5.1": {
+      "integrity": "sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow=="
+    },
     "codepage@1.15.0": {
       "integrity": "sha512-3g6NUTPd/YtuuGrhMnOMRjFc+LJw/bnMp3+0r/Wcz3IXUuCosKRJvMphm5+Q+bvTVGcJJuRvVLuYba+WojaFaA=="
     },
@@ -211,6 +427,9 @@
     "commander@13.1.0": {
       "integrity": "sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw=="
     },
+    "compute-scroll-into-view@3.1.1": {
+      "integrity": "sha512-VRhuHOLoKYOy4UbilLbUzbYg93XLjv2PncJC50EuTWPA3gaja1UjBsUP/D/9/juV3vQFr6XBEzn9KCAHdUvOHw=="
+    },
     "concat-stream@2.0.0": {
       "integrity": "sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==",
       "dependencies": [
@@ -220,6 +439,12 @@
         "typedarray"
       ]
     },
+    "copy-to-clipboard@3.3.3": {
+      "integrity": "sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA==",
+      "dependencies": [
+        "toggle-selection"
+      ]
+    },
     "crc-32@1.2.2": {
       "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ=="
     },
@@ -233,6 +458,9 @@
         "rrweb-cssom"
       ]
     },
+    "csstype@3.1.3": {
+      "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw=="
+    },
     "data-urls@5.0.0": {
       "integrity": "sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==",
       "dependencies": [
@@ -240,6 +468,9 @@
         "whatwg-url"
       ]
     },
+    "dayjs@1.11.13": {
+      "integrity": "sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg=="
+    },
     "debug@4.4.0": {
       "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==",
       "dependencies": [
@@ -413,6 +644,12 @@
         "commander@1.1.1"
       ]
     },
+    "jsdom-global@3.0.2_jsdom@26.0.0": {
+      "integrity": "sha512-t1KMcBkz/pT5JrvcJbpUR2u/w1kO9jXctaaGJ0vZDzwFnIvGWw9IDSRciT83kIs8Bnw4qpOl8bQK08V01YgMPg==",
+      "dependencies": [
+        "jsdom"
+      ]
+    },
     "jsdom@26.0.0": {
       "integrity": "sha512-BZYDGVAIriBWTpIxYzrXjv3E/4u8+/pSG5bQdIYCbNCGOvsPkDQfTVLAIXAf9ETdCpduCVTkDe2NNZ8NIwUVzw==",
       "dependencies": [
@@ -439,6 +676,12 @@
         "xml-name-validator"
       ]
     },
+    "json2mq@0.2.0": {
+      "integrity": "sha512-SzoRg7ux5DWTII9J2qkrZrqV1gt+rTaoufMxEzXbS26Uid0NwaJd123HcoB80TgubEppxxIGdNxCx50fEoEWQA==",
+      "dependencies": [
+        "string-convert"
+      ]
+    },
     "keypress@0.1.0": {
       "integrity": "sha512-x0yf9PL/nx9Nw9oLL8ZVErFAk85/lslwEP7Vz7s5SI1ODXZIgit3C5qyWjw4DxOuO/3Hb4866SQh28a1V1d+WA=="
     },
@@ -486,12 +729,398 @@
       "dependencies": [
         "ansi-regex",
         "ansi-styles@5.2.0",
-        "react-is"
+        "react-is@17.0.2"
       ]
     },
     "punycode@2.3.1": {
       "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg=="
     },
+    "rc-cascader@3.33.1_react@19.1.0_react-dom@19.1.0__react@19.1.0": {
+      "integrity": "sha512-Kyl4EJ7ZfCBuidmZVieegcbFw0RcU5bHHSbtEdmuLYd0fYHCAiYKZ6zon7fWAVyC6rWWOOib0XKdTSf7ElC9rg==",
+      "dependencies": [
+        "@babel/runtime",
+        "classnames",
+        "rc-select",
+        "rc-tree",
+        "rc-util",
+        "react",
+        "react-dom"
+      ]
+    },
+    "rc-checkbox@3.5.0_react@19.1.0_react-dom@19.1.0__react@19.1.0": {
+      "integrity": "sha512-aOAQc3E98HteIIsSqm6Xk2FPKIER6+5vyEFMZfo73TqM+VVAIqOkHoPjgKLqSNtVLWScoaM7vY2ZrGEheI79yg==",
+      "dependencies": [
+        "@babel/runtime",
+        "classnames",
+        "rc-util",
+        "react",
+        "react-dom"
+      ]
+    },
+    "rc-collapse@3.9.0_react@19.1.0_react-dom@19.1.0__react@19.1.0": {
+      "integrity": "sha512-swDdz4QZ4dFTo4RAUMLL50qP0EY62N2kvmk2We5xYdRwcRn8WcYtuetCJpwpaCbUfUt5+huLpVxhvmnK+PHrkA==",
+      "dependencies": [
+        "@babel/runtime",
+        "classnames",
+        "rc-motion",
+        "rc-util",
+        "react",
+        "react-dom"
+      ]
+    },
+    "rc-dialog@9.6.0_react@19.1.0_react-dom@19.1.0__react@19.1.0": {
+      "integrity": "sha512-ApoVi9Z8PaCQg6FsUzS8yvBEQy0ZL2PkuvAgrmohPkN3okps5WZ5WQWPc1RNuiOKaAYv8B97ACdsFU5LizzCqg==",
+      "dependencies": [
+        "@babel/runtime",
+        "@rc-component/portal",
+        "classnames",
+        "rc-motion",
+        "rc-util",
+        "react",
+        "react-dom"
+      ]
+    },
+    "rc-drawer@7.2.0_react@19.1.0_react-dom@19.1.0__react@19.1.0": {
+      "integrity": "sha512-9lOQ7kBekEJRdEpScHvtmEtXnAsy+NGDXiRWc2ZVC7QXAazNVbeT4EraQKYwCME8BJLa8Bxqxvs5swwyOepRwg==",
+      "dependencies": [
+        "@babel/runtime",
+        "@rc-component/portal",
+        "classnames",
+        "rc-motion",
+        "rc-util",
+        "react",
+        "react-dom"
+      ]
+    },
+    "rc-dropdown@4.2.1_react@19.1.0_react-dom@19.1.0__react@19.1.0": {
+      "integrity": "sha512-YDAlXsPv3I1n42dv1JpdM7wJ+gSUBfeyPK59ZpBD9jQhK9jVuxpjj3NmWQHOBceA1zEPVX84T2wbdb2SD0UjmA==",
+      "dependencies": [
+        "@babel/runtime",
+        "@rc-component/trigger",
+        "classnames",
+        "rc-util",
+        "react",
+        "react-dom"
+      ]
+    },
+    "rc-field-form@2.7.0_react@19.1.0_react-dom@19.1.0__react@19.1.0": {
+      "integrity": "sha512-hgKsCay2taxzVnBPZl+1n4ZondsV78G++XVsMIJCAoioMjlMQR9YwAp7JZDIECzIu2Z66R+f4SFIRrO2DjDNAA==",
+      "dependencies": [
+        "@babel/runtime",
+        "@rc-component/async-validator",
+        "rc-util",
+        "react",
+        "react-dom"
+      ]
+    },
+    "rc-image@7.11.1_react@19.1.0_react-dom@19.1.0__react@19.1.0": {
+      "integrity": "sha512-XuoWx4KUXg7hNy5mRTy1i8c8p3K8boWg6UajbHpDXS5AlRVucNfTi5YxTtPBTBzegxAZpvuLfh3emXFt6ybUdA==",
+      "dependencies": [
+        "@babel/runtime",
+        "@rc-component/portal",
+        "classnames",
+        "rc-dialog",
+        "rc-motion",
+        "rc-util",
+        "react",
+        "react-dom"
+      ]
+    },
+    "rc-input-number@9.4.0_react@19.1.0_react-dom@19.1.0__react@19.1.0": {
+      "integrity": "sha512-Tiy4DcXcFXAf9wDhN8aUAyMeCLHJUHA/VA/t7Hj8ZEx5ETvxG7MArDOSE6psbiSCo+vJPm4E3fGN710ITVn6GA==",
+      "dependencies": [
+        "@babel/runtime",
+        "@rc-component/mini-decimal",
+        "classnames",
+        "rc-input",
+        "rc-util",
+        "react",
+        "react-dom"
+      ]
+    },
+    "rc-input@1.7.3_react@19.1.0_react-dom@19.1.0__react@19.1.0": {
+      "integrity": "sha512-A5w4egJq8+4JzlQ55FfQjDnPvOaAbzwC3VLOAdOytyek3TboSOP9qxN+Gifup+shVXfvecBLBbWBpWxmk02SWQ==",
+      "dependencies": [
+        "@babel/runtime",
+        "classnames",
+        "rc-util",
+        "react",
+        "react-dom"
+      ]
+    },
+    "rc-mentions@2.19.1_react@19.1.0_react-dom@19.1.0__react@19.1.0": {
+      "integrity": "sha512-KK3bAc/bPFI993J3necmaMXD2reZTzytZdlTvkeBbp50IGH1BDPDvxLdHDUrpQx2b2TGaVJsn+86BvYa03kGqA==",
+      "dependencies": [
+        "@babel/runtime",
+        "@rc-component/trigger",
+        "classnames",
+        "rc-input",
+        "rc-menu",
+        "rc-textarea",
+        "rc-util",
+        "react",
+        "react-dom"
+      ]
+    },
+    "rc-menu@9.16.1_react@19.1.0_react-dom@19.1.0__react@19.1.0": {
+      "integrity": "sha512-ghHx6/6Dvp+fw8CJhDUHFHDJ84hJE3BXNCzSgLdmNiFErWSOaZNsihDAsKq9ByTALo/xkNIwtDFGIl6r+RPXBg==",
+      "dependencies": [
+        "@babel/runtime",
+        "@rc-component/trigger",
+        "classnames",
+        "rc-motion",
+        "rc-overflow",
+        "rc-util",
+        "react",
+        "react-dom"
+      ]
+    },
+    "rc-motion@2.9.5_react@19.1.0_react-dom@19.1.0__react@19.1.0": {
+      "integrity": "sha512-w+XTUrfh7ArbYEd2582uDrEhmBHwK1ZENJiSJVb7uRxdE7qJSYjbO2eksRXmndqyKqKoYPc9ClpPh5242mV1vA==",
+      "dependencies": [
+        "@babel/runtime",
+        "classnames",
+        "rc-util",
+        "react",
+        "react-dom"
+      ]
+    },
+    "rc-notification@5.6.3_react@19.1.0_react-dom@19.1.0__react@19.1.0": {
+      "integrity": "sha512-42szwnn8VYQoT6GnjO00i1iwqV9D1TTMvxObWsuLwgl0TsOokzhkYiufdtQBsJMFjJravS1hfDKVMHLKLcPE4g==",
+      "dependencies": [
+        "@babel/runtime",
+        "classnames",
+        "rc-motion",
+        "rc-util",
+        "react",
+        "react-dom"
+      ]
+    },
+    "rc-overflow@1.4.1_react@19.1.0_react-dom@19.1.0__react@19.1.0": {
+      "integrity": "sha512-3MoPQQPV1uKyOMVNd6SZfONi+f3st0r8PksexIdBTeIYbMX0Jr+k7pHEDvsXtR4BpCv90/Pv2MovVNhktKrwvw==",
+      "dependencies": [
+        "@babel/runtime",
+        "classnames",
+        "rc-resize-observer",
+        "rc-util",
+        "react",
+        "react-dom"
+      ]
+    },
+    "rc-pagination@5.1.0_react@19.1.0_react-dom@19.1.0__react@19.1.0": {
+      "integrity": "sha512-8416Yip/+eclTFdHXLKTxZvn70duYVGTvUUWbckCCZoIl3jagqke3GLsFrMs0bsQBikiYpZLD9206Ej4SOdOXQ==",
+      "dependencies": [
+        "@babel/runtime",
+        "classnames",
+        "rc-util",
+        "react",
+        "react-dom"
+      ]
+    },
+    "rc-picker@4.11.3_dayjs@1.11.13_react@19.1.0_react-dom@19.1.0__react@19.1.0": {
+      "integrity": "sha512-MJ5teb7FlNE0NFHTncxXQ62Y5lytq6sh5nUw0iH8OkHL/TjARSEvSHpr940pWgjGANpjCwyMdvsEV55l5tYNSg==",
+      "dependencies": [
+        "@babel/runtime",
+        "@rc-component/trigger",
+        "classnames",
+        "dayjs",
+        "rc-overflow",
+        "rc-resize-observer",
+        "rc-util",
+        "react",
+        "react-dom"
+      ]
+    },
+    "rc-progress@4.0.0_react@19.1.0_react-dom@19.1.0__react@19.1.0": {
+      "integrity": "sha512-oofVMMafOCokIUIBnZLNcOZFsABaUw8PPrf1/y0ZBvKZNpOiu5h4AO9vv11Sw0p4Hb3D0yGWuEattcQGtNJ/aw==",
+      "dependencies": [
+        "@babel/runtime",
+        "classnames",
+        "rc-util",
+        "react",
+        "react-dom"
+      ]
+    },
+    "rc-rate@2.13.1_react@19.1.0_react-dom@19.1.0__react@19.1.0": {
+      "integrity": "sha512-QUhQ9ivQ8Gy7mtMZPAjLbxBt5y9GRp65VcUyGUMF3N3fhiftivPHdpuDIaWIMOTEprAjZPC08bls1dQB+I1F2Q==",
+      "dependencies": [
+        "@babel/runtime",
+        "classnames",
+        "rc-util",
+        "react",
+        "react-dom"
+      ]
+    },
+    "rc-resize-observer@1.4.3_react@19.1.0_react-dom@19.1.0__react@19.1.0": {
+      "integrity": "sha512-YZLjUbyIWox8E9i9C3Tm7ia+W7euPItNWSPX5sCcQTYbnwDb5uNpnLHQCG1f22oZWUhLw4Mv2tFmeWe68CDQRQ==",
+      "dependencies": [
+        "@babel/runtime",
+        "classnames",
+        "rc-util",
+        "react",
+        "react-dom",
+        "resize-observer-polyfill"
+      ]
+    },
+    "rc-segmented@2.7.0_react@19.1.0_react-dom@19.1.0__react@19.1.0": {
+      "integrity": "sha512-liijAjXz+KnTRVnxxXG2sYDGd6iLL7VpGGdR8gwoxAXy2KglviKCxLWZdjKYJzYzGSUwKDSTdYk8brj54Bn5BA==",
+      "dependencies": [
+        "@babel/runtime",
+        "classnames",
+        "rc-motion",
+        "rc-util",
+        "react",
+        "react-dom"
+      ]
+    },
+    "rc-select@14.16.6_react@19.1.0_react-dom@19.1.0__react@19.1.0": {
+      "integrity": "sha512-YPMtRPqfZWOm2XGTbx5/YVr1HT0vn//8QS77At0Gjb3Lv+Lbut0IORJPKLWu1hQ3u4GsA0SrDzs7nI8JG7Zmyg==",
+      "dependencies": [
+        "@babel/runtime",
+        "@rc-component/trigger",
+        "classnames",
+        "rc-motion",
+        "rc-overflow",
+        "rc-util",
+        "rc-virtual-list",
+        "react",
+        "react-dom"
+      ]
+    },
+    "rc-slider@11.1.8_react@19.1.0_react-dom@19.1.0__react@19.1.0": {
+      "integrity": "sha512-2gg/72YFSpKP+Ja5AjC5DPL1YnV8DEITDQrcc1eASrUYjl0esptaBVJBh5nLTXCCp15eD8EuGjwezVGSHhs9tQ==",
+      "dependencies": [
+        "@babel/runtime",
+        "classnames",
+        "rc-util",
+        "react",
+        "react-dom"
+      ]
+    },
+    "rc-steps@6.0.1_react@19.1.0_react-dom@19.1.0__react@19.1.0": {
+      "integrity": "sha512-lKHL+Sny0SeHkQKKDJlAjV5oZ8DwCdS2hFhAkIjuQt1/pB81M0cA0ErVFdHq9+jmPmFw1vJB2F5NBzFXLJxV+g==",
+      "dependencies": [
+        "@babel/runtime",
+        "classnames",
+        "rc-util",
+        "react",
+        "react-dom"
+      ]
+    },
+    "rc-switch@4.1.0_react@19.1.0_react-dom@19.1.0__react@19.1.0": {
+      "integrity": "sha512-TI8ufP2Az9oEbvyCeVE4+90PDSljGyuwix3fV58p7HV2o4wBnVToEyomJRVyTaZeqNPAp+vqeo4Wnj5u0ZZQBg==",
+      "dependencies": [
+        "@babel/runtime",
+        "classnames",
+        "rc-util",
+        "react",
+        "react-dom"
+      ]
+    },
+    "rc-table@7.50.4_react@19.1.0_react-dom@19.1.0__react@19.1.0": {
+      "integrity": "sha512-Y+YuncnQqoS5e7yHvfvlv8BmCvwDYDX/2VixTBEhkMDk9itS9aBINp4nhzXFKiBP/frG4w0pS9d9Rgisl0T1Bw==",
+      "dependencies": [
+        "@babel/runtime",
+        "@rc-component/context",
+        "classnames",
+        "rc-resize-observer",
+        "rc-util",
+        "rc-virtual-list",
+        "react",
+        "react-dom"
+      ]
+    },
+    "rc-tabs@15.5.2_react@19.1.0_react-dom@19.1.0__react@19.1.0": {
+      "integrity": "sha512-Hbqf2IV6k/jPgfMjPtIDmPV0D0C9c/fN4B/fYcoh9qqaUzUZQoK0PYzsV3UaV+3UsmyoYt48p74m/HkLhGTw+w==",
+      "dependencies": [
+        "@babel/runtime",
+        "classnames",
+        "rc-dropdown",
+        "rc-menu",
+        "rc-motion",
+        "rc-resize-observer",
+        "rc-util",
+        "react",
+        "react-dom"
+      ]
+    },
+    "rc-textarea@1.9.0_react@19.1.0_react-dom@19.1.0__react@19.1.0": {
+      "integrity": "sha512-dQW/Bc/MriPBTugj2Kx9PMS5eXCCGn2cxoIaichjbNvOiARlaHdI99j4DTxLl/V8+PIfW06uFy7kjfUIDDKyxQ==",
+      "dependencies": [
+        "@babel/runtime",
+        "classnames",
+        "rc-input",
+        "rc-resize-observer",
+        "rc-util",
+        "react",
+        "react-dom"
+      ]
+    },
+    "rc-tooltip@6.4.0_react@19.1.0_react-dom@19.1.0__react@19.1.0": {
+      "integrity": "sha512-kqyivim5cp8I5RkHmpsp1Nn/Wk+1oeloMv9c7LXNgDxUpGm+RbXJGL+OPvDlcRnx9DBeOe4wyOIl4OKUERyH1g==",
+      "dependencies": [
+        "@babel/runtime",
+        "@rc-component/trigger",
+        "classnames",
+        "rc-util",
+        "react",
+        "react-dom"
+      ]
+    },
+    "rc-tree-select@5.27.0_react@19.1.0_react-dom@19.1.0__react@19.1.0": {
+      "integrity": "sha512-2qTBTzwIT7LRI1o7zLyrCzmo5tQanmyGbSaGTIf7sYimCklAToVVfpMC6OAldSKolcnjorBYPNSKQqJmN3TCww==",
+      "dependencies": [
+        "@babel/runtime",
+        "classnames",
+        "rc-select",
+        "rc-tree",
+        "rc-util",
+        "react",
+        "react-dom"
+      ]
+    },
+    "rc-tree@5.13.1_react@19.1.0_react-dom@19.1.0__react@19.1.0": {
+      "integrity": "sha512-FNhIefhftobCdUJshO7M8uZTA9F4OPGVXqGfZkkD/5soDeOhwO06T/aKTrg0WD8gRg/pyfq+ql3aMymLHCTC4A==",
+      "dependencies": [
+        "@babel/runtime",
+        "classnames",
+        "rc-motion",
+        "rc-util",
+        "rc-virtual-list",
+        "react",
+        "react-dom"
+      ]
+    },
+    "rc-upload@4.8.1_react@19.1.0_react-dom@19.1.0__react@19.1.0": {
+      "integrity": "sha512-toEAhwl4hjLAI1u8/CgKWt30BR06ulPa4iGQSMvSXoHzO88gPCslxqV/mnn4gJU7PDoltGIC9Eh+wkeudqgHyw==",
+      "dependencies": [
+        "@babel/runtime",
+        "classnames",
+        "rc-util",
+        "react",
+        "react-dom"
+      ]
+    },
+    "rc-util@5.44.4_react@19.1.0_react-dom@19.1.0__react@19.1.0": {
+      "integrity": "sha512-resueRJzmHG9Q6rI/DfK6Kdv9/Lfls05vzMs1Sk3M2P+3cJa+MakaZyWY8IPfehVuhPJFKrIY1IK4GqbiaiY5w==",
+      "dependencies": [
+        "@babel/runtime",
+        "react",
+        "react-dom",
+        "react-is@18.3.1"
+      ]
+    },
+    "rc-virtual-list@3.18.5_react@19.1.0_react-dom@19.1.0__react@19.1.0": {
+      "integrity": "sha512-1FuxVSxhzTj3y8k5xMPbhXCB0t2TOiI3Tq+qE2Bu+GGV7f+ECVuQl4OUg6lZ2qT5fordTW7CBpr9czdzXCI7Pg==",
+      "dependencies": [
+        "@babel/runtime",
+        "classnames",
+        "rc-resize-observer",
+        "rc-util",
+        "react",
+        "react-dom"
+      ]
+    },
     "react-dom@19.1.0_react@19.1.0": {
       "integrity": "sha512-Xs1hdnE+DyKgeHJeJznQmYMIBG3TKIHJJT95Q58nHLSrElKlGQqDTR2HQ9fx5CN/Gk6Vh/kupBTDLU11/nDk/g==",
       "dependencies": [
@@ -502,6 +1131,9 @@
     "react-is@17.0.2": {
       "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w=="
     },
+    "react-is@18.3.1": {
+      "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg=="
+    },
     "react@19.1.0": {
       "integrity": "sha512-FS+XFBNvn3GTAWq26joslQgWNoFu08F4kl0J4CgdNKADkdSGXQyTCnKteIAJy96Br6YbpEU1LSzV5dYtjMkMDg=="
     },
@@ -523,6 +1155,9 @@
     "regenerator-runtime@0.14.1": {
       "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw=="
     },
+    "resize-observer-polyfill@1.5.1": {
+      "integrity": "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg=="
+    },
     "rrweb-cssom@0.8.0": {
       "integrity": "sha512-guoltQEx+9aMf2gDZ0s62EcV8lsXR+0w8915TC3ITdn2YueuNjdAYh/levpU9nFaoChh9RUS5ZdQMrKfVEN9tw=="
     },
@@ -541,12 +1176,21 @@
     "scheduler@0.26.0": {
       "integrity": "sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA=="
     },
+    "scroll-into-view-if-needed@3.1.0": {
+      "integrity": "sha512-49oNpRjWRvnU8NyGVmUaYG4jtTkNonFZI86MmGRDqBphEK2EXT9gdEUoQPZhuBM8yWHxCWbobltqYO5M4XrUvQ==",
+      "dependencies": [
+        "compute-scroll-into-view"
+      ]
+    },
     "ssf@0.11.2": {
       "integrity": "sha512-+idbmIXoYET47hH+d7dfm2epdOMUDjqcB4648sTZ+t2JwoyBFL/insLfB/racrDmsKB3diwsDA696pZMieAC5g==",
       "dependencies": [
         "frac"
       ]
     },
+    "string-convert@0.2.1": {
+      "integrity": "sha512-u/1tdPl4yQnPBjnVrmdLo9gtuLvELKsAoRapekWggdiQNvvvum+jYF329d84NAa660KQw7pB2n36KrIKVoXa3A=="
+    },
     "string_decoder@1.3.0": {
       "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
       "dependencies": [
@@ -559,6 +1203,9 @@
         "min-indent"
       ]
     },
+    "stylis@4.3.6": {
+      "integrity": "sha512-yQ3rwFWRfwNUY7H5vpU0wfdkNSnvnJinhF9830Swlaxl03zsOjCfmX0ugac+3LtK0lYSgwL/KXc8oYL3mG4YFQ=="
+    },
     "supports-color@7.2.0": {
       "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
       "dependencies": [
@@ -568,6 +1215,9 @@
     "symbol-tree@3.2.4": {
       "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw=="
     },
+    "throttle-debounce@5.0.2": {
+      "integrity": "sha512-B71/4oyj61iNH0KeCamLuE2rmKuTO5byTOSVwECM5FA7TiAiAW+UqTKZ9ERueC4qvgSttUhdmq1mXC3kJqGX7A=="
+    },
     "tldts-core@6.1.85": {
       "integrity": "sha512-DTjUVvxckL1fIoPSb3KE7ISNtkWSawZdpfxGxwiIrZoO6EbHVDXXUIlIuWympPaeS+BLGyggozX/HTMsRAdsoA=="
     },
@@ -577,6 +1227,9 @@
         "tldts-core"
       ]
     },
+    "toggle-selection@1.0.6": {
+      "integrity": "sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ=="
+    },
     "tough-cookie@5.1.2": {
       "integrity": "sha512-FVDYdxtnj0G6Qm/DhNPSb8Ju59ULcup3tuJxkFb5K8Bv2pUXILbf0xZWU8PX8Ov19OXljbUyveOFwRMwkXzO+A==",
       "dependencies": [