[playground] Extract shared components (#16819)

## Summary
Extract components that can be shared with the Red Knot playground.

## Test Plan

`npm start`
This commit is contained in:
Micha Reiser 2025-03-18 08:43:47 +01:00 committed by GitHub
parent 433879d852
commit ded9c69888
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
35 changed files with 230 additions and 222 deletions

View file

@ -27,6 +27,8 @@ export default tseslint.config(
}, },
], ],
"@typescript-eslint/no-explicit-any": "off", "@typescript-eslint/no-explicit-any": "off",
// Handled by typescript. It doesn't support shared?
"import/no-unresolved": "off",
}, },
}, },
{ {

View file

@ -8,11 +8,12 @@
"name": "playground", "name": "playground",
"version": "0.0.0", "version": "0.0.0",
"workspaces": [ "workspaces": [
"ruff" "ruff",
"shared"
], ],
"devDependencies": { "devDependencies": {
"@eslint/js": "^9.21.0", "@eslint/js": "^9.21.0",
"@tailwindcss/postcss": "^4.0.9", "@tailwindcss/vite": "^4.0.14",
"@types/react": "^19.0.0", "@types/react": "^19.0.0",
"@types/react-dom": "^19.0.0", "@types/react-dom": "^19.0.0",
"@vitejs/plugin-react-swc": "^3.0.0", "@vitejs/plugin-react-swc": "^3.0.0",
@ -29,19 +30,6 @@
"wasm-pack": "^0.13.1" "wasm-pack": "^0.13.1"
} }
}, },
"node_modules/@alloc/quick-lru": {
"version": "5.2.0",
"resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz",
"integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/@esbuild/aix-ppc64": { "node_modules/@esbuild/aix-ppc64": {
"version": "0.24.2", "version": "0.24.2",
"resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.24.2.tgz", "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.24.2.tgz",
@ -694,27 +682,26 @@
} }
}, },
"node_modules/@monaco-editor/loader": { "node_modules/@monaco-editor/loader": {
"version": "1.4.0", "version": "1.5.0",
"resolved": "https://registry.npmjs.org/@monaco-editor/loader/-/loader-1.4.0.tgz", "resolved": "https://registry.npmjs.org/@monaco-editor/loader/-/loader-1.5.0.tgz",
"integrity": "sha512-00ioBig0x642hytVspPl7DbQyaSWRaolYie/UFNjoTdvoKPzo6xrXLhTk9ixgIKcLH5b5vDOjVNiGyY+uDCUlg==", "integrity": "sha512-hKoGSM+7aAc7eRTRjpqAZucPmoNOC4UUbknb/VNoTkEIkCPhqV8LfbsgM1webRM7S/z21eHEx9Fkwx8Z/C/+Xw==",
"license": "MIT",
"dependencies": { "dependencies": {
"state-local": "^1.0.6" "state-local": "^1.0.6"
},
"peerDependencies": {
"monaco-editor": ">= 0.21.0 < 1"
} }
}, },
"node_modules/@monaco-editor/react": { "node_modules/@monaco-editor/react": {
"version": "4.6.0", "version": "4.7.0",
"resolved": "https://registry.npmjs.org/@monaco-editor/react/-/react-4.6.0.tgz", "resolved": "https://registry.npmjs.org/@monaco-editor/react/-/react-4.7.0.tgz",
"integrity": "sha512-RFkU9/i7cN2bsq/iTkurMWOEErmYcY6JiQI3Jn+WeR/FGISH8JbHERjpS9oRuSOPvDMJI0Z8nJeKkbOs9sBYQw==", "integrity": "sha512-cyzXQCtO47ydzxpQtCGSQGOC8Gk3ZUeBXFAxD+CWXYFo5OqZyZUonFl0DwUlTyAfRHntBfw2p3w4s9R6oe1eCA==",
"license": "MIT",
"dependencies": { "dependencies": {
"@monaco-editor/loader": "^1.4.0" "@monaco-editor/loader": "^1.5.0"
}, },
"peerDependencies": { "peerDependencies": {
"monaco-editor": ">= 0.25.0 < 1", "monaco-editor": ">= 0.25.0 < 1",
"react": "^16.8.0 || ^17.0.0 || ^18.0.0", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0",
"react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0"
} }
}, },
"node_modules/@nodelib/fs.scandir": { "node_modules/@nodelib/fs.scandir": {
@ -1248,55 +1235,61 @@
"@swc/counter": "^0.1.3" "@swc/counter": "^0.1.3"
} }
}, },
"node_modules/@tailwindcss/node": { "node_modules/@tailwindcss/vite": {
"version": "4.0.9", "version": "4.0.14",
"resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.0.9.tgz", "resolved": "https://registry.npmjs.org/@tailwindcss/vite/-/vite-4.0.14.tgz",
"integrity": "sha512-tOJvdI7XfJbARYhxX+0RArAhmuDcczTC46DGCEziqxzzbIaPnfYaIyRT31n4u8lROrsO7Q6u/K9bmQHL2uL1bQ==", "integrity": "sha512-y69ztPTRFy+13EPS/7dEFVl7q2Goh1pQueVO8IfGeyqSpcx/joNJXFk0lLhMgUbF0VFJotwRSb9ZY7Xoq3r26Q==",
"dev": true,
"license": "MIT",
"dependencies": {
"@tailwindcss/node": "4.0.14",
"@tailwindcss/oxide": "4.0.14",
"lightningcss": "1.29.2",
"tailwindcss": "4.0.14"
},
"peerDependencies": {
"vite": "^5.2.0 || ^6"
}
},
"node_modules/@tailwindcss/vite/node_modules/@tailwindcss/node": {
"version": "4.0.14",
"resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.0.14.tgz",
"integrity": "sha512-Ux9NbFkKWYE4rfUFz6M5JFLs/GEYP6ysxT8uSyPn6aTbh2K3xDE1zz++eVK4Vwx799fzMF8CID9sdHn4j/Ab8w==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"enhanced-resolve": "^5.18.1", "enhanced-resolve": "^5.18.1",
"jiti": "^2.4.2", "jiti": "^2.4.2",
"tailwindcss": "4.0.9" "tailwindcss": "4.0.14"
} }
}, },
"node_modules/@tailwindcss/node/node_modules/jiti": { "node_modules/@tailwindcss/vite/node_modules/@tailwindcss/oxide": {
"version": "2.4.2", "version": "4.0.14",
"resolved": "https://registry.npmjs.org/jiti/-/jiti-2.4.2.tgz", "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.0.14.tgz",
"integrity": "sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==", "integrity": "sha512-M8VCNyO/NBi5vJ2cRcI9u8w7Si+i76a7o1vveoGtbbjpEYJZYiyc7f2VGps/DqawO56l3tImIbq2OT/533jcrA==",
"dev": true,
"license": "MIT",
"bin": {
"jiti": "lib/jiti-cli.mjs"
}
},
"node_modules/@tailwindcss/oxide": {
"version": "4.0.9",
"resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.0.9.tgz",
"integrity": "sha512-eLizHmXFqHswJONwfqi/WZjtmWZpIalpvMlNhTM99/bkHtUs6IqgI1XQ0/W5eO2HiRQcIlXUogI2ycvKhVLNcA==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"engines": { "engines": {
"node": ">= 10" "node": ">= 10"
}, },
"optionalDependencies": { "optionalDependencies": {
"@tailwindcss/oxide-android-arm64": "4.0.9", "@tailwindcss/oxide-android-arm64": "4.0.14",
"@tailwindcss/oxide-darwin-arm64": "4.0.9", "@tailwindcss/oxide-darwin-arm64": "4.0.14",
"@tailwindcss/oxide-darwin-x64": "4.0.9", "@tailwindcss/oxide-darwin-x64": "4.0.14",
"@tailwindcss/oxide-freebsd-x64": "4.0.9", "@tailwindcss/oxide-freebsd-x64": "4.0.14",
"@tailwindcss/oxide-linux-arm-gnueabihf": "4.0.9", "@tailwindcss/oxide-linux-arm-gnueabihf": "4.0.14",
"@tailwindcss/oxide-linux-arm64-gnu": "4.0.9", "@tailwindcss/oxide-linux-arm64-gnu": "4.0.14",
"@tailwindcss/oxide-linux-arm64-musl": "4.0.9", "@tailwindcss/oxide-linux-arm64-musl": "4.0.14",
"@tailwindcss/oxide-linux-x64-gnu": "4.0.9", "@tailwindcss/oxide-linux-x64-gnu": "4.0.14",
"@tailwindcss/oxide-linux-x64-musl": "4.0.9", "@tailwindcss/oxide-linux-x64-musl": "4.0.14",
"@tailwindcss/oxide-win32-arm64-msvc": "4.0.9", "@tailwindcss/oxide-win32-arm64-msvc": "4.0.14",
"@tailwindcss/oxide-win32-x64-msvc": "4.0.9" "@tailwindcss/oxide-win32-x64-msvc": "4.0.14"
} }
}, },
"node_modules/@tailwindcss/oxide-android-arm64": { "node_modules/@tailwindcss/vite/node_modules/@tailwindcss/oxide-android-arm64": {
"version": "4.0.9", "version": "4.0.14",
"resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.0.9.tgz", "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.0.14.tgz",
"integrity": "sha512-YBgy6+2flE/8dbtrdotVInhMVIxnHJPbAwa7U1gX4l2ThUIaPUp18LjB9wEH8wAGMBZUb//SzLtdXXNBHPUl6Q==", "integrity": "sha512-VBFKC2rFyfJ5J8lRwjy6ub3rgpY186kAcYgiUr8ArR8BAZzMruyeKJ6mlsD22Zp5ZLcPW/FXMasJiJBx0WsdQg==",
"cpu": [ "cpu": [
"arm64" "arm64"
], ],
@ -1310,10 +1303,10 @@
"node": ">= 10" "node": ">= 10"
} }
}, },
"node_modules/@tailwindcss/oxide-darwin-arm64": { "node_modules/@tailwindcss/vite/node_modules/@tailwindcss/oxide-darwin-arm64": {
"version": "4.0.9", "version": "4.0.14",
"resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.0.9.tgz", "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.0.14.tgz",
"integrity": "sha512-pWdl4J2dIHXALgy2jVkwKBmtEb73kqIfMpYmcgESr7oPQ+lbcQ4+tlPeVXaSAmang+vglAfFpXQCOvs/aGSqlw==", "integrity": "sha512-U3XOwLrefGr2YQZ9DXasDSNWGPZBCh8F62+AExBEDMLDfvLLgI/HDzY8Oq8p/JtqkAY38sWPOaNnRwEGKU5Zmg==",
"cpu": [ "cpu": [
"arm64" "arm64"
], ],
@ -1327,10 +1320,10 @@
"node": ">= 10" "node": ">= 10"
} }
}, },
"node_modules/@tailwindcss/oxide-darwin-x64": { "node_modules/@tailwindcss/vite/node_modules/@tailwindcss/oxide-darwin-x64": {
"version": "4.0.9", "version": "4.0.14",
"resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.0.9.tgz", "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.0.14.tgz",
"integrity": "sha512-4Dq3lKp0/C7vrRSkNPtBGVebEyWt9QPPlQctxJ0H3MDyiQYvzVYf8jKow7h5QkWNe8hbatEqljMj/Y0M+ERYJg==", "integrity": "sha512-V5AjFuc3ndWGnOi1d379UsODb0TzAS2DYIP/lwEbfvafUaD2aNZIcbwJtYu2DQqO2+s/XBvDVA+w4yUyaewRwg==",
"cpu": [ "cpu": [
"x64" "x64"
], ],
@ -1344,10 +1337,10 @@
"node": ">= 10" "node": ">= 10"
} }
}, },
"node_modules/@tailwindcss/oxide-freebsd-x64": { "node_modules/@tailwindcss/vite/node_modules/@tailwindcss/oxide-freebsd-x64": {
"version": "4.0.9", "version": "4.0.14",
"resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.0.9.tgz", "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.0.14.tgz",
"integrity": "sha512-k7U1RwRODta8x0uealtVt3RoWAWqA+D5FAOsvVGpYoI6ObgmnzqWW6pnVwz70tL8UZ/QXjeMyiICXyjzB6OGtQ==", "integrity": "sha512-tXvtxbaZfcPfqBwW3f53lTcyH6EDT+1eT7yabwcfcxTs+8yTPqxsDUhrqe9MrnEzpNkd+R/QAjJapfd4tjWdLg==",
"cpu": [ "cpu": [
"x64" "x64"
], ],
@ -1361,10 +1354,10 @@
"node": ">= 10" "node": ">= 10"
} }
}, },
"node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": { "node_modules/@tailwindcss/vite/node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": {
"version": "4.0.9", "version": "4.0.14",
"resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.0.9.tgz", "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.0.14.tgz",
"integrity": "sha512-NDDjVweHz2zo4j+oS8y3KwKL5wGCZoXGA9ruJM982uVJLdsF8/1AeKvUwKRlMBpxHt1EdWJSAh8a0Mfhl28GlQ==", "integrity": "sha512-cSeLNWWqIWeSTmBntQvyY2/2gcLX8rkPFfDDTQVF8qbRcRMVPLxBvFVJyfSAYRNch6ZyVH2GI6dtgALOBDpdNA==",
"cpu": [ "cpu": [
"arm" "arm"
], ],
@ -1378,10 +1371,10 @@
"node": ">= 10" "node": ">= 10"
} }
}, },
"node_modules/@tailwindcss/oxide-linux-arm64-gnu": { "node_modules/@tailwindcss/vite/node_modules/@tailwindcss/oxide-linux-arm64-gnu": {
"version": "4.0.9", "version": "4.0.14",
"resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.0.9.tgz", "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.0.14.tgz",
"integrity": "sha512-jk90UZ0jzJl3Dy1BhuFfRZ2KP9wVKMXPjmCtY4U6fF2LvrjP5gWFJj5VHzfzHonJexjrGe1lMzgtjriuZkxagg==", "integrity": "sha512-bwDWLBalXFMDItcSXzFk6y7QKvj6oFlaY9vM+agTlwFL1n1OhDHYLZkSjaYsh6KCeG0VB0r7H8PUJVOM1LRZyg==",
"cpu": [ "cpu": [
"arm64" "arm64"
], ],
@ -1395,10 +1388,10 @@
"node": ">= 10" "node": ">= 10"
} }
}, },
"node_modules/@tailwindcss/oxide-linux-arm64-musl": { "node_modules/@tailwindcss/vite/node_modules/@tailwindcss/oxide-linux-arm64-musl": {
"version": "4.0.9", "version": "4.0.14",
"resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.0.9.tgz", "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.0.14.tgz",
"integrity": "sha512-3eMjyTC6HBxh9nRgOHzrc96PYh1/jWOwHZ3Kk0JN0Kl25BJ80Lj9HEvvwVDNTgPg154LdICwuFLuhfgH9DULmg==", "integrity": "sha512-gVkJdnR/L6iIcGYXx64HGJRmlme2FGr/aZH0W6u4A3RgPMAb+6ELRLi+UBiH83RXBm9vwCfkIC/q8T51h8vUJQ==",
"cpu": [ "cpu": [
"arm64" "arm64"
], ],
@ -1412,10 +1405,10 @@
"node": ">= 10" "node": ">= 10"
} }
}, },
"node_modules/@tailwindcss/oxide-linux-x64-gnu": { "node_modules/@tailwindcss/vite/node_modules/@tailwindcss/oxide-linux-x64-gnu": {
"version": "4.0.9", "version": "4.0.14",
"resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.0.9.tgz", "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.0.14.tgz",
"integrity": "sha512-v0D8WqI/c3WpWH1kq/HP0J899ATLdGZmENa2/emmNjubT0sWtEke9W9+wXeEoACuGAhF9i3PO5MeyditpDCiWQ==", "integrity": "sha512-EE+EQ+c6tTpzsg+LGO1uuusjXxYx0Q00JE5ubcIGfsogSKth8n8i2BcS2wYTQe4jXGs+BQs35l78BIPzgwLddw==",
"cpu": [ "cpu": [
"x64" "x64"
], ],
@ -1429,10 +1422,10 @@
"node": ">= 10" "node": ">= 10"
} }
}, },
"node_modules/@tailwindcss/oxide-linux-x64-musl": { "node_modules/@tailwindcss/vite/node_modules/@tailwindcss/oxide-linux-x64-musl": {
"version": "4.0.9", "version": "4.0.14",
"resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.0.9.tgz", "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.0.14.tgz",
"integrity": "sha512-Kvp0TCkfeXyeehqLJr7otsc4hd/BUPfcIGrQiwsTVCfaMfjQZCG7DjI+9/QqPZha8YapLA9UoIcUILRYO7NE1Q==", "integrity": "sha512-KCCOzo+L6XPT0oUp2Jwh233ETRQ/F6cwUnMnR0FvMUCbkDAzHbcyOgpfuAtRa5HD0WbTbH4pVD+S0pn1EhNfbw==",
"cpu": [ "cpu": [
"x64" "x64"
], ],
@ -1446,10 +1439,10 @@
"node": ">= 10" "node": ">= 10"
} }
}, },
"node_modules/@tailwindcss/oxide-win32-arm64-msvc": { "node_modules/@tailwindcss/vite/node_modules/@tailwindcss/oxide-win32-arm64-msvc": {
"version": "4.0.9", "version": "4.0.14",
"resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.0.9.tgz", "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.0.14.tgz",
"integrity": "sha512-m3+60T/7YvWekajNq/eexjhV8z10rswcz4BC9bioJ7YaN+7K8W2AmLmG0B79H14m6UHE571qB0XsPus4n0QVgQ==", "integrity": "sha512-AHObFiFL9lNYcm3tZSPqa/cHGpM5wOrNmM2uOMoKppp+0Hom5uuyRh0QkOp7jftsHZdrZUpmoz0Mp6vhh2XtUg==",
"cpu": [ "cpu": [
"arm64" "arm64"
], ],
@ -1463,10 +1456,10 @@
"node": ">= 10" "node": ">= 10"
} }
}, },
"node_modules/@tailwindcss/oxide-win32-x64-msvc": { "node_modules/@tailwindcss/vite/node_modules/@tailwindcss/oxide-win32-x64-msvc": {
"version": "4.0.9", "version": "4.0.14",
"resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.0.9.tgz", "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.0.14.tgz",
"integrity": "sha512-dpc05mSlqkwVNOUjGu/ZXd5U1XNch1kHFJ4/cHkZFvaW1RzbHmRt24gvM8/HC6IirMxNarzVw4IXVtvrOoZtxA==", "integrity": "sha512-rNXXMDJfCJLw/ZaFTOLOHoGULxyXfh2iXTGiChFiYTSgKBKQHIGEpV0yn5N25WGzJJ+VBnRjHzlmDqRV+d//oQ==",
"cpu": [ "cpu": [
"x64" "x64"
], ],
@ -1480,20 +1473,12 @@
"node": ">= 10" "node": ">= 10"
} }
}, },
"node_modules/@tailwindcss/postcss": { "node_modules/@tailwindcss/vite/node_modules/tailwindcss": {
"version": "4.0.9", "version": "4.0.14",
"resolved": "https://registry.npmjs.org/@tailwindcss/postcss/-/postcss-4.0.9.tgz", "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.0.14.tgz",
"integrity": "sha512-BT/E+pdMqulavEAVM5NCpxmGEwHiLDPpkmg/c/X25ZBW+izTe+aZ+v1gf/HXTrihRoCxrUp5U4YyHsBTzspQKQ==", "integrity": "sha512-92YT2dpt671tFiHH/e1ok9D987N9fHD5VWoly1CdPD/Cd1HMglvZwP3nx2yTj2lbXDAHt8QssZkxTLCCTNL+xw==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT"
"dependencies": {
"@alloc/quick-lru": "^5.2.0",
"@tailwindcss/node": "4.0.9",
"@tailwindcss/oxide": "4.0.9",
"lightningcss": "^1.29.1",
"postcss": "^8.4.41",
"tailwindcss": "4.0.9"
}
}, },
"node_modules/@types/estree": { "node_modules/@types/estree": {
"version": "1.0.6", "version": "1.0.6",
@ -2266,16 +2251,13 @@
} }
}, },
"node_modules/detect-libc": { "node_modules/detect-libc": {
"version": "1.0.3", "version": "2.0.3",
"resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz",
"integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==", "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==",
"dev": true, "dev": true,
"license": "Apache-2.0", "license": "Apache-2.0",
"bin": {
"detect-libc": "bin/detect-libc.js"
},
"engines": { "engines": {
"node": ">=0.10" "node": ">=8"
} }
}, },
"node_modules/dunder-proto": { "node_modules/dunder-proto": {
@ -3905,14 +3887,13 @@
} }
}, },
"node_modules/jiti": { "node_modules/jiti": {
"version": "1.21.6", "version": "2.4.2",
"resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.6.tgz", "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.4.2.tgz",
"integrity": "sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w==", "integrity": "sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==",
"dev": true, "dev": true,
"optional": true, "license": "MIT",
"peer": true,
"bin": { "bin": {
"jiti": "bin/jiti.js" "jiti": "lib/jiti-cli.mjs"
} }
}, },
"node_modules/js-tokens": { "node_modules/js-tokens": {
@ -4005,13 +3986,13 @@
} }
}, },
"node_modules/lightningcss": { "node_modules/lightningcss": {
"version": "1.29.1", "version": "1.29.2",
"resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.29.1.tgz", "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.29.2.tgz",
"integrity": "sha512-FmGoeD4S05ewj+AkhTY+D+myDvXI6eL27FjHIjoyUkO/uw7WZD1fBVs0QxeYWa7E17CUHJaYX/RUGISCtcrG4Q==", "integrity": "sha512-6b6gd/RUXKaw5keVdSEtqFVdzWnU5jMxTUjA2bVcMNPLwSQ08Sv/UodBVtETLCn7k4S1Ibxwh7k68IwLZPgKaA==",
"dev": true, "dev": true,
"license": "MPL-2.0", "license": "MPL-2.0",
"dependencies": { "dependencies": {
"detect-libc": "^1.0.3" "detect-libc": "^2.0.3"
}, },
"engines": { "engines": {
"node": ">= 12.0.0" "node": ">= 12.0.0"
@ -4021,22 +4002,22 @@
"url": "https://opencollective.com/parcel" "url": "https://opencollective.com/parcel"
}, },
"optionalDependencies": { "optionalDependencies": {
"lightningcss-darwin-arm64": "1.29.1", "lightningcss-darwin-arm64": "1.29.2",
"lightningcss-darwin-x64": "1.29.1", "lightningcss-darwin-x64": "1.29.2",
"lightningcss-freebsd-x64": "1.29.1", "lightningcss-freebsd-x64": "1.29.2",
"lightningcss-linux-arm-gnueabihf": "1.29.1", "lightningcss-linux-arm-gnueabihf": "1.29.2",
"lightningcss-linux-arm64-gnu": "1.29.1", "lightningcss-linux-arm64-gnu": "1.29.2",
"lightningcss-linux-arm64-musl": "1.29.1", "lightningcss-linux-arm64-musl": "1.29.2",
"lightningcss-linux-x64-gnu": "1.29.1", "lightningcss-linux-x64-gnu": "1.29.2",
"lightningcss-linux-x64-musl": "1.29.1", "lightningcss-linux-x64-musl": "1.29.2",
"lightningcss-win32-arm64-msvc": "1.29.1", "lightningcss-win32-arm64-msvc": "1.29.2",
"lightningcss-win32-x64-msvc": "1.29.1" "lightningcss-win32-x64-msvc": "1.29.2"
} }
}, },
"node_modules/lightningcss-darwin-arm64": { "node_modules/lightningcss-darwin-arm64": {
"version": "1.29.1", "version": "1.29.2",
"resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.29.1.tgz", "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.29.2.tgz",
"integrity": "sha512-HtR5XJ5A0lvCqYAoSv2QdZZyoHNttBpa5EP9aNuzBQeKGfbyH5+UipLWvVzpP4Uml5ej4BYs5I9Lco9u1fECqw==", "integrity": "sha512-cK/eMabSViKn/PG8U/a7aCorpeKLMlK0bQeNHmdb7qUnBkNPnL+oV5DjJUo0kqWsJUapZsM4jCfYItbqBDvlcA==",
"cpu": [ "cpu": [
"arm64" "arm64"
], ],
@ -4055,9 +4036,9 @@
} }
}, },
"node_modules/lightningcss-darwin-x64": { "node_modules/lightningcss-darwin-x64": {
"version": "1.29.1", "version": "1.29.2",
"resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.29.1.tgz", "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.29.2.tgz",
"integrity": "sha512-k33G9IzKUpHy/J/3+9MCO4e+PzaFblsgBjSGlpAaFikeBFm8B/CkO3cKU9oI4g+fjS2KlkLM/Bza9K/aw8wsNA==", "integrity": "sha512-j5qYxamyQw4kDXX5hnnCKMf3mLlHvG44f24Qyi2965/Ycz829MYqjrVg2H8BidybHBp9kom4D7DR5VqCKDXS0w==",
"cpu": [ "cpu": [
"x64" "x64"
], ],
@ -4076,9 +4057,9 @@
} }
}, },
"node_modules/lightningcss-freebsd-x64": { "node_modules/lightningcss-freebsd-x64": {
"version": "1.29.1", "version": "1.29.2",
"resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.29.1.tgz", "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.29.2.tgz",
"integrity": "sha512-0SUW22fv/8kln2LnIdOCmSuXnxgxVC276W5KLTwoehiO0hxkacBxjHOL5EtHD8BAXg2BvuhsJPmVMasvby3LiQ==", "integrity": "sha512-wDk7M2tM78Ii8ek9YjnY8MjV5f5JN2qNVO+/0BAGZRvXKtQrBC4/cn4ssQIpKIPP44YXw6gFdpUF+Ps+RGsCwg==",
"cpu": [ "cpu": [
"x64" "x64"
], ],
@ -4097,9 +4078,9 @@
} }
}, },
"node_modules/lightningcss-linux-arm-gnueabihf": { "node_modules/lightningcss-linux-arm-gnueabihf": {
"version": "1.29.1", "version": "1.29.2",
"resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.29.1.tgz", "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.29.2.tgz",
"integrity": "sha512-sD32pFvlR0kDlqsOZmYqH/68SqUMPNj+0pucGxToXZi4XZgZmqeX/NkxNKCPsswAXU3UeYgDSpGhu05eAufjDg==", "integrity": "sha512-IRUrOrAF2Z+KExdExe3Rz7NSTuuJ2HvCGlMKoquK5pjvo2JY4Rybr+NrKnq0U0hZnx5AnGsuFHjGnNT14w26sg==",
"cpu": [ "cpu": [
"arm" "arm"
], ],
@ -4118,9 +4099,9 @@
} }
}, },
"node_modules/lightningcss-linux-arm64-gnu": { "node_modules/lightningcss-linux-arm64-gnu": {
"version": "1.29.1", "version": "1.29.2",
"resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.29.1.tgz", "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.29.2.tgz",
"integrity": "sha512-0+vClRIZ6mmJl/dxGuRsE197o1HDEeeRk6nzycSy2GofC2JsY4ifCRnvUWf/CUBQmlrvMzt6SMQNMSEu22csWQ==", "integrity": "sha512-KKCpOlmhdjvUTX/mBuaKemp0oeDIBBLFiU5Fnqxh1/DZ4JPZi4evEH7TKoSBFOSOV3J7iEmmBaw/8dpiUvRKlQ==",
"cpu": [ "cpu": [
"arm64" "arm64"
], ],
@ -4139,9 +4120,9 @@
} }
}, },
"node_modules/lightningcss-linux-arm64-musl": { "node_modules/lightningcss-linux-arm64-musl": {
"version": "1.29.1", "version": "1.29.2",
"resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.29.1.tgz", "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.29.2.tgz",
"integrity": "sha512-UKMFrG4rL/uHNgelBsDwJcBqVpzNJbzsKkbI3Ja5fg00sgQnHw/VrzUTEc4jhZ+AN2BvQYz/tkHu4vt1kLuJyw==", "integrity": "sha512-Q64eM1bPlOOUgxFmoPUefqzY1yV3ctFPE6d/Vt7WzLW4rKTv7MyYNky+FWxRpLkNASTnKQUaiMJ87zNODIrrKQ==",
"cpu": [ "cpu": [
"arm64" "arm64"
], ],
@ -4160,9 +4141,9 @@
} }
}, },
"node_modules/lightningcss-linux-x64-gnu": { "node_modules/lightningcss-linux-x64-gnu": {
"version": "1.29.1", "version": "1.29.2",
"resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.29.1.tgz", "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.29.2.tgz",
"integrity": "sha512-u1S+xdODy/eEtjADqirA774y3jLcm8RPtYztwReEXoZKdzgsHYPl0s5V52Tst+GKzqjebkULT86XMSxejzfISw==", "integrity": "sha512-0v6idDCPG6epLXtBH/RPkHvYx74CVziHo6TMYga8O2EiQApnUPZsbR9nFNrg2cgBzk1AYqEd95TlrsL7nYABQg==",
"cpu": [ "cpu": [
"x64" "x64"
], ],
@ -4181,9 +4162,9 @@
} }
}, },
"node_modules/lightningcss-linux-x64-musl": { "node_modules/lightningcss-linux-x64-musl": {
"version": "1.29.1", "version": "1.29.2",
"resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.29.1.tgz", "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.29.2.tgz",
"integrity": "sha512-L0Tx0DtaNUTzXv0lbGCLB/c/qEADanHbu4QdcNOXLIe1i8i22rZRpbT3gpWYsCh9aSL9zFujY/WmEXIatWvXbw==", "integrity": "sha512-rMpz2yawkgGT8RULc5S4WiZopVMOFWjiItBT7aSfDX4NQav6M44rhn5hjtkKzB+wMTRlLLqxkeYEtQ3dd9696w==",
"cpu": [ "cpu": [
"x64" "x64"
], ],
@ -4202,9 +4183,9 @@
} }
}, },
"node_modules/lightningcss-win32-arm64-msvc": { "node_modules/lightningcss-win32-arm64-msvc": {
"version": "1.29.1", "version": "1.29.2",
"resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.29.1.tgz", "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.29.2.tgz",
"integrity": "sha512-QoOVnkIEFfbW4xPi+dpdft/zAKmgLgsRHfJalEPYuJDOWf7cLQzYg0DEh8/sn737FaeMJxHZRc1oBreiwZCjog==", "integrity": "sha512-nL7zRW6evGQqYVu/bKGK+zShyz8OVzsCotFgc7judbt6wnB2KbiKKJwBE4SGoDBQ1O94RjW4asrCjQL4i8Fhbw==",
"cpu": [ "cpu": [
"arm64" "arm64"
], ],
@ -4223,9 +4204,9 @@
} }
}, },
"node_modules/lightningcss-win32-x64-msvc": { "node_modules/lightningcss-win32-x64-msvc": {
"version": "1.29.1", "version": "1.29.2",
"resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.29.1.tgz", "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.29.2.tgz",
"integrity": "sha512-NygcbThNBe4JElP+olyTI/doBNGJvLs3bFCRPdvuCcxZCcCZ71B858IHpdm7L1btZex0FvCmM17FK98Y9MRy1Q==", "integrity": "sha512-EdIUW3B2vLuHmv7urfzMI/h2fmlnOQBk1xlsDxkN1tCWKjNFjfLhGxYk8C8mzpSfr+A6jFFIi8fU6LbQGsRWjA==",
"cpu": [ "cpu": [
"x64" "x64"
], ],
@ -4818,6 +4799,7 @@
"version": "2.1.7", "version": "2.1.7",
"resolved": "https://registry.npmjs.org/react-resizable-panels/-/react-resizable-panels-2.1.7.tgz", "resolved": "https://registry.npmjs.org/react-resizable-panels/-/react-resizable-panels-2.1.7.tgz",
"integrity": "sha512-JtT6gI+nURzhMYQYsx8DKkx6bSoOGFp7A3CwMrOb8y5jFHFyqwo9m68UhmXRw57fRVJksFn1TSlm3ywEQ9vMgA==", "integrity": "sha512-JtT6gI+nURzhMYQYsx8DKkx6bSoOGFp7A3CwMrOb8y5jFHFyqwo9m68UhmXRw57fRVJksFn1TSlm3ywEQ9vMgA==",
"license": "MIT",
"peerDependencies": { "peerDependencies": {
"react": "^16.14.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc", "react": "^16.14.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc",
"react-dom": "^16.14.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" "react-dom": "^16.14.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc"
@ -5093,6 +5075,10 @@
"node": ">= 0.4" "node": ">= 0.4"
} }
}, },
"node_modules/shared": {
"resolved": "shared",
"link": true
},
"node_modules/shebang-command": { "node_modules/shebang-command": {
"version": "2.0.0", "version": "2.0.0",
"resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
@ -5213,7 +5199,8 @@
"node_modules/state-local": { "node_modules/state-local": {
"version": "1.0.7", "version": "1.0.7",
"resolved": "https://registry.npmjs.org/state-local/-/state-local-1.0.7.tgz", "resolved": "https://registry.npmjs.org/state-local/-/state-local-1.0.7.tgz",
"integrity": "sha512-HTEHMNieakEnoe33shBYcZ7NX83ACUjCu8c40iOGEZsngj9zRnkqS9j1pqQPXwobB0ZcVTk27REb7COQ0UR59w==" "integrity": "sha512-HTEHMNieakEnoe33shBYcZ7NX83ACUjCu8c40iOGEZsngj9zRnkqS9j1pqQPXwobB0ZcVTk27REb7COQ0UR59w==",
"license": "MIT"
}, },
"node_modules/string.prototype.matchall": { "node_modules/string.prototype.matchall": {
"version": "4.0.12", "version": "4.0.12",
@ -5834,6 +5821,7 @@
"react-dom": "^19.0.0", "react-dom": "^19.0.0",
"react-resizable-panels": "^2.0.0", "react-resizable-panels": "^2.0.0",
"ruff_wasm": "file:./ruff_wasm", "ruff_wasm": "file:./ruff_wasm",
"shared": "0.0.0",
"smol-toml": "^1.3.0" "smol-toml": "^1.3.0"
} }
}, },
@ -5851,6 +5839,15 @@
}, },
"ruff/ruff-wasm": { "ruff/ruff-wasm": {
"extraneous": true "extraneous": true
},
"shared": {
"version": "0.0.0",
"dependencies": {
"@monaco-editor/react": "^4.7.0",
"classnames": "^2.3.2",
"react": "^19.0.0",
"react-resizable-panels": "^2.1.7"
}
} }
} }
} }

View file

@ -11,14 +11,15 @@
"tsc": "tsc" "tsc": "tsc"
}, },
"workspaces": [ "workspaces": [
"ruff" "ruff",
"shared"
], ],
"prettier": { "prettier": {
"trailingComma": "all" "trailingComma": "all"
}, },
"devDependencies": { "devDependencies": {
"@eslint/js": "^9.21.0", "@eslint/js": "^9.21.0",
"@tailwindcss/postcss": "^4.0.9", "@tailwindcss/vite": "^4.0.14",
"@types/react": "^19.0.0", "@types/react": "^19.0.0",
"@types/react-dom": "^19.0.0", "@types/react-dom": "^19.0.0",
"@vitejs/plugin-react-swc": "^3.0.0", "@vitejs/plugin-react-swc": "^3.0.0",

View file

@ -23,6 +23,7 @@
"react-dom": "^19.0.0", "react-dom": "^19.0.0",
"react-resizable-panels": "^2.0.0", "react-resizable-panels": "^2.0.0",
"ruff_wasm": "file:./ruff_wasm", "ruff_wasm": "file:./ruff_wasm",
"shared": "0.0.0",
"smol-toml": "^1.3.0" "smol-toml": "^1.3.0"
}, },
"overrides": { "overrides": {

View file

@ -1,5 +0,0 @@
module.exports = {
plugins: {
"@tailwindcss/postcss": {},
},
};

View file

Before

Width:  |  Height:  |  Size: 563 KiB

After

Width:  |  Height:  |  Size: 563 KiB

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 4.8 KiB

After

Width:  |  Height:  |  Size: 4.8 KiB

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 1.2 KiB

After

Width:  |  Height:  |  Size: 1.2 KiB

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 2 KiB

After

Width:  |  Height:  |  Size: 2 KiB

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 2.3 KiB

After

Width:  |  Height:  |  Size: 2.3 KiB

Before After
Before After

View file

@ -1,11 +1,9 @@
import { useCallback, useMemo, useRef, useState } from "react"; import { useCallback, useMemo, useRef, useState } from "react";
import Header from "./Header"; import { Header, useTheme, setupMonaco } from "shared";
import { persist, persistLocal, restore, stringify } from "./settings"; import { persist, persistLocal, restore, stringify } from "./settings";
import { useTheme } from "./theme";
import { default as Editor, Source } from "./Editor"; import { default as Editor, Source } from "./Editor";
import initRuff, { Workspace } from "ruff_wasm"; import initRuff, { Workspace } from "ruff_wasm";
import { loader } from "@monaco-editor/react"; import { loader } from "@monaco-editor/react";
import { setupMonaco } from "./setupMonaco";
import { DEFAULT_PYTHON_SOURCE } from "../constants"; import { DEFAULT_PYTHON_SOURCE } from "../constants";
export default function Chrome() { export default function Chrome() {

View file

@ -1,6 +1,6 @@
import { Diagnostic } from "ruff_wasm"; import { Diagnostic } from "ruff_wasm";
import classNames from "classnames"; import classNames from "classnames";
import { Theme } from "./theme"; import { Theme } from "shared";
import { useMemo } from "react"; import { useMemo } from "react";
interface Props { interface Props {

View file

@ -7,9 +7,13 @@ import {
} from "react"; } from "react";
import { Panel, PanelGroup } from "react-resizable-panels"; import { Panel, PanelGroup } from "react-resizable-panels";
import { Diagnostic, Workspace } from "ruff_wasm"; import { Diagnostic, Workspace } from "ruff_wasm";
import { ErrorMessage } from "./ErrorMessage"; import {
ErrorMessage,
Theme,
HorizontalResizeHandle,
VerticalResizeHandle,
} from "shared";
import PrimarySideBar from "./PrimarySideBar"; import PrimarySideBar from "./PrimarySideBar";
import { HorizontalResizeHandle, VerticalResizeHandle } from "./ResizeHandle";
import SecondaryPanel, { import SecondaryPanel, {
SecondaryPanelResult, SecondaryPanelResult,
SecondaryTool, SecondaryTool,
@ -17,7 +21,6 @@ import SecondaryPanel, {
import SecondarySideBar from "./SecondarySideBar"; import SecondarySideBar from "./SecondarySideBar";
import SettingsEditor from "./SettingsEditor"; import SettingsEditor from "./SettingsEditor";
import SourceEditor from "./SourceEditor"; import SourceEditor from "./SourceEditor";
import { Theme } from "./theme";
import Diagnostics from "./Diagnostics"; import Diagnostics from "./Diagnostics";
import { editor } from "monaco-editor"; import { editor } from "monaco-editor";
import IStandaloneCodeEditor = editor.IStandaloneCodeEditor; import IStandaloneCodeEditor = editor.IStandaloneCodeEditor;

View file

@ -1,4 +1,4 @@
import { FileIcon, SettingsIcon } from "./Icons"; import { Icons } from "shared";
import SideBar, { SideBarEntry } from "./SideBar"; import SideBar, { SideBarEntry } from "./SideBar";
type Tool = "Settings" | "Source"; type Tool = "Settings" | "Source";
@ -20,7 +20,7 @@ export default function PrimarySideBar({
onClick={() => onSelectTool("Source")} onClick={() => onSelectTool("Source")}
selected={selected === "Source"} selected={selected === "Source"}
> >
<FileIcon /> <Icons.File />
</SideBarEntry> </SideBarEntry>
<SideBarEntry <SideBarEntry
@ -29,7 +29,7 @@ export default function PrimarySideBar({
onClick={() => onSelectTool("Settings")} onClick={() => onSelectTool("Settings")}
selected={selected === "Settings"} selected={selected === "Settings"}
> >
<SettingsIcon /> <Icons.Settings />
</SideBarEntry> </SideBarEntry>
</SideBar> </SideBar>
); );

View file

@ -1,4 +1,4 @@
import { Theme } from "./theme"; import { Theme } from "shared";
import { useCallback, useEffect, useState } from "react"; import { useCallback, useEffect, useState } from "react";
import { editor, Range } from "monaco-editor"; import { editor, Range } from "monaco-editor";
import IStandaloneCodeEditor = editor.IStandaloneCodeEditor; import IStandaloneCodeEditor = editor.IStandaloneCodeEditor;

View file

@ -1,11 +1,5 @@
import SideBar, { SideBarEntry } from "./SideBar"; import SideBar, { SideBarEntry } from "./SideBar";
import { import { Icons } from "shared";
FormatIcon,
FormatterIRIcon,
StructureIcon,
TokensIcon,
CommentsIcon,
} from "./Icons";
import { SecondaryTool } from "./SecondaryPanel"; import { SecondaryTool } from "./SecondaryPanel";
interface RightSideBarProps { interface RightSideBarProps {
@ -25,7 +19,7 @@ export default function SecondarySideBar({
selected={selected === SecondaryTool.Format} selected={selected === SecondaryTool.Format}
onClick={() => onSelected(SecondaryTool.Format)} onClick={() => onSelected(SecondaryTool.Format)}
> >
<FormatIcon /> <Icons.Format />
</SideBarEntry> </SideBarEntry>
<SideBarEntry <SideBarEntry
@ -34,7 +28,7 @@ export default function SecondarySideBar({
selected={selected === SecondaryTool.AST} selected={selected === SecondaryTool.AST}
onClick={() => onSelected(SecondaryTool.AST)} onClick={() => onSelected(SecondaryTool.AST)}
> >
<StructureIcon /> <Icons.Structure />
</SideBarEntry> </SideBarEntry>
<SideBarEntry <SideBarEntry
@ -43,7 +37,7 @@ export default function SecondarySideBar({
selected={selected === SecondaryTool.Tokens} selected={selected === SecondaryTool.Tokens}
onClick={() => onSelected(SecondaryTool.Tokens)} onClick={() => onSelected(SecondaryTool.Tokens)}
> >
<TokensIcon /> <Icons.Token />
</SideBarEntry> </SideBarEntry>
<SideBarEntry <SideBarEntry
@ -52,7 +46,7 @@ export default function SecondarySideBar({
selected={selected === SecondaryTool.FIR} selected={selected === SecondaryTool.FIR}
onClick={() => onSelected(SecondaryTool.FIR)} onClick={() => onSelected(SecondaryTool.FIR)}
> >
<FormatterIRIcon /> <Icons.FormatterIR />
</SideBarEntry> </SideBarEntry>
<SideBarEntry <SideBarEntry
@ -61,7 +55,7 @@ export default function SecondarySideBar({
selected={selected === SecondaryTool.Comments} selected={selected === SecondaryTool.Comments}
onClick={() => onSelected(SecondaryTool.Comments)} onClick={() => onSelected(SecondaryTool.Comments)}
> >
<CommentsIcon /> <Icons.Comments />
</SideBarEntry> </SideBarEntry>
</SideBar> </SideBar>
); );

View file

@ -3,7 +3,7 @@
*/ */
import { useCallback } from "react"; import { useCallback } from "react";
import { Theme } from "./theme"; import { Theme } from "shared";
import MonacoEditor from "@monaco-editor/react"; import MonacoEditor from "@monaco-editor/react";
import { editor } from "monaco-editor"; import { editor } from "monaco-editor";
import IStandaloneCodeEditor = editor.IStandaloneCodeEditor; import IStandaloneCodeEditor = editor.IStandaloneCodeEditor;

View file

@ -13,7 +13,7 @@ import {
} from "monaco-editor"; } from "monaco-editor";
import { useCallback, useEffect, useRef } from "react"; import { useCallback, useEffect, useRef } from "react";
import { Diagnostic } from "ruff_wasm"; import { Diagnostic } from "ruff_wasm";
import { Theme } from "./theme"; import { Theme } from "shared";
import CodeActionProvider = languages.CodeActionProvider; import CodeActionProvider = languages.CodeActionProvider;
import IStandaloneCodeEditor = editor.IStandaloneCodeEditor; import IStandaloneCodeEditor = editor.IStandaloneCodeEditor;

View file

@ -1,7 +0,0 @@
export async function copyTextToClipboard(text: string) {
if ("clipboard" in navigator) {
return await navigator.clipboard.writeText(text);
} else {
return document.execCommand("copy", true, text);
}
}

View file

@ -1,4 +1,5 @@
@import "tailwindcss"; @import "tailwindcss";
@source "../../shared/";
@custom-variant dark (&:is(.dark *)); @custom-variant dark (&:is(.dark *));

View file

@ -1,7 +1,8 @@
import { defineConfig } from "vite"; import { defineConfig } from "vite";
import tailwindcss from "@tailwindcss/vite";
import react from "@vitejs/plugin-react-swc"; import react from "@vitejs/plugin-react-swc";
// https://vitejs.dev/config/ // https://vitejs.dev/config/
export default defineConfig({ export default defineConfig({
plugins: [react()], plugins: [react(), tailwindcss()],
}); });

View file

@ -0,0 +1,13 @@
{
"name": "shared",
"private": true,
"version": "0.0.0",
"type": "module",
"dependencies": {
"@monaco-editor/react": "^4.7.0",
"classnames": "^2.3.2",
"react": "^19.0.0",
"react-resizable-panels": "^2.1.7"
},
"exports": "./src/index.ts"
}

View file

@ -23,7 +23,7 @@
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE // SOFTWARE
export function FileIcon() { export function File() {
return ( return (
<svg <svg
width="24" width="24"
@ -40,7 +40,7 @@ export function FileIcon() {
); );
} }
export function SettingsIcon() { export function Settings() {
return ( return (
<svg <svg
width="24" width="24"
@ -57,7 +57,7 @@ export function SettingsIcon() {
); );
} }
export function StructureIcon() { export function Structure() {
return ( return (
<svg <svg
width="24" width="24"
@ -74,7 +74,7 @@ export function StructureIcon() {
); );
} }
export function FormatIcon() { export function Format() {
return ( return (
<svg <svg
width="24" width="24"
@ -91,7 +91,7 @@ export function FormatIcon() {
); );
} }
export function TokensIcon() { export function Token() {
return ( return (
<svg <svg
width="24" width="24"
@ -108,7 +108,7 @@ export function TokensIcon() {
); );
} }
export function FormatterIRIcon() { export function FormatterIR() {
return ( return (
<svg <svg
width="24" width="24"
@ -124,7 +124,7 @@ export function FormatterIRIcon() {
</svg> </svg>
); );
} }
export function CommentsIcon() { export function Comments() {
return ( return (
<svg <svg
viewBox="0 0 24 24" viewBox="0 0 24 24"

View file

@ -0,0 +1,9 @@
export { default as AstralButton } from "./AstralButton";
export { ErrorMessage } from "./ErrorMessage";
export { default as Header } from "./Header";
export { default as RepoButton } from "./RepoButton";
export * as Icons from "./Icons";
export { default as ShareButton } from "./ShareButton";
export { type Theme, useTheme } from "./theme";
export { HorizontalResizeHandle, VerticalResizeHandle } from "./ResizeHandle";
export { setupMonaco } from "./setupMonaco";

View file

@ -3,7 +3,7 @@
*/ */
import { Monaco } from "@monaco-editor/react"; import { Monaco } from "@monaco-editor/react";
import schema from "../../../../ruff.schema.json"; import schema from "../../../ruff.schema.json";
export const WHITE = "#ffffff"; export const WHITE = "#ffffff";
export const RADIATE = "#d7ff64"; export const RADIATE = "#d7ff64";

View file

@ -9,8 +9,8 @@
"allowSyntheticDefaultImports": true, "allowSyntheticDefaultImports": true,
"strict": true, "strict": true,
"forceConsistentCasingInFileNames": true, "forceConsistentCasingInFileNames": true,
"module": "ESNext", "module": "esnext",
"moduleResolution": "Node", "moduleResolution": "bundler",
"resolveJsonModule": true, "resolveJsonModule": true,
"isolatedModules": true, "isolatedModules": true,
"noEmit": true, "noEmit": true,