From aedeeb471b7a9e05649457f390e726a198f7b879 Mon Sep 17 00:00:00 2001 From: Haydar Metin Date: Thu, 27 Feb 2025 14:40:58 +0100 Subject: [PATCH 1/4] Initialize repository with tree component --- .github/ISSUE_TEMPLATE/bug_report.md | 43 + .github/ISSUE_TEMPLATE/feature_request.md | 17 + .github/workflows/ci.yml | 30 + .gitignore | 3 + .vscode/extensions.json | 6 + .vscode/launch.json | 7 + .vscode/settings.json | 23 + .vscode/tasks.json | 4 + .vscode/vscode-ui-components.code-snippets | 16 + LICENSE | 8 + README.md | 50 +- eslint.config.mjs | 68 + package.json | 61 + prettier.config.mjs | 16 + src/base/index.ts | 8 + src/base/utils.ts | 28 + src/browser.ts | 12 + src/index.ts | 12 + src/tooltip/tooltip.tsx | 158 + src/tree/browser/components/expand-icon.tsx | 43 + .../browser/components/search-overlay.tsx | 88 + .../components/treetable-navigator.tsx | 169 + src/tree/browser/components/utils.tsx | 181 ++ src/tree/browser/index.ts | 8 + src/tree/browser/tree.tsx | 501 +++ src/tree/common/index.ts | 11 + src/tree/common/tree-converter.ts | 40 + src/tree/common/tree-messenger-types.ts | 45 + src/tree/common/tree-model-types.ts | 105 + src/tree/common/tree-table-column-types.ts | 62 + src/tree/vscode/index.ts | 9 + src/tree/vscode/tree-data-provider.ts | 36 + src/tree/vscode/tree-webview-view-provider.ts | 138 + src/vscode.ts | 10 + src/vscode/messenger.ts | 11 + src/vscode/webview-types.ts | 29 + style/tooltip/tooltip.css | 28 + style/tree/tree-common.css | 48 + style/tree/tree-search-overlay.css | 84 + style/tree/tree.css | 124 + tsconfig.json | 38 + yarn.lock | 2817 +++++++++++++++++ 42 files changed, 5193 insertions(+), 2 deletions(-) create mode 100644 .github/ISSUE_TEMPLATE/bug_report.md create mode 100644 .github/ISSUE_TEMPLATE/feature_request.md create mode 100644 .github/workflows/ci.yml create mode 100644 .gitignore create mode 100644 .vscode/extensions.json create mode 100644 .vscode/launch.json create mode 100644 .vscode/settings.json create mode 100644 .vscode/tasks.json create mode 100644 .vscode/vscode-ui-components.code-snippets create mode 100644 LICENSE create mode 100644 eslint.config.mjs create mode 100644 package.json create mode 100644 prettier.config.mjs create mode 100644 src/base/index.ts create mode 100644 src/base/utils.ts create mode 100644 src/browser.ts create mode 100644 src/index.ts create mode 100644 src/tooltip/tooltip.tsx create mode 100644 src/tree/browser/components/expand-icon.tsx create mode 100644 src/tree/browser/components/search-overlay.tsx create mode 100644 src/tree/browser/components/treetable-navigator.tsx create mode 100644 src/tree/browser/components/utils.tsx create mode 100644 src/tree/browser/index.ts create mode 100644 src/tree/browser/tree.tsx create mode 100644 src/tree/common/index.ts create mode 100644 src/tree/common/tree-converter.ts create mode 100644 src/tree/common/tree-messenger-types.ts create mode 100644 src/tree/common/tree-model-types.ts create mode 100644 src/tree/common/tree-table-column-types.ts create mode 100644 src/tree/vscode/index.ts create mode 100644 src/tree/vscode/tree-data-provider.ts create mode 100644 src/tree/vscode/tree-webview-view-provider.ts create mode 100644 src/vscode.ts create mode 100644 src/vscode/messenger.ts create mode 100644 src/vscode/webview-types.ts create mode 100644 style/tooltip/tooltip.css create mode 100644 style/tree/tree-common.css create mode 100644 style/tree/tree-search-overlay.css create mode 100644 style/tree/tree.css create mode 100644 tsconfig.json create mode 100644 yarn.lock diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md new file mode 100644 index 0000000..5576a8a --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -0,0 +1,43 @@ +--- +name: Bug Report +about: Create a report to help us improve. +title: '' +labels: '' +assignees: '' + +--- + + + +Type: Bug Report + +**Describe the bug** +- OS and Version: +- VS Code Version: +- Extension Version: +- Target Device: +- Other extensions you installed (and if the issue persists after disabling them): +- A clear and concise description of what the bug is. + +**To Reproduce** +Steps to reproduce the behavior: +1. Go to '...' +2. Click on '....' +3. Scroll down to '....' +4. See error + +**Expected behavior** + + +**Code sample and logs** +- Code sample +- `launch.json` + +**Screenshots** + + +**Additional context** + diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md new file mode 100644 index 0000000..a62f305 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -0,0 +1,17 @@ +--- +name: Feature Request +about: Suggest an idea for this extension. +title: '' +labels: '' +assignees: '' + +--- + +Type: Feature Request + + + + diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..5e4be9e --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,30 @@ +name: ci + +on: + push: + branches: + - main + tags: + - '*' + pull_request: + branches: + - main + workflow_dispatch: + +jobs: + build: + name: Build + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + with: + fetch-depth: 0 + - uses: actions/setup-node@v3 + with: + node-version: 14.x + - name: Build + env: + GITHUB_TOKEN: ${{github.token}} + run: | + yarn install --ignore-scripts + yarn build diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..72f72df --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +.DS_Store +node_modules +lib \ No newline at end of file diff --git a/.vscode/extensions.json b/.vscode/extensions.json new file mode 100644 index 0000000..a7f9c3b --- /dev/null +++ b/.vscode/extensions.json @@ -0,0 +1,6 @@ +{ + "recommendations": [ + "dbaeumer.vscode-eslint", + "esbenp.prettier-vscode" + ] +} \ No newline at end of file diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000..37b4572 --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,7 @@ +{ + // Use IntelliSense to learn about possible attributes. + // Hover to view descriptions of existing attributes. + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [] +} diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..0028903 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,23 @@ +// If one would like to add/remove/modify user preferences without modifying the content of the +// workspace settings file, then one would need to modify the `settings.json` under here: +// - Windows: %APPDATA%\Code\User\settings.json +// - Linux: $HOME/.config/Code/User/settings.json +// - Mac: $HOME/Library/Application Support/Code/User/settings.json +{ + "editor.formatOnSave": true, + "editor.codeActionsOnSave": { + "source.fixAll.eslint": "explicit" + }, + "[javascript]": { + "editor.defaultFormatter": "esbenp.prettier-vscode" + }, + "[typescript]": { + "editor.defaultFormatter": "esbenp.prettier-vscode" + }, + "[typescriptreact]": { + "editor.defaultFormatter": "esbenp.prettier-vscode" + }, + "[json]": { + "editor.defaultFormatter": "esbenp.prettier-vscode" + } +} diff --git a/.vscode/tasks.json b/.vscode/tasks.json new file mode 100644 index 0000000..6a33c54 --- /dev/null +++ b/.vscode/tasks.json @@ -0,0 +1,4 @@ +{ + "version": "2.0.0", + "tasks": [] +} diff --git a/.vscode/vscode-ui-components.code-snippets b/.vscode/vscode-ui-components.code-snippets new file mode 100644 index 0000000..b2f59fc --- /dev/null +++ b/.vscode/vscode-ui-components.code-snippets @@ -0,0 +1,16 @@ +{ + "Copyright": { + "prefix": [ + "header", + "copyright" + ], + "body": "/********************************************************************************\n * Copyright (C) $CURRENT_YEAR ${YourCompany} and others.\n *\n * This program and the accompanying materials are made available under the\n * terms of the MIT License as outlined in the LICENSE File\n ********************************************************************************/\n\n$0", + "description": "Adds the copyright...", + "scope": "css,javascript,javascriptreact,typescript,typescriptreact" + }, + "Import VSCode": { + "prefix": "codeimport", + "body": "import * as vscode from 'vscode';", + "scope": "typescript,javascript" + } +} diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..eec639c --- /dev/null +++ b/LICENSE @@ -0,0 +1,8 @@ +Copyright 2024-2025 Arm Limited and EclipseSource +Copyright 2017-2023 Marcel Ball and Arm Limited + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. \ No newline at end of file diff --git a/README.md b/README.md index 54e3876..75e6ab0 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,48 @@ -# vscode-ui-components -Shared UI Components for CDT Cloud VS Code extensions +# VSCode UI Components + +This is a VSCode components React library. + +## Project Structure + +``` +src/ +│── base/ # Shared functionality +│── vscode/ # VSCode specific functionality + +├── / +│ ├── browser/ # React specific code +│ ├── common/ # Shared code between browser and VSCode +│ ├── vscode/ # VSCode integration (converters, webview providers, etc.) + +├── / +│ ├── *.tsx # Components without VSCode integration +``` + +## Installation + +`npm install @eclipse-cdt-cloud/vscode-ui-components` + +## Usage + +```ts +// Webview +import { + messenger, + CDTTree +} from '@eclipse-cdt-cloud/vscode-ui-components/lib/browser'; +import React from 'react'; +import { createRoot } from 'react-dom/client'; + +messenger.start(); + +function App() { + return ; +} + +// Render the component +const container = document.getElementById('root'); +if (!container) { + throw new Error('Root element not found'); +} +createRoot(container).render(); +``` diff --git a/eslint.config.mjs b/eslint.config.mjs new file mode 100644 index 0000000..4d5180f --- /dev/null +++ b/eslint.config.mjs @@ -0,0 +1,68 @@ +// @ts-check + +import globals from 'globals'; +import eslint from '@eslint/js'; +import tseslint from 'typescript-eslint'; + +export default tseslint.config( + { + ignores: ['**/node_modules', '**/lib'] + }, + eslint.configs.recommended, + tseslint.configs.recommended, + { + languageOptions: { + globals: { + ...globals.browser, + ...globals.commonjs, + ...globals.node + } + } + }, + { + rules: { + // ESLint Convention + quotes: ['error', 'single'], + semi: ['error', 'always'], + indent: [ + 'error', + 4, + { + SwitchCase: 1 + } + ], + 'block-spacing': ['error', 'always'], + 'brace-style': [ + 'error', + '1tbs', + { + allowSingleLine: true + } + ], + 'eol-last': ['error'], + 'linebreak-style': ['error', 'unix'], + + // ESLint Best Practices + 'no-console': ['warn'], + 'no-constant-condition': [ + 'error', + { + checkLoops: false + } + ], + + 'no-trailing-spaces': ['error'], + 'object-curly-spacing': ['error', 'always'], + + // TypeScript specific rules + '@typescript-eslint/no-this-alias': 'off', + '@typescript-eslint/no-namespace': 'off', + '@typescript-eslint/no-unused-vars': [ + 'warn', + { + argsIgnorePattern: '^_' + } + ] + } + } +); diff --git a/package.json b/package.json new file mode 100644 index 0000000..4c78764 --- /dev/null +++ b/package.json @@ -0,0 +1,61 @@ +{ + "name": "@eclipse-cdt-cloud/vscode-ui-components", + "displayName": "VSCode UI Components", + "description": "VSCode UI Components for React", + "version": "0.0.1", + "publisher": "eclipse-cdt", + "license": "MIT", + "repository": "https://github.com/eclipse-cdt-cloud/vscode-ui-components", + "qna": "https://github.com/eclipse-cdt-cloud/vscode-ui-components/issues", + "main": "./lib/index.js", + "types": "./lib/index.d.ts", + "files": [ + "lib" + ], + "engines": { + "node": ">=20" + }, + "scripts": { + "prepare": "yarn clean && yarn build", + "clean": "rimraf ./lib ./node_modules/.tmp", + "build": "tsc && yarn lint", + "watch": "tsc -w", + "lint": "eslint ." + }, + "dependencies": { + "@floating-ui/react": "^0.26.17", + "@vscode/codicons": "0.0.20", + "@vscode/webview-ui-toolkit": "^1.4.0", + "antd": "^5.22.1", + "primeflex": "^3.3.1", + "react-markdown": "^9.0.1", + "remark-gfm": "^4.0.0", + "throttle-debounce": "5.0.2", + "vscode-messenger": "^0.4.5", + "vscode-messenger-common": "^0.4.5", + "vscode-messenger-webview": "^0.4.5" + }, + "devDependencies": { + "@eslint/js": "^9.21.0", + "@types/node": "^20.0.0", + "@types/react": "^18.0.26", + "@types/react-dom": "^18.0.9", + "@types/throttle-debounce": "5.0.2", + "@types/vscode": "^1.63.2", + "@types/vscode-webview": "^1.57.0", + "@typescript-eslint/eslint-plugin": "^5.49.0", + "@typescript-eslint/parser": "^5.49.0", + "eslint": "^9.21.0", + "globals": "^16.0.0", + "prettier": "^3.5.2", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "typescript": "^5.7.3", + "typescript-eslint": "^8.25.0", + "rimraf": "^6.0.1" + }, + "peerDependencies": { + "react": "^18.2.0", + "react-dom": "^18.2.0" + } +} diff --git a/prettier.config.mjs b/prettier.config.mjs new file mode 100644 index 0000000..967eda0 --- /dev/null +++ b/prettier.config.mjs @@ -0,0 +1,16 @@ +// @ts-check + +/** + * @see https://prettier.io/docs/configuration + * @type {import("prettier").Config} + */ +export default { + singleQuote: true, + jsxSingleQuote: true, + arrowParens: 'avoid', + trailingComma: 'none', + endOfLine: 'lf', + printWidth: 140, + tabWidth: 4 +}; + diff --git a/src/base/index.ts b/src/base/index.ts new file mode 100644 index 0000000..a3c930c --- /dev/null +++ b/src/base/index.ts @@ -0,0 +1,8 @@ +/******************************************************************************** + * Copyright (C) 2024 EclipseSource and others. + * + * This program and the accompanying materials are made available under the + * terms of the MIT License as outlined in the LICENSE File + ********************************************************************************/ + +export * from './utils'; diff --git a/src/base/utils.ts b/src/base/utils.ts new file mode 100644 index 0000000..f43f45e --- /dev/null +++ b/src/base/utils.ts @@ -0,0 +1,28 @@ +/******************************************************************************** + * Copyright (C) 2024 EclipseSource and others. + * + * This program and the accompanying materials are made available under the + * terms of the MIT License as outlined in the LICENSE File + ********************************************************************************/ + +/** + * Finds a nested value from an object using a dot-separated path. + */ +export function findNestedValue( + // eslint-disable-next-line @typescript-eslint/no-explicit-any + obj: Record, + path: string | string[], +): T | undefined { + const keys = Array.isArray(path) ? path : path.split('.'); + return keys.reduce((acc, key) => acc?.[key], obj) as T | undefined; +} + +/** + * Check if an object has a property. + */ +export function hasProperty(object: object, ...keys: (keyof TKey)[]): object is TKey { + return keys.every(key => key in object); +} + +export type WithRequired = T & { [P in K]-?: T[P] } +export type MaybePromise = T | Promise diff --git a/src/browser.ts b/src/browser.ts new file mode 100644 index 0000000..527a5ca --- /dev/null +++ b/src/browser.ts @@ -0,0 +1,12 @@ +/******************************************************************************** + * Copyright (C) 2025 EclipseSource and others. + * + * This program and the accompanying materials are made available under the + * terms of the MIT License as outlined in the LICENSE File + ********************************************************************************/ + +// Export only types compatible with the browser + +export * from './tooltip/tooltip'; +export * from './tree/browser'; +export * from './vscode/messenger'; diff --git a/src/index.ts b/src/index.ts new file mode 100644 index 0000000..ab0b214 --- /dev/null +++ b/src/index.ts @@ -0,0 +1,12 @@ +/******************************************************************************** + * Copyright (C) 2025 EclipseSource and others. + * + * This program and the accompanying materials are made available under the + * terms of the MIT License as outlined in the LICENSE File + ********************************************************************************/ + +// Export only common types +// No dependencies on the VS Code or Browser API + +export * from './base'; +export * from './tree/common'; diff --git a/src/tooltip/tooltip.tsx b/src/tooltip/tooltip.tsx new file mode 100644 index 0000000..abd17b0 --- /dev/null +++ b/src/tooltip/tooltip.tsx @@ -0,0 +1,158 @@ +/******************************************************************************** + * Copyright (C) 2024 EclipseSource and others. + * + * This program and the accompanying materials are made available under the + * terms of the MIT License as outlined in the LICENSE File + ********************************************************************************/ +import { + FloatingPortal, + autoUpdate, + offset, + shift, + useDismiss, + useFloating, + useFocus, + useHover, + useInteractions, + useMergeRefs, + useRole, + type Placement +} from '@floating-ui/react'; +import * as React from 'react'; + +import '../../style/tooltip/tooltip.css'; + +// https://floating-ui.com/docs/tooltip + +interface TooltipOptions { + initialOpen?: boolean; + placement?: Placement; + onOpenChange?: (open: boolean) => void; +} +type ContextType = ReturnType | null; +const TooltipContext = React.createContext(null); + +function useTooltip({ + initialOpen = false, + placement = 'bottom', +}: TooltipOptions = {}) { + const [open, setOpen] = React.useState(initialOpen); + + const floating = useFloating({ + placement, + open, + transform: false, + onOpenChange: setOpen, + whileElementsMounted: autoUpdate, + middleware: [ + offset(5), + shift({ padding: 5 }) + ] + }); + const context = floating.context; + + const hover = useHover(context, { + move: false, + restMs: 600, + delay: { + open: 1000 + } + }); + const focus = useFocus(context); + const dismiss = useDismiss(context); + const role = useRole(context, { role: 'tooltip' }); + + const interactions = useInteractions([hover, focus, dismiss, role]); + + return React.useMemo( + () => ({ + open, + setOpen, + ...interactions, + ...floating + }), + [open, setOpen, interactions, floating] + ); +} + +const useTooltipContext = () => { + const context = React.useContext(TooltipContext); + + if (context == null) { + throw new Error('Tooltip components must be wrapped in '); + } + + return context; +}; + +export function Tooltip({ + children, + ...options +}: { children: React.ReactNode } & TooltipOptions) { + // This can accept any props as options, e.g. `placement`, + // or other positioning options. + const tooltip = useTooltip(options); + return ( + + {children} + + ); +} + +export const TooltipTrigger = React.forwardRef< + HTMLElement, + React.HTMLProps & { asChild?: boolean } +>(function TooltipTrigger({ children, asChild = true, ...props }, propRef) { + const context = useTooltipContext(); + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const childrenRef = (children as any).ref; + const ref = useMergeRefs([context.refs.setReference, propRef, childrenRef]); + + // `asChild` allows the user to pass any element as the anchor + if (asChild && React.isValidElement(children)) { + return React.cloneElement( + children, + context.getReferenceProps({ + ref, + ...props, + ...children.props, + 'data-tooltip-state': context.open ? 'open' : 'closed' + }) + ); + } + + return ( +
+ {children} +
+ ); +}); + +export const TooltipContent = React.forwardRef< + HTMLDivElement, + React.HTMLProps +>(function TooltipContent({ style, ...props }, propRef) { + const context = useTooltipContext(); + const ref = useMergeRefs([context.refs.setFloating, propRef]); + + if (!context.open) return null; + + return ( + +
+
+
+ + ); +}); diff --git a/src/tree/browser/components/expand-icon.tsx b/src/tree/browser/components/expand-icon.tsx new file mode 100644 index 0000000..a421028 --- /dev/null +++ b/src/tree/browser/components/expand-icon.tsx @@ -0,0 +1,43 @@ +/******************************************************************************** + * Copyright (C) 2024 EclipseSource and others. + * + * This program and the accompanying materials are made available under the + * terms of the MIT License as outlined in the LICENSE File + ********************************************************************************/ +import type { CDTTreeItemResource, CDTTreeItem } from '../../common/tree-model-types'; +import { classNames } from './utils'; +import React from 'react'; + +export interface RenderExpandIconProps { + prefixCls: string; + expanded: boolean; + record: RecordType; + expandable: boolean; + onExpand: TriggerEventHandler; +} + +export type TriggerEventHandler = (record: RecordType, event: React.MouseEvent) => void; + +export function ExpandIcon({ expanded, onExpand, record, expandable }: RenderExpandIconProps>): React.ReactElement { + if (!expandable) { + // simulate spacing to the left that we gain through expand icon so that leaf items look correctly intended + return ; + } + + const doExpand = (event: React.MouseEvent) => { + event.stopPropagation(); + onExpand(record, event); + }; + + const iconClass = expanded ? 'codicon-chevron-down' : 'codicon-chevron-right'; + return ( +
{ if (event.key === 'Enter' || event.key === ' ') doExpand(event as unknown as React.MouseEvent); }} + >
+ ); +} diff --git a/src/tree/browser/components/search-overlay.tsx b/src/tree/browser/components/search-overlay.tsx new file mode 100644 index 0000000..bc1658c --- /dev/null +++ b/src/tree/browser/components/search-overlay.tsx @@ -0,0 +1,88 @@ +/********************************************************************* + * Copyright (c) 2024 Arm Limited and others + * + * This program and the accompanying materials are made available under the + * terms of the MIT License as outlined in the LICENSE File + ********************************************************************************/ + +import { VSCodeButton } from '@vscode/webview-ui-toolkit/react'; +import React from 'react'; +import '../../../../style/tree/tree-search-overlay.css'; + +export interface SearchOverlayProps { + onChange?: (text: string) => void; + onShow?: () => void; + onHide?: () => void; +} + +export interface SearchOverlay { + input: () => HTMLInputElement | null; + focus: () => void; + value(): string; + setValue: (value: string) => void; + show: () => void; + hide: () => void; +} + +export const SearchOverlay = React.forwardRef((props, ref) => { + const [showSearch, setShowSearch] = React.useState(false); + const searchTextRef = React.useRef(null); + const previousFocusedElementRef = React.useRef(null); + + const show = () => { + previousFocusedElementRef.current = document.activeElement as HTMLElement; + setShowSearch(true); + setTimeout(() => searchTextRef.current?.select(), 100); + props.onShow?.(); + }; + + const hide = () => { + setShowSearch(false); + props.onHide?.(); + if (previousFocusedElementRef.current) { + previousFocusedElementRef.current.focus(); + } + }; + + const onTextChange = (e: React.ChangeEvent) => { + const value = e.target.value; + props.onChange?.(value); + }; + + const onKeyDown = (e: React.KeyboardEvent) => { + if (e.ctrlKey && e.key === 'f') { + e.preventDefault(); + e.stopPropagation(); + show(); + } else if (e.key === 'Escape') { + e.preventDefault(); + e.stopPropagation(); + hide(); + } + }; + + const onFocus = (e: React.FocusEvent) => { + if (e.relatedTarget) { + previousFocusedElementRef.current = e.relatedTarget as HTMLElement; + } + }; + + React.useImperativeHandle(ref, () => ({ + input: () => searchTextRef.current, + focus: () => searchTextRef.current?.focus(), + value: () => searchTextRef.current?.value ?? '', + setValue: (newValue: string) => { + if (searchTextRef.current) { + searchTextRef.current.value = newValue; + } + }, + show: () => show(), + hide: () => hide() + })); + + return (
+ + hide()} /> +
+ ); +}); diff --git a/src/tree/browser/components/treetable-navigator.tsx b/src/tree/browser/components/treetable-navigator.tsx new file mode 100644 index 0000000..eb11c41 --- /dev/null +++ b/src/tree/browser/components/treetable-navigator.tsx @@ -0,0 +1,169 @@ +/******************************************************************************** + * Copyright (C) 2024 EclipseSource and others. + * + * This program and the accompanying materials are made available under the + * terms of the MIT License as outlined in the LICENSE File + ********************************************************************************/ + +import { CDTTreeItemResource, CDTTreeItem } from '../../common'; + +export interface TreeNavigatorProps { + ref: React.RefObject; + rowIndex: Map; + expandedRowKeys: string[]; + expand: (expanded: boolean, record: CDTTreeItem) => void; + select: (record: CDTTreeItem) => void; +} + +/** + * TreeNavigator is a helper class to navigate + * through a tree table. + */ +export class TreeNavigator { + constructor(private readonly props: TreeNavigatorProps) {} + + next(node: CDTTreeItem) { + if (node.children && node.children.length > 0 && this.props.expandedRowKeys.includes(node.id)) { + // Go deeper + this.select(node.children[0]); + } else { + let nextNode = this.getNext(node); + if (nextNode) { + this.select(nextNode); + } else { + // Go to parent sibling recursively + nextNode = this.getParentNext(node.parent); + if (nextNode) { + this.select(nextNode); + } + } + } + } + + nextPage() { + this.scrollRelative(this.visibleDomElementCount); + } + + private getSiblings(node: CDTTreeItem): CDTTreeItem[] { + return node.parent?.children?.filter(child => this.props.rowIndex.has(child.id)) ?? []; + } + + private getNext(node: CDTTreeItem): CDTTreeItem | undefined { + const siblings = this.getSiblings(node); + const index = siblings.findIndex(n => n.id === node.id); + return siblings[index + 1]; + } + + private getParentNext(node: CDTTreeItem | undefined): CDTTreeItem | undefined { + if (!node) return undefined; + const nextSibling = this.getNext(node); + if (nextSibling) { + return nextSibling; + } else { + return this.getParentNext(node.parent); + } + } + + previous(node: CDTTreeItem) { + let prevNode = this.getPrevious(node); + if (prevNode) { + // Go deeper to the last child if the previous node has children and is expanded + while (prevNode.children && prevNode.children.length > 0 && this.props.expandedRowKeys.includes(prevNode.id)) { + prevNode = prevNode.children[prevNode.children.length - 1]; + } + this.select(prevNode); + } else { + const parent = node.parent; + // Go to parent if no previous sibling + if (parent && !CDTTreeItem.isRoot(parent)) { + this.select(parent); + } + } + } + + previousPage() { + this.scrollRelative(-(this.visibleDomElementCount - 1)); + } + + private getPrevious(node: CDTTreeItem): CDTTreeItem | undefined { + const siblings = this.getSiblings(node); + const index = siblings.findIndex(n => n.id === node.id); + return siblings[index - 1]; + } + + toggle(node: CDTTreeItem) { + if (this.props.expandedRowKeys.includes(node.id)) { + this.collapse(node); + } else { + this.expand(node); + } + } + + expand(node: CDTTreeItem) { + if (node.children && node.children.length > 0) { + if (this.props.expandedRowKeys.includes(node.id)) { + this.next(node); + } else { + this.props.expand(true, node as CDTTreeItem); + } + } + } + + collapse(node: CDTTreeItem) { + if (node.children && node.children.length > 0 && this.props.expandedRowKeys.includes(node.id)) { + this.props.expand(false, node as CDTTreeItem); + } else if (node.parent && !CDTTreeItem.isRoot(node.parent)) { + this.select(node.parent, 'absolute'); + } + } + + private select(node: CDTTreeItem, scrollMode: 'relative' | 'absolute' = 'absolute') { + // Virtual scrolling may have hidden the node + if (!this.isDomVisible(node)) { + if (scrollMode === 'absolute') { + this.scrollAbsolute(node); + this.props.select(node as CDTTreeItem); + } else { + this.scrollRelative(-(this.visibleDomElementCount / 2)); + } + + this.props.select(node as CDTTreeItem); + // Allow the DOM to update before focusing + setTimeout(() => this.getDomElement(node)?.focus(), 100); + } else { + this.props.select(node as CDTTreeItem); + this.getDomElement(node)?.focus(); + } + } + + // ==== DOM ==== + + private scrollRelative(count = this.visibleDomElementCount) { + const rowHeight = this.props.ref.current?.querySelector('.ant-table-row')?.clientHeight ?? 22; + const body = this.props.ref.current?.querySelector('.ant-table-tbody-virtual-holder'); + if (body) { + body.scrollTop = Math.max(body.scrollTop + count * rowHeight, 0); + } + } + + private scrollAbsolute(node: CDTTreeItem) { + const rowHeight = this.props.ref.current?.querySelector('.ant-table-row')?.clientHeight ?? 22; + const body = this.props.ref.current?.querySelector('.ant-table-tbody-virtual-holder'); + if (body) { + const index = this.props.rowIndex.get(node.id) ?? 1; + body.scrollTop = Math.max(index * rowHeight, 0); + } + } + + private getDomElement(record: CDTTreeItem) { + return this.props.ref.current?.querySelector(`[data-row-key="${record.key}"]`); + } + + private isDomVisible(record: CDTTreeItem) { + return !!this.getDomElement(record); + } + + private get visibleDomElementCount() { + return this.props.ref.current?.querySelectorAll('.ant-table-row').length ?? 1; + } +} diff --git a/src/tree/browser/components/utils.tsx b/src/tree/browser/components/utils.tsx new file mode 100644 index 0000000..54a2e1e --- /dev/null +++ b/src/tree/browser/components/utils.tsx @@ -0,0 +1,181 @@ +/******************************************************************************** + * Copyright (C) 2024 EclipseSource and others. + * + * This program and the accompanying materials are made available under the + * terms of the MIT License as outlined in the LICENSE File + ********************************************************************************/ +import React from 'react'; +import Markdown from 'react-markdown'; +import remarkGfm from 'remark-gfm'; +import { Tooltip, TooltipTrigger, TooltipContent } from '../../../tooltip/tooltip'; +import { CDTTreeItemResource, CDTTreeItem, CDTTreeTableStringColumn } from '../../common'; + +export function classNames(...classes: (string | Record)[]): string { + return classes.filter(c => c !== undefined).map(c => { + if (typeof c === 'string') { + return c; + } + + return Object.entries(c).filter(([, value]) => value).map(([key]) => key); + }).join(' '); +} + +export function createHighlightedText(label?: string, highlights?: [number, number][]): React.JSX.Element { + if (label === undefined) { + return No label provided; + } + if (highlights === undefined || highlights.length === 0) { + return {label}; + } + + highlights.sort((a, b) => a[0] - b[0]); + + const result: React.JSX.Element[] = []; + let currentPosition = 0; + + highlights.forEach(([start, end], index) => { + if (currentPosition < start) { + result.push({label.slice(currentPosition, start)}); + } + result.push({label.slice(start, end + 1)}); + currentPosition = end + 1; + }); + + // Add any remaining text after the last highlight + if (currentPosition < label.length) { + result.push({label.slice(currentPosition)}); + } + + return
+ {result} +
; +} + +export function createLabelWithTooltip(child: React.JSX.Element, tooltip?: string): React.JSX.Element { + const label =
+ {child} +
; + + if (tooltip === undefined) { + return label; + } + + return + + {label} + + + {tooltip} + + ; +} + +/** + * Recursively filters the tree to include items that match the search text + * and their ancestor hierarchy. If children are not to be filtered, all children + * of a matched item are included. Elements that match the search text are marked. + */ +export function filterTree( + items: CDTTreeItem[], + searchText: string, + options: { filterChildren?: boolean } = { filterChildren: false } +): CDTTreeItem[] { + const matching: CDTTreeItem[] = []; + items.forEach(item => { + // Check if the current item matches the search + const matches = Object.values(item.columns ?? {}) + .filter(column => column.type === 'string') + .some(column => + ((column as CDTTreeTableStringColumn).label || '').toLowerCase().includes(searchText.toLowerCase()) + ); + + if (matches) { + // item matches: show all or only matching children + const children = options.filterChildren + ? item.children ? filterTree(item.children, searchText, options) : [] + : item.children ?? []; + matching.push({ + ...item, + children: children.length > 0 ? children : undefined, + matching: true, + }); + } else if (item.children) { + // item does not match: check if a child matches as we need to show the item as ancestor in that case + const matchingChildren = filterTree(item.children, searchText, options); + if (matchingChildren.length > 0) { + matching.push({ + ...item, + children: matchingChildren, + matching: false + }); + } + } + }); + return matching; +} + +/** + * Options for traversing the tree. + */ +export interface TraverseOptions { + /** + * A predicate function to determine if an item should be included. + * If omitted, all items are included. + */ + predicate?: (item: CDTTreeItem) => boolean; + + /** + * A mapping function to transform items. + * If omitted, items are returned as-is. + */ + mapper?: (item: CDTTreeItem) => U; +} + +/** + * Recursively traverses the tree, optionally filtering and mapping items. + * + * @param items - The root items of the tree. + * @param options - Optional traversal options including predicate and mapFn. + * @returns An array of items that satisfy the predicate and are optionally mapped. + */ +export function traverseTree>( + items: CDTTreeItem[], + options?: TraverseOptions +): U[] { + const result: U[] = []; + + const { predicate, mapper } = options || {}; + + for (const item of items) { + // Determine if the current item satisfies the predicate + const shouldInclude = predicate ? predicate(item) : true; + + if (shouldInclude) { + // Apply the mapping function if provided, else return the item as-is + const mappedItem = mapper ? mapper(item) : (item as unknown as U); + result.push(mappedItem); + } + + if (item.children && item.children.length > 0) { + // Recursively traverse the children + const childResults = traverseTree(item.children, options); + + // If mapping is applied, childResults are already mapped + // Push all child results into the main result array + result.push(...childResults); + } + } + return result; +} + +export function getAncestors( + item: CDTTreeItem +): CDTTreeItem[] { + const ancestors: CDTTreeItem[] = []; + let current: CDTTreeItem | undefined = item.parent; + while (current) { + ancestors.push(current); + current = current.parent as unknown as CDTTreeItem; + } + return ancestors; +} diff --git a/src/tree/browser/index.ts b/src/tree/browser/index.ts new file mode 100644 index 0000000..c1a1552 --- /dev/null +++ b/src/tree/browser/index.ts @@ -0,0 +1,8 @@ +/******************************************************************************** + * Copyright (C) 2024 EclipseSource and others. + * + * This program and the accompanying materials are made available under the + * terms of the MIT License as outlined in the LICENSE File + ********************************************************************************/ + +export * from './tree'; diff --git a/src/tree/browser/tree.tsx b/src/tree/browser/tree.tsx new file mode 100644 index 0000000..5d8e73b --- /dev/null +++ b/src/tree/browser/tree.tsx @@ -0,0 +1,501 @@ +/******************************************************************************** + * Copyright (C) 2024 EclipseSource and others. + * + * This program and the accompanying materials are made available under the + * terms of the MIT License as outlined in the LICENSE File + ********************************************************************************/ + +import '../../../style/tree/tree-common.css'; +import '../../../style/tree/tree.css'; + +import { ConfigProvider, Table, TableColumnsType } from 'antd'; +import { ColumnType, ExpandableConfig } from 'antd/es/table/interface'; +import React from 'react'; +import { debounce } from 'throttle-debounce'; +import { ExpandIcon } from './components/expand-icon'; +import { SearchOverlay } from './components/search-overlay'; +import { TreeNavigator } from './components/treetable-navigator'; +import { classNames, createHighlightedText, createLabelWithTooltip, filterTree, getAncestors, traverseTree } from './components/utils'; +import { findNestedValue } from '../../base'; +import { type CDTTreeItemResource, type CDTTreeTableColumnDefinition, type CDTTreeItem, CDTTreeWebviewContext, type CDTTreeTableStringColumn, type CDTTreeTableActionColumn } from '../common'; +import type { CommandDefinition } from '../../vscode/webview-types'; + +/** + * Component to render a tree table. + */ +export type CDTTreeProps = { + /** + * Information about the columns to be rendered. + */ + columnDefinitions?: CDTTreeTableColumnDefinition[]; + /** + * Data source to be rendered. + */ + dataSource?: CDTTreeItem[]; + /** + * Function to sort the data source. + */ + dataSourceSorter?: (dataSource: CDTTreeItem[]) => CDTTreeItem[]; + /** + * Configuration for the expansion of the tree table. + */ + expansion?: { + /** + * List of expanded row keys. + */ + expandedRowKeys?: string[]; + /** + * Callback to be called when a row is expanded or collapsed. + */ + onExpand?: ExpandableConfig>['onExpand']; + }, + /** + * Configuration for the pinning of the tree table. + */ + pin?: { + /** + * List of pinned row keys. + */ + pinnedRowKeys?: string[]; + /** + * Callback to be called when a row is pinned or unpinned. + */ + onPin?: (event: React.UIEvent, pinned: boolean, record: CDTTreeItem) => void; + } + /** + * Configuration for the actions of the tree table. + */ + action?: { + /** + * Callback to be called when an action is triggered. + */ + onAction?: (event: React.UIEvent, command: CommandDefinition, value: unknown, record: CDTTreeItem) => void; + } +}; + +interface BodyRowProps extends React.HTMLAttributes { + 'data-row-key': string; + record: CDTTreeItem; +} + +const BodyRow = React.forwardRef((props, ref) => { + // Support VSCode context menu items + return ( +
+ ); +}); + +function useWindowSize() { + const [size, setSize] = React.useState({ width: window.innerWidth, height: window.innerHeight }); + React.useLayoutEffect(() => { + const updateSize = debounce(100, () => { + setSize({ width: window.innerWidth, height: window.innerHeight }); + }); + + window.addEventListener('resize', updateSize); + return () => { + window.removeEventListener('resize', updateSize); + updateSize.cancel(); + }; + }, []); + + return size; +} + +export function CDTTree(props: CDTTreeProps): React.ReactElement { + const { width, height } = useWindowSize(); + const [globalSearchText, setGlobalSearchText] = React.useState(); + const globalSearchRef = React.useRef(null); + const autoSelectRowRef = React.useRef(false); + + const ref = React.useRef(null); + const tblRef: Parameters[0]['ref'] = React.useRef(null); + + // ==== Data ==== + + const filteredData = React.useMemo(() => { + let data = props.dataSource ?? []; + if (globalSearchText) { + data = filterTree(data, globalSearchText); + } + if (props.dataSourceSorter) { + data = props.dataSourceSorter([...data]); + } + return data; + }, [props.dataSource, props.dataSourceSorter, globalSearchText]); + + // ==== Search ==== + + const onKeyDown = React.useCallback((e: React.KeyboardEvent) => { + if (e.ctrlKey && e.key === 'f') { + e.preventDefault(); + e.stopPropagation(); + globalSearchRef.current?.show(); + } + }, []); + + const onSearchShow = React.useCallback(() => setGlobalSearchText(globalSearchRef.current?.value()), []); + const onSearchHide = React.useCallback(() => { + setGlobalSearchText(undefined); + autoSelectRowRef.current = true; + }, [autoSelectRowRef]); + const onSearchChange = React.useMemo(() => debounce(300, (text: string) => setGlobalSearchText(text)), []); + + // ==== Selection ==== + + const [selection, setSelection] = React.useState(); + + const selectRow = React.useCallback((record: CDTTreeItem) => { + // Single select only + if (selection?.key !== record.key) { + setSelection(record); + } + }, [selection]); + + // ==== Expansion ==== + + const expandedRowKeys = React.useMemo(() => { + const expanded = new Set(props.expansion?.expandedRowKeys ?? []); + if (globalSearchText) { + // on search expand all nodes that match the search + const matchingExpansion = traverseTree(filteredData, { predicate: item => item.matching ?? false, mapper: getAncestors }); + matchingExpansion.forEach(ancestorHierarchy => ancestorHierarchy.forEach(ancestor => expanded.add(ancestor.key))); + } else { + // otherwise use the expandedRowKeys from the props but ensure that the selected element is also expanded + if (autoSelectRowRef.current && selection) { + getAncestors(selection).forEach(ancestor => expanded.add(ancestor.key)); + } + } + return Array.from(expanded); + }, [filteredData, globalSearchText, props.expansion?.expandedRowKeys, selection, autoSelectRowRef.current]); + + + const handleExpand = React.useCallback( + (expanded: boolean, record: CDTTreeItem) => { + props.expansion?.onExpand?.(expanded, record); + }, + [props.expansion?.onExpand] + ); + + // ==== Index ==== + + const dataSourceIndex = React.useMemo(() => { + const rowIndex = new Map(); + const keyIndex = new Map(); + + let currentIndex = 0; + + const traverse = (nodes: CDTTreeItem[]) => { + nodes.forEach(node => { + rowIndex.set(node.id, currentIndex++); + keyIndex.set(node.key, node); + + if (node.children && node.children.length > 0 && expandedRowKeys.includes(node.id)) { + traverse(node.children); + } + }); + }; + + traverse(filteredData ?? []); + return { + rowIndex, + keyIndex + }; + }, [filteredData, expandedRowKeys]); + + // ==== Navigation ==== + + const navigator = React.useMemo(() => new TreeNavigator({ + ref, + rowIndex: dataSourceIndex.rowIndex, + expandedRowKeys, + expand: handleExpand, + select: selectRow + }), [ref, dataSourceIndex.rowIndex, expandedRowKeys, handleExpand, selectRow]); + + const onTableKeyDown = React.useCallback((event: React.KeyboardEvent) => { + const selectedKey = selection?.key; + if (!selectedKey) { + return; + } + + const record = dataSourceIndex.keyIndex.get(selectedKey); + if (!record) { + return; + } + + switch (event.key) { + case 'ArrowDown': { + navigator.next(record); + break; + } + case 'ArrowUp': { + navigator.previous(record); + break; + } + case 'ArrowLeft': { + navigator.collapse(record); + break; + } + case 'ArrowRight': { + navigator.expand(record); + break; + } + case 'Enter': { + navigator.toggle(record); + break; + } + case ' ': { + navigator.toggle(record); + break; + } + case 'PageUp': { + navigator.previousPage(); + break; + } + case 'PageDown': { + navigator.nextPage(); + break; + } + } + }, [selection, dataSourceIndex]); + + // ==== Renderers ==== + + const renderStringColumn = React.useCallback( + (label: string, item: CDTTreeItem, column: CDTTreeTableStringColumn) => { + const icon = column.icon ? : null; + let content = createHighlightedText(label, column.highlight); + + if (column.tooltip) { + content = createLabelWithTooltip({content}, column.tooltip); + } + + return ( +
+ {icon} + {content} +
+ ); + }, + [] + ); + + const renderActionColumn = React.useCallback( + (column: CDTTreeTableActionColumn | undefined, record: CDTTreeItem) => { + const actions: React.ReactNode[] = []; + + if (record.pinned !== undefined) { + actions.push( + props.pin?.onPin?.(event, !record.pinned, record)} + aria-label={record.pinned ? 'Unpin row' : 'Pin row'} + role="button" + tabIndex={0} + onKeyDown={(event) => { if (event.key === 'Enter') props.pin?.onPin?.(event, !record.pinned, record); }} + > + ); + } + + if (column?.commands) { + column.commands.forEach((command) => { + actions.push( + props.action?.onAction?.(event, command, command.value, record)} + aria-label={command.title} + role="button" + tabIndex={0} + onKeyDown={(event) => { if (event.key === 'Enter') props.action?.onAction?.(event, command, command.value, record); }} + > + ); + }); + } + + return
{actions}
; + }, + [props.pin, props.action] + ); + + // ==== Columns ==== + + const createColumns = (columnDefinitions: CDTTreeTableColumnDefinition[]): TableColumnsType> => { + function stringColumn(columnDefinition: CDTTreeTableColumnDefinition): ColumnType> { + return { + title: columnDefinition.field, + dataIndex: ['columns', columnDefinition.field, 'label'], + width: 0, + ellipsis: true, + render: (label, record) => { + const column = findNestedValue(record, ['columns', columnDefinition.field]); + + if (!column) { + return undefined; + } + + return renderStringColumn(label, record, column); + }, + onCell: (record) => { + const column = findNestedValue(record, ['columns', columnDefinition.field]); + + if (!column) { + return {}; + } + + const colSpan = column.colSpan; + if (colSpan) { + return { + colSpan: colSpan === 'fill' ? columnDefinitions.length : colSpan, + style: { + zIndex: 1 + } + }; + } + + return {}; + } + }; + } + + function actionColumn(columnDefinition: CDTTreeTableColumnDefinition): ColumnType> { + return { + title: columnDefinition.field, + dataIndex: ['columns', columnDefinition.field], + width: 16 * 5, + render: renderActionColumn, + }; + } + + return [ + ...(columnDefinitions?.map(c => { + if (c.type === 'string') { + return stringColumn(c); + } else if (c.type === 'action') { + return actionColumn(c); + } + + return { + title: c.field, + dataIndex: ['columns', c.field, 'label'], + width: 200 + }; + }) ?? []) + ]; + }; + + const columns = React.useMemo(() => createColumns(props.columnDefinitions ?? []), [props.columnDefinitions]); + + // ==== Handlers ==== + + // Ensure that even if we lose the active element through scrolling or other means, we can still navigate by restoring the focus + React.useEffect(() => { + if (!ref.current) { + return; + } + + const observer = new MutationObserver(() => { + if (document.activeElement === globalSearchRef.current?.input()) { + // do not steal focus from the search input + return; + } + const selectedRow = document.querySelector('.ant-table-row-selected'); + if (!selectedRow) { + // Selected row was removed from the DOM, focus on the table + ref.current?.focus(); + } else if (selectedRow !== document.activeElement) { + // Selected row is still in the DOM, but not focused + selectedRow?.focus(); + } + }); + + observer.observe(ref.current, { childList: true, subtree: true }); + return () => observer.disconnect(); + }, [ref.current]); + + // Abort scrolling when mouse drag was finished (e.g., left mouse button is no longer pressed) outside the iframe + React.useEffect(() => { + const abortScroll = (event: MouseEvent) => { + if (!(event.buttons & 1)) { + // left button is no longer pressed... + const elements = document.getElementsByClassName('ant-table-tbody-virtual-scrollbar-thumb-moving'); + if (elements.length > 0) { + // ...but we are still scrolling the thumb (left button was released outside iframe) -> abort scrolling + window.dispatchEvent(new MouseEvent('mouseup')); + } + } + }; + document.addEventListener('mouseenter', abortScroll); + return () => document.removeEventListener('mouseenter', abortScroll); + }, []); + + // Scroll to selected row if autoSelectRowRef is set + React.useEffect(() => { + if (autoSelectRowRef.current && selection) { + tblRef.current?.scrollTo({ key: selection.key }); + autoSelectRowRef.current = false; + } + }, [autoSelectRowRef.current]); + + const onRowClick = React.useCallback( + (record: CDTTreeItem, event: React.MouseEvent) => { + const isExpanded = expandedRowKeys?.includes(record.id); + handleExpand(!isExpanded, record); + selectRow(record); + + event.currentTarget.focus(); + }, + [props.expansion] + ); + + // ==== Return ==== + + return
+ +
No data available.
} + > +
+ > + ref={tblRef} + columns={columns} + dataSource={filteredData} + components={{ body: { row: BodyRow } }} + virtual + scroll={{ x: width, y: height - 2 }} + showHeader={false} + pagination={false} + rowClassName={(record) => classNames({ 'ant-table-row-selected': record.key === selection?.key, 'ant-table-row-matched': record.matching ?? false })} + onRow={(record) => ({ + record, + onClick: (event) => onRowClick(record, event), + })} + expandable={{ + expandIcon: props => , + showExpandColumn: true, + expandedRowKeys: expandedRowKeys, + onExpand: handleExpand + }} + /> +
+
+
; +} diff --git a/src/tree/common/index.ts b/src/tree/common/index.ts new file mode 100644 index 0000000..f1bb810 --- /dev/null +++ b/src/tree/common/index.ts @@ -0,0 +1,11 @@ +/******************************************************************************** + * Copyright (C) 2024 EclipseSource and others. + * + * This program and the accompanying materials are made available under the + * terms of the MIT License as outlined in the LICENSE File + ********************************************************************************/ + +export * from './tree-messenger-types'; +export * from './tree-model-types'; +export * from './tree-table-column-types'; +export * from './tree-converter'; diff --git a/src/tree/common/tree-converter.ts b/src/tree/common/tree-converter.ts new file mode 100644 index 0000000..679ab1e --- /dev/null +++ b/src/tree/common/tree-converter.ts @@ -0,0 +1,40 @@ +/******************************************************************************** + * Copyright (C) 2024 EclipseSource and others. + * + * This program and the accompanying materials are made available under the + * terms of the MIT License as outlined in the LICENSE File + ********************************************************************************/ + +import type { CDTTreeItemResource, CDTTreeItem } from './tree-model-types'; + +/** + * A TreeConverterContext is used to pass additional information to the TreeResourceConverter. + * It contains the expanded keys, pinned keys and a resource map. + * It will be propagated to all TreeResourceConverters. + */ +export interface CDTTreeConverterContext { + parent?: CDTTreeItem, + /** + * The expanded keys of the tree. This is used to determine if a node should be expanded or not. + */ + expandedKeys: string[], + /** + * The pinned keys of the tree. This is used to determine if a node should be pinned or not. + */ + pinnedKeys: string[] + /** + * A map of all resources that are currently in the tree. + * This can be useful to access parent resources. + * It is filled while converting the tree. + */ + resourceMap: Map +} + +/** + * A TreeResourceConverter is responsible for converting a resource into a CDTTreeItem. + */ +export interface CDTTreeResourceConverter { + canHandle(resource: TResource): boolean; + + convert(resource: TResource, context: CDTTreeConverterContext): CDTTreeItem; +} diff --git a/src/tree/common/tree-messenger-types.ts b/src/tree/common/tree-messenger-types.ts new file mode 100644 index 0000000..9766500 --- /dev/null +++ b/src/tree/common/tree-messenger-types.ts @@ -0,0 +1,45 @@ +/******************************************************************************** + * Copyright (C) 2024 Arm Limited and others. + * + * This program and the accompanying materials are made available under the + * terms of the MIT License as outlined in the LICENSE File + ********************************************************************************/ + +import type { NotificationType } from 'vscode-messenger-common'; +import type { CDTTreeExtensionModel } from './tree-model-types'; + +export interface CDTTreeNotificationContext { + /** + * If true or undefined, the tree will be resynced. + */ + resync?: boolean; +} + +export interface CDTTreeNotification { + context?: CDTTreeNotificationContext; + data: T; +} + +export interface CDTTreeTerminatedEvent { + /** + * The number of remaining trees. + */ + remaining: number; + data: T; +} + +export interface CDTTreeExecuteCommand { + commandId: string; + itemId: string; + value?: unknown; +} + +export namespace CDTTreeMessengerType { + export const updateState: NotificationType = { method: 'updateState' }; + export const ready: NotificationType = { method: 'ready' }; + + export const executeCommand: NotificationType> = { method: 'executeCommand' }; + export const toggleNode: NotificationType> = { method: 'toggleNode' }; + export const clickNode: NotificationType> = { method: 'clickNode' }; + export const openSearch: NotificationType = { method: 'openSearch' }; +} diff --git a/src/tree/common/tree-model-types.ts b/src/tree/common/tree-model-types.ts new file mode 100644 index 0000000..e40656f --- /dev/null +++ b/src/tree/common/tree-model-types.ts @@ -0,0 +1,105 @@ +/******************************************************************************** + * Copyright (C) 2024 Arm Limited and others. + * + * This program and the accompanying materials are made available under the + * terms of the MIT License as outlined in the LICENSE File + ********************************************************************************/ + +import { VSCodeContext } from '../../vscode/webview-types'; +import type { CDTTreeTableColumn, CDTTreeTableColumnDefinition } from './tree-table-column-types'; + +// ==== Items ==== + +export interface CDTTreeItemResource { + __type: string; +} + +/** + * A tree item that is used in the CDT tree view. + */ +export interface CDTTreeItem { + __type: 'CDTTreeItem' + id: string; + key: string; + parent?: CDTTreeItem; + children?: CDTTreeItem[]; + /** + * The resource that this tree item represents. This can be any type of object. + */ + resource: T; + /** + * The columns that are displayed for this tree item. + */ + columns?: Record; + /** + * Whether this item is pinned. Undefined means that the item can not be pinned. + */ + pinned?: boolean; + /** + * Whether this item is expanded. Undefined means that the item is not expanded. + */ + expanded?: boolean; + /** + * Whether this item is matched by the current filter. Undefined means that the item is not matched. + */ + matching?: boolean; +} + +export namespace CDTTreeItem { + export function create(options: Omit, '__type'>): CDTTreeItem { + return { + __type: 'CDTTreeItem', + ...options + }; + } + + export function createRoot(): CDTTreeItem { + return create({ + id: 'root', + key: 'root', + resource: { __type: 'root' }, + children: [] + }); + } + + export function isRoot(item: CDTTreeItem): boolean { + return item.id === 'root'; + } +} + +// ==== Model ==== + +/** + * The model that is used to initialize the CDT tree view. + * It is passed to the webview when the tree view is created / updated. + */ +export interface CDTTreeExtensionModel { + items?: TItems[]; + columnFields?: CDTTreeTableColumnDefinition[]; +} + +/** + * The view model that is used to update the CDT tree view. + * It is the actual model that is used to render the tree view. + */ +export interface CDTTreeModel { + items: CDTTreeItem[]; + expandedKeys: string[]; + pinnedKeys: string[]; +} + +export interface CDTTreeWebviewContext { + webviewSection: string; + cdtTreeItemId: string; + cdtTreeItemType: string; +} + +export namespace CDTTreeWebviewContext { + export function is(context: object): context is CDTTreeWebviewContext { + return 'cdtTreeItemId' in context; + } + + export function create(context: CDTTreeWebviewContext): VSCodeContext { + return VSCodeContext.create(context); + } +} diff --git a/src/tree/common/tree-table-column-types.ts b/src/tree/common/tree-table-column-types.ts new file mode 100644 index 0000000..1dcc2e3 --- /dev/null +++ b/src/tree/common/tree-table-column-types.ts @@ -0,0 +1,62 @@ +/******************************************************************************** + * Copyright (C) 2024 Arm Limited and others. + * + * This program and the accompanying materials are made available under the + * terms of the MIT License as outlined in the LICENSE File + ********************************************************************************/ + +import type { CommandDefinition } from '../../vscode/webview-types'; + + +/** + * A column definition for a tree table. + * This is used to define the columns that are displayed in the tree table. + */ +export interface CDTTreeTableColumnDefinition { + /** + * The type of the column. It can be used to show different types of columns. + */ + type: string; + /** + * The field that is used to get the value for this column. See {@link CDTTreeItem.columns}. + */ + field: string; +} + +/** + * A string column represents a column that displays a string value. + */ +export interface CDTTreeTableStringColumn { + type: 'string'; + icon?: string; + label: string; + colSpan?: number | 'fill'; + /** + * Allows to highlight parts of the string. + */ + highlight?: [number, number][]; + /** + * The tooltip that is displayed when hovering over the string. + */ + tooltip?: string; +} + +/** + * An action column represents a column that displays multiple interactable buttons/icons. + */ +export interface CDTTreeTableActionColumn { + type: 'action'; + commands: CDTTreeTableActionColumnCommand[]; +} + +/** + * A command that can be executed when clicking on a button/icon in an action column. + */ +export interface CDTTreeTableActionColumnCommand extends CommandDefinition { + /** + * The value that is passed to the command when it is executed. + */ + value?: unknown; +} + +export type CDTTreeTableColumn = CDTTreeTableStringColumn | CDTTreeTableActionColumn; diff --git a/src/tree/vscode/index.ts b/src/tree/vscode/index.ts new file mode 100644 index 0000000..b0a1c88 --- /dev/null +++ b/src/tree/vscode/index.ts @@ -0,0 +1,9 @@ +/******************************************************************************** + * Copyright (C) 2024 EclipseSource and others. + * + * This program and the accompanying materials are made available under the + * terms of the MIT License as outlined in the LICENSE File + ********************************************************************************/ + +export * from './tree-data-provider'; +export * from './tree-webview-view-provider'; diff --git a/src/tree/vscode/tree-data-provider.ts b/src/tree/vscode/tree-data-provider.ts new file mode 100644 index 0000000..e64e741 --- /dev/null +++ b/src/tree/vscode/tree-data-provider.ts @@ -0,0 +1,36 @@ +/******************************************************************************** + * Copyright (C) 2024 EclipseSource and others. + * + * This program and the accompanying materials are made available under the + * terms of the MIT License as outlined in the LICENSE File + ********************************************************************************/ + +import * as vscode from 'vscode'; +import type { CDTTreeNotification, CDTTreeTableColumnDefinition, CDTTreeTerminatedEvent } from '../common'; +import type { MaybePromise } from '../../base/utils'; + +/** + * A tree data provider that provides data for the CDTTree. + * + * @param TNode The type of the tree nodes in the domain model. + * @param TSerializedNode The type of the serialized tree nodes. Those are the nodes that + * are actually send to the webview to be display in the tree. + */ +export interface CDTTreeDataProvider { + onDidTerminate: vscode.Event>; + onDidChangeTreeData: vscode.Event>; + /** + * Get the column definitions for the tree table. + */ + getColumnDefinitions(): CDTTreeTableColumnDefinition[]; + + /** + * Get the root elements of the tree. + */ + getSerializedRoots(): MaybePromise; + + /** + * Get the children of the given element. + */ + getSerializedData(element: TNode): MaybePromise; +} diff --git a/src/tree/vscode/tree-webview-view-provider.ts b/src/tree/vscode/tree-webview-view-provider.ts new file mode 100644 index 0000000..c3a0bd4 --- /dev/null +++ b/src/tree/vscode/tree-webview-view-provider.ts @@ -0,0 +1,138 @@ +/******************************************************************************** + * Copyright (C) 2024 Arm Limited and others. + * + * This program and the accompanying materials are made available under the + * terms of the MIT License as outlined in the LICENSE File + ********************************************************************************/ + +import * as vscode from 'vscode'; +import { Messenger } from 'vscode-messenger'; +import { NotificationType, WebviewIdMessageParticipant } from 'vscode-messenger-common'; +import { CDTTreeExecuteCommand, CDTTreeMessengerType, CDTTreeNotification } from '../common'; +import type { CDTTreeDataProvider } from './tree-data-provider'; + +export abstract class CDTTreeWebviewViewProvider implements vscode.WebviewViewProvider { + + protected onDidToggleNodeEvent = new vscode.EventEmitter>(); + public readonly onDidToggleNode = this.onDidToggleNodeEvent.event; + protected onDidExecuteCommandEvent = new vscode.EventEmitter>(); + public readonly onDidExecuteCommand = this.onDidExecuteCommandEvent.event; + protected onDidClickNodeEvent = new vscode.EventEmitter>(); + public readonly onDidClickNode = this.onDidClickNodeEvent.event; + + protected get extensionUri(): vscode.Uri { + return this.context.extensionUri; + } + + protected _view?: vscode.WebviewView; + protected participant: WebviewIdMessageParticipant | undefined; + + public constructor( + protected readonly dataProvider: CDTTreeDataProvider, + protected readonly context: vscode.ExtensionContext, + protected readonly messenger = new Messenger({ ignoreHiddenViews: false, debugLog: true }) + ) { + } + + public async resolveWebviewView(webviewView: vscode.WebviewView, _context: vscode.WebviewViewResolveContext, + _token: vscode.CancellationToken): Promise { + this._view = webviewView; + + const baseExtensionUriString = this.extensionUri.toString(); + const distPathUri = vscode.Uri.parse(`${baseExtensionUriString}/dist/views`, true /* strict */); + const mediaPathUri = vscode.Uri.parse(`${baseExtensionUriString}/media`, true /* strict */); + const nodeModulesPathUri = vscode.Uri.parse(`${baseExtensionUriString}/node_modules`, true /* strict */); + + // Allow scripts in the webview + webviewView.webview.options = { + enableScripts: true, // enable scripts in the webview + localResourceRoots: [distPathUri, mediaPathUri, nodeModulesPathUri] // restrict extension's local file access + }; + + // Set the HTML content that will fill the webview view + webviewView.webview.html = await this.getWebviewContent(webviewView.webview, this.extensionUri); + + // Sets up an event listener to listen for messages passed from the webview view context + // and executes code based on the message that is received + this.setWebviewMessageListener(webviewView); + this.setWebviewData(webviewView); + } + + protected setWebviewData(_webviewView: vscode.WebviewView): void { + // Nothing to do + } + + protected async getWebviewContent(webview: vscode.Webview, extensionUri: vscode.Uri): Promise { + const codiconsUri = webview.asWebviewUri(vscode.Uri.joinPath(extensionUri, 'node_modules', '@vscode/codicons', 'dist', 'codicon.css')); + const mainUri = webview.asWebviewUri(vscode.Uri.joinPath( + extensionUri, + 'dist', + 'views', + 'treeWebView.js' + )); + + return ` + + + + + + + + + + +
+ + + `; + } + + protected setWebviewMessageListener(webview: vscode.WebviewView): void { + const participant = this.participant = this.messenger.registerWebviewView(webview); + + if (this.participant === undefined) { + return; + } + + const disposables = [ + this.dataProvider.onDidTerminate(async (event) => { + if (event.remaining > 0) { + this.refresh(); + } + }), + this.dataProvider.onDidChangeTreeData(async (event) => { + if (event.context?.resync !== false) { + this.refresh(); + } + }), + this.messenger.onNotification(CDTTreeMessengerType.ready, () => this.onReady(), { sender: participant }), + this.messenger.onNotification(CDTTreeMessengerType.executeCommand, (event) => this.onDidExecuteCommandEvent.fire(event), { sender: participant }), + this.messenger.onNotification(CDTTreeMessengerType.toggleNode, event => this.onDidToggleNodeEvent.fire(event), { sender: participant }), + this.messenger.onNotification(CDTTreeMessengerType.clickNode, event => this.onDidClickNodeEvent.fire(event), { sender: participant }), + ]; + + webview.onDidDispose(() => disposables.forEach(disposible => disposible.dispose())); + } + + protected async onReady(): Promise { + await this.refresh(); + } + + protected async refresh(): Promise { + if (!this.participant) { + return; + } + + const columnFields = this.dataProvider.getColumnDefinitions(); + const items = await this.dataProvider.getSerializedRoots(); + + this.sendNotification(CDTTreeMessengerType.updateState, { columnFields, items }); + } + + sendNotification

(type: NotificationType

, params?: P): void { + if (this.participant) { + this.messenger.sendNotification(type, this.participant, params); + } + } +} diff --git a/src/vscode.ts b/src/vscode.ts new file mode 100644 index 0000000..2d518a7 --- /dev/null +++ b/src/vscode.ts @@ -0,0 +1,10 @@ +/******************************************************************************** + * Copyright (C) 2025 EclipseSource and others. + * + * This program and the accompanying materials are made available under the + * terms of the MIT License as outlined in the LICENSE File + ********************************************************************************/ + +// Export only types compatible with the VS Code API + +export * from './tree/vscode'; diff --git a/src/vscode/messenger.ts b/src/vscode/messenger.ts new file mode 100644 index 0000000..77270b7 --- /dev/null +++ b/src/vscode/messenger.ts @@ -0,0 +1,11 @@ +/******************************************************************************** + * Copyright (C) 2024 EclipseSource and others. + * + * This program and the accompanying materials are made available under the + * terms of the MIT License as outlined in the LICENSE File + ********************************************************************************/ + +import { Messenger } from 'vscode-messenger-webview'; + +export const vscode = acquireVsCodeApi(); +export const messenger = new Messenger(vscode); diff --git a/src/vscode/webview-types.ts b/src/vscode/webview-types.ts new file mode 100644 index 0000000..5dbe725 --- /dev/null +++ b/src/vscode/webview-types.ts @@ -0,0 +1,29 @@ +/******************************************************************************** + * Copyright (C) 2023-2024 Marcel Ball, Arm Limited and others. + * + * This program and the accompanying materials are made available under the + * terms of the MIT License as outlined in the LICENSE File + ********************************************************************************/ + +export interface VSCodeContext { + 'data-vscode-context': string; +} + +export namespace VSCodeContext { + export function create(context: object): VSCodeContext { + return { + 'data-vscode-context': JSON.stringify({ + ...context, + }) + }; + } +} + +/** + * A command definition that is manually inserted into the DOM and not by VSCode. + */ +export interface CommandDefinition { + commandId: string; + icon: string; + title?: string; +} diff --git a/style/tooltip/tooltip.css b/style/tooltip/tooltip.css new file mode 100644 index 0000000..ad2e3b9 --- /dev/null +++ b/style/tooltip/tooltip.css @@ -0,0 +1,28 @@ +/******************************************************************************** + * Copyright (C) 2024 EclipseSource and others. + * + * This program and the accompanying materials are made available under the + * terms of the MIT License as outlined in the LICENSE File + ********************************************************************************/ + +.tooltip { + background: var(--vscode-editorHoverWidget-background); + border: 1px solid var(--vscode-editorHoverWidget-border); + border-radius: 3px; + box-shadow: 0 2px 8px var(--vscode-widget-shadow); + max-width: 700px; + max-height: 375px; + padding: 0; +} + +.tooltip .tooltip-content { + background: var(--vscode-editorHoverWidget-background); + color: var(--vscode-editorHoverWidget-foreground); + font-size: 12px; + padding: 2px 8px; + max-width: var(--vscode-hover-maxWidth, 500px); + word-wrap: break-word; + white-space: unset; + display: block; + flex-direction: column; +} diff --git a/style/tree/tree-common.css b/style/tree/tree-common.css new file mode 100644 index 0000000..7ca2743 --- /dev/null +++ b/style/tree/tree-common.css @@ -0,0 +1,48 @@ +/******************************************************************************** + * Copyright (C) 2024 EclipseSource and others. + * + * This program and the accompanying materials are made available under the + * terms of the MIT License as outlined in the LICENSE File + ********************************************************************************/ + +.tree-label { + overflow: hidden; + text-overflow: ellipsis; + white-space: pre; +} + +.tree-label > span { + overflow: hidden; + text-overflow: ellipsis; + white-space: pre; +} + +.label-highlight { + background-color: var(--vscode-list-filterMatchBackground); + color: unset; + outline: 1px dotted var(--vscode-list-filterMatchBorder); + outline-offset: -1px; +} + +.tree-toggler-container { + width: 1rem; + margin-right: 6px; + cursor: pointer; + padding-top: 3px; +} + +.tree-actions { + display: none; + flex: 1; + justify-content: end; +} + +.tree-actions .codicon { + padding: 2px; + border-radius: 5px; + font-size: var(--vscode-font-size); +} + +.tree-actions .codicon:hover { + background: var(--vscode-toolbar-hoverBackground); +} diff --git a/style/tree/tree-search-overlay.css b/style/tree/tree-search-overlay.css new file mode 100644 index 0000000..b804d0a --- /dev/null +++ b/style/tree/tree-search-overlay.css @@ -0,0 +1,84 @@ +/******************************************************************************** + * Copyright (C) 2024 EclipseSource and others. + * + * This program and the accompanying materials are made available under the + * terms of the MIT License as outlined in the LICENSE File + ********************************************************************************/ + +.search-overlay { + position: fixed; + top: -33px; + opacity: 0; + right: 20px; + background-color: var(--vscode-editorWidget-background); + box-shadow: 0 0 4px 1px var(--vscode-widget-shadow); + color: var(--vscode-editorWidget-foreground); + border-bottom: 1px solid var(--vscode-widget-border); + border-bottom-left-radius: 4px; + border-bottom-right-radius: 4px; + border-left: 1px solid var(--vscode-widget-border); + border-right: 1px solid var(--vscode-widget-border); + box-sizing: border-box; + height: 33px; + line-height: 19px; + overflow: hidden; + padding: 4px; + z-index: 35; + display: flex; + flex-direction: row; + gap: 5px; + + -webkit-transition: top 0.2s ease, opacity 0.2s ease; + -moz-transition: top 0.2s ease, opacity 0.2s ease; + -ms-transition: top 0.2s ease, opacity 0.2s ease; + -o-transition: top 0.2s ease, opacity 0.2s ease; + transition: top 0.2s ease, opacity 0.2s ease; +} + +.search-overlay.visible { + top: 5px; + opacity: 1; +} + +body.has-scrollbar .search-overlay { + right: 5px; +} + +.search-overlay .search-input { + color: var(--vscode-input-foreground); + background-color: var(--vscode-input-background); + outline: none; + scrollbar-width: none; + border: none; + box-sizing: border-box; + display: inline-block; + font-family: inherit; + font-size: inherit; + height: 100%; + line-height: inherit; + resize: none; + width: 100%; + padding: 4px 6px; + margin: 0; +} + +.search-overlay input.search-input:focus { + outline: 1px solid var(--vscode-focusBorder) +} + + +.search-input::placeholder { + color: var(--vscode-input-placeholderForeground); +} + +.search-input::-moz-placeholder { + color: var(--vscode-input-placeholderForeground); +} + +.search-input:-ms-input-placeholder { + color: var(--vscode-input-placeholderForeground); +} + +.search-input:-webkit-input-placeholder { + color: var(--vscode-input-placeholderForeground); +} \ No newline at end of file diff --git a/style/tree/tree.css b/style/tree/tree.css new file mode 100644 index 0000000..1d03155 --- /dev/null +++ b/style/tree/tree.css @@ -0,0 +1,124 @@ +/******************************************************************************** + * Copyright (C) 2024 Arm Limited and others. + * + * This program and the accompanying materials are made available under the + * terms of the MIT License as outlined in the LICENSE File + ********************************************************************************/ + +.markdown { + line-break: anywhere; +} + +.markdown hr { + border: 0; + box-sizing: border-box; + height: 1px; + margin: 4px -8px 0; + border-top: 1px solid rgba(69, 69, 69, 0.5); +} + +.markdown .code, +.markdown h1, +.markdown h2, +.markdown h3, +.markdown h4, +.markdown h5, +.markdown h6, +.markdown p, +.markdown ul { + margin: 8px 0; +} + +/* AntD Table Variables */ +.css-var-r0 { + --ant-font-family: var(--vscode-font-family); + --ant-color-text: var(--vscode-sideBar-foreground); + --ant-color-bg-container: var(--vscode-sideBar-background); +} + +.ant-table-tbody-virtual-scrollbar-thumb { + background: var(--vscode-scrollbarSlider-background) !important; +} + +.ant-table.ant-table-css-var { + --ant-table-row-selected-bg: var(--vscode-list-inactiveSelectionBackground); + --ant-table-row-selected-hover-bg: var( + --vscode-list-inactiveSelectionBackground + ); + --ant-table-row-hover-bg: var(--vscode-list-hoverBackground); + --ant-table-border-color: var(--vscode-sideBar-background); + --ant-table-cell-font-size: var(--vscode-font-size); + --ant-table-cell-padding-block: 0; + --ant-table-cell-padding-inline: 4px; +} + +.ant-table:focus-within { + --ant-table-row-selected-bg: var(--vscode-list-activeSelectionBackground); + --ant-table-row-selected-hover-bg: var( + --vscode-list-activeSelectionBackground + ); +} + +.ant-table .ant-table-row { + border: 1px solid transparent; + outline: none; + height: 22px; + cursor: pointer; +} + +.ant-table:focus-within .ant-table-row.ant-table-row-selected { + border-color: var( + --vscode-list-focusAndSelectionOutline, + var(--vscode-contrastActiveBorder, var(--vscode-list-focusOutline)) + ); +} + +.ant-table .ant-table-row .ant-table-cell { + display: flex; + transition: none; + border-bottom: none; +} + +.ant-table .ant-table-row .ant-table-cell .cell-icon { + margin-right: 4px; + padding-top: 4px; + font-size: var(--vscode-font-size); +} + +.ant-table .ant-table-row .ant-table-cell .tree-cell { + display: flex; +} + +.ant-table .ant-table-row:hover .tree-actions, +.ant-table .ant-table-row:focus .tree-actions { + display: flex; + align-items: center; +} + +.ant-table .tree-actions { + padding-right: 8px; +} + +.ant-table .tree-actions > i { + cursor: pointer; +} + +.ant-table .leaf-item-spacer { + display: inline-block; + width: 16px; +} + +.ant-table-empty .empty-message { + display: inline-block; + padding-top: 4em; + color: var(--vscode-editor-foreground); +} + +.ant-table-empty .ant-table-body { + overflow: hidden !important; +} + +/* The horizontal scrollbar is not necessary */ +.ant-table .ant-table-tbody-virtual-scrollbar-horizontal { + display: none; +} diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..65a40d2 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,38 @@ +{ + "compilerOptions": { + "skipLibCheck": true, + "declaration": true, + "declarationMap": true, + "noImplicitAny": true, + "noImplicitThis": true, + "strictNullChecks": true, + "noImplicitOverride": true, + "noEmitOnError": false, + "noUnusedLocals": true, + "noImplicitReturns": true, + "strict": true, + "incremental": true, + "strictPropertyInitialization": false, + "experimentalDecorators": true, + "emitDecoratorMetadata": true, + "downlevelIteration": true, + "sourceMap": true, + "esModuleInterop": true, + // Compiling + "tsBuildInfoFile": "./node_modules/.tmp/tsbuildinfo.json", + "module": "CommonJS", + "outDir": "lib", + "target": "ES2020", + "jsx": "react", + "lib": [ + "es2020", + "dom" + ] + }, + "include": [ + "src" + ], + "exclude": [ + "node_modules" + ] +} \ No newline at end of file diff --git a/yarn.lock b/yarn.lock new file mode 100644 index 0000000..0f70991 --- /dev/null +++ b/yarn.lock @@ -0,0 +1,2817 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@ant-design/colors@^7.0.0", "@ant-design/colors@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@ant-design/colors/-/colors-7.2.0.tgz#80d7325d20463f09c7839d28da630043dd5c263a" + integrity sha512-bjTObSnZ9C/O8MB/B4OUtd/q9COomuJAR2SYfhxLyHvCKn4EKwCN3e+fWGMo7H5InAyV0wL17jdE9ALrdOW/6A== + dependencies: + "@ant-design/fast-color" "^2.0.6" + +"@ant-design/cssinjs-utils@^1.1.3": + version "1.1.3" + resolved "https://registry.yarnpkg.com/@ant-design/cssinjs-utils/-/cssinjs-utils-1.1.3.tgz#5dd79126057920a6992d57b38dd84e2c0b707977" + integrity sha512-nOoQMLW1l+xR1Co8NFVYiP8pZp3VjIIzqV6D6ShYF2ljtdwWJn5WSsH+7kvCktXL/yhEtWURKOfH5Xz/gzlwsg== + dependencies: + "@ant-design/cssinjs" "^1.21.0" + "@babel/runtime" "^7.23.2" + rc-util "^5.38.0" + +"@ant-design/cssinjs@^1.21.0", "@ant-design/cssinjs@^1.23.0": + version "1.23.0" + resolved "https://registry.yarnpkg.com/@ant-design/cssinjs/-/cssinjs-1.23.0.tgz#492efba9b15d64f42a4cb5d568cab0607d0c2b16" + integrity sha512-7GAg9bD/iC9ikWatU9ym+P9ugJhi/WbsTWzcKN6T4gU0aehsprtke1UAaaSxxkjjmkJb3llet/rbUSLPgwlY4w== + dependencies: + "@babel/runtime" "^7.11.1" + "@emotion/hash" "^0.8.0" + "@emotion/unitless" "^0.7.5" + classnames "^2.3.1" + csstype "^3.1.3" + rc-util "^5.35.0" + stylis "^4.3.4" + +"@ant-design/fast-color@^2.0.6": + version "2.0.6" + resolved "https://registry.yarnpkg.com/@ant-design/fast-color/-/fast-color-2.0.6.tgz#ab4d4455c1542c9017d367c2fa8ca3e4215d0ba2" + integrity sha512-y2217gk4NqL35giHl72o6Zzqji9O7vHh9YmhUVkPtAOpoTCH4uWxo/pr4VE8t0+ChEPs0qo4eJRC5Q1eXWo3vA== + dependencies: + "@babel/runtime" "^7.24.7" + +"@ant-design/icons-svg@^4.4.0": + version "4.4.2" + resolved "https://registry.yarnpkg.com/@ant-design/icons-svg/-/icons-svg-4.4.2.tgz#ed2be7fb4d82ac7e1d45a54a5b06d6cecf8be6f6" + integrity sha512-vHbT+zJEVzllwP+CM+ul7reTEfBR0vgxFe7+lREAsAA7YGsYpboiq2sQNeQeRvh09GfQgs/GyFEvZpJ9cLXpXA== + +"@ant-design/icons@^5.6.1": + version "5.6.1" + resolved "https://registry.yarnpkg.com/@ant-design/icons/-/icons-5.6.1.tgz#7290fcdc3d96ff3fca793ed399053cd29ad5dbd3" + integrity sha512-0/xS39c91WjPAZOWsvi1//zjx6kAp4kxWwctR6kuU6p133w8RU0D2dSCvZC19uQyharg/sAvYxGYWl01BbZZfg== + dependencies: + "@ant-design/colors" "^7.0.0" + "@ant-design/icons-svg" "^4.4.0" + "@babel/runtime" "^7.24.8" + classnames "^2.2.6" + rc-util "^5.31.1" + +"@ant-design/react-slick@~1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@ant-design/react-slick/-/react-slick-1.1.2.tgz#f84ce3e4d0dc941f02b16f1d1d6d7a371ffbb4f1" + integrity sha512-EzlvzE6xQUBrZuuhSAFTdsr4P2bBBHGZwKFemEfq8gIGyIQCxalYfZW/T2ORbtQx5rU69o+WycP3exY/7T1hGA== + dependencies: + "@babel/runtime" "^7.10.4" + classnames "^2.2.5" + json2mq "^0.2.0" + resize-observer-polyfill "^1.5.1" + throttle-debounce "^5.0.0" + +"@babel/runtime@^7.10.1", "@babel/runtime@^7.10.4", "@babel/runtime@^7.11.1", "@babel/runtime@^7.11.2", "@babel/runtime@^7.16.7", "@babel/runtime@^7.18.0", "@babel/runtime@^7.18.3", "@babel/runtime@^7.20.0", "@babel/runtime@^7.20.7", "@babel/runtime@^7.21.0", "@babel/runtime@^7.22.5", "@babel/runtime@^7.23.2", "@babel/runtime@^7.23.6", "@babel/runtime@^7.23.9", "@babel/runtime@^7.24.4", "@babel/runtime@^7.24.7", "@babel/runtime@^7.24.8", "@babel/runtime@^7.25.7", "@babel/runtime@^7.26.0": + version "7.26.9" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.26.9.tgz#aa4c6facc65b9cb3f87d75125ffd47781b475433" + integrity sha512-aA63XwOkcl4xxQa3HjPMqOP6LiK0ZDv3mUPYEFXkpHbaFjtGggE1A61FjFzJnB+p7/oy2gA8E+rcBNl/zC1tMg== + dependencies: + regenerator-runtime "^0.14.0" + +"@emotion/hash@^0.8.0": + version "0.8.0" + resolved "https://registry.yarnpkg.com/@emotion/hash/-/hash-0.8.0.tgz#bbbff68978fefdbe68ccb533bc8cbe1d1afb5413" + integrity sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow== + +"@emotion/unitless@^0.7.5": + version "0.7.5" + resolved "https://registry.yarnpkg.com/@emotion/unitless/-/unitless-0.7.5.tgz#77211291c1900a700b8a78cfafda3160d76949ed" + integrity sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg== + +"@eslint-community/eslint-utils@^4.2.0", "@eslint-community/eslint-utils@^4.4.0": + version "4.4.1" + resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.1.tgz#d1145bf2c20132d6400495d6df4bf59362fd9d56" + integrity sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA== + dependencies: + eslint-visitor-keys "^3.4.3" + +"@eslint-community/regexpp@^4.10.0", "@eslint-community/regexpp@^4.12.1", "@eslint-community/regexpp@^4.4.0": + version "4.12.1" + resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.12.1.tgz#cfc6cffe39df390a3841cde2abccf92eaa7ae0e0" + integrity sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ== + +"@eslint/config-array@^0.19.2": + version "0.19.2" + resolved "https://registry.yarnpkg.com/@eslint/config-array/-/config-array-0.19.2.tgz#3060b809e111abfc97adb0bb1172778b90cb46aa" + integrity sha512-GNKqxfHG2ySmJOBSHg7LxeUx4xpuCoFjacmlCoYWEbaPXLwvfIjixRI12xCQZeULksQb23uiA8F40w5TojpV7w== + dependencies: + "@eslint/object-schema" "^2.1.6" + debug "^4.3.1" + minimatch "^3.1.2" + +"@eslint/core@^0.12.0": + version "0.12.0" + resolved "https://registry.yarnpkg.com/@eslint/core/-/core-0.12.0.tgz#5f960c3d57728be9f6c65bd84aa6aa613078798e" + integrity sha512-cmrR6pytBuSMTaBweKoGMwu3EiHiEC+DoyupPmlZ0HxBJBtIxwe+j/E4XPIKNx+Q74c8lXKPwYawBf5glsTkHg== + dependencies: + "@types/json-schema" "^7.0.15" + +"@eslint/eslintrc@^3.3.0": + version "3.3.0" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-3.3.0.tgz#96a558f45842989cca7ea1ecd785ad5491193846" + integrity sha512-yaVPAiNAalnCZedKLdR21GOGILMLKPyqSLWaAjQFvYA2i/ciDi8ArYVr69Anohb6cH2Ukhqti4aFnYyPm8wdwQ== + dependencies: + ajv "^6.12.4" + debug "^4.3.2" + espree "^10.0.1" + globals "^14.0.0" + ignore "^5.2.0" + import-fresh "^3.2.1" + js-yaml "^4.1.0" + minimatch "^3.1.2" + strip-json-comments "^3.1.1" + +"@eslint/js@9.21.0", "@eslint/js@^9.21.0": + version "9.21.0" + resolved "https://registry.yarnpkg.com/@eslint/js/-/js-9.21.0.tgz#4303ef4e07226d87c395b8fad5278763e9c15c08" + integrity sha512-BqStZ3HX8Yz6LvsF5ByXYrtigrV5AXADWLAGc7PH/1SxOb7/FIYYMszZZWiUou/GB9P2lXWk2SV4d+Z8h0nknw== + +"@eslint/object-schema@^2.1.6": + version "2.1.6" + resolved "https://registry.yarnpkg.com/@eslint/object-schema/-/object-schema-2.1.6.tgz#58369ab5b5b3ca117880c0f6c0b0f32f6950f24f" + integrity sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA== + +"@eslint/plugin-kit@^0.2.7": + version "0.2.7" + resolved "https://registry.yarnpkg.com/@eslint/plugin-kit/-/plugin-kit-0.2.7.tgz#9901d52c136fb8f375906a73dcc382646c3b6a27" + integrity sha512-JubJ5B2pJ4k4yGxaNLdbjrnk9d/iDz6/q8wOilpIowd6PJPgaxCuHBnBszq7Ce2TyMrywm5r4PnKm6V3iiZF+g== + dependencies: + "@eslint/core" "^0.12.0" + levn "^0.4.1" + +"@floating-ui/core@^1.6.0": + version "1.6.9" + resolved "https://registry.yarnpkg.com/@floating-ui/core/-/core-1.6.9.tgz#64d1da251433019dafa091de9b2886ff35ec14e6" + integrity sha512-uMXCuQ3BItDUbAMhIXw7UPXRfAlOAvZzdK9BWpE60MCn+Svt3aLn9jsPTi/WNGlRUu2uI0v5S7JiIUsbsvh3fw== + dependencies: + "@floating-ui/utils" "^0.2.9" + +"@floating-ui/dom@^1.0.0": + version "1.6.13" + resolved "https://registry.yarnpkg.com/@floating-ui/dom/-/dom-1.6.13.tgz#a8a938532aea27a95121ec16e667a7cbe8c59e34" + integrity sha512-umqzocjDgNRGTuO7Q8CU32dkHkECqI8ZdMZ5Swb6QAM0t5rnlrN3lGo1hdpscRd3WS8T6DKYK4ephgIH9iRh3w== + dependencies: + "@floating-ui/core" "^1.6.0" + "@floating-ui/utils" "^0.2.9" + +"@floating-ui/react-dom@^2.1.2": + version "2.1.2" + resolved "https://registry.yarnpkg.com/@floating-ui/react-dom/-/react-dom-2.1.2.tgz#a1349bbf6a0e5cb5ded55d023766f20a4d439a31" + integrity sha512-06okr5cgPzMNBy+Ycse2A6udMi4bqwW/zgBF/rwjcNqWkyr82Mcg8b0vjX8OJpZFy/FKjJmw6wV7t44kK6kW7A== + dependencies: + "@floating-ui/dom" "^1.0.0" + +"@floating-ui/react@^0.26.17": + version "0.26.28" + resolved "https://registry.yarnpkg.com/@floating-ui/react/-/react-0.26.28.tgz#93f44ebaeb02409312e9df9507e83aab4a8c0dc7" + integrity sha512-yORQuuAtVpiRjpMhdc0wJj06b9JFjrYF4qp96j++v2NBpbi6SEGF7donUJ3TMieerQ6qVkAv1tgr7L4r5roTqw== + dependencies: + "@floating-ui/react-dom" "^2.1.2" + "@floating-ui/utils" "^0.2.8" + tabbable "^6.0.0" + +"@floating-ui/utils@^0.2.8", "@floating-ui/utils@^0.2.9": + version "0.2.9" + resolved "https://registry.yarnpkg.com/@floating-ui/utils/-/utils-0.2.9.tgz#50dea3616bc8191fb8e112283b49eaff03e78429" + integrity sha512-MDWhGtE+eHw5JW7lq4qhc5yRLS11ERl1c7Z6Xd0a58DozHES6EnNNwUWbMiG4J9Cgj053Bhk8zvlhFYKVhULwg== + +"@humanfs/core@^0.19.1": + version "0.19.1" + resolved "https://registry.yarnpkg.com/@humanfs/core/-/core-0.19.1.tgz#17c55ca7d426733fe3c561906b8173c336b40a77" + integrity sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA== + +"@humanfs/node@^0.16.6": + version "0.16.6" + resolved "https://registry.yarnpkg.com/@humanfs/node/-/node-0.16.6.tgz#ee2a10eaabd1131987bf0488fd9b820174cd765e" + integrity sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw== + dependencies: + "@humanfs/core" "^0.19.1" + "@humanwhocodes/retry" "^0.3.0" + +"@humanwhocodes/module-importer@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" + integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== + +"@humanwhocodes/retry@^0.3.0": + version "0.3.1" + resolved "https://registry.yarnpkg.com/@humanwhocodes/retry/-/retry-0.3.1.tgz#c72a5c76a9fbaf3488e231b13dc52c0da7bab42a" + integrity sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA== + +"@humanwhocodes/retry@^0.4.2": + version "0.4.2" + resolved "https://registry.yarnpkg.com/@humanwhocodes/retry/-/retry-0.4.2.tgz#1860473de7dfa1546767448f333db80cb0ff2161" + integrity sha512-xeO57FpIu4p1Ri3Jq/EXq4ClRm86dVF2z/+kvFnyqVYRavTZmaFaUBbWCOuuTh0o/g7DSsk6kc2vrS4Vl5oPOQ== + +"@isaacs/cliui@^8.0.2": + version "8.0.2" + resolved "https://registry.yarnpkg.com/@isaacs/cliui/-/cliui-8.0.2.tgz#b37667b7bc181c168782259bab42474fbf52b550" + integrity sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA== + dependencies: + string-width "^5.1.2" + string-width-cjs "npm:string-width@^4.2.0" + strip-ansi "^7.0.1" + strip-ansi-cjs "npm:strip-ansi@^6.0.1" + wrap-ansi "^8.1.0" + wrap-ansi-cjs "npm:wrap-ansi@^7.0.0" + +"@microsoft/fast-element@^1.12.0", "@microsoft/fast-element@^1.14.0": + version "1.14.0" + resolved "https://registry.yarnpkg.com/@microsoft/fast-element/-/fast-element-1.14.0.tgz#6522b16d55788643b04413fab0205e5e9ba4d5c9" + integrity sha512-zXvuSOzvsu8zDTy9eby8ix8VqLop2rwKRgp++ZN2kTCsoB3+QJVoaGD2T/Cyso2ViZQFXNpiNCVKfnmxBvmWkQ== + +"@microsoft/fast-foundation@^2.49.4", "@microsoft/fast-foundation@^2.50.0": + version "2.50.0" + resolved "https://registry.yarnpkg.com/@microsoft/fast-foundation/-/fast-foundation-2.50.0.tgz#60676561df5ce8bad060e4b7feb79f8dce952431" + integrity sha512-8mFYG88Xea1jZf2TI9Lm/jzZ6RWR8x29r24mGuLojNYqIR2Bl8+hnswoV6laApKdCbGMPKnsAL/O68Q0sRxeVg== + dependencies: + "@microsoft/fast-element" "^1.14.0" + "@microsoft/fast-web-utilities" "^5.4.1" + tabbable "^5.2.0" + tslib "^1.13.0" + +"@microsoft/fast-react-wrapper@^0.3.22": + version "0.3.25" + resolved "https://registry.yarnpkg.com/@microsoft/fast-react-wrapper/-/fast-react-wrapper-0.3.25.tgz#ff8bef0fd305f14f1d1390a90e1c946d741fbce9" + integrity sha512-jKzmk2xJV93RL/jEFXEZgBvXlKIY4N4kXy3qrjmBfFpqNi3VjY+oUTWyMnHRMC5EUhIFxD+Y1VD4u9uIPX3jQw== + dependencies: + "@microsoft/fast-element" "^1.14.0" + "@microsoft/fast-foundation" "^2.50.0" + +"@microsoft/fast-web-utilities@^5.4.1": + version "5.4.1" + resolved "https://registry.yarnpkg.com/@microsoft/fast-web-utilities/-/fast-web-utilities-5.4.1.tgz#8e3082ee2ff2b5467f17e7cb1fb01b0e4906b71f" + integrity sha512-ReWYncndjV3c8D8iq9tp7NcFNc1vbVHvcBFPME2nNFKNbS1XCesYZGlIlf3ot5EmuOXPlrzUHOWzQ2vFpIkqDg== + dependencies: + exenv-es6 "^1.1.1" + +"@nodelib/fs.scandir@2.1.5": + version "2.1.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" + integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== + dependencies: + "@nodelib/fs.stat" "2.0.5" + run-parallel "^1.1.9" + +"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" + integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== + +"@nodelib/fs.walk@^1.2.3": + version "1.2.8" + resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" + integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== + dependencies: + "@nodelib/fs.scandir" "2.1.5" + fastq "^1.6.0" + +"@rc-component/async-validator@^5.0.3": + version "5.0.4" + resolved "https://registry.yarnpkg.com/@rc-component/async-validator/-/async-validator-5.0.4.tgz#5291ad92f00a14b6766fc81735c234277f83e948" + integrity sha512-qgGdcVIF604M9EqjNF0hbUTz42bz/RDtxWdWuU5EQe3hi7M8ob54B6B35rOsvX5eSvIHIzT9iH1R3n+hk3CGfg== + dependencies: + "@babel/runtime" "^7.24.4" + +"@rc-component/color-picker@~2.0.1": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@rc-component/color-picker/-/color-picker-2.0.1.tgz#6b9b96152466a9d4475cbe72b40b594bfda164be" + integrity sha512-WcZYwAThV/b2GISQ8F+7650r5ZZJ043E57aVBFkQ+kSY4C6wdofXgB0hBx+GPGpIU0Z81eETNoDUJMr7oy/P8Q== + dependencies: + "@ant-design/fast-color" "^2.0.6" + "@babel/runtime" "^7.23.6" + classnames "^2.2.6" + rc-util "^5.38.1" + +"@rc-component/context@^1.4.0": + version "1.4.0" + resolved "https://registry.yarnpkg.com/@rc-component/context/-/context-1.4.0.tgz#dc6fb021d6773546af8f016ae4ce9aea088395e8" + integrity sha512-kFcNxg9oLRMoL3qki0OMxK+7g5mypjgaaJp/pkOis/6rVxma9nJBF/8kCIuTYHUQNr0ii7MxqE33wirPZLJQ2w== + dependencies: + "@babel/runtime" "^7.10.1" + rc-util "^5.27.0" + +"@rc-component/mini-decimal@^1.0.1": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@rc-component/mini-decimal/-/mini-decimal-1.1.0.tgz#7b7a362b14a0a54cb5bc6fd2b82731f29f11d9b0" + integrity sha512-jS4E7T9Li2GuYwI6PyiVXmxTiM6b07rlD9Ge8uGZSCz3WlzcG5ZK7g5bbuKNeZ9pgUuPK/5guV781ujdVpm4HQ== + dependencies: + "@babel/runtime" "^7.18.0" + +"@rc-component/mutate-observer@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@rc-component/mutate-observer/-/mutate-observer-1.1.0.tgz#ee53cc88b78aade3cd0653609215a44779386fd8" + integrity sha512-QjrOsDXQusNwGZPf4/qRQasg7UFEj06XiCJ8iuiq/Io7CrHrgVi6Uuetw60WAMG1799v+aM8kyc+1L/GBbHSlw== + dependencies: + "@babel/runtime" "^7.18.0" + classnames "^2.3.2" + rc-util "^5.24.4" + +"@rc-component/portal@^1.0.0-8", "@rc-component/portal@^1.0.0-9", "@rc-component/portal@^1.0.2", "@rc-component/portal@^1.1.0", "@rc-component/portal@^1.1.1": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@rc-component/portal/-/portal-1.1.2.tgz#55db1e51d784e034442e9700536faaa6ab63fc71" + integrity sha512-6f813C0IsasTZms08kfA8kPAGxbbkYToa8ALaiDIGGECU4i9hj8Plgbx0sNJDrey3EtHO30hmdaxtT0138xZcg== + dependencies: + "@babel/runtime" "^7.18.0" + classnames "^2.3.2" + rc-util "^5.24.4" + +"@rc-component/qrcode@~1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@rc-component/qrcode/-/qrcode-1.0.0.tgz#48a8de5eb11d0e65926f1377c4b1ef4c888997f5" + integrity sha512-L+rZ4HXP2sJ1gHMGHjsg9jlYBX/SLN2D6OxP9Zn3qgtpMWtO2vUfxVFwiogHpAIqs54FnALxraUy/BCO1yRIgg== + dependencies: + "@babel/runtime" "^7.24.7" + classnames "^2.3.2" + rc-util "^5.38.0" + +"@rc-component/tour@~1.15.1": + version "1.15.1" + resolved "https://registry.yarnpkg.com/@rc-component/tour/-/tour-1.15.1.tgz#9b79808254185fc19e964172d99e25e8c6800ded" + integrity sha512-Tr2t7J1DKZUpfJuDZWHxyxWpfmj8EZrqSgyMZ+BCdvKZ6r1UDsfU46M/iWAAFBy961Ssfom2kv5f3UcjIL2CmQ== + dependencies: + "@babel/runtime" "^7.18.0" + "@rc-component/portal" "^1.0.0-9" + "@rc-component/trigger" "^2.0.0" + classnames "^2.3.2" + rc-util "^5.24.4" + +"@rc-component/trigger@^2.0.0", "@rc-component/trigger@^2.1.1", "@rc-component/trigger@^2.2.6": + version "2.2.6" + resolved "https://registry.yarnpkg.com/@rc-component/trigger/-/trigger-2.2.6.tgz#bfe6602313b3fadd659687746511f813299d5ea4" + integrity sha512-/9zuTnWwhQ3S3WT1T8BubuFTT46kvnXgaERR9f4BTKyn61/wpf/BvbImzYBubzJibU707FxwbKszLlHjcLiv1Q== + dependencies: + "@babel/runtime" "^7.23.2" + "@rc-component/portal" "^1.1.0" + classnames "^2.3.2" + rc-motion "^2.0.0" + rc-resize-observer "^1.3.1" + rc-util "^5.44.0" + +"@types/debug@^4.0.0": + version "4.1.12" + resolved "https://registry.yarnpkg.com/@types/debug/-/debug-4.1.12.tgz#a155f21690871953410df4b6b6f53187f0500917" + integrity sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ== + dependencies: + "@types/ms" "*" + +"@types/estree-jsx@^1.0.0": + version "1.0.5" + resolved "https://registry.yarnpkg.com/@types/estree-jsx/-/estree-jsx-1.0.5.tgz#858a88ea20f34fe65111f005a689fa1ebf70dc18" + integrity sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg== + dependencies: + "@types/estree" "*" + +"@types/estree@*", "@types/estree@^1.0.0", "@types/estree@^1.0.6": + version "1.0.6" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.6.tgz#628effeeae2064a1b4e79f78e81d87b7e5fc7b50" + integrity sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw== + +"@types/hast@^3.0.0": + version "3.0.4" + resolved "https://registry.yarnpkg.com/@types/hast/-/hast-3.0.4.tgz#1d6b39993b82cea6ad783945b0508c25903e15aa" + integrity sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ== + dependencies: + "@types/unist" "*" + +"@types/json-schema@^7.0.15", "@types/json-schema@^7.0.9": + version "7.0.15" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841" + integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== + +"@types/mdast@^4.0.0": + version "4.0.4" + resolved "https://registry.yarnpkg.com/@types/mdast/-/mdast-4.0.4.tgz#7ccf72edd2f1aa7dd3437e180c64373585804dd6" + integrity sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA== + dependencies: + "@types/unist" "*" + +"@types/ms@*": + version "2.1.0" + resolved "https://registry.yarnpkg.com/@types/ms/-/ms-2.1.0.tgz#052aa67a48eccc4309d7f0191b7e41434b90bb78" + integrity sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA== + +"@types/node@^20.0.0": + version "20.17.19" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.17.19.tgz#0f2869555719bef266ca6e1827fcdca903c1a697" + integrity sha512-LEwC7o1ifqg/6r2gn9Dns0f1rhK+fPFDoMiceTJ6kWmVk6bgXBI/9IOWfVan4WiAavK9pIVWdX0/e3J+eEUh5A== + dependencies: + undici-types "~6.19.2" + +"@types/prop-types@*": + version "15.7.14" + resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.14.tgz#1433419d73b2a7ebfc6918dcefd2ec0d5cd698f2" + integrity sha512-gNMvNH49DJ7OJYv+KAKn0Xp45p8PLl6zo2YnvDIbTd4J6MER2BmWN49TG7n9LvkyihINxeKW8+3bfS2yDC9dzQ== + +"@types/react-dom@^18.0.9": + version "18.3.5" + resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.3.5.tgz#45f9f87398c5dcea085b715c58ddcf1faf65f716" + integrity sha512-P4t6saawp+b/dFrUr2cvkVsfvPguwsxtH6dNIYRllMsefqFzkZk5UIjzyDOv5g1dXIPdG4Sp1yCR4Z6RCUsG/Q== + +"@types/react@^18.0.26": + version "18.3.18" + resolved "https://registry.yarnpkg.com/@types/react/-/react-18.3.18.tgz#9b382c4cd32e13e463f97df07c2ee3bbcd26904b" + integrity sha512-t4yC+vtgnkYjNSKlFx1jkAhH8LgTo2N/7Qvi83kdEaUtMDiwpbLAktKDaAMlRcJ5eSxZkH74eEGt1ky31d7kfQ== + dependencies: + "@types/prop-types" "*" + csstype "^3.0.2" + +"@types/semver@^7.3.12": + version "7.5.8" + resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.8.tgz#8268a8c57a3e4abd25c165ecd36237db7948a55e" + integrity sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ== + +"@types/throttle-debounce@5.0.2": + version "5.0.2" + resolved "https://registry.yarnpkg.com/@types/throttle-debounce/-/throttle-debounce-5.0.2.tgz#3489d91673a4be830c2c9e2acf1f6cdab724102c" + integrity sha512-pDzSNulqooSKvSNcksnV72nk8p7gRqN8As71Sp28nov1IgmPKWbOEIwAWvBME5pPTtaXJAvG3O4oc76HlQ4kqQ== + +"@types/unist@*", "@types/unist@^3.0.0": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@types/unist/-/unist-3.0.3.tgz#acaab0f919ce69cce629c2d4ed2eb4adc1b6c20c" + integrity sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q== + +"@types/unist@^2.0.0": + version "2.0.11" + resolved "https://registry.yarnpkg.com/@types/unist/-/unist-2.0.11.tgz#11af57b127e32487774841f7a4e54eab166d03c4" + integrity sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA== + +"@types/vscode-webview@^1.57.0": + version "1.57.5" + resolved "https://registry.yarnpkg.com/@types/vscode-webview/-/vscode-webview-1.57.5.tgz#5b910525386c02305eb1d0772e0181c5f19c579b" + integrity sha512-iBAUYNYkz+uk1kdsq05fEcoh8gJmwT3lqqFPN7MGyjQ3HVloViMdo7ZJ8DFIP8WOK74PjOEilosqAyxV2iUFUw== + +"@types/vscode@^1.63.2": + version "1.97.0" + resolved "https://registry.yarnpkg.com/@types/vscode/-/vscode-1.97.0.tgz#62ce3a32243019aaa4fc20cee2a3de06bc71af4f" + integrity sha512-ueE73loeOTe7olaVyqP9mrRI54kVPJifUPjblZo9fYcv1CuVLPOEKEkqW0GkqPC454+nCEoigLWnC2Pp7prZ9w== + +"@typescript-eslint/eslint-plugin@8.25.0": + version "8.25.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.25.0.tgz#5e1d56f067e5808fa82d1b75bced82396e868a14" + integrity sha512-VM7bpzAe7JO/BFf40pIT1lJqS/z1F8OaSsUB3rpFJucQA4cOSuH2RVVVkFULN+En0Djgr29/jb4EQnedUo95KA== + dependencies: + "@eslint-community/regexpp" "^4.10.0" + "@typescript-eslint/scope-manager" "8.25.0" + "@typescript-eslint/type-utils" "8.25.0" + "@typescript-eslint/utils" "8.25.0" + "@typescript-eslint/visitor-keys" "8.25.0" + graphemer "^1.4.0" + ignore "^5.3.1" + natural-compare "^1.4.0" + ts-api-utils "^2.0.1" + +"@typescript-eslint/eslint-plugin@^5.49.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.62.0.tgz#aeef0328d172b9e37d9bab6dbc13b87ed88977db" + integrity sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag== + dependencies: + "@eslint-community/regexpp" "^4.4.0" + "@typescript-eslint/scope-manager" "5.62.0" + "@typescript-eslint/type-utils" "5.62.0" + "@typescript-eslint/utils" "5.62.0" + debug "^4.3.4" + graphemer "^1.4.0" + ignore "^5.2.0" + natural-compare-lite "^1.4.0" + semver "^7.3.7" + tsutils "^3.21.0" + +"@typescript-eslint/parser@8.25.0": + version "8.25.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-8.25.0.tgz#58fb81c7b7a35184ba17583f3d7ac6c4f3d95be8" + integrity sha512-4gbs64bnbSzu4FpgMiQ1A+D+urxkoJk/kqlDJ2W//5SygaEiAP2B4GoS7TEdxgwol2el03gckFV9lJ4QOMiiHg== + dependencies: + "@typescript-eslint/scope-manager" "8.25.0" + "@typescript-eslint/types" "8.25.0" + "@typescript-eslint/typescript-estree" "8.25.0" + "@typescript-eslint/visitor-keys" "8.25.0" + debug "^4.3.4" + +"@typescript-eslint/parser@^5.49.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.62.0.tgz#1b63d082d849a2fcae8a569248fbe2ee1b8a56c7" + integrity sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA== + dependencies: + "@typescript-eslint/scope-manager" "5.62.0" + "@typescript-eslint/types" "5.62.0" + "@typescript-eslint/typescript-estree" "5.62.0" + debug "^4.3.4" + +"@typescript-eslint/scope-manager@5.62.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz#d9457ccc6a0b8d6b37d0eb252a23022478c5460c" + integrity sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w== + dependencies: + "@typescript-eslint/types" "5.62.0" + "@typescript-eslint/visitor-keys" "5.62.0" + +"@typescript-eslint/scope-manager@8.25.0": + version "8.25.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-8.25.0.tgz#ac3805077aade898e98ca824294c998545597df3" + integrity sha512-6PPeiKIGbgStEyt4NNXa2ru5pMzQ8OYKO1hX1z53HMomrmiSB+R5FmChgQAP1ro8jMtNawz+TRQo/cSXrauTpg== + dependencies: + "@typescript-eslint/types" "8.25.0" + "@typescript-eslint/visitor-keys" "8.25.0" + +"@typescript-eslint/type-utils@5.62.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.62.0.tgz#286f0389c41681376cdad96b309cedd17d70346a" + integrity sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew== + dependencies: + "@typescript-eslint/typescript-estree" "5.62.0" + "@typescript-eslint/utils" "5.62.0" + debug "^4.3.4" + tsutils "^3.21.0" + +"@typescript-eslint/type-utils@8.25.0": + version "8.25.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-8.25.0.tgz#ee0d2f67c80af5ae74b5d6f977e0f8ded0059677" + integrity sha512-d77dHgHWnxmXOPJuDWO4FDWADmGQkN5+tt6SFRZz/RtCWl4pHgFl3+WdYCn16+3teG09DY6XtEpf3gGD0a186g== + dependencies: + "@typescript-eslint/typescript-estree" "8.25.0" + "@typescript-eslint/utils" "8.25.0" + debug "^4.3.4" + ts-api-utils "^2.0.1" + +"@typescript-eslint/types@5.62.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.62.0.tgz#258607e60effa309f067608931c3df6fed41fd2f" + integrity sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ== + +"@typescript-eslint/types@8.25.0": + version "8.25.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-8.25.0.tgz#f91512c2f532b1d6a8826cadd0b0e5cd53cf97e0" + integrity sha512-+vUe0Zb4tkNgznQwicsvLUJgZIRs6ITeWSCclX1q85pR1iOiaj+4uZJIUp//Z27QWu5Cseiw3O3AR8hVpax7Aw== + +"@typescript-eslint/typescript-estree@5.62.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz#7d17794b77fabcac615d6a48fb143330d962eb9b" + integrity sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA== + dependencies: + "@typescript-eslint/types" "5.62.0" + "@typescript-eslint/visitor-keys" "5.62.0" + debug "^4.3.4" + globby "^11.1.0" + is-glob "^4.0.3" + semver "^7.3.7" + tsutils "^3.21.0" + +"@typescript-eslint/typescript-estree@8.25.0": + version "8.25.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-8.25.0.tgz#d8409c63abddd4cf5b93c031b24b9edc1c7c1299" + integrity sha512-ZPaiAKEZ6Blt/TPAx5Ot0EIB/yGtLI2EsGoY6F7XKklfMxYQyvtL+gT/UCqkMzO0BVFHLDlzvFqQzurYahxv9Q== + dependencies: + "@typescript-eslint/types" "8.25.0" + "@typescript-eslint/visitor-keys" "8.25.0" + debug "^4.3.4" + fast-glob "^3.3.2" + is-glob "^4.0.3" + minimatch "^9.0.4" + semver "^7.6.0" + ts-api-utils "^2.0.1" + +"@typescript-eslint/utils@5.62.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.62.0.tgz#141e809c71636e4a75daa39faed2fb5f4b10df86" + integrity sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ== + dependencies: + "@eslint-community/eslint-utils" "^4.2.0" + "@types/json-schema" "^7.0.9" + "@types/semver" "^7.3.12" + "@typescript-eslint/scope-manager" "5.62.0" + "@typescript-eslint/types" "5.62.0" + "@typescript-eslint/typescript-estree" "5.62.0" + eslint-scope "^5.1.1" + semver "^7.3.7" + +"@typescript-eslint/utils@8.25.0": + version "8.25.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-8.25.0.tgz#3ea2f9196a915ef4daa2c8eafd44adbd7d56d08a" + integrity sha512-syqRbrEv0J1wywiLsK60XzHnQe/kRViI3zwFALrNEgnntn1l24Ra2KvOAWwWbWZ1lBZxZljPDGOq967dsl6fkA== + dependencies: + "@eslint-community/eslint-utils" "^4.4.0" + "@typescript-eslint/scope-manager" "8.25.0" + "@typescript-eslint/types" "8.25.0" + "@typescript-eslint/typescript-estree" "8.25.0" + +"@typescript-eslint/visitor-keys@5.62.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz#2174011917ce582875954ffe2f6912d5931e353e" + integrity sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw== + dependencies: + "@typescript-eslint/types" "5.62.0" + eslint-visitor-keys "^3.3.0" + +"@typescript-eslint/visitor-keys@8.25.0": + version "8.25.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-8.25.0.tgz#e8646324cd1793f96e02669cb717a05319403164" + integrity sha512-kCYXKAum9CecGVHGij7muybDfTS2sD3t0L4bJsEZLkyrXUImiCTq1M3LG2SRtOhiHFwMR9wAFplpT6XHYjTkwQ== + dependencies: + "@typescript-eslint/types" "8.25.0" + eslint-visitor-keys "^4.2.0" + +"@ungap/structured-clone@^1.0.0": + version "1.3.0" + resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.3.0.tgz#d06bbb384ebcf6c505fde1c3d0ed4ddffe0aaff8" + integrity sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g== + +"@vscode/codicons@0.0.20": + version "0.0.20" + resolved "https://registry.yarnpkg.com/@vscode/codicons/-/codicons-0.0.20.tgz#8f52b8caf3b89fbb66bb3cd856c723e7696d5a46" + integrity sha512-LlO6K7nzrIWDCZN1Zi6J6ibxrpMibSAct+zNjAwpkNkwup6cJLx5diYvsOJODMPWOuQlBO21qkxtdkSRzW6+Jw== + +"@vscode/webview-ui-toolkit@^1.4.0": + version "1.4.0" + resolved "https://registry.yarnpkg.com/@vscode/webview-ui-toolkit/-/webview-ui-toolkit-1.4.0.tgz#abbd5b2f8a08eee6cfb68d47a83778424f926715" + integrity sha512-modXVHQkZLsxgmd5yoP3ptRC/G8NBDD+ob+ngPiWNQdlrH6H1xR/qgOBD85bfU3BhOB5sZzFWBwwhp9/SfoHww== + dependencies: + "@microsoft/fast-element" "^1.12.0" + "@microsoft/fast-foundation" "^2.49.4" + "@microsoft/fast-react-wrapper" "^0.3.22" + tslib "^2.6.2" + +acorn-jsx@^5.3.2: + version "5.3.2" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" + integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== + +acorn@^8.14.0: + version "8.14.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.14.0.tgz#063e2c70cac5fb4f6467f0b11152e04c682795b0" + integrity sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA== + +ajv@^6.12.4: + version "6.12.6" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" + integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== + dependencies: + fast-deep-equal "^3.1.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + +ansi-regex@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" + integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== + +ansi-regex@^6.0.1: + version "6.1.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.1.0.tgz#95ec409c69619d6cb1b8b34f14b660ef28ebd654" + integrity sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA== + +ansi-styles@^4.0.0, ansi-styles@^4.1.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + +ansi-styles@^6.1.0: + version "6.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.1.tgz#0e62320cf99c21afff3b3012192546aacbfb05c5" + integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== + +antd@^5.22.1: + version "5.24.1" + resolved "https://registry.yarnpkg.com/antd/-/antd-5.24.1.tgz#ec59c4e91c90cec4d1f74f5c3ea4e73bcf2ce7a8" + integrity sha512-RGwpXpSr2RtoUnrpJl3V6ZaTExwSXkFVxV24VUowwC04n6oA1sGyJrofQOKNqD623sVxL5UJBmf0a+BFBImP3Q== + dependencies: + "@ant-design/colors" "^7.2.0" + "@ant-design/cssinjs" "^1.23.0" + "@ant-design/cssinjs-utils" "^1.1.3" + "@ant-design/fast-color" "^2.0.6" + "@ant-design/icons" "^5.6.1" + "@ant-design/react-slick" "~1.1.2" + "@babel/runtime" "^7.26.0" + "@rc-component/color-picker" "~2.0.1" + "@rc-component/mutate-observer" "^1.1.0" + "@rc-component/qrcode" "~1.0.0" + "@rc-component/tour" "~1.15.1" + "@rc-component/trigger" "^2.2.6" + classnames "^2.5.1" + copy-to-clipboard "^3.3.3" + dayjs "^1.11.11" + rc-cascader "~3.33.0" + rc-checkbox "~3.5.0" + rc-collapse "~3.9.0" + rc-dialog "~9.6.0" + rc-drawer "~7.2.0" + rc-dropdown "~4.2.1" + rc-field-form "~2.7.0" + rc-image "~7.11.0" + rc-input "~1.7.2" + rc-input-number "~9.4.0" + rc-mentions "~2.19.1" + rc-menu "~9.16.0" + rc-motion "^2.9.5" + rc-notification "~5.6.3" + rc-pagination "~5.1.0" + rc-picker "~4.11.1" + rc-progress "~4.0.0" + rc-rate "~2.13.1" + rc-resize-observer "^1.4.3" + rc-segmented "~2.7.0" + rc-select "~14.16.6" + rc-slider "~11.1.8" + rc-steps "~6.0.1" + rc-switch "~4.1.0" + rc-table "~7.50.3" + rc-tabs "~15.5.1" + rc-textarea "~1.9.0" + rc-tooltip "~6.4.0" + rc-tree "~5.13.0" + rc-tree-select "~5.27.0" + rc-upload "~4.8.1" + rc-util "^5.44.4" + scroll-into-view-if-needed "^3.1.0" + throttle-debounce "^5.0.2" + +argparse@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" + integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== + +array-union@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" + integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== + +bail@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/bail/-/bail-2.0.2.tgz#d26f5cd8fe5d6f832a31517b9f7c356040ba6d5d" + integrity sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw== + +balanced-match@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +brace-expansion@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" + integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== + dependencies: + balanced-match "^1.0.0" + +braces@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789" + integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== + dependencies: + fill-range "^7.1.1" + +callsites@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" + integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== + +ccount@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/ccount/-/ccount-2.0.1.tgz#17a3bf82302e0870d6da43a01311a8bc02a3ecf5" + integrity sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg== + +chalk@^4.0.0: + version "4.1.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +character-entities-html4@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/character-entities-html4/-/character-entities-html4-2.1.0.tgz#1f1adb940c971a4b22ba39ddca6b618dc6e56b2b" + integrity sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA== + +character-entities-legacy@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz#76bc83a90738901d7bc223a9e93759fdd560125b" + integrity sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ== + +character-entities@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/character-entities/-/character-entities-2.0.2.tgz#2d09c2e72cd9523076ccb21157dff66ad43fcc22" + integrity sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ== + +character-reference-invalid@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz#85c66b041e43b47210faf401278abf808ac45cb9" + integrity sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw== + +classnames@2.x, classnames@^2.2.1, classnames@^2.2.3, classnames@^2.2.5, classnames@^2.2.6, classnames@^2.3.1, classnames@^2.3.2, classnames@^2.5.1: + version "2.5.1" + resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.5.1.tgz#ba774c614be0f016da105c858e7159eae8e7687b" + integrity sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow== + +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + +color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +comma-separated-tokens@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz#4e89c9458acb61bc8fef19f4529973b2392839ee" + integrity sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg== + +compute-scroll-into-view@^3.0.2: + version "3.1.1" + resolved "https://registry.yarnpkg.com/compute-scroll-into-view/-/compute-scroll-into-view-3.1.1.tgz#02c3386ec531fb6a9881967388e53e8564f3e9aa" + integrity sha512-VRhuHOLoKYOy4UbilLbUzbYg93XLjv2PncJC50EuTWPA3gaja1UjBsUP/D/9/juV3vQFr6XBEzn9KCAHdUvOHw== + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== + +copy-to-clipboard@^3.3.3: + version "3.3.3" + resolved "https://registry.yarnpkg.com/copy-to-clipboard/-/copy-to-clipboard-3.3.3.tgz#55ac43a1db8ae639a4bd99511c148cdd1b83a1b0" + integrity sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA== + dependencies: + toggle-selection "^1.0.6" + +cross-spawn@^7.0.6: + version "7.0.6" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.6.tgz#8a58fe78f00dcd70c370451759dfbfaf03e8ee9f" + integrity sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + +csstype@^3.0.2, csstype@^3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.3.tgz#d80ff294d114fb0e6ac500fbf85b60137d7eff81" + integrity sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw== + +dayjs@^1.11.11: + version "1.11.13" + resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.11.13.tgz#92430b0139055c3ebb60150aa13e860a4b5a366c" + integrity sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg== + +debug@^4.0.0, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4: + version "4.4.0" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.0.tgz#2b3f2aea2ffeb776477460267377dc8710faba8a" + integrity sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA== + dependencies: + ms "^2.1.3" + +decode-named-character-reference@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/decode-named-character-reference/-/decode-named-character-reference-1.0.2.tgz#daabac9690874c394c81e4162a0304b35d824f0e" + integrity sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg== + dependencies: + character-entities "^2.0.0" + +deep-is@^0.1.3: + version "0.1.4" + resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" + integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== + +dequal@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/dequal/-/dequal-2.0.3.tgz#2644214f1997d39ed0ee0ece72335490a7ac67be" + integrity sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA== + +devlop@^1.0.0, devlop@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/devlop/-/devlop-1.1.0.tgz#4db7c2ca4dc6e0e834c30be70c94bbc976dc7018" + integrity sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA== + dependencies: + dequal "^2.0.0" + +dir-glob@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" + integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== + dependencies: + path-type "^4.0.0" + +eastasianwidth@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb" + integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== + +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + +emoji-regex@^9.2.2: + version "9.2.2" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" + integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== + +escape-string-regexp@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" + integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== + +escape-string-regexp@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz#4683126b500b61762f2dbebace1806e8be31b1c8" + integrity sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw== + +eslint-scope@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" + integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== + dependencies: + esrecurse "^4.3.0" + estraverse "^4.1.1" + +eslint-scope@^8.2.0: + version "8.2.0" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-8.2.0.tgz#377aa6f1cb5dc7592cfd0b7f892fd0cf352ce442" + integrity sha512-PHlWUfG6lvPc3yvP5A4PNyBL1W8fkDUccmI21JUu/+GKZBoH/W5u6usENXUrWFRsyoW5ACUjFGgAFQp5gUlb/A== + dependencies: + esrecurse "^4.3.0" + estraverse "^5.2.0" + +eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.3: + version "3.4.3" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800" + integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== + +eslint-visitor-keys@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz#687bacb2af884fcdda8a6e7d65c606f46a14cd45" + integrity sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw== + +eslint@^9.21.0: + version "9.21.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-9.21.0.tgz#b1c9c16f5153ff219791f627b94ab8f11f811591" + integrity sha512-KjeihdFqTPhOMXTt7StsDxriV4n66ueuF/jfPNC3j/lduHwr/ijDwJMsF+wyMJethgiKi5wniIE243vi07d3pg== + dependencies: + "@eslint-community/eslint-utils" "^4.2.0" + "@eslint-community/regexpp" "^4.12.1" + "@eslint/config-array" "^0.19.2" + "@eslint/core" "^0.12.0" + "@eslint/eslintrc" "^3.3.0" + "@eslint/js" "9.21.0" + "@eslint/plugin-kit" "^0.2.7" + "@humanfs/node" "^0.16.6" + "@humanwhocodes/module-importer" "^1.0.1" + "@humanwhocodes/retry" "^0.4.2" + "@types/estree" "^1.0.6" + "@types/json-schema" "^7.0.15" + ajv "^6.12.4" + chalk "^4.0.0" + cross-spawn "^7.0.6" + debug "^4.3.2" + escape-string-regexp "^4.0.0" + eslint-scope "^8.2.0" + eslint-visitor-keys "^4.2.0" + espree "^10.3.0" + esquery "^1.5.0" + esutils "^2.0.2" + fast-deep-equal "^3.1.3" + file-entry-cache "^8.0.0" + find-up "^5.0.0" + glob-parent "^6.0.2" + ignore "^5.2.0" + imurmurhash "^0.1.4" + is-glob "^4.0.0" + json-stable-stringify-without-jsonify "^1.0.1" + lodash.merge "^4.6.2" + minimatch "^3.1.2" + natural-compare "^1.4.0" + optionator "^0.9.3" + +espree@^10.0.1, espree@^10.3.0: + version "10.3.0" + resolved "https://registry.yarnpkg.com/espree/-/espree-10.3.0.tgz#29267cf5b0cb98735b65e64ba07e0ed49d1eed8a" + integrity sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg== + dependencies: + acorn "^8.14.0" + acorn-jsx "^5.3.2" + eslint-visitor-keys "^4.2.0" + +esquery@^1.5.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.6.0.tgz#91419234f804d852a82dceec3e16cdc22cf9dae7" + integrity sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg== + dependencies: + estraverse "^5.1.0" + +esrecurse@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" + integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== + dependencies: + estraverse "^5.2.0" + +estraverse@^4.1.1: + version "4.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" + integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== + +estraverse@^5.1.0, estraverse@^5.2.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" + integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== + +estree-util-is-identifier-name@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/estree-util-is-identifier-name/-/estree-util-is-identifier-name-3.0.0.tgz#0b5ef4c4ff13508b34dcd01ecfa945f61fce5dbd" + integrity sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg== + +esutils@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" + integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== + +exenv-es6@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/exenv-es6/-/exenv-es6-1.1.1.tgz#80b7a8c5af24d53331f755bac07e84abb1f6de67" + integrity sha512-vlVu3N8d6yEMpMsEm+7sUBAI81aqYYuEvfK0jNqmdb/OPXzzH7QWDDnVjMvDSY47JdHEqx/dfC/q8WkfoTmpGQ== + +extend@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" + integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== + +fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" + integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== + +fast-glob@^3.2.9, fast-glob@^3.3.2: + version "3.3.3" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.3.tgz#d06d585ce8dba90a16b0505c543c3ccfb3aeb818" + integrity sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg== + dependencies: + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.2" + merge2 "^1.3.0" + micromatch "^4.0.8" + +fast-json-stable-stringify@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" + integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== + +fast-levenshtein@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== + +fastq@^1.6.0: + version "1.19.0" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.19.0.tgz#a82c6b7c2bb4e44766d865f07997785fecfdcb89" + integrity sha512-7SFSRCNjBQIZH/xZR3iy5iQYR8aGBE0h3VG6/cwlbrpdciNYBMotQav8c1XI3HjHH+NikUpP53nPdlZSdWmFzA== + dependencies: + reusify "^1.0.4" + +file-entry-cache@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-8.0.0.tgz#7787bddcf1131bffb92636c69457bbc0edd6d81f" + integrity sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ== + dependencies: + flat-cache "^4.0.0" + +fill-range@^7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.1.1.tgz#44265d3cac07e3ea7dc247516380643754a05292" + integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg== + dependencies: + to-regex-range "^5.0.1" + +find-up@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" + integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== + dependencies: + locate-path "^6.0.0" + path-exists "^4.0.0" + +flat-cache@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-4.0.1.tgz#0ece39fcb14ee012f4b0410bd33dd9c1f011127c" + integrity sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw== + dependencies: + flatted "^3.2.9" + keyv "^4.5.4" + +flatted@^3.2.9: + version "3.3.3" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.3.3.tgz#67c8fad95454a7c7abebf74bb78ee74a44023358" + integrity sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg== + +foreground-child@^3.1.0: + version "3.3.1" + resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-3.3.1.tgz#32e8e9ed1b68a3497befb9ac2b6adf92a638576f" + integrity sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw== + dependencies: + cross-spawn "^7.0.6" + signal-exit "^4.0.1" + +glob-parent@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + dependencies: + is-glob "^4.0.1" + +glob-parent@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" + integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== + dependencies: + is-glob "^4.0.3" + +glob@^11.0.0: + version "11.0.1" + resolved "https://registry.yarnpkg.com/glob/-/glob-11.0.1.tgz#1c3aef9a59d680e611b53dcd24bb8639cef064d9" + integrity sha512-zrQDm8XPnYEKawJScsnM0QzobJxlT/kHOOlRTio8IH/GrmxRE5fjllkzdaHclIuNjUQTJYH2xHNIGfdpJkDJUw== + dependencies: + foreground-child "^3.1.0" + jackspeak "^4.0.1" + minimatch "^10.0.0" + minipass "^7.1.2" + package-json-from-dist "^1.0.0" + path-scurry "^2.0.0" + +globals@^14.0.0: + version "14.0.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-14.0.0.tgz#898d7413c29babcf6bafe56fcadded858ada724e" + integrity sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ== + +globals@^16.0.0: + version "16.0.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-16.0.0.tgz#3d7684652c5c4fbd086ec82f9448214da49382d8" + integrity sha512-iInW14XItCXET01CQFqudPOWP2jYMl7T+QRQT+UNcR/iQncN/F0UNpgd76iFkBPgNQb4+X3LV9tLJYzwh+Gl3A== + +globby@^11.1.0: + version "11.1.0" + resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" + integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== + dependencies: + array-union "^2.1.0" + dir-glob "^3.0.1" + fast-glob "^3.2.9" + ignore "^5.2.0" + merge2 "^1.4.1" + slash "^3.0.0" + +graphemer@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/graphemer/-/graphemer-1.4.0.tgz#fb2f1d55e0e3a1849aeffc90c4fa0dd53a0e66c6" + integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== + +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + +hast-util-to-jsx-runtime@^2.0.0: + version "2.3.2" + resolved "https://registry.yarnpkg.com/hast-util-to-jsx-runtime/-/hast-util-to-jsx-runtime-2.3.2.tgz#6d11b027473e69adeaa00ca4cfb5bb68e3d282fa" + integrity sha512-1ngXYb+V9UT5h+PxNRa1O1FYguZK/XL+gkeqvp7EdHlB9oHUG0eYRo/vY5inBdcqo3RkPMC58/H94HvkbfGdyg== + dependencies: + "@types/estree" "^1.0.0" + "@types/hast" "^3.0.0" + "@types/unist" "^3.0.0" + comma-separated-tokens "^2.0.0" + devlop "^1.0.0" + estree-util-is-identifier-name "^3.0.0" + hast-util-whitespace "^3.0.0" + mdast-util-mdx-expression "^2.0.0" + mdast-util-mdx-jsx "^3.0.0" + mdast-util-mdxjs-esm "^2.0.0" + property-information "^6.0.0" + space-separated-tokens "^2.0.0" + style-to-object "^1.0.0" + unist-util-position "^5.0.0" + vfile-message "^4.0.0" + +hast-util-whitespace@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz#7778ed9d3c92dd9e8c5c8f648a49c21fc51cb621" + integrity sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw== + dependencies: + "@types/hast" "^3.0.0" + +html-url-attributes@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/html-url-attributes/-/html-url-attributes-3.0.1.tgz#83b052cd5e437071b756cd74ae70f708870c2d87" + integrity sha512-ol6UPyBWqsrO6EJySPz2O7ZSr856WDrEzM5zMqp+FJJLGMW35cLYmmZnl0vztAZxRUoNZJFTCohfjuIJ8I4QBQ== + +ignore@^5.2.0, ignore@^5.3.1: + version "5.3.2" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.2.tgz#3cd40e729f3643fd87cb04e50bf0eb722bc596f5" + integrity sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g== + +import-fresh@^3.2.1: + version "3.3.1" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.1.tgz#9cecb56503c0ada1f2741dbbd6546e4b13b57ccf" + integrity sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ== + dependencies: + parent-module "^1.0.0" + resolve-from "^4.0.0" + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== + +inline-style-parser@0.2.4: + version "0.2.4" + resolved "https://registry.yarnpkg.com/inline-style-parser/-/inline-style-parser-0.2.4.tgz#f4af5fe72e612839fcd453d989a586566d695f22" + integrity sha512-0aO8FkhNZlj/ZIbNi7Lxxr12obT7cL1moPfE4tg1LkX7LlLfC6DeX4l2ZEud1ukP9jNQyNnfzQVqwbwmAATY4Q== + +is-alphabetical@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-alphabetical/-/is-alphabetical-2.0.1.tgz#01072053ea7c1036df3c7d19a6daaec7f19e789b" + integrity sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ== + +is-alphanumerical@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz#7c03fbe96e3e931113e57f964b0a368cc2dfd875" + integrity sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw== + dependencies: + is-alphabetical "^2.0.0" + is-decimal "^2.0.0" + +is-decimal@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-decimal/-/is-decimal-2.0.1.tgz#9469d2dc190d0214fd87d78b78caecc0cc14eef7" + integrity sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A== + +is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== + +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== + +is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" + integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== + dependencies: + is-extglob "^2.1.1" + +is-hexadecimal@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz#86b5bf668fca307498d319dfc03289d781a90027" + integrity sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg== + +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + +is-plain-obj@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-4.1.0.tgz#d65025edec3657ce032fd7db63c97883eaed71f0" + integrity sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg== + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== + +jackspeak@^4.0.1: + version "4.1.0" + resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-4.1.0.tgz#c489c079f2b636dc4cbe9b0312a13ff1282e561b" + integrity sha512-9DDdhb5j6cpeitCbvLO7n7J4IxnbM6hoF6O1g4HQ5TfhvvKN8ywDM7668ZhMHRqVmxqhps/F6syWK2KcPxYlkw== + dependencies: + "@isaacs/cliui" "^8.0.2" + +"js-tokens@^3.0.0 || ^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + +js-yaml@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" + integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== + dependencies: + argparse "^2.0.1" + +json-buffer@3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" + integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== + +json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== + +json-stable-stringify-without-jsonify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" + integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== + +json2mq@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/json2mq/-/json2mq-0.2.0.tgz#b637bd3ba9eabe122c83e9720483aeb10d2c904a" + integrity sha512-SzoRg7ux5DWTII9J2qkrZrqV1gt+rTaoufMxEzXbS26Uid0NwaJd123HcoB80TgubEppxxIGdNxCx50fEoEWQA== + dependencies: + string-convert "^0.2.0" + +keyv@^4.5.4: + version "4.5.4" + resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93" + integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw== + dependencies: + json-buffer "3.0.1" + +levn@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" + integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== + dependencies: + prelude-ls "^1.2.1" + type-check "~0.4.0" + +locate-path@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" + integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== + dependencies: + p-locate "^5.0.0" + +lodash.merge@^4.6.2: + version "4.6.2" + resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" + integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== + +longest-streak@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/longest-streak/-/longest-streak-3.1.0.tgz#62fa67cd958742a1574af9f39866364102d90cd4" + integrity sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g== + +loose-envify@^1.1.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" + integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== + dependencies: + js-tokens "^3.0.0 || ^4.0.0" + +lru-cache@^11.0.0: + version "11.0.2" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-11.0.2.tgz#fbd8e7cf8211f5e7e5d91905c415a3f55755ca39" + integrity sha512-123qHRfJBmo2jXDbo/a5YOQrJoHF/GNQTLzQ5+IdK5pWpceK17yRc6ozlWd25FxvGKQbIUs91fDFkXmDHTKcyA== + +markdown-table@^3.0.0: + version "3.0.4" + resolved "https://registry.yarnpkg.com/markdown-table/-/markdown-table-3.0.4.tgz#fe44d6d410ff9d6f2ea1797a3f60aa4d2b631c2a" + integrity sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw== + +mdast-util-find-and-replace@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/mdast-util-find-and-replace/-/mdast-util-find-and-replace-3.0.2.tgz#70a3174c894e14df722abf43bc250cbae44b11df" + integrity sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg== + dependencies: + "@types/mdast" "^4.0.0" + escape-string-regexp "^5.0.0" + unist-util-is "^6.0.0" + unist-util-visit-parents "^6.0.0" + +mdast-util-from-markdown@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.2.tgz#4850390ca7cf17413a9b9a0fbefcd1bc0eb4160a" + integrity sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA== + dependencies: + "@types/mdast" "^4.0.0" + "@types/unist" "^3.0.0" + decode-named-character-reference "^1.0.0" + devlop "^1.0.0" + mdast-util-to-string "^4.0.0" + micromark "^4.0.0" + micromark-util-decode-numeric-character-reference "^2.0.0" + micromark-util-decode-string "^2.0.0" + micromark-util-normalize-identifier "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + unist-util-stringify-position "^4.0.0" + +mdast-util-gfm-autolink-literal@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-2.0.1.tgz#abd557630337bd30a6d5a4bd8252e1c2dc0875d5" + integrity sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ== + dependencies: + "@types/mdast" "^4.0.0" + ccount "^2.0.0" + devlop "^1.0.0" + mdast-util-find-and-replace "^3.0.0" + micromark-util-character "^2.0.0" + +mdast-util-gfm-footnote@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-2.1.0.tgz#7778e9d9ca3df7238cc2bd3fa2b1bf6a65b19403" + integrity sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ== + dependencies: + "@types/mdast" "^4.0.0" + devlop "^1.1.0" + mdast-util-from-markdown "^2.0.0" + mdast-util-to-markdown "^2.0.0" + micromark-util-normalize-identifier "^2.0.0" + +mdast-util-gfm-strikethrough@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-2.0.0.tgz#d44ef9e8ed283ac8c1165ab0d0dfd058c2764c16" + integrity sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg== + dependencies: + "@types/mdast" "^4.0.0" + mdast-util-from-markdown "^2.0.0" + mdast-util-to-markdown "^2.0.0" + +mdast-util-gfm-table@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/mdast-util-gfm-table/-/mdast-util-gfm-table-2.0.0.tgz#7a435fb6223a72b0862b33afbd712b6dae878d38" + integrity sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg== + dependencies: + "@types/mdast" "^4.0.0" + devlop "^1.0.0" + markdown-table "^3.0.0" + mdast-util-from-markdown "^2.0.0" + mdast-util-to-markdown "^2.0.0" + +mdast-util-gfm-task-list-item@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-2.0.0.tgz#e68095d2f8a4303ef24094ab642e1047b991a936" + integrity sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ== + dependencies: + "@types/mdast" "^4.0.0" + devlop "^1.0.0" + mdast-util-from-markdown "^2.0.0" + mdast-util-to-markdown "^2.0.0" + +mdast-util-gfm@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/mdast-util-gfm/-/mdast-util-gfm-3.1.0.tgz#2cdf63b92c2a331406b0fb0db4c077c1b0331751" + integrity sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ== + dependencies: + mdast-util-from-markdown "^2.0.0" + mdast-util-gfm-autolink-literal "^2.0.0" + mdast-util-gfm-footnote "^2.0.0" + mdast-util-gfm-strikethrough "^2.0.0" + mdast-util-gfm-table "^2.0.0" + mdast-util-gfm-task-list-item "^2.0.0" + mdast-util-to-markdown "^2.0.0" + +mdast-util-mdx-expression@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/mdast-util-mdx-expression/-/mdast-util-mdx-expression-2.0.1.tgz#43f0abac9adc756e2086f63822a38c8d3c3a5096" + integrity sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ== + dependencies: + "@types/estree-jsx" "^1.0.0" + "@types/hast" "^3.0.0" + "@types/mdast" "^4.0.0" + devlop "^1.0.0" + mdast-util-from-markdown "^2.0.0" + mdast-util-to-markdown "^2.0.0" + +mdast-util-mdx-jsx@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-3.2.0.tgz#fd04c67a2a7499efb905a8a5c578dddc9fdada0d" + integrity sha512-lj/z8v0r6ZtsN/cGNNtemmmfoLAFZnjMbNyLzBafjzikOM+glrjNHPlf6lQDOTccj9n5b0PPihEBbhneMyGs1Q== + dependencies: + "@types/estree-jsx" "^1.0.0" + "@types/hast" "^3.0.0" + "@types/mdast" "^4.0.0" + "@types/unist" "^3.0.0" + ccount "^2.0.0" + devlop "^1.1.0" + mdast-util-from-markdown "^2.0.0" + mdast-util-to-markdown "^2.0.0" + parse-entities "^4.0.0" + stringify-entities "^4.0.0" + unist-util-stringify-position "^4.0.0" + vfile-message "^4.0.0" + +mdast-util-mdxjs-esm@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/mdast-util-mdxjs-esm/-/mdast-util-mdxjs-esm-2.0.1.tgz#019cfbe757ad62dd557db35a695e7314bcc9fa97" + integrity sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg== + dependencies: + "@types/estree-jsx" "^1.0.0" + "@types/hast" "^3.0.0" + "@types/mdast" "^4.0.0" + devlop "^1.0.0" + mdast-util-from-markdown "^2.0.0" + mdast-util-to-markdown "^2.0.0" + +mdast-util-phrasing@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/mdast-util-phrasing/-/mdast-util-phrasing-4.1.0.tgz#7cc0a8dec30eaf04b7b1a9661a92adb3382aa6e3" + integrity sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w== + dependencies: + "@types/mdast" "^4.0.0" + unist-util-is "^6.0.0" + +mdast-util-to-hast@^13.0.0: + version "13.2.0" + resolved "https://registry.yarnpkg.com/mdast-util-to-hast/-/mdast-util-to-hast-13.2.0.tgz#5ca58e5b921cc0a3ded1bc02eed79a4fe4fe41f4" + integrity sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA== + dependencies: + "@types/hast" "^3.0.0" + "@types/mdast" "^4.0.0" + "@ungap/structured-clone" "^1.0.0" + devlop "^1.0.0" + micromark-util-sanitize-uri "^2.0.0" + trim-lines "^3.0.0" + unist-util-position "^5.0.0" + unist-util-visit "^5.0.0" + vfile "^6.0.0" + +mdast-util-to-markdown@^2.0.0: + version "2.1.2" + resolved "https://registry.yarnpkg.com/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.2.tgz#f910ffe60897f04bb4b7e7ee434486f76288361b" + integrity sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA== + dependencies: + "@types/mdast" "^4.0.0" + "@types/unist" "^3.0.0" + longest-streak "^3.0.0" + mdast-util-phrasing "^4.0.0" + mdast-util-to-string "^4.0.0" + micromark-util-classify-character "^2.0.0" + micromark-util-decode-string "^2.0.0" + unist-util-visit "^5.0.0" + zwitch "^2.0.0" + +mdast-util-to-string@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz#7a5121475556a04e7eddeb67b264aae79d312814" + integrity sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg== + dependencies: + "@types/mdast" "^4.0.0" + +merge2@^1.3.0, merge2@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" + integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== + +micromark-core-commonmark@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/micromark-core-commonmark/-/micromark-core-commonmark-2.0.2.tgz#6a45bbb139e126b3f8b361a10711ccc7c6e15e93" + integrity sha512-FKjQKbxd1cibWMM1P9N+H8TwlgGgSkWZMmfuVucLCHaYqeSvJ0hFeHsIa65pA2nYbes0f8LDHPMrd9X7Ujxg9w== + dependencies: + decode-named-character-reference "^1.0.0" + devlop "^1.0.0" + micromark-factory-destination "^2.0.0" + micromark-factory-label "^2.0.0" + micromark-factory-space "^2.0.0" + micromark-factory-title "^2.0.0" + micromark-factory-whitespace "^2.0.0" + micromark-util-character "^2.0.0" + micromark-util-chunked "^2.0.0" + micromark-util-classify-character "^2.0.0" + micromark-util-html-tag-name "^2.0.0" + micromark-util-normalize-identifier "^2.0.0" + micromark-util-resolve-all "^2.0.0" + micromark-util-subtokenize "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-extension-gfm-autolink-literal@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-2.1.0.tgz#6286aee9686c4462c1e3552a9d505feddceeb935" + integrity sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw== + dependencies: + micromark-util-character "^2.0.0" + micromark-util-sanitize-uri "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-extension-gfm-footnote@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-2.1.0.tgz#4dab56d4e398b9853f6fe4efac4fc9361f3e0750" + integrity sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw== + dependencies: + devlop "^1.0.0" + micromark-core-commonmark "^2.0.0" + micromark-factory-space "^2.0.0" + micromark-util-character "^2.0.0" + micromark-util-normalize-identifier "^2.0.0" + micromark-util-sanitize-uri "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-extension-gfm-strikethrough@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-2.1.0.tgz#86106df8b3a692b5f6a92280d3879be6be46d923" + integrity sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw== + dependencies: + devlop "^1.0.0" + micromark-util-chunked "^2.0.0" + micromark-util-classify-character "^2.0.0" + micromark-util-resolve-all "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-extension-gfm-table@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/micromark-extension-gfm-table/-/micromark-extension-gfm-table-2.1.1.tgz#fac70bcbf51fe65f5f44033118d39be8a9b5940b" + integrity sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg== + dependencies: + devlop "^1.0.0" + micromark-factory-space "^2.0.0" + micromark-util-character "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-extension-gfm-tagfilter@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-2.0.0.tgz#f26d8a7807b5985fba13cf61465b58ca5ff7dc57" + integrity sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg== + dependencies: + micromark-util-types "^2.0.0" + +micromark-extension-gfm-task-list-item@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-2.1.0.tgz#bcc34d805639829990ec175c3eea12bb5b781f2c" + integrity sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw== + dependencies: + devlop "^1.0.0" + micromark-factory-space "^2.0.0" + micromark-util-character "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-extension-gfm@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/micromark-extension-gfm/-/micromark-extension-gfm-3.0.0.tgz#3e13376ab95dd7a5cfd0e29560dfe999657b3c5b" + integrity sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w== + dependencies: + micromark-extension-gfm-autolink-literal "^2.0.0" + micromark-extension-gfm-footnote "^2.0.0" + micromark-extension-gfm-strikethrough "^2.0.0" + micromark-extension-gfm-table "^2.0.0" + micromark-extension-gfm-tagfilter "^2.0.0" + micromark-extension-gfm-task-list-item "^2.0.0" + micromark-util-combine-extensions "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-factory-destination@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/micromark-factory-destination/-/micromark-factory-destination-2.0.1.tgz#8fef8e0f7081f0474fbdd92deb50c990a0264639" + integrity sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA== + dependencies: + micromark-util-character "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-factory-label@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/micromark-factory-label/-/micromark-factory-label-2.0.1.tgz#5267efa97f1e5254efc7f20b459a38cb21058ba1" + integrity sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg== + dependencies: + devlop "^1.0.0" + micromark-util-character "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-factory-space@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz#36d0212e962b2b3121f8525fc7a3c7c029f334fc" + integrity sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg== + dependencies: + micromark-util-character "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-factory-title@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/micromark-factory-title/-/micromark-factory-title-2.0.1.tgz#237e4aa5d58a95863f01032d9ee9b090f1de6e94" + integrity sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw== + dependencies: + micromark-factory-space "^2.0.0" + micromark-util-character "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-factory-whitespace@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.1.tgz#06b26b2983c4d27bfcc657b33e25134d4868b0b1" + integrity sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ== + dependencies: + micromark-factory-space "^2.0.0" + micromark-util-character "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-util-character@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/micromark-util-character/-/micromark-util-character-2.1.1.tgz#2f987831a40d4c510ac261e89852c4e9703ccda6" + integrity sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q== + dependencies: + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-util-chunked@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/micromark-util-chunked/-/micromark-util-chunked-2.0.1.tgz#47fbcd93471a3fccab86cff03847fc3552db1051" + integrity sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA== + dependencies: + micromark-util-symbol "^2.0.0" + +micromark-util-classify-character@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/micromark-util-classify-character/-/micromark-util-classify-character-2.0.1.tgz#d399faf9c45ca14c8b4be98b1ea481bced87b629" + integrity sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q== + dependencies: + micromark-util-character "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-util-combine-extensions@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.1.tgz#2a0f490ab08bff5cc2fd5eec6dd0ca04f89b30a9" + integrity sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg== + dependencies: + micromark-util-chunked "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-util-decode-numeric-character-reference@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.2.tgz#fcf15b660979388e6f118cdb6bf7d79d73d26fe5" + integrity sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw== + dependencies: + micromark-util-symbol "^2.0.0" + +micromark-util-decode-string@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/micromark-util-decode-string/-/micromark-util-decode-string-2.0.1.tgz#6cb99582e5d271e84efca8e61a807994d7161eb2" + integrity sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ== + dependencies: + decode-named-character-reference "^1.0.0" + micromark-util-character "^2.0.0" + micromark-util-decode-numeric-character-reference "^2.0.0" + micromark-util-symbol "^2.0.0" + +micromark-util-encode@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz#0d51d1c095551cfaac368326963cf55f15f540b8" + integrity sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw== + +micromark-util-html-tag-name@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.1.tgz#e40403096481986b41c106627f98f72d4d10b825" + integrity sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA== + +micromark-util-normalize-identifier@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.1.tgz#c30d77b2e832acf6526f8bf1aa47bc9c9438c16d" + integrity sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q== + dependencies: + micromark-util-symbol "^2.0.0" + +micromark-util-resolve-all@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.1.tgz#e1a2d62cdd237230a2ae11839027b19381e31e8b" + integrity sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg== + dependencies: + micromark-util-types "^2.0.0" + +micromark-util-sanitize-uri@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz#ab89789b818a58752b73d6b55238621b7faa8fd7" + integrity sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ== + dependencies: + micromark-util-character "^2.0.0" + micromark-util-encode "^2.0.0" + micromark-util-symbol "^2.0.0" + +micromark-util-subtokenize@^2.0.0: + version "2.0.4" + resolved "https://registry.yarnpkg.com/micromark-util-subtokenize/-/micromark-util-subtokenize-2.0.4.tgz#50d8ca981373c717f497dc64a0dbfccce6c03ed2" + integrity sha512-N6hXjrin2GTJDe3MVjf5FuXpm12PGm80BrUAeub9XFXca8JZbP+oIwY4LJSVwFUCL1IPm/WwSVUN7goFHmSGGQ== + dependencies: + devlop "^1.0.0" + micromark-util-chunked "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-util-symbol@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz#e5da494e8eb2b071a0d08fb34f6cefec6c0a19b8" + integrity sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q== + +micromark-util-types@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/micromark-util-types/-/micromark-util-types-2.0.1.tgz#a3edfda3022c6c6b55bfb049ef5b75d70af50709" + integrity sha512-534m2WhVTddrcKVepwmVEVnUAmtrx9bfIjNoQHRqfnvdaHQiFytEhJoTgpWJvDEXCO5gLTQh3wYC1PgOJA4NSQ== + +micromark@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/micromark/-/micromark-4.0.1.tgz#294c2f12364759e5f9e925a767ae3dfde72223ff" + integrity sha512-eBPdkcoCNvYcxQOAKAlceo5SNdzZWfF+FcSupREAzdAh9rRmE239CEQAiTwIgblwnoM8zzj35sZ5ZwvSEOF6Kw== + dependencies: + "@types/debug" "^4.0.0" + debug "^4.0.0" + decode-named-character-reference "^1.0.0" + devlop "^1.0.0" + micromark-core-commonmark "^2.0.0" + micromark-factory-space "^2.0.0" + micromark-util-character "^2.0.0" + micromark-util-chunked "^2.0.0" + micromark-util-combine-extensions "^2.0.0" + micromark-util-decode-numeric-character-reference "^2.0.0" + micromark-util-encode "^2.0.0" + micromark-util-normalize-identifier "^2.0.0" + micromark-util-resolve-all "^2.0.0" + micromark-util-sanitize-uri "^2.0.0" + micromark-util-subtokenize "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromatch@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.8.tgz#d66fa18f3a47076789320b9b1af32bd86d9fa202" + integrity sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA== + dependencies: + braces "^3.0.3" + picomatch "^2.3.1" + +minimatch@^10.0.0: + version "10.0.1" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-10.0.1.tgz#ce0521856b453c86e25f2c4c0d03e6ff7ddc440b" + integrity sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ== + dependencies: + brace-expansion "^2.0.1" + +minimatch@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== + dependencies: + brace-expansion "^1.1.7" + +minimatch@^9.0.4: + version "9.0.5" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.5.tgz#d74f9dd6b57d83d8e98cfb82133b03978bc929e5" + integrity sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow== + dependencies: + brace-expansion "^2.0.1" + +minipass@^7.1.2: + version "7.1.2" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.1.2.tgz#93a9626ce5e5e66bd4db86849e7515e92340a707" + integrity sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw== + +ms@^2.1.3: + version "2.1.3" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + +natural-compare-lite@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz#17b09581988979fddafe0201e931ba933c96cbb4" + integrity sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g== + +natural-compare@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" + integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== + +optionator@^0.9.3: + version "0.9.4" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.4.tgz#7ea1c1a5d91d764fb282139c88fe11e182a3a734" + integrity sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g== + dependencies: + deep-is "^0.1.3" + fast-levenshtein "^2.0.6" + levn "^0.4.1" + prelude-ls "^1.2.1" + type-check "^0.4.0" + word-wrap "^1.2.5" + +p-limit@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" + integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== + dependencies: + yocto-queue "^0.1.0" + +p-locate@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" + integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== + dependencies: + p-limit "^3.0.2" + +package-json-from-dist@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz#4f1471a010827a86f94cfd9b0727e36d267de505" + integrity sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw== + +parent-module@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" + integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== + dependencies: + callsites "^3.0.0" + +parse-entities@^4.0.0: + version "4.0.2" + resolved "https://registry.yarnpkg.com/parse-entities/-/parse-entities-4.0.2.tgz#61d46f5ed28e4ee62e9ddc43d6b010188443f159" + integrity sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw== + dependencies: + "@types/unist" "^2.0.0" + character-entities-legacy "^3.0.0" + character-reference-invalid "^2.0.0" + decode-named-character-reference "^1.0.0" + is-alphanumerical "^2.0.0" + is-decimal "^2.0.0" + is-hexadecimal "^2.0.0" + +path-exists@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" + integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== + +path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + +path-scurry@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-2.0.0.tgz#9f052289f23ad8bf9397a2a0425e7b8615c58580" + integrity sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg== + dependencies: + lru-cache "^11.0.0" + minipass "^7.1.2" + +path-type@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" + integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== + +picomatch@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" + integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== + +prelude-ls@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" + integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== + +prettier@^3.5.2: + version "3.5.2" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.5.2.tgz#d066c6053200da0234bf8fa1ef45168abed8b914" + integrity sha512-lc6npv5PH7hVqozBR7lkBNOGXV9vMwROAPlumdBkX0wTbbzPu/U1hk5yL8p2pt4Xoc+2mkT8t/sow2YrV/M5qg== + +primeflex@^3.3.1: + version "3.3.1" + resolved "https://registry.yarnpkg.com/primeflex/-/primeflex-3.3.1.tgz#361dddf6eb5db50d733e4cddd4b6e376a3d7bd68" + integrity sha512-zaOq3YvcOYytbAmKv3zYc+0VNS9Wg5d37dfxZnveKBFPr7vEIwfV5ydrpiouTft8MVW6qNjfkaQphHSnvgQbpQ== + +property-information@^6.0.0: + version "6.5.0" + resolved "https://registry.yarnpkg.com/property-information/-/property-information-6.5.0.tgz#6212fbb52ba757e92ef4fb9d657563b933b7ffec" + integrity sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig== + +punycode@^2.1.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" + integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== + +queue-microtask@^1.2.2: + version "1.2.3" + resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" + integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== + +rc-cascader@~3.33.0: + version "3.33.0" + resolved "https://registry.yarnpkg.com/rc-cascader/-/rc-cascader-3.33.0.tgz#acdeafebbdf7f7296f4d84980d02cf0835f93910" + integrity sha512-JvZrMbKBXIbEDmpIORxqvedY/bck6hGbs3hxdWT8eS9wSQ1P7//lGxbyKjOSyQiVBbgzNWriSe6HoMcZO/+0rQ== + dependencies: + "@babel/runtime" "^7.25.7" + classnames "^2.3.1" + rc-select "~14.16.2" + rc-tree "~5.13.0" + rc-util "^5.43.0" + +rc-checkbox@~3.5.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/rc-checkbox/-/rc-checkbox-3.5.0.tgz#3ae2441e3a321774d390f76539e706864fcf5ff0" + integrity sha512-aOAQc3E98HteIIsSqm6Xk2FPKIER6+5vyEFMZfo73TqM+VVAIqOkHoPjgKLqSNtVLWScoaM7vY2ZrGEheI79yg== + dependencies: + "@babel/runtime" "^7.10.1" + classnames "^2.3.2" + rc-util "^5.25.2" + +rc-collapse@~3.9.0: + version "3.9.0" + resolved "https://registry.yarnpkg.com/rc-collapse/-/rc-collapse-3.9.0.tgz#972404ce7724e1c9d1d2476543e1175404a36806" + integrity sha512-swDdz4QZ4dFTo4RAUMLL50qP0EY62N2kvmk2We5xYdRwcRn8WcYtuetCJpwpaCbUfUt5+huLpVxhvmnK+PHrkA== + dependencies: + "@babel/runtime" "^7.10.1" + classnames "2.x" + rc-motion "^2.3.4" + rc-util "^5.27.0" + +rc-dialog@~9.6.0: + version "9.6.0" + resolved "https://registry.yarnpkg.com/rc-dialog/-/rc-dialog-9.6.0.tgz#dc7a255c6ad1cb56021c3a61c7de86ee88c7c371" + integrity sha512-ApoVi9Z8PaCQg6FsUzS8yvBEQy0ZL2PkuvAgrmohPkN3okps5WZ5WQWPc1RNuiOKaAYv8B97ACdsFU5LizzCqg== + dependencies: + "@babel/runtime" "^7.10.1" + "@rc-component/portal" "^1.0.0-8" + classnames "^2.2.6" + rc-motion "^2.3.0" + rc-util "^5.21.0" + +rc-drawer@~7.2.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/rc-drawer/-/rc-drawer-7.2.0.tgz#8d7de2f1fd52f3ac5a25f54afbb8ac14c62e5663" + integrity sha512-9lOQ7kBekEJRdEpScHvtmEtXnAsy+NGDXiRWc2ZVC7QXAazNVbeT4EraQKYwCME8BJLa8Bxqxvs5swwyOepRwg== + dependencies: + "@babel/runtime" "^7.23.9" + "@rc-component/portal" "^1.1.1" + classnames "^2.2.6" + rc-motion "^2.6.1" + rc-util "^5.38.1" + +rc-dropdown@~4.2.0, rc-dropdown@~4.2.1: + version "4.2.1" + resolved "https://registry.yarnpkg.com/rc-dropdown/-/rc-dropdown-4.2.1.tgz#44729eb2a4272e0353d31ac060da21e606accb1c" + integrity sha512-YDAlXsPv3I1n42dv1JpdM7wJ+gSUBfeyPK59ZpBD9jQhK9jVuxpjj3NmWQHOBceA1zEPVX84T2wbdb2SD0UjmA== + dependencies: + "@babel/runtime" "^7.18.3" + "@rc-component/trigger" "^2.0.0" + classnames "^2.2.6" + rc-util "^5.44.1" + +rc-field-form@~2.7.0: + version "2.7.0" + resolved "https://registry.yarnpkg.com/rc-field-form/-/rc-field-form-2.7.0.tgz#22413e793f35bfc1f35b0ec462774d7277f5a399" + integrity sha512-hgKsCay2taxzVnBPZl+1n4ZondsV78G++XVsMIJCAoioMjlMQR9YwAp7JZDIECzIu2Z66R+f4SFIRrO2DjDNAA== + dependencies: + "@babel/runtime" "^7.18.0" + "@rc-component/async-validator" "^5.0.3" + rc-util "^5.32.2" + +rc-image@~7.11.0: + version "7.11.0" + resolved "https://registry.yarnpkg.com/rc-image/-/rc-image-7.11.0.tgz#18c77ea557a6fdbe26856c688a9aace1505c0e77" + integrity sha512-aZkTEZXqeqfPZtnSdNUnKQA0N/3MbgR7nUnZ+/4MfSFWPFHZau4p5r5ShaI0KPEMnNjv4kijSCFq/9wtJpwykw== + dependencies: + "@babel/runtime" "^7.11.2" + "@rc-component/portal" "^1.0.2" + classnames "^2.2.6" + rc-dialog "~9.6.0" + rc-motion "^2.6.2" + rc-util "^5.34.1" + +rc-input-number@~9.4.0: + version "9.4.0" + resolved "https://registry.yarnpkg.com/rc-input-number/-/rc-input-number-9.4.0.tgz#65caf04f1b6d05f47e141b1f5f484724c1f7fd5a" + integrity sha512-Tiy4DcXcFXAf9wDhN8aUAyMeCLHJUHA/VA/t7Hj8ZEx5ETvxG7MArDOSE6psbiSCo+vJPm4E3fGN710ITVn6GA== + dependencies: + "@babel/runtime" "^7.10.1" + "@rc-component/mini-decimal" "^1.0.1" + classnames "^2.2.5" + rc-input "~1.7.1" + rc-util "^5.40.1" + +rc-input@~1.7.1, rc-input@~1.7.2: + version "1.7.2" + resolved "https://registry.yarnpkg.com/rc-input/-/rc-input-1.7.2.tgz#a41d5ca14021475d3998deb09630ee46268610af" + integrity sha512-g3nYONnl4edWj2FfVoxsU3Ec4XTE+Hb39Kfh2MFxMZjp/0gGyPUgy/v7ZhS27ZxUFNkuIDYXm9PJsLyJbtg86A== + dependencies: + "@babel/runtime" "^7.11.1" + classnames "^2.2.1" + rc-util "^5.18.1" + +rc-mentions@~2.19.1: + version "2.19.1" + resolved "https://registry.yarnpkg.com/rc-mentions/-/rc-mentions-2.19.1.tgz#3fd0dd0bf3dd63afdb6a21750cbae81f3824b9c4" + integrity sha512-KK3bAc/bPFI993J3necmaMXD2reZTzytZdlTvkeBbp50IGH1BDPDvxLdHDUrpQx2b2TGaVJsn+86BvYa03kGqA== + dependencies: + "@babel/runtime" "^7.22.5" + "@rc-component/trigger" "^2.0.0" + classnames "^2.2.6" + rc-input "~1.7.1" + rc-menu "~9.16.0" + rc-textarea "~1.9.0" + rc-util "^5.34.1" + +rc-menu@~9.16.0: + version "9.16.1" + resolved "https://registry.yarnpkg.com/rc-menu/-/rc-menu-9.16.1.tgz#9df1168e41d87dc7164c582173e1a1d32011899f" + integrity sha512-ghHx6/6Dvp+fw8CJhDUHFHDJ84hJE3BXNCzSgLdmNiFErWSOaZNsihDAsKq9ByTALo/xkNIwtDFGIl6r+RPXBg== + dependencies: + "@babel/runtime" "^7.10.1" + "@rc-component/trigger" "^2.0.0" + classnames "2.x" + rc-motion "^2.4.3" + rc-overflow "^1.3.1" + rc-util "^5.27.0" + +rc-motion@^2.0.0, rc-motion@^2.0.1, rc-motion@^2.3.0, rc-motion@^2.3.4, rc-motion@^2.4.3, rc-motion@^2.4.4, rc-motion@^2.6.1, rc-motion@^2.6.2, rc-motion@^2.9.0, rc-motion@^2.9.5: + version "2.9.5" + resolved "https://registry.yarnpkg.com/rc-motion/-/rc-motion-2.9.5.tgz#12c6ead4fd355f94f00de9bb4f15df576d677e0c" + integrity sha512-w+XTUrfh7ArbYEd2582uDrEhmBHwK1ZENJiSJVb7uRxdE7qJSYjbO2eksRXmndqyKqKoYPc9ClpPh5242mV1vA== + dependencies: + "@babel/runtime" "^7.11.1" + classnames "^2.2.1" + rc-util "^5.44.0" + +rc-notification@~5.6.3: + version "5.6.3" + resolved "https://registry.yarnpkg.com/rc-notification/-/rc-notification-5.6.3.tgz#5aca122b7e2fb73ae4ba77238a90e6e8c9c12b8d" + integrity sha512-42szwnn8VYQoT6GnjO00i1iwqV9D1TTMvxObWsuLwgl0TsOokzhkYiufdtQBsJMFjJravS1hfDKVMHLKLcPE4g== + dependencies: + "@babel/runtime" "^7.10.1" + classnames "2.x" + rc-motion "^2.9.0" + rc-util "^5.20.1" + +rc-overflow@^1.3.1, rc-overflow@^1.3.2: + version "1.4.1" + resolved "https://registry.yarnpkg.com/rc-overflow/-/rc-overflow-1.4.1.tgz#e1bcf0375979c24cffa2d87bf83a19ded5fcdf45" + integrity sha512-3MoPQQPV1uKyOMVNd6SZfONi+f3st0r8PksexIdBTeIYbMX0Jr+k7pHEDvsXtR4BpCv90/Pv2MovVNhktKrwvw== + dependencies: + "@babel/runtime" "^7.11.1" + classnames "^2.2.1" + rc-resize-observer "^1.0.0" + rc-util "^5.37.0" + +rc-pagination@~5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/rc-pagination/-/rc-pagination-5.1.0.tgz#a6e63a2c5db29e62f991282eb18a2d3ee725ba8b" + integrity sha512-8416Yip/+eclTFdHXLKTxZvn70duYVGTvUUWbckCCZoIl3jagqke3GLsFrMs0bsQBikiYpZLD9206Ej4SOdOXQ== + dependencies: + "@babel/runtime" "^7.10.1" + classnames "^2.3.2" + rc-util "^5.38.0" + +rc-picker@~4.11.1: + version "4.11.2" + resolved "https://registry.yarnpkg.com/rc-picker/-/rc-picker-4.11.2.tgz#fabae4d22773decafa3f0caf92616232d8fd19b7" + integrity sha512-Cwa3frWpefhESBF20HBJtvWx3q1hCrMxSUrzuuWMTGoZVPhQllGEp2IUfzo9jC5LKm4kJx7IrH8q/W/y9wClAw== + dependencies: + "@babel/runtime" "^7.24.7" + "@rc-component/trigger" "^2.0.0" + classnames "^2.2.1" + rc-overflow "^1.3.2" + rc-resize-observer "^1.4.0" + rc-util "^5.43.0" + +rc-progress@~4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/rc-progress/-/rc-progress-4.0.0.tgz#5382147d9add33d3a5fbd264001373df6440e126" + integrity sha512-oofVMMafOCokIUIBnZLNcOZFsABaUw8PPrf1/y0ZBvKZNpOiu5h4AO9vv11Sw0p4Hb3D0yGWuEattcQGtNJ/aw== + dependencies: + "@babel/runtime" "^7.10.1" + classnames "^2.2.6" + rc-util "^5.16.1" + +rc-rate@~2.13.1: + version "2.13.1" + resolved "https://registry.yarnpkg.com/rc-rate/-/rc-rate-2.13.1.tgz#29af7a3d4768362e9d4388f955a8b6389526b7fd" + integrity sha512-QUhQ9ivQ8Gy7mtMZPAjLbxBt5y9GRp65VcUyGUMF3N3fhiftivPHdpuDIaWIMOTEprAjZPC08bls1dQB+I1F2Q== + dependencies: + "@babel/runtime" "^7.10.1" + classnames "^2.2.5" + rc-util "^5.0.1" + +rc-resize-observer@^1.0.0, rc-resize-observer@^1.1.0, rc-resize-observer@^1.3.1, rc-resize-observer@^1.4.0, rc-resize-observer@^1.4.3: + version "1.4.3" + resolved "https://registry.yarnpkg.com/rc-resize-observer/-/rc-resize-observer-1.4.3.tgz#4fd41fa561ba51362b5155a07c35d7c89a1ea569" + integrity sha512-YZLjUbyIWox8E9i9C3Tm7ia+W7euPItNWSPX5sCcQTYbnwDb5uNpnLHQCG1f22oZWUhLw4Mv2tFmeWe68CDQRQ== + dependencies: + "@babel/runtime" "^7.20.7" + classnames "^2.2.1" + rc-util "^5.44.1" + resize-observer-polyfill "^1.5.1" + +rc-segmented@~2.7.0: + version "2.7.0" + resolved "https://registry.yarnpkg.com/rc-segmented/-/rc-segmented-2.7.0.tgz#f56c2044abf8f03958b3a9a9d32987f10dcc4fc4" + integrity sha512-liijAjXz+KnTRVnxxXG2sYDGd6iLL7VpGGdR8gwoxAXy2KglviKCxLWZdjKYJzYzGSUwKDSTdYk8brj54Bn5BA== + dependencies: + "@babel/runtime" "^7.11.1" + classnames "^2.2.1" + rc-motion "^2.4.4" + rc-util "^5.17.0" + +rc-select@~14.16.2, rc-select@~14.16.6: + version "14.16.6" + resolved "https://registry.yarnpkg.com/rc-select/-/rc-select-14.16.6.tgz#1c57a9aa97248b3fd9a830d9bf5df6e9d2ad2c69" + integrity sha512-YPMtRPqfZWOm2XGTbx5/YVr1HT0vn//8QS77At0Gjb3Lv+Lbut0IORJPKLWu1hQ3u4GsA0SrDzs7nI8JG7Zmyg== + dependencies: + "@babel/runtime" "^7.10.1" + "@rc-component/trigger" "^2.1.1" + classnames "2.x" + rc-motion "^2.0.1" + rc-overflow "^1.3.1" + rc-util "^5.16.1" + rc-virtual-list "^3.5.2" + +rc-slider@~11.1.8: + version "11.1.8" + resolved "https://registry.yarnpkg.com/rc-slider/-/rc-slider-11.1.8.tgz#cf3b30dacac8f98d44f7685f733f6f7da146fc06" + integrity sha512-2gg/72YFSpKP+Ja5AjC5DPL1YnV8DEITDQrcc1eASrUYjl0esptaBVJBh5nLTXCCp15eD8EuGjwezVGSHhs9tQ== + dependencies: + "@babel/runtime" "^7.10.1" + classnames "^2.2.5" + rc-util "^5.36.0" + +rc-steps@~6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/rc-steps/-/rc-steps-6.0.1.tgz#c2136cd0087733f6d509209a84a5c80dc29a274d" + integrity sha512-lKHL+Sny0SeHkQKKDJlAjV5oZ8DwCdS2hFhAkIjuQt1/pB81M0cA0ErVFdHq9+jmPmFw1vJB2F5NBzFXLJxV+g== + dependencies: + "@babel/runtime" "^7.16.7" + classnames "^2.2.3" + rc-util "^5.16.1" + +rc-switch@~4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/rc-switch/-/rc-switch-4.1.0.tgz#f37d81b4e0c5afd1274fd85367b17306bf25e7d7" + integrity sha512-TI8ufP2Az9oEbvyCeVE4+90PDSljGyuwix3fV58p7HV2o4wBnVToEyomJRVyTaZeqNPAp+vqeo4Wnj5u0ZZQBg== + dependencies: + "@babel/runtime" "^7.21.0" + classnames "^2.2.1" + rc-util "^5.30.0" + +rc-table@~7.50.3: + version "7.50.3" + resolved "https://registry.yarnpkg.com/rc-table/-/rc-table-7.50.3.tgz#3016084e34cd834965eb3fa6a1b30a14926b7706" + integrity sha512-Z4/zNCzjv7f/XzPRecb+vJU0DJKdsYt4YRkDzNl4G05m7JmxrKGYC2KqN1Ew6jw2zJq7cxVv3z39qyZOHMuf7A== + dependencies: + "@babel/runtime" "^7.10.1" + "@rc-component/context" "^1.4.0" + classnames "^2.2.5" + rc-resize-observer "^1.1.0" + rc-util "^5.44.3" + rc-virtual-list "^3.14.2" + +rc-tabs@~15.5.1: + version "15.5.1" + resolved "https://registry.yarnpkg.com/rc-tabs/-/rc-tabs-15.5.1.tgz#9460ae1fd75e2a217e30e596c26425a661a2a4c6" + integrity sha512-yiWivLAjEo5d1v2xlseB2dQocsOhkoVSfo1krS8v8r+02K+TBUjSjXIf7dgyVSxp6wRIPv5pMi5hanNUlQMgUA== + dependencies: + "@babel/runtime" "^7.11.2" + classnames "2.x" + rc-dropdown "~4.2.0" + rc-menu "~9.16.0" + rc-motion "^2.6.2" + rc-resize-observer "^1.0.0" + rc-util "^5.34.1" + +rc-textarea@~1.9.0: + version "1.9.0" + resolved "https://registry.yarnpkg.com/rc-textarea/-/rc-textarea-1.9.0.tgz#d807194ebef90f25f0b9501cddf5e8f2968d598a" + integrity sha512-dQW/Bc/MriPBTugj2Kx9PMS5eXCCGn2cxoIaichjbNvOiARlaHdI99j4DTxLl/V8+PIfW06uFy7kjfUIDDKyxQ== + dependencies: + "@babel/runtime" "^7.10.1" + classnames "^2.2.1" + rc-input "~1.7.1" + rc-resize-observer "^1.0.0" + rc-util "^5.27.0" + +rc-tooltip@~6.4.0: + version "6.4.0" + resolved "https://registry.yarnpkg.com/rc-tooltip/-/rc-tooltip-6.4.0.tgz#e832ed0392872025e59928cfc1ad9045656467fd" + integrity sha512-kqyivim5cp8I5RkHmpsp1Nn/Wk+1oeloMv9c7LXNgDxUpGm+RbXJGL+OPvDlcRnx9DBeOe4wyOIl4OKUERyH1g== + dependencies: + "@babel/runtime" "^7.11.2" + "@rc-component/trigger" "^2.0.0" + classnames "^2.3.1" + rc-util "^5.44.3" + +rc-tree-select@~5.27.0: + version "5.27.0" + resolved "https://registry.yarnpkg.com/rc-tree-select/-/rc-tree-select-5.27.0.tgz#3daa62972ae80846dac96bf4776d1a9dc9c7c4c6" + integrity sha512-2qTBTzwIT7LRI1o7zLyrCzmo5tQanmyGbSaGTIf7sYimCklAToVVfpMC6OAldSKolcnjorBYPNSKQqJmN3TCww== + dependencies: + "@babel/runtime" "^7.25.7" + classnames "2.x" + rc-select "~14.16.2" + rc-tree "~5.13.0" + rc-util "^5.43.0" + +rc-tree@~5.13.0: + version "5.13.0" + resolved "https://registry.yarnpkg.com/rc-tree/-/rc-tree-5.13.0.tgz#ae34768c1463fd1fb19d73549c29b219c8891296" + integrity sha512-2+lFvoVRnvHQ1trlpXMOWtF8BUgF+3TiipG72uOfhpL5CUdXCk931kvDdUkTL/IZVtNEDQKwEEmJbAYJSA5NnA== + dependencies: + "@babel/runtime" "^7.10.1" + classnames "2.x" + rc-motion "^2.0.1" + rc-util "^5.16.1" + rc-virtual-list "^3.5.1" + +rc-upload@~4.8.1: + version "4.8.1" + resolved "https://registry.yarnpkg.com/rc-upload/-/rc-upload-4.8.1.tgz#ac55f2bc101b95b52a6e47f3c18f0f55b54e16d2" + integrity sha512-toEAhwl4hjLAI1u8/CgKWt30BR06ulPa4iGQSMvSXoHzO88gPCslxqV/mnn4gJU7PDoltGIC9Eh+wkeudqgHyw== + dependencies: + "@babel/runtime" "^7.18.3" + classnames "^2.2.5" + rc-util "^5.2.0" + +rc-util@^5.0.1, rc-util@^5.16.1, rc-util@^5.17.0, rc-util@^5.18.1, rc-util@^5.2.0, rc-util@^5.20.1, rc-util@^5.21.0, rc-util@^5.24.4, rc-util@^5.25.2, rc-util@^5.27.0, rc-util@^5.30.0, rc-util@^5.31.1, rc-util@^5.32.2, rc-util@^5.34.1, rc-util@^5.35.0, rc-util@^5.36.0, rc-util@^5.37.0, rc-util@^5.38.0, rc-util@^5.38.1, rc-util@^5.40.1, rc-util@^5.43.0, rc-util@^5.44.0, rc-util@^5.44.1, rc-util@^5.44.3, rc-util@^5.44.4: + version "5.44.4" + resolved "https://registry.yarnpkg.com/rc-util/-/rc-util-5.44.4.tgz#89ee9037683cca01cd60f1a6bbda761457dd6ba5" + integrity sha512-resueRJzmHG9Q6rI/DfK6Kdv9/Lfls05vzMs1Sk3M2P+3cJa+MakaZyWY8IPfehVuhPJFKrIY1IK4GqbiaiY5w== + dependencies: + "@babel/runtime" "^7.18.3" + react-is "^18.2.0" + +rc-virtual-list@^3.14.2, rc-virtual-list@^3.5.1, rc-virtual-list@^3.5.2: + version "3.18.2" + resolved "https://registry.yarnpkg.com/rc-virtual-list/-/rc-virtual-list-3.18.2.tgz#5f3563b4a27e593d66058b446aa7424e06a38c06" + integrity sha512-SkPabqstOQgJ2Q2Ob3eDPIHsNrDzQZFl8mzHiXuNablyYwddVU33Ws6oxoA7Fi/6pZeEYonrLEUiJGr/6aBVaw== + dependencies: + "@babel/runtime" "^7.20.0" + classnames "^2.2.6" + rc-resize-observer "^1.0.0" + rc-util "^5.36.0" + +react-dom@^18.2.0: + version "18.3.1" + resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-18.3.1.tgz#c2265d79511b57d479b3dd3fdfa51536494c5cb4" + integrity sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw== + dependencies: + loose-envify "^1.1.0" + scheduler "^0.23.2" + +react-is@^18.2.0: + version "18.3.1" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.3.1.tgz#e83557dc12eae63a99e003a46388b1dcbb44db7e" + integrity sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg== + +react-markdown@^9.0.1: + version "9.0.3" + resolved "https://registry.yarnpkg.com/react-markdown/-/react-markdown-9.0.3.tgz#c12bf60dad05e9bf650b86bcc612d80636e8456e" + integrity sha512-Yk7Z94dbgYTOrdk41Z74GoKA7rThnsbbqBTRYuxoe08qvfQ9tJVhmAKw6BJS/ZORG7kTy/s1QvYzSuaoBA1qfw== + dependencies: + "@types/hast" "^3.0.0" + devlop "^1.0.0" + hast-util-to-jsx-runtime "^2.0.0" + html-url-attributes "^3.0.0" + mdast-util-to-hast "^13.0.0" + remark-parse "^11.0.0" + remark-rehype "^11.0.0" + unified "^11.0.0" + unist-util-visit "^5.0.0" + vfile "^6.0.0" + +react@^18.2.0: + version "18.3.1" + resolved "https://registry.yarnpkg.com/react/-/react-18.3.1.tgz#49ab892009c53933625bd16b2533fc754cab2891" + integrity sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ== + dependencies: + loose-envify "^1.1.0" + +regenerator-runtime@^0.14.0: + version "0.14.1" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz#356ade10263f685dda125100cd862c1db895327f" + integrity sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw== + +remark-gfm@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/remark-gfm/-/remark-gfm-4.0.1.tgz#33227b2a74397670d357bf05c098eaf8513f0d6b" + integrity sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg== + dependencies: + "@types/mdast" "^4.0.0" + mdast-util-gfm "^3.0.0" + micromark-extension-gfm "^3.0.0" + remark-parse "^11.0.0" + remark-stringify "^11.0.0" + unified "^11.0.0" + +remark-parse@^11.0.0: + version "11.0.0" + resolved "https://registry.yarnpkg.com/remark-parse/-/remark-parse-11.0.0.tgz#aa60743fcb37ebf6b069204eb4da304e40db45a1" + integrity sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA== + dependencies: + "@types/mdast" "^4.0.0" + mdast-util-from-markdown "^2.0.0" + micromark-util-types "^2.0.0" + unified "^11.0.0" + +remark-rehype@^11.0.0: + version "11.1.1" + resolved "https://registry.yarnpkg.com/remark-rehype/-/remark-rehype-11.1.1.tgz#f864dd2947889a11997c0a2667cd6b38f685bca7" + integrity sha512-g/osARvjkBXb6Wo0XvAeXQohVta8i84ACbenPpoSsxTOQH/Ae0/RGP4WZgnMH5pMLpsj4FG7OHmcIcXxpza8eQ== + dependencies: + "@types/hast" "^3.0.0" + "@types/mdast" "^4.0.0" + mdast-util-to-hast "^13.0.0" + unified "^11.0.0" + vfile "^6.0.0" + +remark-stringify@^11.0.0: + version "11.0.0" + resolved "https://registry.yarnpkg.com/remark-stringify/-/remark-stringify-11.0.0.tgz#4c5b01dd711c269df1aaae11743eb7e2e7636fd3" + integrity sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw== + dependencies: + "@types/mdast" "^4.0.0" + mdast-util-to-markdown "^2.0.0" + unified "^11.0.0" + +resize-observer-polyfill@^1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz#0e9020dd3d21024458d4ebd27e23e40269810464" + integrity sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg== + +resolve-from@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" + integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== + +reusify@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" + integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== + +rimraf@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-6.0.1.tgz#ffb8ad8844dd60332ab15f52bc104bc3ed71ea4e" + integrity sha512-9dkvaxAsk/xNXSJzMgFqqMCuFgt2+KsOFek3TMLfo8NCPfWpBmqwyNn5Y+NX56QUYfCtsyhF3ayiboEoUmJk/A== + dependencies: + glob "^11.0.0" + package-json-from-dist "^1.0.0" + +run-parallel@^1.1.9: + version "1.2.0" + resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" + integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== + dependencies: + queue-microtask "^1.2.2" + +scheduler@^0.23.2: + version "0.23.2" + resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.23.2.tgz#414ba64a3b282892e944cf2108ecc078d115cdc3" + integrity sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ== + dependencies: + loose-envify "^1.1.0" + +scroll-into-view-if-needed@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/scroll-into-view-if-needed/-/scroll-into-view-if-needed-3.1.0.tgz#fa9524518c799b45a2ef6bbffb92bcad0296d01f" + integrity sha512-49oNpRjWRvnU8NyGVmUaYG4jtTkNonFZI86MmGRDqBphEK2EXT9gdEUoQPZhuBM8yWHxCWbobltqYO5M4XrUvQ== + dependencies: + compute-scroll-into-view "^3.0.2" + +semver@^7.3.7, semver@^7.6.0: + version "7.7.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.7.1.tgz#abd5098d82b18c6c81f6074ff2647fd3e7220c9f" + integrity sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA== + +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + dependencies: + shebang-regex "^3.0.0" + +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + +signal-exit@^4.0.1: + version "4.1.0" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04" + integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== + +slash@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" + integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== + +space-separated-tokens@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz#1ecd9d2350a3844572c3f4a312bceb018348859f" + integrity sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q== + +string-convert@^0.2.0: + version "0.2.1" + resolved "https://registry.yarnpkg.com/string-convert/-/string-convert-0.2.1.tgz#6982cc3049fbb4cd85f8b24568b9d9bf39eeff97" + integrity sha512-u/1tdPl4yQnPBjnVrmdLo9gtuLvELKsAoRapekWggdiQNvvvum+jYF329d84NAa660KQw7pB2n36KrIKVoXa3A== + +"string-width-cjs@npm:string-width@^4.2.0": + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +string-width@^4.1.0: + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +string-width@^5.0.1, string-width@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794" + integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA== + dependencies: + eastasianwidth "^0.2.0" + emoji-regex "^9.2.2" + strip-ansi "^7.0.1" + +stringify-entities@^4.0.0: + version "4.0.4" + resolved "https://registry.yarnpkg.com/stringify-entities/-/stringify-entities-4.0.4.tgz#b3b79ef5f277cc4ac73caeb0236c5ba939b3a4f3" + integrity sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg== + dependencies: + character-entities-html4 "^2.0.0" + character-entities-legacy "^3.0.0" + +"strip-ansi-cjs@npm:strip-ansi@^6.0.1": + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +strip-ansi@^6.0.0, strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +strip-ansi@^7.0.1: + version "7.1.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45" + integrity sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ== + dependencies: + ansi-regex "^6.0.1" + +strip-json-comments@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" + integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== + +style-to-object@^1.0.0: + version "1.0.8" + resolved "https://registry.yarnpkg.com/style-to-object/-/style-to-object-1.0.8.tgz#67a29bca47eaa587db18118d68f9d95955e81292" + integrity sha512-xT47I/Eo0rwJmaXC4oilDGDWLohVhR6o/xAQcPQN8q6QBuZVL8qMYL85kLmST5cPjAorwvqIA4qXTRQoYHaL6g== + dependencies: + inline-style-parser "0.2.4" + +stylis@^4.3.4: + version "4.3.6" + resolved "https://registry.yarnpkg.com/stylis/-/stylis-4.3.6.tgz#7c7b97191cb4f195f03ecab7d52f7902ed378320" + integrity sha512-yQ3rwFWRfwNUY7H5vpU0wfdkNSnvnJinhF9830Swlaxl03zsOjCfmX0ugac+3LtK0lYSgwL/KXc8oYL3mG4YFQ== + +supports-color@^7.1.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== + dependencies: + has-flag "^4.0.0" + +tabbable@^5.2.0: + version "5.3.3" + resolved "https://registry.yarnpkg.com/tabbable/-/tabbable-5.3.3.tgz#aac0ff88c73b22d6c3c5a50b1586310006b47fbf" + integrity sha512-QD9qKY3StfbZqWOPLp0++pOrAVb/HbUi5xCc8cUo4XjP19808oaMiDzn0leBY5mCespIBM0CIZePzZjgzR83kA== + +tabbable@^6.0.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/tabbable/-/tabbable-6.2.0.tgz#732fb62bc0175cfcec257330be187dcfba1f3b97" + integrity sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew== + +throttle-debounce@5.0.2, throttle-debounce@^5.0.0, throttle-debounce@^5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/throttle-debounce/-/throttle-debounce-5.0.2.tgz#ec5549d84e053f043c9fd0f2a6dd892ff84456b1" + integrity sha512-B71/4oyj61iNH0KeCamLuE2rmKuTO5byTOSVwECM5FA7TiAiAW+UqTKZ9ERueC4qvgSttUhdmq1mXC3kJqGX7A== + +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + +toggle-selection@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/toggle-selection/-/toggle-selection-1.0.6.tgz#6e45b1263f2017fa0acc7d89d78b15b8bf77da32" + integrity sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ== + +trim-lines@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/trim-lines/-/trim-lines-3.0.1.tgz#d802e332a07df861c48802c04321017b1bd87338" + integrity sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg== + +trough@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/trough/-/trough-2.2.0.tgz#94a60bd6bd375c152c1df911a4b11d5b0256f50f" + integrity sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw== + +ts-api-utils@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-2.0.1.tgz#660729385b625b939aaa58054f45c058f33f10cd" + integrity sha512-dnlgjFSVetynI8nzgJ+qF62efpglpWRk8isUEWZGWlJYySCTD6aKvbUDu+zbPeDakk3bg5H4XpitHukgfL1m9w== + +tslib@^1.13.0, tslib@^1.8.1: + version "1.14.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" + integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== + +tslib@^2.6.2: + version "2.8.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.8.1.tgz#612efe4ed235d567e8aba5f2a5fab70280ade83f" + integrity sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w== + +tsutils@^3.21.0: + version "3.21.0" + resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623" + integrity sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA== + dependencies: + tslib "^1.8.1" + +type-check@^0.4.0, type-check@~0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" + integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== + dependencies: + prelude-ls "^1.2.1" + +typescript-eslint@^8.25.0: + version "8.25.0" + resolved "https://registry.yarnpkg.com/typescript-eslint/-/typescript-eslint-8.25.0.tgz#73047c157cd70ee93cf2f9243f1599d21cf60239" + integrity sha512-TxRdQQLH4g7JkoFlYG3caW5v1S6kEkz8rqt80iQJZUYPq1zD1Ra7HfQBJJ88ABRaMvHAXnwRvRB4V+6sQ9xN5Q== + dependencies: + "@typescript-eslint/eslint-plugin" "8.25.0" + "@typescript-eslint/parser" "8.25.0" + "@typescript-eslint/utils" "8.25.0" + +typescript@^5.7.3: + version "5.7.3" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.7.3.tgz#919b44a7dbb8583a9b856d162be24a54bf80073e" + integrity sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw== + +undici-types@~6.19.2: + version "6.19.8" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.19.8.tgz#35111c9d1437ab83a7cdc0abae2f26d88eda0a02" + integrity sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw== + +unified@^11.0.0: + version "11.0.5" + resolved "https://registry.yarnpkg.com/unified/-/unified-11.0.5.tgz#f66677610a5c0a9ee90cab2b8d4d66037026d9e1" + integrity sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA== + dependencies: + "@types/unist" "^3.0.0" + bail "^2.0.0" + devlop "^1.0.0" + extend "^3.0.0" + is-plain-obj "^4.0.0" + trough "^2.0.0" + vfile "^6.0.0" + +unist-util-is@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/unist-util-is/-/unist-util-is-6.0.0.tgz#b775956486aff107a9ded971d996c173374be424" + integrity sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw== + dependencies: + "@types/unist" "^3.0.0" + +unist-util-position@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/unist-util-position/-/unist-util-position-5.0.0.tgz#678f20ab5ca1207a97d7ea8a388373c9cf896be4" + integrity sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA== + dependencies: + "@types/unist" "^3.0.0" + +unist-util-stringify-position@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz#449c6e21a880e0855bf5aabadeb3a740314abac2" + integrity sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ== + dependencies: + "@types/unist" "^3.0.0" + +unist-util-visit-parents@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/unist-util-visit-parents/-/unist-util-visit-parents-6.0.1.tgz#4d5f85755c3b8f0dc69e21eca5d6d82d22162815" + integrity sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw== + dependencies: + "@types/unist" "^3.0.0" + unist-util-is "^6.0.0" + +unist-util-visit@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/unist-util-visit/-/unist-util-visit-5.0.0.tgz#a7de1f31f72ffd3519ea71814cccf5fd6a9217d6" + integrity sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg== + dependencies: + "@types/unist" "^3.0.0" + unist-util-is "^6.0.0" + unist-util-visit-parents "^6.0.0" + +uri-js@^4.2.2: + version "4.4.1" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" + integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== + dependencies: + punycode "^2.1.0" + +vfile-message@^4.0.0: + version "4.0.2" + resolved "https://registry.yarnpkg.com/vfile-message/-/vfile-message-4.0.2.tgz#c883c9f677c72c166362fd635f21fc165a7d1181" + integrity sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw== + dependencies: + "@types/unist" "^3.0.0" + unist-util-stringify-position "^4.0.0" + +vfile@^6.0.0: + version "6.0.3" + resolved "https://registry.yarnpkg.com/vfile/-/vfile-6.0.3.tgz#3652ab1c496531852bf55a6bac57af981ebc38ab" + integrity sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q== + dependencies: + "@types/unist" "^3.0.0" + vfile-message "^4.0.0" + +vscode-messenger-common@^0.4.5: + version "0.4.5" + resolved "https://registry.yarnpkg.com/vscode-messenger-common/-/vscode-messenger-common-0.4.5.tgz#bc49a25d28808db9cc322cde029fed518c8fa382" + integrity sha512-opA+BEYTWdy1fFC3oOw30b0zc/KEuMtw+1pOiH5fEp+BGeA5xff7omSQTZeZJSDJszM471Vi+YY/ipRdRglAlQ== + +vscode-messenger-webview@^0.4.5: + version "0.4.5" + resolved "https://registry.yarnpkg.com/vscode-messenger-webview/-/vscode-messenger-webview-0.4.5.tgz#89767aee50038acb6a706f5427e0fc72d5aec7f5" + integrity sha512-pzGB6HoTfPszMF4HQG+u5WMJ959iGLmow6ehYVTZnZjZ+phBKEBtpTYAjJSNotyUfZJ58NCdq5+ZSvMgkAuAJw== + dependencies: + vscode-messenger-common "^0.4.5" + +vscode-messenger@^0.4.5: + version "0.4.5" + resolved "https://registry.yarnpkg.com/vscode-messenger/-/vscode-messenger-0.4.5.tgz#decf7475568ce3a3912479c29ff1e6eac61c7470" + integrity sha512-a6e54dpPRi/ITmVex49LGU6YXlqcuxGPlDPauvZig20G1D1/QD2E8GfhtvlTj3ml5aU/QV3LHghyepq3riy7sw== + dependencies: + vscode-messenger-common "^0.4.5" + +which@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" + +word-wrap@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.5.tgz#d2c45c6dd4fbce621a66f136cbe328afd0410b34" + integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA== + +"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrap-ansi@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214" + integrity sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ== + dependencies: + ansi-styles "^6.1.0" + string-width "^5.0.1" + strip-ansi "^7.0.1" + +yocto-queue@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" + integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== + +zwitch@^2.0.0: + version "2.0.4" + resolved "https://registry.yarnpkg.com/zwitch/-/zwitch-2.0.4.tgz#c827d4b0acb76fc3e685a4c6ec2902d51070e9d7" + integrity sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A== From 31746edd9fbae050d17fc0ff7dab0a268cc37208 Mon Sep 17 00:00:00 2001 From: Haydar Metin Date: Tue, 18 Mar 2025 11:19:18 +0100 Subject: [PATCH 2/4] Fix provided feedback --- .github/ISSUE_TEMPLATE/bug_report.md | 9 +- .github/ISSUE_TEMPLATE/feature_request.md | 3 +- .github/workflows/ci.yml | 8 +- LICENSE | 5 +- README.md | 51 +--- eslint.config.mjs | 57 +++- package.json | 29 +- prettier.config.mjs | 20 +- src/base/index.ts | 3 +- src/base/style-utils.ts | 21 ++ src/base/utils.ts | 8 +- src/{browser.ts => browser-types.ts} | 0 src/label/label-helpers.tsx | 67 ++++ src/tooltip/tooltip.tsx | 46 +-- src/tree/README.md | 158 ++++++++++ src/tree/browser/components/expand-icon.tsx | 19 +- .../browser/components/search-overlay.tsx | 13 +- .../components/treetable-navigator.tsx | 16 +- src/tree/browser/components/utils.tsx | 83 +---- src/tree/browser/index.ts | 2 +- src/tree/browser/tree.tsx | 286 ++++++++++-------- src/tree/common/index.ts | 2 +- src/tree/common/tree-converter.ts | 10 +- src/tree/common/tree-messenger-types.ts | 2 +- src/tree/common/tree-model-types.ts | 4 +- src/tree/common/tree-table-column-types.ts | 3 +- src/tree/vscode/index.ts | 2 +- src/tree/vscode/tree-data-provider.ts | 14 +- src/tree/vscode/tree-webview-view-provider.ts | 46 +-- src/{vscode.ts => vscode-types.ts} | 0 src/vscode/messenger.ts | 2 +- src/vscode/webview-types.ts | 6 +- style/tooltip/tooltip.css | 34 +-- style/tree/tree-common.css | 44 +-- style/tree/tree-search-overlay.css | 113 +++---- style/tree/tree.css | 95 +++--- yarn.lock | 124 +++++--- 37 files changed, 857 insertions(+), 548 deletions(-) create mode 100644 src/base/style-utils.ts rename src/{browser.ts => browser-types.ts} (100%) create mode 100644 src/label/label-helpers.tsx create mode 100644 src/tree/README.md rename src/{vscode.ts => vscode-types.ts} (100%) diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index 5576a8a..d1f8645 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -4,17 +4,17 @@ about: Create a report to help us improve. title: '' labels: '' assignees: '' - --- Type: Bug Report **Describe the bug** + - OS and Version: - VS Code Version: - Extension Version: @@ -24,20 +24,25 @@ Type: Bug Report **To Reproduce** Steps to reproduce the behavior: + 1. Go to '...' 2. Click on '....' 3. Scroll down to '....' 4. See error **Expected behavior** + **Code sample and logs** + - Code sample - `launch.json` **Screenshots** + **Additional context** + diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md index a62f305..61fb7a7 100644 --- a/.github/ISSUE_TEMPLATE/feature_request.md +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -4,13 +4,12 @@ about: Suggest an idea for this extension. title: '' labels: '' assignees: '' - --- Type: Feature Request diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 5e4be9e..2b5d3d9 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -16,15 +16,15 @@ jobs: name: Build runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 with: fetch-depth: 0 - - uses: actions/setup-node@v3 + - uses: actions/setup-node@v4 with: - node-version: 14.x + node-version: 20.x - name: Build env: GITHUB_TOKEN: ${{github.token}} run: | yarn install --ignore-scripts - yarn build + yarn build \ No newline at end of file diff --git a/LICENSE b/LICENSE index eec639c..077f0d5 100644 --- a/LICENSE +++ b/LICENSE @@ -1,8 +1,11 @@ Copyright 2024-2025 Arm Limited and EclipseSource + +MIT + Copyright 2017-2023 Marcel Ball and Arm Limited Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. \ No newline at end of file +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/README.md b/README.md index 75e6ab0..3fe3981 100644 --- a/README.md +++ b/README.md @@ -1,48 +1,29 @@ -# VSCode UI Components +# UI Components for Visual Studio Code Extensions -This is a VSCode components React library. +This is a VS Code components React library. ## Project Structure ``` -src/ -│── base/ # Shared functionality -│── vscode/ # VSCode specific functionality +src/ +│── base/ # Shared functionality +│── vscode/ # VS Code specific functionality -├── / -│ ├── browser/ # React specific code -│ ├── common/ # Shared code between browser and VSCode -│ ├── vscode/ # VSCode integration (converters, webview providers, etc.) +├── / +│ ├── browser/ # React specific code +│ ├── common/ # Shared code between browser and VS Code +│ ├── vscode/ # VS Code integration (converters, webview providers, etc.) -├── / -│ ├── *.tsx # Components without VSCode integration +├── / +│ ├── *.tsx # Components without VS Code integration ``` ## Installation `npm install @eclipse-cdt-cloud/vscode-ui-components` -## Usage - -```ts -// Webview -import { - messenger, - CDTTree -} from '@eclipse-cdt-cloud/vscode-ui-components/lib/browser'; -import React from 'react'; -import { createRoot } from 'react-dom/client'; - -messenger.start(); - -function App() { - return ; -} - -// Render the component -const container = document.getElementById('root'); -if (!container) { - throw new Error('Root element not found'); -} -createRoot(container).render(); -``` +## Components + +- [Tree](./src/tree/README.md): A component that combines tree structure functionality with table capabilities. + +For usage information, refer to the component's README. diff --git a/eslint.config.mjs b/eslint.config.mjs index 4d5180f..b122d9d 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -1,8 +1,16 @@ -// @ts-check +/********************************************************************************** + * Copyright (c) 2025 EclipseSource and others. + * + * This program and the accompanying materials are made available under the + * terms of the MIT License as outlined in the LICENSE file. + **********************************************************************************/ import globals from 'globals'; import eslint from '@eslint/js'; import tseslint from 'typescript-eslint'; +import header from 'eslint-plugin-header'; + +header.rules.header.meta.schema = false; export default tseslint.config( { @@ -52,9 +60,25 @@ export default tseslint.config( ], 'no-trailing-spaces': ['error'], - 'object-curly-spacing': ['error', 'always'], - - // TypeScript specific rules + 'object-curly-spacing': ['error', 'always'] + } + }, + { + name: 'typescript', + files: ['**/*.ts', '**/*.mts', '**/*.cts', '**/*.tsx'], + plugins: { + typescript: tseslint + }, + rules: { + '@typescript-eslint/explicit-member-accessibility': [ + 'error', + { + accessibility: 'explicit', + overrides: { + constructors: 'off' + } + } + ], '@typescript-eslint/no-this-alias': 'off', '@typescript-eslint/no-namespace': 'off', '@typescript-eslint/no-unused-vars': [ @@ -64,5 +88,30 @@ export default tseslint.config( } ] } + }, + { + name: 'header', + files: ['**/*.ts', '**/*.tsx', '**/*.js', '**/*.jsx', '**/*.mjs', '**/*.cjs'], + plugins: { + header + }, + rules: { + 'header/header': [ + 2, + 'block', + [ + { + pattern: '[\n\r]+ \\* Copyright \\([cC]\\) \\d{4}(-\\d{4})? .*[\n\r]+', + template: `********************************************************************************* +* Copyright (c) ${new Date().getFullYear()} Company and others. +* +* This program and the accompanying materials are made available under the +* terms of the MIT License as outlined in the LICENSE file. +*********************************************************************************` + } + ], + 2 + ] + } } ); diff --git a/package.json b/package.json index 4c78764..8b7b1a6 100644 --- a/package.json +++ b/package.json @@ -1,26 +1,22 @@ { "name": "@eclipse-cdt-cloud/vscode-ui-components", - "displayName": "VSCode UI Components", - "description": "VSCode UI Components for React", "version": "0.0.1", - "publisher": "eclipse-cdt", - "license": "MIT", + "description": "VS Code UI Components for React", "repository": "https://github.com/eclipse-cdt-cloud/vscode-ui-components", + "license": "MIT", "qna": "https://github.com/eclipse-cdt-cloud/vscode-ui-components/issues", + "publisher": "eclipse-cdt", "main": "./lib/index.js", "types": "./lib/index.d.ts", "files": [ "lib" ], - "engines": { - "node": ">=20" - }, "scripts": { - "prepare": "yarn clean && yarn build", - "clean": "rimraf ./lib ./node_modules/.tmp", "build": "tsc && yarn lint", - "watch": "tsc -w", - "lint": "eslint ." + "clean": "rimraf ./lib ./node_modules/.tmp", + "lint": "eslint .", + "prepare": "yarn clean && yarn build", + "watch": "tsc -w" }, "dependencies": { "@floating-ui/react": "^0.26.17", @@ -46,16 +42,19 @@ "@typescript-eslint/eslint-plugin": "^5.49.0", "@typescript-eslint/parser": "^5.49.0", "eslint": "^9.21.0", + "eslint-plugin-header": "^3.1.1", "globals": "^16.0.0", "prettier": "^3.5.2", - "react": "^18.2.0", - "react-dom": "^18.2.0", + "prettier-plugin-packagejson": "^2.5.8", + "rimraf": "^6.0.1", "typescript": "^5.7.3", - "typescript-eslint": "^8.25.0", - "rimraf": "^6.0.1" + "typescript-eslint": "^8.25.0" }, "peerDependencies": { "react": "^18.2.0", "react-dom": "^18.2.0" + }, + "engines": { + "node": ">=20" } } diff --git a/prettier.config.mjs b/prettier.config.mjs index 967eda0..71e401e 100644 --- a/prettier.config.mjs +++ b/prettier.config.mjs @@ -1,4 +1,9 @@ -// @ts-check +/********************************************************************************** + * Copyright (c) 2025 EclipseSource and others. + * + * This program and the accompanying materials are made available under the + * terms of the MIT License as outlined in the LICENSE file. + **********************************************************************************/ /** * @see https://prettier.io/docs/configuration @@ -11,6 +16,15 @@ export default { trailingComma: 'none', endOfLine: 'lf', printWidth: 140, - tabWidth: 4 + tabWidth: 4, + overrides: [ + { + files: ['*.json', '*.yml'], + options: { + printWidth: 140, + tabWidth: 4 + } + } + ], + plugins: ['prettier-plugin-packagejson'] }; - diff --git a/src/base/index.ts b/src/base/index.ts index a3c930c..b7bb3c8 100644 --- a/src/base/index.ts +++ b/src/base/index.ts @@ -1,8 +1,9 @@ /******************************************************************************** - * Copyright (C) 2024 EclipseSource and others. + * Copyright (C) 2024-2025 EclipseSource and others. * * This program and the accompanying materials are made available under the * terms of the MIT License as outlined in the LICENSE File ********************************************************************************/ export * from './utils'; +export * from './style-utils'; diff --git a/src/base/style-utils.ts b/src/base/style-utils.ts new file mode 100644 index 0000000..eba3ce0 --- /dev/null +++ b/src/base/style-utils.ts @@ -0,0 +1,21 @@ +/********************************************************************************** + * Copyright (c) 2025 Company and others. + * + * This program and the accompanying materials are made available under the + * terms of the MIT License as outlined in the LICENSE file. + **********************************************************************************/ + +export function classNames(...classes: (string | Record)[]): string { + return classes + .filter(c => c !== undefined) + .map(c => { + if (typeof c === 'string') { + return c; + } + + return Object.entries(c) + .filter(([, value]) => value) + .map(([key]) => key); + }) + .join(' '); +} diff --git a/src/base/utils.ts b/src/base/utils.ts index f43f45e..6b7ea94 100644 --- a/src/base/utils.ts +++ b/src/base/utils.ts @@ -1,5 +1,5 @@ /******************************************************************************** - * Copyright (C) 2024 EclipseSource and others. + * Copyright (C) 2024-2025 EclipseSource and others. * * This program and the accompanying materials are made available under the * terms of the MIT License as outlined in the LICENSE File @@ -11,7 +11,7 @@ export function findNestedValue( // eslint-disable-next-line @typescript-eslint/no-explicit-any obj: Record, - path: string | string[], + path: string | string[] ): T | undefined { const keys = Array.isArray(path) ? path : path.split('.'); return keys.reduce((acc, key) => acc?.[key], obj) as T | undefined; @@ -24,5 +24,5 @@ export function hasProperty(object: object, ...keys: (keyof return keys.every(key => key in object); } -export type WithRequired = T & { [P in K]-?: T[P] } -export type MaybePromise = T | Promise +export type WithRequired = T & { [P in K]-?: T[P] }; +export type MaybePromise = T | Promise; diff --git a/src/browser.ts b/src/browser-types.ts similarity index 100% rename from src/browser.ts rename to src/browser-types.ts diff --git a/src/label/label-helpers.tsx b/src/label/label-helpers.tsx new file mode 100644 index 0000000..fb86050 --- /dev/null +++ b/src/label/label-helpers.tsx @@ -0,0 +1,67 @@ +/********************************************************************************** + * Copyright (c) 2025 Company and others. + * + * This program and the accompanying materials are made available under the + * terms of the MIT License as outlined in the LICENSE file. + **********************************************************************************/ + +import React from 'react'; +import Markdown from 'react-markdown'; +import remarkGfm from 'remark-gfm'; +import { Tooltip, TooltipTrigger, TooltipContent } from '../tooltip/tooltip'; + +export function createHighlightedText(label?: string, highlights?: [number, number][]): React.JSX.Element { + if (label === undefined) { + return No label provided; + } + if (highlights === undefined || highlights.length === 0) { + return {label}; + } + + highlights.sort((a, b) => a[0] - b[0]); + + const result: React.JSX.Element[] = []; + let currentPosition = 0; + + highlights.forEach(([start, end], index) => { + if (currentPosition < start) { + result.push({label.slice(currentPosition, start)}); + } + result.push( + + {label.slice(start, end + 1)} + + ); + currentPosition = end + 1; + }); + + // Add any remaining text after the last highlight + if (currentPosition < label.length) { + result.push({label.slice(currentPosition)}); + } + + return ( +

