From 7d23ee0ac5518271de216899132db3dbe855606f Mon Sep 17 00:00:00 2001 From: Ben King <9087625+benfdking@users.noreply.github.com> Date: Thu, 3 Jul 2025 15:08:23 +0100 Subject: [PATCH] chore(vscode): typing lineage and storybook --- pnpm-lock.yaml | 818 +++++++++++++++- vscode/react/.gitignore | 3 + vscode/react/.storybook/main.ts | 17 + vscode/react/.storybook/preview.ts | 22 + vscode/react/.storybook/storybook.css | 917 ++++++++++++++++++ vscode/react/.storybook/vitest.setup.ts | 7 + vscode/react/package.json | 16 +- .../src/components/graph/ModelColumns.tsx | 8 +- .../src/components/graph/ModelLineage.tsx | 27 +- .../react/src/components/graph/ModelNode.tsx | 3 +- .../graph/ModelNodeHeaderHandles.tsx | 4 +- vscode/react/src/components/graph/context.tsx | 15 +- vscode/react/src/components/graph/help.ts | 166 ++-- vscode/react/src/components/graph/types.ts | 39 + vscode/react/src/domain/lineage.ts | 36 +- vscode/react/src/domain/models.ts | 14 + vscode/react/src/domain/sqlmesh-model.ts | 4 +- vscode/react/src/pages/lineage.tsx | 10 +- vscode/react/src/utils/index.ts | 4 - vscode/react/src/workers/lineage.ts | 15 +- vscode/react/vitest.shims.d.ts | 1 + 21 files changed, 1979 insertions(+), 167 deletions(-) create mode 100644 vscode/react/.storybook/main.ts create mode 100644 vscode/react/.storybook/preview.ts create mode 100644 vscode/react/.storybook/storybook.css create mode 100644 vscode/react/.storybook/vitest.setup.ts create mode 100644 vscode/react/vitest.shims.d.ts diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 4c329eebf4..c0918d6f40 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -86,7 +86,7 @@ importers: version: 8.34.0(eslint@9.29.0(jiti@2.4.2))(typescript@5.8.3) vitest: specifier: ^3.2.3 - version: 3.2.3(@types/debug@4.1.12)(@types/node@20.11.25)(@vitest/ui@3.2.3)(jiti@2.4.2)(jsdom@26.1.0)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.19.4)(yaml@2.8.0) + version: 3.2.3(@types/debug@4.1.12)(@types/node@20.11.25)(@vitest/browser@3.2.3)(@vitest/ui@3.2.3)(jiti@2.4.2)(jsdom@26.1.0)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.19.4)(yaml@2.8.0) vscode/react: dependencies: @@ -119,7 +119,7 @@ importers: version: 3.13.9(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@tanstack/router-plugin': specifier: ^1.120.16 - version: 1.120.16(@tanstack/react-router@1.120.16(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(vite@6.3.5(@types/node@22.15.30)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.19.4)(yaml@2.8.0))(webpack@5.99.8) + version: 1.120.16(@tanstack/react-router@1.120.16(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(vite@6.3.5(@types/node@22.15.30)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.19.4)(yaml@2.8.0))(webpack@5.99.8(esbuild@0.25.5)) apache-arrow: specifier: ^19.0.1 version: 19.0.1 @@ -151,6 +151,24 @@ importers: specifier: ^3.1.0 version: 3.1.0 devDependencies: + '@chromatic-com/storybook': + specifier: ^4.0.1 + version: 4.0.1(storybook@9.0.15(@testing-library/dom@10.4.0)(prettier@3.5.3)) + '@storybook/addon-a11y': + specifier: ^9.0.15 + version: 9.0.15(storybook@9.0.15(@testing-library/dom@10.4.0)(prettier@3.5.3)) + '@storybook/addon-docs': + specifier: ^9.0.15 + version: 9.0.15(@types/react@18.3.23)(storybook@9.0.15(@testing-library/dom@10.4.0)(prettier@3.5.3)) + '@storybook/addon-onboarding': + specifier: ^9.0.15 + version: 9.0.15(storybook@9.0.15(@testing-library/dom@10.4.0)(prettier@3.5.3)) + '@storybook/addon-vitest': + specifier: ^9.0.15 + version: 9.0.15(@vitest/browser@3.2.3)(@vitest/runner@3.2.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@9.0.15(@testing-library/dom@10.4.0)(prettier@3.5.3))(vitest@3.2.3) + '@storybook/react-vite': + specifier: ^9.0.15 + version: 9.0.15(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rollup@4.41.1)(storybook@9.0.15(@testing-library/dom@10.4.0)(prettier@3.5.3))(typescript@5.8.3)(vite@6.3.5(@types/node@22.15.30)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.19.4)(yaml@2.8.0)) '@testing-library/dom': specifier: ^10.4.0 version: 10.4.0 @@ -166,9 +184,21 @@ importers: '@vitejs/plugin-react': specifier: ^4.5.1 version: 4.5.1(vite@6.3.5(@types/node@22.15.30)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.19.4)(yaml@2.8.0)) + '@vitest/browser': + specifier: 3.2.3 + version: 3.2.3(playwright@1.53.2)(vite@6.3.5(@types/node@22.15.30)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.19.4)(yaml@2.8.0))(vitest@3.2.3) + '@vitest/coverage-v8': + specifier: 3.2.3 + version: 3.2.3(@vitest/browser@3.2.3)(vitest@3.2.3) jsdom: specifier: ^26.1.0 version: 26.1.0 + playwright: + specifier: ^1.53.2 + version: 1.53.2 + storybook: + specifier: ^9.0.15 + version: 9.0.15(@testing-library/dom@10.4.0)(prettier@3.5.3) typescript: specifier: ^5.8.3 version: 5.8.3 @@ -177,7 +207,7 @@ importers: version: 6.3.5(@types/node@22.15.30)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.19.4)(yaml@2.8.0) vitest: specifier: ^3.2.3 - version: 3.2.3(@types/debug@4.1.12)(@types/node@22.15.30)(@vitest/ui@3.2.3)(jiti@2.4.2)(jsdom@26.1.0)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.19.4)(yaml@2.8.0) + version: 3.2.3(@types/debug@4.1.12)(@types/node@22.15.30)(@vitest/browser@3.2.3)(@vitest/ui@3.2.3)(jiti@2.4.2)(jsdom@26.1.0)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.19.4)(yaml@2.8.0) web-vitals: specifier: ^4.2.4 version: 4.2.4 @@ -352,7 +382,7 @@ importers: version: 3.5.2(vite@6.3.5(@types/node@22.15.30)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.19.4)(yaml@2.8.0)) vitest: specifier: ^3.2.3 - version: 3.2.3(@types/debug@4.1.12)(@types/node@22.15.30)(@vitest/ui@3.2.3)(jiti@2.4.2)(jsdom@26.1.0)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.19.4)(yaml@2.8.0) + version: 3.2.3(@types/debug@4.1.12)(@types/node@22.15.30)(@vitest/browser@3.2.3)(@vitest/ui@3.2.3)(jiti@2.4.2)(jsdom@26.1.0)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.19.4)(yaml@2.8.0) optionalDependencies: '@swc/core-linux-x64-gnu': specifier: ^1.11.31 @@ -541,6 +571,16 @@ packages: '@bcoe/v8-coverage@0.2.3': resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} + '@bcoe/v8-coverage@1.0.2': + resolution: {integrity: sha512-6zABk/ECA/QYSCQ1NGiVwwbQerUCZ+TQbp64Q3AgmfNvurHH0j8TtXa1qbShXA6qqkpAj4V5W8pP6mLe1mcMqA==} + engines: {node: '>=18'} + + '@chromatic-com/storybook@4.0.1': + resolution: {integrity: sha512-GQXe5lyZl3yLewLJQyFXEpOp2h+mfN2bPrzYaOFNCJjO4Js9deKbRHTOSaiP2FRwZqDLdQwy2+SEGeXPZ94yYw==} + engines: {node: '>=20.0.0', yarn: '>=1.22.18'} + peerDependencies: + storybook: ^0.0.0-0 || ^9.0.0 || ^9.1.0-0 + '@codemirror/autocomplete@6.18.6': resolution: {integrity: sha512-PHHBXFomUs5DF+9tCOM/UoW6XQ4R44lLNNhRaW9PKPTU0D7lIjRg3ElxaJnTwsl/oHiR93WSXDBrekhoUGCPtg==} @@ -888,6 +928,15 @@ packages: resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} engines: {node: '>=8'} + '@joshwooding/vite-plugin-react-docgen-typescript@0.6.1': + resolution: {integrity: sha512-J4BaTocTOYFkMHIra1JDWrMWpNmBl4EkplIwHEsV8aeUOtdWjwSnln9U7twjMFTAEB7mptNtSKyVi1Y2W9sDJw==} + peerDependencies: + typescript: '>= 4.3.x' + vite: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 + peerDependenciesMeta: + typescript: + optional: true + '@jridgewell/gen-mapping@0.3.8': resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==} engines: {node: '>=6.0.0'} @@ -950,6 +999,15 @@ packages: '@marijn/find-cluster-break@1.0.2': resolution: {integrity: sha512-l0h88YhZFyKdXIFNfSWpyjStDjGHwZ/U7iobcK1cQQD8sejsONdQtTVU+1wVN1PBw40PiiHB1vA5S7VTfQiP9g==} + '@mdx-js/react@3.1.0': + resolution: {integrity: sha512-QjHtSaoameoalGnKDT3FoIl4+9RwyTmo9ZJGBdLOks/YOiWHoRDI3PUwEzOE7kEmGcV3AFcp9K6dYu9rEuKLAQ==} + peerDependencies: + '@types/react': '>=16' + react: '>=16' + + '@neoconfetti/react@1.0.0': + resolution: {integrity: sha512-klcSooChXXOzIm+SE5IISIAn3bYzYfPjbX7D7HoqZL84oAfgREeSg5vSIaSFH+DaGzzvImTyWe1OyrJ67vik4A==} + '@nodelib/fs.scandir@2.1.5': resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} engines: {node: '>= 8'} @@ -1393,6 +1451,15 @@ packages: '@rolldown/pluginutils@1.0.0-beta.9': resolution: {integrity: sha512-e9MeMtVWo186sgvFFJOPGy7/d2j2mZhLJIdVW0C/xDluuOvymEATqz6zKsP0ZmXGzQtqlyjz5sC1sYQUoJG98w==} + '@rollup/pluginutils@5.2.0': + resolution: {integrity: sha512-qWJ2ZTbmumwiLFomfzTyt5Kng4hwPi9rwCYN4SHb6eaRU1KNO4ccxINHr/VhH4GgPlt1XfSTLX2LBTme8ne4Zw==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + '@rollup/rollup-android-arm-eabi@4.41.1': resolution: {integrity: sha512-NELNvyEWZ6R9QMkiytB4/L4zSEaBC03KIXEghptLGLZWJ6VPrL63ooZQCOnlx36aQPGhzuOMwDerC1Eb2VmrLw==} cpu: [arm] @@ -1630,6 +1697,85 @@ packages: resolution: {integrity: sha512-JZlVFE6/dYpP9tQmV0/ADfn32L9uFarHWxfcRhReKUnljz1ZiUM5zpX+PH8h5CJs6lao3TuFqnPm9IJJCEkE2w==} engines: {node: '>=10.8'} + '@storybook/addon-a11y@9.0.15': + resolution: {integrity: sha512-/oborGUeN7KT6jyTMhGRET9tXvZ080OCB/Hw6txSfsVxgZ4Z1QTJcOreejHGeYyxHN1ugEJ26K95agk4M13WZg==} + peerDependencies: + storybook: ^9.0.15 + + '@storybook/addon-docs@9.0.15': + resolution: {integrity: sha512-HOb45DkF23T1tRzakb9q33qnBRso15S/GM28ippPZWi5ZXR9RAyKVgOSMA/ViEpK4ezASxN+Tee+H7m4ksEFZw==} + peerDependencies: + storybook: ^9.0.15 + + '@storybook/addon-onboarding@9.0.15': + resolution: {integrity: sha512-g2FqO0aS6vvjMZdY+0xjV1C7YGcDE0GkuPAv1JqejNYGyX2Z8nuLHy2zqhLIBpfoap4S9PZO+obqEKVeo70Q0Q==} + peerDependencies: + storybook: ^9.0.15 + + '@storybook/addon-vitest@9.0.15': + resolution: {integrity: sha512-4TynzdZgJMsvneT5lZGp+WrUoFtp8+LRL3y35EepJa3GMBc+9WgsKQrso+xnDQh1gLvVNe46n3klZvunVr4AFA==} + peerDependencies: + '@vitest/browser': ^3.0.0 + '@vitest/runner': ^3.0.0 + storybook: ^9.0.15 + vitest: ^3.0.0 + peerDependenciesMeta: + '@vitest/browser': + optional: true + '@vitest/runner': + optional: true + vitest: + optional: true + + '@storybook/builder-vite@9.0.15': + resolution: {integrity: sha512-ogPec1V+e3MgTY5DBlq/6hBBui0Y4TmolYQh0eL3cATHrwZlwkTTDWQfsOnMALd5w+4Jq8n0gk0cQgR5rh1FHw==} + peerDependencies: + storybook: ^9.0.15 + vite: ^5.0.0 || ^6.0.0 || ^7.0.0 + + '@storybook/csf-plugin@9.0.15': + resolution: {integrity: sha512-KszyGjrocMiNbkmpBGARF1ugLYMVaw1J8Z31kmwTHsMgMZwAKcOsofJ0fPgFno0yV59DUVkWxVBdPs9V0hhvxA==} + peerDependencies: + storybook: ^9.0.15 + + '@storybook/global@5.0.0': + resolution: {integrity: sha512-FcOqPAXACP0I3oJ/ws6/rrPT9WGhu915Cg8D02a9YxLo0DE9zI+a9A5gRGvmQ09fiWPukqI8ZAEoQEdWUKMQdQ==} + + '@storybook/icons@1.4.0': + resolution: {integrity: sha512-Td73IeJxOyalzvjQL+JXx72jlIYHgs+REaHiREOqfpo3A2AYYG71AUbcv+lg7mEDIweKVCxsMQ0UKo634c8XeA==} + engines: {node: '>=14.0.0'} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta + + '@storybook/react-dom-shim@9.0.15': + resolution: {integrity: sha512-X5VlYKoZSIMU9HEshIwtNzp41nPt4kiJtJ2c5HzFa5F6M8rEHM5n059CGcCZQqff3FnZtK/y6v/kCVZO+8oETA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta + storybook: ^9.0.15 + + '@storybook/react-vite@9.0.15': + resolution: {integrity: sha512-OOAywn5x2Ged3LD84+TMwpjZUelFg7Wb8eHkgHE2SzM20XiZrhoKvreqxlzbfey3weBl+bKNhsiWF9BluT8YHg==} + engines: {node: '>=20.0.0'} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta + storybook: ^9.0.15 + vite: ^5.0.0 || ^6.0.0 || ^7.0.0 + + '@storybook/react@9.0.15': + resolution: {integrity: sha512-hewpSH8Ij4Bg7S9Tfw7ecfGPv7YDycRxsfpsDX7Mw3JhLuCdqjpmmTL2RgoNojg7TAW3FPdixcgQi/b4PH50ag==} + engines: {node: '>=20.0.0'} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta + storybook: ^9.0.15 + typescript: '>= 4.9.x' + peerDependenciesMeta: + typescript: + optional: true + '@swc/core-darwin-arm64@1.11.31': resolution: {integrity: sha512-NTEaYOts0OGSbJZc0O74xsji+64JrF1stmBii6D5EevWEtrY4wlZhm8SiP/qPrOB+HqtAihxWIukWkP2aSdGSQ==} engines: {node: '>=10'} @@ -2083,6 +2229,9 @@ packages: '@types/deep-eql@4.0.2': resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==} + '@types/doctrine@0.0.9': + resolution: {integrity: sha512-eOIHzCUSH7SMfonMG1LsC2f8vxBFtho6NGBznK41R84YzPuvSBzrhEps33IsQiOW9+VL6NQ9DbjQJznk/S4uRA==} + '@types/es-aggregate-error@1.0.6': resolution: {integrity: sha512-qJ7LIFp06h1QE1aVxbVd+zJP2wdaugYXYfd6JxsyRMrYHaxb6itXPogW2tz+ylUJ1n1b+JF1PHyYCfYHm0dvUg==} @@ -2122,6 +2271,9 @@ packages: '@types/mdast@4.0.4': resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==} + '@types/mdx@2.0.13': + resolution: {integrity: sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw==} + '@types/mocha@10.0.10': resolution: {integrity: sha512-xPyYSz1cMPnJQhl0CLMH68j3gprKZaTjG3s5Vi+fDgx+uhG9NOXwbVt52eFS8ECyXhyKcjDLCBEqBExKuiZb7Q==} @@ -2154,6 +2306,9 @@ packages: '@types/react@18.3.23': resolution: {integrity: sha512-/LDXMQh55EzZQ0uVAZmKKhfENivEvWz6E+EYzh+/MCjMhNsotd+ZHhBGIjFDTi6+fz0OhQQQLbTgdQIxxCsC0w==} + '@types/resolve@1.20.6': + resolution: {integrity: sha512-A4STmOXPhMUtHH+S6ymgE2GiBSMqf4oTvcQZMcHzokuTLVYzXTB8ttjcgxOVaAp2lGwEdzZ0J+cRbbeevQj1UQ==} + '@types/sarif@2.1.7': resolution: {integrity: sha512-kRz0VEkJqWLf1LLVN4pT1cg1Z9wAuvI6L97V3m2f5B76Tg8d413ddvLBPTEHAZJlnn4XSvu0FkZtViCQGVyrXQ==} @@ -2275,9 +2430,36 @@ packages: peerDependencies: vite: ^4.2.0 || ^5.0.0 || ^6.0.0 + '@vitest/browser@3.2.3': + resolution: {integrity: sha512-5HpUb0ixGF8JWSAjb/P1x/VPuTYUkL4pL0+YO6DJiuvQgqJN3PREaUEcXwfXjU4nBc37EahfpRbAwdE9pHs9lQ==} + peerDependencies: + playwright: '*' + safaridriver: '*' + vitest: 3.2.3 + webdriverio: ^7.0.0 || ^8.0.0 || ^9.0.0 + peerDependenciesMeta: + playwright: + optional: true + safaridriver: + optional: true + webdriverio: + optional: true + + '@vitest/coverage-v8@3.2.3': + resolution: {integrity: sha512-D1QKzngg8PcDoCE8FHSZhREDuEy+zcKmMiMafYse41RZpBE5EDJyKOTdqK3RQfsV2S2nyKor5KCs8PyPRFqKPg==} + peerDependencies: + '@vitest/browser': 3.2.3 + vitest: 3.2.3 + peerDependenciesMeta: + '@vitest/browser': + optional: true + '@vitest/expect@3.2.3': resolution: {integrity: sha512-W2RH2TPWVHA1o7UmaFKISPvdicFJH+mjykctJFoAkUw+SPTJTGjUNdKscFBrqM7IPnCVu6zihtKYa7TkZS1dkQ==} + '@vitest/expect@3.2.4': + resolution: {integrity: sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig==} + '@vitest/mocker@3.2.3': resolution: {integrity: sha512-cP6fIun+Zx8he4rbWvi+Oya6goKQDZK+Yq4hhlggwQBbrlOQ4qtZ+G4nxB6ZnzI9lyIb+JnvyiJnPC2AGbKSPA==} peerDependencies: @@ -2292,6 +2474,9 @@ packages: '@vitest/pretty-format@3.2.3': resolution: {integrity: sha512-yFglXGkr9hW/yEXngO+IKMhP0jxyFw2/qys/CK4fFUZnSltD+MU7dVYGrH8rvPcK/O6feXQA+EU33gjaBBbAng==} + '@vitest/pretty-format@3.2.4': + resolution: {integrity: sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA==} + '@vitest/runner@3.2.3': resolution: {integrity: sha512-83HWYisT3IpMaU9LN+VN+/nLHVBCSIUKJzGxC5RWUOsK1h3USg7ojL+UXQR3b4o4UBIWCYdD2fxuzM7PQQ1u8w==} @@ -2301,6 +2486,9 @@ packages: '@vitest/spy@3.2.3': resolution: {integrity: sha512-JHu9Wl+7bf6FEejTCREy+DmgWe+rQKbK+y32C/k5f4TBIAlijhJbRBIRIOCEpVevgRsCQR2iHRUH2/qKVM/plw==} + '@vitest/spy@3.2.4': + resolution: {integrity: sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw==} + '@vitest/ui@3.2.3': resolution: {integrity: sha512-9aR2tY/WT7GRHGEH/9sSIipJqeA21Eh3C6xmiOVmfyBCFmezUSUFLalpaSmRHlRzWCKQU10yz3AHhKuYcdnZGQ==} peerDependencies: @@ -2309,6 +2497,9 @@ packages: '@vitest/utils@3.2.3': resolution: {integrity: sha512-4zFBCU5Pf+4Z6v+rwnZ1HU1yzOKKvDkMXZrymE2PBlbjKJRlrOxbvpfPSvJTGRIwGoahaOGvp+kbCoxifhzJ1Q==} + '@vitest/utils@3.2.4': + resolution: {integrity: sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA==} + '@vscode/python-extension@1.0.5': resolution: {integrity: sha512-uYhXUrL/gn92mfqhjAwH2+yGOpjloBxj9ekoL4BhUsKcyJMpEg6WlNf3S3si+5x9zlbHHe7FYQNjZEbz1ymI9Q==} engines: {node: '>=16.17.1', vscode: ^1.78.0} @@ -2568,6 +2759,13 @@ packages: resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} engines: {node: '>=12'} + ast-types@0.16.1: + resolution: {integrity: sha512-6t10qk83GOG8p0vKmaCr8eiilZwO171AvbROMtvvNiwrTly62t+7XkA8RdIIVbpMhCASAsxgAzdRSwh6nw/5Dg==} + engines: {node: '>=4'} + + ast-v8-to-istanbul@0.3.3: + resolution: {integrity: sha512-MuXMrSLVVoA6sYN/6Hke18vMzrT4TZNbZIj/hvh0fnYFpO+/kFXcLIaiPwXXWaQUPg4yJD8fj+lfJ7/1EBconw==} + astral-regex@2.0.0: resolution: {integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==} engines: {node: '>=8'} @@ -2594,6 +2792,10 @@ packages: resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} engines: {node: '>= 0.4'} + axe-core@4.10.3: + resolution: {integrity: sha512-Xm7bpRXnDSX2YE2YFfBk2FnF0ep6tmG7xPh8iHee8MIcrgq762Nkce856dYtJYLkuIoYZvGfTs/PbZhideTcEg==} + engines: {node: '>=4'} + azure-devops-node-api@12.5.0: resolution: {integrity: sha512-R5eFskGvOm3U/GzeAuxRkUsAl0hrAwGgWn6zAd2KrZmrEhWZVqLew4OOupbQlXUuojUzpGtq62SmdhJ06N88og==} @@ -2609,6 +2811,10 @@ packages: base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + better-opn@3.0.2: + resolution: {integrity: sha512-aVNobHnJqLiUelTaHat9DZ1qM2w0C0Eym4LPI/3JxOnSokGVdsl1T1kN7TFvsEAD8G47A6VKQ0TVHqbBnYMJlQ==} + engines: {node: '>=12.0.0'} + binary-extensions@2.3.0: resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} engines: {node: '>=8'} @@ -2763,6 +2969,18 @@ packages: resolution: {integrity: sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==} engines: {node: '>=18'} + chromatic@12.2.0: + resolution: {integrity: sha512-GswmBW9ZptAoTns1BMyjbm55Z7EsIJnUvYKdQqXIBZIKbGErmpA+p4c0BYA+nzw5B0M+rb3Iqp1IaH8TFwIQew==} + hasBin: true + peerDependencies: + '@chromatic-com/cypress': ^0.*.* || ^1.0.0 + '@chromatic-com/playwright': ^0.*.* || ^1.0.0 + peerDependenciesMeta: + '@chromatic-com/cypress': + optional: true + '@chromatic-com/playwright': + optional: true + chrome-trace-event@1.0.4: resolution: {integrity: sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==} engines: {node: '>=6.0'} @@ -2983,6 +3201,10 @@ packages: resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} engines: {node: '>= 0.4'} + define-lazy-prop@2.0.0: + resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==} + engines: {node: '>=8'} + define-lazy-prop@3.0.0: resolution: {integrity: sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==} engines: {node: '>=12'} @@ -3038,6 +3260,10 @@ packages: dnd-core@16.0.1: resolution: {integrity: sha512-HK294sl7tbw6F6IeuK16YSBUoorvHpY8RHO+9yFfaJyCDVb6n7PRcezrOEOa2SBCqiYpemh5Jx20ZcjKdFAVng==} + doctrine@3.0.0: + resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} + engines: {node: '>=6.0.0'} + dom-accessibility-api@0.5.16: resolution: {integrity: sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==} @@ -3145,6 +3371,11 @@ packages: es6-promise@3.3.1: resolution: {integrity: sha512-SOp9Phqvqn7jtEUxPWdWfWoLmyt2VaJ6MpvP9Comy1MceMXqE6bxvaTu4iaxpYYPzhny28Lc+M87/c2cPK6lDg==} + esbuild-register@3.6.0: + resolution: {integrity: sha512-H2/S7Pm8a9CL1uhp9OvjwrBh5Pvx0H8qVOxNu8Wed9Y7qv56MPtq+GGM8RJpq6glYJn9Wspr8uw7l55uyinNeg==} + peerDependencies: + esbuild: '>=0.12 <1' + esbuild@0.25.5: resolution: {integrity: sha512-P8OtKZRv/5J5hhz0cUAdu/cLuPIKXpQl1R9pZtvmHWQvrAUVd0UNIPT4IB4W3rNOqVO0rlqHmCIbSwxh/c9yUQ==} engines: {node: '>=18'} @@ -3212,6 +3443,9 @@ packages: estree-util-is-identifier-name@3.0.0: resolution: {integrity: sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==} + estree-walker@2.0.2: + resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + estree-walker@3.0.3: resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} @@ -3285,6 +3519,10 @@ packages: resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} engines: {node: '>=16.0.0'} + filesize@10.1.6: + resolution: {integrity: sha512-sJslQKU2uM33qH5nqewAwVB2QgR6w1aMNsYUp3aN5rMRyXEwJGmZvaWzeJFNTOXWlHQyBFCWrdj3fV/fsTOX8w==} + engines: {node: '>= 10.4.0'} + fill-range@7.1.1: resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} engines: {node: '>=8'} @@ -3302,6 +3540,10 @@ packages: resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} engines: {node: '>=10'} + find-up@7.0.0: + resolution: {integrity: sha512-YyZM99iHrqLKjmt4LJDj58KI+fYyufRLBSYcqycxf//KpBk9FoewoGX0450m9nB44qrZnovzC2oeP5hUibxc/g==} + engines: {node: '>=18'} + flat-cache@4.0.1: resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} engines: {node: '>=16'} @@ -3641,6 +3883,11 @@ packages: is-decimal@2.0.1: resolution: {integrity: sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==} + is-docker@2.2.1: + resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} + engines: {node: '>=8'} + hasBin: true + is-docker@3.0.0: resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -3757,6 +4004,10 @@ packages: resolution: {integrity: sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==} engines: {node: '>= 0.4'} + is-wsl@2.2.0: + resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} + engines: {node: '>=8'} + is-wsl@3.1.0: resolution: {integrity: sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==} engines: {node: '>=16'} @@ -3778,6 +4029,10 @@ packages: resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} engines: {node: '>=10'} + istanbul-lib-source-maps@5.0.6: + resolution: {integrity: sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A==} + engines: {node: '>=10'} + istanbul-reports@3.1.7: resolution: {integrity: sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==} engines: {node: '>=8'} @@ -3905,6 +4160,10 @@ packages: keyv@4.5.4: resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + kleur@3.0.3: + resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} + engines: {node: '>=6'} + leven@3.1.0: resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} engines: {node: '>=6'} @@ -4002,6 +4261,10 @@ packages: resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} engines: {node: '>=10'} + locate-path@7.2.0: + resolution: {integrity: sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + lodash.camelcase@4.3.0: resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} @@ -4078,6 +4341,9 @@ packages: loupe@3.1.3: resolution: {integrity: sha512-kkIp7XSkP78ZxJEsSxW3712C6teJVoeHHwgo9zJ380de7IYyJ2ISlxojcH2pC5OFLewESmnRi/+XCDIEEVyoug==} + loupe@3.1.4: + resolution: {integrity: sha512-wJzkKwJrheKtknCOKNEtDK4iqg/MxmZheEMtSTYvnzRdEYaZzmgH976nenp8WdJRdx5Vc1X/9MO0Oszl6ezeXg==} + lru-cache@10.4.3: resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} @@ -4102,6 +4368,9 @@ packages: magic-string@0.30.17: resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==} + magicast@0.3.5: + resolution: {integrity: sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ==} + make-dir@4.0.0: resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} engines: {node: '>=10'} @@ -4421,6 +4690,10 @@ packages: resolution: {integrity: sha512-cxN6aIDPz6rm8hbebcP7vrQNhvRcveZoJU72Y7vskh4oIm+BZwBECnx5nTmrlres1Qapvx27Qo1Auukpf8PKXw==} engines: {node: '>=18'} + open@8.4.2: + resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} + engines: {node: '>=12'} + openapi-types@12.1.3: resolution: {integrity: sha512-N4YtSYJqghVu4iek2ZUvcN/0aqH1kRDuNqzcycDxhOUpg7GdvLa2F3DgS6yBNhInhv2r/6I0Flkn7CqL8+nIcw==} @@ -4450,10 +4723,18 @@ packages: resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} engines: {node: '>=10'} + p-limit@4.0.0: + resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + p-locate@5.0.0: resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} engines: {node: '>=10'} + p-locate@6.0.0: + resolution: {integrity: sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + p-map@4.0.0: resolution: {integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==} engines: {node: '>=10'} @@ -4491,6 +4772,10 @@ packages: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} engines: {node: '>=8'} + path-exists@5.0.0: + resolution: {integrity: sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + path-is-absolute@1.0.1: resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} engines: {node: '>=0.10.0'} @@ -4552,11 +4837,21 @@ packages: engines: {node: '>=18'} hasBin: true + playwright-core@1.53.2: + resolution: {integrity: sha512-ox/OytMy+2w1jcYEYlOo1Hhp8hZkLCximMTUTMBXjGUA1KoFfiSZ+DU+3a739jsPY0yoKH2TFy9S2fsJas8yAw==} + engines: {node: '>=18'} + hasBin: true + playwright@1.52.0: resolution: {integrity: sha512-JAwMNMBlxJ2oD1kce4KPtMkDeKGHQstdpFPcPH3maElAXon/QZeTvtsfXmTMRyO9TslfoYOXkSsvao2nE1ilTw==} engines: {node: '>=18'} hasBin: true + playwright@1.53.2: + resolution: {integrity: sha512-6K/qQxVFuVQhRQhFsVZ9fGeatxirtrpPgxzBYWyZLEXJzqYwuL4fuNmfOfD5et1tJE4GScKyPNeLhZeRwuTU3A==} + engines: {node: '>=18'} + hasBin: true + pluralize@2.0.0: resolution: {integrity: sha512-TqNZzQCD4S42De9IfnnBvILN7HAW7riLqsCyp8lgjXeysyPlX5HhqKAcJHHHb9XskE4/a+7VGC9zzx8Ls0jOAw==} @@ -4634,6 +4929,10 @@ packages: process-nextick-args@2.0.1: resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + prompts@2.4.2: + resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} + engines: {node: '>= 6'} + prop-types@15.8.1: resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} @@ -4686,6 +4985,15 @@ packages: '@types/react': optional: true + react-docgen-typescript@2.4.0: + resolution: {integrity: sha512-ZtAp5XTO5HRzQctjPU0ybY0RRCQO19X/8fxn3w7y2VVTUbGHDKULPTL4ky3vB05euSgG5NpALhEhDPvQ56wvXg==} + peerDependencies: + typescript: '>= 4.3.x' + + react-docgen@8.0.0: + resolution: {integrity: sha512-kmob/FOTwep7DUWf9KjuenKX0vyvChr3oTdvvPt09V60Iz75FJp+T/0ZeHMbAfJj2WaVWqAPP5Hmm3PYzSPPKg==} + engines: {node: ^20.9.0 || >=22} + react-dom@18.3.1: resolution: {integrity: sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==} peerDependencies: @@ -4788,6 +5096,10 @@ packages: resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} engines: {node: '>= 14.18.0'} + recast@0.23.11: + resolution: {integrity: sha512-YTUo+Flmw4ZXiWfQKGcwwc11KnoRAYgzAE2E7mXKCjSviTKShtxBsN6YUUBB2gtaBzKzeKunxhUwNHQuRryhWA==} + engines: {node: '>= 4'} + redent@3.0.0: resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} engines: {node: '>=8'} @@ -5008,6 +5320,9 @@ packages: resolution: {integrity: sha512-FoqMu0NCGBLCcAkS1qA+XJIQTR6/JHfQXl+uGteNCQ76T91DMUjPa9xfmeqMY3z80nLSg9yQmNjK0Px6RWsH/A==} engines: {node: '>=18'} + sisteransi@1.0.5: + resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} + slash@3.0.0: resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} engines: {node: '>=8'} @@ -5073,6 +5388,15 @@ packages: resolution: {integrity: sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==} engines: {node: '>= 0.4'} + storybook@9.0.15: + resolution: {integrity: sha512-r9hwcSMM3dq7dkMveaWFTosrmyHCL2FRrV3JOwVnVWraF6GtCgp2k+r4hsYtyp1bY3zdmK9e4KYzXsGs5q1h/Q==} + hasBin: true + peerDependencies: + prettier: ^2 || ^3 + peerDependenciesMeta: + prettier: + optional: true + string-argv@0.3.2: resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} engines: {node: '>=0.6.19'} @@ -5118,6 +5442,10 @@ packages: resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} engines: {node: '>=12'} + strip-bom@3.0.0: + resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} + engines: {node: '>=4'} + strip-final-newline@2.0.0: resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} engines: {node: '>=6'} @@ -5126,6 +5454,10 @@ packages: resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} engines: {node: '>=8'} + strip-indent@4.0.0: + resolution: {integrity: sha512-mnVSV2l+Zv6BLpSD/8V87CW/y9EmmbYzGCIavsnsI6/nwn26DwffM/yztm30Z/I2DY9wdS3vXVCMnHDgZaVNoA==} + engines: {node: '>=12'} + strip-json-comments@2.0.1: resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} engines: {node: '>=0.10.0'} @@ -5244,6 +5576,10 @@ packages: resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} engines: {node: '>=8'} + test-exclude@7.0.1: + resolution: {integrity: sha512-pFYqmTw68LXVjeWJMST4+borgQP2AyMNbg1BpZh9LbyhUeNkeaPF9gzfPGUAnSMV3qPYdWUwDIjjCLiSDOl7vg==} + engines: {node: '>=18'} + text-table@0.2.0: resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} @@ -5335,6 +5671,10 @@ packages: peerDependencies: typescript: '>=4.8.4' + ts-dedent@2.2.0: + resolution: {integrity: sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==} + engines: {node: '>=6.10'} + ts-interface-checker@0.1.13: resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} @@ -5355,6 +5695,10 @@ packages: typescript: optional: true + tsconfig-paths@4.2.0: + resolution: {integrity: sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==} + engines: {node: '>=6'} + tslib@1.14.1: resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} @@ -5457,6 +5801,10 @@ packages: resolution: {integrity: sha512-gBLkYIlEnSp8pFbT64yFgGE6UIB9tAkhukC23PmMDCe5Nd+cRqKxSjw5y54MK2AZMgZfJWMaNE4nYUHgi1XEOw==} engines: {node: '>=18.17'} + unicorn-magic@0.1.0: + resolution: {integrity: sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==} + engines: {node: '>=18'} + unicorn-magic@0.3.0: resolution: {integrity: sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==} engines: {node: '>=18'} @@ -5483,6 +5831,10 @@ packages: resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} engines: {node: '>= 10.0.0'} + unplugin@1.16.1: + resolution: {integrity: sha512-4/u/j4FrCKdi17jaxuJA0jClGxB1AvU2hw/IuayPc4ay1XGaJs/rbb4v5WKwAjNifjmXK9PIFyuPiaK8azyR9w==} + engines: {node: '>=14.0.0'} + unplugin@2.3.5: resolution: {integrity: sha512-RyWSb5AHmGtjjNQ6gIlA67sHOsWpsbWpwDokLwTcejVdOjEkJZh7QKu14J00gDDVSh8kGH4KYC/TNBceXFZhtw==} engines: {node: '>=18.12.0'} @@ -5839,6 +6191,10 @@ packages: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} + yocto-queue@1.2.1: + resolution: {integrity: sha512-AyeEbWOu/TAXdxlV9wmGcR0+yh2j3vYPGOECcIj2S7MkrLyC7ne+oye2BKTItt0ii2PHk4cDy+95+LshzbXnGg==} + engines: {node: '>=12.20'} + zod@3.25.55: resolution: {integrity: sha512-219huNnkSLQnLsQ3uaRjXsxMrVm5C9W3OOpEVt2k5tvMKuA8nBSu38e0B//a+he9Iq2dvmk2VyYVlHqiHa4YBA==} @@ -6135,6 +6491,20 @@ snapshots: '@bcoe/v8-coverage@0.2.3': {} + '@bcoe/v8-coverage@1.0.2': {} + + '@chromatic-com/storybook@4.0.1(storybook@9.0.15(@testing-library/dom@10.4.0)(prettier@3.5.3))': + dependencies: + '@neoconfetti/react': 1.0.0 + chromatic: 12.2.0 + filesize: 10.1.6 + jsonfile: 6.1.0 + storybook: 9.0.15(@testing-library/dom@10.4.0)(prettier@3.5.3) + strip-ansi: 7.1.0 + transitivePeerDependencies: + - '@chromatic-com/cypress' + - '@chromatic-com/playwright' + '@codemirror/autocomplete@6.18.6': dependencies: '@codemirror/language': 6.11.1 @@ -6462,6 +6832,15 @@ snapshots: '@istanbuljs/schema@0.1.3': {} + '@joshwooding/vite-plugin-react-docgen-typescript@0.6.1(typescript@5.8.3)(vite@6.3.5(@types/node@22.15.30)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.19.4)(yaml@2.8.0))': + dependencies: + glob: 10.4.5 + magic-string: 0.30.17 + react-docgen-typescript: 2.4.0(typescript@5.8.3) + vite: 6.3.5(@types/node@22.15.30)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.19.4)(yaml@2.8.0) + optionalDependencies: + typescript: 5.8.3 + '@jridgewell/gen-mapping@0.3.8': dependencies: '@jridgewell/set-array': 1.2.1 @@ -6520,6 +6899,14 @@ snapshots: '@marijn/find-cluster-break@1.0.2': {} + '@mdx-js/react@3.1.0(@types/react@18.3.23)(react@18.3.1)': + dependencies: + '@types/mdx': 2.0.13 + '@types/react': 18.3.23 + react: 18.3.1 + + '@neoconfetti/react@1.0.0': {} + '@nodelib/fs.scandir@2.1.5': dependencies: '@nodelib/fs.stat': 2.0.5 @@ -7066,6 +7453,14 @@ snapshots: '@rolldown/pluginutils@1.0.0-beta.9': {} + '@rollup/pluginutils@5.2.0(rollup@4.41.1)': + dependencies: + '@types/estree': 1.0.8 + estree-walker: 2.0.2 + picomatch: 4.0.2 + optionalDependencies: + rollup: 4.41.1 + '@rollup/rollup-android-arm-eabi@4.41.1': optional: true @@ -7385,6 +7780,99 @@ snapshots: '@stoplight/yaml-ast-parser': 0.0.50 tslib: 2.8.1 + '@storybook/addon-a11y@9.0.15(storybook@9.0.15(@testing-library/dom@10.4.0)(prettier@3.5.3))': + dependencies: + '@storybook/global': 5.0.0 + axe-core: 4.10.3 + storybook: 9.0.15(@testing-library/dom@10.4.0)(prettier@3.5.3) + + '@storybook/addon-docs@9.0.15(@types/react@18.3.23)(storybook@9.0.15(@testing-library/dom@10.4.0)(prettier@3.5.3))': + dependencies: + '@mdx-js/react': 3.1.0(@types/react@18.3.23)(react@18.3.1) + '@storybook/csf-plugin': 9.0.15(storybook@9.0.15(@testing-library/dom@10.4.0)(prettier@3.5.3)) + '@storybook/icons': 1.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@storybook/react-dom-shim': 9.0.15(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@9.0.15(@testing-library/dom@10.4.0)(prettier@3.5.3)) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + storybook: 9.0.15(@testing-library/dom@10.4.0)(prettier@3.5.3) + ts-dedent: 2.2.0 + transitivePeerDependencies: + - '@types/react' + + '@storybook/addon-onboarding@9.0.15(storybook@9.0.15(@testing-library/dom@10.4.0)(prettier@3.5.3))': + dependencies: + storybook: 9.0.15(@testing-library/dom@10.4.0)(prettier@3.5.3) + + '@storybook/addon-vitest@9.0.15(@vitest/browser@3.2.3)(@vitest/runner@3.2.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@9.0.15(@testing-library/dom@10.4.0)(prettier@3.5.3))(vitest@3.2.3)': + dependencies: + '@storybook/global': 5.0.0 + '@storybook/icons': 1.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + prompts: 2.4.2 + storybook: 9.0.15(@testing-library/dom@10.4.0)(prettier@3.5.3) + ts-dedent: 2.2.0 + optionalDependencies: + '@vitest/browser': 3.2.3(playwright@1.53.2)(vite@6.3.5(@types/node@22.15.30)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.19.4)(yaml@2.8.0))(vitest@3.2.3) + '@vitest/runner': 3.2.3 + vitest: 3.2.3(@types/debug@4.1.12)(@types/node@22.15.30)(@vitest/browser@3.2.3)(@vitest/ui@3.2.3)(jiti@2.4.2)(jsdom@26.1.0)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.19.4)(yaml@2.8.0) + transitivePeerDependencies: + - react + - react-dom + + '@storybook/builder-vite@9.0.15(storybook@9.0.15(@testing-library/dom@10.4.0)(prettier@3.5.3))(vite@6.3.5(@types/node@22.15.30)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.19.4)(yaml@2.8.0))': + dependencies: + '@storybook/csf-plugin': 9.0.15(storybook@9.0.15(@testing-library/dom@10.4.0)(prettier@3.5.3)) + storybook: 9.0.15(@testing-library/dom@10.4.0)(prettier@3.5.3) + ts-dedent: 2.2.0 + vite: 6.3.5(@types/node@22.15.30)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.19.4)(yaml@2.8.0) + + '@storybook/csf-plugin@9.0.15(storybook@9.0.15(@testing-library/dom@10.4.0)(prettier@3.5.3))': + dependencies: + storybook: 9.0.15(@testing-library/dom@10.4.0)(prettier@3.5.3) + unplugin: 1.16.1 + + '@storybook/global@5.0.0': {} + + '@storybook/icons@1.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + '@storybook/react-dom-shim@9.0.15(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@9.0.15(@testing-library/dom@10.4.0)(prettier@3.5.3))': + dependencies: + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + storybook: 9.0.15(@testing-library/dom@10.4.0)(prettier@3.5.3) + + '@storybook/react-vite@9.0.15(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rollup@4.41.1)(storybook@9.0.15(@testing-library/dom@10.4.0)(prettier@3.5.3))(typescript@5.8.3)(vite@6.3.5(@types/node@22.15.30)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.19.4)(yaml@2.8.0))': + dependencies: + '@joshwooding/vite-plugin-react-docgen-typescript': 0.6.1(typescript@5.8.3)(vite@6.3.5(@types/node@22.15.30)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.19.4)(yaml@2.8.0)) + '@rollup/pluginutils': 5.2.0(rollup@4.41.1) + '@storybook/builder-vite': 9.0.15(storybook@9.0.15(@testing-library/dom@10.4.0)(prettier@3.5.3))(vite@6.3.5(@types/node@22.15.30)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.19.4)(yaml@2.8.0)) + '@storybook/react': 9.0.15(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@9.0.15(@testing-library/dom@10.4.0)(prettier@3.5.3))(typescript@5.8.3) + find-up: 7.0.0 + magic-string: 0.30.17 + react: 18.3.1 + react-docgen: 8.0.0 + react-dom: 18.3.1(react@18.3.1) + resolve: 1.22.10 + storybook: 9.0.15(@testing-library/dom@10.4.0)(prettier@3.5.3) + tsconfig-paths: 4.2.0 + vite: 6.3.5(@types/node@22.15.30)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.19.4)(yaml@2.8.0) + transitivePeerDependencies: + - rollup + - supports-color + - typescript + + '@storybook/react@9.0.15(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@9.0.15(@testing-library/dom@10.4.0)(prettier@3.5.3))(typescript@5.8.3)': + dependencies: + '@storybook/global': 5.0.0 + '@storybook/react-dom-shim': 9.0.15(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@9.0.15(@testing-library/dom@10.4.0)(prettier@3.5.3)) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + storybook: 9.0.15(@testing-library/dom@10.4.0)(prettier@3.5.3) + optionalDependencies: + typescript: 5.8.3 + '@swc/core-darwin-arm64@1.11.31': optional: true @@ -7601,7 +8089,7 @@ snapshots: optionalDependencies: '@tanstack/react-router': 1.120.16(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@tanstack/router-plugin@1.120.16(@tanstack/react-router@1.120.16(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(vite@6.3.5(@types/node@22.15.30)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.19.4)(yaml@2.8.0))(webpack@5.99.8)': + '@tanstack/router-plugin@1.120.16(@tanstack/react-router@1.120.16(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(vite@6.3.5(@types/node@22.15.30)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.19.4)(yaml@2.8.0))(webpack@5.99.8(esbuild@0.25.5))': dependencies: '@babel/core': 7.27.4 '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.27.4) @@ -7623,7 +8111,7 @@ snapshots: optionalDependencies: '@tanstack/react-router': 1.120.16(react-dom@18.3.1(react@18.3.1))(react@18.3.1) vite: 6.3.5(@types/node@22.15.30)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.19.4)(yaml@2.8.0) - webpack: 5.99.8 + webpack: 5.99.8(esbuild@0.25.5) transitivePeerDependencies: - supports-color @@ -7860,6 +8348,8 @@ snapshots: '@types/deep-eql@4.0.2': {} + '@types/doctrine@0.0.9': {} + '@types/es-aggregate-error@1.0.6': dependencies: '@types/node': 22.15.30 @@ -7905,6 +8395,8 @@ snapshots: dependencies: '@types/unist': 3.0.3 + '@types/mdx@2.0.13': {} + '@types/mocha@10.0.10': {} '@types/ms@2.1.0': {} @@ -7936,6 +8428,8 @@ snapshots: '@types/prop-types': 15.7.14 csstype: 3.1.3 + '@types/resolve@1.20.6': {} + '@types/sarif@2.1.7': {} '@types/unist@2.0.11': {} @@ -8100,6 +8594,66 @@ snapshots: transitivePeerDependencies: - supports-color + '@vitest/browser@3.2.3(playwright@1.53.2)(vite@6.3.5(@types/node@20.11.25)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.19.4)(yaml@2.8.0))(vitest@3.2.3)': + dependencies: + '@testing-library/dom': 10.4.0 + '@testing-library/user-event': 14.6.1(@testing-library/dom@10.4.0) + '@vitest/mocker': 3.2.3(vite@6.3.5(@types/node@20.11.25)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.19.4)(yaml@2.8.0)) + '@vitest/utils': 3.2.3 + magic-string: 0.30.17 + sirv: 3.0.1 + tinyrainbow: 2.0.0 + vitest: 3.2.3(@types/debug@4.1.12)(@types/node@20.11.25)(@vitest/browser@3.2.3)(@vitest/ui@3.2.3)(jiti@2.4.2)(jsdom@26.1.0)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.19.4)(yaml@2.8.0) + ws: 8.18.2 + optionalDependencies: + playwright: 1.53.2 + transitivePeerDependencies: + - bufferutil + - msw + - utf-8-validate + - vite + optional: true + + '@vitest/browser@3.2.3(playwright@1.53.2)(vite@6.3.5(@types/node@22.15.30)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.19.4)(yaml@2.8.0))(vitest@3.2.3)': + dependencies: + '@testing-library/dom': 10.4.0 + '@testing-library/user-event': 14.6.1(@testing-library/dom@10.4.0) + '@vitest/mocker': 3.2.3(vite@6.3.5(@types/node@22.15.30)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.19.4)(yaml@2.8.0)) + '@vitest/utils': 3.2.3 + magic-string: 0.30.17 + sirv: 3.0.1 + tinyrainbow: 2.0.0 + vitest: 3.2.3(@types/debug@4.1.12)(@types/node@22.15.30)(@vitest/browser@3.2.3)(@vitest/ui@3.2.3)(jiti@2.4.2)(jsdom@26.1.0)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.19.4)(yaml@2.8.0) + ws: 8.18.2 + optionalDependencies: + playwright: 1.53.2 + transitivePeerDependencies: + - bufferutil + - msw + - utf-8-validate + - vite + + '@vitest/coverage-v8@3.2.3(@vitest/browser@3.2.3)(vitest@3.2.3)': + dependencies: + '@ampproject/remapping': 2.3.0 + '@bcoe/v8-coverage': 1.0.2 + ast-v8-to-istanbul: 0.3.3 + debug: 4.4.1(supports-color@8.1.1) + istanbul-lib-coverage: 3.2.2 + istanbul-lib-report: 3.0.1 + istanbul-lib-source-maps: 5.0.6 + istanbul-reports: 3.1.7 + magic-string: 0.30.17 + magicast: 0.3.5 + std-env: 3.9.0 + test-exclude: 7.0.1 + tinyrainbow: 2.0.0 + vitest: 3.2.3(@types/debug@4.1.12)(@types/node@22.15.30)(@vitest/browser@3.2.3)(@vitest/ui@3.2.3)(jiti@2.4.2)(jsdom@26.1.0)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.19.4)(yaml@2.8.0) + optionalDependencies: + '@vitest/browser': 3.2.3(playwright@1.53.2)(vite@6.3.5(@types/node@22.15.30)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.19.4)(yaml@2.8.0))(vitest@3.2.3) + transitivePeerDependencies: + - supports-color + '@vitest/expect@3.2.3': dependencies: '@types/chai': 5.2.2 @@ -8108,6 +8662,14 @@ snapshots: chai: 5.2.0 tinyrainbow: 2.0.0 + '@vitest/expect@3.2.4': + dependencies: + '@types/chai': 5.2.2 + '@vitest/spy': 3.2.4 + '@vitest/utils': 3.2.4 + chai: 5.2.0 + tinyrainbow: 2.0.0 + '@vitest/mocker@3.2.3(vite@6.3.5(@types/node@20.11.25)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.19.4)(yaml@2.8.0))': dependencies: '@vitest/spy': 3.2.3 @@ -8128,6 +8690,10 @@ snapshots: dependencies: tinyrainbow: 2.0.0 + '@vitest/pretty-format@3.2.4': + dependencies: + tinyrainbow: 2.0.0 + '@vitest/runner@3.2.3': dependencies: '@vitest/utils': 3.2.3 @@ -8144,6 +8710,10 @@ snapshots: dependencies: tinyspy: 4.0.3 + '@vitest/spy@3.2.4': + dependencies: + tinyspy: 4.0.3 + '@vitest/ui@3.2.3(vitest@3.2.3)': dependencies: '@vitest/utils': 3.2.3 @@ -8153,7 +8723,7 @@ snapshots: sirv: 3.0.1 tinyglobby: 0.2.14 tinyrainbow: 2.0.0 - vitest: 3.2.3(@types/debug@4.1.12)(@types/node@20.11.25)(@vitest/ui@3.2.3)(jiti@2.4.2)(jsdom@26.1.0)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.19.4)(yaml@2.8.0) + vitest: 3.2.3(@types/debug@4.1.12)(@types/node@20.11.25)(@vitest/browser@3.2.3)(@vitest/ui@3.2.3)(jiti@2.4.2)(jsdom@26.1.0)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.19.4)(yaml@2.8.0) '@vitest/utils@3.2.3': dependencies: @@ -8161,6 +8731,12 @@ snapshots: loupe: 3.1.3 tinyrainbow: 2.0.0 + '@vitest/utils@3.2.4': + dependencies: + '@vitest/pretty-format': 3.2.4 + loupe: 3.1.4 + tinyrainbow: 2.0.0 + '@vscode/python-extension@1.0.5': {} '@vscode/test-cli@0.0.10': @@ -8470,6 +9046,16 @@ snapshots: assertion-error@2.0.1: {} + ast-types@0.16.1: + dependencies: + tslib: 2.8.1 + + ast-v8-to-istanbul@0.3.3: + dependencies: + '@jridgewell/trace-mapping': 0.3.25 + estree-walker: 3.0.3 + js-tokens: 9.0.1 + astral-regex@2.0.0: {} astring@1.9.0: {} @@ -8492,6 +9078,8 @@ snapshots: dependencies: possible-typed-array-names: 1.1.0 + axe-core@4.10.3: {} + azure-devops-node-api@12.5.0: dependencies: tunnel: 0.0.6 @@ -8513,6 +9101,10 @@ snapshots: base64-js@1.5.1: optional: true + better-opn@3.0.2: + dependencies: + open: 8.4.2 + binary-extensions@2.3.0: {} binaryextensions@6.11.0: @@ -8695,6 +9287,8 @@ snapshots: chownr@3.0.0: {} + chromatic@12.2.0: {} + chrome-trace-event@1.0.4: {} classcat@5.0.5: {} @@ -8902,6 +9496,8 @@ snapshots: es-errors: 1.3.0 gopd: 1.2.0 + define-lazy-prop@2.0.0: {} + define-lazy-prop@3.0.0: {} define-properties@1.2.1: @@ -8944,6 +9540,10 @@ snapshots: '@react-dnd/invariant': 4.0.2 redux: 4.2.1 + doctrine@3.0.0: + dependencies: + esutils: 2.0.3 + dom-accessibility-api@0.5.16: {} dom-accessibility-api@0.6.3: {} @@ -9113,6 +9713,13 @@ snapshots: es6-promise@3.3.1: {} + esbuild-register@3.6.0(esbuild@0.25.5): + dependencies: + debug: 4.4.1(supports-color@8.1.1) + esbuild: 0.25.5 + transitivePeerDependencies: + - supports-color + esbuild@0.25.5: optionalDependencies: '@esbuild/aix-ppc64': 0.25.5 @@ -9223,6 +9830,8 @@ snapshots: estree-util-is-identifier-name@3.0.0: {} + estree-walker@2.0.2: {} + estree-walker@3.0.3: dependencies: '@types/estree': 1.0.8 @@ -9290,6 +9899,8 @@ snapshots: dependencies: flat-cache: 4.0.1 + filesize@10.1.6: {} + fill-range@7.1.1: dependencies: to-regex-range: 5.0.1 @@ -9301,6 +9912,12 @@ snapshots: locate-path: 6.0.0 path-exists: 4.0.0 + find-up@7.0.0: + dependencies: + locate-path: 7.2.0 + path-exists: 5.0.0 + unicorn-magic: 0.1.0 + flat-cache@4.0.1: dependencies: flatted: 3.3.3 @@ -9680,6 +10297,8 @@ snapshots: is-decimal@2.0.1: {} + is-docker@2.2.1: {} + is-docker@3.0.0: {} is-extglob@2.1.1: {} @@ -9773,6 +10392,10 @@ snapshots: call-bound: 1.0.4 get-intrinsic: 1.3.0 + is-wsl@2.2.0: + dependencies: + is-docker: 2.2.1 + is-wsl@3.1.0: dependencies: is-inside-container: 1.0.0 @@ -9791,6 +10414,14 @@ snapshots: make-dir: 4.0.0 supports-color: 7.2.0 + istanbul-lib-source-maps@5.0.6: + dependencies: + '@jridgewell/trace-mapping': 0.3.25 + debug: 4.4.1(supports-color@8.1.1) + istanbul-lib-coverage: 3.2.2 + transitivePeerDependencies: + - supports-color + istanbul-reports@3.1.7: dependencies: html-escaper: 2.0.2 @@ -9943,6 +10574,8 @@ snapshots: dependencies: json-buffer: 3.0.1 + kleur@3.0.3: {} + leven@3.1.0: {} levn@0.4.1: @@ -10015,6 +10648,10 @@ snapshots: dependencies: p-locate: 5.0.0 + locate-path@7.2.0: + dependencies: + p-locate: 6.0.0 + lodash.camelcase@4.3.0: {} lodash.includes@4.3.0: {} @@ -10071,6 +10708,8 @@ snapshots: loupe@3.1.3: {} + loupe@3.1.4: {} + lru-cache@10.4.3: {} lru-cache@11.1.0: {} @@ -10091,6 +10730,12 @@ snapshots: dependencies: '@jridgewell/sourcemap-codec': 1.5.0 + magicast@0.3.5: + dependencies: + '@babel/parser': 7.27.5 + '@babel/types': 7.27.6 + source-map-js: 1.2.1 + make-dir@4.0.0: dependencies: semver: 7.7.2 @@ -10376,8 +11021,7 @@ snapshots: dependencies: brace-expansion: 2.0.1 - minimist@1.2.8: - optional: true + minimist@1.2.8: {} minipass@7.1.2: {} @@ -10558,6 +11202,12 @@ snapshots: is-inside-container: 1.0.0 is-wsl: 3.1.0 + open@8.4.2: + dependencies: + define-lazy-prop: 2.0.0 + is-docker: 2.2.1 + is-wsl: 2.2.0 + openapi-types@12.1.3: {} openapi3-ts@4.2.2: @@ -10632,10 +11282,18 @@ snapshots: dependencies: yocto-queue: 0.1.0 + p-limit@4.0.0: + dependencies: + yocto-queue: 1.2.1 + p-locate@5.0.0: dependencies: p-limit: 3.1.0 + p-locate@6.0.0: + dependencies: + p-limit: 4.0.0 + p-map@4.0.0: dependencies: aggregate-error: 3.1.0 @@ -10685,6 +11343,8 @@ snapshots: path-exists@4.0.0: {} + path-exists@5.0.0: {} + path-is-absolute@1.0.1: {} path-key@3.1.1: {} @@ -10723,12 +11383,20 @@ snapshots: playwright-core@1.52.0: {} + playwright-core@1.53.2: {} + playwright@1.52.0: dependencies: playwright-core: 1.52.0 optionalDependencies: fsevents: 2.3.2 + playwright@1.53.2: + dependencies: + playwright-core: 1.53.2 + optionalDependencies: + fsevents: 2.3.2 + pluralize@2.0.0: {} pluralize@8.0.0: {} @@ -10802,6 +11470,11 @@ snapshots: process-nextick-args@2.0.1: {} + prompts@2.4.2: + dependencies: + kleur: 3.0.3 + sisteransi: 1.0.5 + prop-types@15.8.1: dependencies: loose-envify: 1.4.0 @@ -10863,6 +11536,25 @@ snapshots: '@types/node': 22.15.30 '@types/react': 18.3.23 + react-docgen-typescript@2.4.0(typescript@5.8.3): + dependencies: + typescript: 5.8.3 + + react-docgen@8.0.0: + dependencies: + '@babel/core': 7.27.4 + '@babel/traverse': 7.27.4 + '@babel/types': 7.27.6 + '@types/babel__core': 7.20.5 + '@types/babel__traverse': 7.20.7 + '@types/doctrine': 0.0.9 + '@types/resolve': 1.20.6 + doctrine: 3.0.0 + resolve: 1.22.10 + strip-indent: 4.0.0 + transitivePeerDependencies: + - supports-color + react-dom@18.3.1(react@18.3.1): dependencies: loose-envify: 1.4.0 @@ -10990,6 +11682,14 @@ snapshots: readdirp@4.1.2: {} + recast@0.23.11: + dependencies: + ast-types: 0.16.1 + esprima: 4.0.1 + source-map: 0.6.1 + tiny-invariant: 1.3.3 + tslib: 2.8.1 + redent@3.0.0: dependencies: indent-string: 4.0.0 @@ -11277,6 +11977,8 @@ snapshots: mrmime: 2.0.1 totalist: 3.0.1 + sisteransi@1.0.5: {} + slash@3.0.0: {} slash@5.1.0: {} @@ -11335,6 +12037,27 @@ snapshots: es-errors: 1.3.0 internal-slot: 1.1.0 + storybook@9.0.15(@testing-library/dom@10.4.0)(prettier@3.5.3): + dependencies: + '@storybook/global': 5.0.0 + '@testing-library/jest-dom': 6.6.3 + '@testing-library/user-event': 14.6.1(@testing-library/dom@10.4.0) + '@vitest/expect': 3.2.4 + '@vitest/spy': 3.2.4 + better-opn: 3.0.2 + esbuild: 0.25.5 + esbuild-register: 3.6.0(esbuild@0.25.5) + recast: 0.23.11 + semver: 7.7.2 + ws: 8.18.2 + optionalDependencies: + prettier: 3.5.3 + transitivePeerDependencies: + - '@testing-library/dom' + - bufferutil + - supports-color + - utf-8-validate + string-argv@0.3.2: {} string-width@4.2.3: @@ -11400,12 +12123,18 @@ snapshots: dependencies: ansi-regex: 6.1.0 + strip-bom@3.0.0: {} + strip-final-newline@2.0.0: {} strip-indent@3.0.0: dependencies: min-indent: 1.0.1 + strip-indent@4.0.0: + dependencies: + min-indent: 1.0.1 + strip-json-comments@2.0.1: optional: true @@ -11562,16 +12291,6 @@ snapshots: optionalDependencies: esbuild: 0.25.5 - terser-webpack-plugin@5.3.14(webpack@5.99.8): - dependencies: - '@jridgewell/trace-mapping': 0.3.25 - jest-worker: 27.5.1 - schema-utils: 4.3.2 - serialize-javascript: 6.0.2 - terser: 5.43.1 - webpack: 5.99.8 - optional: true - terser@5.43.1: dependencies: '@jridgewell/source-map': 0.3.6 @@ -11585,6 +12304,12 @@ snapshots: glob: 7.2.3 minimatch: 3.1.2 + test-exclude@7.0.1: + dependencies: + '@istanbuljs/schema': 0.1.3 + glob: 10.4.5 + minimatch: 9.0.5 + text-table@0.2.0: {} textextensions@6.11.0: @@ -11656,6 +12381,8 @@ snapshots: dependencies: typescript: 5.8.3 + ts-dedent@2.2.0: {} + ts-interface-checker@0.1.13: {} ts-loader@9.5.2(typescript@5.8.3)(webpack@5.99.8(esbuild@0.25.5)): @@ -11672,6 +12399,12 @@ snapshots: optionalDependencies: typescript: 5.8.3 + tsconfig-paths@4.2.0: + dependencies: + json5: 2.2.3 + minimist: 1.2.8 + strip-bom: 3.0.0 + tslib@1.14.1: {} tslib@2.8.1: {} @@ -11783,6 +12516,8 @@ snapshots: undici@6.21.3: {} + unicorn-magic@0.1.0: {} + unicorn-magic@0.3.0: {} unified@11.0.5: @@ -11820,6 +12555,11 @@ snapshots: universalify@2.0.1: {} + unplugin@1.16.1: + dependencies: + acorn: 8.15.0 + webpack-virtual-modules: 0.6.2 + unplugin@2.3.5: dependencies: acorn: 8.14.1 @@ -11970,7 +12710,7 @@ snapshots: tsx: 4.19.4 yaml: 2.8.0 - vitest@3.2.3(@types/debug@4.1.12)(@types/node@20.11.25)(@vitest/ui@3.2.3)(jiti@2.4.2)(jsdom@26.1.0)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.19.4)(yaml@2.8.0): + vitest@3.2.3(@types/debug@4.1.12)(@types/node@20.11.25)(@vitest/browser@3.2.3)(@vitest/ui@3.2.3)(jiti@2.4.2)(jsdom@26.1.0)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.19.4)(yaml@2.8.0): dependencies: '@types/chai': 5.2.2 '@vitest/expect': 3.2.3 @@ -11998,6 +12738,7 @@ snapshots: optionalDependencies: '@types/debug': 4.1.12 '@types/node': 20.11.25 + '@vitest/browser': 3.2.3(playwright@1.53.2)(vite@6.3.5(@types/node@20.11.25)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.19.4)(yaml@2.8.0))(vitest@3.2.3) '@vitest/ui': 3.2.3(vitest@3.2.3) jsdom: 26.1.0 transitivePeerDependencies: @@ -12014,7 +12755,7 @@ snapshots: - tsx - yaml - vitest@3.2.3(@types/debug@4.1.12)(@types/node@22.15.30)(@vitest/ui@3.2.3)(jiti@2.4.2)(jsdom@26.1.0)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.19.4)(yaml@2.8.0): + vitest@3.2.3(@types/debug@4.1.12)(@types/node@22.15.30)(@vitest/browser@3.2.3)(@vitest/ui@3.2.3)(jiti@2.4.2)(jsdom@26.1.0)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.19.4)(yaml@2.8.0): dependencies: '@types/chai': 5.2.2 '@vitest/expect': 3.2.3 @@ -12042,6 +12783,7 @@ snapshots: optionalDependencies: '@types/debug': 4.1.12 '@types/node': 22.15.30 + '@vitest/browser': 3.2.3(playwright@1.53.2)(vite@6.3.5(@types/node@22.15.30)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.19.4)(yaml@2.8.0))(vitest@3.2.3) '@vitest/ui': 3.2.3(vitest@3.2.3) jsdom: 26.1.0 transitivePeerDependencies: @@ -12098,38 +12840,6 @@ snapshots: webpack-virtual-modules@0.6.2: {} - webpack@5.99.8: - dependencies: - '@types/eslint-scope': 3.7.7 - '@types/estree': 1.0.8 - '@types/json-schema': 7.0.15 - '@webassemblyjs/ast': 1.14.1 - '@webassemblyjs/wasm-edit': 1.14.1 - '@webassemblyjs/wasm-parser': 1.14.1 - acorn: 8.15.0 - browserslist: 4.25.0 - chrome-trace-event: 1.0.4 - enhanced-resolve: 5.18.1 - es-module-lexer: 1.7.0 - eslint-scope: 5.1.1 - events: 3.3.0 - glob-to-regexp: 0.4.1 - graceful-fs: 4.2.11 - json-parse-even-better-errors: 2.3.1 - loader-runner: 4.3.0 - mime-types: 2.1.35 - neo-async: 2.6.2 - schema-utils: 4.3.2 - tapable: 2.2.2 - terser-webpack-plugin: 5.3.14(webpack@5.99.8) - watchpack: 2.4.4 - webpack-sources: 3.3.3 - transitivePeerDependencies: - - '@swc/core' - - esbuild - - uglify-js - optional: true - webpack@5.99.8(esbuild@0.25.5): dependencies: '@types/eslint-scope': 3.7.7 @@ -12314,6 +13024,8 @@ snapshots: yocto-queue@0.1.0: {} + yocto-queue@1.2.1: {} + zod@3.25.55: {} zustand@4.5.7(@types/react@18.3.23)(immer@9.0.21)(react@18.3.1): diff --git a/vscode/react/.gitignore b/vscode/react/.gitignore index d451ff16c1..85125ac8c1 100644 --- a/vscode/react/.gitignore +++ b/vscode/react/.gitignore @@ -3,3 +3,6 @@ node_modules dist dist-ssr *.local + +*storybook.log +storybook-static diff --git a/vscode/react/.storybook/main.ts b/vscode/react/.storybook/main.ts new file mode 100644 index 0000000000..7601de4a00 --- /dev/null +++ b/vscode/react/.storybook/main.ts @@ -0,0 +1,17 @@ +import type { StorybookConfig } from '@storybook/react-vite' + +const config: StorybookConfig = { + stories: ['../src/**/*.mdx', '../src/**/*.stories.@(js|jsx|mjs|ts|tsx)'], + addons: [ + '@chromatic-com/storybook', + '@storybook/addon-docs', + '@storybook/addon-onboarding', + '@storybook/addon-a11y', + '@storybook/addon-vitest', + ], + framework: { + name: '@storybook/react-vite', + options: {}, + }, +} +export default config diff --git a/vscode/react/.storybook/preview.ts b/vscode/react/.storybook/preview.ts new file mode 100644 index 0000000000..1deb4d5908 --- /dev/null +++ b/vscode/react/.storybook/preview.ts @@ -0,0 +1,22 @@ +import type { Preview } from '@storybook/react-vite' +import './storybook.css' + +const preview: Preview = { + parameters: { + controls: { + matchers: { + color: /(background|color)$/i, + date: /Date$/i, + }, + }, + + a11y: { + // 'todo' - show a11y violations in the test UI only + // 'error' - fail CI on a11y violations + // 'off' - skip a11y checks entirely + test: 'todo', + }, + }, +} + +export default preview diff --git a/vscode/react/.storybook/storybook.css b/vscode/react/.storybook/storybook.css new file mode 100644 index 0000000000..562df7eadf --- /dev/null +++ b/vscode/react/.storybook/storybook.css @@ -0,0 +1,917 @@ +/* Storybook CSS Variables */ +html { + --color-graph-edge-secondary: var(--vscode-disabledForeground); + --color-graph-edge-main: var(--vscode-disabledForeground); + --color-graph-edge-selected: var(--vscode-textLink-foreground); + --color-graph-edge-direct: var(--vscode-disabledForeground); + --vscode-font-family: -apple-system, BlinkMacSystemFont, sans-serif; + --vscode-font-weight: normal; + --vscode-font-size: 13px; + --vscode-editor-font-family: Menlo, Monaco, 'Courier New', monospace; + --vscode-editor-font-weight: normal; + --vscode-editor-font-size: 12px; + --text-link-decoration: none; + --vscode-foreground: rgba(204, 204, 204, 0.87); + --vscode-disabledForeground: rgba(204, 204, 204, 0.5); + --vscode-errorForeground: #bf616a; + --vscode-descriptionForeground: rgba(204, 204, 204, 0.61); + --vscode-icon-foreground: #c5c5c5; + --vscode-focusBorder: #30373a; + --vscode-selection-background: rgba(255, 255, 255, 0.2); + --vscode-textLink-foreground: #81a1c1; + --vscode-textLink-activeForeground: #81a1c1; + --vscode-textSeparator-foreground: #88c0d0; + --vscode-textPreformat-foreground: #88c0d0; + --vscode-textPreformat-background: rgba(255, 255, 255, 0.1); + --vscode-textBlockQuote-background: #222222; + --vscode-textBlockQuote-border: rgba(0, 122, 204, 0.5); + --vscode-textCodeBlock-background: rgba(10, 10, 10, 0.4); + --vscode-sash-hoverBorder: #30373a; + --vscode-badge-background: #88c0d0; + --vscode-badge-foreground: #141414; + --vscode-activityWarningBadge-foreground: #000000; + --vscode-activityWarningBadge-background: #cca700; + --vscode-activityErrorBadge-foreground: #000000; + --vscode-activityErrorBadge-background: #f14c4c; + --vscode-scrollbar-shadow: rgba(0, 0, 0, 0); + --vscode-scrollbarSlider-background: rgba(64, 64, 64, 0.33); + --vscode-scrollbarSlider-hoverBackground: rgba(64, 64, 64, 0.33); + --vscode-scrollbarSlider-activeBackground: rgba(96, 96, 96, 0.33); + --vscode-progressBar-background: #a3be8c; + --vscode-chart-line: #236b8e; + --vscode-chart-axis: rgba(191, 191, 191, 0.4); + --vscode-chart-guide: rgba(191, 191, 191, 0.2); + --vscode-editor-background: #1a1a1a; + --vscode-editor-foreground: #d8dee9; + --vscode-editorStickyScroll-background: #1a1a1a; + --vscode-editorStickyScrollHover-background: #2a2d2e; + --vscode-editorStickyScroll-shadow: rgba(0, 0, 0, 0); + --vscode-editorWidget-background: #141414; + --vscode-editorWidget-foreground: rgba(204, 204, 204, 0.87); + --vscode-editorWidget-border: #454545; + --vscode-editorWidget-resizeBorder: #ffffff; + --vscode-editorError-foreground: #bf616a; + --vscode-editorError-border: rgba(191, 97, 106, 0); + --vscode-editorWarning-foreground: #ebcb8b; + --vscode-editorWarning-border: rgba(204, 204, 204, 0); + --vscode-editorInfo-foreground: #3794ff; + --vscode-editorHint-foreground: rgba(238, 238, 238, 0.7); + --vscode-editorLink-activeForeground: #ffffff; + --vscode-editor-selectionBackground: rgba(64, 64, 64, 0.6); + --vscode-editor-inactiveSelectionBackground: rgba(64, 64, 64, 0.47); + --vscode-editor-selectionHighlightBackground: rgba(64, 64, 64, 0.8); + --vscode-editor-compositionBorder: #ffffff; + --vscode-editor-findMatchBackground: rgba(136, 192, 208, 0.4); + --vscode-editor-findMatchHighlightBackground: rgba(136, 192, 208, 0.27); + --vscode-editor-findRangeHighlightBackground: rgba(255, 255, 255, 0.2); + --vscode-editor-hoverHighlightBackground: #292929; + --vscode-editorHoverWidget-background: #1a1a1a; + --vscode-editorHoverWidget-foreground: rgba(204, 204, 204, 0.87); + --vscode-editorHoverWidget-border: #2a2a2a; + --vscode-editorHoverWidget-statusBarBackground: #1f1f1f; + --vscode-editorInlayHint-foreground: #505050; + --vscode-editorInlayHint-background: rgba(0, 0, 0, 0); + --vscode-editorInlayHint-typeForeground: #505050; + --vscode-editorInlayHint-typeBackground: rgba(0, 0, 0, 0); + --vscode-editorInlayHint-parameterForeground: #505050; + --vscode-editorInlayHint-parameterBackground: rgba(0, 0, 0, 0); + --vscode-editorLightBulb-foreground: #ffcc00; + --vscode-editorLightBulbAutoFix-foreground: #75beff; + --vscode-editorLightBulbAi-foreground: #ffcc00; + --vscode-editor-snippetTabstopHighlightBackground: rgba(204, 204, 204, 0.33); + --vscode-editor-snippetFinalTabstopHighlightBorder: #cccccc; + --vscode-diffEditor-insertedTextBackground: rgba(163, 190, 140, 0.13); + --vscode-diffEditor-removedTextBackground: rgba(191, 97, 106, 0.13); + --vscode-diffEditor-insertedLineBackground: rgba(155, 185, 85, 0.2); + --vscode-diffEditor-removedLineBackground: rgba(255, 0, 0, 0.2); + --vscode-diffEditor-diagonalFill: rgba(204, 204, 204, 0.2); + --vscode-diffEditor-unchangedRegionBackground: #141414; + --vscode-diffEditor-unchangedRegionForeground: rgba(204, 204, 204, 0.87); + --vscode-diffEditor-unchangedCodeBackground: rgba(116, 116, 116, 0.16); + --vscode-widget-shadow: rgba(0, 0, 0, 0.4); + --vscode-toolbar-hoverBackground: rgba(90, 93, 94, 0.31); + --vscode-toolbar-activeBackground: rgba(99, 102, 103, 0.31); + --vscode-breadcrumb-foreground: rgba(204, 204, 204, 0.6); + --vscode-breadcrumb-background: #1a1a1a; + --vscode-breadcrumb-focusForeground: rgba(224, 224, 224, 0.87); + --vscode-breadcrumb-activeSelectionForeground: #ffffff; + --vscode-breadcrumbPicker-background: #141414; + --vscode-merge-currentHeaderBackground: rgba(136, 192, 208, 0.4); + --vscode-merge-currentContentBackground: rgba(136, 192, 208, 0.3); + --vscode-merge-incomingHeaderBackground: rgba(163, 190, 140, 0.4); + --vscode-merge-incomingContentBackground: rgba(163, 190, 140, 0.3); + --vscode-merge-commonHeaderBackground: rgba(96, 96, 96, 0.4); + --vscode-merge-commonContentBackground: rgba(96, 96, 96, 0.16); + --vscode-merge-border: rgba(42, 42, 42, 0); + --vscode-editorOverviewRuler-currentContentForeground: rgba( + 136, + 192, + 208, + 0.4 + ); + --vscode-editorOverviewRuler-incomingContentForeground: rgba( + 163, + 190, + 140, + 0.4 + ); + --vscode-editorOverviewRuler-commonContentForeground: rgba(96, 96, 96, 0.4); + --vscode-editorOverviewRuler-findMatchForeground: rgba(209, 134, 22, 0.49); + --vscode-editorOverviewRuler-selectionHighlightForeground: rgba( + 160, + 160, + 160, + 0.8 + ); + --vscode-problemsErrorIcon-foreground: #bf616a; + --vscode-problemsWarningIcon-foreground: #ebcb8b; + --vscode-problemsInfoIcon-foreground: #3794ff; + --vscode-minimap-findMatchHighlight: rgba(21, 172, 145, 0.44); + --vscode-minimap-selectionOccurrenceHighlight: #676767; + --vscode-minimap-selectionHighlight: #363636; + --vscode-minimap-infoHighlight: #3794ff; + --vscode-minimap-warningHighlight: #ea7620; + --vscode-minimap-errorHighlight: #f14c4c; + --vscode-minimap-background: #181818; + --vscode-minimap-foregroundOpacity: #000000; + --vscode-minimapSlider-background: rgba(64, 64, 64, 0.17); + --vscode-minimapSlider-hoverBackground: rgba(64, 64, 64, 0.17); + --vscode-minimapSlider-activeBackground: rgba(96, 96, 96, 0.17); + --vscode-charts-foreground: rgba(204, 204, 204, 0.87); + --vscode-charts-lines: rgba(204, 204, 204, 0.43); + --vscode-charts-red: #bf616a; + --vscode-charts-blue: #3794ff; + --vscode-charts-yellow: #ebcb8b; + --vscode-charts-orange: rgba(21, 172, 145, 0.44); + --vscode-charts-green: #89d185; + --vscode-charts-purple: #b180d7; + --vscode-input-background: rgba(42, 42, 42, 0.33); + --vscode-input-foreground: #ffffff; + --vscode-input-border: #2a2a2a; + --vscode-inputOption-activeBorder: #ffffff; + --vscode-inputOption-hoverBackground: rgba(90, 93, 94, 0.5); + --vscode-inputOption-activeBackground: rgba(48, 55, 58, 0.4); + --vscode-inputOption-activeForeground: #ffffff; + --vscode-input-placeholderForeground: rgba(255, 255, 255, 0.6); + --vscode-inputValidation-infoBackground: #88c0d0; + --vscode-inputValidation-infoForeground: #141414; + --vscode-inputValidation-infoBorder: #88c0d0; + --vscode-inputValidation-warningBackground: #ebcb8b; + --vscode-inputValidation-warningBorder: #ebcb8b; + --vscode-inputValidation-errorBackground: #bf616a; + --vscode-inputValidation-errorBorder: #bf616a; + --vscode-dropdown-background: #1a1a1a; + --vscode-dropdown-foreground: #ffffff; + --vscode-dropdown-border: #2a2a2a; + --vscode-button-foreground: #191c22; + --vscode-button-separator: rgba(25, 28, 34, 0.4); + --vscode-button-background: #81a1c1; + --vscode-button-hoverBackground: #87a6c4; + --vscode-button-secondaryForeground: #ececec; + --vscode-button-secondaryBackground: #565656; + --vscode-button-secondaryHoverBackground: #767676; + --vscode-radio-activeForeground: #ffffff; + --vscode-radio-activeBackground: rgba(48, 55, 58, 0.4); + --vscode-radio-activeBorder: #ffffff; + --vscode-radio-inactiveBorder: rgba(255, 255, 255, 0.2); + --vscode-radio-inactiveHoverBackground: rgba(90, 93, 94, 0.5); + --vscode-checkbox-background: #1a1a1a; + --vscode-checkbox-selectBackground: #141414; + --vscode-checkbox-foreground: #ffffff; + --vscode-checkbox-border: #2a2a2a; + --vscode-checkbox-selectBorder: #c5c5c5; + --vscode-keybindingLabel-background: rgba(128, 128, 128, 0.17); + --vscode-keybindingLabel-foreground: #cccccc; + --vscode-keybindingLabel-border: rgba(51, 51, 51, 0.6); + --vscode-keybindingLabel-bottomBorder: rgba(68, 68, 68, 0.6); + --vscode-list-focusBackground: #434c5e; + --vscode-list-focusForeground: #eceff4; + --vscode-list-focusOutline: #30373a; + --vscode-list-activeSelectionBackground: rgba(255, 255, 255, 0.11); + --vscode-list-activeSelectionForeground: #ffffff; + --vscode-list-inactiveSelectionBackground: rgba(255, 255, 255, 0.06); + --vscode-list-inactiveSelectionForeground: rgba(255, 255, 255, 0.84); + --vscode-list-hoverBackground: rgba(42, 42, 42, 0.6); + --vscode-list-hoverForeground: #ffffff; + --vscode-list-dropBackground: rgba(255, 255, 255, 0.6); + --vscode-list-dropBetweenBackground: #c5c5c5; + --vscode-list-highlightForeground: #88c0d0; + --vscode-list-focusHighlightForeground: #88c0d0; + --vscode-list-invalidItemForeground: #cccccc; + --vscode-list-errorForeground: #bf616a; + --vscode-list-warningForeground: #ebcb8b; + --vscode-listFilterWidget-background: #141414; + --vscode-listFilterWidget-outline: rgba(0, 0, 0, 0); + --vscode-listFilterWidget-noMatchesOutline: #be1100; + --vscode-listFilterWidget-shadow: rgba(0, 0, 0, 0.4); + --vscode-list-filterMatchBackground: rgba(136, 192, 208, 0.27); + --vscode-list-deemphasizedForeground: #cccccc; + --vscode-tree-indentGuidesStroke: rgba(204, 204, 204, 0.33); + --vscode-tree-inactiveIndentGuidesStroke: rgba(204, 204, 204, 0.13); + --vscode-tree-tableColumnsBorder: rgba(204, 204, 204, 0.13); + --vscode-tree-tableOddRowsBackground: rgba(204, 204, 204, 0.04); + --vscode-editorActionList-background: #141414; + --vscode-editorActionList-foreground: rgba(204, 204, 204, 0.87); + --vscode-editorActionList-focusForeground: #ffffff; + --vscode-editorActionList-focusBackground: rgba(255, 255, 255, 0.11); + --vscode-menu-foreground: #cccccc; + --vscode-menu-background: #141414; + --vscode-menu-selectionForeground: #ffffff; + --vscode-menu-selectionBackground: rgba(255, 255, 255, 0.11); + --vscode-menu-separatorBackground: #cccccc; + --vscode-quickInput-background: #141414; + --vscode-quickInput-foreground: rgba(204, 204, 204, 0.87); + --vscode-quickInputTitle-background: rgba(255, 255, 255, 0.1); + --vscode-pickerGroup-foreground: #ffffff; + --vscode-pickerGroup-border: rgba(42, 42, 42, 0); + --vscode-quickInputList-focusForeground: #ffffff; + --vscode-quickInputList-focusBackground: rgba(255, 255, 255, 0.11); + --vscode-search-resultsInfoForeground: rgba(204, 204, 204, 0.56); + --vscode-searchEditor-findMatchBackground: rgba(136, 192, 208, 0.18); + --vscode-editor-lineHighlightBackground: #292929; + --vscode-editor-lineHighlightBorder: #292929; + --vscode-editor-rangeHighlightBackground: rgba(64, 64, 64, 0.32); + --vscode-editor-symbolHighlightBackground: rgba(136, 192, 208, 0.27); + --vscode-editorCursor-foreground: #ffffff; + --vscode-editorMultiCursor-primary\.foreground: #ffffff; + --vscode-editorMultiCursor-secondary\.foreground: #ffffff; + --vscode-editorWhitespace-foreground: rgba(80, 80, 80, 0.7); + --vscode-editorLineNumber-foreground: #505050; + --vscode-editorIndentGuide-background: rgba(64, 64, 64, 0.7); + --vscode-editorIndentGuide-activeBackground: #505050; + --vscode-editorIndentGuide-background1: rgba(64, 64, 64, 0.7); + --vscode-editorIndentGuide-background2: rgba(0, 0, 0, 0); + --vscode-editorIndentGuide-background3: rgba(0, 0, 0, 0); + --vscode-editorIndentGuide-background4: rgba(0, 0, 0, 0); + --vscode-editorIndentGuide-background5: rgba(0, 0, 0, 0); + --vscode-editorIndentGuide-background6: rgba(0, 0, 0, 0); + --vscode-editorIndentGuide-activeBackground1: #505050; + --vscode-editorIndentGuide-activeBackground2: rgba(0, 0, 0, 0); + --vscode-editorIndentGuide-activeBackground3: rgba(0, 0, 0, 0); + --vscode-editorIndentGuide-activeBackground4: rgba(0, 0, 0, 0); + --vscode-editorIndentGuide-activeBackground5: rgba(0, 0, 0, 0); + --vscode-editorIndentGuide-activeBackground6: rgba(0, 0, 0, 0); + --vscode-editorActiveLineNumber-foreground: #c6c6c6; + --vscode-editorLineNumber-activeForeground: #ffffff; + --vscode-editorRuler-foreground: #494949; + --vscode-editorCodeLens-foreground: #505050; + --vscode-editorBracketMatch-background: rgba(20, 20, 20, 0); + --vscode-editorBracketMatch-border: rgba(255, 255, 255, 0.33); + --vscode-editorOverviewRuler-border: rgba(0, 0, 0, 0); + --vscode-editorGutter-background: #1a1a1a; + --vscode-editorUnnecessaryCode-opacity: rgba(0, 0, 0, 0.67); + --vscode-editorGhostText-foreground: rgba(255, 255, 255, 0.34); + --vscode-editorOverviewRuler-rangeHighlightForeground: rgba(0, 122, 204, 0.6); + --vscode-editorOverviewRuler-errorForeground: rgba(255, 18, 18, 0.7); + --vscode-editorOverviewRuler-warningForeground: #ebcb8b; + --vscode-editorOverviewRuler-infoForeground: #3794ff; + --vscode-editorBracketHighlight-foreground1: #ffd700; + --vscode-editorBracketHighlight-foreground2: #da70d6; + --vscode-editorBracketHighlight-foreground3: #179fff; + --vscode-editorBracketHighlight-foreground4: rgba(0, 0, 0, 0); + --vscode-editorBracketHighlight-foreground5: rgba(0, 0, 0, 0); + --vscode-editorBracketHighlight-foreground6: rgba(0, 0, 0, 0); + --vscode-editorBracketHighlight-unexpectedBracket\.foreground: rgba( + 255, + 18, + 18, + 0.8 + ); + --vscode-editorBracketPairGuide-background1: rgba(0, 0, 0, 0); + --vscode-editorBracketPairGuide-background2: rgba(0, 0, 0, 0); + --vscode-editorBracketPairGuide-background3: rgba(0, 0, 0, 0); + --vscode-editorBracketPairGuide-background4: rgba(0, 0, 0, 0); + --vscode-editorBracketPairGuide-background5: rgba(0, 0, 0, 0); + --vscode-editorBracketPairGuide-background6: rgba(0, 0, 0, 0); + --vscode-editorBracketPairGuide-activeBackground1: rgba(0, 0, 0, 0); + --vscode-editorBracketPairGuide-activeBackground2: rgba(0, 0, 0, 0); + --vscode-editorBracketPairGuide-activeBackground3: rgba(0, 0, 0, 0); + --vscode-editorBracketPairGuide-activeBackground4: rgba(0, 0, 0, 0); + --vscode-editorBracketPairGuide-activeBackground5: rgba(0, 0, 0, 0); + --vscode-editorBracketPairGuide-activeBackground6: rgba(0, 0, 0, 0); + --vscode-editorUnicodeHighlight-border: #ebcb8b; + --vscode-diffEditor-move\.border: rgba(139, 139, 139, 0.61); + --vscode-diffEditor-moveActive\.border: #ffa500; + --vscode-diffEditor-unchangedRegionShadow: #000000; + --vscode-editorOverviewRuler-bracketMatchForeground: #a0a0a0; + --vscode-actionBar-toggledBackground: rgba(48, 55, 58, 0.4); + --vscode-symbolIcon-arrayForeground: rgba(204, 204, 204, 0.87); + --vscode-symbolIcon-booleanForeground: rgba(204, 204, 204, 0.87); + --vscode-symbolIcon-classForeground: #ee9d28; + --vscode-symbolIcon-colorForeground: rgba(204, 204, 204, 0.87); + --vscode-symbolIcon-constantForeground: rgba(204, 204, 204, 0.87); + --vscode-symbolIcon-constructorForeground: #b180d7; + --vscode-symbolIcon-enumeratorForeground: #ee9d28; + --vscode-symbolIcon-enumeratorMemberForeground: #75beff; + --vscode-symbolIcon-eventForeground: #ee9d28; + --vscode-symbolIcon-fieldForeground: #75beff; + --vscode-symbolIcon-fileForeground: rgba(204, 204, 204, 0.87); + --vscode-symbolIcon-folderForeground: rgba(204, 204, 204, 0.87); + --vscode-symbolIcon-functionForeground: #b180d7; + --vscode-symbolIcon-interfaceForeground: #75beff; + --vscode-symbolIcon-keyForeground: rgba(204, 204, 204, 0.87); + --vscode-symbolIcon-keywordForeground: rgba(204, 204, 204, 0.87); + --vscode-symbolIcon-methodForeground: #b180d7; + --vscode-symbolIcon-moduleForeground: rgba(204, 204, 204, 0.87); + --vscode-symbolIcon-namespaceForeground: rgba(204, 204, 204, 0.87); + --vscode-symbolIcon-nullForeground: rgba(204, 204, 204, 0.87); + --vscode-symbolIcon-numberForeground: rgba(204, 204, 204, 0.87); + --vscode-symbolIcon-objectForeground: rgba(204, 204, 204, 0.87); + --vscode-symbolIcon-operatorForeground: rgba(204, 204, 204, 0.87); + --vscode-symbolIcon-packageForeground: rgba(204, 204, 204, 0.87); + --vscode-symbolIcon-propertyForeground: rgba(204, 204, 204, 0.87); + --vscode-symbolIcon-referenceForeground: rgba(204, 204, 204, 0.87); + --vscode-symbolIcon-snippetForeground: rgba(204, 204, 204, 0.87); + --vscode-symbolIcon-stringForeground: rgba(204, 204, 204, 0.87); + --vscode-symbolIcon-structForeground: rgba(204, 204, 204, 0.87); + --vscode-symbolIcon-textForeground: rgba(204, 204, 204, 0.87); + --vscode-symbolIcon-typeParameterForeground: rgba(204, 204, 204, 0.87); + --vscode-symbolIcon-unitForeground: rgba(204, 204, 204, 0.87); + --vscode-symbolIcon-variableForeground: #75beff; + --vscode-peekViewTitle-background: #2a2a2a; + --vscode-peekViewTitleLabel-foreground: #ffffff; + --vscode-peekViewTitleDescription-foreground: #ffffff; + --vscode-peekView-border: #505050; + --vscode-peekViewResult-background: #141414; + --vscode-peekViewResult-lineForeground: rgba(255, 255, 255, 0.4); + --vscode-peekViewResult-fileForeground: #ffffff; + --vscode-peekViewResult-selectionBackground: #404040; + --vscode-peekViewResult-selectionForeground: #ffffff; + --vscode-peekViewEditor-background: #141414; + --vscode-peekViewEditorGutter-background: #141414; + --vscode-peekViewEditorStickyScroll-background: #141414; + --vscode-peekViewResult-matchHighlightBackground: rgba(255, 255, 255, 0.4); + --vscode-peekViewEditor-matchHighlightBackground: rgba(255, 255, 255, 0.4); + --vscode-editor-foldBackground: rgba(64, 64, 64, 0.18); + --vscode-editor-foldPlaceholderForeground: #808080; + --vscode-editorGutter-foldingControlForeground: #c5c5c5; + --vscode-editorSuggestWidget-background: #141414; + --vscode-editorSuggestWidget-border: #2a2a2a; + --vscode-editorSuggestWidget-foreground: #ffffff; + --vscode-editorSuggestWidget-selectedForeground: #ffffff; + --vscode-editorSuggestWidget-selectedBackground: #404040; + --vscode-editorSuggestWidget-highlightForeground: #ffffff; + --vscode-editorSuggestWidget-focusHighlightForeground: #88c0d0; + --vscode-editorSuggestWidgetStatus-foreground: rgba(255, 255, 255, 0.5); + --vscode-inlineEdit-indicator\.foreground: #191c22; + --vscode-inlineEdit-indicator\.background: #81a1c1; + --vscode-inlineEdit-indicator\.border: rgba(25, 28, 34, 0.4); + --vscode-inlineEdit-originalBackground: rgba(191, 97, 106, 0.05); + --vscode-inlineEdit-modifiedBackground: rgba(163, 190, 140, 0.05); + --vscode-inlineEdit-originalChangedLineBackground: rgba(0, 0, 0, 0); + --vscode-inlineEdit-originalChangedTextBackground: rgba(191, 97, 106, 0.13); + --vscode-inlineEdit-modifiedChangedLineBackground: rgba(0, 0, 0, 0); + --vscode-inlineEdit-modifiedChangedTextBackground: rgba(163, 190, 140, 0.13); + --vscode-inlineEdit-border: #3e3e3e; + --vscode-inlineChat-foreground: rgba(204, 204, 204, 0.87); + --vscode-inlineChat-background: #141414; + --vscode-inlineChat-border: #454545; + --vscode-inlineChat-shadow: rgba(0, 0, 0, 0.4); + --vscode-inlineChatInput-border: #454545; + --vscode-inlineChatInput-focusBorder: #30373a; + --vscode-inlineChatInput-placeholderForeground: rgba(255, 255, 255, 0.6); + --vscode-inlineChatInput-background: rgba(42, 42, 42, 0.33); + --vscode-inlineChatDiff-inserted: rgba(163, 190, 140, 0.07); + --vscode-editorOverviewRuler-inlineChatInserted: rgba(163, 190, 140, 0.08); + --vscode-inlineChatDiff-removed: rgba(191, 97, 106, 0.07); + --vscode-editorOverviewRuler-inlineChatRemoved: rgba(191, 97, 106, 0.08); + --vscode-editor-wordHighlightBackground: rgba(255, 255, 255, 0.13); + --vscode-editor-wordHighlightStrongBackground: rgba(255, 255, 255, 0.18); + --vscode-editor-wordHighlightTextBackground: rgba(255, 255, 255, 0.13); + --vscode-editorOverviewRuler-wordHighlightForeground: rgba( + 160, + 160, + 160, + 0.8 + ); + --vscode-editorOverviewRuler-wordHighlightStrongForeground: rgba( + 192, + 160, + 192, + 0.8 + ); + --vscode-editorOverviewRuler-wordHighlightTextForeground: rgba( + 160, + 160, + 160, + 0.8 + ); + --vscode-tab-activeBackground: #1a1a1a; + --vscode-tab-unfocusedActiveBackground: #1a1a1a; + --vscode-tab-inactiveBackground: #141414; + --vscode-tab-unfocusedInactiveBackground: #141414; + --vscode-tab-activeForeground: #ffffff; + --vscode-tab-inactiveForeground: #505050; + --vscode-tab-unfocusedActiveForeground: rgba(255, 255, 255, 0.6); + --vscode-tab-unfocusedInactiveForeground: rgba(255, 255, 255, 0.4); + --vscode-tab-hoverBackground: rgba(255, 255, 255, 0); + --vscode-tab-unfocusedHoverBackground: rgba(42, 42, 42, 0.7); + --vscode-tab-border: rgba(255, 255, 255, 0.05); + --vscode-tab-lastPinnedBorder: rgba(204, 204, 204, 0.33); + --vscode-tab-activeBorder: #1a1a1a; + --vscode-tab-unfocusedActiveBorder: rgba(136, 192, 208, 0); + --vscode-tab-activeBorderTop: rgba(255, 255, 255, 0); + --vscode-tab-unfocusedActiveBorderTop: rgba(255, 255, 255, 0); + --vscode-tab-selectedBorderTop: rgba(255, 255, 255, 0); + --vscode-tab-selectedBackground: #1a1a1a; + --vscode-tab-selectedForeground: #ffffff; + --vscode-tab-unfocusedHoverBorder: rgba(136, 192, 208, 0); + --vscode-tab-dragAndDropBorder: #ffffff; + --vscode-tab-activeModifiedBorder: #3399cc; + --vscode-tab-inactiveModifiedBorder: rgba(51, 153, 204, 0.5); + --vscode-tab-unfocusedActiveModifiedBorder: rgba(51, 153, 204, 0.5); + --vscode-tab-unfocusedInactiveModifiedBorder: rgba(51, 153, 204, 0.25); + --vscode-editorPane-background: #1a1a1a; + --vscode-editorGroup-emptyBackground: #141414; + --vscode-editorGroupHeader-tabsBackground: #141414; + --vscode-editorGroupHeader-tabsBorder: rgba(255, 255, 255, 0.05); + --vscode-editorGroupHeader-noTabsBackground: #141414; + --vscode-editorGroup-border: rgba(255, 255, 255, 0.05); + --vscode-editorGroup-dropBackground: rgba(42, 42, 42, 0.6); + --vscode-editorGroup-dropIntoPromptForeground: rgba(204, 204, 204, 0.87); + --vscode-editorGroup-dropIntoPromptBackground: #141414; + --vscode-sideBySideEditor-horizontalBorder: rgba(255, 255, 255, 0.05); + --vscode-sideBySideEditor-verticalBorder: rgba(255, 255, 255, 0.05); + --vscode-panel-background: #141414; + --vscode-panel-border: rgba(255, 255, 255, 0.05); + --vscode-panelTitle-activeForeground: #ffffff; + --vscode-panelTitle-inactiveForeground: rgba(204, 204, 204, 0.6); + --vscode-panelTitle-activeBorder: rgba(255, 255, 255, 0); + --vscode-panelInput-border: #2a2a2a; + --vscode-panel-dropBorder: #ffffff; + --vscode-panelSection-dropBackground: rgba(42, 42, 42, 0.6); + --vscode-panelSectionHeader-background: rgba(128, 128, 128, 0.2); + --vscode-panelSection-border: rgba(255, 255, 255, 0.05); + --vscode-panelStickyScroll-background: #141414; + --vscode-panelStickyScroll-shadow: rgba(0, 0, 0, 0); + --vscode-banner-background: rgba(255, 255, 255, 0.11); + --vscode-banner-foreground: #ffffff; + --vscode-banner-iconForeground: #3794ff; + --vscode-statusBar-foreground: rgba(204, 204, 204, 0.51); + --vscode-statusBar-noFolderForeground: #ffffff; + --vscode-statusBar-background: #141414; + --vscode-statusBar-noFolderBackground: #141414; + --vscode-statusBar-border: rgba(255, 255, 255, 0.05); + --vscode-statusBar-focusBorder: rgba(204, 204, 204, 0.51); + --vscode-statusBar-noFolderBorder: rgba(255, 255, 255, 0.05); + --vscode-statusBarItem-activeBackground: #505050; + --vscode-statusBarItem-focusBorder: rgba(204, 204, 204, 0.51); + --vscode-statusBarItem-hoverBackground: #404040; + --vscode-statusBarItem-hoverForeground: rgba(204, 204, 204, 0.51); + --vscode-statusBarItem-compactHoverBackground: rgba(255, 255, 255, 0.2); + --vscode-statusBarItem-prominentForeground: rgba(204, 204, 204, 0.51); + --vscode-statusBarItem-prominentBackground: #2a2a2a; + --vscode-statusBarItem-prominentHoverForeground: rgba(204, 204, 204, 0.51); + --vscode-statusBarItem-prominentHoverBackground: #404040; + --vscode-statusBarItem-errorBackground: #7b3239; + --vscode-statusBarItem-errorForeground: #ffffff; + --vscode-statusBarItem-errorHoverForeground: rgba(204, 204, 204, 0.51); + --vscode-statusBarItem-errorHoverBackground: #404040; + --vscode-statusBarItem-warningBackground: #bf8b21; + --vscode-statusBarItem-warningForeground: #ffffff; + --vscode-statusBarItem-warningHoverForeground: rgba(204, 204, 204, 0.51); + --vscode-statusBarItem-warningHoverBackground: #404040; + --vscode-activityBar-background: #141414; + --vscode-activityBar-foreground: rgba(204, 204, 204, 0.6); + --vscode-activityBar-inactiveForeground: rgba(204, 204, 204, 0.24); + --vscode-activityBar-activeBorder: rgba(204, 204, 204, 0.6); + --vscode-activityBar-dropBorder: rgba(204, 204, 204, 0.6); + --vscode-activityBarBadge-background: #88c0d0; + --vscode-activityBarBadge-foreground: #000000; + --vscode-activityBarTop-foreground: #e7e7e7; + --vscode-activityBarTop-activeBorder: #e7e7e7; + --vscode-activityBarTop-inactiveForeground: rgba(231, 231, 231, 0.6); + --vscode-activityBarTop-dropBorder: #e7e7e7; + --vscode-profileBadge-background: #4d4d4d; + --vscode-profileBadge-foreground: #ffffff; + --vscode-statusBarItem-remoteBackground: #88c0d0; + --vscode-statusBarItem-remoteForeground: #000000; + --vscode-statusBarItem-remoteHoverForeground: rgba(204, 204, 204, 0.51); + --vscode-statusBarItem-remoteHoverBackground: #404040; + --vscode-statusBarItem-offlineBackground: #6c1717; + --vscode-statusBarItem-offlineForeground: #000000; + --vscode-statusBarItem-offlineHoverForeground: rgba(204, 204, 204, 0.51); + --vscode-statusBarItem-offlineHoverBackground: #404040; + --vscode-extensionBadge-remoteBackground: #88c0d0; + --vscode-extensionBadge-remoteForeground: #000000; + --vscode-sideBar-background: #141414; + --vscode-sideBar-foreground: rgba(204, 204, 204, 0.6); + --vscode-sideBar-border: rgba(255, 255, 255, 0.05); + --vscode-sideBarTitle-background: #141414; + --vscode-sideBarTitle-foreground: #cccccc; + --vscode-sideBar-dropBackground: rgba(42, 42, 42, 0.6); + --vscode-sideBarSectionHeader-background: #141414; + --vscode-sideBarSectionHeader-foreground: #505050; + --vscode-sideBarStickyScroll-background: #141414; + --vscode-sideBarStickyScroll-shadow: rgba(0, 0, 0, 0); + --vscode-titleBar-activeForeground: rgba(204, 204, 204, 0.51); + --vscode-titleBar-inactiveForeground: rgba(204, 204, 204, 0.38); + --vscode-titleBar-activeBackground: #141414; + --vscode-titleBar-inactiveBackground: #141414; + --vscode-titleBar-border: rgba(255, 255, 255, 0.05); + --vscode-menubar-selectionForeground: rgba(204, 204, 204, 0.51); + --vscode-menubar-selectionBackground: rgba(204, 204, 204, 0.2); + --vscode-commandCenter-foreground: rgba(204, 204, 204, 0.51); + --vscode-commandCenter-activeForeground: rgba(204, 204, 204, 0.51); + --vscode-commandCenter-inactiveForeground: rgba(204, 204, 204, 0.38); + --vscode-commandCenter-background: rgba(255, 255, 255, 0.05); + --vscode-commandCenter-activeBackground: rgba(255, 255, 255, 0.08); + --vscode-commandCenter-border: rgba(204, 204, 204, 0.1); + --vscode-commandCenter-activeBorder: rgba(204, 204, 204, 0.15); + --vscode-commandCenter-inactiveBorder: rgba(204, 204, 204, 0.09); + --vscode-notifications-foreground: #ffffff; + --vscode-notifications-background: #141414; + --vscode-notificationLink-foreground: #88c0d0; + --vscode-notificationCenterHeader-background: #1a1a1a; + --vscode-notifications-border: #1a1a1a; + --vscode-notificationsErrorIcon-foreground: #bf616a; + --vscode-notificationsWarningIcon-foreground: #ebcb8b; + --vscode-notificationsInfoIcon-foreground: #3794ff; + --vscode-extensionButton-background: #81a1c1; + --vscode-extensionButton-foreground: #191c22; + --vscode-extensionButton-hoverBackground: #87a6c4; + --vscode-extensionButton-separator: rgba(25, 28, 34, 0.4); + --vscode-extensionButton-prominentBackground: #565656; + --vscode-extensionButton-prominentForeground: #ffffff; + --vscode-extensionButton-prominentHoverBackground: #767676; + --vscode-editorGutter-modifiedBackground: #ebcb8b; + --vscode-editorGutter-addedBackground: #a3be8c; + --vscode-editorGutter-deletedBackground: #bf616a; + --vscode-minimapGutter-modifiedBackground: #e5b95c; + --vscode-minimapGutter-addedBackground: #15ac91; + --vscode-minimapGutter-deletedBackground: #f14c4c; + --vscode-editorOverviewRuler-modifiedForeground: rgba(235, 203, 139, 0.6); + --vscode-editorOverviewRuler-addedForeground: rgba(163, 190, 140, 0.6); + --vscode-editorOverviewRuler-deletedForeground: rgba(191, 97, 106, 0.6); + --vscode-chat-requestBorder: rgba(255, 255, 255, 0.1); + --vscode-chat-requestBackground: rgba(26, 26, 26, 0.62); + --vscode-chat-slashCommandBackground: rgba(52, 65, 75, 0.56); + --vscode-chat-slashCommandForeground: #40a6ff; + --vscode-chat-avatarBackground: #1f1f1f; + --vscode-chat-avatarForeground: rgba(204, 204, 204, 0.87); + --vscode-chat-editedFileForeground: #e2c08d; + --vscode-terminal-background: #141414; + --vscode-terminal-foreground: rgba(255, 255, 255, 0.8); + --vscode-terminalCursor-foreground: #ffffff; + --vscode-terminalCursor-background: rgba(255, 255, 255, 0.13); + --vscode-terminal-selectionBackground: rgba(99, 98, 98, 0.87); + --vscode-terminal-inactiveSelectionBackground: rgba(99, 98, 98, 0.43); + --vscode-terminalCommandDecoration-defaultBackground: rgba( + 255, + 255, + 255, + 0.25 + ); + --vscode-terminalCommandDecoration-successBackground: #1b81a8; + --vscode-terminalCommandDecoration-errorBackground: #f14c4c; + --vscode-terminalOverviewRuler-cursorForeground: rgba(160, 160, 160, 0.8); + --vscode-terminal-border: rgba(255, 255, 255, 0.05); + --vscode-terminalOverviewRuler-border: rgba(0, 0, 0, 0); + --vscode-terminal-findMatchBackground: rgba(136, 192, 208, 0.4); + --vscode-terminal-hoverHighlightBackground: rgba(41, 41, 41, 0.5); + --vscode-terminal-findMatchHighlightBackground: rgba(136, 192, 208, 0.27); + --vscode-terminalOverviewRuler-findMatchForeground: rgba(209, 134, 22, 0.49); + --vscode-terminal-dropBackground: rgba(42, 42, 42, 0.6); + --vscode-terminal-tab\.activeBorder: #1a1a1a; + --vscode-terminal-initialHintForeground: rgba(255, 255, 255, 0.34); + --vscode-editorMarkerNavigationError-background: rgba(191, 97, 106, 0.75); + --vscode-editorMarkerNavigationError-headerBackground: rgba( + 191, + 97, + 106, + 0.07 + ); + --vscode-editorMarkerNavigationWarning-background: #cccccc; + --vscode-editorMarkerNavigationWarning-headerBackground: rgba( + 204, + 204, + 204, + 0.1 + ); + --vscode-editorMarkerNavigationInfo-background: #3794ff; + --vscode-editorMarkerNavigationInfo-headerBackground: rgba(55, 148, 255, 0.1); + --vscode-editorMarkerNavigation-background: rgba(255, 255, 255, 0.44); + --vscode-editor-linkedEditingBackground: rgba(255, 0, 0, 0.3); + --vscode-editorHoverWidget-highlightForeground: #88c0d0; + --vscode-editor-placeholder\.foreground: rgba(255, 255, 255, 0.34); + --vscode-scmGraph-historyItemRefColor: #3794ff; + --vscode-scmGraph-historyItemRemoteRefColor: #b180d7; + --vscode-scmGraph-historyItemBaseRefColor: #ea5c00; + --vscode-scmGraph-historyItemHoverDefaultLabelForeground: rgba( + 204, + 204, + 204, + 0.87 + ); + --vscode-scmGraph-historyItemHoverDefaultLabelBackground: #88c0d0; + --vscode-scmGraph-historyItemHoverLabelForeground: #191c22; + --vscode-scmGraph-historyItemHoverAdditionsForeground: #81b88b; + --vscode-scmGraph-historyItemHoverDeletionsForeground: #c74e39; + --vscode-scmGraph-foreground1: #ffb000; + --vscode-scmGraph-foreground2: #dc267f; + --vscode-scmGraph-foreground3: #994f00; + --vscode-scmGraph-foreground4: #40b0a6; + --vscode-scmGraph-foreground5: #b66dff; + --vscode-commentsView-resolvedIcon: rgba(204, 204, 204, 0.5); + --vscode-commentsView-unresolvedIcon: #30373a; + --vscode-editorCommentsWidget-replyInputBackground: #2a2a2a; + --vscode-editorCommentsWidget-resolvedBorder: rgba(204, 204, 204, 0.5); + --vscode-editorCommentsWidget-unresolvedBorder: #30373a; + --vscode-editorCommentsWidget-rangeBackground: rgba(48, 55, 58, 0.1); + --vscode-editorCommentsWidget-rangeActiveBackground: rgba(48, 55, 58, 0.1); + --vscode-editorGutter-commentRangeForeground: #282828; + --vscode-editorOverviewRuler-commentForeground: #282828; + --vscode-editorOverviewRuler-commentUnresolvedForeground: #282828; + --vscode-editorGutter-commentGlyphForeground: #d8dee9; + --vscode-editorGutter-commentUnresolvedGlyphForeground: #d8dee9; + --vscode-ports-iconRunningProcessForeground: #88c0d0; + --vscode-simpleFindWidget-sashBorder: #454545; + --vscode-settings-headerForeground: #e7e7e7; + --vscode-settings-settingsHeaderHoverForeground: rgba(231, 231, 231, 0.7); + --vscode-settings-modifiedItemIndicator: #0c7d9d; + --vscode-settings-headerBorder: rgba(255, 255, 255, 0.05); + --vscode-settings-sashBorder: rgba(255, 255, 255, 0.05); + --vscode-settings-dropdownBackground: #1a1a1a; + --vscode-settings-dropdownForeground: #ffffff; + --vscode-settings-dropdownBorder: #2a2a2a; + --vscode-settings-dropdownListBorder: #454545; + --vscode-settings-checkboxBackground: #1a1a1a; + --vscode-settings-checkboxForeground: #ffffff; + --vscode-settings-checkboxBorder: #2a2a2a; + --vscode-settings-textInputBackground: rgba(42, 42, 42, 0.33); + --vscode-settings-textInputForeground: #ffffff; + --vscode-settings-textInputBorder: #2a2a2a; + --vscode-settings-numberInputBackground: rgba(42, 42, 42, 0.33); + --vscode-settings-numberInputForeground: #ffffff; + --vscode-settings-numberInputBorder: #2a2a2a; + --vscode-settings-focusedRowBackground: rgba(42, 42, 42, 0.36); + --vscode-settings-rowHoverBackground: rgba(42, 42, 42, 0.18); + --vscode-settings-focusedRowBorder: #30373a; + --vscode-keybindingTable-headerBackground: rgba(204, 204, 204, 0.04); + --vscode-keybindingTable-rowsBackground: rgba(204, 204, 204, 0.04); + --vscode-debugToolBar-background: #1a1a1a; + --vscode-debugIcon-startForeground: #89d185; + --vscode-notebook-cellBorderColor: rgba(255, 255, 255, 0.06); + --vscode-notebook-focusedEditorBorder: #30373a; + --vscode-notebookStatusSuccessIcon-foreground: #89d185; + --vscode-notebookEditorOverviewRuler-runningCellForeground: #89d185; + --vscode-notebookStatusErrorIcon-foreground: #bf616a; + --vscode-notebookStatusRunningIcon-foreground: rgba(204, 204, 204, 0.87); + --vscode-notebook-cellToolbarSeparator: rgba(128, 128, 128, 0.35); + --vscode-notebook-selectedCellBackground: rgba(255, 255, 255, 0.06); + --vscode-notebook-selectedCellBorder: rgba(255, 255, 255, 0.06); + --vscode-notebook-focusedCellBorder: #30373a; + --vscode-notebook-inactiveFocusedCellBorder: rgba(255, 255, 255, 0.06); + --vscode-notebook-cellStatusBarItemHoverBackground: rgba(255, 255, 255, 0.15); + --vscode-notebook-cellInsertionIndicator: #30373a; + --vscode-notebookScrollbarSlider-background: rgba(64, 64, 64, 0.33); + --vscode-notebookScrollbarSlider-hoverBackground: rgba(64, 64, 64, 0.33); + --vscode-notebookScrollbarSlider-activeBackground: rgba(96, 96, 96, 0.33); + --vscode-notebook-symbolHighlightBackground: rgba(255, 255, 255, 0.04); + --vscode-notebook-cellEditorBackground: #141414; + --vscode-notebook-editorBackground: #1a1a1a; + --vscode-debugIcon-breakpointForeground: #e51400; + --vscode-debugIcon-breakpointDisabledForeground: #848484; + --vscode-debugIcon-breakpointUnverifiedForeground: #848484; + --vscode-debugIcon-breakpointCurrentStackframeForeground: #ffcc00; + --vscode-debugIcon-breakpointStackframeForeground: #89d185; + --vscode-editor-stackFrameHighlightBackground: rgba(255, 255, 0, 0.2); + --vscode-editor-focusedStackFrameHighlightBackground: rgba( + 122, + 189, + 122, + 0.3 + ); + --vscode-multiDiffEditor-headerBackground: #262626; + --vscode-multiDiffEditor-background: #1a1a1a; + --vscode-interactive-activeCodeBorder: #505050; + --vscode-interactive-inactiveCodeBorder: rgba(255, 255, 255, 0.06); + --vscode-testing-iconFailed: #f14c4c; + --vscode-testing-iconErrored: #f14c4c; + --vscode-testing-iconPassed: #73c991; + --vscode-testing-runAction: #73c991; + --vscode-testing-iconQueued: #cca700; + --vscode-testing-iconUnset: #848484; + --vscode-testing-iconSkipped: #848484; + --vscode-testing-peekBorder: #bf616a; + --vscode-testing-messagePeekBorder: #3794ff; + --vscode-testing-peekHeaderBackground: rgba(191, 97, 106, 0.1); + --vscode-testing-messagePeekHeaderBackground: rgba(55, 148, 255, 0.1); + --vscode-testing-coveredBackground: rgba(163, 190, 140, 0.13); + --vscode-testing-coveredBorder: rgba(163, 190, 140, 0.1); + --vscode-testing-coveredGutterBackground: rgba(163, 190, 140, 0.08); + --vscode-testing-uncoveredBranchBackground: #452c2f; + --vscode-testing-uncoveredBackground: rgba(191, 97, 106, 0.13); + --vscode-testing-uncoveredBorder: rgba(191, 97, 106, 0.1); + --vscode-testing-uncoveredGutterBackground: rgba(191, 97, 106, 0.2); + --vscode-testing-coverCountBadgeBackground: #88c0d0; + --vscode-testing-coverCountBadgeForeground: #141414; + --vscode-testing-message\.error\.badgeBackground: #f14c4c; + --vscode-testing-message\.error\.badgeBorder: #f14c4c; + --vscode-testing-message\.error\.badgeForeground: #000000; + --vscode-testing-message\.info\.decorationForeground: rgba( + 216, + 222, + 233, + 0.5 + ); + --vscode-testing-iconErrored\.retired: rgba(241, 76, 76, 0.7); + --vscode-testing-iconFailed\.retired: rgba(241, 76, 76, 0.7); + --vscode-testing-iconPassed\.retired: rgba(115, 201, 145, 0.7); + --vscode-testing-iconQueued\.retired: rgba(204, 167, 0, 0.7); + --vscode-testing-iconUnset\.retired: rgba(132, 132, 132, 0.7); + --vscode-testing-iconSkipped\.retired: rgba(132, 132, 132, 0.7); + --vscode-searchEditor-textInputBorder: #2a2a2a; + --vscode-debugExceptionWidget-border: #141414; + --vscode-debugExceptionWidget-background: #505050; + --vscode-editor-inlineValuesForeground: rgba(255, 255, 255, 0.5); + --vscode-editor-inlineValuesBackground: rgba(255, 200, 0, 0.2); + --vscode-statusBar-debuggingBackground: #434c5e; + --vscode-statusBar-debuggingForeground: #d8dee9; + --vscode-statusBar-debuggingBorder: rgba(255, 255, 255, 0.05); + --vscode-commandCenter-debuggingBackground: rgba(67, 76, 94, 0.26); + --vscode-debugTokenExpression-name: #c586c0; + --vscode-debugTokenExpression-type: #4a90e2; + --vscode-debugTokenExpression-value: rgba(204, 204, 204, 0.6); + --vscode-debugTokenExpression-string: #ce9178; + --vscode-debugTokenExpression-boolean: #4e94ce; + --vscode-debugTokenExpression-number: #b5cea8; + --vscode-debugTokenExpression-error: #f48771; + --vscode-debugView-exceptionLabelForeground: rgba(204, 204, 204, 0.87); + --vscode-debugView-exceptionLabelBackground: #6c2022; + --vscode-debugView-stateLabelForeground: rgba(204, 204, 204, 0.87); + --vscode-debugView-stateLabelBackground: rgba(136, 136, 136, 0.27); + --vscode-debugView-valueChangedHighlight: #569cd6; + --vscode-debugConsole-infoForeground: #3794ff; + --vscode-debugConsole-warningForeground: #ebcb8b; + --vscode-debugConsole-errorForeground: #bf616a; + --vscode-debugConsole-sourceForeground: rgba(204, 204, 204, 0.87); + --vscode-debugConsoleInputIcon-foreground: rgba(204, 204, 204, 0.87); + --vscode-debugIcon-pauseForeground: #75beff; + --vscode-debugIcon-stopForeground: #f48771; + --vscode-debugIcon-disconnectForeground: #f48771; + --vscode-debugIcon-restartForeground: #89d185; + --vscode-debugIcon-stepOverForeground: #75beff; + --vscode-debugIcon-stepIntoForeground: #75beff; + --vscode-debugIcon-stepOutForeground: #75beff; + --vscode-debugIcon-continueForeground: #75beff; + --vscode-debugIcon-stepBackForeground: #75beff; + --vscode-mergeEditor-change\.background: rgba(155, 185, 85, 0.2); + --vscode-mergeEditor-change\.word\.background: rgba(156, 204, 44, 0.2); + --vscode-mergeEditor-changeBase\.background: #4b1818; + --vscode-mergeEditor-changeBase\.word\.background: #6f1313; + --vscode-mergeEditor-conflict\.unhandledUnfocused\.border: rgba( + 255, + 166, + 0, + 0.48 + ); + --vscode-mergeEditor-conflict\.unhandledFocused\.border: #ffa600; + --vscode-mergeEditor-conflict\.handledUnfocused\.border: rgba( + 134, + 134, + 134, + 0.29 + ); + --vscode-mergeEditor-conflict\.handledFocused\.border: rgba( + 193, + 193, + 193, + 0.8 + ); + --vscode-mergeEditor-conflict\.handled\.minimapOverViewRuler: rgba( + 173, + 172, + 168, + 0.93 + ); + --vscode-mergeEditor-conflict\.unhandled\.minimapOverViewRuler: #fcba03; + --vscode-mergeEditor-conflictingLines\.background: rgba(255, 234, 0, 0.28); + --vscode-mergeEditor-conflict\.input1\.background: rgba(136, 192, 208, 0.16); + --vscode-mergeEditor-conflict\.input2\.background: rgba(163, 190, 140, 0.16); + --vscode-extensionIcon-starForeground: #ff8e00; + --vscode-extensionIcon-verifiedForeground: #81a1c1; + --vscode-extensionIcon-preReleaseForeground: #1d9271; + --vscode-extensionIcon-sponsorForeground: #d758b3; + --vscode-terminal-ansiBlack: #2a2a2a; + --vscode-terminal-ansiRed: #bf616a; + --vscode-terminal-ansiGreen: #a3be8c; + --vscode-terminal-ansiYellow: #ebcb8b; + --vscode-terminal-ansiBlue: #81a1c1; + --vscode-terminal-ansiMagenta: #b48ead; + --vscode-terminal-ansiCyan: #88c0d0; + --vscode-terminal-ansiWhite: #ffffff; + --vscode-terminal-ansiBrightBlack: #505050; + --vscode-terminal-ansiBrightRed: #bf616a; + --vscode-terminal-ansiBrightGreen: #a3be8c; + --vscode-terminal-ansiBrightYellow: #ebcb8b; + --vscode-terminal-ansiBrightBlue: #81a1c1; + --vscode-terminal-ansiBrightMagenta: #b48ead; + --vscode-terminal-ansiBrightCyan: #88c0d0; + --vscode-terminal-ansiBrightWhite: #ffffff; + --vscode-terminalStickyScrollHover-background: #2a2d2e; + --vscode-terminalCommandGuide-foreground: rgba(255, 255, 255, 0.06); + --vscode-walkThrough-embeddedEditorBackground: #141414; + --vscode-profiles-sashBorder: rgba(255, 255, 255, 0.05); + --vscode-gitDecoration-addedResourceForeground: #a3be8c; + --vscode-gitDecoration-modifiedResourceForeground: #ebcb8b; + --vscode-gitDecoration-deletedResourceForeground: #bf616a; + --vscode-gitDecoration-renamedResourceForeground: #73c991; + --vscode-gitDecoration-untrackedResourceForeground: #88c0d0; + --vscode-gitDecoration-ignoredResourceForeground: #505050; + --vscode-gitDecoration-stageModifiedResourceForeground: #e2c08d; + --vscode-gitDecoration-stageDeletedResourceForeground: #c74e39; + --vscode-gitDecoration-conflictingResourceForeground: #e4676b; + --vscode-gitDecoration-submoduleResourceForeground: #8db9e2; + --vscode-git-blame\.editorDecorationForeground: #505050; + --vscode-gitlens-gutterBackgroundColor: rgba(255, 255, 255, 0.07); + --vscode-gitlens-gutterForegroundColor: #bebebe; + --vscode-gitlens-gutterUncommittedForegroundColor: rgba(0, 188, 242, 0.6); + --vscode-gitlens-trailingLineBackgroundColor: rgba(0, 0, 0, 0); + --vscode-gitlens-trailingLineForegroundColor: rgba(204, 204, 204, 0.6); + --vscode-gitlens-lineHighlightBackgroundColor: rgba(0, 188, 242, 0.2); + --vscode-gitlens-lineHighlightOverviewRulerColor: rgba(0, 188, 242, 0.6); + --vscode-gitlens-openAutolinkedIssueIconColor: #3fb950; + --vscode-gitlens-closedAutolinkedIssueIconColor: #a371f7; + --vscode-gitlens-closedPullRequestIconColor: #f85149; + --vscode-gitlens-openPullRequestIconColor: #3fb950; + --vscode-gitlens-mergedPullRequestIconColor: #a371f7; + --vscode-gitlens-unpublishedChangesIconColor: #35b15e; + --vscode-gitlens-unpublishedCommitIconColor: #35b15e; + --vscode-gitlens-unpulledChangesIconColor: #b15e35; + --vscode-gitlens-decorations\.addedForegroundColor: #a3be8c; + --vscode-gitlens-decorations\.copiedForegroundColor: #73c991; + --vscode-gitlens-decorations\.deletedForegroundColor: #bf616a; + --vscode-gitlens-decorations\.ignoredForegroundColor: #505050; + --vscode-gitlens-decorations\.modifiedForegroundColor: #ebcb8b; + --vscode-gitlens-decorations\.untrackedForegroundColor: #88c0d0; + --vscode-gitlens-decorations\.renamedForegroundColor: #73c991; + --vscode-gitlens-decorations\.branchAheadForegroundColor: #35b15e; + --vscode-gitlens-decorations\.branchBehindForegroundColor: #b15e35; + --vscode-gitlens-decorations\.branchDivergedForegroundColor: #d8af1b; + --vscode-gitlens-decorations\.branchUpToDateForegroundColor: rgba( + 204, + 204, + 204, + 0.6 + ); + --vscode-gitlens-decorations\.branchUnpublishedForegroundColor: rgba( + 204, + 204, + 204, + 0.6 + ); + --vscode-gitlens-decorations\.branchMissingUpstreamForegroundColor: #c74e39; + --vscode-gitlens-decorations\.statusMergingOrRebasingConflictForegroundColor: #c74e39; + --vscode-gitlens-decorations\.statusMergingOrRebasingForegroundColor: #d8af1b; + --vscode-gitlens-decorations\.workspaceRepoMissingForegroundColor: #909090; + --vscode-gitlens-decorations\.workspaceCurrentForegroundColor: #35b15e; + --vscode-gitlens-decorations\.workspaceRepoOpenForegroundColor: #35b15e; + --vscode-gitlens-decorations\.worktreeHasUncommittedChangesForegroundColor: #e2c08d; + --vscode-gitlens-decorations\.worktreeMissingForegroundColor: #c74e39; + --vscode-gitlens-graphLane1Color: #15a0bf; + --vscode-gitlens-graphLane2Color: #0669f7; + --vscode-gitlens-graphLane3Color: #8e00c2; + --vscode-gitlens-graphLane4Color: #c517b6; + --vscode-gitlens-graphLane5Color: #d90171; + --vscode-gitlens-graphLane6Color: #cd0101; + --vscode-gitlens-graphLane7Color: #f25d2e; + --vscode-gitlens-graphLane8Color: #f2ca33; + --vscode-gitlens-graphLane9Color: #7bd938; + --vscode-gitlens-graphLane10Color: #2ece9d; + --vscode-gitlens-graphChangesColumnAddedColor: #347d39; + --vscode-gitlens-graphChangesColumnDeletedColor: #c93c37; + --vscode-gitlens-graphMinimapMarkerHeadColor: #05e617; + --vscode-gitlens-graphScrollMarkerHeadColor: #05e617; + --vscode-gitlens-graphMinimapMarkerUpstreamColor: #09ae17; + --vscode-gitlens-graphScrollMarkerUpstreamColor: #09ae17; + --vscode-gitlens-graphMinimapMarkerHighlightsColor: #fbff0a; + --vscode-gitlens-graphScrollMarkerHighlightsColor: #fbff0a; + --vscode-gitlens-graphMinimapMarkerLocalBranchesColor: #3087cf; + --vscode-gitlens-graphScrollMarkerLocalBranchesColor: #3087cf; + --vscode-gitlens-graphMinimapMarkerPullRequestsColor: #c76801; + --vscode-gitlens-graphScrollMarkerPullRequestsColor: #c76801; + --vscode-gitlens-graphMinimapMarkerRemoteBranchesColor: #2b5e88; + --vscode-gitlens-graphScrollMarkerRemoteBranchesColor: #2b5e88; + --vscode-gitlens-graphMinimapMarkerStashesColor: #b34db3; + --vscode-gitlens-graphScrollMarkerStashesColor: #b34db3; + --vscode-gitlens-graphMinimapMarkerTagsColor: #6b562e; + --vscode-gitlens-graphScrollMarkerTagsColor: #6b562e; + --vscode-gitlens-launchpadIndicatorMergeableColor: #3fb950; + --vscode-gitlens-launchpadIndicatorMergeableHoverColor: #3fb950; + --vscode-gitlens-launchpadIndicatorBlockedColor: #c74e39; + --vscode-gitlens-launchpadIndicatorBlockedHoverColor: #c74e39; + --vscode-gitlens-launchpadIndicatorAttentionColor: #d8af1b; + --vscode-gitlens-launchpadIndicatorAttentionHoverColor: #d8af1b; + --vscode-issues-newIssueDecoration: rgba(255, 255, 255, 0.28); + --vscode-issues-open: #3fb950; + --vscode-issues-closed: #cb2431; + --vscode-pullRequests-merged: #8957e5; + --vscode-pullRequests-draft: #6e7681; + --vscode-pullRequests-open: #3fb950; + --vscode-pullRequests-closed: #cb2431; + --vscode-pullRequests-notification: #3794ff; + --vscode-rainbowtrack1: #ff0000; + --vscode-rainbowtrack2: #00ff00; + --vscode-rainbowtrack3: #0000ff; +} diff --git a/vscode/react/.storybook/vitest.setup.ts b/vscode/react/.storybook/vitest.setup.ts new file mode 100644 index 0000000000..06a5566d6d --- /dev/null +++ b/vscode/react/.storybook/vitest.setup.ts @@ -0,0 +1,7 @@ +import * as a11yAddonAnnotations from '@storybook/addon-a11y/preview' +import { setProjectAnnotations } from '@storybook/react-vite' +import * as projectAnnotations from './preview' + +// This is an important step to apply the right configuration when testing your stories. +// More info at: https://storybook.js.org/docs/api/portable-stories/portable-stories-vitest#setprojectannotations +setProjectAnnotations([a11yAddonAnnotations, projectAnnotations]) diff --git a/vscode/react/package.json b/vscode/react/package.json index 32a429843f..7c53d8d82f 100644 --- a/vscode/react/package.json +++ b/vscode/react/package.json @@ -10,7 +10,9 @@ "serve": "vite preview", "test": "vitest run", "generate:api": "orval --config ./orval.config.ts", - "lint": "tsc --noEmit" + "lint": "tsc --noEmit", + "storybook": "storybook dev -p 6006", + "build-storybook": "storybook build" }, "dependencies": { "@headlessui/react": "^2.2.4", @@ -35,15 +37,25 @@ "vscode-uri": "^3.1.0" }, "devDependencies": { + "@chromatic-com/storybook": "^4.0.1", + "@storybook/addon-a11y": "^9.0.15", + "@storybook/addon-docs": "^9.0.15", + "@storybook/addon-onboarding": "^9.0.15", + "@storybook/addon-vitest": "^9.0.15", + "@storybook/react-vite": "^9.0.15", "@testing-library/dom": "^10.4.0", "@testing-library/react": "^16.3.0", "@types/react": "^18.3.23", "@types/react-dom": "^18.3.7", "@vitejs/plugin-react": "^4.5.1", "jsdom": "^26.1.0", + "storybook": "^9.0.15", "typescript": "^5.8.3", "vite": "^6.3.5", "vitest": "^3.2.3", - "web-vitals": "^4.2.4" + "web-vitals": "^4.2.4", + "@vitest/browser": "3.2.3", + "playwright": "^1.53.2", + "@vitest/coverage-v8": "3.2.3" } } diff --git a/vscode/react/src/components/graph/ModelColumns.tsx b/vscode/react/src/components/graph/ModelColumns.tsx index 40b2c49d0c..7a1b10f213 100644 --- a/vscode/react/src/components/graph/ModelColumns.tsx +++ b/vscode/react/src/components/graph/ModelColumns.tsx @@ -8,10 +8,9 @@ import { isFalse, isNil, isNotNil, - toID, truncate, } from '@/utils/index' -import { EnumSide, type Side } from './types' +import { EnumSide, toID, type Side } from './types' import { NoSymbolIcon } from '@heroicons/react/24/solid' import { ClockIcon, ExclamationCircleIcon } from '@heroicons/react/24/outline' import clsx from 'clsx' @@ -31,8 +30,7 @@ import { useLineageFlow } from './context' import { useApiColumnLineage } from '@/api/index' import SourceList from '@/components/sourceList/SourceList' import type { Lineage } from '@/domain/lineage' -import type { ModelName } from '@/domain/models' -import type { Column } from '@/domain/column' +import type { Column, ColumnName } from '@/domain/column' export function ModelColumns({ nodeId, @@ -590,5 +588,5 @@ function getColumnFromLineage( nodeId: string, columnName: string, ): LineageColumn | undefined { - return lineage?.[nodeId]?.columns?.[encodeURI(columnName) as ModelName] + return lineage?.[nodeId]?.columns?.[columnName as ColumnName] } diff --git a/vscode/react/src/components/graph/ModelLineage.tsx b/vscode/react/src/components/graph/ModelLineage.tsx index fb3befc24e..604f54de9d 100644 --- a/vscode/react/src/components/graph/ModelLineage.tsx +++ b/vscode/react/src/components/graph/ModelLineage.tsx @@ -35,9 +35,14 @@ import { import { Popover } from '@headlessui/react' import ModelLineageDetails from './ModelLineageDetails' import { Divider } from '@/components/divider/Divider' -import { type ModelLineageApiLineageModelNameGet200 } from '@/api/client' import { SettingsControl } from '@/components/graph/SettingsControl' +import { + toModelLineage, + type ModelLineage as ModelLineageType, +} from '@/domain/lineage' import './Graph.css' +import { toKeys } from './types' +import { encode } from '@/domain/models' const WITH_COLUMNS_LIMIT = 30 @@ -81,7 +86,7 @@ export function ModelLineage({ const [isMergingModels, setIsMergingModels] = useState(false) const [modelLineage, setModelLineage] = useState< - ModelLineageApiLineageModelNameGet200 | undefined + ModelLineageType | undefined >(undefined) useEffect(() => { @@ -91,7 +96,7 @@ export function ModelLineage({ getModelLineage() .then(({ data }) => { - setModelLineage(data) + setModelLineage(data ? toModelLineage(data) : undefined) if (isNil(data)) return setIsMergingModels(true) @@ -129,13 +134,16 @@ export function ModelLineage({ }, [model.name, model.hash]) useEffect(() => { - Object.keys(modelLineage ?? {}).forEach(modelName => { - modelName = encodeURI(modelName) - - if (isFalse(modelName in models) && isFalse(modelName in unknownModels)) { - unknownModels.add(modelName) + const modelNames = toKeys(modelLineage ?? {}) + for (const modelName of modelNames) { + const encodedModelName = encode(modelName) + if ( + isFalse(encodedModelName in models) && + isFalse(encodedModelName in unknownModels) + ) { + unknownModels.add(encodedModelName) } - }) + } setUnknownModels(new Set(unknownModels)) }, [modelLineage, models]) @@ -329,6 +337,7 @@ function ModelColumnLineage(): JSX.Element { setEdges(newEdges) setNodes(newNodes) + console.log('newActiveNodes', newActiveNodes) setActiveNodes(newActiveNodes) }, [ connections, diff --git a/vscode/react/src/components/graph/ModelNode.tsx b/vscode/react/src/components/graph/ModelNode.tsx index 5b974ca76f..35123a1630 100644 --- a/vscode/react/src/components/graph/ModelNode.tsx +++ b/vscode/react/src/components/graph/ModelNode.tsx @@ -8,6 +8,7 @@ import { Position, type NodeProps } from 'reactflow' import { ModelNodeHeaderHandles } from './ModelNodeHeaderHandles' import { ModelColumns } from './ModelColumns' import { fromAPIColumn, type Column } from '@/domain/column' +import type { ModelEncodedFQN } from '@/domain/models' export const EnumLineageNodeModelType = { ...ModelType, @@ -150,7 +151,7 @@ export default function ModelNode({ const isActiveNode = selectedNodes.size > 0 || activeNodes.size > 0 || withConnected ? isSelected || - activeNodes.has(id) || + activeNodes.has(id as ModelEncodedFQN) || (withConnected && connectedNodes.has(id)) : connectedNodes.has(id) const isInteractive = true diff --git a/vscode/react/src/components/graph/ModelNodeHeaderHandles.tsx b/vscode/react/src/components/graph/ModelNodeHeaderHandles.tsx index 35b1428154..59c656cf6a 100644 --- a/vscode/react/src/components/graph/ModelNodeHeaderHandles.tsx +++ b/vscode/react/src/components/graph/ModelNodeHeaderHandles.tsx @@ -2,8 +2,8 @@ import { type MouseEvent } from 'react' import { Handle, Position } from 'reactflow' import 'reactflow/dist/base.css' import { getModelNodeTypeTitle } from './help' -import { isNotNil, toID, truncate } from '@/utils/index' -import { EnumSide } from './types' +import { isNotNil, truncate } from '@/utils/index' +import { EnumSide, toID } from './types' import { ArrowRightCircleIcon } from '@heroicons/react/24/solid' import clsx from 'clsx' import { type LineageNodeModelType } from './ModelNode' diff --git a/vscode/react/src/components/graph/context.tsx b/vscode/react/src/components/graph/context.tsx index 98cf438c94..ec365b6597 100644 --- a/vscode/react/src/components/graph/context.tsx +++ b/vscode/react/src/components/graph/context.tsx @@ -1,4 +1,3 @@ -import { type Model } from '@/api/client' import { createContext, useState, @@ -12,6 +11,8 @@ import { type Node } from 'reactflow' import type { Lineage } from '@/domain/lineage' import type { ModelSQLMeshModel } from '@/domain/sqlmesh-model' import type { Column } from '@/domain/column' +import type { ModelEncodedFQN } from '@/domain/models' +import type { Model } from '@/api/client' export interface Connections { left: string[] @@ -19,7 +20,7 @@ export interface Connections { } export type ActiveColumns = Map export type ActiveEdges = Map> -export type ActiveNodes = Set +export type ActiveNodes = Set export type SelectedNodes = Set export type HighlightedNodes = Record @@ -32,8 +33,8 @@ interface LineageFlow { activeNodes: ActiveNodes selectedNodes: SelectedNodes selectedEdges: any[] - models: Record - unknownModels: Set + models: Record + unknownModels: Set connections: Map withConnected: boolean withColumns: boolean @@ -58,7 +59,7 @@ interface LineageFlow { addActiveEdges: (edges: Array<[string, string]>) => void removeActiveEdges: (edges: Array<[string, string]>) => void setActiveEdges: React.Dispatch> - setUnknownModels: React.Dispatch>> + setUnknownModels: React.Dispatch>> setLineage: React.Dispatch>> setLineageCache: React.Dispatch< React.SetStateAction | undefined> @@ -135,7 +136,7 @@ export default function LineageFlowProvider({ models: Record }): JSX.Element { const [lineage, setLineage] = useState>({}) - const [unknownModels, setUnknownModels] = useState(new Set()) + const [unknownModels, setUnknownModels] = useState(new Set()) const [lineageCache, setLineageCache] = useState< Record | undefined >(undefined) @@ -162,6 +163,7 @@ export default function LineageFlowProvider({ () => getNodeMap({ lineage, + // @ts-expect-error TODO: fix this, should move to internal representation models, unknownModels, withColumns, @@ -278,6 +280,7 @@ export default function LineageFlowProvider({ connections, lineage, lineageCache, + // @ts-expect-error TODO: fix this, should move to internal representation models, manuallySelectedColumn, withColumns, diff --git a/vscode/react/src/components/graph/help.ts b/vscode/react/src/components/graph/help.ts index 34a36c2a58..4ecd93d077 100644 --- a/vscode/react/src/components/graph/help.ts +++ b/vscode/react/src/components/graph/help.ts @@ -5,19 +5,37 @@ import { isNil, isNotNil, isObjectEmpty, - toID, } from '@/utils/index' -import { type LineageColumn, type Column, type Model } from '@/api/client' +import { type LineageColumn } from '@/api/client' import { Position, type Edge, type Node, type XYPosition } from 'reactflow' import { type ActiveEdges, type Connections } from './context' -import { EnumSide } from './types' +import { EnumSide, toID, toKeys } from './types' import { EnumLineageNodeModelType, type LineageNodeModelType, } from './ModelNode' import type { Lineage } from '@/domain/lineage' import type { ConnectedNode } from '@/workers/lineage' -import type { ModelEncodedFQN, ModelName } from '@/domain/models' +import { encode, type ModelEncodedFQN, type ModelURI } from '@/domain/models' +import type { Column, ColumnName } from '@/domain/column' +import type { ModelSQLMeshModel } from '@/domain/sqlmesh-model' + +/** + * Space between nodes. + */ +const NODE_BALANCE_SPACE = 64 +/** + * Height of a column line. + */ +const COLUMN_LINE_HEIGHT = 24 +/** + * Assumed width of a character. + */ +const CHAR_WIDTH = 8 +/** + * Maximum number of columns that can be visible in a node. + */ +const MAX_VISIBLE_COLUMNS = 5 export interface GraphNodeData { label: string @@ -81,8 +99,10 @@ export function createGraphLayout({ } } -export function getEdges(lineage: Record = {}): Edge[] { - const modelNames = Object.keys(lineage) +export function getEdges( + lineage: Record = {}, +): Edge[] { + const modelNames = toKeys(lineage) const outputEdges: Edge[] = [] for (const targetModelName of modelNames) { @@ -92,12 +112,14 @@ export function getEdges(lineage: Record = {}): Edge[] { outputEdges.push(createGraphEdge(sourceModelName, targetModelName)) }) - for (const targetColumnName in targetModel.columns) { - const sourceModel = targetModel.columns[targetColumnName as ModelName] + const targetColumnNames = toKeys(targetModel.columns ?? {}) + for (const targetColumnName of targetColumnNames) { + const sourceModel = targetModel.columns?.[targetColumnName] if (isNil(sourceModel) || isNil(sourceModel.models)) continue - for (const sourceModelName in sourceModel.models) { + const sourceModelNames = toKeys(sourceModel.models) + for (const sourceModelName of sourceModelNames) { const sourceColumns = sourceModel.models[sourceModelName] if (isNil(sourceColumns)) continue @@ -108,11 +130,13 @@ export function getEdges(lineage: Record = {}): Edge[] { sourceModelName, sourceColumnName, ) + console.log('sourceHandler', sourceHandler) const targetHandler = toID( EnumSide.Left, targetModelName, targetColumnName, ) + console.log('targetHandler', targetHandler) outputEdges.push( createGraphEdge( @@ -141,18 +165,13 @@ export function getNodeMap({ unknownModels, withColumns, }: { - models: Record + models: Record withColumns: boolean unknownModels: Set lineage?: Record }): Record { if (isNil(lineage)) return {} - const NODE_BALANCE_SPACE = 64 - const COLUMN_LINE_HEIGHT = 24 - const CHAR_WIDTH = 8 - const MAX_VISIBLE_COLUMNS = 5 - const sources = new Set(Object.values(lineage).flatMap(l => l.models)) const modelNames = Object.keys(lineage) @@ -181,7 +200,7 @@ export function getNodeMap({ : 0 const maxWidth = Math.min( - getNodeMaxWidth(modelName, columnsCount === 0), + getNodeMaxWidth(modelName, columnsCount === 0, models), 320, ) const maxHeight = getNodeMaxHeight(columnsCount) @@ -203,29 +222,32 @@ export function getNodeMap({ return acc }, {}) +} - function getNodeMaxWidth(label: string, hasColumns: boolean = false): number { - const defaultWidth = label.length * CHAR_WIDTH - const columns = models[label]?.columns ?? [] - - return hasColumns - ? Math.max(...columns.map(getColumnWidth), defaultWidth) - : defaultWidth - } +function getNodeMaxWidth( + label: string, + hasColumns: boolean = false, + models: Record = {}, +): number { + const defaultWidth = label.length * CHAR_WIDTH + const columns = models[label]?.columns ?? [] + + return hasColumns + ? Math.max(...columns.map(getColumnWidth), defaultWidth) + : defaultWidth +} - function getNodeMaxHeight(columnsCount: number): number { - return ( - COLUMN_LINE_HEIGHT * Math.min(columnsCount, MAX_VISIBLE_COLUMNS) + - NODE_BALANCE_SPACE - ) - } +function getColumnWidth(column: Column): number { + return ( + (column.name.length + column.type.length) * CHAR_WIDTH + NODE_BALANCE_SPACE + ) +} - function getColumnWidth(column: Column): number { - return ( - (column.name.length + column.type.length) * CHAR_WIDTH + - NODE_BALANCE_SPACE - ) - } +function getNodeMaxHeight(columnsCount: number): number { + return ( + COLUMN_LINE_HEIGHT * Math.min(columnsCount, MAX_VISIBLE_COLUMNS) + + NODE_BALANCE_SPACE + ) } function repositionNodes( @@ -274,14 +296,14 @@ function createGraphNode( } } -function createGraphEdge( +function createGraphEdge( source: string, target: string, sourceHandle?: string, targetHandle?: string, hidden: boolean = false, - data?: TData, -): Edge { + data?: Data, +): Edge { const output: Edge = { id: toID(source, target, sourceHandle, targetHandle), source, @@ -328,9 +350,9 @@ export function mergeLineageWithColumns( } // New Column Lineage delivers fresh data, so we can just assign it - currentLineageModel.columns[targetColumnNameEncoded as ModelName] = { - expression: newLineageModelColumn.expression, - source: newLineageModelColumn.source, + currentLineageModel.columns[targetColumnNameEncoded as ColumnName] = { + expression: newLineageModelColumn.expression ?? undefined, + source: newLineageModelColumn.source ?? undefined, models: {}, } @@ -338,25 +360,30 @@ export function mergeLineageWithColumns( if (isObjectEmpty(newLineageModelColumn.models)) continue const currentLineageModelColumn = - currentLineageModel.columns[targetColumnNameEncoded as ModelName]! + currentLineageModel.columns[targetColumnNameEncoded as ColumnName]! const currentLineageModelColumnModels = currentLineageModelColumn.models for (const sourceColumnName in newLineageModelColumn.models) { const sourceColumnNameEncoded = encodeURI(sourceColumnName) const currentLineageModelColumnModel = - currentLineageModelColumnModels[sourceColumnNameEncoded]! + currentLineageModelColumnModels[ + sourceColumnNameEncoded as ModelEncodedFQN + ]! const newLineageModelColumnModel = newLineageModelColumn.models[sourceColumnName]! - currentLineageModelColumnModels[sourceColumnNameEncoded] = Array.from( + // @ts-expect-error TODO: fix this + currentLineageModelColumnModels[ + sourceColumnNameEncoded as ModelEncodedFQN + ] = Array.from( new Set( isNil(currentLineageModelColumnModel) ? newLineageModelColumnModel : currentLineageModelColumnModel.concat( - newLineageModelColumnModel, + newLineageModelColumnModel as ColumnName[], ), ), - ).map((uri: string) => encodeURI(uri)) + ).map(uri => encode(uri as ModelURI)) } } } @@ -465,11 +492,10 @@ export function getLineageIndex(lineage: Record = {}): string { models.forEach(m => allModels.add(m)) if (isNotNil(columns)) { - Object.keys(columns).forEach(columnName => { - const column = columns[columnName as ModelName] - + toKeys(columns).forEach(columnName => { + const column = columns[columnName] if (isNotNil(column) && isNotNil(column.models)) { - Object.keys(column.models).forEach(m => allModels.add(m)) + toKeys(column.models).forEach(m => allModels.add(m)) } }) } @@ -502,9 +528,9 @@ export function getActiveNodes( activeEdges: ActiveEdges, selectedEdges: ConnectedNode[], nodesMap: Record, -): Set { - return new Set( - edges.reduce((acc: string[], edge) => { +): Set { + return new Set( + edges.reduce((acc: ModelEncodedFQN[], edge) => { const sourceNode = isNil(edge.sourceHandle) ? undefined : nodesMap[edge.sourceHandle] @@ -518,14 +544,14 @@ export function getActiveNodes( sourceNode.data.type === EnumLineageNodeModelType.external && hasActiveEdgeConnector(activeEdges, edge.sourceHandle) ) { - acc.push(edge.source) + acc.push(edge.source as ModelEncodedFQN) } else if ( isNotNil(targetNode) && isNotNil(edge.targetHandle) && targetNode.data.type === EnumLineageNodeModelType.external && hasActiveEdgeConnector(activeEdges, edge.targetHandle) ) { - acc.push(edge.target) + acc.push(edge.target as ModelEncodedFQN) } else { const isActiveEdge = hasActiveEdge(activeEdges, [ edge.targetHandle, @@ -534,11 +560,11 @@ export function getActiveNodes( if (isActiveEdge || hasEdge(selectedEdges, edge.id)) { if (isNotNil(edge.source)) { - acc.push(edge.source) + acc.push(edge.source as ModelEncodedFQN) } if (isNotNil(edge.target)) { - acc.push(edge.target) + acc.push(edge.target as ModelEncodedFQN) } } } @@ -712,14 +738,22 @@ export function hasActiveEdgeConnector( } export function getModelNodeTypeTitle(type: LineageNodeModelType): string { - if (type === EnumLineageNodeModelType.python) return 'PYTHON' - if (type === EnumLineageNodeModelType.sql) return 'SQL' - if (type === EnumLineageNodeModelType.seed) return 'SEED' - if (type === EnumLineageNodeModelType.cte) return 'CTE' - if (type === EnumLineageNodeModelType.external) return 'EXTERNAL' - if (type === EnumLineageNodeModelType.source) return 'SOURCE' - - return 'UNKNOWN' + switch (type) { + case EnumLineageNodeModelType.python: + return 'PYTHON' + case EnumLineageNodeModelType.sql: + return 'SQL' + case EnumLineageNodeModelType.seed: + return 'SEED' + case EnumLineageNodeModelType.cte: + return 'CTE' + case EnumLineageNodeModelType.external: + return 'EXTERNAL' + case EnumLineageNodeModelType.source: + return 'SOURCE' + default: + return 'UNKNOWN' + } } function hasEdge(nodes: ConnectedNode[], edge: string): boolean { diff --git a/vscode/react/src/components/graph/types.ts b/vscode/react/src/components/graph/types.ts index 6d488ac31a..831251e2d7 100644 --- a/vscode/react/src/components/graph/types.ts +++ b/vscode/react/src/components/graph/types.ts @@ -1,6 +1,45 @@ +import type { ColumnName } from '@/domain/column' +import type { ModelEncodedFQN } from '@/domain/models' + export const EnumSide = { Left: 'left', Right: 'right', } as const export type Side = (typeof EnumSide)[keyof typeof EnumSide] + +export type NodeId = string + +export type EdgeId = string + +/** + * Converts a list of strings to a single string with a double underscore + * Outlines with types, the type of ids that can be created. + * @param args + * @returns + */ +export function toID( + leftOrRight: 'left' | 'right', + modelName: ModelEncodedFQN, + columnName: ColumnName, +): NodeId +export function toID(source: NodeId, target: NodeId): NodeId +export function toID( + leftOrRight: 'left' | 'right', + modelName: ModelEncodedFQN, +): NodeId +export function toID( + source: NodeId, + target: NodeId, + sourceHandle: string | undefined, + targetHandle: string | undefined, +): EdgeId +export function toID(...args: Array): string { + return args.filter(Boolean).join('__') +} + +export function toKeys(obj: Record): K[] { + return Object.keys(obj) as K[] +} + +export type ModelLineage = Record diff --git a/vscode/react/src/domain/lineage.ts b/vscode/react/src/domain/lineage.ts index e9d798a361..499ff709a7 100644 --- a/vscode/react/src/domain/lineage.ts +++ b/vscode/react/src/domain/lineage.ts @@ -1,7 +1,37 @@ -import { type LineageColumn } from '@/api/client' -import type { ModelEncodedFQN, ModelName } from '@/domain/models' +import { + type LineageColumn as ApiLineageColumn, + type ModelLineageApiLineageModelNameGet200, +} from '@/api/client' +import type { ModelEncodedFQN, ModelFQN } from '@/domain/models' +import type { ColumnName } from './column' export interface Lineage { models: ModelEncodedFQN[] - columns?: Record + columns?: Record +} + +export interface LineageColumn { + source?: string + expression?: string + models: { + [key: ModelEncodedFQN]: ColumnName[] + } +} + +export const toLineageColumn = (column: ApiLineageColumn): LineageColumn => { + return { + source: column.source ?? undefined, + expression: column.expression ?? undefined, + models: column.models as Record, + } +} + +export interface ModelLineage { + [key: ModelFQN]: ModelFQN[] +} + +export const toModelLineage = ( + lineage: ModelLineageApiLineageModelNameGet200, +): ModelLineage => { + return lineage as Record } diff --git a/vscode/react/src/domain/models.ts b/vscode/react/src/domain/models.ts index 9b4ab04153..a54aaf1246 100644 --- a/vscode/react/src/domain/models.ts +++ b/vscode/react/src/domain/models.ts @@ -30,6 +30,20 @@ export type ModelURI = Branded */ export type ModelEncodedURI = Branded +export function encode(fqn: ModelName): ModelEncodedName +export function encode(fqn: ModelURI): ModelEncodedURI +export function encode(fqn: ModelFQN): ModelEncodedFQN +export function encode(s: string): string { + return encodeURI(s) +} + +export function decode(fqn: ModelEncodedName): ModelName +export function decode(fqn: ModelEncodedURI): ModelURI +export function decode(fqn: ModelEncodedFQN): ModelFQN +export function decode(s: string): string { + return decodeURI(s) +} + /** * ModelPath is a type that represents the path of a model. * A model path is relative to the project root. diff --git a/vscode/react/src/domain/sqlmesh-model.ts b/vscode/react/src/domain/sqlmesh-model.ts index 40b1b05aa8..273da62a4d 100644 --- a/vscode/react/src/domain/sqlmesh-model.ts +++ b/vscode/react/src/domain/sqlmesh-model.ts @@ -1,5 +1,4 @@ import { - type Column, type ModelDetails, type Model, type ModelDescription, @@ -18,6 +17,7 @@ import type { import { isArrayNotEmpty } from '@/utils/index' import { ModelInitial } from './initial' import type { Lineage } from './lineage' +import { fromAPIColumn, type Column } from '@/domain/column' export interface InitialSQLMeshModel extends Omit { @@ -68,7 +68,7 @@ export class ModelSQLMeshModel< this.description = this.initial.description this.sql = this.initial.sql this.definition = this.initial.definition - this.columns = this.initial.columns ?? [] + this.columns = this.initial.columns?.map(fromAPIColumn) ?? [] this.type = this.initial.type this.hash = this.initial.hash this.details = this.initial.details ?? {} diff --git a/vscode/react/src/pages/lineage.tsx b/vscode/react/src/pages/lineage.tsx index 77f66fa85b..ddfac87fc4 100644 --- a/vscode/react/src/pages/lineage.tsx +++ b/vscode/react/src/pages/lineage.tsx @@ -16,11 +16,11 @@ import type { VSCodeEvent } from '@bus/callbacks' import { URI } from 'vscode-uri' import type { Model } from '@/api/client' import { useRpc } from '@/utils/rpc' -import type { - ModelEncodedFQN, - ModelName, - ModelPath, - ModelFullPath, +import { + type ModelPath, + type ModelFullPath, + type ModelName, + type ModelEncodedFQN, } from '@/domain/models' export function LineagePage() { diff --git a/vscode/react/src/utils/index.ts b/vscode/react/src/utils/index.ts index 6d6415bd62..ed0faab1db 100644 --- a/vscode/react/src/utils/index.ts +++ b/vscode/react/src/utils/index.ts @@ -175,10 +175,6 @@ export function uid(): string { return time + random } -export function toID(...args: Array): string { - return args.filter(Boolean).join('__') -} - export function toUniqueName(prefix?: string, suffix?: string): string { // Should be enough for now const hex = (Date.now() % 100000).toString(16) diff --git a/vscode/react/src/workers/lineage.ts b/vscode/react/src/workers/lineage.ts index 89fc8614eb..0644cdbb63 100644 --- a/vscode/react/src/workers/lineage.ts +++ b/vscode/react/src/workers/lineage.ts @@ -1,6 +1,7 @@ -import { isFalse, isNil, isStringEmptyOrNil, toID } from '@/utils/index' +import { isFalse, isNil } from '@/utils/index' import { type Lineage } from '@/domain/lineage' import type { ModelEncodedFQN } from '@/domain/models' +import { toID, type NodeId } from '@/components/graph/types' export interface ConnectedNode { id?: string @@ -96,7 +97,7 @@ function getConnectedNodes( } if (isFalse(node in result)) { - result[node] = createConnectedNode() + result[node] = { edges: [] } } for (const model of models) { @@ -114,14 +115,10 @@ function getConnectedNodes( } function createConnectedNode( - source?: string, - target?: string, + source: NodeId, + target: NodeId, edges: ConnectedNode[] = [], ): ConnectedNode { const id = toID(source, target) - - return { - id: isStringEmptyOrNil(id) ? undefined : id, - edges, - } + return { id, edges } } diff --git a/vscode/react/vitest.shims.d.ts b/vscode/react/vitest.shims.d.ts new file mode 100644 index 0000000000..a1d31e5a7b --- /dev/null +++ b/vscode/react/vitest.shims.d.ts @@ -0,0 +1 @@ +///