From 9ad93046869f3ec5aaf578c5bdd083d0fe9d2675 Mon Sep 17 00:00:00 2001 From: Jahvon Dockery Date: Wed, 10 Sep 2025 16:26:07 -0400 Subject: [PATCH 1/3] test(desktop): remove storybook Storybook and it's tests are very likely to break often with some of the early development of the desktop app. Instead, vitest will provide the foundation for testing for now. --- CLAUDE.md | 2 +- desktop/.storybook/decorators.tsx | 9 - desktop/.storybook/main.ts | 20 - desktop/.storybook/preview.ts | 25 - desktop/.storybook/vitest.setup.ts | 7 - desktop/README.md | 2 - desktop/package-lock.json | 967 +----------------- desktop/package.json | 12 +- .../CodeHighlighter.stories.tsx | 127 --- .../MarkdownRenderer.stories.tsx | 63 -- desktop/src/components/Theme.stories.tsx | 143 --- .../ActionButtons/ActionButtons.stories.tsx | 28 - desktop/src/layout/Header/Header.stories.tsx | 41 - .../ExecutableTree/ExecutableTree.stories.tsx | 82 -- .../WorkspaceSelector.stories.tsx | 55 - desktop/vitest.workspace.ts | 32 - 16 files changed, 54 insertions(+), 1561 deletions(-) delete mode 100644 desktop/.storybook/decorators.tsx delete mode 100644 desktop/.storybook/main.ts delete mode 100644 desktop/.storybook/preview.ts delete mode 100644 desktop/.storybook/vitest.setup.ts delete mode 100644 desktop/src/components/CodeHighlighter/CodeHighlighter.stories.tsx delete mode 100644 desktop/src/components/MarkdownRenderer/MarkdownRenderer.stories.tsx delete mode 100644 desktop/src/components/Theme.stories.tsx delete mode 100644 desktop/src/layout/Header/ActionButtons/ActionButtons.stories.tsx delete mode 100644 desktop/src/layout/Header/Header.stories.tsx delete mode 100644 desktop/src/layout/Sidebar/ExecutableTree/ExecutableTree.stories.tsx delete mode 100644 desktop/src/layout/Sidebar/WorkspaceSelector/WorkspaceSelector.stories.tsx delete mode 100644 desktop/vitest.workspace.ts diff --git a/CLAUDE.md b/CLAUDE.md index 4d10c452..a03001e1 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -42,7 +42,7 @@ flow/ - **UI Library**: Mantine v8 (@mantine/core) - **Backend**: Rust with Tauri v2 - **Build Tool**: Vite -- **Testing**: Vitest with Storybook for component development +- **Testing**: Vitest for component development ## Development Workflow diff --git a/desktop/.storybook/decorators.tsx b/desktop/.storybook/decorators.tsx deleted file mode 100644 index 0cd9b583..00000000 --- a/desktop/.storybook/decorators.tsx +++ /dev/null @@ -1,9 +0,0 @@ -import React from 'react'; -import { MantineProvider } from '@mantine/core'; -import { theme } from '../src/theme'; - -export const withMantine = (Story: React.ComponentType) => ( - - - -); \ No newline at end of file diff --git a/desktop/.storybook/main.ts b/desktop/.storybook/main.ts deleted file mode 100644 index 242055f8..00000000 --- a/desktop/.storybook/main.ts +++ /dev/null @@ -1,20 +0,0 @@ -import type { StorybookConfig } from '@storybook/react-vite'; - -const config: StorybookConfig = { - "stories": [ - "../src/**/*.mdx", - "../src/**/*.stories.@(js|jsx|mjs|ts|tsx)" - ], - "addons": [ - "@storybook/addon-onboarding", - "@chromatic-com/storybook", - "@storybook/addon-docs", - "@storybook/addon-a11y", - "@storybook/addon-vitest" - ], - "framework": { - "name": "@storybook/react-vite", - "options": {} - } -}; -export default config; \ No newline at end of file diff --git a/desktop/.storybook/preview.ts b/desktop/.storybook/preview.ts deleted file mode 100644 index 74417765..00000000 --- a/desktop/.storybook/preview.ts +++ /dev/null @@ -1,25 +0,0 @@ -import type { Preview } from '@storybook/react-vite' -import '@mantine/core/styles.css' -import { withMantine } from './decorators' - -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' - } - }, - decorators: [withMantine], -}; - -export default preview; - diff --git a/desktop/.storybook/vitest.setup.ts b/desktop/.storybook/vitest.setup.ts deleted file mode 100644 index 44922d55..00000000 --- a/desktop/.storybook/vitest.setup.ts +++ /dev/null @@ -1,7 +0,0 @@ -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]); \ No newline at end of file diff --git a/desktop/README.md b/desktop/README.md index 6ab205c2..0c4d85eb 100644 --- a/desktop/README.md +++ b/desktop/README.md @@ -36,5 +36,3 @@ This project uses Tauri v2 with React and TypeScript for the frontend, and Rust - `npm run preview` - Preview the built application - `npm run tauri` - Run Tauri CLI commands - `npm run generate-types` - Generate TypeScript types from JSON schemas -- `npm run storybook` - Start Storybook for component development -- `npm run build-storybook` - Build Storybook for production diff --git a/desktop/package-lock.json b/desktop/package-lock.json index e268d5df..09f063c9 100644 --- a/desktop/package-lock.json +++ b/desktop/package-lock.json @@ -24,14 +24,11 @@ "wouter": "^3.7.1" }, "devDependencies": { - "@chromatic-com/storybook": "^4.0.0", "@eslint/js": "^9.28.0", - "@storybook/addon-a11y": "^9.0.4", - "@storybook/addon-docs": "^9.0.4", - "@storybook/addon-onboarding": "^9.0.4", - "@storybook/addon-vitest": "^9.0.4", - "@storybook/react-vite": "^9.0.4", "@tauri-apps/cli": "^2", + "@testing-library/jest-dom": "^6.8.0", + "@testing-library/react": "^16.3.0", + "@testing-library/user-event": "^14.6.1", "@types/node": "^20.11.24", "@types/react": "^19.1.0", "@types/react-dom": "^19.1.0", @@ -47,7 +44,6 @@ "postcss-preset-mantine": "^1.17.0", "postcss-simple-vars": "^7.0.1", "prettier": "3.5.3", - "storybook": "^9.0.4", "tsx": "^4.7.1", "typescript": "~5.6.2", "typescript-eslint": "^8.34.0", @@ -56,9 +52,9 @@ } }, "node_modules/@adobe/css-tools": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.4.3.tgz", - "integrity": "sha512-VQKMkwriZbaOgVCby1UDY/LDk5fIjhQicCvVPFqfe+69fWaPWydbWJ3wRt59/YzIwda1I81loas3oCoHxnqvdA==", + "version": "4.4.4", + "resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.4.4.tgz", + "integrity": "sha512-Elp+iwUx5rN5+Y8xLt5/GRoG20WGoDCQ/1Fb+1LiGtvwbDavuSk0jhD/eZdckHAuzcDzccnkv+rEjyWfRx18gg==", "dev": true, "license": "MIT" }, @@ -395,27 +391,6 @@ "node": ">=18" } }, - "node_modules/@chromatic-com/storybook": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@chromatic-com/storybook/-/storybook-4.0.0.tgz", - "integrity": "sha512-FfyMHK/lz/dHezWxwNZv4ReFORWVvv+bJx71NT2BSfLhOKOaoZnKJOe4QLyGxWAB7ynnedrM9V9qea3FPFj+rQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@neoconfetti/react": "^1.0.0", - "chromatic": "^12.0.0", - "filesize": "^10.0.12", - "jsonfile": "^6.1.0", - "strip-ansi": "^7.1.0" - }, - "engines": { - "node": ">=20.0.0", - "yarn": ">=1.22.18" - }, - "peerDependencies": { - "storybook": "^0.0.0-0 || ^9.0.0 || ^9.1.0-0" - } - }, "node_modules/@esbuild/aix-ppc64": { "version": "0.25.5", "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.5.tgz", @@ -1190,27 +1165,6 @@ "node": ">=8" } }, - "node_modules/@joshwooding/vite-plugin-react-docgen-typescript": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/@joshwooding/vite-plugin-react-docgen-typescript/-/vite-plugin-react-docgen-typescript-0.6.0.tgz", - "integrity": "sha512-dPo6SE4dm8UKcgGg4LsV9iw6f5HkIeJwzMA2M2Lb+mhl5vxesbDvb3ENTzNTkGnOxS6PqJig2pfXdtYaW3S9fg==", - "dev": true, - "license": "MIT", - "dependencies": { - "glob": "^10.0.0", - "magic-string": "^0.30.0", - "react-docgen-typescript": "^2.2.2" - }, - "peerDependencies": { - "typescript": ">= 4.3.x", - "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, "node_modules/@jridgewell/gen-mapping": { "version": "0.3.12", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.12.tgz", @@ -1284,31 +1238,6 @@ "react": "^18.x || ^19.x" } }, - "node_modules/@mdx-js/react": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@mdx-js/react/-/react-3.1.0.tgz", - "integrity": "sha512-QjHtSaoameoalGnKDT3FoIl4+9RwyTmo9ZJGBdLOks/YOiWHoRDI3PUwEzOE7kEmGcV3AFcp9K6dYu9rEuKLAQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/mdx": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - }, - "peerDependencies": { - "@types/react": ">=16", - "react": ">=16" - } - }, - "node_modules/@neoconfetti/react": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@neoconfetti/react/-/react-1.0.0.tgz", - "integrity": "sha512-klcSooChXXOzIm+SE5IISIAn3bYzYfPjbX7D7HoqZL84oAfgREeSg5vSIaSFH+DaGzzvImTyWe1OyrJ67vik4A==", - "dev": true, - "license": "MIT" - }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -1372,29 +1301,6 @@ "dev": true, "license": "MIT" }, - "node_modules/@rollup/pluginutils": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.1.4.tgz", - "integrity": "sha512-USm05zrsFxYLPdWWq+K3STlWiT/3ELn3RcV5hJMghpeAIhxfsUIg6mt12CBJBInWMV4VneoV7SfGv8xIwo2qNQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.0", - "estree-walker": "^2.0.2", - "picomatch": "^4.0.2" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" - }, - "peerDependenciesMeta": { - "rollup": { - "optional": true - } - } - }, "node_modules/@rollup/rollup-android-arm-eabi": { "version": "4.41.1", "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.41.1.tgz", @@ -1675,261 +1581,6 @@ "win32" ] }, - "node_modules/@storybook/addon-a11y": { - "version": "9.0.4", - "resolved": "https://registry.npmjs.org/@storybook/addon-a11y/-/addon-a11y-9.0.4.tgz", - "integrity": "sha512-XZSdO2B4QG8L/lQsw2dG9VcozsstdaZtLwUxXKo2tGkYQTfdnw93BCP9dhPPQCuJIIadkRts4MlmmD3XCwq+7g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@storybook/global": "^5.0.0", - "axe-core": "^4.2.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - }, - "peerDependencies": { - "storybook": "^9.0.4" - } - }, - "node_modules/@storybook/addon-docs": { - "version": "9.0.4", - "resolved": "https://registry.npmjs.org/@storybook/addon-docs/-/addon-docs-9.0.4.tgz", - "integrity": "sha512-g9Cywdicc8iXFwQm3XFLwZgFMel7BF21zTumErLs30tsowTCqE9dTxwPSrqlbvfknhLp7I/lwyzDXGf9SXmERA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@mdx-js/react": "^3.0.0", - "@storybook/csf-plugin": "9.0.4", - "@storybook/icons": "^1.2.12", - "@storybook/react-dom-shim": "9.0.4", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", - "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", - "ts-dedent": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - }, - "peerDependencies": { - "storybook": "^9.0.4" - } - }, - "node_modules/@storybook/addon-onboarding": { - "version": "9.0.4", - "resolved": "https://registry.npmjs.org/@storybook/addon-onboarding/-/addon-onboarding-9.0.4.tgz", - "integrity": "sha512-RIQAAh2Dm+N/tmPRFVoeRpJDZpzr98AaKwTw6rNjkI1EXATUUT1x04SaIee5OEXnjyKtbQrWwleY3Fxc9a4LKg==", - "dev": true, - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - }, - "peerDependencies": { - "storybook": "^9.0.4" - } - }, - "node_modules/@storybook/addon-vitest": { - "version": "9.0.4", - "resolved": "https://registry.npmjs.org/@storybook/addon-vitest/-/addon-vitest-9.0.4.tgz", - "integrity": "sha512-BLcS7uEmSAVbNeU+LzNY3dBnXw17zGCr+vf/XEu76d69K9Kw1LNIoq6w5PwlY1eh0z90y5S7ukC2VfuH/7IalA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@storybook/global": "^5.0.0", - "@storybook/icons": "^1.4.0", - "prompts": "^2.4.0", - "ts-dedent": "^2.2.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - }, - "peerDependencies": { - "@vitest/browser": "^3.0.0", - "@vitest/runner": "^3.0.0", - "storybook": "^9.0.4", - "vitest": "^3.0.0" - }, - "peerDependenciesMeta": { - "@vitest/browser": { - "optional": true - }, - "@vitest/runner": { - "optional": true - }, - "vitest": { - "optional": true - } - } - }, - "node_modules/@storybook/builder-vite": { - "version": "9.0.8", - "resolved": "https://registry.npmjs.org/@storybook/builder-vite/-/builder-vite-9.0.8.tgz", - "integrity": "sha512-dbwDfBUwLW8I71h0Y9r+twtEdjKC+oBP1YweS26ET78qc6qXMFsK5Tfh6lzj/vQbmxY0YhnTVrrkXgfR0erLPA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@storybook/csf-plugin": "9.0.8", - "ts-dedent": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - }, - "peerDependencies": { - "storybook": "^9.0.8", - "vite": "^5.0.0 || ^6.0.0" - } - }, - "node_modules/@storybook/builder-vite/node_modules/@storybook/csf-plugin": { - "version": "9.0.8", - "resolved": "https://registry.npmjs.org/@storybook/csf-plugin/-/csf-plugin-9.0.8.tgz", - "integrity": "sha512-mNjo4t9liAbQvhE9ni87NU2sz9tqFU4Y54ioSFDlW24wpubsvnhBi5h4z3EkeQJSzIzNMRym9SC7Elbqa3Kf+g==", - "dev": true, - "license": "MIT", - "dependencies": { - "unplugin": "^1.3.1" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - }, - "peerDependencies": { - "storybook": "^9.0.8" - } - }, - "node_modules/@storybook/csf-plugin": { - "version": "9.0.4", - "resolved": "https://registry.npmjs.org/@storybook/csf-plugin/-/csf-plugin-9.0.4.tgz", - "integrity": "sha512-ctEcOcLVn/fqBLNLIDcmoqz68e1n8zft76xVQK2Czs/tLoH+6plGfOfspcZ+V4jMr9/299gg2DjyqYa8IdYNSw==", - "dev": true, - "license": "MIT", - "dependencies": { - "unplugin": "^1.3.1" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - }, - "peerDependencies": { - "storybook": "^9.0.4" - } - }, - "node_modules/@storybook/global": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@storybook/global/-/global-5.0.0.tgz", - "integrity": "sha512-FcOqPAXACP0I3oJ/ws6/rrPT9WGhu915Cg8D02a9YxLo0DE9zI+a9A5gRGvmQ09fiWPukqI8ZAEoQEdWUKMQdQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@storybook/icons": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@storybook/icons/-/icons-1.4.0.tgz", - "integrity": "sha512-Td73IeJxOyalzvjQL+JXx72jlIYHgs+REaHiREOqfpo3A2AYYG71AUbcv+lg7mEDIweKVCxsMQ0UKo634c8XeA==", - "dev": true, - "license": "MIT", - "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" - } - }, - "node_modules/@storybook/react": { - "version": "9.0.8", - "resolved": "https://registry.npmjs.org/@storybook/react/-/react-9.0.8.tgz", - "integrity": "sha512-in3O+lDmxKRhdcX3Wg6FbLnb2/PuqRL+rUKMz1wr1ndSkw4J1jGsvP909oEEYnDbjHOX0xnNxxbEapO4F9fgBQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@storybook/global": "^5.0.0", - "@storybook/react-dom-shim": "9.0.8" - }, - "engines": { - "node": ">=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - }, - "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.8", - "typescript": ">= 4.9.x" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@storybook/react-dom-shim": { - "version": "9.0.4", - "resolved": "https://registry.npmjs.org/@storybook/react-dom-shim/-/react-dom-shim-9.0.4.tgz", - "integrity": "sha512-KZYb0/7VzWfCupiioFyFCITDixSeEpuww95VjanAxlwkjq78ufWZ4MnlXk9vzVDghRQN3+JoNEvTCJXN37KWjQ==", - "dev": true, - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - }, - "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.4" - } - }, - "node_modules/@storybook/react-vite": { - "version": "9.0.8", - "resolved": "https://registry.npmjs.org/@storybook/react-vite/-/react-vite-9.0.8.tgz", - "integrity": "sha512-nAtT9UeOkKCBJ2kbatC7Hf/TX3Kl+e21wvc1D5xpS86ulPamzjzxLD5nW+vliBKePOo+9ZW/KQZYCLg3snRJtQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@joshwooding/vite-plugin-react-docgen-typescript": "0.6.0", - "@rollup/pluginutils": "^5.0.2", - "@storybook/builder-vite": "9.0.8", - "@storybook/react": "9.0.8", - "find-up": "^5.0.0", - "magic-string": "^0.30.0", - "react-docgen": "^8.0.0", - "resolve": "^1.22.8", - "tsconfig-paths": "^4.2.0" - }, - "engines": { - "node": ">=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - }, - "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.8", - "vite": "^5.0.0 || ^6.0.0" - } - }, - "node_modules/@storybook/react/node_modules/@storybook/react-dom-shim": { - "version": "9.0.8", - "resolved": "https://registry.npmjs.org/@storybook/react-dom-shim/-/react-dom-shim-9.0.8.tgz", - "integrity": "sha512-SYyjRagHZx724hGEWSZcXRzj82am77OpqeA9ps6ZsCSn4cVY9FORGEeY2bnlQkpLnDUH5yjdV/oh+0fXDbl/8g==", - "dev": true, - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - }, - "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.8" - } - }, "node_modules/@tabler/icons": { "version": "3.34.0", "resolved": "https://registry.npmjs.org/@tabler/icons/-/icons-3.34.0.tgz", @@ -2255,18 +1906,17 @@ } }, "node_modules/@testing-library/jest-dom": { - "version": "6.6.3", - "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-6.6.3.tgz", - "integrity": "sha512-IteBhl4XqYNkM54f4ejhLRJiZNqcSCoXUOG2CPK7qbD322KjQozM4kHQOfkG2oln9b9HTYqs+Sae8vBATubxxA==", + "version": "6.8.0", + "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-6.8.0.tgz", + "integrity": "sha512-WgXcWzVM6idy5JaftTVC8Vs83NKRmGJz4Hqs4oyOuO2J4r/y79vvKZsb+CaGyCSEbUPI6OsewfPd0G1A0/TUZQ==", "dev": true, "license": "MIT", "dependencies": { "@adobe/css-tools": "^4.4.0", "aria-query": "^5.0.0", - "chalk": "^3.0.0", "css.escape": "^1.5.1", "dom-accessibility-api": "^0.6.3", - "lodash": "^4.17.21", + "picocolors": "^1.1.1", "redent": "^3.0.0" }, "engines": { @@ -2275,20 +1925,6 @@ "yarn": ">=1" } }, - "node_modules/@testing-library/jest-dom/node_modules/chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/@testing-library/jest-dom/node_modules/dom-accessibility-api": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.6.3.tgz", @@ -2296,6 +1932,34 @@ "dev": true, "license": "MIT" }, + "node_modules/@testing-library/react": { + "version": "16.3.0", + "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-16.3.0.tgz", + "integrity": "sha512-kFSyxiEDwv1WLl2fgsq6pPBbw5aWKrsY2/noi1Id0TK0UParSF62oFQFGHXIyaG4pp2tEub/Zlel+fjjZILDsw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.12.5" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@testing-library/dom": "^10.0.0", + "@types/react": "^18.0.0 || ^19.0.0", + "@types/react-dom": "^18.0.0 || ^19.0.0", + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, "node_modules/@testing-library/user-event": { "version": "14.6.1", "resolved": "https://registry.npmjs.org/@testing-library/user-event/-/user-event-14.6.1.tgz", @@ -2387,13 +2051,6 @@ "dev": true, "license": "MIT" }, - "node_modules/@types/doctrine": { - "version": "0.0.9", - "resolved": "https://registry.npmjs.org/@types/doctrine/-/doctrine-0.0.9.tgz", - "integrity": "sha512-eOIHzCUSH7SMfonMG1LsC2f8vxBFtho6NGBznK41R84YzPuvSBzrhEps33IsQiOW9+VL6NQ9DbjQJznk/S4uRA==", - "dev": true, - "license": "MIT" - }, "node_modules/@types/estree": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.7.tgz", @@ -2446,13 +2103,6 @@ "@types/unist": "*" } }, - "node_modules/@types/mdx": { - "version": "2.0.13", - "resolved": "https://registry.npmjs.org/@types/mdx/-/mdx-2.0.13.tgz", - "integrity": "sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw==", - "dev": true, - "license": "MIT" - }, "node_modules/@types/minimatch": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-5.1.2.tgz", @@ -2503,13 +2153,6 @@ "@types/react": "^19.0.0" } }, - "node_modules/@types/resolve": { - "version": "1.20.6", - "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.20.6.tgz", - "integrity": "sha512-A4STmOXPhMUtHH+S6ymgE2GiBSMqf4oTvcQZMcHzokuTLVYzXTB8ttjcgxOVaAp2lGwEdzZ0J+cRbbeevQj1UQ==", - "dev": true, - "license": "MIT" - }, "node_modules/@types/unist": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", @@ -2883,22 +2526,6 @@ } } }, - "node_modules/@vitest/expect": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-3.0.9.tgz", - "integrity": "sha512-5eCqRItYgIML7NNVgJj6TVCmdzE7ZVgJhruW0ziSQV4V7PvLkDL1bBkBdcTs/VuIz0IxPb5da1IDSqc1TR9eig==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/spy": "3.0.9", - "@vitest/utils": "3.0.9", - "chai": "^5.2.0", - "tinyrainbow": "^2.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, "node_modules/@vitest/mocker": { "version": "3.2.3", "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-3.2.3.tgz", @@ -2959,19 +2586,6 @@ "node": ">=14.0.0" } }, - "node_modules/@vitest/pretty-format": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-3.0.9.tgz", - "integrity": "sha512-OW9F8t2J3AwFEwENg3yMyKWweF7oRJlMyHOMIhO5F3n0+cgQAJZBjNgrF8dLwFTEXl5jUqBLXd9QyyKv8zEcmA==", - "dev": true, - "license": "MIT", - "dependencies": { - "tinyrainbow": "^2.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, "node_modules/@vitest/runner": { "version": "3.2.3", "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-3.2.3.tgz", @@ -3043,34 +2657,6 @@ "url": "https://opencollective.com/vitest" } }, - "node_modules/@vitest/spy": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-3.0.9.tgz", - "integrity": "sha512-/CcK2UDl0aQ2wtkp3YVWldrpLRNCfVcIOFGlVGKO4R5eajsH393Z1yiXLVQ7vWsj26JOEjeZI0x5sm5P4OGUNQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "tinyspy": "^3.0.2" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/utils": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-3.0.9.tgz", - "integrity": "sha512-ilHM5fHhZ89MCp5aAaM9uhfl1c2JdxVxl3McqsdVyVNN6JffnEen8UMCdRTzOhGXNQGo5GNL9QugHrz727Wnng==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/pretty-format": "3.0.9", - "loupe": "^3.1.3", - "tinyrainbow": "^2.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, "node_modules/acorn": { "version": "8.15.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", @@ -3307,19 +2893,6 @@ "node": ">=12" } }, - "node_modules/ast-types": { - "version": "0.16.1", - "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.16.1.tgz", - "integrity": "sha512-6t10qk83GOG8p0vKmaCr8eiilZwO171AvbROMtvvNiwrTly62t+7XkA8RdIIVbpMhCASAsxgAzdRSwh6nw/5Dg==", - "dev": true, - "license": "MIT", - "dependencies": { - "tslib": "^2.0.1" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/ast-v8-to-istanbul": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/ast-v8-to-istanbul/-/ast-v8-to-istanbul-0.3.3.tgz", @@ -3375,16 +2948,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/axe-core": { - "version": "4.10.3", - "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.10.3.tgz", - "integrity": "sha512-Xm7bpRXnDSX2YE2YFfBk2FnF0ep6tmG7xPh8iHee8MIcrgq762Nkce856dYtJYLkuIoYZvGfTs/PbZhideTcEg==", - "dev": true, - "license": "MPL-2.0", - "engines": { - "node": ">=4" - } - }, "node_modules/bail": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", @@ -3401,19 +2964,6 @@ "dev": true, "license": "MIT" }, - "node_modules/better-opn": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/better-opn/-/better-opn-3.0.2.tgz", - "integrity": "sha512-aVNobHnJqLiUelTaHat9DZ1qM2w0C0Eym4LPI/3JxOnSokGVdsl1T1kN7TFvsEAD8G47A6VKQ0TVHqbBnYMJlQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "open": "^8.0.4" - }, - "engines": { - "node": ">=12.0.0" - } - }, "node_modules/brace-expansion": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", @@ -3657,37 +3207,13 @@ } }, "node_modules/check-error": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.1.tgz", - "integrity": "sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 16" - } - }, - "node_modules/chromatic": { - "version": "12.1.0", - "resolved": "https://registry.npmjs.org/chromatic/-/chromatic-12.1.0.tgz", - "integrity": "sha512-X45IVEb8mX3J+iDEpb6dY6CUvqWm5jlo8QqzgUGFYlcO7A327Ve3G4dzuu96f/hcXifZ0T1E7BMN6/z0iO4V2A==", - "dev": true, - "license": "MIT", - "bin": { - "chroma": "dist/bin.js", - "chromatic": "dist/bin.js", - "chromatic-cli": "dist/bin.js" - }, - "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 - } + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.1.tgz", + "integrity": "sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 16" } }, "node_modules/cli-color": { @@ -3929,16 +3455,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/define-lazy-prop": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", - "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/define-properties": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", @@ -3984,19 +3500,6 @@ "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, "node_modules/dom-accessibility-api": { "version": "0.5.16", "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz", @@ -4317,19 +3820,6 @@ "@esbuild/win32-x64": "0.25.5" } }, - "node_modules/esbuild-register": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/esbuild-register/-/esbuild-register-3.6.0.tgz", - "integrity": "sha512-H2/S7Pm8a9CL1uhp9OvjwrBh5Pvx0H8qVOxNu8Wed9Y7qv56MPtq+GGM8RJpq6glYJn9Wspr8uw7l55uyinNeg==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "^4.3.4" - }, - "peerDependencies": { - "esbuild": ">=0.12 <1" - } - }, "node_modules/escalade": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", @@ -4602,20 +4092,6 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true, - "license": "BSD-2-Clause", - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/esquery": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", @@ -4661,13 +4137,6 @@ "url": "https://opencollective.com/unified" } }, - "node_modules/estree-walker": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", - "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", - "dev": true, - "license": "MIT" - }, "node_modules/esutils": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", @@ -4788,16 +4257,6 @@ "node": ">=16.0.0" } }, - "node_modules/filesize": { - "version": "10.1.6", - "resolved": "https://registry.npmjs.org/filesize/-/filesize-10.1.6.tgz", - "integrity": "sha512-sJslQKU2uM33qH5nqewAwVB2QgR6w1aMNsYUp3aN5rMRyXEwJGmZvaWzeJFNTOXWlHQyBFCWrdj3fV/fsTOX8w==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">= 10.4.0" - } - }, "node_modules/fill-range": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", @@ -5121,14 +4580,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dev": true, - "license": "ISC", - "optional": true - }, "node_modules/graphemer": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", @@ -5535,22 +4986,6 @@ "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/is-docker": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", - "dev": true, - "license": "MIT", - "bin": { - "is-docker": "cli.js" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -5843,19 +5278,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-docker": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/isarray": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", @@ -6130,19 +5552,6 @@ "node": ">=6" } }, - "node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, "node_modules/jsx-ast-utils": { "version": "3.3.5", "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", @@ -6169,16 +5578,6 @@ "json-buffer": "3.0.1" } }, - "node_modules/kleur": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", - "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "node_modules/levn": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", @@ -7210,24 +6609,6 @@ "wrappy": "1" } }, - "node_modules/open": { - "version": "8.4.2", - "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", - "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "define-lazy-prop": "^2.0.0", - "is-docker": "^2.1.1", - "is-wsl": "^2.2.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/optionator": { "version": "0.9.4", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", @@ -7698,20 +7079,6 @@ "node": ">=6" } }, - "node_modules/prompts": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", - "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "kleur": "^3.0.3", - "sisteransi": "^1.0.5" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/prop-types": { "version": "15.8.1", "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", @@ -7780,38 +7147,6 @@ "node": ">=0.10.0" } }, - "node_modules/react-docgen": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/react-docgen/-/react-docgen-8.0.0.tgz", - "integrity": "sha512-kmob/FOTwep7DUWf9KjuenKX0vyvChr3oTdvvPt09V60Iz75FJp+T/0ZeHMbAfJj2WaVWqAPP5Hmm3PYzSPPKg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/core": "^7.18.9", - "@babel/traverse": "^7.18.9", - "@babel/types": "^7.18.9", - "@types/babel__core": "^7.18.0", - "@types/babel__traverse": "^7.18.0", - "@types/doctrine": "^0.0.9", - "@types/resolve": "^1.20.2", - "doctrine": "^3.0.0", - "resolve": "^1.22.1", - "strip-indent": "^4.0.0" - }, - "engines": { - "node": "^20.9.0 || >=22" - } - }, - "node_modules/react-docgen-typescript": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/react-docgen-typescript/-/react-docgen-typescript-2.2.2.tgz", - "integrity": "sha512-tvg2ZtOpOi6QDwsb3GZhOjDkkX0h8Z2gipvTg6OVMUyoYoURhEiRNePT8NZItTVCDh39JJHnLdfCOkzoLbFnTg==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "typescript": ">= 4.3.x" - } - }, "node_modules/react-dom": { "version": "19.1.1", "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.1.1.tgz", @@ -7963,23 +7298,6 @@ "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, - "node_modules/recast": { - "version": "0.23.11", - "resolved": "https://registry.npmjs.org/recast/-/recast-0.23.11.tgz", - "integrity": "sha512-YTUo+Flmw4ZXiWfQKGcwwc11KnoRAYgzAE2E7mXKCjSviTKShtxBsN6YUUBB2gtaBzKzeKunxhUwNHQuRryhWA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ast-types": "^0.16.1", - "esprima": "~4.0.0", - "source-map": "~0.6.1", - "tiny-invariant": "^1.3.3", - "tslib": "^2.0.1" - }, - "engines": { - "node": ">= 4" - } - }, "node_modules/redent": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", @@ -7994,19 +7312,6 @@ "node": ">=8" } }, - "node_modules/redent/node_modules/strip-indent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", - "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "min-indent": "^1.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/reflect.getprototypeof": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", @@ -8091,27 +7396,6 @@ "url": "https://opencollective.com/unified" } }, - "node_modules/resolve": { - "version": "1.22.10", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", - "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-core-module": "^2.16.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/resolve-from": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", @@ -8460,23 +7744,6 @@ "node": ">=18" } }, - "node_modules/sisteransi": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", - "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", - "dev": true, - "license": "MIT" - }, - "node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/source-map-js": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", @@ -8524,54 +7791,6 @@ "node": ">= 0.4" } }, - "node_modules/storybook": { - "version": "9.0.8", - "resolved": "https://registry.npmjs.org/storybook/-/storybook-9.0.8.tgz", - "integrity": "sha512-GlOB3HAtzRYc237+o46nnETNkc2Qckh3UrIJ1rJyAzagIlPWau/jTxjSz76sqRODEnt01m8CyIkw3PGv0q1UpQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@storybook/global": "^5.0.0", - "@testing-library/jest-dom": "^6.6.3", - "@testing-library/user-event": "^14.6.1", - "@vitest/expect": "3.0.9", - "@vitest/spy": "3.0.9", - "better-opn": "^3.0.2", - "esbuild": "^0.18.0 || ^0.19.0 || ^0.20.0 || ^0.21.0 || ^0.22.0 || ^0.23.0 || ^0.24.0 || ^0.25.0", - "esbuild-register": "^3.5.0", - "recast": "^0.23.5", - "semver": "^7.6.2", - "ws": "^8.18.0" - }, - "bin": { - "storybook": "bin/index.cjs" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - }, - "peerDependencies": { - "prettier": "^2 || ^3" - }, - "peerDependenciesMeta": { - "prettier": { - "optional": true - } - } - }, - "node_modules/storybook/node_modules/semver": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", - "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/string-width": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", @@ -8780,30 +7999,17 @@ "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, - "node_modules/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, "node_modules/strip-indent": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-4.0.0.tgz", - "integrity": "sha512-mnVSV2l+Zv6BLpSD/8V87CW/y9EmmbYzGCIavsnsI6/nwn26DwffM/yztm30Z/I2DY9wdS3vXVCMnHDgZaVNoA==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", + "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", "dev": true, "license": "MIT", "dependencies": { - "min-indent": "^1.0.1" + "min-indent": "^1.0.0" }, "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=8" } }, "node_modules/strip-json-comments": { @@ -8953,13 +8159,6 @@ "node": ">=0.12" } }, - "node_modules/tiny-invariant": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.3.tgz", - "integrity": "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==", - "dev": true, - "license": "MIT" - }, "node_modules/tinybench": { "version": "2.9.0", "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", @@ -9011,16 +8210,6 @@ "node": ">=14.0.0" } }, - "node_modules/tinyspy": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-3.0.2.tgz", - "integrity": "sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.0.0" - } - }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -9075,31 +8264,6 @@ "typescript": ">=4.8.4" } }, - "node_modules/ts-dedent": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/ts-dedent/-/ts-dedent-2.2.0.tgz", - "integrity": "sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.10" - } - }, - "node_modules/tsconfig-paths": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz", - "integrity": "sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==", - "dev": true, - "license": "MIT", - "dependencies": { - "json5": "^2.2.2", - "minimist": "^1.2.6", - "strip-bom": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/tslib": { "version": "2.8.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", @@ -9377,30 +8541,6 @@ "url": "https://opencollective.com/unified" } }, - "node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/unplugin": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-1.16.1.tgz", - "integrity": "sha512-4/u/j4FrCKdi17jaxuJA0jClGxB1AvU2hw/IuayPc4ay1XGaJs/rbb4v5WKwAjNifjmXK9PIFyuPiaK8azyR9w==", - "dev": true, - "license": "MIT", - "dependencies": { - "acorn": "^8.14.0", - "webpack-virtual-modules": "^0.6.2" - }, - "engines": { - "node": ">=14.0.0" - } - }, "node_modules/update-browserslist-db": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", @@ -9811,13 +8951,6 @@ "node": ">=14.0.0" } }, - "node_modules/webpack-virtual-modules": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/webpack-virtual-modules/-/webpack-virtual-modules-0.6.2.tgz", - "integrity": "sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==", - "dev": true, - "license": "MIT" - }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", diff --git a/desktop/package.json b/desktop/package.json index 5e5a5bb7..01281e05 100644 --- a/desktop/package.json +++ b/desktop/package.json @@ -11,8 +11,6 @@ "lint:fix": "npx eslint src --fix", "prettier": "npx prettier src --check", "prettier:fix": "npx prettier src --write", - "storybook": "storybook dev -p 6006", - "build-storybook": "storybook build", "generate-ts": "tsx scripts/generate-ts-types.ts" }, "dependencies": { @@ -32,14 +30,11 @@ "wouter": "^3.7.1" }, "devDependencies": { - "@chromatic-com/storybook": "^4.0.0", "@eslint/js": "^9.28.0", - "@storybook/addon-a11y": "^9.0.4", - "@storybook/addon-docs": "^9.0.4", - "@storybook/addon-onboarding": "^9.0.4", - "@storybook/addon-vitest": "^9.0.4", - "@storybook/react-vite": "^9.0.4", "@tauri-apps/cli": "^2", + "@testing-library/jest-dom": "^6.8.0", + "@testing-library/react": "^16.3.0", + "@testing-library/user-event": "^14.6.1", "@types/node": "^20.11.24", "@types/react": "^19.1.0", "@types/react-dom": "^19.1.0", @@ -55,7 +50,6 @@ "postcss-preset-mantine": "^1.17.0", "postcss-simple-vars": "^7.0.1", "prettier": "3.5.3", - "storybook": "^9.0.4", "tsx": "^4.7.1", "typescript": "~5.6.2", "typescript-eslint": "^8.34.0", diff --git a/desktop/src/components/CodeHighlighter/CodeHighlighter.stories.tsx b/desktop/src/components/CodeHighlighter/CodeHighlighter.stories.tsx deleted file mode 100644 index b42ccfea..00000000 --- a/desktop/src/components/CodeHighlighter/CodeHighlighter.stories.tsx +++ /dev/null @@ -1,127 +0,0 @@ -import type { Meta, StoryObj } from "@storybook/react"; -import { CodeHighlighter } from "./CodeHighlighter"; - -const meta: Meta = { - title: "Components/CodeHighlighter", - component: CodeHighlighter, - parameters: { - layout: "centered", - }, - tags: ["autodocs"], - argTypes: { - copyButton: { - control: "boolean", - }, - theme: { - control: "select", - options: ["light", "dark", "auto", "system"], - }, - }, -}; - -export default meta; -type Story = StoryObj; - -export const Basic: Story = { - args: { - children: `#!/bin/bash -echo "Hello, World!" -ls -la`, - copyButton: true, - theme: "light", - }, -}; - -export const ComplexScript: Story = { - args: { - children: `#!/bin/bash -# This is a complex bash script example -set -euo pipefail - -# Configuration -CONFIG_FILE="/etc/app/config.json" -LOG_FILE="/var/log/app.log" -BACKUP_DIR="/backups" - -# Colors for output -RED='\\033[0;31m' -GREEN='\\033[0;32m' -YELLOW='\\033[1;33m' -NC='\\033[0m' # No Color - -# Function to log messages -log() { - echo -e "\${GREEN}[$(date +'%Y-%m-%d %H:%M:%S')]\${NC} $1" | tee -a "\$LOG_FILE" -} - -# Function to handle errors -error() { - echo -e "\${RED}[ERROR]\${NC} $1" >&2 - exit 1 -} - -# Check if running as root -if [[ \$EUID -eq 0 ]]; then - error "This script should not be run as root" -fi - -# Process files -for file in *.txt; do - if [ -f "\$file" ]; then - log "Processing: \$file" - - # Backup original - cp "\$file" "\$BACKUP_DIR/\$(basename \$file).backup" - - # Process the file - if grep -q "important" "\$file"; then - log "Found important content in \$file" - # Add your processing logic here - fi - fi -done - -# Cleanup old backups (older than 30 days) -find "\$BACKUP_DIR" -name "*.backup" -mtime +30 -delete - -log "Script completed successfully"`, - copyButton: true, - theme: "dark", - }, -}; - -export const SimpleCommands: Story = { - args: { - children: `# Simple commands -pwd -whoami -date -echo "Current directory: $(pwd)" -echo "User: $(whoami)" -echo "Date: $(date)"`, - copyButton: true, - theme: "light", - }, -}; - -export const WithoutCopyButton: Story = { - args: { - children: `echo "This code block doesn't have a copy button" -ls -la -cat /etc/hosts`, - copyButton: false, - theme: "dark", - }, -}; - -export const EverforestTheme: Story = { - args: { - children: `#!/bin/bash -# This will use the system theme setting -echo "Using system theme" -echo "Current time: $(date)" -echo "System info: $(uname -a)"`, - copyButton: true, - theme: "everforest", - }, -}; diff --git a/desktop/src/components/MarkdownRenderer/MarkdownRenderer.stories.tsx b/desktop/src/components/MarkdownRenderer/MarkdownRenderer.stories.tsx deleted file mode 100644 index ded89c06..00000000 --- a/desktop/src/components/MarkdownRenderer/MarkdownRenderer.stories.tsx +++ /dev/null @@ -1,63 +0,0 @@ -import type { Meta, StoryObj } from "@storybook/react"; -import { MarkdownRenderer } from "./MarkdownRenderer"; - -const meta = { - title: "Components/MarkdownRenderer", - component: MarkdownRenderer, - parameters: { - layout: "padded", - }, - tags: ["autodocs"], -} satisfies Meta; - -export default meta; -type Story = StoryObj; - -export const Default: Story = { - args: { - children: `# Heading 1 -## Heading 2 -### Heading 3 -#### Heading 4 -##### Heading 5 -###### Heading 6 - -This is a paragraph with **bold text** and *italic text*. - -- List item 1 -- List item 2 -- List item 3 - -1. Numbered item 1 -2. Numbered item 2 -3. Numbered item 3 - -\`\`\`javascript -// Code block -function hello() { - console.log("Hello, world!"); -} -\`\`\` - -[Link to example](https://example.com)`, - }, -}; - -export const SimpleText: Story = { - args: { - children: `This is a simple paragraph with some **bold text** and *italic text*. - -You can also include [links](https://example.com) and \`inline code\`.`, - }, -}; - -export const HeadingsOnly: Story = { - args: { - children: `# Main Title -## Section Title -### Subsection -#### Sub-subsection -##### Small heading -###### Tiny heading`, - }, -}; diff --git a/desktop/src/components/Theme.stories.tsx b/desktop/src/components/Theme.stories.tsx deleted file mode 100644 index faf776ba..00000000 --- a/desktop/src/components/Theme.stories.tsx +++ /dev/null @@ -1,143 +0,0 @@ -import { - ActionIcon, - Box, - Button, - Card, - Group, - Paper, - Stack, - Text, - Title, -} from "@mantine/core"; -import type { Meta, StoryObj } from "@storybook/react"; -import { mantineTheme as theme } from "../theme/mantineTheme"; - -const meta = { - title: "Design System/Theme", - parameters: { - layout: "padded", - }, -} satisfies Meta; - -export default meta; -type Story = StoryObj; - -const ColorSwatch = ({ color, name }: { color: string; name: string }) => ( - - - - {name} - - -); - -export const Colors: Story = { - render: () => ( - - - - Palette Colors - - - {theme.colors?.palette?.map((color, index) => ( - - ))} - - - - - - Dark Colors - - - {theme.colors?.dark?.map((color, index) => ( - - ))} - - - - - - Accent Colors - - - {theme.colors?.accent?.map((color, index) => ( - - ))} - - - - ), -}; - -export const Typography: Story = { - render: () => ( - - Heading 1 - Heading 2 - Heading 3 - Heading 4 - Heading 5 - Heading 6 - Extra Large Text - Large Text - Medium Text - Small Text - Extra Small Text - - ), -}; - -export const Components: Story = { - render: () => ( - - - - Buttons - - - - - - - - - - - - Action Icons - - - - 🔍 - - - ⚙️ - - - 📝 - - - - - - - Cards - - - - This is a card component with the default radius of{" "} - {theme.defaultRadius} - - - - - ), -}; diff --git a/desktop/src/layout/Header/ActionButtons/ActionButtons.stories.tsx b/desktop/src/layout/Header/ActionButtons/ActionButtons.stories.tsx deleted file mode 100644 index 043f84c0..00000000 --- a/desktop/src/layout/Header/ActionButtons/ActionButtons.stories.tsx +++ /dev/null @@ -1,28 +0,0 @@ -import type { Meta, StoryObj } from "@storybook/react"; -import { ActionButtons } from "./ActionButtons"; - -const meta = { - title: "Components/Header/ActionButtons", - component: ActionButtons, - parameters: { - layout: "centered", - }, - tags: ["autodocs"], -} satisfies Meta; - -export default meta; -type Story = StoryObj; - -export const Default: Story = { - args: { - onCreateWorkspace: () => console.log("Create workspace clicked"), - onRefreshWorkspaces: () => console.log("Refresh workspaces clicked"), - }, -}; - -export const Interactive: Story = { - args: { - onCreateWorkspace: () => alert("Create workspace action triggered"), - onRefreshWorkspaces: () => alert("Refresh workspaces action triggered"), - }, -}; diff --git a/desktop/src/layout/Header/Header.stories.tsx b/desktop/src/layout/Header/Header.stories.tsx deleted file mode 100644 index cc5cdb51..00000000 --- a/desktop/src/layout/Header/Header.stories.tsx +++ /dev/null @@ -1,41 +0,0 @@ -import type { Meta, StoryObj } from "@storybook/react"; -import { Header } from "./Header"; -import { AppShell } from "@mantine/core"; - -const meta = { - title: "Components/Header", - component: Header, - parameters: { - layout: "fullscreen", - docs: { - story: { - height: "100px", - }, - }, - }, - decorators: [ - (Story) => ( - - - - ), - ], - tags: ["autodocs"], -} satisfies Meta; - -export default meta; -type Story = StoryObj; - -export const Default: Story = { - args: { - onCreateWorkspace: () => console.log("Create workspace clicked"), - onRefreshWorkspaces: () => console.log("Refresh workspaces clicked"), - }, -}; - -export const Interactive: Story = { - args: { - onCreateWorkspace: () => alert("Create workspace action triggered"), - onRefreshWorkspaces: () => alert("Refresh workspaces action triggered"), - }, -}; diff --git a/desktop/src/layout/Sidebar/ExecutableTree/ExecutableTree.stories.tsx b/desktop/src/layout/Sidebar/ExecutableTree/ExecutableTree.stories.tsx deleted file mode 100644 index 5bb483fb..00000000 --- a/desktop/src/layout/Sidebar/ExecutableTree/ExecutableTree.stories.tsx +++ /dev/null @@ -1,82 +0,0 @@ -import type { Meta, StoryObj } from "@storybook/react"; -import { EnrichedExecutable } from "../../../types/executable"; -import { ExecutableTree } from "./ExecutableTree"; - -const meta = { - title: "Components/Sidebar/ExecutableTree", - component: ExecutableTree, - parameters: { - layout: "centered", - }, - tags: ["autodocs"], -} satisfies Meta; - -export default meta; -type Story = StoryObj; - -const sampleExecutables: EnrichedExecutable[] = [ - { - id: "script", - ref: "run script", - name: "script", - namespace: null, - verb: "run", - workspace: "default", - flowfile: "exec.flow", - fullDescription: "Run a script", - }, - { - id: "deps", - ref: "validate deps", - name: "deps", - namespace: null, - verb: "validate", - workspace: "default", - flowfile: "exec.flow", - fullDescription: "Validate dependencies", - }, - { - id: "devserver", - ref: "exec frontend/devserver", - name: "devserver", - namespace: "frontend", - workspace: "default", - flowfile: "frontend.flow", - verb: "exec", - fullDescription: "Execute a development server", - }, - { - id: "frontend", - ref: "test frontend", - name: "", - namespace: "frontend", - workspace: "default", - flowfile: "frontend.flow", - verb: "test", - fullDescription: "Test a frontend", - }, - { - id: "container", - ref: "build backend/container", - name: "container", - namespace: "backend", - workspace: "default", - flowfile: "backend.flow", - verb: "build", - fullDescription: "Build a container", - }, -]; - -export const Default: Story = { - args: { - visibleExecutables: sampleExecutables, - onSelectExecutable: (ref) => console.log("Selected executable:", ref), - }, -}; - -export const Empty: Story = { - args: { - visibleExecutables: [], - onSelectExecutable: (ref) => console.log("Selected executable:", ref), - }, -}; diff --git a/desktop/src/layout/Sidebar/WorkspaceSelector/WorkspaceSelector.stories.tsx b/desktop/src/layout/Sidebar/WorkspaceSelector/WorkspaceSelector.stories.tsx deleted file mode 100644 index a7ebce05..00000000 --- a/desktop/src/layout/Sidebar/WorkspaceSelector/WorkspaceSelector.stories.tsx +++ /dev/null @@ -1,55 +0,0 @@ -import type { Meta, StoryObj } from "@storybook/react"; -import { useState } from "react"; -import { EnrichedWorkspace } from "../../../types/workspace"; -import { WorkspaceSelector } from "./WorkspaceSelector"; - -const meta: Meta = { - title: "Components/Sidebar/WorkspaceSelector", - component: WorkspaceSelector, - parameters: { - layout: "centered", - }, - tags: ["autodocs"], -}; - -export default meta; -type Story = StoryObj; - -const mockWorkspaces: EnrichedWorkspace[] = [ - { - name: "Dotfiles", - path: "/Users/flow/.dotfiles", - fullDescription: "Dotfiles workspace", - }, - { - name: "Web App", - path: "/Users/flow/WebApp", - fullDescription: "Web App workspace", - }, -]; - -// Example of how to use the component with state management -const WorkspaceSelectorWithState = () => { - const [selected, setSelected] = useState("dotfiles"); - - return ( - - ); -}; - -export const Default: Story = { - render: () => , -}; - -export const NoWorkspaces: Story = { - args: { - workspaces: [], - selectedWorkspace: "", - onSelectWorkspace: (workspace) => - console.log("Selected workspace:", workspace), - }, -}; diff --git a/desktop/vitest.workspace.ts b/desktop/vitest.workspace.ts deleted file mode 100644 index 4b1fcc8d..00000000 --- a/desktop/vitest.workspace.ts +++ /dev/null @@ -1,32 +0,0 @@ -import path from 'node:path'; -import { fileURLToPath } from 'node:url'; - -import { defineWorkspace } from 'vitest/config'; - -import { storybookTest } from '@storybook/addon-vitest/vitest-plugin'; - -const dirname = - typeof __dirname !== 'undefined' ? __dirname : path.dirname(fileURLToPath(import.meta.url)); - -// More info at: https://storybook.js.org/docs/next/writing-tests/integrations/vitest-addon -export default defineWorkspace([ - 'vite.config.ts', - { - extends: 'vite.config.ts', - plugins: [ - // The plugin will run tests for the stories defined in your Storybook config - // See options at: https://storybook.js.org/docs/next/writing-tests/integrations/vitest-addon#storybooktest - storybookTest({ configDir: path.join(dirname, '.storybook') }), - ], - test: { - name: 'storybook', - browser: { - enabled: true, - headless: true, - provider: 'playwright', - instances: [{ browser: 'chromium' }] - }, - setupFiles: ['.storybook/vitest.setup.ts'], - }, - }, -]); From 993782fa654c1050e4eadc46a2c434797c87de85 Mon Sep 17 00:00:00 2001 From: Jahvon Dockery Date: Wed, 17 Sep 2025 15:58:52 -0400 Subject: [PATCH 2/3] feat(desktop): enhanced workspace list and doc pages (#305) This pull request introduces several notable improvements and refactors to the desktop application, focusing on enhancing UI component structure, addition of a workspace list page (replacing the selector), and updating theme and style handling. The most significant changes include the addition of a new Hero component suite, improved dynamic theming for code highlighting, and the introduction of a new React hook for workspace executable counts. There are also several style and configuration updates for better consistency and maintainability. --- desktop/src-tauri/capabilities/default.json | 6 +- desktop/src-tauri/tauri.conf.json | 1 - desktop/src/App.css | 104 ------ desktop/src/App.tsx | 10 +- .../CodeHighlighter/CodeHighlighter.tsx | 20 +- .../src/components/CodeHighlighter/config.ts | 10 +- desktop/src/components/Hero/Hero.module.css | 145 ++++++++ desktop/src/components/Hero/Hero.tsx | 137 +++++++ desktop/src/components/Hero/index.ts | 9 + desktop/src/components/PageWrapper.tsx | 4 +- .../src/hooks/useWorkspaceExecutableCounts.ts | 120 ++++++ .../src/layout/AppShell/AppShell.module.css | 8 +- desktop/src/layout/AppShell/AppShell.tsx | 9 +- .../Header/ActionButtons/ActionButtons.tsx | 33 -- desktop/src/layout/Sidebar/Sidebar.tsx | 25 +- .../WorkspaceSelector/WorkspaceSelector.tsx | 93 ----- desktop/src/pages/Settings/Settings.tsx | 22 +- desktop/src/pages/Workspace/Workspace.tsx | 343 +++++++++++------- .../src/pages/Workspace/WorkspaceRoute.tsx | 31 -- .../pages/Workspaces/Workspaces.module.css | 117 ++++++ desktop/src/pages/Workspaces/Workspaces.tsx | 313 ++++++++++++++++ desktop/src/pages/index.ts | 1 + desktop/src/theme/ThemeProvider.tsx | 8 +- desktop/src/theme/themes.ts | 7 +- desktop/src/theme/types.ts | 1 + desktop/src/utils/colors.ts | 32 ++ desktop/src/utils/paths.ts | 46 +++ 27 files changed, 1200 insertions(+), 455 deletions(-) create mode 100644 desktop/src/components/Hero/Hero.module.css create mode 100644 desktop/src/components/Hero/Hero.tsx create mode 100644 desktop/src/components/Hero/index.ts create mode 100644 desktop/src/hooks/useWorkspaceExecutableCounts.ts delete mode 100644 desktop/src/layout/Header/ActionButtons/ActionButtons.tsx delete mode 100644 desktop/src/layout/Sidebar/WorkspaceSelector/WorkspaceSelector.tsx delete mode 100644 desktop/src/pages/Workspace/WorkspaceRoute.tsx create mode 100644 desktop/src/pages/Workspaces/Workspaces.module.css create mode 100644 desktop/src/pages/Workspaces/Workspaces.tsx create mode 100644 desktop/src/utils/colors.ts create mode 100644 desktop/src/utils/paths.ts diff --git a/desktop/src-tauri/capabilities/default.json b/desktop/src-tauri/capabilities/default.json index bfd29a66..9186b49c 100644 --- a/desktop/src-tauri/capabilities/default.json +++ b/desktop/src-tauri/capabilities/default.json @@ -2,9 +2,7 @@ "$schema": "../gen/schemas/desktop-schema.json", "identifier": "default", "description": "Capability for the main window", - "windows": [ - "main" - ], + "windows": ["main"], "permissions": [ "core:default", "shell:default", @@ -19,4 +17,4 @@ }, "log:default" ] -} \ No newline at end of file +} diff --git a/desktop/src-tauri/tauri.conf.json b/desktop/src-tauri/tauri.conf.json index 3c234045..77ad2d19 100644 --- a/desktop/src-tauri/tauri.conf.json +++ b/desktop/src-tauri/tauri.conf.json @@ -14,7 +14,6 @@ { "title": "flow desktop", "hiddenTitle": true, - "titleBarStyle": "Transparent", "width": 1000, "height": 800 } diff --git a/desktop/src/App.css b/desktop/src/App.css index ffd14dd0..d5aa76ae 100644 --- a/desktop/src/App.css +++ b/desktop/src/App.css @@ -1,19 +1,9 @@ -.logo.vite:hover { - filter: drop-shadow(0 0 2em #747bff); -} - -.logo.react:hover { - filter: drop-shadow(0 0 2em #61dafb); -} :root { font-family: Inter, Avenir, Helvetica, Arial, sans-serif; font-size: 16px; line-height: 24px; font-weight: 400; - color: #0f0f0f; - background-color: #f6f6f6; - font-synthesis: none; text-rendering: optimizeLegibility; -webkit-font-smoothing: antialiased; @@ -40,97 +30,3 @@ body { width: 100vw; overflow: hidden; } - -.container { - margin: 0; - padding-top: 10vh; - display: flex; - flex-direction: column; - justify-content: center; - text-align: center; -} - -.logo { - height: 6em; - padding: 1.5em; - will-change: filter; - transition: 0.75s; -} - -.logo.tauri:hover { - filter: drop-shadow(0 0 2em #24c8db); -} - -.row { - display: flex; - justify-content: center; -} - -a { - font-weight: 500; - color: #646cff; - text-decoration: inherit; -} - -a:hover { - color: #535bf2; -} - -h1 { - text-align: center; -} - -input, -button { - border-radius: 8px; - border: 1px solid transparent; - padding: 0.6em 1.2em; - font-size: 1em; - font-weight: 500; - font-family: inherit; - color: #0f0f0f; - background-color: #ffffff; - transition: border-color 0.25s; - box-shadow: 0 2px 2px rgba(0, 0, 0, 0.2); -} - -button { - cursor: pointer; -} - -button:hover { - border-color: #396cd8; -} -button:active { - border-color: #396cd8; - background-color: #e8e8e8; -} - -input, -button { - outline: none; -} - -#greet-input { - margin-right: 5px; -} - -@media (prefers-color-scheme: dark) { - :root { - color: #f6f6f6; - background-color: #2f2f2f; - } - - a:hover { - color: #24c8db; - } - - input, - button { - color: #ffffff; - background-color: #0f0f0f98; - } - button:active { - background-color: #0f0f0f69; - } -} diff --git a/desktop/src/App.tsx b/desktop/src/App.tsx index 7ec3905d..ae73fd80 100644 --- a/desktop/src/App.tsx +++ b/desktop/src/App.tsx @@ -5,8 +5,8 @@ import { AppProvider } from "./hooks/useAppContext.tsx"; import { NotifierProvider } from "./hooks/useNotifier"; import { AppShell } from "./layout"; import { PageWrapper } from "./components/PageWrapper.tsx"; -import { Settings, Welcome, Data } from "./pages"; -import { WorkspaceRoute } from "./pages/Workspace/WorkspaceRoute.tsx"; +import {Settings, Welcome, Data, Workspaces} from "./pages"; +import { Workspace } from "./pages/Workspace/Workspace.tsx"; import { ExecutableRoute } from "./pages/Executable/ExecutableRoute.tsx"; import { Text } from "@mantine/core"; @@ -31,9 +31,13 @@ function App() { + { + const loadTheme = async () => { + const variant = theme ? themeMapper[theme] ?? "default" : "default"; + if (variant === "dark") { + await import("prismjs/themes/prism-dark.css"); + } else { + await import("prismjs/themes/prism.css"); + } + }; + void loadTheme(); + }, [theme]); + useEffect(() => { if (codeRef.current) { Prism.highlightElement(codeRef.current); @@ -63,7 +74,6 @@ export function CodeHighlighter({ ref={containerRef} pos="relative" style={{ - borderRadius: config.styling.borderRadius, overflow: "hidden", }} > @@ -88,7 +98,7 @@ export function CodeHighlighter({ margin: 0, padding: config.styling.padding, background: config.styling.backgroundColor, - borderRadius: config.styling.borderRadius, + border: "none", overflow: "auto", fontSize: config.styling.fontSize, lineHeight: config.styling.lineHeight, diff --git a/desktop/src/components/CodeHighlighter/config.ts b/desktop/src/components/CodeHighlighter/config.ts index a634e617..08a37905 100644 --- a/desktop/src/components/CodeHighlighter/config.ts +++ b/desktop/src/components/CodeHighlighter/config.ts @@ -4,15 +4,11 @@ import { ThemeName } from "../../theme/types"; export interface CodeHighlighterConfig { - // Whether to show copy button by default defaultCopyButton: boolean; - // Default theme for syntax highlighting defaultTheme: string; - // Custom styling options styling: { - borderRadius: string; padding: string; fontSize: string; lineHeight: string; @@ -41,11 +37,10 @@ export const defaultConfig: CodeHighlighterConfig = { defaultTheme: "default", styling: { - borderRadius: "var(--mantine-radius-sm)", padding: "var(--mantine-spacing-md)", fontSize: "var(--mantine-font-size-sm)", lineHeight: "1.5", - backgroundColor: "var(--mantine-color-dark-7)", + backgroundColor: "var(--mantine-color-gray-7)", copyButtonStyle: { background: "rgba(255, 255, 255, 0.1)", border: "1px solid rgba(255, 255, 255, 0.2)", @@ -62,7 +57,7 @@ export const darkThemeConfig: CodeHighlighterConfig = { defaultTheme: "dark", styling: { ...defaultConfig.styling, - backgroundColor: "var(--mantine-color-dark-8)", + backgroundColor: "var(--mantine-color-appshell-0)", copyButtonStyle: { ...defaultConfig.styling.copyButtonStyle, background: "rgba(255, 255, 255, 0.15)", @@ -101,5 +96,4 @@ export function getConfigForTheme(theme?: ThemeName): CodeHighlighterConfig { } } -// Export the current configuration (you can change this to switch themes) export const currentConfig = defaultConfig; diff --git a/desktop/src/components/Hero/Hero.module.css b/desktop/src/components/Hero/Hero.module.css new file mode 100644 index 00000000..4231a95e --- /dev/null +++ b/desktop/src/components/Hero/Hero.module.css @@ -0,0 +1,145 @@ +.root { + --hero-bg-primary: var(--mantine-color-appshell-0); + --hero-bg-secondary: var(--mantine-color-primary-0); + --hero-text-primary: var(--mantine-color-secondary-0); + --hero-text-secondary: var(--mantine-color-tertiary-0); + --hero-border: var(--mantine-color-border-0); + --hero-pattern-color: var(--mantine-color-emphasis-1); + + position: relative; + color: var(--hero-text-primary); + background: linear-gradient( + 150deg, + var(--hero-bg-primary) 0%, + var(--hero-bg-secondary) 100% + ); + border-bottom: 1px solid var(--hero-border); + overflow: hidden; + margin-bottom: var(--mantine-spacing-lg); +} + +.pattern { + position: absolute; + inset: 0; + opacity: 0.12; + pointer-events: none; +} + +.pattern-subtle { + background: + radial-gradient( + circle at 30% 20%, + var(--hero-pattern-color) 2px, + transparent 2px + ), + radial-gradient( + circle at 70% 80%, + var(--hero-pattern-color) 1.5px, + transparent 1.5px + ); + background-size: + 50px 50px, + 70px 70px; +} + +.pattern-lines { + background-image: + linear-gradient(90deg, var(--hero-pattern-color) 1px, transparent 1px), + linear-gradient(0deg, var(--hero-pattern-color) 1px, transparent 1px); + background-size: 40px 40px; +} + +.variant-center .inner { + text-align: center; +} + +.variant-left .inner { + text-align: left; +} + +.variant-split .inner { + text-align: left; +} + +.variant-split .header { + text-align: left; +} + +.contentContainer { + position: relative; + z-index: 1; +} + +.inner { + width: 100%; + max-width: 80rem; + margin-inline: auto; + padding: 2.5rem 2rem; + min-height: 120px; + display: flex; + align-items: center; +} + +.stackedContent { + width: 100%; +} + +.splitLayout { + width: 100%; + flex-wrap: nowrap; + align-items: center; +} + +.splitContent { + flex: 1; + min-width: 0; +} + +.splitActions { + flex-shrink: 0; + margin-left: auto; + align-self: center; +} + +.header { + margin-bottom: 0.5rem; +} + +.header :global(.mantine-Title-root) { + font-weight: 600; + line-height: 1.2; + margin-bottom: 0.5rem; +} + +.header :global(.mantine-Text-root) { + color: var(--hero-text-secondary); + font-size: var(--mantine-font-size-sm); + line-height: 1.4; +} + +.content { + margin: 1rem 0; +} + +.actions { + align-items: center; + flex-wrap: wrap; +} + +.actions-left { + justify-content: flex-start; +} + +.actions-center { + justify-content: center; +} + +.actions-right { + justify-content: flex-end; +} + +.root :global(.Mantine-Badge-root) { + --badge-bg: var(--mantine-color-gray-1) !important; + --badge-color: var(--mantine-color-gray-8) !important; + --badge-bd: transparent !important; +} diff --git a/desktop/src/components/Hero/Hero.tsx b/desktop/src/components/Hero/Hero.tsx new file mode 100644 index 00000000..e47b182d --- /dev/null +++ b/desktop/src/components/Hero/Hero.tsx @@ -0,0 +1,137 @@ +import { Box, Container, Group, Stack } from "@mantine/core"; +import React from "react"; +import classes from "./Hero.module.css"; + +export type HeroVariant = "center" | "split" | "left"; +export type PatternType = "lines" | "subtle" | "none"; + +export interface HeroProps { + children: React.ReactNode; + variant?: HeroVariant; + pattern?: PatternType; + className?: string; + containerSize?: string | number; +} + +export interface HeroHeaderProps { + children: React.ReactNode; + className?: string; +} + +export interface HeroContentProps { + children: React.ReactNode; + className?: string; +} + +export interface HeroActionsProps { + children: React.ReactNode; + className?: string; + align?: "left" | "center" | "right"; +} + +export function HeroHeader({ children, className }: HeroHeaderProps) { + return ( + {children} + ); +} + +export function HeroContent({ children, className }: HeroContentProps) { + return ( + {children} + ); +} + +export function HeroActions({ + children, + className, + align = "right", +}: HeroActionsProps) { + return ( + + {children} + + ); +} + +export function Hero({ + children, + variant = "center", + pattern = "subtle", + className, + containerSize = "xl", +}: HeroProps) { + const renderPattern = () => { + if (pattern === "none") return null; + return ( +