+ {result} +
+ ); +} + +export function createLabelWithTooltip(child: React.JSX.Element, tooltip?: string): React.JSX.Element { + const label =
{child}
; + + if (tooltip === undefined) { + return label; + } + + return ( + + {label} + + + {tooltip} + + + + ); +} diff --git a/src/tooltip/tooltip.tsx b/src/tooltip/tooltip.tsx index abd17b0..a84196f 100644 --- a/src/tooltip/tooltip.tsx +++ b/src/tooltip/tooltip.tsx @@ -1,9 +1,10 @@ /******************************************************************************** - * Copyright (C) 2024 EclipseSource and others. + * Copyright (C) 2024-2025 EclipseSource and others. * * This program and the accompanying materials are made available under the * terms of the MIT License as outlined in the LICENSE File ********************************************************************************/ + import { FloatingPortal, autoUpdate, @@ -32,10 +33,7 @@ interface TooltipOptions { type ContextType = ReturnType | null; const TooltipContext = React.createContext(null); -function useTooltip({ - initialOpen = false, - placement = 'bottom', -}: TooltipOptions = {}) { +function useTooltip({ initialOpen = false, placement = 'bottom' }: TooltipOptions = {}) { const [open, setOpen] = React.useState(initialOpen); const floating = useFloating({ @@ -44,10 +42,7 @@ function useTooltip({ transform: false, onOpenChange: setOpen, whileElementsMounted: autoUpdate, - middleware: [ - offset(5), - shift({ padding: 5 }) - ] + middleware: [offset(5), shift({ padding: 5 })] }); const context = floating.context; @@ -85,24 +80,17 @@ const useTooltipContext = () => { return context; }; -export function Tooltip({ - children, - ...options -}: { children: React.ReactNode } & TooltipOptions) { +export function Tooltip({ children, ...options }: { children: React.ReactNode } & TooltipOptions) { // This can accept any props as options, e.g. `placement`, // or other positioning options. const tooltip = useTooltip(options); - return ( - - {children} - - ); + return {children}; } -export const TooltipTrigger = React.forwardRef< - HTMLElement, - React.HTMLProps & { asChild?: boolean } ->(function TooltipTrigger({ children, asChild = true, ...props }, propRef) { +export const TooltipTrigger = React.forwardRef & { asChild?: boolean }>(function TooltipTrigger( + { children, asChild = true, ...props }, + propRef +) { const context = useTooltipContext(); // eslint-disable-next-line @typescript-eslint/no-explicit-any const childrenRef = (children as any).ref; @@ -122,20 +110,16 @@ export const TooltipTrigger = React.forwardRef< } return ( -
+
{children}
); }); -export const TooltipContent = React.forwardRef< - HTMLDivElement, - React.HTMLProps ->(function TooltipContent({ style, ...props }, propRef) { +export const TooltipContent = React.forwardRef>(function TooltipContent( + { style, ...props }, + propRef +) { const context = useTooltipContext(); const ref = useMergeRefs([context.refs.setFloating, propRef]); diff --git a/src/tree/README.md b/src/tree/README.md new file mode 100644 index 0000000..fbe5954 --- /dev/null +++ b/src/tree/README.md @@ -0,0 +1,158 @@ +# Tree + +The Tree component is built on top of the Ant Tree and offers functionality for rendering both tree structures and tree tables (when multiple columns are provided). + +## Webview / React + +Data retrieval and provisioning for the `CDTTree` component are the developer's responsibility. +Refer to the component's properties for further details. + +```ts +// Webview +import { + messenger, + CDTTree +} from '@eclipse-cdt-cloud/vscode-ui-components/lib/browser-types'; +import React from 'react'; +import { createRoot } from 'react-dom/client'; + +messenger.start(); + +function App() { + // 1) Retrieve the data source (serialized DTOs) + const dtos = ... + // 2) Convert them to CDTTreeItems (recommended: use `CDTTreeResourceConverter`) + const dataSource = treeResourceConverter.convert(dtos, {...}) + return ; +} + +// Render the component +const container = document.getElementById('root'); +if (!container) { + throw new Error('Root element not found'); +} +createRoot(container).render(); +``` + +## VS Code Integration + +The component includes a VS Code integration for simplified webview setup. +Its API follows a similar structure to the [VS Code Tree View API](https://code.visualstudio.com/api/extension-guides/tree-view). + +### Required Interfaces/Classes + +- **`CDTTreeDataProvider`**: Provides the data to render, similar to the Tree View API. Since this data must be transferred to the webview, it should be serializable. +- **`CDTTreeWebviewViewProvider`**: Manages the webview setup; the developer is responsible for registering it with VS Code. +- **[Recommended] `CDTTreeResourceConverter`**: Converts serialized data into `CDTTreeItem`s, allowing separation between data transfer objects and rendered items. + +### Example Implementations + +#### `CDTTreeDataProvider` + +```ts +export class TreeDataProvider implements CDTTreeDataProvider { + constructor(protected context: vscode.ExtensionContext) {} + + async activate(webview: CDTTreeWebviewViewProvider): Promise { + this.context.subscriptions.push( + webview.onDidClickNode(async event => { + // Handle click + }), + webview.onDidExecuteCommand(async event => { + // Handle command + }), + webview.onDidToggleNode(event => { + // Handle toggle + }) + ); + } + + getColumnDefinitions(): CDTTreeTableColumnDefinition[] { + return [ + { type: 'string', field: 'key' }, + { type: 'string', field: 'value' }, + { type: 'action', field: 'actions' } + ]; + } + + async getSerializedRoots(): Promise { + const children = ... + return Promise.all(children.map(c => this.getSerializedData(c))); + } + + async getSerializedData(element: Example): Promise { + // Convert Example to ExampleDTO + } +} +``` + +#### `CDTTreeWebviewViewProvider` + +```ts +export class TreeTableWebView extends CDTTreeWebviewViewProvider { + public static viewType = ...; + + constructor( + protected dataProvider: CDTTreeDataProvider, + protected context: vscode.ExtensionContext + ) { + super(dataProvider, context); + } + + async activate(context: vscode.ExtensionContext): Promise { + context.subscriptions.push( + vscode.window.registerWebviewViewProvider(TreeTableWebView.viewType, this) + ); + } +} +``` + +#### `CDTTreeResourceConverter` + +```ts +export class ExampleConverter implements CDTTreeResourceConverter { + canHandle(resource: ExampleDTOs): boolean { + return ExampleDTO.is(resource); + } + + convert(resource: ExampleDTO, context: CDTTreeConverterContext): CDTTreeItem { + return CDTTreeItem.create({ + id: resource.id, + key: resource.id, + parent: context.parent, + resource, + expanded: context.expandedKeys.includes(resource.id), + columns: this.getColumns(resource, context) + }); + } + + private getColumns(resource: ExampleDTO, context: CDTTreeConverterContext): Record { + const value = this.getValue(resource, context); + + return { + key: { + type: 'string', + label: resource.key, + tooltip: this.getTooltipMarkdown(resource, context) + }, + value: { + type: 'string', + label: value, + tooltip: value + }, + actions: { + type: 'action', + commands: this.getCommands(resource, context) + } + }; + } + + private getCommands(resource: ExampleDTO, context: CDTTreeConverterContext): CDTTreeTableActionColumnCommand[] { + return [...]; + } + + private getTooltipMarkdown(resource: ExampleDTO, context: CDTTreeConverterContext): string { + return ...; + } +} +``` diff --git a/src/tree/browser/components/expand-icon.tsx b/src/tree/browser/components/expand-icon.tsx index a421028..b6b424b 100644 --- a/src/tree/browser/components/expand-icon.tsx +++ b/src/tree/browser/components/expand-icon.tsx @@ -1,15 +1,15 @@ /******************************************************************************** - * Copyright (C) 2024 EclipseSource and others. + * Copyright (C) 2024-2025 EclipseSource and others. * * This program and the accompanying materials are made available under the * terms of the MIT License as outlined in the LICENSE File ********************************************************************************/ + import type { CDTTreeItemResource, CDTTreeItem } from '../../common/tree-model-types'; -import { classNames } from './utils'; +import { classNames } from '../../../base'; import React from 'react'; export interface RenderExpandIconProps { - prefixCls: string; expanded: boolean; record: RecordType; expandable: boolean; @@ -18,7 +18,12 @@ export interface RenderExpandIconProps { export type TriggerEventHandler = (record: RecordType, event: React.MouseEvent) => void; -export function ExpandIcon({ expanded, onExpand, record, expandable }: RenderExpandIconProps>): React.ReactElement { +export function ExpandIcon({ + expanded, + onExpand, + record, + expandable +}: RenderExpandIconProps>): React.ReactElement { if (!expandable) { // simulate spacing to the left that we gain through expand icon so that leaf items look correctly intended return ; @@ -34,10 +39,12 @@ export function ExpandIcon({ expanded, onExpand,
{ if (event.key === 'Enter' || event.key === ' ') doExpand(event as unknown as React.MouseEvent); }} + onKeyDown={event => { + if (event.key === 'Enter' || event.key === ' ') doExpand(event as unknown as React.MouseEvent); + }} >
); } diff --git a/src/tree/browser/components/search-overlay.tsx b/src/tree/browser/components/search-overlay.tsx index bc1658c..772d577 100644 --- a/src/tree/browser/components/search-overlay.tsx +++ b/src/tree/browser/components/search-overlay.tsx @@ -1,5 +1,5 @@ /********************************************************************* - * Copyright (c) 2024 Arm Limited and others + * Copyright (c) 2024-2025 Arm Limited and others * * This program and the accompanying materials are made available under the * terms of the MIT License as outlined in the LICENSE File @@ -80,9 +80,12 @@ export const SearchOverlay = React.forwardRef hide: () => hide() })); - return (
- - hide()} /> -
+ return ( +
+ + + hide()} /> + +
); }); diff --git a/src/tree/browser/components/treetable-navigator.tsx b/src/tree/browser/components/treetable-navigator.tsx index eb11c41..2dfc3ca 100644 --- a/src/tree/browser/components/treetable-navigator.tsx +++ b/src/tree/browser/components/treetable-navigator.tsx @@ -1,5 +1,5 @@ /******************************************************************************** - * Copyright (C) 2024 EclipseSource and others. + * Copyright (C) 2024-2025 EclipseSource and others. * * This program and the accompanying materials are made available under the * terms of the MIT License as outlined in the LICENSE File @@ -22,7 +22,7 @@ export interface TreeNavigatorProps { export class TreeNavigator { constructor(private readonly props: TreeNavigatorProps) {} - next(node: CDTTreeItem) { + public next(node: CDTTreeItem) { if (node.children && node.children.length > 0 && this.props.expandedRowKeys.includes(node.id)) { // Go deeper this.select(node.children[0]); @@ -40,7 +40,7 @@ export class TreeNavigator } } - nextPage() { + public nextPage() { this.scrollRelative(this.visibleDomElementCount); } @@ -64,7 +64,7 @@ export class TreeNavigator } } - previous(node: CDTTreeItem) { + public previous(node: CDTTreeItem) { let prevNode = this.getPrevious(node); if (prevNode) { // Go deeper to the last child if the previous node has children and is expanded @@ -81,7 +81,7 @@ export class TreeNavigator } } - previousPage() { + public previousPage() { this.scrollRelative(-(this.visibleDomElementCount - 1)); } @@ -91,7 +91,7 @@ export class TreeNavigator return siblings[index - 1]; } - toggle(node: CDTTreeItem) { + public toggle(node: CDTTreeItem) { if (this.props.expandedRowKeys.includes(node.id)) { this.collapse(node); } else { @@ -99,7 +99,7 @@ export class TreeNavigator } } - expand(node: CDTTreeItem) { + public expand(node: CDTTreeItem) { if (node.children && node.children.length > 0) { if (this.props.expandedRowKeys.includes(node.id)) { this.next(node); @@ -109,7 +109,7 @@ export class TreeNavigator } } - collapse(node: CDTTreeItem) { + public collapse(node: CDTTreeItem) { if (node.children && node.children.length > 0 && this.props.expandedRowKeys.includes(node.id)) { this.props.expand(false, node as CDTTreeItem); } else if (node.parent && !CDTTreeItem.isRoot(node.parent)) { diff --git a/src/tree/browser/components/utils.tsx b/src/tree/browser/components/utils.tsx index 54a2e1e..3e999d5 100644 --- a/src/tree/browser/components/utils.tsx +++ b/src/tree/browser/components/utils.tsx @@ -1,74 +1,11 @@ /******************************************************************************** - * Copyright (C) 2024 EclipseSource and others. + * Copyright (C) 2024-2025 EclipseSource and others. * * This program and the accompanying materials are made available under the * terms of the MIT License as outlined in the LICENSE File ********************************************************************************/ -import React from 'react'; -import Markdown from 'react-markdown'; -import remarkGfm from 'remark-gfm'; -import { Tooltip, TooltipTrigger, TooltipContent } from '../../../tooltip/tooltip'; -import { CDTTreeItemResource, CDTTreeItem, CDTTreeTableStringColumn } from '../../common'; - -export function classNames(...classes: (string | Record)[]): string { - return classes.filter(c => c !== undefined).map(c => { - if (typeof c === 'string') { - return c; - } - - return Object.entries(c).filter(([, value]) => value).map(([key]) => key); - }).join(' '); -} - -export function createHighlightedText(label?: string, highlights?: [number, number][]): React.JSX.Element { - if (label === undefined) { - return No label provided; - } - if (highlights === undefined || highlights.length === 0) { - return {label}; - } - - highlights.sort((a, b) => a[0] - b[0]); - - const result: React.JSX.Element[] = []; - let currentPosition = 0; - - highlights.forEach(([start, end], index) => { - if (currentPosition < start) { - result.push({label.slice(currentPosition, start)}); - } - result.push({label.slice(start, end + 1)}); - currentPosition = end + 1; - }); - - // Add any remaining text after the last highlight - if (currentPosition < label.length) { - result.push({label.slice(currentPosition)}); - } - - return
- {result} -
; -} -export function createLabelWithTooltip(child: React.JSX.Element, tooltip?: string): React.JSX.Element { - const label =
- {child} -
; - - if (tooltip === undefined) { - return label; - } - - return - - {label} - - - {tooltip} - - ; -} +import { CDTTreeItemResource, CDTTreeItem, CDTTreeTableStringColumn } from '../../common'; /** * Recursively filters the tree to include items that match the search text @@ -85,19 +22,19 @@ export function filterTree( // Check if the current item matches the search const matches = Object.values(item.columns ?? {}) .filter(column => column.type === 'string') - .some(column => - ((column as CDTTreeTableStringColumn).label || '').toLowerCase().includes(searchText.toLowerCase()) - ); + .some(column => ((column as CDTTreeTableStringColumn).label || '').toLowerCase().includes(searchText.toLowerCase())); if (matches) { // item matches: show all or only matching children const children = options.filterChildren - ? item.children ? filterTree(item.children, searchText, options) : [] - : item.children ?? []; + ? item.children + ? filterTree(item.children, searchText, options) + : [] + : (item.children ?? []); matching.push({ ...item, children: children.length > 0 ? children : undefined, - matching: true, + matching: true }); } else if (item.children) { // item does not match: check if a child matches as we need to show the item as ancestor in that case @@ -168,9 +105,7 @@ export function traverseTree>( return result; } -export function getAncestors( - item: CDTTreeItem -): CDTTreeItem[] { +export function getAncestors(item: CDTTreeItem): CDTTreeItem[] { const ancestors: CDTTreeItem[] = []; let current: CDTTreeItem | undefined = item.parent; while (current) { diff --git a/src/tree/browser/index.ts b/src/tree/browser/index.ts index c1a1552..0abd601 100644 --- a/src/tree/browser/index.ts +++ b/src/tree/browser/index.ts @@ -1,5 +1,5 @@ /******************************************************************************** - * Copyright (C) 2024 EclipseSource and others. + * Copyright (C) 2025 EclipseSource and others. * * This program and the accompanying materials are made available under the * terms of the MIT License as outlined in the LICENSE File diff --git a/src/tree/browser/tree.tsx b/src/tree/browser/tree.tsx index 5d8e73b..cea82d9 100644 --- a/src/tree/browser/tree.tsx +++ b/src/tree/browser/tree.tsx @@ -1,5 +1,5 @@ /******************************************************************************** - * Copyright (C) 2024 EclipseSource and others. + * Copyright (C) 2024-2025 EclipseSource and others. * * This program and the accompanying materials are made available under the * terms of the MIT License as outlined in the LICENSE File @@ -15,10 +15,18 @@ import { debounce } from 'throttle-debounce'; import { ExpandIcon } from './components/expand-icon'; import { SearchOverlay } from './components/search-overlay'; import { TreeNavigator } from './components/treetable-navigator'; -import { classNames, createHighlightedText, createLabelWithTooltip, filterTree, getAncestors, traverseTree } from './components/utils'; -import { findNestedValue } from '../../base'; -import { type CDTTreeItemResource, type CDTTreeTableColumnDefinition, type CDTTreeItem, CDTTreeWebviewContext, type CDTTreeTableStringColumn, type CDTTreeTableActionColumn } from '../common'; +import { filterTree, getAncestors, traverseTree } from './components/utils'; +import { classNames, findNestedValue } from '../../base'; +import { + type CDTTreeItemResource, + type CDTTreeTableColumnDefinition, + type CDTTreeItem, + CDTTreeWebviewContext, + type CDTTreeTableStringColumn, + type CDTTreeTableActionColumn +} from '../common'; import type { CommandDefinition } from '../../vscode/webview-types'; +import { createHighlightedText, createLabelWithTooltip } from '../../label/label-helpers'; /** * Component to render a tree table. @@ -26,6 +34,7 @@ import type { CommandDefinition } from '../../vscode/webview-types'; export type CDTTreeProps = { /** * Information about the columns to be rendered. + * If a single column is provided, then it will be rendered as a tree. */ columnDefinitions?: CDTTreeTableColumnDefinition[]; /** @@ -33,7 +42,7 @@ export type CDTTreeProps = */ dataSource?: CDTTreeItem[]; /** - * Function to sort the data source. + * Function to sort the data source. */ dataSourceSorter?: (dataSource: CDTTreeItem[]) => CDTTreeItem[]; /** @@ -48,7 +57,7 @@ export type CDTTreeProps = * Callback to be called when a row is expanded or collapsed. */ onExpand?: ExpandableConfig>['onExpand']; - }, + }; /** * Configuration for the pinning of the tree table. */ @@ -61,7 +70,7 @@ export type CDTTreeProps = * Callback to be called when a row is pinned or unpinned. */ onPin?: (event: React.UIEvent, pinned: boolean, record: CDTTreeItem) => void; - } + }; /** * Configuration for the actions of the tree table. */ @@ -70,7 +79,7 @@ export type CDTTreeProps = * Callback to be called when an action is triggered. */ onAction?: (event: React.UIEvent, command: CommandDefinition, value: unknown, record: CDTTreeItem) => void; - } + }; }; interface BodyRowProps extends React.HTMLAttributes { @@ -79,14 +88,18 @@ interface BodyRowProps extends React.HTMLAttributes { } const BodyRow = React.forwardRef((props, ref) => { - // Support VSCode context menu items + // Support VS Code context menu items return (
); }); @@ -108,7 +121,7 @@ function useWindowSize() { return size; } -export function CDTTree(props: CDTTreeProps): React.ReactElement { +export function CDTTree(props: CDTTreeProps): React.ReactElement { const { width, height } = useWindowSize(); const [globalSearchText, setGlobalSearchText] = React.useState(); const globalSearchRef = React.useRef(null); @@ -151,12 +164,15 @@ export function CDTTree(props: CDTTreeProps): const [selection, setSelection] = React.useState(); - const selectRow = React.useCallback((record: CDTTreeItem) => { - // Single select only - if (selection?.key !== record.key) { - setSelection(record); - } - }, [selection]); + const selectRow = React.useCallback( + (record: CDTTreeItem) => { + // Single select only + if (selection?.key !== record.key) { + setSelection(record); + } + }, + [selection] + ); // ==== Expansion ==== @@ -175,7 +191,6 @@ export function CDTTree(props: CDTTreeProps): return Array.from(expanded); }, [filteredData, globalSearchText, props.expansion?.expandedRowKeys, selection, autoSelectRowRef.current]); - const handleExpand = React.useCallback( (expanded: boolean, record: CDTTreeItem) => { props.expansion?.onExpand?.(expanded, record); @@ -211,81 +226,85 @@ export function CDTTree(props: CDTTreeProps): // ==== Navigation ==== - const navigator = React.useMemo(() => new TreeNavigator({ - ref, - rowIndex: dataSourceIndex.rowIndex, - expandedRowKeys, - expand: handleExpand, - select: selectRow - }), [ref, dataSourceIndex.rowIndex, expandedRowKeys, handleExpand, selectRow]); - - const onTableKeyDown = React.useCallback((event: React.KeyboardEvent) => { - const selectedKey = selection?.key; - if (!selectedKey) { - return; - } - - const record = dataSourceIndex.keyIndex.get(selectedKey); - if (!record) { - return; - } + const navigator = React.useMemo( + () => + new TreeNavigator({ + ref, + rowIndex: dataSourceIndex.rowIndex, + expandedRowKeys, + expand: handleExpand, + select: selectRow + }), + [ref, dataSourceIndex.rowIndex, expandedRowKeys, handleExpand, selectRow] + ); - switch (event.key) { - case 'ArrowDown': { - navigator.next(record); - break; - } - case 'ArrowUp': { - navigator.previous(record); - break; - } - case 'ArrowLeft': { - navigator.collapse(record); - break; - } - case 'ArrowRight': { - navigator.expand(record); - break; - } - case 'Enter': { - navigator.toggle(record); - break; - } - case ' ': { - navigator.toggle(record); - break; + const onTableKeyDown = React.useCallback( + (event: React.KeyboardEvent) => { + const selectedKey = selection?.key; + if (!selectedKey) { + return; } - case 'PageUp': { - navigator.previousPage(); - break; + + const record = dataSourceIndex.keyIndex.get(selectedKey); + if (!record) { + return; } - case 'PageDown': { - navigator.nextPage(); - break; + + switch (event.key) { + case 'ArrowDown': { + navigator.next(record); + break; + } + case 'ArrowUp': { + navigator.previous(record); + break; + } + case 'ArrowLeft': { + navigator.collapse(record); + break; + } + case 'ArrowRight': { + navigator.expand(record); + break; + } + case 'Enter': { + navigator.toggle(record); + break; + } + case ' ': { + navigator.toggle(record); + break; + } + case 'PageUp': { + navigator.previousPage(); + break; + } + case 'PageDown': { + navigator.nextPage(); + break; + } } - } - }, [selection, dataSourceIndex]); + }, + [selection, dataSourceIndex] + ); // ==== Renderers ==== - const renderStringColumn = React.useCallback( - (label: string, item: CDTTreeItem, column: CDTTreeTableStringColumn) => { - const icon = column.icon ? : null; - let content = createHighlightedText(label, column.highlight); + const renderStringColumn = React.useCallback((label: string, item: CDTTreeItem, column: CDTTreeTableStringColumn) => { + const icon = column.icon ? : null; + let content = createHighlightedText(label, column.highlight); - if (column.tooltip) { - content = createLabelWithTooltip({content}, column.tooltip); - } + if (column.tooltip) { + content = createLabelWithTooltip({content}, column.tooltip); + } - return ( -
- {icon} - {content} -
- ); - }, - [] - ); + return ( +
+ {icon} + {content} +
+ ); + }, []); const renderActionColumn = React.useCallback( (column: CDTTreeTableActionColumn | undefined, record: CDTTreeItem) => { @@ -297,27 +316,31 @@ export function CDTTree(props: CDTTreeProps): key={record.pinned ? 'unpin' : 'pin'} title={record.pinned ? 'Unpin row' : 'Pin row'} className={`codicon ${record.pinned ? 'codicon-pin' : 'codicon-pinned'}`} - onClick={(event) => props.pin?.onPin?.(event, !record.pinned, record)} + onClick={event => props.pin?.onPin?.(event, !record.pinned, record)} aria-label={record.pinned ? 'Unpin row' : 'Pin row'} - role="button" + role='button' tabIndex={0} - onKeyDown={(event) => { if (event.key === 'Enter') props.pin?.onPin?.(event, !record.pinned, record); }} + onKeyDown={event => { + if (event.key === 'Enter') props.pin?.onPin?.(event, !record.pinned, record); + }} > ); } if (column?.commands) { - column.commands.forEach((command) => { + column.commands.forEach(command => { actions.push( props.action?.onAction?.(event, command, command.value, record)} + onClick={event => props.action?.onAction?.(event, command, command.value, record)} aria-label={command.title} - role="button" + role='button' tabIndex={0} - onKeyDown={(event) => { if (event.key === 'Enter') props.action?.onAction?.(event, command, command.value, record); }} + onKeyDown={event => { + if (event.key === 'Enter') props.action?.onAction?.(event, command, command.value, record); + }} > ); }); @@ -346,7 +369,7 @@ export function CDTTree(props: CDTTreeProps): return renderStringColumn(label, record, column); }, - onCell: (record) => { + onCell: record => { const column = findNestedValue(record, ['columns', columnDefinition.field]); if (!column) { @@ -373,7 +396,7 @@ export function CDTTree(props: CDTTreeProps): title: columnDefinition.field, dataIndex: ['columns', columnDefinition.field], width: 16 * 5, - render: renderActionColumn, + render: renderActionColumn }; } @@ -460,42 +483,45 @@ export function CDTTree(props: CDTTreeProps): // ==== Return ==== - return
- -
No data available.
} - > -
+ +
No data available.
} > - > - ref={tblRef} - columns={columns} - dataSource={filteredData} - components={{ body: { row: BodyRow } }} - virtual - scroll={{ x: width, y: height - 2 }} - showHeader={false} - pagination={false} - rowClassName={(record) => classNames({ 'ant-table-row-selected': record.key === selection?.key, 'ant-table-row-matched': record.matching ?? false })} - onRow={(record) => ({ - record, - onClick: (event) => onRowClick(record, event), - })} - expandable={{ - expandIcon: props => , - showExpandColumn: true, - expandedRowKeys: expandedRowKeys, - onExpand: handleExpand - }} - /> -
-
-
; +
+ > + ref={tblRef} + columns={columns} + dataSource={filteredData} + components={{ body: { row: BodyRow } }} + virtual + scroll={{ x: width, y: height - 2 }} + showHeader={false} + pagination={false} + rowClassName={record => + classNames({ + 'ant-table-row-selected': record.key === selection?.key, + 'ant-table-row-matched': record.matching ?? false + }) + } + onRow={record => ({ + record, + onClick: event => onRowClick(record, event) + })} + expandable={{ + expandIcon: props => , + showExpandColumn: true, + expandedRowKeys: expandedRowKeys, + onExpand: handleExpand + }} + /> +
+ +
+ ); } diff --git a/src/tree/common/index.ts b/src/tree/common/index.ts index f1bb810..1d9d0d4 100644 --- a/src/tree/common/index.ts +++ b/src/tree/common/index.ts @@ -1,5 +1,5 @@ /******************************************************************************** - * Copyright (C) 2024 EclipseSource and others. + * Copyright (C) 2024-2025 EclipseSource and others. * * This program and the accompanying materials are made available under the * terms of the MIT License as outlined in the LICENSE File diff --git a/src/tree/common/tree-converter.ts b/src/tree/common/tree-converter.ts index 679ab1e..eb7cb1d 100644 --- a/src/tree/common/tree-converter.ts +++ b/src/tree/common/tree-converter.ts @@ -1,5 +1,5 @@ /******************************************************************************** - * Copyright (C) 2024 EclipseSource and others. + * Copyright (C) 2024-2025 EclipseSource and others. * * This program and the accompanying materials are made available under the * terms of the MIT License as outlined in the LICENSE File @@ -13,21 +13,21 @@ import type { CDTTreeItemResource, CDTTreeItem } from './tree-model-types'; * It will be propagated to all TreeResourceConverters. */ export interface CDTTreeConverterContext { - parent?: CDTTreeItem, + parent?: CDTTreeItem; /** * The expanded keys of the tree. This is used to determine if a node should be expanded or not. */ - expandedKeys: string[], + expandedKeys: string[]; /** * The pinned keys of the tree. This is used to determine if a node should be pinned or not. */ - pinnedKeys: string[] + pinnedKeys: string[]; /** * A map of all resources that are currently in the tree. * This can be useful to access parent resources. * It is filled while converting the tree. */ - resourceMap: Map + resourceMap: Map; } /** diff --git a/src/tree/common/tree-messenger-types.ts b/src/tree/common/tree-messenger-types.ts index 9766500..8e90bfe 100644 --- a/src/tree/common/tree-messenger-types.ts +++ b/src/tree/common/tree-messenger-types.ts @@ -1,5 +1,5 @@ /******************************************************************************** - * Copyright (C) 2024 Arm Limited and others. + * Copyright (C) 2024-2025 Arm Limited and others. * * This program and the accompanying materials are made available under the * terms of the MIT License as outlined in the LICENSE File diff --git a/src/tree/common/tree-model-types.ts b/src/tree/common/tree-model-types.ts index e40656f..cf5b272 100644 --- a/src/tree/common/tree-model-types.ts +++ b/src/tree/common/tree-model-types.ts @@ -1,5 +1,5 @@ /******************************************************************************** - * Copyright (C) 2024 Arm Limited and others. + * Copyright (C) 2024-2025 EclipseSource, Arm Limited and others. * * This program and the accompanying materials are made available under the * terms of the MIT License as outlined in the LICENSE File @@ -18,7 +18,7 @@ export interface CDTTreeItemResource { * A tree item that is used in the CDT tree view. */ export interface CDTTreeItem { - __type: 'CDTTreeItem' + __type: 'CDTTreeItem'; id: string; key: string; parent?: CDTTreeItem; diff --git a/src/tree/common/tree-table-column-types.ts b/src/tree/common/tree-table-column-types.ts index 1dcc2e3..d32a7d3 100644 --- a/src/tree/common/tree-table-column-types.ts +++ b/src/tree/common/tree-table-column-types.ts @@ -1,5 +1,5 @@ /******************************************************************************** - * Copyright (C) 2024 Arm Limited and others. + * Copyright (C) 2024-2025 Arm Limited and others. * * This program and the accompanying materials are made available under the * terms of the MIT License as outlined in the LICENSE File @@ -7,7 +7,6 @@ import type { CommandDefinition } from '../../vscode/webview-types'; - /** * A column definition for a tree table. * This is used to define the columns that are displayed in the tree table. diff --git a/src/tree/vscode/index.ts b/src/tree/vscode/index.ts index b0a1c88..a7d9e7b 100644 --- a/src/tree/vscode/index.ts +++ b/src/tree/vscode/index.ts @@ -1,5 +1,5 @@ /******************************************************************************** - * Copyright (C) 2024 EclipseSource and others. + * Copyright (C) 2024-2025 EclipseSource and others. * * This program and the accompanying materials are made available under the * terms of the MIT License as outlined in the LICENSE File diff --git a/src/tree/vscode/tree-data-provider.ts b/src/tree/vscode/tree-data-provider.ts index e64e741..89e8a91 100644 --- a/src/tree/vscode/tree-data-provider.ts +++ b/src/tree/vscode/tree-data-provider.ts @@ -1,5 +1,5 @@ /******************************************************************************** - * Copyright (C) 2024 EclipseSource and others. + * Copyright (C) 2024-2025 EclipseSource and others. * * This program and the accompanying materials are made available under the * terms of the MIT License as outlined in the LICENSE File @@ -14,11 +14,19 @@ import type { MaybePromise } from '../../base/utils'; * * @param TNode The type of the tree nodes in the domain model. * @param TSerializedNode The type of the serialized tree nodes. Those are the nodes that - * are actually send to the webview to be display in the tree. + * are actually send to the webview to be displayed in the tree. */ export interface CDTTreeDataProvider { + /** + * An event that is fired when the tree is disposed / terminated. + */ onDidTerminate: vscode.Event>; + + /** + * An event that is fired when the tree data changes. + */ onDidChangeTreeData: vscode.Event>; + /** * Get the column definitions for the tree table. */ @@ -30,7 +38,7 @@ export interface CDTTreeDataProvider { getSerializedRoots(): MaybePromise; /** - * Get the children of the given element. + * Get the serialization of the given element. */ getSerializedData(element: TNode): MaybePromise; } diff --git a/src/tree/vscode/tree-webview-view-provider.ts b/src/tree/vscode/tree-webview-view-provider.ts index c3a0bd4..f8f09b3 100644 --- a/src/tree/vscode/tree-webview-view-provider.ts +++ b/src/tree/vscode/tree-webview-view-provider.ts @@ -1,5 +1,5 @@ /******************************************************************************** - * Copyright (C) 2024 Arm Limited and others. + * Copyright (C) 2024-2025 Arm Limited and others. * * This program and the accompanying materials are made available under the * terms of the MIT License as outlined in the LICENSE File @@ -12,7 +12,6 @@ import { CDTTreeExecuteCommand, CDTTreeMessengerType, CDTTreeNotification } from import type { CDTTreeDataProvider } from './tree-data-provider'; export abstract class CDTTreeWebviewViewProvider implements vscode.WebviewViewProvider { - protected onDidToggleNodeEvent = new vscode.EventEmitter>(); public readonly onDidToggleNode = this.onDidToggleNodeEvent.event; protected onDidExecuteCommandEvent = new vscode.EventEmitter>(); @@ -31,11 +30,13 @@ export abstract class CDTTreeWebviewViewProvider implements vscode.Webvie protected readonly dataProvider: CDTTreeDataProvider, protected readonly context: vscode.ExtensionContext, protected readonly messenger = new Messenger({ ignoreHiddenViews: false, debugLog: true }) - ) { - } + ) {} - public async resolveWebviewView(webviewView: vscode.WebviewView, _context: vscode.WebviewViewResolveContext, - _token: vscode.CancellationToken): Promise { + public async resolveWebviewView( + webviewView: vscode.WebviewView, + _context: vscode.WebviewViewResolveContext, + _token: vscode.CancellationToken + ): Promise { this._view = webviewView; const baseExtensionUriString = this.extensionUri.toString(); @@ -45,7 +46,7 @@ export abstract class CDTTreeWebviewViewProvider implements vscode.Webvie // Allow scripts in the webview webviewView.webview.options = { - enableScripts: true, // enable scripts in the webview + enableScripts: true, // enable scripts in the webview localResourceRoots: [distPathUri, mediaPathUri, nodeModulesPathUri] // restrict extension's local file access }; @@ -63,13 +64,10 @@ export abstract class CDTTreeWebviewViewProvider implements vscode.Webvie } protected async getWebviewContent(webview: vscode.Webview, extensionUri: vscode.Uri): Promise { - const codiconsUri = webview.asWebviewUri(vscode.Uri.joinPath(extensionUri, 'node_modules', '@vscode/codicons', 'dist', 'codicon.css')); - const mainUri = webview.asWebviewUri(vscode.Uri.joinPath( - extensionUri, - 'dist', - 'views', - 'treeWebView.js' - )); + const codiconsUri = webview.asWebviewUri( + vscode.Uri.joinPath(extensionUri, 'node_modules', '@vscode/codicons', 'dist', 'codicon.css') + ); + const mainUri = webview.asWebviewUri(vscode.Uri.joinPath(extensionUri, 'dist', 'views', 'treeWebView.js')); return ` @@ -89,27 +87,33 @@ export abstract class CDTTreeWebviewViewProvider implements vscode.Webvie } protected setWebviewMessageListener(webview: vscode.WebviewView): void { - const participant = this.participant = this.messenger.registerWebviewView(webview); + const participant = (this.participant = this.messenger.registerWebviewView(webview)); if (this.participant === undefined) { return; } const disposables = [ - this.dataProvider.onDidTerminate(async (event) => { + this.dataProvider.onDidTerminate(async event => { if (event.remaining > 0) { this.refresh(); } }), - this.dataProvider.onDidChangeTreeData(async (event) => { + this.dataProvider.onDidChangeTreeData(async event => { if (event.context?.resync !== false) { this.refresh(); } }), this.messenger.onNotification(CDTTreeMessengerType.ready, () => this.onReady(), { sender: participant }), - this.messenger.onNotification(CDTTreeMessengerType.executeCommand, (event) => this.onDidExecuteCommandEvent.fire(event), { sender: participant }), - this.messenger.onNotification(CDTTreeMessengerType.toggleNode, event => this.onDidToggleNodeEvent.fire(event), { sender: participant }), - this.messenger.onNotification(CDTTreeMessengerType.clickNode, event => this.onDidClickNodeEvent.fire(event), { sender: participant }), + this.messenger.onNotification(CDTTreeMessengerType.executeCommand, event => this.onDidExecuteCommandEvent.fire(event), { + sender: participant + }), + this.messenger.onNotification(CDTTreeMessengerType.toggleNode, event => this.onDidToggleNodeEvent.fire(event), { + sender: participant + }), + this.messenger.onNotification(CDTTreeMessengerType.clickNode, event => this.onDidClickNodeEvent.fire(event), { + sender: participant + }) ]; webview.onDidDispose(() => disposables.forEach(disposible => disposible.dispose())); @@ -130,7 +134,7 @@ export abstract class CDTTreeWebviewViewProvider implements vscode.Webvie this.sendNotification(CDTTreeMessengerType.updateState, { columnFields, items }); } - sendNotification

(type: NotificationType

, params?: P): void { + public sendNotification

(type: NotificationType

, params?: P): void { if (this.participant) { this.messenger.sendNotification(type, this.participant, params); } diff --git a/src/vscode.ts b/src/vscode-types.ts similarity index 100% rename from src/vscode.ts rename to src/vscode-types.ts diff --git a/src/vscode/messenger.ts b/src/vscode/messenger.ts index 77270b7..05e6793 100644 --- a/src/vscode/messenger.ts +++ b/src/vscode/messenger.ts @@ -1,5 +1,5 @@ /******************************************************************************** - * Copyright (C) 2024 EclipseSource and others. + * Copyright (C) 2024-2025 EclipseSource and others. * * This program and the accompanying materials are made available under the * terms of the MIT License as outlined in the LICENSE File diff --git a/src/vscode/webview-types.ts b/src/vscode/webview-types.ts index 5dbe725..a6623fb 100644 --- a/src/vscode/webview-types.ts +++ b/src/vscode/webview-types.ts @@ -1,5 +1,5 @@ /******************************************************************************** - * Copyright (C) 2023-2024 Marcel Ball, Arm Limited and others. + * Copyright (C) 2023-2025 Marcel Ball, Arm Limited and others. * * This program and the accompanying materials are made available under the * terms of the MIT License as outlined in the LICENSE File @@ -13,14 +13,14 @@ export namespace VSCodeContext { export function create(context: object): VSCodeContext { return { 'data-vscode-context': JSON.stringify({ - ...context, + ...context }) }; } } /** - * A command definition that is manually inserted into the DOM and not by VSCode. + * A command definition that is manually inserted into the DOM and not by VS Code. */ export interface CommandDefinition { commandId: string; diff --git a/style/tooltip/tooltip.css b/style/tooltip/tooltip.css index ad2e3b9..60cdde4 100644 --- a/style/tooltip/tooltip.css +++ b/style/tooltip/tooltip.css @@ -1,28 +1,28 @@ /******************************************************************************** - * Copyright (C) 2024 EclipseSource and others. + * Copyright (C) 2024-2025 EclipseSource and others. * * This program and the accompanying materials are made available under the * terms of the MIT License as outlined in the LICENSE File ********************************************************************************/ .tooltip { - background: var(--vscode-editorHoverWidget-background); - border: 1px solid var(--vscode-editorHoverWidget-border); - border-radius: 3px; - box-shadow: 0 2px 8px var(--vscode-widget-shadow); - max-width: 700px; - max-height: 375px; - padding: 0; + background: var(--vscode-editorHoverWidget-background); + border: 1px solid var(--vscode-editorHoverWidget-border); + border-radius: 3px; + box-shadow: 0 2px 8px var(--vscode-widget-shadow); + max-width: 700px; + max-height: 375px; + padding: 0; } .tooltip .tooltip-content { - background: var(--vscode-editorHoverWidget-background); - color: var(--vscode-editorHoverWidget-foreground); - font-size: 12px; - padding: 2px 8px; - max-width: var(--vscode-hover-maxWidth, 500px); - word-wrap: break-word; - white-space: unset; - display: block; - flex-direction: column; + background: var(--vscode-editorHoverWidget-background); + color: var(--vscode-editorHoverWidget-foreground); + font-size: 12px; + padding: 2px 8px; + max-width: var(--vscode-hover-maxWidth, 500px); + word-wrap: break-word; + white-space: unset; + display: block; + flex-direction: column; } diff --git a/style/tree/tree-common.css b/style/tree/tree-common.css index 7ca2743..5906b8f 100644 --- a/style/tree/tree-common.css +++ b/style/tree/tree-common.css @@ -1,48 +1,48 @@ /******************************************************************************** - * Copyright (C) 2024 EclipseSource and others. + * Copyright (C) 2024-2025 EclipseSource and others. * * This program and the accompanying materials are made available under the * terms of the MIT License as outlined in the LICENSE File ********************************************************************************/ .tree-label { - overflow: hidden; - text-overflow: ellipsis; - white-space: pre; + overflow: hidden; + text-overflow: ellipsis; + white-space: pre; } .tree-label > span { - overflow: hidden; - text-overflow: ellipsis; - white-space: pre; + overflow: hidden; + text-overflow: ellipsis; + white-space: pre; } .label-highlight { - background-color: var(--vscode-list-filterMatchBackground); - color: unset; - outline: 1px dotted var(--vscode-list-filterMatchBorder); - outline-offset: -1px; + background-color: var(--vscode-list-filterMatchBackground); + color: unset; + outline: 1px dotted var(--vscode-list-filterMatchBorder); + outline-offset: -1px; } .tree-toggler-container { - width: 1rem; - margin-right: 6px; - cursor: pointer; - padding-top: 3px; + width: 1rem; + margin-right: 6px; + cursor: pointer; + padding-top: 3px; } .tree-actions { - display: none; - flex: 1; - justify-content: end; + display: none; + flex: 1; + justify-content: end; } .tree-actions .codicon { - padding: 2px; - border-radius: 5px; - font-size: var(--vscode-font-size); + padding: 2px; + border-radius: 5px; + font-size: var(--vscode-font-size); } .tree-actions .codicon:hover { - background: var(--vscode-toolbar-hoverBackground); + background: var(--vscode-toolbar-hoverBackground); } diff --git a/style/tree/tree-search-overlay.css b/style/tree/tree-search-overlay.css index b804d0a..81ac7e1 100644 --- a/style/tree/tree-search-overlay.css +++ b/style/tree/tree-search-overlay.css @@ -1,84 +1,93 @@ /******************************************************************************** - * Copyright (C) 2024 EclipseSource and others. + * Copyright (C) 2024-2025 EclipseSource and others. * * This program and the accompanying materials are made available under the * terms of the MIT License as outlined in the LICENSE File ********************************************************************************/ .search-overlay { - position: fixed; - top: -33px; - opacity: 0; - right: 20px; - background-color: var(--vscode-editorWidget-background); - box-shadow: 0 0 4px 1px var(--vscode-widget-shadow); - color: var(--vscode-editorWidget-foreground); - border-bottom: 1px solid var(--vscode-widget-border); - border-bottom-left-radius: 4px; - border-bottom-right-radius: 4px; - border-left: 1px solid var(--vscode-widget-border); - border-right: 1px solid var(--vscode-widget-border); - box-sizing: border-box; - height: 33px; - line-height: 19px; - overflow: hidden; - padding: 4px; - z-index: 35; - display: flex; - flex-direction: row; - gap: 5px; + position: fixed; + top: -33px; + opacity: 0; + right: 20px; + background-color: var(--vscode-editorWidget-background); + box-shadow: 0 0 4px 1px var(--vscode-widget-shadow); + color: var(--vscode-editorWidget-foreground); + border-bottom: 1px solid var(--vscode-widget-border); + border-bottom-left-radius: 4px; + border-bottom-right-radius: 4px; + border-left: 1px solid var(--vscode-widget-border); + border-right: 1px solid var(--vscode-widget-border); + box-sizing: border-box; + height: 33px; + line-height: 19px; + overflow: hidden; + padding: 4px; + z-index: 35; + display: flex; + flex-direction: row; + gap: 5px; - -webkit-transition: top 0.2s ease, opacity 0.2s ease; - -moz-transition: top 0.2s ease, opacity 0.2s ease; - -ms-transition: top 0.2s ease, opacity 0.2s ease; - -o-transition: top 0.2s ease, opacity 0.2s ease; - transition: top 0.2s ease, opacity 0.2s ease; + -webkit-transition: + top 0.2s ease, + opacity 0.2s ease; + -moz-transition: + top 0.2s ease, + opacity 0.2s ease; + -ms-transition: + top 0.2s ease, + opacity 0.2s ease; + -o-transition: + top 0.2s ease, + opacity 0.2s ease; + transition: + top 0.2s ease, + opacity 0.2s ease; } .search-overlay.visible { - top: 5px; - opacity: 1; + top: 5px; + opacity: 1; } body.has-scrollbar .search-overlay { - right: 5px; + right: 5px; } .search-overlay .search-input { - color: var(--vscode-input-foreground); - background-color: var(--vscode-input-background); - outline: none; - scrollbar-width: none; - border: none; - box-sizing: border-box; - display: inline-block; - font-family: inherit; - font-size: inherit; - height: 100%; - line-height: inherit; - resize: none; - width: 100%; - padding: 4px 6px; - margin: 0; + color: var(--vscode-input-foreground); + background-color: var(--vscode-input-background); + outline: none; + scrollbar-width: none; + border: none; + box-sizing: border-box; + display: inline-block; + font-family: inherit; + font-size: inherit; + height: 100%; + line-height: inherit; + resize: none; + width: 100%; + padding: 4px 6px; + margin: 0; } .search-overlay input.search-input:focus { - outline: 1px solid var(--vscode-focusBorder) + outline: 1px solid var(--vscode-focusBorder); } - .search-input::placeholder { - color: var(--vscode-input-placeholderForeground); + color: var(--vscode-input-placeholderForeground); } .search-input::-moz-placeholder { - color: var(--vscode-input-placeholderForeground); + color: var(--vscode-input-placeholderForeground); } .search-input:-ms-input-placeholder { - color: var(--vscode-input-placeholderForeground); + color: var(--vscode-input-placeholderForeground); } .search-input:-webkit-input-placeholder { - color: var(--vscode-input-placeholderForeground); -} \ No newline at end of file + color: var(--vscode-input-placeholderForeground); +} diff --git a/style/tree/tree.css b/style/tree/tree.css index 1d03155..e96fee2 100644 --- a/style/tree/tree.css +++ b/style/tree/tree.css @@ -1,20 +1,20 @@ /******************************************************************************** - * Copyright (C) 2024 Arm Limited and others. + * Copyright (C) 2024-2025 EclipseSource, Arm Limited and others. * * This program and the accompanying materials are made available under the * terms of the MIT License as outlined in the LICENSE File ********************************************************************************/ .markdown { - line-break: anywhere; + line-break: anywhere; } .markdown hr { - border: 0; - box-sizing: border-box; - height: 1px; - margin: 4px -8px 0; - border-top: 1px solid rgba(69, 69, 69, 0.5); + border: 0; + box-sizing: border-box; + height: 1px; + margin: 4px -8px 0; + border-top: 1px solid rgba(69, 69, 69, 0.5); } .markdown .code, @@ -26,99 +26,92 @@ .markdown h6, .markdown p, .markdown ul { - margin: 8px 0; + margin: 8px 0; } /* AntD Table Variables */ .css-var-r0 { - --ant-font-family: var(--vscode-font-family); - --ant-color-text: var(--vscode-sideBar-foreground); - --ant-color-bg-container: var(--vscode-sideBar-background); + --ant-font-family: var(--vscode-font-family); + --ant-color-text: var(--vscode-sideBar-foreground); + --ant-color-bg-container: var(--vscode-sideBar-background); } .ant-table-tbody-virtual-scrollbar-thumb { - background: var(--vscode-scrollbarSlider-background) !important; + background: var(--vscode-scrollbarSlider-background) !important; } .ant-table.ant-table-css-var { - --ant-table-row-selected-bg: var(--vscode-list-inactiveSelectionBackground); - --ant-table-row-selected-hover-bg: var( - --vscode-list-inactiveSelectionBackground - ); - --ant-table-row-hover-bg: var(--vscode-list-hoverBackground); - --ant-table-border-color: var(--vscode-sideBar-background); - --ant-table-cell-font-size: var(--vscode-font-size); - --ant-table-cell-padding-block: 0; - --ant-table-cell-padding-inline: 4px; + --ant-table-row-selected-bg: var(--vscode-list-inactiveSelectionBackground); + --ant-table-row-selected-hover-bg: var(--vscode-list-inactiveSelectionBackground); + --ant-table-row-hover-bg: var(--vscode-list-hoverBackground); + --ant-table-border-color: var(--vscode-sideBar-background); + --ant-table-cell-font-size: var(--vscode-font-size); + --ant-table-cell-padding-block: 0; + --ant-table-cell-padding-inline: 4px; } .ant-table:focus-within { - --ant-table-row-selected-bg: var(--vscode-list-activeSelectionBackground); - --ant-table-row-selected-hover-bg: var( - --vscode-list-activeSelectionBackground - ); + --ant-table-row-selected-bg: var(--vscode-list-activeSelectionBackground); + --ant-table-row-selected-hover-bg: var(--vscode-list-activeSelectionBackground); } .ant-table .ant-table-row { - border: 1px solid transparent; - outline: none; - height: 22px; - cursor: pointer; + border: 1px solid transparent; + outline: none; + height: 22px; + cursor: pointer; } .ant-table:focus-within .ant-table-row.ant-table-row-selected { - border-color: var( - --vscode-list-focusAndSelectionOutline, - var(--vscode-contrastActiveBorder, var(--vscode-list-focusOutline)) - ); + border-color: var(--vscode-list-focusAndSelectionOutline, var(--vscode-contrastActiveBorder, var(--vscode-list-focusOutline))); } .ant-table .ant-table-row .ant-table-cell { - display: flex; - transition: none; - border-bottom: none; + display: flex; + transition: none; + border-bottom: none; } .ant-table .ant-table-row .ant-table-cell .cell-icon { - margin-right: 4px; - padding-top: 4px; - font-size: var(--vscode-font-size); + margin-right: 4px; + padding-top: 4px; + font-size: var(--vscode-font-size); } .ant-table .ant-table-row .ant-table-cell .tree-cell { - display: flex; + display: flex; } .ant-table .ant-table-row:hover .tree-actions, .ant-table .ant-table-row:focus .tree-actions { - display: flex; - align-items: center; + display: flex; + align-items: center; } .ant-table .tree-actions { - padding-right: 8px; + padding-right: 8px; } .ant-table .tree-actions > i { - cursor: pointer; + cursor: pointer; } .ant-table .leaf-item-spacer { - display: inline-block; - width: 16px; + display: inline-block; + width: 16px; } .ant-table-empty .empty-message { - display: inline-block; - padding-top: 4em; - color: var(--vscode-editor-foreground); + display: inline-block; + padding-top: 4em; + color: var(--vscode-editor-foreground); } .ant-table-empty .ant-table-body { - overflow: hidden !important; + overflow: hidden !important; } /* The horizontal scrollbar is not necessary */ .ant-table .ant-table-tbody-virtual-scrollbar-horizontal { - display: none; + display: none; } diff --git a/yarn.lock b/yarn.lock index 0f70991..b643832 100644 --- a/yarn.lock +++ b/yarn.lock @@ -270,6 +270,11 @@ "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" +"@pkgr/core@^0.1.0": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@pkgr/core/-/core-0.1.1.tgz#1ec17e2edbec25c8306d424ecfbf13c7de1aaa31" + integrity sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA== + "@rc-component/async-validator@^5.0.3": version "5.0.4" resolved "https://registry.yarnpkg.com/@rc-component/async-validator/-/async-validator-5.0.4.tgz#5291ad92f00a14b6766fc81735c234277f83e948" @@ -894,6 +899,16 @@ dequal@^2.0.0: resolved "https://registry.yarnpkg.com/dequal/-/dequal-2.0.3.tgz#2644214f1997d39ed0ee0ece72335490a7ac67be" integrity sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA== +detect-indent@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-7.0.1.tgz#cbb060a12842b9c4d333f1cac4aa4da1bb66bc25" + integrity sha512-Mc7QhQ8s+cLrnUfU/Ji94vG/r8M26m8f++vyres4ZoojaRDpZ1eSIh/EpzLNwlWuvzSZ3UbDFspjFvTDXe6e/g== + +detect-newline@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-4.0.1.tgz#fcefdb5713e1fb8cb2839b8b6ee22e6716ab8f23" + integrity sha512-qE3Veg1YXzGHQhlA6jzebZN2qVf6NX+A7m7qlhCGG30dJixrAQhYOsJjsnBjJkCSmuOPpCk30145fr8FV0bzog== + devlop@^1.0.0, devlop@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/devlop/-/devlop-1.1.0.tgz#4db7c2ca4dc6e0e834c30be70c94bbc976dc7018" @@ -933,6 +948,11 @@ escape-string-regexp@^5.0.0: resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz#4683126b500b61762f2dbebace1806e8be31b1c8" integrity sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw== +eslint-plugin-header@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-header/-/eslint-plugin-header-3.1.1.tgz#6ce512432d57675265fac47292b50d1eff11acd6" + integrity sha512-9vlKxuJ4qf793CmeeSrZUvVClw6amtpghq3CuWcB5cUNnWHQhgcqy5eF8oVKFk1G3Y/CbchGfEaw3wiIJaNmVg== + eslint-scope@^5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" @@ -1085,6 +1105,11 @@ fastq@^1.6.0: dependencies: reusify "^1.0.4" +fdir@^6.4.3: + version "6.4.3" + resolved "https://registry.yarnpkg.com/fdir/-/fdir-6.4.3.tgz#011cdacf837eca9b811c89dbb902df714273db72" + integrity sha512-PMXmW2y1hDDfTSRc9gaXIuCCRpuoz3Kaz8cUelp3smouvfT632ozg2vrT6lJsHKKOF59YLbOGfAWGUcKEfRMQw== + file-entry-cache@^8.0.0: version "8.0.0" resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-8.0.0.tgz#7787bddcf1131bffb92636c69457bbc0edd6d81f" @@ -1128,6 +1153,16 @@ foreground-child@^3.1.0: cross-spawn "^7.0.6" signal-exit "^4.0.1" +get-stdin@^9.0.0: + version "9.0.0" + resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-9.0.0.tgz#3983ff82e03d56f1b2ea0d3e60325f39d703a575" + integrity sha512-dVKBjfWisLAicarI2Sf+JuBE/DghV4UzNAVe9yhEJuzeREd3JhOTE9cUaJTeSa77fsbQUK3pcOpJfM59+VKZaA== + +git-hooks-list@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/git-hooks-list/-/git-hooks-list-3.2.0.tgz#ffe5d5895e29d24f930f9a98dd604b7e407d2f5f" + integrity sha512-ZHG9a1gEhUMX1TvGrLdyWb9kDopCBbTnI8z4JgRMYxsijWipgjSEYoPWqBuIB0DnRnvqlQSEeVmzpeuPm7NdFQ== + glob-parent@^5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" @@ -1287,7 +1322,7 @@ is-number@^7.0.0: resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== -is-plain-obj@^4.0.0: +is-plain-obj@^4.0.0, is-plain-obj@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-4.1.0.tgz#d65025edec3657ce032fd7db63c97883eaed71f0" integrity sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg== @@ -1304,11 +1339,6 @@ jackspeak@^4.0.1: dependencies: "@isaacs/cliui" "^8.0.2" -"js-tokens@^3.0.0 || ^4.0.0": - version "4.0.0" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" - integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== - js-yaml@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" @@ -1370,13 +1400,6 @@ longest-streak@^3.0.0: resolved "https://registry.yarnpkg.com/longest-streak/-/longest-streak-3.1.0.tgz#62fa67cd958742a1574af9f39866364102d90cd4" integrity sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g== -loose-envify@^1.1.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" - integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== - dependencies: - js-tokens "^3.0.0 || ^4.0.0" - lru-cache@^11.0.0: version "11.0.2" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-11.0.2.tgz#fbd8e7cf8211f5e7e5d91905c415a3f55755ca39" @@ -1973,21 +1996,29 @@ picomatch@^2.3.1: resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== +picomatch@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-4.0.2.tgz#77c742931e8f3b8820946c76cd0c1f13730d1dab" + integrity sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg== + prelude-ls@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== +prettier-plugin-packagejson@^2.5.8: + version "2.5.10" + resolved "https://registry.yarnpkg.com/prettier-plugin-packagejson/-/prettier-plugin-packagejson-2.5.10.tgz#f47068d0aa12efcdddb802189d8adae874ba00e7" + integrity sha512-LUxATI5YsImIVSaaLJlJ3aE6wTD+nvots18U3GuQMJpUyClChaZlQrqx3dBnbhF20OnKWZyx8EgyZypQtBDtgQ== + dependencies: + sort-package-json "2.15.1" + synckit "0.9.2" + prettier@^3.5.2: version "3.5.2" resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.5.2.tgz#d066c6053200da0234bf8fa1ef45168abed8b914" integrity sha512-lc6npv5PH7hVqozBR7lkBNOGXV9vMwROAPlumdBkX0wTbbzPu/U1hk5yL8p2pt4Xoc+2mkT8t/sow2YrV/M5qg== -primeflex@^3.3.1: - version "3.3.1" - resolved "https://registry.yarnpkg.com/primeflex/-/primeflex-3.3.1.tgz#361dddf6eb5db50d733e4cddd4b6e376a3d7bd68" - integrity sha512-zaOq3YvcOYytbAmKv3zYc+0VNS9Wg5d37dfxZnveKBFPr7vEIwfV5ydrpiouTft8MVW6qNjfkaQphHSnvgQbpQ== - property-information@^6.0.0: version "6.5.0" resolved "https://registry.yarnpkg.com/property-information/-/property-information-6.5.0.tgz#6212fbb52ba757e92ef4fb9d657563b933b7ffec" @@ -2354,14 +2385,6 @@ rc-virtual-list@^3.14.2, rc-virtual-list@^3.5.1, rc-virtual-list@^3.5.2: rc-resize-observer "^1.0.0" rc-util "^5.36.0" -react-dom@^18.2.0: - version "18.3.1" - resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-18.3.1.tgz#c2265d79511b57d479b3dd3fdfa51536494c5cb4" - integrity sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw== - dependencies: - loose-envify "^1.1.0" - scheduler "^0.23.2" - react-is@^18.2.0: version "18.3.1" resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.3.1.tgz#e83557dc12eae63a99e003a46388b1dcbb44db7e" @@ -2383,13 +2406,6 @@ react-markdown@^9.0.1: unist-util-visit "^5.0.0" vfile "^6.0.0" -react@^18.2.0: - version "18.3.1" - resolved "https://registry.yarnpkg.com/react/-/react-18.3.1.tgz#49ab892009c53933625bd16b2533fc754cab2891" - integrity sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ== - dependencies: - loose-envify "^1.1.0" - regenerator-runtime@^0.14.0: version "0.14.1" resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz#356ade10263f685dda125100cd862c1db895327f" @@ -2467,13 +2483,6 @@ run-parallel@^1.1.9: dependencies: queue-microtask "^1.2.2" -scheduler@^0.23.2: - version "0.23.2" - resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.23.2.tgz#414ba64a3b282892e944cf2108ecc078d115cdc3" - integrity sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ== - dependencies: - loose-envify "^1.1.0" - scroll-into-view-if-needed@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/scroll-into-view-if-needed/-/scroll-into-view-if-needed-3.1.0.tgz#fa9524518c799b45a2ef6bbffb92bcad0296d01f" @@ -2508,6 +2517,25 @@ slash@^3.0.0: resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== +sort-object-keys@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/sort-object-keys/-/sort-object-keys-1.1.3.tgz#bff833fe85cab147b34742e45863453c1e190b45" + integrity sha512-855pvK+VkU7PaKYPc+Jjnmt4EzejQHyhhF33q31qG8x7maDzkeFhAAThdCYay11CISO+qAMwjOBP+fPZe0IPyg== + +sort-package-json@2.15.1: + version "2.15.1" + resolved "https://registry.yarnpkg.com/sort-package-json/-/sort-package-json-2.15.1.tgz#e5a035fad7da277b1947b9eecc93ea09c1c2526e" + integrity sha512-9x9+o8krTT2saA9liI4BljNjwAbvUnWf11Wq+i/iZt8nl2UGYnf3TH5uBydE7VALmP7AGwlfszuEeL8BDyb0YA== + dependencies: + detect-indent "^7.0.1" + detect-newline "^4.0.0" + get-stdin "^9.0.0" + git-hooks-list "^3.0.0" + is-plain-obj "^4.1.0" + semver "^7.6.0" + sort-object-keys "^1.1.3" + tinyglobby "^0.2.9" + space-separated-tokens@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz#1ecd9d2350a3844572c3f4a312bceb018348859f" @@ -2598,6 +2626,14 @@ supports-color@^7.1.0: dependencies: has-flag "^4.0.0" +synckit@0.9.2: + version "0.9.2" + resolved "https://registry.yarnpkg.com/synckit/-/synckit-0.9.2.tgz#a3a935eca7922d48b9e7d6c61822ee6c3ae4ec62" + integrity sha512-vrozgXDQwYO72vHjUb/HnFbQx1exDjoKzqx23aXEg2a9VIg2TSFZ8FmeZpTjUCFMYw7mpX4BE2SFu8wI7asYsw== + dependencies: + "@pkgr/core" "^0.1.0" + tslib "^2.6.2" + tabbable@^5.2.0: version "5.3.3" resolved "https://registry.yarnpkg.com/tabbable/-/tabbable-5.3.3.tgz#aac0ff88c73b22d6c3c5a50b1586310006b47fbf" @@ -2613,6 +2649,14 @@ throttle-debounce@5.0.2, throttle-debounce@^5.0.0, throttle-debounce@^5.0.2: resolved "https://registry.yarnpkg.com/throttle-debounce/-/throttle-debounce-5.0.2.tgz#ec5549d84e053f043c9fd0f2a6dd892ff84456b1" integrity sha512-B71/4oyj61iNH0KeCamLuE2rmKuTO5byTOSVwECM5FA7TiAiAW+UqTKZ9ERueC4qvgSttUhdmq1mXC3kJqGX7A== +tinyglobby@^0.2.9: + version "0.2.12" + resolved "https://registry.yarnpkg.com/tinyglobby/-/tinyglobby-0.2.12.tgz#ac941a42e0c5773bd0b5d08f32de82e74a1a61b5" + integrity sha512-qkf4trmKSIiMTs/E63cxH+ojC2unam7rJ0WrauAzpT3ECNTxGRMlaXxVbfxMUC/w0LaYk6jQ4y/nGR9uBO3tww== + dependencies: + fdir "^6.4.3" + picomatch "^4.0.2" + to-regex-range@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" From ba36a42b034eb8af9141e8f75980c6ed95a199f3 Mon Sep 17 00:00:00 2001 From: Haydar Metin Date: Wed, 19 Mar 2025 10:22:17 +0100 Subject: [PATCH 3/4] Improve documentation --- src/tree/README.md | 13 ++++++++++--- src/tree/vscode/tree-data-provider.ts | 4 ++++ 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/src/tree/README.md b/src/tree/README.md index fbe5954..cd437d3 100644 --- a/src/tree/README.md +++ b/src/tree/README.md @@ -1,14 +1,17 @@ # Tree -The Tree component is built on top of the Ant Tree and offers functionality for rendering both tree structures and tree tables (when multiple columns are provided). +The Tree component is built on top of the [Ant Table](https://ant.design/components/table) with a tree structure and offers functionality for rendering both tree and tree tables (when multiple columns are provided). ## Webview / React Data retrieval and provisioning for the `CDTTree` component are the developer's responsibility. Refer to the component's properties for further details. +> Hint: `CDTTreeItem` corresponds to the `TreeItem` of the [`VS Code Tree Data Provider`](https://code.visualstudio.com/api/extension-guides/tree-view#tree-data-provider). + ```ts // Webview +import { CDTTreeItem } from '@eclipse-cdt-cloud/vscode-ui-components'; import { messenger, CDTTree @@ -20,9 +23,9 @@ messenger.start(); function App() { // 1) Retrieve the data source (serialized DTOs) - const dtos = ... + const dtos: ExampleDTO[] = ... // 2) Convert them to CDTTreeItems (recommended: use `CDTTreeResourceConverter`) - const dataSource = treeResourceConverter.convert(dtos, {...}) + const dataSource: CDTTreeItem[] = treeResourceConverter.convert(dtos, {...}) return ; } @@ -49,6 +52,8 @@ Its API follows a similar structure to the [VS Code Tree View API](https://code. #### `CDTTreeDataProvider` +> Hint: `Example` is your domain model, and `ExampleDTO` is the object sent to the webview. + ```ts export class TreeDataProvider implements CDTTreeDataProvider { constructor(protected context: vscode.ExtensionContext) {} @@ -109,6 +114,8 @@ export class TreeTableWebView extends CDTTreeWebviewViewProvider { #### `CDTTreeResourceConverter` +> Hint: `CDTTreeItem`s are the items that will be rendered by `CDTTree`. + ```ts export class ExampleConverter implements CDTTreeResourceConverter { canHandle(resource: ExampleDTOs): boolean { diff --git a/src/tree/vscode/tree-data-provider.ts b/src/tree/vscode/tree-data-provider.ts index 89e8a91..dd4ec65 100644 --- a/src/tree/vscode/tree-data-provider.ts +++ b/src/tree/vscode/tree-data-provider.ts @@ -12,6 +12,10 @@ import type { MaybePromise } from '../../base/utils'; /** * A tree data provider that provides data for the CDTTree. * + * The CDTTree uses it's own tree item model. This data provider is responsible for converting the domain model + * to serialized items that are actually send to the webview. + * Those serialized items are then used as a basis for the CDTTree. + * * @param TNode The type of the tree nodes in the domain model. * @param TSerializedNode The type of the serialized tree nodes. Those are the nodes that * are actually send to the webview to be displayed in the tree. From 45216b83d65d60213111ad987747f804960863c2 Mon Sep 17 00:00:00 2001 From: Haydar Metin Date: Thu, 20 Mar 2025 09:33:56 +0100 Subject: [PATCH 4/4] Update license file --- LICENSE | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/LICENSE b/LICENSE index 077f0d5..e1c87b1 100644 --- a/LICENSE +++ b/LICENSE @@ -1,7 +1,6 @@ -Copyright 2024-2025 Arm Limited and EclipseSource - -MIT +MIT License +Copyright 2024-2025 Arm Limited and EclipseSource Copyright 2017-2023 Marcel Ball and Arm Limited Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: