From 0acba3c15c43166feb2b9ebcfc7efa8c1a60b1c1 Mon Sep 17 00:00:00 2001 From: Khalid Elshafie Date: Thu, 22 May 2025 14:32:42 +1000 Subject: [PATCH 1/9] feat: use tailwindcss for styling Update the project to use Tailwind CSS for styling instead of bootstrap. --- config/webpack.common.js | 1 + package-lock.json | 855 ++++++++++++++++++++++++++- package.json | 7 + postcss.config.mjs | 5 + public/index.html | 40 +- src/components/App/App.tsx | 56 +- src/components/Layout/ActionBar.tsx | 132 +++++ src/components/Layout/RootLayout.tsx | 84 +++ src/components/Layout/Title.tsx | 7 + src/components/Layout/index.tsx | 1 + src/components/Spinner/Spinner.tsx | 28 + src/components/Spinner/index.tsx | 1 + src/context/AppContext.tsx | 1 + src/context/Reducer.spec.ts | 1 + src/context/Reducer.ts | 24 +- src/context/types.d.ts | 28 +- src/helpers/global.ts | 3 + src/index.tsx | 6 +- src/styles/App.css | 147 +---- 19 files changed, 1192 insertions(+), 235 deletions(-) create mode 100644 postcss.config.mjs create mode 100644 src/components/Layout/ActionBar.tsx create mode 100644 src/components/Layout/RootLayout.tsx create mode 100644 src/components/Layout/Title.tsx create mode 100644 src/components/Layout/index.tsx create mode 100644 src/components/Spinner/Spinner.tsx create mode 100644 src/components/Spinner/index.tsx diff --git a/config/webpack.common.js b/config/webpack.common.js index 07066bc..bf27df6 100644 --- a/config/webpack.common.js +++ b/config/webpack.common.js @@ -30,6 +30,7 @@ module.exports = { }, }, 'css-loader', + 'postcss-loader', ], }, { diff --git a/package-lock.json b/package-lock.json index eb4d5c3..52f40bc 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,6 +9,8 @@ "version": "4.0.0", "license": "MIT", "dependencies": { + "@headlessui/react": "^2.2.2", + "@heroicons/react": "^2.2.0", "@testing-library/jest-dom": "^6.6.3", "@uiw/react-json-view": "^2.0.0-alpha.30", "axios": "^1.7.9", @@ -24,6 +26,7 @@ "react": "^19.0.0", "react-dom": "^19.0.0", "react-redux": "^9.2.0", + "react-split": "^2.0.14", "redux": "^5.0.1", "redux-thunk": "^3.1.0", "typescript": "^5.7.2", @@ -32,6 +35,7 @@ "devDependencies": { "@eslint/js": "^9.16.0", "@semantic-release/git": "^10.0.1", + "@tailwindcss/postcss": "^4.1.5", "@testing-library/react": "^16.1.0", "@testing-library/user-event": "^14.5.2", "@types/jest": "^29.5.14", @@ -55,8 +59,11 @@ "jest-environment-jsdom": "^29.7.0", "lint-staged": "^15.2.11", "mini-css-extract-plugin": "^2.9.2", + "postcss": "^8.5.3", + "postcss-loader": "^8.1.1", "prettier": "^3.4.2", "semantic-release": "^24.2.0", + "tailwindcss": "^4.1.5", "ts-jest": "^29.2.5", "ts-loader": "^9.5.1", "typescript-eslint": "^8.18.0", @@ -71,6 +78,18 @@ "resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.4.0.tgz", "integrity": "sha512-Ff9+ksdQQB3rMncgqDK78uLznstjyfIf2Arnh22pW8kBpLs6rpKDwgnZT46hin5Hl1WzazzK64DOrhSwYpS7bQ==" }, + "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, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/@ampproject/remapping": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", @@ -806,6 +825,81 @@ "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, + "node_modules/@floating-ui/core": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.7.0.tgz", + "integrity": "sha512-FRdBLykrPPA6P76GGGqlex/e7fbe0F1ykgxHYNXQsH/iTEtjMj/f9bpY5oQqbjt5VgZvgz/uKXbGuROijh3VLA==", + "dependencies": { + "@floating-ui/utils": "^0.2.9" + } + }, + "node_modules/@floating-ui/dom": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.7.0.tgz", + "integrity": "sha512-lGTor4VlXcesUMh1cupTUTDoCxMb0V6bm3CnxHzQcw8Eaf1jQbgQX4i02fYgT0vJ82tb5MZ4CZk1LRGkktJCzg==", + "dependencies": { + "@floating-ui/core": "^1.7.0", + "@floating-ui/utils": "^0.2.9" + } + }, + "node_modules/@floating-ui/react": { + "version": "0.26.28", + "resolved": "https://registry.npmjs.org/@floating-ui/react/-/react-0.26.28.tgz", + "integrity": "sha512-yORQuuAtVpiRjpMhdc0wJj06b9JFjrYF4qp96j++v2NBpbi6SEGF7donUJ3TMieerQ6qVkAv1tgr7L4r5roTqw==", + "dependencies": { + "@floating-ui/react-dom": "^2.1.2", + "@floating-ui/utils": "^0.2.8", + "tabbable": "^6.0.0" + }, + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, + "node_modules/@floating-ui/react-dom": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.2.tgz", + "integrity": "sha512-06okr5cgPzMNBy+Ycse2A6udMi4bqwW/zgBF/rwjcNqWkyr82Mcg8b0vjX8OJpZFy/FKjJmw6wV7t44kK6kW7A==", + "dependencies": { + "@floating-ui/dom": "^1.0.0" + }, + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, + "node_modules/@floating-ui/utils": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.9.tgz", + "integrity": "sha512-MDWhGtE+eHw5JW7lq4qhc5yRLS11ERl1c7Z6Xd0a58DozHES6EnNNwUWbMiG4J9Cgj053Bhk8zvlhFYKVhULwg==" + }, + "node_modules/@headlessui/react": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/@headlessui/react/-/react-2.2.2.tgz", + "integrity": "sha512-zbniWOYBQ8GHSUIOPY7BbdIn6PzUOq0z41RFrF30HbjsxG6Rrfk+6QulR8Kgf2Vwj2a/rE6i62q5vo+2gI5dJA==", + "dependencies": { + "@floating-ui/react": "^0.26.16", + "@react-aria/focus": "^3.17.1", + "@react-aria/interactions": "^3.21.3", + "@tanstack/react-virtual": "^3.13.6", + "use-sync-external-store": "^1.5.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "react": "^18 || ^19 || ^19.0.0-rc", + "react-dom": "^18 || ^19 || ^19.0.0-rc" + } + }, + "node_modules/@heroicons/react": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@heroicons/react/-/react-2.2.0.tgz", + "integrity": "sha512-LMcepvRaS9LYHJGsF0zzmgKCUim/X3N/DQKc4jepAXJ7l8QxJ1PmxJzqplF2Z3FE4PqBAIGyJAQ/w4B5dsqbtQ==", + "peerDependencies": { + "react": ">= 16 || ^19.0.0-rc" + } + }, "node_modules/@humanfs/core": { "version": "0.19.1", "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", @@ -1609,6 +1703,96 @@ "node": ">=12" } }, + "node_modules/@react-aria/focus": { + "version": "3.20.2", + "resolved": "https://registry.npmjs.org/@react-aria/focus/-/focus-3.20.2.tgz", + "integrity": "sha512-Q3rouk/rzoF/3TuH6FzoAIKrl+kzZi9LHmr8S5EqLAOyP9TXIKG34x2j42dZsAhrw7TbF9gA8tBKwnCNH4ZV+Q==", + "dependencies": { + "@react-aria/interactions": "^3.25.0", + "@react-aria/utils": "^3.28.2", + "@react-types/shared": "^3.29.0", + "@swc/helpers": "^0.5.0", + "clsx": "^2.0.0" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", + "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" + } + }, + "node_modules/@react-aria/interactions": { + "version": "3.25.0", + "resolved": "https://registry.npmjs.org/@react-aria/interactions/-/interactions-3.25.0.tgz", + "integrity": "sha512-GgIsDLlO8rDU/nFn6DfsbP9rfnzhm8QFjZkB9K9+r+MTSCn7bMntiWQgMM+5O6BiA8d7C7x4zuN4bZtc0RBdXQ==", + "dependencies": { + "@react-aria/ssr": "^3.9.8", + "@react-aria/utils": "^3.28.2", + "@react-stately/flags": "^3.1.1", + "@react-types/shared": "^3.29.0", + "@swc/helpers": "^0.5.0" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", + "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" + } + }, + "node_modules/@react-aria/ssr": { + "version": "3.9.8", + "resolved": "https://registry.npmjs.org/@react-aria/ssr/-/ssr-3.9.8.tgz", + "integrity": "sha512-lQDE/c9uTfBSDOjaZUJS8xP2jCKVk4zjQeIlCH90xaLhHDgbpCdns3xvFpJJujfj3nI4Ll9K7A+ONUBDCASOuw==", + "dependencies": { + "@swc/helpers": "^0.5.0" + }, + "engines": { + "node": ">= 12" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" + } + }, + "node_modules/@react-aria/utils": { + "version": "3.28.2", + "resolved": "https://registry.npmjs.org/@react-aria/utils/-/utils-3.28.2.tgz", + "integrity": "sha512-J8CcLbvnQgiBn54eeEvQQbIOfBF3A1QizxMw9P4cl9MkeR03ug7RnjTIdJY/n2p7t59kLeAB3tqiczhcj+Oi5w==", + "dependencies": { + "@react-aria/ssr": "^3.9.8", + "@react-stately/flags": "^3.1.1", + "@react-stately/utils": "^3.10.6", + "@react-types/shared": "^3.29.0", + "@swc/helpers": "^0.5.0", + "clsx": "^2.0.0" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", + "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" + } + }, + "node_modules/@react-stately/flags": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@react-stately/flags/-/flags-3.1.1.tgz", + "integrity": "sha512-XPR5gi5LfrPdhxZzdIlJDz/B5cBf63l4q6/AzNqVWFKgd0QqY5LvWJftXkklaIUpKSJkIKQb8dphuZXDtkWNqg==", + "dependencies": { + "@swc/helpers": "^0.5.0" + } + }, + "node_modules/@react-stately/utils": { + "version": "3.10.6", + "resolved": "https://registry.npmjs.org/@react-stately/utils/-/utils-3.10.6.tgz", + "integrity": "sha512-O76ip4InfTTzAJrg8OaZxKU4vvjMDOpfA/PGNOytiXwBbkct2ZeZwaimJ8Bt9W1bj5VsZ81/o/tW4BacbdDOMA==", + "dependencies": { + "@swc/helpers": "^0.5.0" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" + } + }, + "node_modules/@react-types/shared": { + "version": "3.29.0", + "resolved": "https://registry.npmjs.org/@react-types/shared/-/shared-3.29.0.tgz", + "integrity": "sha512-IDQYu/AHgZimObzCFdNl1LpZvQW/xcfLt3v20sorl5qRucDVj4S9os98sVTZ4IRIBjmS+MkjqpR5E70xan7ooA==", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" + } + }, "node_modules/@sec-ant/readable-stream": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/@sec-ant/readable-stream/-/readable-stream-0.4.1.tgz", @@ -2168,6 +2352,292 @@ "@sinonjs/commons": "^3.0.0" } }, + "node_modules/@swc/helpers": { + "version": "0.5.17", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.17.tgz", + "integrity": "sha512-5IKx/Y13RsYd+sauPb2x+U/xZikHjolzfuDgTAl/Tdf3Q8rslRvC19NKDLgAJQ6wsqADk10ntlv08nPFw/gO/A==", + "dependencies": { + "tslib": "^2.8.0" + } + }, + "node_modules/@tailwindcss/node": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.1.5.tgz", + "integrity": "sha512-CBhSWo0vLnWhXIvpD0qsPephiaUYfHUX3U9anwDaHZAeuGpTiB3XmsxPAN6qX7bFhipyGBqOa1QYQVVhkOUGxg==", + "dev": true, + "dependencies": { + "enhanced-resolve": "^5.18.1", + "jiti": "^2.4.2", + "lightningcss": "1.29.2", + "tailwindcss": "4.1.5" + } + }, + "node_modules/@tailwindcss/oxide": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.1.5.tgz", + "integrity": "sha512-1n4br1znquEvyW/QuqMKQZlBen+jxAbvyduU87RS8R3tUSvByAkcaMTkJepNIrTlYhD+U25K4iiCIxE6BGdRYA==", + "dev": true, + "engines": { + "node": ">= 10" + }, + "optionalDependencies": { + "@tailwindcss/oxide-android-arm64": "4.1.5", + "@tailwindcss/oxide-darwin-arm64": "4.1.5", + "@tailwindcss/oxide-darwin-x64": "4.1.5", + "@tailwindcss/oxide-freebsd-x64": "4.1.5", + "@tailwindcss/oxide-linux-arm-gnueabihf": "4.1.5", + "@tailwindcss/oxide-linux-arm64-gnu": "4.1.5", + "@tailwindcss/oxide-linux-arm64-musl": "4.1.5", + "@tailwindcss/oxide-linux-x64-gnu": "4.1.5", + "@tailwindcss/oxide-linux-x64-musl": "4.1.5", + "@tailwindcss/oxide-wasm32-wasi": "4.1.5", + "@tailwindcss/oxide-win32-arm64-msvc": "4.1.5", + "@tailwindcss/oxide-win32-x64-msvc": "4.1.5" + } + }, + "node_modules/@tailwindcss/oxide-android-arm64": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.1.5.tgz", + "integrity": "sha512-LVvM0GirXHED02j7hSECm8l9GGJ1RfgpWCW+DRn5TvSaxVsv28gRtoL4aWKGnXqwvI3zu1GABeDNDVZeDPOQrw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-darwin-arm64": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.1.5.tgz", + "integrity": "sha512-//TfCA3pNrgnw4rRJOqavW7XUk8gsg9ddi8cwcsWXp99tzdBAZW0WXrD8wDyNbqjW316Pk2hiN/NJx/KWHl8oA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-darwin-x64": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.1.5.tgz", + "integrity": "sha512-XQorp3Q6/WzRd9OalgHgaqgEbjP3qjHrlSUb5k1EuS1Z9NE9+BbzSORraO+ecW432cbCN7RVGGL/lSnHxcd+7Q==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-freebsd-x64": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.1.5.tgz", + "integrity": "sha512-bPrLWbxo8gAo97ZmrCbOdtlz/Dkuy8NK97aFbVpkJ2nJ2Jo/rsCbu0TlGx8joCuA3q6vMWTSn01JY46iwG+clg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.1.5.tgz", + "integrity": "sha512-1gtQJY9JzMAhgAfvd/ZaVOjh/Ju/nCoAsvOVJenWZfs05wb8zq+GOTnZALWGqKIYEtyNpCzvMk+ocGpxwdvaVg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-gnu": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.1.5.tgz", + "integrity": "sha512-dtlaHU2v7MtdxBXoqhxwsWjav7oim7Whc6S9wq/i/uUMTWAzq/gijq1InSgn2yTnh43kR+SFvcSyEF0GCNu1PQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-musl": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.1.5.tgz", + "integrity": "sha512-fg0F6nAeYcJ3CriqDT1iVrqALMwD37+sLzXs8Rjy8Z1ZHshJoYceodfyUwGJEsQoTyWbliFNRs2wMQNXtT7MVA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-gnu": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.1.5.tgz", + "integrity": "sha512-SO+F2YEIAHa1AITwc8oPwMOWhgorPzzcbhWEb+4oLi953h45FklDmM8dPSZ7hNHpIk9p/SCZKUYn35t5fjGtHA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-musl": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.1.5.tgz", + "integrity": "sha512-6UbBBplywkk/R+PqqioskUeXfKcBht3KU7juTi1UszJLx0KPXUo10v2Ok04iBJIaDPkIFkUOVboXms5Yxvaz+g==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.1.5.tgz", + "integrity": "sha512-hwALf2K9FHuiXTPqmo1KeOb83fTRNbe9r/Ixv9ZNQ/R24yw8Ge1HOWDDgTdtzntIaIUJG5dfXCf4g9AD4RiyhQ==", + "bundleDependencies": [ + "@napi-rs/wasm-runtime", + "@emnapi/core", + "@emnapi/runtime", + "@tybys/wasm-util", + "@emnapi/wasi-threads", + "tslib" + ], + "cpu": [ + "wasm32" + ], + "dev": true, + "optional": true, + "dependencies": { + "@emnapi/core": "^1.4.3", + "@emnapi/runtime": "^1.4.3", + "@emnapi/wasi-threads": "^1.0.2", + "@napi-rs/wasm-runtime": "^0.2.9", + "@tybys/wasm-util": "^0.9.0", + "tslib": "^2.8.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@tailwindcss/oxide-win32-arm64-msvc": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.1.5.tgz", + "integrity": "sha512-oDKncffWzaovJbkuR7/OTNFRJQVdiw/n8HnzaCItrNQUeQgjy7oUiYpsm9HUBgpmvmDpSSbGaCa2Evzvk3eFmA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-win32-x64-msvc": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.1.5.tgz", + "integrity": "sha512-WiR4dtyrFdbb+ov0LK+7XsFOsG+0xs0PKZKkt41KDn9jYpO7baE3bXiudPVkTqUEwNfiglCygQHl2jklvSBi7Q==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/postcss": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@tailwindcss/postcss/-/postcss-4.1.5.tgz", + "integrity": "sha512-5lAC2/pzuyfhsFgk6I58HcNy6vPK3dV/PoPxSDuOTVbDvCddYHzHiJZZInGIY0venvzzfrTEUAXJFULAfFmObg==", + "dev": true, + "dependencies": { + "@alloc/quick-lru": "^5.2.0", + "@tailwindcss/node": "4.1.5", + "@tailwindcss/oxide": "4.1.5", + "postcss": "^8.4.41", + "tailwindcss": "4.1.5" + } + }, + "node_modules/@tanstack/react-virtual": { + "version": "3.13.8", + "resolved": "https://registry.npmjs.org/@tanstack/react-virtual/-/react-virtual-3.13.8.tgz", + "integrity": "sha512-meS2AanUg50f3FBSNoAdBSRAh8uS0ue01qm7zrw65KGJtiXB9QXfybqZwkh4uFpRv2iX/eu5tjcH5wqUpwYLPg==", + "dependencies": { + "@tanstack/virtual-core": "3.13.8" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + }, + "peerDependencies": { + "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" + } + }, + "node_modules/@tanstack/virtual-core": { + "version": "3.13.8", + "resolved": "https://registry.npmjs.org/@tanstack/virtual-core/-/virtual-core-3.13.8.tgz", + "integrity": "sha512-BT6w89Hqy7YKaWewYzmecXQzcJh6HTBbKYJIIkMaNU49DZ06LoTV3z32DWWEdUsgW6n1xTmwTLs4GtWrZC261w==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + } + }, "node_modules/@testing-library/dom": { "version": "10.4.0", "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-10.4.0.tgz", @@ -4368,6 +4838,14 @@ "node": ">=6" } }, + "node_modules/clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "engines": { + "node": ">=6" + } + }, "node_modules/co": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", @@ -5078,6 +5556,15 @@ "npm": "1.2.8000 || >= 1.4.16" } }, + "node_modules/detect-libc": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.4.tgz", + "integrity": "sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/detect-newline": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", @@ -5331,9 +5818,9 @@ } }, "node_modules/enhanced-resolve": { - "version": "5.17.1", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz", - "integrity": "sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==", + "version": "5.18.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.1.tgz", + "integrity": "sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg==", "dependencies": { "graceful-fs": "^4.2.4", "tapable": "^2.2.0" @@ -8997,6 +9484,15 @@ "url": "https://github.com/chalk/supports-color?sponsor=1" } }, + "node_modules/jiti": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.4.2.tgz", + "integrity": "sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==", + "devOptional": true, + "bin": { + "jiti": "lib/jiti-cli.mjs" + } + }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -9189,6 +9685,234 @@ "node": ">= 0.8.0" } }, + "node_modules/lightningcss": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.29.2.tgz", + "integrity": "sha512-6b6gd/RUXKaw5keVdSEtqFVdzWnU5jMxTUjA2bVcMNPLwSQ08Sv/UodBVtETLCn7k4S1Ibxwh7k68IwLZPgKaA==", + "dev": true, + "dependencies": { + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-darwin-arm64": "1.29.2", + "lightningcss-darwin-x64": "1.29.2", + "lightningcss-freebsd-x64": "1.29.2", + "lightningcss-linux-arm-gnueabihf": "1.29.2", + "lightningcss-linux-arm64-gnu": "1.29.2", + "lightningcss-linux-arm64-musl": "1.29.2", + "lightningcss-linux-x64-gnu": "1.29.2", + "lightningcss-linux-x64-musl": "1.29.2", + "lightningcss-win32-arm64-msvc": "1.29.2", + "lightningcss-win32-x64-msvc": "1.29.2" + } + }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.29.2.tgz", + "integrity": "sha512-cK/eMabSViKn/PG8U/a7aCorpeKLMlK0bQeNHmdb7qUnBkNPnL+oV5DjJUo0kqWsJUapZsM4jCfYItbqBDvlcA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-x64": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.29.2.tgz", + "integrity": "sha512-j5qYxamyQw4kDXX5hnnCKMf3mLlHvG44f24Qyi2965/Ycz829MYqjrVg2H8BidybHBp9kom4D7DR5VqCKDXS0w==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-freebsd-x64": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.29.2.tgz", + "integrity": "sha512-wDk7M2tM78Ii8ek9YjnY8MjV5f5JN2qNVO+/0BAGZRvXKtQrBC4/cn4ssQIpKIPP44YXw6gFdpUF+Ps+RGsCwg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.29.2.tgz", + "integrity": "sha512-IRUrOrAF2Z+KExdExe3Rz7NSTuuJ2HvCGlMKoquK5pjvo2JY4Rybr+NrKnq0U0hZnx5AnGsuFHjGnNT14w26sg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.29.2.tgz", + "integrity": "sha512-KKCpOlmhdjvUTX/mBuaKemp0oeDIBBLFiU5Fnqxh1/DZ4JPZi4evEH7TKoSBFOSOV3J7iEmmBaw/8dpiUvRKlQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.29.2.tgz", + "integrity": "sha512-Q64eM1bPlOOUgxFmoPUefqzY1yV3ctFPE6d/Vt7WzLW4rKTv7MyYNky+FWxRpLkNASTnKQUaiMJ87zNODIrrKQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.29.2.tgz", + "integrity": "sha512-0v6idDCPG6epLXtBH/RPkHvYx74CVziHo6TMYga8O2EiQApnUPZsbR9nFNrg2cgBzk1AYqEd95TlrsL7nYABQg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.29.2.tgz", + "integrity": "sha512-rMpz2yawkgGT8RULc5S4WiZopVMOFWjiItBT7aSfDX4NQav6M44rhn5hjtkKzB+wMTRlLLqxkeYEtQ3dd9696w==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.29.2.tgz", + "integrity": "sha512-nL7zRW6evGQqYVu/bKGK+zShyz8OVzsCotFgc7judbt6wnB2KbiKKJwBE4SGoDBQ1O94RjW4asrCjQL4i8Fhbw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.29.2.tgz", + "integrity": "sha512-EdIUW3B2vLuHmv7urfzMI/h2fmlnOQBk1xlsDxkN1tCWKjNFjfLhGxYk8C8mzpSfr+A6jFFIi8fU6LbQGsRWjA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, "node_modules/lilconfig": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", @@ -13407,9 +14131,9 @@ } }, "node_modules/postcss": { - "version": "8.4.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.39.tgz", - "integrity": "sha512-0vzE+lAiG7hZl1/9I8yzKLx3aR9Xbof3fBHKunvMfOCYAtMhrsnccJY2iTURb9EZd5+pLuiNV9/c/GZJOHsgIw==", + "version": "8.5.3", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.3.tgz", + "integrity": "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==", "dev": true, "funding": [ { @@ -13426,14 +14150,80 @@ } ], "dependencies": { - "nanoid": "^3.3.7", - "picocolors": "^1.0.1", - "source-map-js": "^1.2.0" + "nanoid": "^3.3.8", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" }, "engines": { "node": "^10 || ^12 || >=14" } }, + "node_modules/postcss-loader": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-8.1.1.tgz", + "integrity": "sha512-0IeqyAsG6tYiDRCYKQJLAmgQr47DX6N7sFSWvQxt6AcupX8DIdmykuk/o/tx0Lze3ErGHJEp5OSRxrelC6+NdQ==", + "dev": true, + "dependencies": { + "cosmiconfig": "^9.0.0", + "jiti": "^1.20.0", + "semver": "^7.5.4" + }, + "engines": { + "node": ">= 18.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "@rspack/core": "0.x || 1.x", + "postcss": "^7.0.0 || ^8.0.1", + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true + }, + "webpack": { + "optional": true + } + } + }, + "node_modules/postcss-loader/node_modules/cosmiconfig": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz", + "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==", + "dev": true, + "dependencies": { + "env-paths": "^2.2.1", + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/postcss-loader/node_modules/jiti": { + "version": "1.21.7", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.7.tgz", + "integrity": "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==", + "dev": true, + "bin": { + "jiti": "bin/jiti.js" + } + }, "node_modules/postcss-modules-extract-imports": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.1.0.tgz", @@ -13838,6 +14628,18 @@ } } }, + "node_modules/react-split": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/react-split/-/react-split-2.0.14.tgz", + "integrity": "sha512-bKWydgMgaKTg/2JGQnaJPg51T6dmumTWZppFgEbbY0Fbme0F5TuatAScCLaqommbGQQf/ZT1zaejuPDriscISA==", + "dependencies": { + "prop-types": "^15.5.7", + "split.js": "^1.6.0" + }, + "peerDependencies": { + "react": "*" + } + }, "node_modules/read-package-up": { "version": "11.0.0", "resolved": "https://registry.npmjs.org/read-package-up/-/read-package-up-11.0.0.tgz", @@ -15120,9 +15922,9 @@ } }, "node_modules/source-map-js": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", - "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", "dev": true, "engines": { "node": ">=0.10.0" @@ -15220,6 +16022,11 @@ "node": ">= 6" } }, + "node_modules/split.js": { + "version": "1.6.5", + "resolved": "https://registry.npmjs.org/split.js/-/split.js-1.6.5.tgz", + "integrity": "sha512-mPTnGCiS/RiuTNsVhCm9De9cCAUsrNFFviRbADdKiiV+Kk8HKp/0fWu7Kr8pi3/yBmsqLFHuXGT9UUZ+CNLwFw==" + }, "node_modules/split2": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/split2/-/split2-1.0.0.tgz", @@ -15571,6 +16378,17 @@ "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", "dev": true }, + "node_modules/tabbable": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-6.2.0.tgz", + "integrity": "sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==" + }, + "node_modules/tailwindcss": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.5.tgz", + "integrity": "sha512-nYtSPfWGDiWgCkwQG/m+aX83XCwf62sBgg3bIlNiiOcggnS1x3uVRDAuyelBFL+vJdOPPCGElxv9DjHJjRHiVA==", + "dev": true + }, "node_modules/tapable": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", @@ -16007,10 +16825,9 @@ } }, "node_modules/tslib": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", - "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==", - "dev": true + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==" }, "node_modules/type-check": { "version": "0.4.0", @@ -16297,9 +17114,9 @@ } }, "node_modules/use-sync-external-store": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.4.0.tgz", - "integrity": "sha512-9WXSPC5fMv61vaupRkCKCxsPxBocVnwakBEkMIHHpkTTg6icbJtg6jzgtLDm4bl3cSHAca52rYWih0k4K3PfHw==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.5.0.tgz", + "integrity": "sha512-Rb46I4cGGVBmjamjphe8L/UnvJD+uPPtTkNvX5mZgqdbavhI4EbgIWJiIHXJ8bc/i9EQGPRh4DwEURJ552Do0A==", "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } diff --git a/package.json b/package.json index cd70d4b..fdacca4 100644 --- a/package.json +++ b/package.json @@ -41,6 +41,8 @@ ] }, "dependencies": { + "@headlessui/react": "^2.2.2", + "@heroicons/react": "^2.2.0", "@testing-library/jest-dom": "^6.6.3", "@uiw/react-json-view": "^2.0.0-alpha.30", "axios": "^1.7.9", @@ -56,6 +58,7 @@ "react": "^19.0.0", "react-dom": "^19.0.0", "react-redux": "^9.2.0", + "react-split": "^2.0.14", "redux": "^5.0.1", "redux-thunk": "^3.1.0", "typescript": "^5.7.2", @@ -64,6 +67,7 @@ "devDependencies": { "@eslint/js": "^9.16.0", "@semantic-release/git": "^10.0.1", + "@tailwindcss/postcss": "^4.1.5", "@testing-library/react": "^16.1.0", "@testing-library/user-event": "^14.5.2", "@types/jest": "^29.5.14", @@ -87,8 +91,11 @@ "jest-environment-jsdom": "^29.7.0", "lint-staged": "^15.2.11", "mini-css-extract-plugin": "^2.9.2", + "postcss": "^8.5.3", + "postcss-loader": "^8.1.1", "prettier": "^3.4.2", "semantic-release": "^24.2.0", + "tailwindcss": "^4.1.5", "ts-jest": "^29.2.5", "ts-loader": "^9.5.1", "typescript-eslint": "^8.18.0", diff --git a/postcss.config.mjs b/postcss.config.mjs new file mode 100644 index 0000000..a34a3d5 --- /dev/null +++ b/postcss.config.mjs @@ -0,0 +1,5 @@ +export default { + plugins: { + '@tailwindcss/postcss': {}, + }, +}; diff --git a/public/index.html b/public/index.html index 6e48e5e..6fc5106 100644 --- a/public/index.html +++ b/public/index.html @@ -1,31 +1,18 @@ - - + + + - - - - - - + + JS Playground | A.B.O.L.K.O.G - - Fork me on GitHub - +
diff --git a/src/components/App/App.tsx b/src/components/App/App.tsx index 07147a4..a9cc178 100644 --- a/src/components/App/App.tsx +++ b/src/components/App/App.tsx @@ -1,17 +1,12 @@ -import { useContext, useEffect, useState } from 'react'; -import Header from 'components/Header'; -import About from 'components/About'; +import Split from 'react-split'; +import Editor from '../CodeEditor/CodeEditor'; +import Console from 'components/Console'; +import { useContext, useEffect } from 'react'; import { AppContext } from 'context/AppContext'; import { AppActions } from 'context/Reducer'; -import ContextMenu from 'components/ContextMenu'; -import JsonView from 'components/JsonView'; -import CodeEditor from 'components/CodeEditor'; -import Console from 'components/Console'; -import HistoryModal from 'components/HistoryModal'; const App: React.FC = () => { const { dispatch } = useContext(AppContext); - const [position, setPosition] = useState(null); useEffect(() => { const consoleProxy = console.log; @@ -21,40 +16,25 @@ const App: React.FC = () => { }; }, []); - const handleContextMenu = (event: React.MouseEvent) => { - event.preventDefault(); - const { pageX, pageY } = event; - setPosition({ top: pageY, left: pageX }); - }; - return ( -
-
- -
-
- +
+ +
+
-
+
-
- - - - - - setPosition(null)} - onClick={() => { - dispatch({ type: AppActions.TOGGLE_JSON_VIEW, payload: 'block' }); - setPosition(null); - }} - /> - - +
); }; diff --git a/src/components/Layout/ActionBar.tsx b/src/components/Layout/ActionBar.tsx new file mode 100644 index 0000000..e11f6de --- /dev/null +++ b/src/components/Layout/ActionBar.tsx @@ -0,0 +1,132 @@ +import { + Disclosure, + DisclosureButton, + DisclosurePanel, +} from '@headlessui/react'; +import { ChevronRightIcon } from '@heroicons/react/20/solid'; +import { + PlayIcon, + TrashIcon, + CodeBracketIcon, + ClockIcon, +} from '@heroicons/react/24/solid'; +import Spinner from 'components/Spinner'; +import { AppContext } from 'context/AppContext'; +import { AppActions } from 'context/Reducer'; +import { CODE_SAMPLES } from 'helpers/const'; +import useCodeRunner from 'hooks/useCodeRunner'; +import { useContext } from 'react'; + +const codeSampleToMenu = CODE_SAMPLES.map(sample => { + const { codeSample, name } = sample; + const payload = { + codeSample, + codeSampleName: name, + }; + + return { + label: name, + payload: { type: AppActions.LOAD_CODE_SAMPLE, payload }, + }; +}); + +const actionBarItems: ActionBarItem[] = [ + { + label: 'Clear Console', + icon: TrashIcon, + payload: { type: AppActions.CLEAR_RESULT }, + }, + { + label: 'History', + icon: ClockIcon, + payload: { type: AppActions.TOGGLE_HISTORY_MODAL }, + }, + { + label: 'Code Samples', + icon: CodeBracketIcon, + children: codeSampleToMenu, + }, +]; + +const ActionBar: React.FC = () => { + const { state, dispatch } = useContext(AppContext); + const { runCode } = useCodeRunner(); + + return ( + + ); +}; + +export default ActionBar; diff --git a/src/components/Layout/RootLayout.tsx b/src/components/Layout/RootLayout.tsx new file mode 100644 index 0000000..03c1b52 --- /dev/null +++ b/src/components/Layout/RootLayout.tsx @@ -0,0 +1,84 @@ +import { useContext } from 'react'; +import { + Dialog, + DialogBackdrop, + DialogPanel, + TransitionChild, +} from '@headlessui/react'; +import { Bars3Icon, XMarkIcon } from '@heroicons/react/24/outline'; +import Title from './Title'; +import ActionBar from './ActionBar'; +import { AppContext } from 'context/AppContext'; +import { AppActions } from 'context/Reducer'; + +const RootLayout: React.FC = ({ children }) => { + const { state, dispatch } = useContext(AppContext); + + return ( +
+ dispatch({ type: AppActions.HIDE_SIDEBAR })} + className="relative z-50 lg:hidden" + > + + +
+ + +
+ +
+
+ +
+
+ + +
+ +
+
+ +
+
+
+ + </div> + <ActionBar /> + </div> + </div> + + <div className="sticky top-0 z-40 flex items-center gap-x-6 bg-gray-900 px-4 py-4 shadow-xs sm:px-6 lg:hidden"> + <button + type="button" + onClick={() => dispatch({ type: AppActions.SHOW_SIDEBAR })} + className="-m-2.5 p-2.5 text-gray-400 lg:hidden" + > + <span className="sr-only">Open sidebar</span> + <Bars3Icon aria-hidden="true" className="size-6" /> + </button> + <div className="flex-1 text-sm/6 font-semibold text-white"> + <Title /> + </div> + </div> + + <main className="lg:pl-72">{children}</main> + </div> + ); +}; + +export default RootLayout; diff --git a/src/components/Layout/Title.tsx b/src/components/Layout/Title.tsx new file mode 100644 index 0000000..0a44550 --- /dev/null +++ b/src/components/Layout/Title.tsx @@ -0,0 +1,7 @@ +const Title: React.FC = () => { + return ( + <span className="text-yellow-500 text-xl font-semibold">JS Playground</span> + ); +}; + +export default Title; diff --git a/src/components/Layout/index.tsx b/src/components/Layout/index.tsx new file mode 100644 index 0000000..52c53ec --- /dev/null +++ b/src/components/Layout/index.tsx @@ -0,0 +1 @@ +export { default } from 'components/Layout/RootLayout'; diff --git a/src/components/Spinner/Spinner.tsx b/src/components/Spinner/Spinner.tsx new file mode 100644 index 0000000..cd26fbc --- /dev/null +++ b/src/components/Spinner/Spinner.tsx @@ -0,0 +1,28 @@ +const Spinner: React.FC = () => ( + <svg + className="text-gray-300 animate-spin" + viewBox="0 0 64 64" + fill="none" + xmlns="http://www.w3.org/2000/svg" + width="20" + height="20" + > + <path + d="M32 3C35.8083 3 39.5794 3.75011 43.0978 5.20749C46.6163 6.66488 49.8132 8.80101 52.5061 11.4939C55.199 14.1868 57.3351 17.3837 58.7925 20.9022C60.2499 24.4206 61 28.1917 61 32C61 35.8083 60.2499 39.5794 58.7925 43.0978C57.3351 46.6163 55.199 49.8132 52.5061 52.5061C49.8132 55.199 46.6163 57.3351 43.0978 58.7925C39.5794 60.2499 35.8083 61 32 61C28.1917 61 24.4206 60.2499 20.9022 58.7925C17.3837 57.3351 14.1868 55.199 11.4939 52.5061C8.801 49.8132 6.66487 46.6163 5.20749 43.0978C3.7501 39.5794 3 35.8083 3 32C3 28.1917 3.75011 24.4206 5.2075 20.9022C6.66489 17.3837 8.80101 14.1868 11.4939 11.4939C14.1868 8.80099 17.3838 6.66487 20.9022 5.20749C24.4206 3.7501 28.1917 3 32 3L32 3Z" + stroke="currentColor" + strokeWidth="5" + strokeLinecap="round" + strokeLinejoin="round" + /> + <path + d="M32 3C36.5778 3 41.0906 4.08374 45.1692 6.16256C49.2477 8.24138 52.7762 11.2562 55.466 14.9605C58.1558 18.6647 59.9304 22.9531 60.6448 27.4748C61.3591 31.9965 60.9928 36.6232 59.5759 40.9762" + stroke="currentColor" + strokeWidth="5" + strokeLinecap="round" + strokeLinejoin="round" + className="text-gray-400" + /> + </svg> +); + +export default Spinner; diff --git a/src/components/Spinner/index.tsx b/src/components/Spinner/index.tsx new file mode 100644 index 0000000..c2ca997 --- /dev/null +++ b/src/components/Spinner/index.tsx @@ -0,0 +1 @@ +export { default } from 'components/Spinner/Spinner'; diff --git a/src/context/AppContext.tsx b/src/context/AppContext.tsx index 61373a4..d8d8df7 100644 --- a/src/context/AppContext.tsx +++ b/src/context/AppContext.tsx @@ -10,6 +10,7 @@ const getTheme = (): Theme => { }; const initialState: AppState = { + sidebarOpen: false, code: getLocalStorage(STORAGE.CODE), codeSample: '', codeSampleName: '', diff --git a/src/context/Reducer.spec.ts b/src/context/Reducer.spec.ts index 8a68ad9..e3cf341 100644 --- a/src/context/Reducer.spec.ts +++ b/src/context/Reducer.spec.ts @@ -13,6 +13,7 @@ describe('Reducer tests', () => { position: null, jsonView: '', historyModalShown: false, + sidebarOpen: false, }; it('update and persist code when update code action is dispatched', () => { diff --git a/src/context/Reducer.ts b/src/context/Reducer.ts index 0eb520b..6d630c2 100644 --- a/src/context/Reducer.ts +++ b/src/context/Reducer.ts @@ -12,6 +12,8 @@ export const AppActions = { CLEAR_RESULT: 'CLEAR_RESULT', LOAD_CODE_SAMPLE: 'LOAD_CODE_SAMPLE', TOGGLE_HISTORY_MODAL: 'TOGGLE_HISTORY_MODAL', + SHOW_SIDEBAR: 'SHOW_SIDEBAR', + HIDE_SIDEBAR: 'HIDE_SIDEBAR', }; const handleCodeUpdate = (state: AppState, action: Action): AppState => { @@ -25,7 +27,7 @@ const handleCodeSuccess = (state: AppState, action: Action): AppState => { if (action.payload) { result.push(action.payload); } - return { ...state, error: '', result, loading: false }; + return { ...state, error: '', result, loading: false, sidebarOpen: false }; }; const handleLoadCodeSample = (state: AppState, action: Action): AppState => { @@ -33,7 +35,7 @@ const handleLoadCodeSample = (state: AppState, action: Action): AppState => { string, string >; - return { ...state, codeSample, codeSampleName }; + return { ...state, codeSample, codeSampleName, sidebarOpen: false }; }; const handleCodeRunning = (state: AppState): AppState => { @@ -57,7 +59,11 @@ export const reducer = (state: AppState, action: Action): AppState => { case AppActions.CODE_RUN_ERROR: return { ...state, error: action.payload as string, loading: false }; case AppActions.TOGGLE_ABOUT_MODAL: - return { ...state, display: action.payload as DisplayType }; + return { + ...state, + sidebarOpen: false, + display: action.payload as DisplayType, + }; case AppActions.TOGGLE_JSON_VIEW: return { ...state, jsonView: action.payload as DisplayType }; case AppActions.TOGGLE_THEME: @@ -65,9 +71,17 @@ export const reducer = (state: AppState, action: Action): AppState => { case AppActions.LOAD_CODE_SAMPLE: return handleLoadCodeSample(state, action); case AppActions.CLEAR_RESULT: - return { ...state, result: [] }; + return { ...state, sidebarOpen: false, result: [] }; case AppActions.TOGGLE_HISTORY_MODAL: - return { ...state, historyModalShown: !state.historyModalShown }; + return { + ...state, + sidebarOpen: false, + historyModalShown: !state.historyModalShown, + }; + case AppActions.SHOW_SIDEBAR: + return { ...state, sidebarOpen: true }; + case AppActions.HIDE_SIDEBAR: + return { ...state, sidebarOpen: false }; default: return state; } diff --git a/src/context/types.d.ts b/src/context/types.d.ts index 04020e6..d7a1149 100644 --- a/src/context/types.d.ts +++ b/src/context/types.d.ts @@ -1,7 +1,7 @@ type Theme = 'vs-dark' | 'vs-light'; type DisplayType = 'none' | 'block'; -interface AppState { +type AppState = { code: string; codeSample: string; codeSampleName: string; @@ -13,9 +13,27 @@ interface AppState { position: null; jsonView: string; historyModalShown: boolean; -} + sidebarOpen: boolean; +}; -interface Action { +type Action = { type: string; - payload?: unknown; // FIXME: String it ? -} + payload?: unknown; // FIXME: +}; + +type Payload = { + type: string; + payload?: { + codeSample?: string; + codeSampleName?: string; + }; +}; + +type ActionBarChildItem = Pick<ActionBarItem, 'label' | 'payload'>; + +type ActionBarItem = { + label: string; + icon: React.FC<React.SVGProps<SVGSVGElement>>; + payload?: Payload; + children?: ActionBarChildItem[]; +}; diff --git a/src/helpers/global.ts b/src/helpers/global.ts index 195e85c..cde58f1 100644 --- a/src/helpers/global.ts +++ b/src/helpers/global.ts @@ -11,3 +11,6 @@ _.extend(window, { dfn, Redux, }); + +export const classNames = (...classes: string[]) => + classes.filter(Boolean).join(' '); diff --git a/src/index.tsx b/src/index.tsx index e4aea06..45047a6 100644 --- a/src/index.tsx +++ b/src/index.tsx @@ -3,12 +3,16 @@ import ReactDOM from 'react-dom/client'; import App from 'components/App'; import 'helpers/global'; import { AppProvider } from 'context/AppContext'; +import RootLayout from 'components/Layout'; const root = ReactDOM.createRoot( document.getElementById('root') as HTMLElement, ); + root.render( <AppProvider> - <App /> + <RootLayout> + <App /> + </RootLayout> </AppProvider>, ); diff --git a/src/styles/App.css b/src/styles/App.css index 37c09f3..25205b3 100644 --- a/src/styles/App.css +++ b/src/styles/App.css @@ -1,143 +1,18 @@ -html, -body { - height: 100%; - margin: 0; - padding: 0; -} - -#root { - display: flex; - flex: 1; - height: 100%; -} - -.flex { - display: flex; - flex: 1; -} - -.flexColumn { - flex-direction: column; - overflow: hidden; -} - -.editorContainer { - height: 70vh; -} - -.consoleContainer { - height: 20vh; - display: flex; - flex: 1 -} - - -.monaco-editor, -.overflow-guard { - width: 100% !important; -} - -.console { - word-wrap: break-word; - word-break: break-all; - font-size: large; - font-family: sans-serif; - padding: 20px; - overflow-y: auto; - width: 100%; -} - -.console-light { - background-color: #fff; - color: #3a3f44; - border-top: 1px solid #3a3f44; -} +@import "tailwindcss"; -.error { - color: #e54e4e; +@theme { + --font-sans: InterVariable, sans-serif; } -.small-text { - font-size: 11px; -} - -.app-actions { - display: flex; - justify-content: center; - align-items: center; -} - -.menu { - position: fixed; - list-style: none; - user-select: none; - background-color: #ffffff; - box-sizing: border-box; - box-shadow: 0px 10px 30px -5px rgba(0, 0, 0, 0.3); - border-radius: 6px; - padding: 6px 10px; - min-width: 200px; - z-index: 100; -} - -.menu li { - cursor: pointer; - padding: 0px 5px; -} - -.menu li:hover { - background-color: #3a3f44; -} - -.clickable { - background: none; - color: inherit; - border: none; - padding: 5px; - font: inherit; - outline: 0; - cursor: pointer; - width: 100%; - text-align: left; -} - - -.text-sm { - color: #aaa; - font-size: 0.7rem; -} - - - -.modalOverlay { - position: fixed; - top: 0; - left: 0; - right: 0; - bottom: 0; - background-color: rgba(0, 0, 0, 0.5); - display: flex; - justify-content: center; - align-items: center; - z-index: 1000; +.split { + display: flex; + height: 100%; } -.modalContent { - background-color: white; - padding: 20px; - border-radius: 8px; - max-width: 500px; - width: 100%; - box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1); - position: relative; +.gutter { + background-color: #444; + cursor: col-resize; } -.closeButton { - position: absolute; - top: 10px; - right: 10px; - background: none; - border: none; - font-size: 1.5rem; - cursor: pointer; -} \ No newline at end of file +.gutter.gutter-horizontal { + width: 6px; } \ No newline at end of file From 410005fd0334a9b2e9135344d0120e47c0047572 Mon Sep 17 00:00:00 2001 From: Khalid Elshafie <abolkog@gmail.com> Date: Thu, 22 May 2025 15:29:15 +1000 Subject: [PATCH 2/9] feat: simplify the console Simply the Console component by removing the JSONView component. - Remove JSONView component - Remove unused Header component - Remove unused types --- eslint.config.mjs | 1 + package-lock.json | 18 +-- package.json | 1 - src/components/App/App.tsx | 4 +- src/components/CodeEditor/CodeEditor.tsx | 8 +- .../{Console.spec.tsx => Console.test.tsx} | 31 ++++- src/components/Console/Console.tsx | 53 ++++---- src/components/Header/Header.spec.tsx | 64 ---------- src/components/Header/Header.tsx | 118 ------------------ src/components/Header/index.tsx | 1 - src/components/JsonView/JsonView.spec.tsx | 31 ----- src/components/JsonView/JsonView.tsx | 27 ---- src/components/JsonView/index.tsx | 1 - src/context/AppContext.tsx | 9 -- .../{Reducer.spec.ts => Reducer.test.ts} | 10 -- src/context/Reducer.ts | 11 -- src/context/types.d.ts | 5 +- src/helpers/const.ts | 13 -- src/helpers/type.d.ts | 18 +-- .../{storage.spec.ts => storage.test.ts} | 0 src/services/storage.ts | 3 +- 21 files changed, 70 insertions(+), 357 deletions(-) rename src/components/Console/{Console.spec.tsx => Console.test.tsx} (65%) delete mode 100644 src/components/Header/Header.spec.tsx delete mode 100644 src/components/Header/Header.tsx delete mode 100644 src/components/Header/index.tsx delete mode 100644 src/components/JsonView/JsonView.spec.tsx delete mode 100644 src/components/JsonView/JsonView.tsx delete mode 100644 src/components/JsonView/index.tsx rename src/context/{Reducer.spec.ts => Reducer.test.ts} (89%) rename src/services/{storage.spec.ts => storage.test.ts} (100%) diff --git a/eslint.config.mjs b/eslint.config.mjs index e2ce8d0..b255320 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -38,6 +38,7 @@ export default [ 'react/jsx-uses-react': 'error', 'react/jsx-uses-vars': 'error', 'react/prop-types': 'off', + '@typescript-eslint/consistent-type-definitions': ['error', 'type'], }, }, ]; diff --git a/package-lock.json b/package-lock.json index 52f40bc..ef80f46 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,7 +12,6 @@ "@headlessui/react": "^2.2.2", "@heroicons/react": "^2.2.0", "@testing-library/jest-dom": "^6.6.3", - "@uiw/react-json-view": "^2.0.0-alpha.30", "axios": "^1.7.9", "date-fns": "^4.1.0", "eslint-plugin-react": "^7.37.2", @@ -626,6 +625,7 @@ "version": "7.24.8", "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.8.tgz", "integrity": "sha512-5F7SDGs1T72ZczbRwbGO9lQi0NLjQxzl6i4lJxLxfW9U5UluCSyEJeniWvnhl3/euNiqQVbo8zruhsDfid0esA==", + "dev": true, "dependencies": { "regenerator-runtime": "^0.14.0" }, @@ -3394,19 +3394,6 @@ "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@uiw/react-json-view": { - "version": "2.0.0-alpha.30", - "resolved": "https://registry.npmjs.org/@uiw/react-json-view/-/react-json-view-2.0.0-alpha.30.tgz", - "integrity": "sha512-ufvvirUQcITU9s4R12b7hn/t7ngLCYp1KbBxE+eAD35o3Ey+uxfKvgWmIwGFhV3hFXXxMJ8SHQKwl/ywNCHsDA==", - "funding": { - "url": "https://jaywcjlove.github.io/#/sponsor" - }, - "peerDependencies": { - "@babel/runtime": ">=7.10.0", - "react": ">=18.0.0", - "react-dom": ">=18.0.0" - } - }, "node_modules/@webassemblyjs/ast": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz", @@ -14811,7 +14798,8 @@ "node_modules/regenerator-runtime": { "version": "0.14.1", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", - "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==" + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", + "dev": true }, "node_modules/regexp.prototype.flags": { "version": "1.5.3", diff --git a/package.json b/package.json index fdacca4..0b1bfc3 100644 --- a/package.json +++ b/package.json @@ -44,7 +44,6 @@ "@headlessui/react": "^2.2.2", "@heroicons/react": "^2.2.0", "@testing-library/jest-dom": "^6.6.3", - "@uiw/react-json-view": "^2.0.0-alpha.30", "axios": "^1.7.9", "date-fns": "^4.1.0", "eslint-plugin-react": "^7.37.2", diff --git a/src/components/App/App.tsx b/src/components/App/App.tsx index a9cc178..2fe9cba 100644 --- a/src/components/App/App.tsx +++ b/src/components/App/App.tsx @@ -31,9 +31,7 @@ const App: React.FC = () => { <Editor /> </div> - <div className="bg-white text-black overflow-auto"> - <Console /> - </div> + <Console /> </Split> </div> ); diff --git a/src/components/CodeEditor/CodeEditor.tsx b/src/components/CodeEditor/CodeEditor.tsx index da27898..b7a0596 100644 --- a/src/components/CodeEditor/CodeEditor.tsx +++ b/src/components/CodeEditor/CodeEditor.tsx @@ -17,7 +17,7 @@ const CodeEditor: React.FC = () => { value: '', language: 'typescript', fontSize: 20, - theme: state.theme, + theme: 'vs-dark', minimap: { enabled: false, }, @@ -25,7 +25,7 @@ const CodeEditor: React.FC = () => { const editorInstance = monaco.editor.create( editorRef.current!, - editorConfig + editorConfig, ); monaco.editor.setModelLanguage(editorInstance.getModel()!, 'typescript'); @@ -69,10 +69,6 @@ const CodeEditor: React.FC = () => { return () => editor?.dispose(); }, [editorRef.current]); - useEffect(() => { - editor?.updateOptions({ theme: state.theme }); - }, [state.theme]); - useEffect(() => { editor?.setValue(state.codeSample); }, [state.codeSample]); diff --git a/src/components/Console/Console.spec.tsx b/src/components/Console/Console.test.tsx similarity index 65% rename from src/components/Console/Console.spec.tsx rename to src/components/Console/Console.test.tsx index 094ee4a..a70295c 100644 --- a/src/components/Console/Console.spec.tsx +++ b/src/components/Console/Console.test.tsx @@ -20,7 +20,7 @@ describe('<Console />', () => { render( <AppContext.Provider value={{ state, dispatch }}> <Console /> - </AppContext.Provider> + </AppContext.Provider>, ); const errorDiv = screen.getByTestId('console-error'); @@ -34,12 +34,12 @@ describe('<Console />', () => { render( <AppContext.Provider value={{ state, dispatch }}> <Console /> - </AppContext.Provider> + </AppContext.Provider>, ); expect(screen.queryByTestId('console-error')).not.toBeInTheDocument(); expect(screen.getByTestId('console-result').children.length).toEqual( - result.length + result.length, ); }); @@ -49,14 +49,33 @@ describe('<Console />', () => { render( <AppContext.Provider value={{ state, dispatch }}> <Console /> - </AppContext.Provider> + </AppContext.Provider>, ); expect(screen.getByTestId('console-result-item-0').textContent).toEqual( - JSON.stringify(result[0]) + JSON.stringify(result[0], null, 0), ); expect(screen.getByTestId('console-result-item-1').textContent).toEqual( - result[1] + JSON.stringify(result[1], null, 0), + ); + }); + + it('add indentation when result is large', () => { + const largeObj = { + a: 'This is a long string to make the object large enough for pretty print.', + b: Array(10).fill('more data'), + c: { nested: true, arr: [1, 2, 3, 4, 5] }, + }; + state.result = [largeObj]; + render( + <AppContext.Provider value={{ state, dispatch }}> + <Console /> + </AppContext.Provider>, + ); + + // The component should pretty-print with 2 spaces for large objects + expect(screen.getByTestId('console-result-item-0').textContent).toEqual( + JSON.stringify(largeObj, null, 2), ); }); }); diff --git a/src/components/Console/Console.tsx b/src/components/Console/Console.tsx index d66a4e5..1a726e1 100644 --- a/src/components/Console/Console.tsx +++ b/src/components/Console/Console.tsx @@ -1,41 +1,48 @@ import { useContext } from 'react'; -import _ from 'lodash'; import { AppContext } from 'context/AppContext'; const Console: React.FC = () => { const { state } = useContext(AppContext); - const { result, error, theme } = state; - const extraClass = theme === 'vs-light' ? 'console-light' : ''; + const { result, error } = state; const createKey = (index: number) => { return `key${index}`; }; - if (error) { + const renderError = () => { return ( - <div className="console"> - <div data-testid="console-error" className="error"> - {error} - </div> + <div data-testid="console-error" className="font-bold text-red-500"> + {error} </div> ); - } + }; + + const renderResult = () => { + return result.map((item, index) => { + const key = createKey(index); + const isObject = typeof item === 'object' && item !== null; + const str = JSON.stringify(item); + const space = isObject && str.length > 60 ? 2 : 0; + + return ( + <div key={key} className="py-1.5"> + <pre> + <span className="mr-2 text-[#8be9fd]">›</span> + <span data-testid={`console-result-item-${index}`}> + {JSON.stringify(item, null, space)} + </span> + </pre> + </div> + ); + }); + }; return ( - <div data-testid="console-result" className={`console ${extraClass}`}> - {result.map((item, index) => { - const consoleItem = !_.isString(item) ? JSON.stringify(item) : item; - return ( - <div key={createKey(index)}> - <pre> - <span style={{ marginRight: 5 }}>›</span> - <span data-testid={`console-result-item-${index}`}> - {consoleItem} - </span> - </pre> - </div> - ); - })} + <div + data-testid="console-result" + className="bg-[#282a36] text-[#f8f8f2] font-mono overflow-x-auto p-4" + > + {error ? renderError() : renderResult()} </div> ); }; diff --git a/src/components/Header/Header.spec.tsx b/src/components/Header/Header.spec.tsx deleted file mode 100644 index a61c6b0..0000000 --- a/src/components/Header/Header.spec.tsx +++ /dev/null @@ -1,64 +0,0 @@ -import { cleanup, fireEvent, render, screen } from '@testing-library/react'; -import Header from 'components/Header'; -import { AppContext } from 'context/AppContext'; -import { AppActions } from 'context/Reducer'; - -describe('<Header />', () => { - describe('header actions', () => { - const state = { codeSample: '', codeSampleName: '' } as AppState; - let dispatch: jest.Mock; - beforeEach(() => { - dispatch = jest.fn(); - render( - <AppContext.Provider value={{ state, dispatch }}> - <Header /> - </AppContext.Provider>, - ); - }); - - afterEach(() => { - cleanup(); - }); - - it('dispatch about action when about button is click', () => { - fireEvent.click(screen.getByText('About')); - expect(dispatch).toHaveBeenCalledWith({ - payload: 'block', - type: AppActions.TOGGLE_ABOUT_MODAL, - }); - }); - it('toggle the theme when toggle button is click', () => { - fireEvent.click(screen.getByTestId('app-theme-button-vs-dark')); - expect(dispatch).toHaveBeenCalledWith({ - payload: 'vs-dark', - type: AppActions.TOGGLE_THEME, - }); - }); - - it('dispatch execute code action when run button is clicked', () => { - fireEvent.click(screen.getByTestId('actionbutton-button-execute')); - expect(dispatch).toHaveBeenCalledWith({ - type: AppActions.CODE_RUNNING, - }); - }); - - it('dispatch clear result action when clear button is clicked', () => { - fireEvent.click(screen.getByTestId('actionbutton-button-clear')); - expect(dispatch).toHaveBeenCalledWith({ - type: AppActions.CLEAR_RESULT, - }); - }); - - it('dispatch load code sample on sample change', () => { - fireEvent.change(screen.getByTestId('header-code-selector'), { - target: { value: 'Axios' }, - }); - expect(dispatch).toHaveBeenCalledWith({ - type: AppActions.LOAD_CODE_SAMPLE, - payload: expect.objectContaining({ - codeSampleName: 'Axios', - }), - }); - }); - }); -}); diff --git a/src/components/Header/Header.tsx b/src/components/Header/Header.tsx deleted file mode 100644 index 10e64ba..0000000 --- a/src/components/Header/Header.tsx +++ /dev/null @@ -1,118 +0,0 @@ -import { ChangeEvent, useContext } from 'react'; -import ActionButton from 'components/ActionButton'; -import { AppContext } from 'context/AppContext'; -import { AppActions } from 'context/Reducer'; -import { CODE_SAMPLES, EDITOR_THEMES } from 'helpers/const'; -import useCodeRunner from 'hooks/useCodeRunner'; - -const Header: React.FC = () => { - const { state, dispatch } = useContext(AppContext); - const { runCode } = useCodeRunner(); - const { theme, codeSampleName } = state; - - const handleChange = (e: ChangeEvent<HTMLSelectElement>) => { - const { - target: { value }, - } = e; - - const { codeSample } = CODE_SAMPLES.find(item => item.name === value)!; - - const payload = { - codeSample, - codeSampleName: value, - }; - - dispatch({ type: AppActions.LOAD_CODE_SAMPLE, payload }); - }; - - return ( - <nav className="navbar navbar-expand-lg navbar-dark bg-primary px-2"> - <a className="navbar-brand" href="/"> - JS PlayGround - </a> - - <div className="collapse navbar-collapse"> - <ul className="navbar-nav me-auto"> - <li className="nav-item"> - <button - type="button" - className="btn btn-secondary" - style={{ cursor: 'pointer' }} - onClick={() => - dispatch({ - type: AppActions.TOGGLE_ABOUT_MODAL, - payload: 'block', - }) - } - > - About - </button> - </li> - </ul> - - <div className="my-2 app-actions"> - <div> - <select - data-testid="header-code-selector" - className="form-control" - value={codeSampleName} - onChange={handleChange} - > - <option value="" disabled> - Load Sample Code - </option> - {CODE_SAMPLES.map(item => ( - <option value={item.name} key={item.id}> - {item.name} - </option> - ))} - </select> - </div> - <span style={{ marginLeft: 20, marginRight: 20 }} /> - - <div className="btn-group" role="group"> - {EDITOR_THEMES.map(item => ( - <button - key={item.id} - type="button" - data-testid={`app-theme-button-${item.value}`} - className={`btn btn-${ - theme === item.value ? 'warning' : ' default' - }`} - onClick={() => { - dispatch({ - type: AppActions.TOGGLE_THEME, - payload: item.value, - }); - }} - > - <i className={`fas fa-${item.icon}`} /> - </button> - ))} - </div> - - <span style={{ marginLeft: 20, marginRight: 20 }} /> - <ActionButton - type="clear" - onClick={() => dispatch({ type: AppActions.CLEAR_RESULT })} - /> - - <span style={{ marginLeft: 20, marginRight: 20 }} /> - <ActionButton - type="history" - onClick={() => dispatch({ type: AppActions.TOGGLE_HISTORY_MODAL })} - /> - - <span style={{ marginLeft: 20, marginRight: 20 }} /> - <ActionButton - type="execute" - onClick={() => runCode(state.code)} - loading={state.loading} - /> - </div> - </div> - </nav> - ); -}; - -export default Header; diff --git a/src/components/Header/index.tsx b/src/components/Header/index.tsx deleted file mode 100644 index a0dab5b..0000000 --- a/src/components/Header/index.tsx +++ /dev/null @@ -1 +0,0 @@ -export { default } from 'components/Header/Header'; diff --git a/src/components/JsonView/JsonView.spec.tsx b/src/components/JsonView/JsonView.spec.tsx deleted file mode 100644 index f21c19c..0000000 --- a/src/components/JsonView/JsonView.spec.tsx +++ /dev/null @@ -1,31 +0,0 @@ -import { cleanup, fireEvent, render, screen } from '@testing-library/react'; -import JsonView from 'components/JsonView'; -import { AppContext } from 'context/AppContext'; -import { AppActions } from 'context/Reducer'; - -describe('<JsonView />', () => { - const state = { - display: 'block', - result: [''], - } as AppState; - const dispatch = jest.fn(); - - beforeEach(() => { - render( - <AppContext.Provider value={{ state, dispatch }}> - <JsonView /> - </AppContext.Provider>, - ); - }); - - afterEach(cleanup); - - it('calls dispatch on button click', () => { - fireEvent.click(screen.getByTestId('modal-close-btn')); - - expect(dispatch).toHaveBeenCalledWith({ - type: AppActions.TOGGLE_JSON_VIEW, - payload: 'none', - }); - }); -}); diff --git a/src/components/JsonView/JsonView.tsx b/src/components/JsonView/JsonView.tsx deleted file mode 100644 index d307b0a..0000000 --- a/src/components/JsonView/JsonView.tsx +++ /dev/null @@ -1,27 +0,0 @@ -import { useContext } from 'react'; -import ReactJsonView from '@uiw/react-json-view'; - -import { githubLightTheme } from '@uiw/react-json-view/githubLight'; -import { nordTheme } from '@uiw/react-json-view/nord'; - -import { AppContext } from 'context/AppContext'; -import { AppActions } from 'context/Reducer'; -import Modal from 'components/Modal'; - -const JsonView: React.FC = () => { - const { state, dispatch } = useContext(AppContext); - const open = state.jsonView !== 'none'; - const theme = state.theme === 'vs-light' ? githubLightTheme : nordTheme; - - const handleClose = () => { - dispatch({ type: AppActions.TOGGLE_JSON_VIEW, payload: 'none' }); - }; - - return ( - <Modal isOpen={open} onClose={handleClose} title="JSON View"> - <ReactJsonView value={state.result.filter(item => item)} style={theme} /> - </Modal> - ); -}; - -export default JsonView; diff --git a/src/components/JsonView/index.tsx b/src/components/JsonView/index.tsx deleted file mode 100644 index 020d800..0000000 --- a/src/components/JsonView/index.tsx +++ /dev/null @@ -1 +0,0 @@ -export { default } from 'components/JsonView/JsonView'; diff --git a/src/context/AppContext.tsx b/src/context/AppContext.tsx index d8d8df7..704a1da 100644 --- a/src/context/AppContext.tsx +++ b/src/context/AppContext.tsx @@ -2,13 +2,6 @@ import { createContext, useMemo, useReducer } from 'react'; import { getLocalStorage, STORAGE } from 'services/storage'; import { reducer } from 'context/Reducer'; -const getTheme = (): Theme => { - const themeFromStorage = getLocalStorage(STORAGE.THEME) as Theme; - if (themeFromStorage === 'vs-dark' || themeFromStorage === 'vs-light') - return themeFromStorage; - return 'vs-dark'; -}; - const initialState: AppState = { sidebarOpen: false, code: getLocalStorage(STORAGE.CODE), @@ -17,10 +10,8 @@ const initialState: AppState = { result: [], error: '', loading: false, - theme: getTheme(), display: 'none', position: null, - jsonView: 'none', historyModalShown: false, }; diff --git a/src/context/Reducer.spec.ts b/src/context/Reducer.test.ts similarity index 89% rename from src/context/Reducer.spec.ts rename to src/context/Reducer.test.ts index e3cf341..0d0b400 100644 --- a/src/context/Reducer.spec.ts +++ b/src/context/Reducer.test.ts @@ -8,10 +8,8 @@ describe('Reducer tests', () => { result: [], error: '', loading: false, - theme: 'vs-dark', display: 'none', position: null, - jsonView: '', historyModalShown: false, sidebarOpen: false, }; @@ -64,14 +62,6 @@ describe('Reducer tests', () => { expect(state.display).toEqual('block'); }); - it('update theme state when toggle theme action is dispatched', () => { - const state = reducer(INITIAL_STATE, { - type: AppActions.TOGGLE_THEME, - payload: 'vs-light', - }); - expect(state.theme).toEqual('vs-light'); - }); - it('update code sample value when load code sample action is dispatched', () => { const payload = { codeSample: 'axios code', diff --git a/src/context/Reducer.ts b/src/context/Reducer.ts index 6d630c2..a86750c 100644 --- a/src/context/Reducer.ts +++ b/src/context/Reducer.ts @@ -7,8 +7,6 @@ export const AppActions = { CODE_RUN_SUCCESS: 'CODE_RUN_SUCCESS', CODE_RUN_ERROR: 'CODE_RUN_ERROR', TOGGLE_ABOUT_MODAL: 'TOGGLE_ABOUT_MODAL', - TOGGLE_JSON_VIEW: 'TOGGLE_JSON_VIEW', - TOGGLE_THEME: 'TOGGLE_THEME', CLEAR_RESULT: 'CLEAR_RESULT', LOAD_CODE_SAMPLE: 'LOAD_CODE_SAMPLE', TOGGLE_HISTORY_MODAL: 'TOGGLE_HISTORY_MODAL', @@ -43,11 +41,6 @@ const handleCodeRunning = (state: AppState): AppState => { return { ...state, loading: true }; }; -const setAppTheme = (state: AppState, action: Action) => { - setLocalStorage(STORAGE.THEME, action.payload as string); - return { ...state, theme: action.payload as Theme }; -}; - export const reducer = (state: AppState, action: Action): AppState => { switch (action.type) { case AppActions.UPDATE_CODE: @@ -64,10 +57,6 @@ export const reducer = (state: AppState, action: Action): AppState => { sidebarOpen: false, display: action.payload as DisplayType, }; - case AppActions.TOGGLE_JSON_VIEW: - return { ...state, jsonView: action.payload as DisplayType }; - case AppActions.TOGGLE_THEME: - return setAppTheme(state, action); case AppActions.LOAD_CODE_SAMPLE: return handleLoadCodeSample(state, action); case AppActions.CLEAR_RESULT: diff --git a/src/context/types.d.ts b/src/context/types.d.ts index d7a1149..44c4b8c 100644 --- a/src/context/types.d.ts +++ b/src/context/types.d.ts @@ -1,5 +1,4 @@ -type Theme = 'vs-dark' | 'vs-light'; -type DisplayType = 'none' | 'block'; +type DisplayType = 'none' | 'block'; // FIXME: remove ? type AppState = { code: string; @@ -8,10 +7,8 @@ type AppState = { result: unknown[]; error: string; loading: boolean; - theme: Theme; display: DisplayType; position: null; - jsonView: string; historyModalShown: boolean; sidebarOpen: boolean; }; diff --git a/src/helpers/const.ts b/src/helpers/const.ts index c7a4fb3..7ec9e73 100644 --- a/src/helpers/const.ts +++ b/src/helpers/const.ts @@ -100,16 +100,3 @@ console.log(calculate({ operation: '*', operand1: 4, operand2: 6 })); // Outpu `, }, ]; - -export const EDITOR_THEMES: EditorTheme[] = [ - { - id: 1, - value: 'vs-dark', - icon: 'moon', - }, - { - id: 2, - value: 'vs-light', - icon: 'sun', - }, -]; diff --git a/src/helpers/type.d.ts b/src/helpers/type.d.ts index a44374d..28fb2c0 100644 --- a/src/helpers/type.d.ts +++ b/src/helpers/type.d.ts @@ -1,23 +1,17 @@ -interface CodeSample { +type CodeSample = { id: number; name: string; codeSample: string; -} +}; -interface EditorTheme { - id: number; - value: Theme; - icon: string; -} - -interface Library { +type Library = { name: string; url: string; use: string; version: string; -} +}; -interface HistoryItem { +type HistoryItem = { code: string; date: string; -} +}; diff --git a/src/services/storage.spec.ts b/src/services/storage.test.ts similarity index 100% rename from src/services/storage.spec.ts rename to src/services/storage.test.ts diff --git a/src/services/storage.ts b/src/services/storage.ts index 68ad5df..6c74529 100644 --- a/src/services/storage.ts +++ b/src/services/storage.ts @@ -5,7 +5,6 @@ const MAX_HISTORY_SIZE = 20; export const STORAGE = { CODE: '@abolkog/jscode', HISTORY: 'abolkog/jscode-history', - THEME: 'abolkog/jscode-theme', }; export const getLocalStorage = (key: string, defaultValue = '') => { @@ -22,7 +21,7 @@ export const clearLocalStorage = (key: string) => { export const saveToHistory = (code: string) => { const history: HistoryItem[] = JSON.parse( - localStorage.getItem(STORAGE.HISTORY) || '[]' + localStorage.getItem(STORAGE.HISTORY) || '[]', ); // Compress the code before saving From af5a69efa7769c9a9a5c8f919d267588dc2e46bd Mon Sep 17 00:00:00 2001 From: Khalid Elshafie <abolkog@gmail.com> Date: Thu, 22 May 2025 15:38:50 +1000 Subject: [PATCH 3/9] chore: cleanup unused components and dead code - Remove ContextMenu component and its related files - Remove ActionButton component and its related files - Remove Clickable component and its related files - Remove unused code from Console component - Remove unused code from AppContext - Remove unused code from Reducer --- .../ActionButton/ActionButton.spec.tsx | 41 ----------------- src/components/ActionButton/ActionButton.tsx | 46 ------------------- src/components/ActionButton/index.tsx | 1 - src/components/ActionButton/types.d.ts | 14 ------ src/components/Clickable/Clickable.spec.tsx | 11 ----- src/components/Clickable/Clickable.tsx | 13 ------ src/components/Clickable/index.tsx | 1 - src/components/Clickable/types.d.ts | 3 -- src/components/Console/Console.test.tsx | 2 +- src/components/Console/Console.tsx | 2 +- .../ContextMenu/ContextMenu.spec.tsx | 20 -------- src/components/ContextMenu/ContextMenu.tsx | 29 ------------ src/components/ContextMenu/index.tsx | 1 - src/components/ContextMenu/types.d.ts | 9 ---- src/context/AppContext.tsx | 1 - src/context/Reducer.test.ts | 1 - src/context/types.d.ts | 16 +++---- src/hooks/useCodeRunner.tsx | 2 +- 18 files changed, 9 insertions(+), 204 deletions(-) delete mode 100644 src/components/ActionButton/ActionButton.spec.tsx delete mode 100644 src/components/ActionButton/ActionButton.tsx delete mode 100644 src/components/ActionButton/index.tsx delete mode 100644 src/components/ActionButton/types.d.ts delete mode 100644 src/components/Clickable/Clickable.spec.tsx delete mode 100644 src/components/Clickable/Clickable.tsx delete mode 100644 src/components/Clickable/index.tsx delete mode 100644 src/components/Clickable/types.d.ts delete mode 100644 src/components/ContextMenu/ContextMenu.spec.tsx delete mode 100644 src/components/ContextMenu/ContextMenu.tsx delete mode 100644 src/components/ContextMenu/index.tsx delete mode 100644 src/components/ContextMenu/types.d.ts diff --git a/src/components/ActionButton/ActionButton.spec.tsx b/src/components/ActionButton/ActionButton.spec.tsx deleted file mode 100644 index 542f9ce..0000000 --- a/src/components/ActionButton/ActionButton.spec.tsx +++ /dev/null @@ -1,41 +0,0 @@ -import { fireEvent, render, screen } from '@testing-library/react'; -import ActionButton from 'components/ActionButton'; - -const buttonTestId = 'actionbutton-button'; -const iconTestId = 'actionbutton-icon'; -describe('<ActionButton />', () => { - const onClick = jest.fn(); - - it('render clear button when button type is clear', () => { - render(<ActionButton onClick={onClick} type="clear" />); - const button = screen.getByTestId(`${buttonTestId}-clear`); - const icon = screen.getByTestId(iconTestId); - - expect(button.textContent?.trim()).toEqual('Clear result'); - expect(button).toHaveClass('btn-info'); - expect(icon).toHaveClass('fa-trash'); - }); - - it('render execute button when button type is execute', () => { - render(<ActionButton onClick={onClick} type="execute" />); - const button = screen.getByTestId(`${buttonTestId}-execute`); - const icon = screen.getByTestId(iconTestId); - - expect(button.textContent?.trim()).toEqual('Run'); - expect(button).toHaveClass('btn-success'); - expect(icon).toHaveClass('fa-play-circle'); - }); - - it('render loading icon when loading prop is truthy', () => { - render(<ActionButton onClick={onClick} type="execute" loading />); - const icon = screen.getByTestId(iconTestId); - expect(icon).toHaveClass('fas fa-spinner fa-spin'); - }); - - it('invoke onClick when button is clicked', () => { - render(<ActionButton onClick={onClick} type="execute" />); - const button = screen.getByTestId(`${buttonTestId}-execute`); - fireEvent.click(button); - expect(onClick).toHaveBeenCalledTimes(1); - }); -}); diff --git a/src/components/ActionButton/ActionButton.tsx b/src/components/ActionButton/ActionButton.tsx deleted file mode 100644 index 6bfdc88..0000000 --- a/src/components/ActionButton/ActionButton.tsx +++ /dev/null @@ -1,46 +0,0 @@ -const ButtonProps: Record<ActionButtonType, ActionButtonTypeProps> = { - clear: { - title: 'Clear result', - icon: 'fas fa-trash', - className: 'btn btn-info', - toolTip: 'Clear result (CtrCmd + l)', - }, - execute: { - title: 'Run', - icon: 'fas fa-play-circle', - className: 'btn btn-success', - toolTip: 'Run Code (CtrCmd + k)', - }, - history: { - title: 'History', - icon: 'fas fa-history', - className: 'btn btn-warning', - toolTip: 'Show run history', - }, -}; - -const ActionButton: React.FC<ActionButtonProps> = ({ - type, - onClick, - loading = false, -}) => { - const buttonProps = ButtonProps[type]; - const iconName = loading ? 'fas fa-spinner fa-spin' : buttonProps.icon; - return ( - <button - data-toggle="tooltip" - data-testid={`actionbutton-button-${type}`} - type="button" - onClick={onClick} - className={buttonProps.className} - disabled={loading} - title={buttonProps.toolTip} - > - <span>{buttonProps.title}</span> -   - <i data-testid="actionbutton-icon" className={iconName} /> - </button> - ); -}; - -export default ActionButton; diff --git a/src/components/ActionButton/index.tsx b/src/components/ActionButton/index.tsx deleted file mode 100644 index 9b18f0e..0000000 --- a/src/components/ActionButton/index.tsx +++ /dev/null @@ -1 +0,0 @@ -export { default } from 'components/ActionButton/ActionButton'; diff --git a/src/components/ActionButton/types.d.ts b/src/components/ActionButton/types.d.ts deleted file mode 100644 index 62b5fab..0000000 --- a/src/components/ActionButton/types.d.ts +++ /dev/null @@ -1,14 +0,0 @@ -type ActionButtonType = 'execute' | 'clear' | 'history'; - -interface ActionButtonProps { - type: ActionButtonType; - onClick: VoidFunction; - loading?: boolean; -} - -interface ActionButtonTypeProps { - title: string; - icon: string; - className: string; - toolTip?: string; -} diff --git a/src/components/Clickable/Clickable.spec.tsx b/src/components/Clickable/Clickable.spec.tsx deleted file mode 100644 index 7e4827a..0000000 --- a/src/components/Clickable/Clickable.spec.tsx +++ /dev/null @@ -1,11 +0,0 @@ -import { fireEvent, render, screen } from '@testing-library/react'; -import Clickable from 'components/Clickable'; - -describe('<Clickable />', () => { - it('invoke on click when button clicked', () => { - const onClick = jest.fn(); - render(<Clickable onClick={onClick} />); - fireEvent.click(screen.getByTestId('app-clickable')); - expect(onClick).toHaveBeenCalledTimes(1); - }); -}); diff --git a/src/components/Clickable/Clickable.tsx b/src/components/Clickable/Clickable.tsx deleted file mode 100644 index d8dca23..0000000 --- a/src/components/Clickable/Clickable.tsx +++ /dev/null @@ -1,13 +0,0 @@ -const Clickable: React.FC<ClickableProps> = ({ onClick, children }) => ( - <button - data-testid="app-clickable" - className="clickable" - type="button" - onClick={onClick} - aria-label="clickable" - > - {children} - </button> -); - -export default Clickable; diff --git a/src/components/Clickable/index.tsx b/src/components/Clickable/index.tsx deleted file mode 100644 index 91fe454..0000000 --- a/src/components/Clickable/index.tsx +++ /dev/null @@ -1 +0,0 @@ -export { default } from 'components/Clickable/Clickable'; diff --git a/src/components/Clickable/types.d.ts b/src/components/Clickable/types.d.ts deleted file mode 100644 index 5d3fb5d..0000000 --- a/src/components/Clickable/types.d.ts +++ /dev/null @@ -1,3 +0,0 @@ -interface ClickableProps extends React.HTMLAttributes<HTMLButtonElement> { - onClick: VoidFunction; -} diff --git a/src/components/Console/Console.test.tsx b/src/components/Console/Console.test.tsx index a70295c..4ba7124 100644 --- a/src/components/Console/Console.test.tsx +++ b/src/components/Console/Console.test.tsx @@ -75,7 +75,7 @@ describe('<Console />', () => { // The component should pretty-print with 2 spaces for large objects expect(screen.getByTestId('console-result-item-0').textContent).toEqual( - JSON.stringify(largeObj, null, 2), + JSON.stringify(largeObj, null, 3), ); }); }); diff --git a/src/components/Console/Console.tsx b/src/components/Console/Console.tsx index 1a726e1..5c61191 100644 --- a/src/components/Console/Console.tsx +++ b/src/components/Console/Console.tsx @@ -22,7 +22,7 @@ const Console: React.FC = () => { const key = createKey(index); const isObject = typeof item === 'object' && item !== null; const str = JSON.stringify(item); - const space = isObject && str.length > 60 ? 2 : 0; + const space = isObject && str.length > 60 ? 3 : 0; return ( <div key={key} className="py-1.5"> diff --git a/src/components/ContextMenu/ContextMenu.spec.tsx b/src/components/ContextMenu/ContextMenu.spec.tsx deleted file mode 100644 index 06f1e4e..0000000 --- a/src/components/ContextMenu/ContextMenu.spec.tsx +++ /dev/null @@ -1,20 +0,0 @@ -import { render, screen } from '@testing-library/react'; -import ContextMenu from 'components/ContextMenu'; - -describe('<ContextMenu/>', () => { - const props: ContextMenuProps = { - position: { left: 1, top: 1 }, - onClick: jest.fn(), - onClose: jest.fn(), - }; - it('does not render if position is not defined', () => { - render(<ContextMenu {...props} position={null} />); - expect(screen.queryByTestId('app-context-menu')).not.toBeInTheDocument(); - }); - - it('render context menu when position is defined', () => { - render(<ContextMenu {...props} />); - const menuItem = screen.queryByTestId('app-context-menu'); - expect(menuItem).toBeInTheDocument(); - }); -}); diff --git a/src/components/ContextMenu/ContextMenu.tsx b/src/components/ContextMenu/ContextMenu.tsx deleted file mode 100644 index e87111b..0000000 --- a/src/components/ContextMenu/ContextMenu.tsx +++ /dev/null @@ -1,29 +0,0 @@ -import Clickable from 'components/Clickable'; - -const ContextMenu: React.FC<ContextMenuProps> = ({ - position, - onClose, - onClick, -}) => { - if (!position) return null; - - return ( - <ul - data-testid="app-context-menu" - className="menu" - style={{ - top: `${position.top}px`, - left: `${position.left}px`, - }} - > - <li> - <Clickable onClick={onClick}>View JSON</Clickable> - </li> - <li> - <Clickable onClick={onClose}>Close</Clickable> - </li> - </ul> - ); -}; - -export default ContextMenu; diff --git a/src/components/ContextMenu/index.tsx b/src/components/ContextMenu/index.tsx deleted file mode 100644 index 9cb8a35..0000000 --- a/src/components/ContextMenu/index.tsx +++ /dev/null @@ -1 +0,0 @@ -export { default } from 'components/ContextMenu/ContextMenu'; diff --git a/src/components/ContextMenu/types.d.ts b/src/components/ContextMenu/types.d.ts deleted file mode 100644 index 7b32c36..0000000 --- a/src/components/ContextMenu/types.d.ts +++ /dev/null @@ -1,9 +0,0 @@ -interface MenuPosition { - top: number; - left: number; -} -interface ContextMenuProps { - position: MenuPosition | null; - onClose: VoidFunction; - onClick: VoidFunction; -} diff --git a/src/context/AppContext.tsx b/src/context/AppContext.tsx index 704a1da..45a2084 100644 --- a/src/context/AppContext.tsx +++ b/src/context/AppContext.tsx @@ -11,7 +11,6 @@ const initialState: AppState = { error: '', loading: false, display: 'none', - position: null, historyModalShown: false, }; diff --git a/src/context/Reducer.test.ts b/src/context/Reducer.test.ts index 0d0b400..73b7990 100644 --- a/src/context/Reducer.test.ts +++ b/src/context/Reducer.test.ts @@ -9,7 +9,6 @@ describe('Reducer tests', () => { error: '', loading: false, display: 'none', - position: null, historyModalShown: false, sidebarOpen: false, }; diff --git a/src/context/types.d.ts b/src/context/types.d.ts index 44c4b8c..522f64a 100644 --- a/src/context/types.d.ts +++ b/src/context/types.d.ts @@ -8,22 +8,18 @@ type AppState = { error: string; loading: boolean; display: DisplayType; - position: null; historyModalShown: boolean; sidebarOpen: boolean; }; -type Action = { - type: string; - payload?: unknown; // FIXME: +type Payload = { + codeSample?: string; + codeSampleName?: string; }; -type Payload = { +type Action = { type: string; - payload?: { - codeSample?: string; - codeSampleName?: string; - }; + payload?: Payload | string; }; type ActionBarChildItem = Pick<ActionBarItem, 'label' | 'payload'>; @@ -31,6 +27,6 @@ type ActionBarChildItem = Pick<ActionBarItem, 'label' | 'payload'>; type ActionBarItem = { label: string; icon: React.FC<React.SVGProps<SVGSVGElement>>; - payload?: Payload; + payload?: Action; children?: ActionBarChildItem[]; }; diff --git a/src/hooks/useCodeRunner.tsx b/src/hooks/useCodeRunner.tsx index cc1e9ad..6d6cc5e 100644 --- a/src/hooks/useCodeRunner.tsx +++ b/src/hooks/useCodeRunner.tsx @@ -6,7 +6,7 @@ import { AppActions } from 'context/Reducer'; const useCodeRunner = () => { const { dispatch } = useContext(AppContext); - const evalCode = (code: string) => + const evalCode = (code: string): Promise<string> => new Promise((resolve, reject) => { try { const result = eval(code); From 80e66b92fb56203bd5ffe3bbfc0c7ddb1f084327 Mon Sep 17 00:00:00 2001 From: Khalid Elshafie <abolkog@gmail.com> Date: Fri, 23 May 2025 10:32:42 +1000 Subject: [PATCH 4/9] feat: use tailwind for History component --- src/components/App/App.tsx | 3 + src/components/History/History.test.tsx | 79 ++++++++++++ src/components/History/History.tsx | 121 ++++++++++++++++++ src/components/History/index.tsx | 1 + .../HistoryModal/HistoryModal.spec.tsx | 77 ----------- src/components/HistoryModal/HistoryModal.tsx | 78 ----------- src/components/HistoryModal/index.tsx | 1 - src/components/Layout/ActionBar.tsx | 2 +- src/context/AppContext.tsx | 2 +- src/context/Reducer.test.ts | 2 +- src/context/Reducer.ts | 13 +- src/context/types.d.ts | 2 +- 12 files changed, 218 insertions(+), 163 deletions(-) create mode 100644 src/components/History/History.test.tsx create mode 100644 src/components/History/History.tsx create mode 100644 src/components/History/index.tsx delete mode 100644 src/components/HistoryModal/HistoryModal.spec.tsx delete mode 100644 src/components/HistoryModal/HistoryModal.tsx delete mode 100644 src/components/HistoryModal/index.tsx diff --git a/src/components/App/App.tsx b/src/components/App/App.tsx index 2fe9cba..00faf95 100644 --- a/src/components/App/App.tsx +++ b/src/components/App/App.tsx @@ -4,6 +4,7 @@ import Console from 'components/Console'; import { useContext, useEffect } from 'react'; import { AppContext } from 'context/AppContext'; import { AppActions } from 'context/Reducer'; +import History from 'components/History'; const App: React.FC = () => { const { dispatch } = useContext(AppContext); @@ -33,6 +34,8 @@ const App: React.FC = () => { <Console /> </Split> + + <History /> </div> ); }; diff --git a/src/components/History/History.test.tsx b/src/components/History/History.test.tsx new file mode 100644 index 0000000..85a9bd7 --- /dev/null +++ b/src/components/History/History.test.tsx @@ -0,0 +1,79 @@ +import React from 'react'; +import { fireEvent, act, render, screen } from '@testing-library/react'; +import { AppContext } from 'context/AppContext'; +import { AppActions } from 'context/Reducer'; +import History from 'components/History'; +import * as StorageService from 'services/storage'; + +const getHistorySpy = jest.spyOn(StorageService, 'getHistory'); +const mockHistory = [ + { + date: 'second', + code: 'const a = 10', + }, + { + date: 'first', + code: 'const b = 20', + }, +]; + +describe('<History />', () => { + const state = { + historyOpen: true, + } as AppState; + const dispatch = jest.fn(); + + beforeEach(async () => { + getHistorySpy.mockReturnValue([...mockHistory]); + await act(async () => { + render( + <AppContext.Provider value={{ state, dispatch }}> + <History /> + </AppContext.Provider>, + ); + }); + }); + + afterEach(jest.clearAllMocks); + + it('render history list', () => { + const historyElement = screen.getByTestId('history-container'); + expect(historyElement.children.length).toEqual(2); + }); + + it('calls closes the modal on button click', () => { + const closeButton = screen.getByTestId('history-close-btn'); + fireEvent.click(closeButton); + + expect(dispatch).toHaveBeenCalledWith({ + type: AppActions.HIDE_HISTORY, + }); + }); + + it('restores history when restore button is clicked', async () => { + // Expand + const disclosureButtons = await screen.findAllByRole('button'); + for (const btn of disclosureButtons) { + if (btn.textContent !== 'Restore') { + await act(async () => { + fireEvent.click(btn); + }); + } + } + + const restoreButtons = await screen.findAllByRole('button', { + name: /Restore/, + }); + await act(async () => { + fireEvent.click(restoreButtons[0]); + }); + + expect(dispatch).toHaveBeenCalledWith({ + type: AppActions.LOAD_CODE_SAMPLE, + payload: { + codeSample: mockHistory[1].code, + codeSampleName: '', + }, + }); + }); +}); diff --git a/src/components/History/History.tsx b/src/components/History/History.tsx new file mode 100644 index 0000000..9782fb5 --- /dev/null +++ b/src/components/History/History.tsx @@ -0,0 +1,121 @@ +import { useContext } from 'react'; +import { + Dialog, + DialogPanel, + DialogTitle, + Disclosure, + DisclosureButton, + DisclosurePanel, +} from '@headlessui/react'; +import { ChevronDownIcon } from '@heroicons/react/20/solid'; +import { XMarkIcon } from '@heroicons/react/24/outline'; +import { AppContext } from 'context/AppContext'; +import { AppActions } from 'context/Reducer'; +import { getHistory } from 'services/storage'; + +const History: React.FC = () => { + const { state, dispatch } = useContext(AppContext); + + const history = getHistory(); + + const makeKey = (item: HistoryItem, index: number) => `${item.date}_${index}`; + + const handleRestore = (item: HistoryItem) => () => { + const payload = { + codeSample: item.code, + codeSampleName: '', + }; + + dispatch({ type: AppActions.LOAD_CODE_SAMPLE, payload }); + }; + + return ( + <Dialog + open={state.historyOpen} + onClose={() => dispatch({ type: AppActions.HIDE_HISTORY })} + className="relative z-10" + > + <div className="fixed inset-0" /> + + <div className="fixed inset-0 overflow-hidden"> + <div className="absolute inset-0 overflow-hidden"> + <div className="pointer-events-none fixed inset-y-0 right-0 flex max-w-full pl-10 sm:pl-16"> + <DialogPanel + transition + className="pointer-events-auto w-screen max-w-2xl transform transition duration-500 ease-in-out data-closed:translate-x-full sm:duration-700" + > + <div className="flex h-full flex-col overflow-y-scroll bg-gray-900 text-white py-6 shadow-xl"> + <div className="px-4 sm:px-6"> + <div className="flex items-start justify-between"> + <DialogTitle className="text-base font-semibold text-white"> + Code History + </DialogTitle> + <div className="ml-3 flex h-7 items-center"> + <button + data-testid="history-close-btn" + type="button" + onClick={() => + dispatch({ type: AppActions.HIDE_HISTORY }) + } + className="relative rounded-md bg-gray-900 text-white hover:text-gray-100 focus:ring-2 focus:ring-indigo-500 focus:ring-offset-2 focus:outline-hidden cursor-pointer" + > + <span className="absolute -inset-2.5" /> + <span className="sr-only">Close</span> + <XMarkIcon aria-hidden="true" className="size-6" /> + </button> + </div> + </div> + </div> + <div className="relative mt-6 flex-1 px-4 sm:px-6"> + <div className="h-screen w-full"> + <div + className="w-full divide-y divide-white/5 rounded-xl bg-white/5" + data-testid="history-container" + > + {[...history].reverse().map((item, index) => { + return ( + <Disclosure + as="div" + key={makeKey(item, index)} + className="p-6" + > + <DisclosureButton className="group flex w-full items-center justify-between cursor-pointer"> + <span className="text-sm/6 font-medium text-white group-data-hover:text-white/80"> + ({item.date} #({index + 1})){' - '} + {item.code.slice(0, 50)}... + </span> + <ChevronDownIcon className="size-5 fill-white/60 group-data-hover:fill-white/50 group-data-open:rotate-180" /> + </DisclosureButton> + <DisclosurePanel className="mt-2 text-sm/5 text-white/50"> + <pre + className=" + bg-gray-800 text-green-200 rounded p-4 font-mono text-xs whitespace-pre-wrap break-words overflow-x-auto border border-gray-700 shadow-inner max-h-64" + > + {item.code} + </pre> + <div className="flex justify-end mt-4"> + <button + type="button" + className="bg-gray-900 text-green-200 rounded px-4 py-1 border border-gray-700 shadow hover:bg-gray-700 hover:text-green-100 focus:outline-none focus:ring-2 focus:ring-green-400 transition cursor-pointer" + onClick={handleRestore(item)} + > + Restore + </button> + </div> + </DisclosurePanel> + </Disclosure> + ); + })} + </div> + </div> + </div> + </div> + </DialogPanel> + </div> + </div> + </div> + </Dialog> + ); +}; + +export default History; diff --git a/src/components/History/index.tsx b/src/components/History/index.tsx new file mode 100644 index 0000000..43c8ad7 --- /dev/null +++ b/src/components/History/index.tsx @@ -0,0 +1 @@ +export { default } from 'components/History/History'; diff --git a/src/components/HistoryModal/HistoryModal.spec.tsx b/src/components/HistoryModal/HistoryModal.spec.tsx deleted file mode 100644 index 23b693e..0000000 --- a/src/components/HistoryModal/HistoryModal.spec.tsx +++ /dev/null @@ -1,77 +0,0 @@ -import React from 'react'; -import { fireEvent, render, screen } from '@testing-library/react'; -import { AppContext } from 'context/AppContext'; -import { AppActions } from 'context/Reducer'; -import HistoryModal from 'components/HistoryModal'; -import * as StorageService from 'services/storage'; - -const getHistorySpy = jest.spyOn(StorageService, 'getHistory'); -const mockHistory = [ - { - date: 'second', - code: 'const a = 10', - }, - { - date: 'first', - code: 'const b = 20', - }, -]; - -describe('<HistoryModal />', () => { - const state = { - historyModalShown: true, - } as AppState; - const mockSetState = jest.fn(); - const dispatch = jest.fn(); - - beforeEach(() => { - getHistorySpy.mockReturnValue(mockHistory); - jest.spyOn(React, 'useState').mockReturnValue([0, mockSetState]); - render( - <AppContext.Provider value={{ state, dispatch }}> - <HistoryModal /> - </AppContext.Provider> - ); - }); - - afterEach(jest.clearAllMocks); - - it('render history list', () => { - const historyElement = screen.getByTestId('history-accordion'); - expect(historyElement.children.length).toEqual(2); - }); - - it('calls closes the modal on button click', () => { - fireEvent.click(screen.getByTestId('modal-close-btn')); - - expect(dispatch).toHaveBeenCalledWith({ - type: AppActions.TOGGLE_HISTORY_MODAL, - }); - }); - - describe('when restoring history', () => { - const historyItemIndex = 0; - beforeEach(async () => { - const restoreButtons = await screen.findAllByRole('button', { - name: /Restore/, - }); - fireEvent.click(restoreButtons[historyItemIndex]); - }); - - it('restore history when restore button click', () => { - expect(dispatch).toHaveBeenNthCalledWith(1, { - type: AppActions.LOAD_CODE_SAMPLE, - payload: { - codeSample: mockHistory[historyItemIndex].code, - codeSampleName: '', - }, - }); - }); - - it('dismiss the modal', () => { - expect(dispatch).toHaveBeenNthCalledWith(2, { - type: AppActions.TOGGLE_HISTORY_MODAL, - }); - }); - }); -}); diff --git a/src/components/HistoryModal/HistoryModal.tsx b/src/components/HistoryModal/HistoryModal.tsx deleted file mode 100644 index 7bf8393..0000000 --- a/src/components/HistoryModal/HistoryModal.tsx +++ /dev/null @@ -1,78 +0,0 @@ -import { useContext, useState } from 'react'; -import { AppContext } from 'context/AppContext'; -import Modal from 'components/Modal'; -import { AppActions } from 'context/Reducer'; -import { getHistory } from 'services/storage'; - -const HistoryModal: React.FC = () => { - const { state, dispatch } = useContext(AppContext); - const [activeIndex, setActiveIndex] = useState(-1); - - const history = getHistory(); - - const makeKey = (item: HistoryItem, index: number) => `${item.date}_${index}`; - - const handleHeaderButtonClick = (index: number) => { - if (index === activeIndex) { - setActiveIndex(-1); - } else setActiveIndex(index); - }; - - const handleRestore = (item: HistoryItem) => () => { - const payload = { - codeSample: item.code, - codeSampleName: '', - }; - - dispatch({ type: AppActions.LOAD_CODE_SAMPLE, payload }); - dispatch({ type: AppActions.TOGGLE_HISTORY_MODAL }); - }; - - return ( - <Modal - isOpen={state.historyModalShown} - onClose={() => dispatch({ type: AppActions.TOGGLE_HISTORY_MODAL })} - title="Code History" - > - <div className="accordion" data-testid="history-accordion"> - {history.reverse().map((item, index) => { - const isActive = index === activeIndex; - return ( - <div className="accordion-item" key={makeKey(item, index)}> - <h2 className="accordion-header"> - <button - className={`accordion-button ${isActive ? '' : 'collapsed'}`} - type="button" - onClick={() => handleHeaderButtonClick(index)} - > - ({item.date} #({index + 1})){' - '} - {item.code.slice(0, 100)} - </button> - </h2> - <div - className={`accordion-collapse collapse ${ - isActive ? 'show' : '' - }`} - > - <div className="accordion-body"> - <pre>{item.code}</pre> - <div className="d-flex justify-content-end"> - <button - type="button" - className="btn btn-success" - onClick={handleRestore(item)} - > - Restore - </button> - </div> - </div> - </div> - </div> - ); - })} - </div> - </Modal> - ); -}; - -export default HistoryModal; diff --git a/src/components/HistoryModal/index.tsx b/src/components/HistoryModal/index.tsx deleted file mode 100644 index 7f283bf..0000000 --- a/src/components/HistoryModal/index.tsx +++ /dev/null @@ -1 +0,0 @@ -export { default } from 'components/HistoryModal/HistoryModal'; diff --git a/src/components/Layout/ActionBar.tsx b/src/components/Layout/ActionBar.tsx index e11f6de..b3722f1 100644 --- a/src/components/Layout/ActionBar.tsx +++ b/src/components/Layout/ActionBar.tsx @@ -39,7 +39,7 @@ const actionBarItems: ActionBarItem[] = [ { label: 'History', icon: ClockIcon, - payload: { type: AppActions.TOGGLE_HISTORY_MODAL }, + payload: { type: AppActions.SHOW_HISTORY }, }, { label: 'Code Samples', diff --git a/src/context/AppContext.tsx b/src/context/AppContext.tsx index 45a2084..4051ca1 100644 --- a/src/context/AppContext.tsx +++ b/src/context/AppContext.tsx @@ -11,7 +11,7 @@ const initialState: AppState = { error: '', loading: false, display: 'none', - historyModalShown: false, + historyOpen: false, }; export const AppContext = createContext<{ diff --git a/src/context/Reducer.test.ts b/src/context/Reducer.test.ts index 73b7990..f8d336d 100644 --- a/src/context/Reducer.test.ts +++ b/src/context/Reducer.test.ts @@ -9,8 +9,8 @@ describe('Reducer tests', () => { error: '', loading: false, display: 'none', - historyModalShown: false, sidebarOpen: false, + historyOpen: false, }; it('update and persist code when update code action is dispatched', () => { diff --git a/src/context/Reducer.ts b/src/context/Reducer.ts index a86750c..89b275f 100644 --- a/src/context/Reducer.ts +++ b/src/context/Reducer.ts @@ -9,9 +9,10 @@ export const AppActions = { TOGGLE_ABOUT_MODAL: 'TOGGLE_ABOUT_MODAL', CLEAR_RESULT: 'CLEAR_RESULT', LOAD_CODE_SAMPLE: 'LOAD_CODE_SAMPLE', - TOGGLE_HISTORY_MODAL: 'TOGGLE_HISTORY_MODAL', SHOW_SIDEBAR: 'SHOW_SIDEBAR', HIDE_SIDEBAR: 'HIDE_SIDEBAR', + SHOW_HISTORY: 'SHOW_HISTORY', + HIDE_HISTORY: 'HIDE_HISTORY', }; const handleCodeUpdate = (state: AppState, action: Action): AppState => { @@ -61,11 +62,17 @@ export const reducer = (state: AppState, action: Action): AppState => { return handleLoadCodeSample(state, action); case AppActions.CLEAR_RESULT: return { ...state, sidebarOpen: false, result: [] }; - case AppActions.TOGGLE_HISTORY_MODAL: + case AppActions.SHOW_HISTORY: return { ...state, sidebarOpen: false, - historyModalShown: !state.historyModalShown, + historyOpen: true, + }; + case AppActions.HIDE_HISTORY: + return { + ...state, + sidebarOpen: false, + historyOpen: false, }; case AppActions.SHOW_SIDEBAR: return { ...state, sidebarOpen: true }; diff --git a/src/context/types.d.ts b/src/context/types.d.ts index 522f64a..478f381 100644 --- a/src/context/types.d.ts +++ b/src/context/types.d.ts @@ -8,7 +8,7 @@ type AppState = { error: string; loading: boolean; display: DisplayType; - historyModalShown: boolean; + historyOpen: boolean; sidebarOpen: boolean; }; From 5e865afff0b1a38541de39f3f78ac3dfdb89f514 Mon Sep 17 00:00:00 2001 From: Khalid Elshafie <abolkog@gmail.com> Date: Fri, 23 May 2025 11:05:49 +1000 Subject: [PATCH 5/9] feat: update about modal to use tailwind --- src/components/About/About.spec.tsx | 34 ------- src/components/About/About.test.tsx | 26 ++++++ src/components/About/About.tsx | 112 ++++++++++++++++-------- src/components/App/App.tsx | 2 + src/components/Console/Console.test.tsx | 1 - src/components/Layout/ActionBar.tsx | 2 +- src/components/Modal/Modal.tsx | 48 ---------- src/components/Modal/index.tsx | 1 - src/context/AppContext.tsx | 4 +- src/context/Reducer.test.ts | 10 +-- src/context/Reducer.ts | 13 ++- src/context/types.d.ts | 6 +- 12 files changed, 118 insertions(+), 141 deletions(-) delete mode 100644 src/components/About/About.spec.tsx create mode 100644 src/components/About/About.test.tsx delete mode 100644 src/components/Modal/Modal.tsx delete mode 100644 src/components/Modal/index.tsx diff --git a/src/components/About/About.spec.tsx b/src/components/About/About.spec.tsx deleted file mode 100644 index 587bccd..0000000 --- a/src/components/About/About.spec.tsx +++ /dev/null @@ -1,34 +0,0 @@ -import { fireEvent, render, screen } from '@testing-library/react'; -import { LIBRARIES } from 'helpers/const'; -import About from 'components/About'; -import { AppContext } from 'context/AppContext'; -import { AppActions } from 'context/Reducer'; - -describe('<About />', () => { - const state = { - display: 'block', - } as AppState; - const dispatch = jest.fn(); - - beforeEach(() => { - render( - <AppContext.Provider value={{ state, dispatch }}> - <About /> - </AppContext.Provider> - ); - }); - - it('render libraries list', () => { - const listElement = screen.getByTestId('about-libraries-list'); - expect(listElement.children.length).toEqual(LIBRARIES.length); - }); - - it('calls dispatch on button click', () => { - fireEvent.click(screen.getByTestId('modal-close-btn')); - - expect(dispatch).toHaveBeenCalledWith({ - type: AppActions.TOGGLE_ABOUT_MODAL, - payload: 'none', - }); - }); -}); diff --git a/src/components/About/About.test.tsx b/src/components/About/About.test.tsx new file mode 100644 index 0000000..2f0856a --- /dev/null +++ b/src/components/About/About.test.tsx @@ -0,0 +1,26 @@ +import { act, render, screen } from '@testing-library/react'; +import { LIBRARIES } from 'helpers/const'; +import About from 'components/About'; +import { AppContext } from 'context/AppContext'; + +describe('<About />', () => { + const state = { + aboutModalOpen: true, + } as AppState; + const dispatch = jest.fn(); + + beforeEach(async () => { + await act(async () => { + render( + <AppContext.Provider value={{ state, dispatch }}> + <About /> + </AppContext.Provider>, + ); + }); + }); + + it('render libraries list', () => { + const listElement = screen.getByTestId('about-libraries-list'); + expect(listElement.children.length).toEqual(LIBRARIES.length); + }); +}); diff --git a/src/components/About/About.tsx b/src/components/About/About.tsx index e5b5965..f187f50 100644 --- a/src/components/About/About.tsx +++ b/src/components/About/About.tsx @@ -2,53 +2,89 @@ import { useContext } from 'react'; import { LIBRARIES } from 'helpers/const'; import { AppContext } from 'context/AppContext'; import { AppActions } from 'context/Reducer'; -import Modal from 'components/Modal'; +import { Dialog, DialogBackdrop, DialogPanel } from '@headlessui/react'; +import Title from 'components/Layout/Title'; const About: React.FC = () => { const { state, dispatch } = useContext(AppContext); - const open = state.display !== 'none'; - - const handleClose = () => { - dispatch({ type: AppActions.TOGGLE_ABOUT_MODAL, payload: 'none' }); + const closeModal = () => { + dispatch({ + type: AppActions.HIDE_ABOUT_MODAL, + }); }; - return ( - <Modal isOpen={open} onClose={handleClose} title="About JS Playground"> - <p> - JS Playground is an experimental JavaScript PlayGround created for - Education and Testing Purposes - </p> - <div> - This sandbox playground is hooked up directly with - <ul data-testid="about-libraries-list"> - {LIBRARIES.map(lib => ( - <li key={lib.name}> - <div - style={{ - display: 'flex', - flex: 1, - justifyContent: 'space-between', - }} - > - <a href={lib.url} target="_blank" rel="noopener noreferrer"> - {lib.name} <span className="text-sm">v{lib.version}</span> - </a> - <span>Use as {lib.use}</span> + <Dialog + open={state.aboutModalOpen} + onClose={closeModal} + className="relative z-10" + > + <DialogBackdrop + transition + className="fixed inset-0 bg-gray-500/75 transition-opacity data-closed:opacity-0 data-enter:duration-300 data-enter:ease-out data-leave:duration-200 data-leave:ease-in" + /> + + <div className="fixed inset-0 z-10 w-screen overflow-y-auto"> + <div className="flex min-h-full items-end justify-center p-4 text-center sm:items-center sm:p-0"> + <DialogPanel + transition + className="relative transform overflow-hidden rounded-lg bg-gray-900 text-white/60 px-4 pt-5 pb-4 text-left shadow-xl transition-all data-closed:translate-y-4 data-closed:opacity-0 data-enter:duration-300 data-enter:ease-out data-leave:duration-200 data-leave:ease-in sm:my-8 sm:w-full sm:max-w-lg sm:p-6 data-closed:sm:translate-y-0 data-closed:sm:scale-95" + > + <div> + <div className="mt-3 sm:mt-5"> + <Title /> + + <div className="mt-2 flex flex-1 flex-col gap-3"> + <p> + JS Playground is an experimental JavaScript PlayGround + created for Education and Testing Purposes + </p> + <p>This sandbox playground is hooked up directly with</p> + + <ul + data-testid="about-libraries-list" + className="flex flex-1 flex-col gap-3" + > + {LIBRARIES.map(lib => ( + <li key={lib.name}> + <div className="flex justify-between"> + <a + href={lib.url} + target="_blank" + rel="noopener noreferrer" + className="underline hover:text-yellow-500 font-semibold" + > + {lib.name}{' '} + <span className="text-sm">v{lib.version}</span> + </a> + <span> + Use as{' '} + <span className="font-semibold text-yellow-500"> + {lib.use} + </span> + </span> + </div> + </li> + ))} + </ul> + + <p className="mt-4">Enjoy</p> + + <a + href="https://nyala.dev" + target="_blank" + rel="noopener noreferrer" + className="text-yellow-500 font-semibold underline hover:text-yellow-300" + > + Khalid Elshafie + </a> + </div> </div> - </li> - ))} - </ul> - </div> - <p>Enjoy</p> - <div> - <div className="float-left"> - <a href="https://nyala.dev" target="_blank" rel="noopener noreferrer"> - Khalid Elshafie - </a> + </div> + </DialogPanel> </div> </div> - </Modal> + </Dialog> ); }; diff --git a/src/components/App/App.tsx b/src/components/App/App.tsx index 00faf95..e74d68b 100644 --- a/src/components/App/App.tsx +++ b/src/components/App/App.tsx @@ -5,6 +5,7 @@ import { useContext, useEffect } from 'react'; import { AppContext } from 'context/AppContext'; import { AppActions } from 'context/Reducer'; import History from 'components/History'; +import About from 'components/About'; const App: React.FC = () => { const { dispatch } = useContext(AppContext); @@ -36,6 +37,7 @@ const App: React.FC = () => { </Split> <History /> + <About /> </div> ); }; diff --git a/src/components/Console/Console.test.tsx b/src/components/Console/Console.test.tsx index 4ba7124..d0019ff 100644 --- a/src/components/Console/Console.test.tsx +++ b/src/components/Console/Console.test.tsx @@ -8,7 +8,6 @@ describe('<Console />', () => { afterEach(() => { state = { - display: 'block', error: '', result: [''], } as AppState; diff --git a/src/components/Layout/ActionBar.tsx b/src/components/Layout/ActionBar.tsx index b3722f1..ea1e787 100644 --- a/src/components/Layout/ActionBar.tsx +++ b/src/components/Layout/ActionBar.tsx @@ -117,7 +117,7 @@ const ActionBar: React.FC = () => { </li> <li className="-mx-6 mt-auto"> <a - onClick={() => dispatch({ type: AppActions.TOGGLE_ABOUT_MODAL })} + onClick={() => dispatch({ type: AppActions.SHOW_ABOUT_MODAL })} className="text-gray-400 hover:bg-gray-800 hover:text-white group flex gap-x-3 rounded-md p-2 text-sm/6 font-semibold cursor-pointer" > <span className="sr-only">About</span> diff --git a/src/components/Modal/Modal.tsx b/src/components/Modal/Modal.tsx deleted file mode 100644 index 4095633..0000000 --- a/src/components/Modal/Modal.tsx +++ /dev/null @@ -1,48 +0,0 @@ -import React from 'react'; - -interface ModalProps extends React.PropsWithChildren { - isOpen: boolean; - onClose: () => void; - title?: string; -} - -const Modal: React.FC<ModalProps> = ({ isOpen, title, onClose, children }) => { - if (!isOpen) return null; - - return ( - <div className="modal fade show" style={{ display: 'block' }}> - <div className="modal-dialog" style={{ maxWidth: 1200 }}> - <div className="modal-content"> - <div className="modal-header text-white bg-dark"> - <h5 className="modal-title">{title}</h5> - <button - type="button" - className="btn-close btn-close-white" - onClick={onClose} - > - <span className="visually-hidden">Close</span> - </button> - </div> - <div - className="modal-body" - style={{ maxHeight: '600px', overflowY: 'auto' }} - > - <div>{children}</div> - </div> - <div className="modal-footer"> - <button - data-testid="modal-close-btn" - type="button" - className="btn btn-primary" - onClick={onClose} - > - Close - </button> - </div> - </div> - </div> - </div> - ); -}; - -export default Modal; diff --git a/src/components/Modal/index.tsx b/src/components/Modal/index.tsx deleted file mode 100644 index 447a140..0000000 --- a/src/components/Modal/index.tsx +++ /dev/null @@ -1 +0,0 @@ -export { default } from 'components/Modal/Modal'; diff --git a/src/context/AppContext.tsx b/src/context/AppContext.tsx index 4051ca1..42475e1 100644 --- a/src/context/AppContext.tsx +++ b/src/context/AppContext.tsx @@ -3,15 +3,15 @@ import { getLocalStorage, STORAGE } from 'services/storage'; import { reducer } from 'context/Reducer'; const initialState: AppState = { - sidebarOpen: false, code: getLocalStorage(STORAGE.CODE), codeSample: '', codeSampleName: '', result: [], error: '', loading: false, - display: 'none', + sidebarOpen: false, historyOpen: false, + aboutModalOpen: false, }; export const AppContext = createContext<{ diff --git a/src/context/Reducer.test.ts b/src/context/Reducer.test.ts index f8d336d..0b6f61b 100644 --- a/src/context/Reducer.test.ts +++ b/src/context/Reducer.test.ts @@ -8,9 +8,9 @@ describe('Reducer tests', () => { result: [], error: '', loading: false, - display: 'none', sidebarOpen: false, historyOpen: false, + aboutModalOpen: false, }; it('update and persist code when update code action is dispatched', () => { @@ -53,14 +53,6 @@ describe('Reducer tests', () => { expect(state.error).toEqual('error'); }); - it('update about modal flag when toggle modal action is dispatched', () => { - const state = reducer(INITIAL_STATE, { - type: AppActions.TOGGLE_ABOUT_MODAL, - payload: 'block', - }); - expect(state.display).toEqual('block'); - }); - it('update code sample value when load code sample action is dispatched', () => { const payload = { codeSample: 'axios code', diff --git a/src/context/Reducer.ts b/src/context/Reducer.ts index 89b275f..9a7c4d6 100644 --- a/src/context/Reducer.ts +++ b/src/context/Reducer.ts @@ -6,13 +6,14 @@ export const AppActions = { CODE_RUNNING: 'CODE_RUNNING', CODE_RUN_SUCCESS: 'CODE_RUN_SUCCESS', CODE_RUN_ERROR: 'CODE_RUN_ERROR', - TOGGLE_ABOUT_MODAL: 'TOGGLE_ABOUT_MODAL', CLEAR_RESULT: 'CLEAR_RESULT', LOAD_CODE_SAMPLE: 'LOAD_CODE_SAMPLE', SHOW_SIDEBAR: 'SHOW_SIDEBAR', HIDE_SIDEBAR: 'HIDE_SIDEBAR', SHOW_HISTORY: 'SHOW_HISTORY', HIDE_HISTORY: 'HIDE_HISTORY', + SHOW_ABOUT_MODAL: 'SHOW_ABOUT_MODAL', + HIDE_ABOUT_MODAL: 'HIDE_ABOUT_MODAL', }; const handleCodeUpdate = (state: AppState, action: Action): AppState => { @@ -52,11 +53,17 @@ export const reducer = (state: AppState, action: Action): AppState => { return handleCodeSuccess(state, action); case AppActions.CODE_RUN_ERROR: return { ...state, error: action.payload as string, loading: false }; - case AppActions.TOGGLE_ABOUT_MODAL: + case AppActions.SHOW_ABOUT_MODAL: return { ...state, sidebarOpen: false, - display: action.payload as DisplayType, + aboutModalOpen: true, + }; + case AppActions.HIDE_ABOUT_MODAL: + return { + ...state, + sidebarOpen: false, + aboutModalOpen: false, }; case AppActions.LOAD_CODE_SAMPLE: return handleLoadCodeSample(state, action); diff --git a/src/context/types.d.ts b/src/context/types.d.ts index 478f381..b578cef 100644 --- a/src/context/types.d.ts +++ b/src/context/types.d.ts @@ -1,5 +1,3 @@ -type DisplayType = 'none' | 'block'; // FIXME: remove ? - type AppState = { code: string; codeSample: string; @@ -7,9 +5,9 @@ type AppState = { result: unknown[]; error: string; loading: boolean; - display: DisplayType; - historyOpen: boolean; sidebarOpen: boolean; + historyOpen: boolean; + aboutModalOpen: boolean; }; type Payload = { From 3033c4aec010f7eb78ecf625e29b64f265f8796f Mon Sep 17 00:00:00 2001 From: Khalid Elshafie <abolkog@gmail.com> Date: Fri, 23 May 2025 11:15:37 +1000 Subject: [PATCH 6/9] chore: cleanup unused library --- package-lock.json | 6 ------ package.json | 1 - src/styles/App.css | 15 ++++++++------- 3 files changed, 8 insertions(+), 14 deletions(-) diff --git a/package-lock.json b/package-lock.json index ef80f46..08c0d01 100644 --- a/package-lock.json +++ b/package-lock.json @@ -16,7 +16,6 @@ "date-fns": "^4.1.0", "eslint-plugin-react": "^7.37.2", "gh-pages": "^6.2.0", - "github-fork-ribbon-css": "^0.2.3", "lodash": "^4.17.21", "luxon": "^3.5.0", "lz-string": "^1.5.0", @@ -7252,11 +7251,6 @@ "traverse": "0.6.8" } }, - "node_modules/github-fork-ribbon-css": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/github-fork-ribbon-css/-/github-fork-ribbon-css-0.2.3.tgz", - "integrity": "sha512-cmGBV4sivRwmnteSOkqMjN2cnP5/J1SU5aDCVYsBWHmDokZ/JjwGEkduCxY9IULHdCPpw1WSk5Cy8N1LF6jOEw==" - }, "node_modules/glob": { "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", diff --git a/package.json b/package.json index 0b1bfc3..5522266 100644 --- a/package.json +++ b/package.json @@ -48,7 +48,6 @@ "date-fns": "^4.1.0", "eslint-plugin-react": "^7.37.2", "gh-pages": "^6.2.0", - "github-fork-ribbon-css": "^0.2.3", "lodash": "^4.17.21", "luxon": "^3.5.0", "lz-string": "^1.5.0", diff --git a/src/styles/App.css b/src/styles/App.css index 25205b3..365eba9 100644 --- a/src/styles/App.css +++ b/src/styles/App.css @@ -1,18 +1,19 @@ -@import "tailwindcss"; +@import 'tailwindcss'; @theme { - --font-sans: InterVariable, sans-serif; + --font-sans: InterVariable, sans-serif; } .split { - display: flex; - height: 100%; + display: flex; + height: 100%; } .gutter { - background-color: #444; - cursor: col-resize; + background-color: #444; + cursor: col-resize; } .gutter.gutter-horizontal { - width: 6px; } \ No newline at end of file + width: 6px; +} From 312ba6e2ca899ae5a0e72f20b82d7323b5df6d2b Mon Sep 17 00:00:00 2001 From: Khalid Elshafie <abolkog@gmail.com> Date: Mon, 26 May 2025 11:55:00 +1000 Subject: [PATCH 7/9] feat: add share code functionality --- eslint.config.mjs | 8 ++ src/components/App/App.tsx | 17 ++++ src/components/Layout/ActionBar.tsx | 34 +++++++- src/components/ShareCode/ShareCode.test.tsx | 60 ++++++++++++++ src/components/ShareCode/ShareCode.tsx | 86 +++++++++++++++++++++ src/components/ShareCode/index.tsx | 1 + src/context/AppContext.tsx | 1 + src/context/Reducer.test.ts | 1 + src/context/Reducer.ts | 6 ++ src/context/types.d.ts | 1 + src/helpers/const.ts | 2 + 11 files changed, 215 insertions(+), 2 deletions(-) create mode 100644 src/components/ShareCode/ShareCode.test.tsx create mode 100644 src/components/ShareCode/ShareCode.tsx create mode 100644 src/components/ShareCode/index.tsx diff --git a/eslint.config.mjs b/eslint.config.mjs index b255320..1dbe093 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -39,6 +39,14 @@ export default [ 'react/jsx-uses-vars': 'error', 'react/prop-types': 'off', '@typescript-eslint/consistent-type-definitions': ['error', 'type'], + '@typescript-eslint/no-unused-vars': [ + 'error', + { + argsIgnorePattern: '^_', + varsIgnorePattern: '^_', + caughtErrorsIgnorePattern: '^_', + }, + ], }, }, ]; diff --git a/src/components/App/App.tsx b/src/components/App/App.tsx index e74d68b..bd32cba 100644 --- a/src/components/App/App.tsx +++ b/src/components/App/App.tsx @@ -6,6 +6,8 @@ import { AppContext } from 'context/AppContext'; import { AppActions } from 'context/Reducer'; import History from 'components/History'; import About from 'components/About'; +import ShareCode from 'components/ShareCode'; +import { decompressFromEncodedURIComponent } from 'lz-string'; const App: React.FC = () => { const { dispatch } = useContext(AppContext); @@ -16,6 +18,20 @@ const App: React.FC = () => { dispatch({ type: AppActions.CODE_RUN_SUCCESS, payload: msg }); consoleProxy(msg); }; + + try { + const params = new URLSearchParams(window.location.search); + const codeParam = params.get('code'); + if (codeParam) { + const payload = { + codeSample: decompressFromEncodedURIComponent(codeParam), + codeSampleName: 'URL Code', + }; + dispatch({ type: AppActions.LOAD_CODE_SAMPLE, payload }); + } + } catch (_) { + // Ignore errors in URL parsing or decompression + } }, []); return ( @@ -38,6 +54,7 @@ const App: React.FC = () => { <History /> <About /> + <ShareCode /> </div> ); }; diff --git a/src/components/Layout/ActionBar.tsx b/src/components/Layout/ActionBar.tsx index ea1e787..85e247c 100644 --- a/src/components/Layout/ActionBar.tsx +++ b/src/components/Layout/ActionBar.tsx @@ -1,3 +1,4 @@ +import { useContext, useEffect, useState } from 'react'; import { Disclosure, DisclosureButton, @@ -6,16 +7,17 @@ import { import { ChevronRightIcon } from '@heroicons/react/20/solid'; import { PlayIcon, + ShareIcon, TrashIcon, CodeBracketIcon, ClockIcon, } from '@heroicons/react/24/solid'; +import { compressToEncodedURIComponent } from 'lz-string'; import Spinner from 'components/Spinner'; import { AppContext } from 'context/AppContext'; import { AppActions } from 'context/Reducer'; -import { CODE_SAMPLES } from 'helpers/const'; +import { CODE_SAMPLES, MAX_SHARE_CODE_LENGTH } from 'helpers/const'; import useCodeRunner from 'hooks/useCodeRunner'; -import { useContext } from 'react'; const codeSampleToMenu = CODE_SAMPLES.map(sample => { const { codeSample, name } = sample; @@ -51,6 +53,23 @@ const actionBarItems: ActionBarItem[] = [ const ActionBar: React.FC = () => { const { state, dispatch } = useContext(AppContext); const { runCode } = useCodeRunner(); + const [showShareButton, setShowShareButton] = useState(false); + + useEffect(() => { + const { code } = state; + const showShareButton = code.length > 0; + setShowShareButton(showShareButton); + }, [state.code.length]); + + const onShareButtonClick = () => { + const compressedCode = compressToEncodedURIComponent(state.code); + const shareUrl = `${window.location.origin}/?code=${compressedCode}`; + if (shareUrl.length > MAX_SHARE_CODE_LENGTH) { + alert('The code is too long to share. Please reduce the code length.'); + return; + } + dispatch({ type: AppActions.SET_SHARE_URL, payload: shareUrl }); + }; return ( <nav className="flex flex-1 flex-col"> @@ -113,6 +132,17 @@ const ActionBar: React.FC = () => { )} </li> ))} + {showShareButton && ( + <li> + <a + onClick={onShareButtonClick} + className="text-amber-400 hover:bg-gray-800 hover:amber-600 group flex gap-x-3 rounded-md p-2 text-sm/6 font-semibold cursor-pointer" + > + Share Code + <ShareIcon aria-hidden="true" className="size-5 shrink-0" /> + </a> + </li> + )} </ul> </li> <li className="-mx-6 mt-auto"> diff --git a/src/components/ShareCode/ShareCode.test.tsx b/src/components/ShareCode/ShareCode.test.tsx new file mode 100644 index 0000000..c8e0a05 --- /dev/null +++ b/src/components/ShareCode/ShareCode.test.tsx @@ -0,0 +1,60 @@ +import { act, fireEvent, render, screen } from '@testing-library/react'; +import ShareCode from 'components/ShareCode'; +import { AppContext } from 'context/AppContext'; + +describe('<ShareCode />', () => { + const state = { + shareUrl: 'https://abolkog.github.io/js-playground/?code=sample', + } as AppState; + const dispatch = jest.fn(); + + beforeEach(jest.clearAllMocks); + + it('it render share code modal', async () => { + await act(async () => { + render( + <AppContext.Provider value={{ state, dispatch }}> + <ShareCode /> + </AppContext.Provider>, + ); + }); + const shareTextBox = screen.getByRole('textbox'); + expect(shareTextBox).toBeInTheDocument(); + expect(shareTextBox).toHaveValue(state.shareUrl); + }); + + it('it copy url to clip board on button click', async () => { + Object.defineProperty(global.navigator, 'clipboard', { + value: { + writeText: jest.fn().mockResolvedValue(undefined), + }, + configurable: true, + }); + const clipboardWriteText = jest.spyOn(navigator.clipboard, 'writeText'); + + await act(async () => { + render( + <AppContext.Provider value={{ state, dispatch }}> + <ShareCode /> + </AppContext.Provider>, + ); + }); + const shareButton = screen.getByRole('button'); + fireEvent.click(shareButton); + expect(clipboardWriteText).toHaveBeenCalledWith(state.shareUrl); + }); + + it('it does not render share modal when no url', async () => { + await act(async () => { + render( + <AppContext.Provider + value={{ state: { ...state, shareUrl: '' }, dispatch }} + > + <ShareCode /> + </AppContext.Provider>, + ); + }); + const shareTextBox = screen.queryByRole('textbox'); + expect(shareTextBox).not.toBeInTheDocument(); + }); +}); diff --git a/src/components/ShareCode/ShareCode.tsx b/src/components/ShareCode/ShareCode.tsx new file mode 100644 index 0000000..f263d18 --- /dev/null +++ b/src/components/ShareCode/ShareCode.tsx @@ -0,0 +1,86 @@ +import { useContext } from 'react'; +import { AppContext } from 'context/AppContext'; +import { AppActions } from 'context/Reducer'; +import { + Dialog, + DialogBackdrop, + DialogPanel, + DialogTitle, +} from '@headlessui/react'; +import { ShareIcon, ClipboardDocumentIcon } from '@heroicons/react/24/outline'; + +const ShareCode: React.FC = () => { + const { state, dispatch } = useContext(AppContext); + + const closeModal = () => { + dispatch({ + type: AppActions.SET_SHARE_URL, + payload: '', + }); + }; + + const onShareButtonClick = async () => { + await navigator.clipboard.writeText(state.shareUrl); + closeModal(); + }; + + return ( + <Dialog + open={state.shareUrl.length > 0} + onClose={closeModal} + className="relative z-10" + > + <DialogBackdrop + transition + className="fixed inset-0 bg-gray-500/75 transition-opacity data-closed:opacity-0 data-enter:duration-300 data-enter:ease-out data-leave:duration-200 data-leave:ease-in" + /> + + <div className="fixed inset-0 z-10 w-screen overflow-y-auto"> + <div className="flex min-h-full items-end justify-center p-4 text-center sm:items-center sm:p-0"> + <DialogPanel + transition + className="relative transform overflow-hidden rounded-lg bg-gray-900 text-white/60 px-4 pt-5 pb-4 text-left shadow-xl transition-all data-closed:translate-y-4 data-closed:opacity-0 data-enter:duration-300 data-enter:ease-out data-leave:duration-200 data-leave:ease-in sm:my-8 sm:w-full sm:max-w-lg sm:p-6 data-closed:sm:translate-y-0 data-closed:sm:scale-95" + > + <div> + <div className="mx-auto flex size-12 items-center justify-center rounded-full bg-green-100"> + <ShareIcon + aria-hidden="true" + className="size-6 text-green-600" + /> + </div> + <div className="mt-3 text-center sm:mt-5"> + <DialogTitle + as="h3" + className="text-base font-semibold text-yellow-500" + > + Share your code + </DialogTitle> + <p>Use the following URL to share code</p> + <div className="mt-2"> + <div className="flex items-center gap-2"> + <input + type="text" + readOnly + value={state.shareUrl} + className="block w-full rounded-md outline-gray-600 bg-gray-600 px-3 py-1.5 text-white outline-1 -outline-offset-1 focus:outline-2 focus:-outline-offset-2 focus:outline-gray-300 sm:text-sm/6" + /> + <button + type="button" + className="p-2 rounded bg-gray-700 hover:bg-gray-600 transition cursor-pointer" + onClick={onShareButtonClick} + aria-label="Copy to clipboard" + > + <ClipboardDocumentIcon className="size-5 text-white" /> + </button> + </div> + </div> + </div> + </div> + </DialogPanel> + </div> + </div> + </Dialog> + ); +}; + +export default ShareCode; diff --git a/src/components/ShareCode/index.tsx b/src/components/ShareCode/index.tsx new file mode 100644 index 0000000..0b2f834 --- /dev/null +++ b/src/components/ShareCode/index.tsx @@ -0,0 +1 @@ +export { default } from 'components/ShareCode/ShareCode'; diff --git a/src/context/AppContext.tsx b/src/context/AppContext.tsx index 42475e1..5d74ffa 100644 --- a/src/context/AppContext.tsx +++ b/src/context/AppContext.tsx @@ -8,6 +8,7 @@ const initialState: AppState = { codeSampleName: '', result: [], error: '', + shareUrl: '', loading: false, sidebarOpen: false, historyOpen: false, diff --git a/src/context/Reducer.test.ts b/src/context/Reducer.test.ts index 0b6f61b..1ce80b2 100644 --- a/src/context/Reducer.test.ts +++ b/src/context/Reducer.test.ts @@ -7,6 +7,7 @@ describe('Reducer tests', () => { codeSampleName: '', result: [], error: '', + shareUrl: '', loading: false, sidebarOpen: false, historyOpen: false, diff --git a/src/context/Reducer.ts b/src/context/Reducer.ts index 9a7c4d6..e70f632 100644 --- a/src/context/Reducer.ts +++ b/src/context/Reducer.ts @@ -14,6 +14,7 @@ export const AppActions = { HIDE_HISTORY: 'HIDE_HISTORY', SHOW_ABOUT_MODAL: 'SHOW_ABOUT_MODAL', HIDE_ABOUT_MODAL: 'HIDE_ABOUT_MODAL', + SET_SHARE_URL: 'SET_SHARE_URL', }; const handleCodeUpdate = (state: AppState, action: Action): AppState => { @@ -85,6 +86,11 @@ export const reducer = (state: AppState, action: Action): AppState => { return { ...state, sidebarOpen: true }; case AppActions.HIDE_SIDEBAR: return { ...state, sidebarOpen: false }; + case AppActions.SET_SHARE_URL: + return { + ...state, + shareUrl: action.payload as string, + }; default: return state; } diff --git a/src/context/types.d.ts b/src/context/types.d.ts index b578cef..b8b80ed 100644 --- a/src/context/types.d.ts +++ b/src/context/types.d.ts @@ -8,6 +8,7 @@ type AppState = { sidebarOpen: boolean; historyOpen: boolean; aboutModalOpen: boolean; + shareUrl: string; }; type Payload = { diff --git a/src/helpers/const.ts b/src/helpers/const.ts index 7ec9e73..8702e7c 100644 --- a/src/helpers/const.ts +++ b/src/helpers/const.ts @@ -100,3 +100,5 @@ console.log(calculate({ operation: '*', operand1: 4, operand2: 6 })); // Outpu `, }, ]; + +export const MAX_SHARE_CODE_LENGTH = 2000; From d639496f5f40dd985ab1225e175b813a55d2279b Mon Sep 17 00:00:00 2001 From: Khalid Elshafie <abolkog@gmail.com> Date: Mon, 26 May 2025 14:59:45 +1000 Subject: [PATCH 8/9] docs: update README and add new screenshot --- README.md | 3 ++- images/js-playground.png | Bin 0 -> 200917 bytes src/components/About/About.tsx | 18 ++++++++++++++++++ 3 files changed, 20 insertions(+), 1 deletion(-) create mode 100644 images/js-playground.png diff --git a/README.md b/README.md index 5997bcf..a2a964b 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ A simple JavaScript playground / code sandbox hooked up with few libraries for quick code testing -![Sample](https://user-images.githubusercontent.com/3861725/75946297-d6600380-5ef0-11ea-9b59-794ae8ec613b.png) +![Sample](images/js-playground.png) ## Available Libraries @@ -13,6 +13,7 @@ A simple JavaScript playground / code sandbox hooked up with few libraries for q - [Lodash](https://lodash.com/) - [Axios](https://github.com/axios/axios) - [Luxon](https://moment.github.io/luxon/#/) +- [date-fns](https://date-fns.org/) ## Demo diff --git a/images/js-playground.png b/images/js-playground.png new file mode 100644 index 0000000000000000000000000000000000000000..9fa210445727f81d6000372c1ecc946533d8062b GIT binary patch literal 200917 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 al0Mp-^w&>XT|Nf>Jra|?pLSRK_5T4&lUgVM literal 0 HcmV?d00001 diff --git a/src/components/About/About.tsx b/src/components/About/About.tsx index f187f50..56e0b5a 100644 --- a/src/components/About/About.tsx +++ b/src/components/About/About.tsx @@ -78,6 +78,24 @@ const About: React.FC = () => { > Khalid Elshafie </a> + <div className="mt-6 flex gap-4 justify-center"> + <a + href="https://github.com/abolkog/js-playground/fork" + target="_blank" + rel="noopener noreferrer" + className="bg-gray-800 hover:bg-gray-700 text-white font-semibold py-2 px-4 rounded border border-gray-700 transition" + > + Fork on GitHub + </a> + <a + href="https://github.com/abolkog/js-playground" + target="_blank" + rel="noopener noreferrer" + className="bg-yellow-500 hover:bg-yellow-400 text-black font-semibold py-2 px-4 rounded transition" + > + Star on GitHub + </a> + </div> </div> </div> </div> From faf383ba3ba59dc69ce03497f02e8308c62619ad Mon Sep 17 00:00:00 2001 From: Khalid Elshafie <abolkog@gmail.com> Date: Mon, 26 May 2025 16:41:24 +1000 Subject: [PATCH 9/9] chore: increase code coverage --- src/components/About/About.test.tsx | 10 ++- src/components/Layout/ActionBar.test.tsx | 85 +++++++++++++++++++++++ src/components/Spinner/Spinner.test.tsx | 10 +++ src/context/AppContext.tsx | 3 +- src/context/Reducer.test.ts | 63 +++++++++++++++++ src/context/Reducer.ts | 3 +- src/helpers/const.ts | 7 ++ src/hooks/useCodeRunner.test.tsx | 60 +++++++++++++++++ src/services/storage.test.ts | 86 ++++++++++++++++++++++++ src/services/storage.ts | 8 +-- 10 files changed, 325 insertions(+), 10 deletions(-) create mode 100644 src/components/Layout/ActionBar.test.tsx create mode 100644 src/components/Spinner/Spinner.test.tsx create mode 100644 src/hooks/useCodeRunner.test.tsx diff --git a/src/components/About/About.test.tsx b/src/components/About/About.test.tsx index 2f0856a..87ff4c4 100644 --- a/src/components/About/About.test.tsx +++ b/src/components/About/About.test.tsx @@ -1,7 +1,8 @@ -import { act, render, screen } from '@testing-library/react'; +import { act, render, screen, fireEvent } from '@testing-library/react'; import { LIBRARIES } from 'helpers/const'; import About from 'components/About'; import { AppContext } from 'context/AppContext'; +import { AppActions } from 'context/Reducer'; describe('<About />', () => { const state = { @@ -23,4 +24,11 @@ describe('<About />', () => { const listElement = screen.getByTestId('about-libraries-list'); expect(listElement.children.length).toEqual(LIBRARIES.length); }); + + it('closes the modal', () => { + fireEvent.keyDown(document, { key: 'Escape', code: 'Escape' }); + expect(dispatch).toHaveBeenCalledWith({ + type: AppActions.HIDE_ABOUT_MODAL, + }); + }); }); diff --git a/src/components/Layout/ActionBar.test.tsx b/src/components/Layout/ActionBar.test.tsx new file mode 100644 index 0000000..83fb245 --- /dev/null +++ b/src/components/Layout/ActionBar.test.tsx @@ -0,0 +1,85 @@ +import { fireEvent, render, screen } from '@testing-library/react'; +import ActionBar from './ActionBar'; +import { AppContext } from 'context/AppContext'; +import { AppActions } from 'context/Reducer'; + +describe('<ActionBar />', () => { + const dispatch = jest.fn(); + const state = { + code: 'console.log("hello")', + loading: false, + result: [], + error: '', + sidebarOpen: false, + historyOpen: false, + aboutModalOpen: false, + shareUrl: '', + codeSample: '', + codeSampleName: '', + }; + + beforeEach(() => { + jest.clearAllMocks(); + }); + + function renderComponent(customState = {}) { + render( + <AppContext.Provider + value={{ state: { ...state, ...customState }, dispatch }} + > + <ActionBar /> + </AppContext.Provider>, + ); + } + + it('renders all main action buttons', () => { + renderComponent(); + expect(screen.getByText('Run Code')).toBeInTheDocument(); + expect(screen.getByText('Clear Console')).toBeInTheDocument(); + expect(screen.getByText('History')).toBeInTheDocument(); + expect(screen.getByText('Code Samples')).toBeInTheDocument(); + expect(screen.getByText('Share Code')).toBeInTheDocument(); + expect(screen.getByText('About JS Playground')).toBeInTheDocument(); + }); + + it('calls runCode when "Run Code" is clicked', () => { + renderComponent(); + fireEvent.click(screen.getByText('Run Code')); + expect(dispatch).toHaveBeenCalledWith({ + type: AppActions.CODE_RUNNING, + }); + }); + + it('dispatches CLEAR_RESULT when "Clear Console" is clicked', () => { + renderComponent(); + fireEvent.click(screen.getByText('Clear Console')); + expect(dispatch).toHaveBeenCalledWith({ type: AppActions.CLEAR_RESULT }); + }); + + it('dispatches SHOW_HISTORY when "History" is clicked', () => { + renderComponent(); + fireEvent.click(screen.getByText('History')); + expect(dispatch).toHaveBeenCalledWith({ type: AppActions.SHOW_HISTORY }); + }); + + it('dispatches SET_SHARE_URL when "Share Code" is clicked', () => { + renderComponent(); + fireEvent.click(screen.getByText('Share Code')); + expect(dispatch).toHaveBeenCalledWith( + expect.objectContaining({ type: AppActions.SET_SHARE_URL }), + ); + + const call = dispatch.mock.calls.find( + ([arg]) => arg.type === AppActions.SET_SHARE_URL, + ); + expect(call[0].payload).toContain('code='); + }); + + it('dispatches SHOW_ABOUT_MODAL when "About JS Playground" is clicked', () => { + renderComponent(); + fireEvent.click(screen.getByText('About JS Playground')); + expect(dispatch).toHaveBeenCalledWith({ + type: AppActions.SHOW_ABOUT_MODAL, + }); + }); +}); diff --git a/src/components/Spinner/Spinner.test.tsx b/src/components/Spinner/Spinner.test.tsx new file mode 100644 index 0000000..d262004 --- /dev/null +++ b/src/components/Spinner/Spinner.test.tsx @@ -0,0 +1,10 @@ +import { render } from '@testing-library/react'; +import Spinner from './Spinner'; + +describe('Spinner Component', () => { + it('renders the svg element', () => { + const { container } = render(<Spinner />); + const spinner = container.querySelector('svg.text-gray-300.animate-spin'); + expect(spinner).toBeInTheDocument(); + }); +}); diff --git a/src/context/AppContext.tsx b/src/context/AppContext.tsx index 5d74ffa..d8408e8 100644 --- a/src/context/AppContext.tsx +++ b/src/context/AppContext.tsx @@ -1,5 +1,6 @@ import { createContext, useMemo, useReducer } from 'react'; -import { getLocalStorage, STORAGE } from 'services/storage'; +import { getLocalStorage } from 'services/storage'; +import { STORAGE } from 'helpers/const'; import { reducer } from 'context/Reducer'; const initialState: AppState = { diff --git a/src/context/Reducer.test.ts b/src/context/Reducer.test.ts index 1ce80b2..a7d31ae 100644 --- a/src/context/Reducer.test.ts +++ b/src/context/Reducer.test.ts @@ -73,4 +73,67 @@ describe('Reducer tests', () => { }); expect(state).toEqual(INITIAL_STATE); }); + + describe('show and hide about modal', () => { + it('update sidebar value when show about modal is dispatched', () => { + const state = reducer(INITIAL_STATE, { + type: AppActions.SHOW_ABOUT_MODAL, + }); + expect(state.sidebarOpen).toEqual(false); + expect(state.aboutModalOpen).toEqual(true); + }); + + it('update sidebar value when hide about modal is dispatched', () => { + const state = reducer(INITIAL_STATE, { + type: AppActions.HIDE_ABOUT_MODAL, + }); + expect(state.sidebarOpen).toEqual(false); + expect(state.aboutModalOpen).toEqual(false); + }); + }); + + describe('show and hide history', () => { + it('update sidebar value when show history is dispatched', () => { + const state = reducer(INITIAL_STATE, { + type: AppActions.SHOW_HISTORY, + }); + expect(state.sidebarOpen).toEqual(false); + expect(state.historyOpen).toEqual(true); + }); + + it('update sidebar value when hide history is dispatched', () => { + const state = reducer(INITIAL_STATE, { + type: AppActions.HIDE_HISTORY, + }); + expect(state.sidebarOpen).toEqual(false); + expect(state.historyOpen).toEqual(false); + }); + }); + + describe('toggle sidebar', () => { + it('toggle sidebar open when toggle sidebar is dispatched', () => { + const state = reducer(INITIAL_STATE, { + type: AppActions.SHOW_SIDEBAR, + }); + expect(state.sidebarOpen).toEqual(true); + }); + + it('toggle sidebar close when toggle sidebar is dispatched again', () => { + const initialState = { ...INITIAL_STATE, sidebarOpen: true }; + const state = reducer(initialState, { + type: AppActions.HIDE_SIDEBAR, + }); + expect(state.sidebarOpen).toEqual(false); + }); + }); + + it('update shareUrl when set share url is dispatched', () => { + const payload = 'share-url'; + + const state = reducer(INITIAL_STATE, { + type: AppActions.SET_SHARE_URL, + payload, + }); + expect(state.shareUrl).toEqual(payload); + }); }); diff --git a/src/context/Reducer.ts b/src/context/Reducer.ts index e70f632..db23f8d 100644 --- a/src/context/Reducer.ts +++ b/src/context/Reducer.ts @@ -1,4 +1,5 @@ -import { saveToHistory, setLocalStorage, STORAGE } from 'services/storage'; +import { saveToHistory, setLocalStorage } from 'services/storage'; +import { STORAGE } from 'helpers/const'; export const AppActions = { UPDATE_CODE: 'UPDATE_CODE', diff --git a/src/helpers/const.ts b/src/helpers/const.ts index 8702e7c..ecd79a3 100644 --- a/src/helpers/const.ts +++ b/src/helpers/const.ts @@ -102,3 +102,10 @@ console.log(calculate({ operation: '*', operand1: 4, operand2: 6 })); // Outpu ]; export const MAX_SHARE_CODE_LENGTH = 2000; + +export const MAX_HISTORY_SIZE = 20; + +export const STORAGE = { + CODE: '@abolkog/jscode', + HISTORY: 'abolkog/jscode-history', +}; diff --git a/src/hooks/useCodeRunner.test.tsx b/src/hooks/useCodeRunner.test.tsx new file mode 100644 index 0000000..108dbe7 --- /dev/null +++ b/src/hooks/useCodeRunner.test.tsx @@ -0,0 +1,60 @@ +import { ReactNode } from 'react'; +import { renderHook, act } from '@testing-library/react'; +import useCodeRunner from './useCodeRunner'; +import { AppActions } from 'context/Reducer'; +import { AppContext } from 'context/AppContext'; + +describe('useCodeRunner', () => { + const state = {} as AppState; + let dispatch: jest.Mock; + + beforeEach(() => { + jest.clearAllMocks(); + dispatch = jest.fn(); + }); + + const createWrapper = ({ children }: { children: ReactNode }) => ( + <AppContext.Provider value={{ state, dispatch }}> + {children} + </AppContext.Provider> + ); + + it('should dispatch CODE_RUNNING and CODE_RUN_SUCCESS on valid code', async () => { + const { result } = renderHook(() => useCodeRunner(), { + wrapper: createWrapper, + }); + + const code = 'const a = 2 + 2; a;'; + + await act(async () => { + await result.current.runCode(code); + }); + + expect(dispatch).toHaveBeenNthCalledWith(1, { + type: AppActions.CODE_RUNNING, + }); + + expect(dispatch).toHaveBeenNthCalledWith(2, { + type: AppActions.CODE_RUN_SUCCESS, + payload: 4, + }); + }); + + it('should dispatch CODE_RUN_ERROR on invalid code', async () => { + const { result } = renderHook(() => useCodeRunner(), { + wrapper: createWrapper, + }); + + const code = 'throw new Error("Invalid code dude");'; + + await act(async () => { + await result.current.runCode(code); + }); + + expect(dispatch).toHaveBeenCalledWith({ type: AppActions.CODE_RUNNING }); + expect(dispatch).toHaveBeenCalledWith({ + type: AppActions.CODE_RUN_ERROR, + payload: 'Invalid code dude', + }); + }); +}); diff --git a/src/services/storage.test.ts b/src/services/storage.test.ts index 7ce09dc..b5dba46 100644 --- a/src/services/storage.test.ts +++ b/src/services/storage.test.ts @@ -1,7 +1,28 @@ +import { compress } from 'lz-string'; +import { STORAGE } from 'helpers/const'; import * as StorageService from 'services/storage'; +jest.mock('../helpers/const', () => { + const actual = jest.requireActual('../helpers/const'); + return { + ...actual, + MAX_HISTORY_SIZE: 2, + }; +}); + describe('Storage tests', () => { const setItemSpy = jest.spyOn(Storage.prototype, 'setItem'); + const today = '2025-05-26'; + + beforeEach(() => { + jest.clearAllMocks(); + jest.useFakeTimers(); + jest.setSystemTime(new Date(today)); + }); + + afterEach(() => { + jest.useRealTimers(); + }); it('Save value to locale storage', () => { StorageService.setLocalStorage('mock', 'value'); @@ -26,4 +47,69 @@ describe('Storage tests', () => { StorageService.clearLocalStorage('value'); expect(removeItemSpy).toHaveBeenCalledWith('value'); }); + + describe('getHistory', () => { + const mockCode = 'console.log(1)'; + beforeEach(jest.clearAllMocks); + + it('return empty array when no history found', () => { + jest.spyOn(Storage.prototype, 'getItem').mockReturnValueOnce(null); + const result = StorageService.getHistory(); + expect(result).toEqual([]); + }); + + it('return history result', () => { + const mockHistory = [ + { code: 'test', date: today }, + { code: 'test2', date: today }, + ]; + jest + .spyOn(Storage.prototype, 'getItem') + .mockReturnValueOnce(JSON.stringify(mockHistory)); + const result = StorageService.getHistory(); + expect(result.length).toEqual(mockHistory.length); + }); + + it('save code to history', () => { + jest.spyOn(Storage.prototype, 'getItem').mockReturnValueOnce(null); + + StorageService.saveToHistory(mockCode); + expect(setItemSpy).toHaveBeenCalledWith( + STORAGE.HISTORY, + JSON.stringify([{ code: compress(mockCode), date: today }]), + ); + }); + + it('remove oldest item in history if max reached', () => { + jest.spyOn(Storage.prototype, 'getItem').mockReturnValueOnce( + JSON.stringify([ + { code: compress('console.log(2)'), date: today }, + { code: compress('console.log(3)'), date: today }, + { code: compress('console.log(4)'), date: today }, + ]), + ); + + StorageService.saveToHistory(mockCode); + expect(setItemSpy).toHaveBeenCalledWith( + STORAGE.HISTORY, + JSON.stringify([ + { code: compress('console.log(3)'), date: today }, + { code: compress('console.log(4)'), date: today }, + { code: compress(mockCode), date: today }, + ]), + ); + }); + + it('does not save code to history if it already exist', () => { + const mockCode = 'console.log(1)'; + jest + .spyOn(Storage.prototype, 'getItem') + .mockReturnValueOnce( + JSON.stringify([{ code: compress(mockCode), date: today }]), + ); + + StorageService.saveToHistory(mockCode); + expect(setItemSpy).not.toHaveBeenCalled(); + }); + }); }); diff --git a/src/services/storage.ts b/src/services/storage.ts index 6c74529..038d216 100644 --- a/src/services/storage.ts +++ b/src/services/storage.ts @@ -1,11 +1,5 @@ import { compress, decompress } from 'lz-string'; - -const MAX_HISTORY_SIZE = 20; - -export const STORAGE = { - CODE: '@abolkog/jscode', - HISTORY: 'abolkog/jscode-history', -}; +import { MAX_HISTORY_SIZE, STORAGE } from 'helpers/const'; export const getLocalStorage = (key: string, defaultValue = '') => { return localStorage.getItem(key) || defaultValue;