diff --git a/dependencies.sh b/dependencies.sh index 9e68b1001f2..db24cbb4db8 100644 --- a/dependencies.sh +++ b/dependencies.sh @@ -17,7 +17,7 @@ export RUST_G_VERSION=4.2.0 export NODE_VERSION_LTS=22.14.0 # Bun version -export BUN_VERSION=1.3.3 +export BUN_VERSION=1.3.4 # SpacemanDMM git tag export SPACEMAN_DMM_VERSION=suite-1.11 diff --git a/tgui/bun.lock b/tgui/bun.lock index b56cdeb51ce..234f7b49830 100644 --- a/tgui/bun.lock +++ b/tgui/bun.lock @@ -6,15 +6,15 @@ "name": "tgui-workspace", "devDependencies": { "@happy-dom/global-registrator": "^17.6.3", - "@rspack/cli": "^1.6.6", - "@rspack/core": "^1.6.6", - "@types/bun": "^1.3.3", + "@rspack/cli": "^1.6.7", + "@rspack/core": "^1.6.7", + "@types/bun": "^1.3.4", "@types/react": "^19.2.7", "@types/react-dom": "^19.2.3", "@types/webpack-env": "^1.18.8", "@types/wicg-file-system-access": "^2023.10.7", "css-loader": "^7.1.2", - "sass-embedded": "^1.93.3", + "sass-embedded": "^1.95.1", "sass-loader": "^16.0.6", "typescript": "^5.9.3", }, @@ -40,7 +40,7 @@ "dependencies": { "common": "workspace:*", "dateformat": "^5.0.3", - "dompurify": "^3.3.0", + "dompurify": "^3.3.1", "es-toolkit": "^1.42.0", "highlight.js": "^11.11.1", "js-yaml": "^4.1.1", @@ -49,7 +49,7 @@ "marked-smartypants": "^1.1.11", "react": "^19.2.1", "react-dom": "^19.2.1", - "tgui-core": "^5.4.1", + "tgui-core": "^5.5.10", "tgui-dev-server": "workspace:*", }, }, @@ -67,12 +67,12 @@ "version": "6.0.0", "dependencies": { "common": "workspace:*", - "dompurify": "^3.3.0", + "dompurify": "^3.3.1", "es-toolkit": "^1.42.0", "react": "^19.2.1", "react-dom": "^19.2.1", "tgui": "workspace:*", - "tgui-core": "^5.4.1", + "tgui-core": "^5.5.10", "tgui-dev-server": "workspace:*", }, }, @@ -84,7 +84,7 @@ "react": "^19.2.1", "react-dom": "^19.2.1", "tgui": "workspace:*", - "tgui-core": "^5.4.1", + "tgui-core": "^5.5.10", }, }, "packages/tgui-setup": { @@ -201,31 +201,31 @@ "@polka/url": ["@polka/url@1.0.0-next.29", "", {}, "sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww=="], - "@rspack/binding": ["@rspack/binding@1.6.6", "", { "optionalDependencies": { "@rspack/binding-darwin-arm64": "1.6.6", "@rspack/binding-darwin-x64": "1.6.6", "@rspack/binding-linux-arm64-gnu": "1.6.6", "@rspack/binding-linux-arm64-musl": "1.6.6", "@rspack/binding-linux-x64-gnu": "1.6.6", "@rspack/binding-linux-x64-musl": "1.6.6", "@rspack/binding-wasm32-wasi": "1.6.6", "@rspack/binding-win32-arm64-msvc": "1.6.6", "@rspack/binding-win32-ia32-msvc": "1.6.6", "@rspack/binding-win32-x64-msvc": "1.6.6" } }, "sha512-noiV+qhyBTVpvG2M4bnOwKk2Ynl6G47Wf7wpCjPCFr87qr3txNwTTnhkEJEU59yj+VvIhbRD2rf5+9TLoT0Wxg=="], + "@rspack/binding": ["@rspack/binding@1.6.7", "", { "optionalDependencies": { "@rspack/binding-darwin-arm64": "1.6.7", "@rspack/binding-darwin-x64": "1.6.7", "@rspack/binding-linux-arm64-gnu": "1.6.7", "@rspack/binding-linux-arm64-musl": "1.6.7", "@rspack/binding-linux-x64-gnu": "1.6.7", "@rspack/binding-linux-x64-musl": "1.6.7", "@rspack/binding-wasm32-wasi": "1.6.7", "@rspack/binding-win32-arm64-msvc": "1.6.7", "@rspack/binding-win32-ia32-msvc": "1.6.7", "@rspack/binding-win32-x64-msvc": "1.6.7" } }, "sha512-7ICabuBN3gHc6PPN52+m1kruz3ogiJjg1C0gSWdLRk18m/4jlcM2aAy6wfXjgODJdB0Yh2ro/lIpBbj+AYWUGA=="], - "@rspack/binding-darwin-arm64": ["@rspack/binding-darwin-arm64@1.6.6", "", { "os": "darwin", "cpu": "arm64" }, "sha512-vGVDP0rlWa2w/gLba/sncVfkCah0HmhdmK5vGj/7sSX0iViwQneA2xjxDHyCNSQrvfq9GJmj4Kmdq/9tGh0KuA=="], + "@rspack/binding-darwin-arm64": ["@rspack/binding-darwin-arm64@1.6.7", "", { "os": "darwin", "cpu": "arm64" }, "sha512-QiIAP8JTAtht0j8/xZZEQTJRB9e+KrOm9c7JJm73CewVg55rDWRrwopiVfBNlTu1coem1ztUHJYdQhg2uXfqww=="], - "@rspack/binding-darwin-x64": ["@rspack/binding-darwin-x64@1.6.6", "", { "os": "darwin", "cpu": "x64" }, "sha512-IcdEG2kOmbPPO70Zl7gDnowDjK7d7C1hWew2vU7dPltr2t1JalRIMnS051lhiur0ULkSxV3cW1zXqv0Oi8AnOg=="], + "@rspack/binding-darwin-x64": ["@rspack/binding-darwin-x64@1.6.7", "", { "os": "darwin", "cpu": "x64" }, "sha512-DpQRxxTXkMMNPmBXeJBaAB8HmWKxH2IfvHv7vU+kBhJ3xdPtXU4/xBv1W3biluoNRG11gc1WLIgjzeGgaLCxmw=="], - "@rspack/binding-linux-arm64-gnu": ["@rspack/binding-linux-arm64-gnu@1.6.6", "", { "os": "linux", "cpu": "arm64" }, "sha512-rIguCCtlTcwoFlwheDiUgdImk27spuCRn43zGJogARpM/ZYRFKIuSwFDGUtJT2g0TSLUAHUhWAUqC36NwvrbMQ=="], + "@rspack/binding-linux-arm64-gnu": ["@rspack/binding-linux-arm64-gnu@1.6.7", "", { "os": "linux", "cpu": "arm64" }, "sha512-211/XoBiooGGgUo/NxNpsrzGUXtH1d7g/4+UTtjYtfc8QHwu7ZMHcsqg0wss53fXzn/yyxd0DZ56vBHq52BiFw=="], - "@rspack/binding-linux-arm64-musl": ["@rspack/binding-linux-arm64-musl@1.6.6", "", { "os": "linux", "cpu": "arm64" }, "sha512-x6X6Gr0fUw6qrJGxZt3Rb6oIX+jd9pdcyp0VbtofcLaqGVQbzustYsYnuLATPOys0q4J/4kWnmEhkjLJHwkhpQ=="], + "@rspack/binding-linux-arm64-musl": ["@rspack/binding-linux-arm64-musl@1.6.7", "", { "os": "linux", "cpu": "arm64" }, "sha512-0WnqAWz3WPDsXGvOOA++or7cHpoidVsH3FlqNaAfRu6ni6n7ig/s0/jKUB+C5FtXOgmGjAGkZHfFgNHsvZ0FWw=="], - "@rspack/binding-linux-x64-gnu": ["@rspack/binding-linux-x64-gnu@1.6.6", "", { "os": "linux", "cpu": "x64" }, "sha512-gSlVdASszWHosQKn+nzYOInBijdQboUnmNMGgW9/PijVg3433IvQjzviUuJFno8CMGgrACV9yw+ZFDuK0J57VA=="], + "@rspack/binding-linux-x64-gnu": ["@rspack/binding-linux-x64-gnu@1.6.7", "", { "os": "linux", "cpu": "x64" }, "sha512-iMrE0Q4IuYpkE0MjpaOVaUDYbQFiCRI9D3EPoXzlXJj4kJSdNheODpHTBVRlWt8Xp7UAoWuIFXCvKFKcSMm3aQ=="], - "@rspack/binding-linux-x64-musl": ["@rspack/binding-linux-x64-musl@1.6.6", "", { "os": "linux", "cpu": "x64" }, "sha512-TZaqVkh7memsTK/hxkOBrbpdzbmBUMea1YnYt++7QjMgco1kWFvAQ+YhAWtIaOaEg8s6C07Lt0Zp8izM2Dja0g=="], + "@rspack/binding-linux-x64-musl": ["@rspack/binding-linux-x64-musl@1.6.7", "", { "os": "linux", "cpu": "x64" }, "sha512-e7gKFxpdEQwYGk7lTC/hukTgNtaoAstBXehnZNk4k3kuU6+86WDrkn18Cd949iNqfIPtIG/wIsFNGbkHsH69hQ=="], - "@rspack/binding-wasm32-wasi": ["@rspack/binding-wasm32-wasi@1.6.6", "", { "dependencies": { "@napi-rs/wasm-runtime": "1.0.7" }, "cpu": "none" }, "sha512-W4mWdlLnYrbUaktyHOGNfATblxMTbgF7CBfDw8PhbDtjd2l8e/TnaHgIDkwITHXAOMEF/QEKfo9FtusbcQJNKw=="], + "@rspack/binding-wasm32-wasi": ["@rspack/binding-wasm32-wasi@1.6.7", "", { "dependencies": { "@napi-rs/wasm-runtime": "1.0.7" }, "cpu": "none" }, "sha512-yx88EFdE9RP3hh7VhjjW6uc6wGU0KcpOcZp8T8E/a+X8L98fX0aVrtM1IDbndhmdluIMqGbfJNap2+QqOCY9Mw=="], - "@rspack/binding-win32-arm64-msvc": ["@rspack/binding-win32-arm64-msvc@1.6.6", "", { "os": "win32", "cpu": "arm64" }, "sha512-cw5OgxqoDwjoZlk0L3vGEwcjPZsOVFYLwr2ssiC05rsTbhBwxj8coLpAJdvUvbf6C2TTmCB7iPe2sPq1KWD37g=="], + "@rspack/binding-win32-arm64-msvc": ["@rspack/binding-win32-arm64-msvc@1.6.7", "", { "os": "win32", "cpu": "arm64" }, "sha512-vgxVYpFK8P5ulSXQQA+EbX78R/SUU+WIf0JIY+LoUoP89gZOsise/lKAJMAybzpeTJ1t0ndLchFznDYnzq+l4Q=="], - "@rspack/binding-win32-ia32-msvc": ["@rspack/binding-win32-ia32-msvc@1.6.6", "", { "os": "win32", "cpu": "ia32" }, "sha512-M4ruR+VZ59iy+mPjy6FQPT27cOgeytf3wFBrt7e0suKeNLYGxrNyI9YhgpCTY++SMJsAMgRLGDHoI3ZgWulw1Q=="], + "@rspack/binding-win32-ia32-msvc": ["@rspack/binding-win32-ia32-msvc@1.6.7", "", { "os": "win32", "cpu": "ia32" }, "sha512-bV5RTW0Va0UQKJm9HWLt7fWNBPaBBBxCJOA2pJT3nGGm6CCXKnZSyEiVbFUk4jI/uiwBfqenlLkzaGoMRbeDhA=="], - "@rspack/binding-win32-x64-msvc": ["@rspack/binding-win32-x64-msvc@1.6.6", "", { "os": "win32", "cpu": "x64" }, "sha512-q5QTvdhPUh+CA93cQG5zWKRIHMIWPzw+ftFDEwBw52zYdvNAoLniqD8o5Mi8CT0pndhulXgR5aw0Sjd3eMah+A=="], + "@rspack/binding-win32-x64-msvc": ["@rspack/binding-win32-x64-msvc@1.6.7", "", { "os": "win32", "cpu": "x64" }, "sha512-8xlbuJQtYktlBjZupOHlO8FeZqSIhsV3ih7xBSiOYar6LI6uQzA7XiO3I5kaPSDirBMMMKv1Z4rKCxWx10a3TQ=="], - "@rspack/cli": ["@rspack/cli@1.6.6", "", { "dependencies": { "@discoveryjs/json-ext": "^0.5.7", "@rspack/dev-server": "~1.1.4", "exit-hook": "^4.0.0", "webpack-bundle-analyzer": "4.10.2" }, "peerDependencies": { "@rspack/core": "^1.0.0-alpha || ^1.x" }, "bin": { "rspack": "bin/rspack.js" } }, "sha512-CzKPQ00Ym1jEzU1i7Wem2JWbNGX4hnndnBi5f3FMM8gEUUD+SQQVm8fYeMlFIMbHIpYan+x+nxcnjxT5hiQ4kA=="], + "@rspack/cli": ["@rspack/cli@1.6.7", "", { "dependencies": { "@discoveryjs/json-ext": "^0.5.7", "@rspack/dev-server": "~1.1.4", "exit-hook": "^4.0.0", "webpack-bundle-analyzer": "4.10.2" }, "peerDependencies": { "@rspack/core": "^1.0.0-alpha || ^1.x" }, "bin": { "rspack": "bin/rspack.js" } }, "sha512-lWU4Gfw3HIysXnBuN1Ta43BeQHewoHd3MAzRlxmEYsUPxau26h6oTpL5WnLsT/Eh4G7XqnW1NJ8COujnn9EGfg=="], - "@rspack/core": ["@rspack/core@1.6.6", "", { "dependencies": { "@module-federation/runtime-tools": "0.21.6", "@rspack/binding": "1.6.6", "@rspack/lite-tapable": "1.1.0" }, "peerDependencies": { "@swc/helpers": ">=0.5.1" }, "optionalPeers": ["@swc/helpers"] }, "sha512-2mR+2YBydlgZ7Q0Rpd6bCC3MBnV9TS0x857K0zIhbDj4BQOqaWVy1n7fx/B3MrS8TR0QCuzKfyDAjNz+XTyJVQ=="], + "@rspack/core": ["@rspack/core@1.6.7", "", { "dependencies": { "@module-federation/runtime-tools": "0.21.6", "@rspack/binding": "1.6.7", "@rspack/lite-tapable": "1.1.0" }, "peerDependencies": { "@swc/helpers": ">=0.5.1" }, "optionalPeers": ["@swc/helpers"] }, "sha512-tkd4nSzTf+pDa9OAE4INi/JEa93HNszjWy5C9+trf4ZCXLLHsHxHQFbzoreuz4Vv2PlCWajgvAdiPMV1vGIkuw=="], "@rspack/dev-server": ["@rspack/dev-server@1.1.4", "", { "dependencies": { "chokidar": "^3.6.0", "http-proxy-middleware": "^2.0.9", "p-retry": "^6.2.0", "webpack-dev-server": "5.2.2", "ws": "^8.18.0" }, "peerDependencies": { "@rspack/core": "*" } }, "sha512-kGHYX2jYf3ZiHwVl0aUEPBOBEIG1aWleCDCAi+Jg32KUu3qr/zDUpCEd0wPuHfLEgk0X0xAEYCS6JMO7nBStNQ=="], @@ -239,7 +239,7 @@ "@types/bonjour": ["@types/bonjour@3.5.13", "", { "dependencies": { "@types/node": "*" } }, "sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ=="], - "@types/bun": ["@types/bun@1.3.3", "", { "dependencies": { "bun-types": "1.3.3" } }, "sha512-ogrKbJ2X5N0kWLLFKeytG0eHDleBYtngtlbu9cyBKFtNL3cnpDZkNdQj8flVf6WTZUX5ulI9AY1oa7ljhSrp+g=="], + "@types/bun": ["@types/bun@1.3.4", "", { "dependencies": { "bun-types": "1.3.4" } }, "sha512-EEPTKXHP+zKGPkhRLv+HI0UEX8/o+65hqARxLy8Ov5rIxMBPNTjeZww00CIihrIQGEQBYg+0roO5qOnS/7boGA=="], "@types/connect": ["@types/connect@3.4.38", "", { "dependencies": { "@types/node": "*" } }, "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug=="], @@ -359,7 +359,7 @@ "bufferstreams": ["bufferstreams@4.0.0", "", { "dependencies": { "readable-stream": "^3.4.0", "yerror": "^8.0.0" } }, "sha512-azX778/2VQ9K2uiYprSUKLgK2K6lR1KtJycJDsMg7u0+Cc994A9HyGaUKb01e/T+M8jse057429iKXurCaT35g=="], - "bun-types": ["bun-types@1.3.3", "", { "dependencies": { "@types/node": "*" } }, "sha512-z3Xwlg7j2l9JY27x5Qn3Wlyos8YAp0kKRlrePAOjgjMGS5IG6E7Jnlx736vH9UVI4wUICwwhC9anYL++XeOgTQ=="], + "bun-types": ["bun-types@1.3.4", "", { "dependencies": { "@types/node": "*" } }, "sha512-5ua817+BZPZOlNaRgGBpZJOSAQ9RQ17pkwPD0yR7CfJg+r8DgIILByFifDTa+IPDDxzf5VNhtNlcKqFzDgJvlQ=="], "bundle-name": ["bundle-name@4.1.0", "", { "dependencies": { "run-applescript": "^7.0.0" } }, "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q=="], @@ -471,7 +471,7 @@ "domhandler": ["domhandler@5.0.3", "", { "dependencies": { "domelementtype": "^2.3.0" } }, "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w=="], - "dompurify": ["dompurify@3.3.0", "", { "optionalDependencies": { "@types/trusted-types": "^2.0.7" } }, "sha512-r+f6MYR1gGN1eJv0TVQbhA7if/U7P87cdPl3HN5rikqaBSBxLiCb/b9O+2eG0cxz0ghyU+mU1QkbsOwERMYlWQ=="], + "dompurify": ["dompurify@3.3.1", "", { "optionalDependencies": { "@types/trusted-types": "^2.0.7" } }, "sha512-qkdCKzLNtrgPFP1Vo+98FRzJnBRGe4ffyCea9IwHB1fyxPOeNTHpLKYGd4Uk9xvNoH0ZoOjwZxNptyMwqrId1Q=="], "domutils": ["domutils@3.2.2", "", { "dependencies": { "dom-serializer": "^2.0.0", "domelementtype": "^2.3.0", "domhandler": "^5.0.3" } }, "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw=="], @@ -877,43 +877,43 @@ "sass": ["sass@1.93.3", "", { "dependencies": { "chokidar": "^4.0.0", "immutable": "^5.0.2", "source-map-js": ">=0.6.2 <2.0.0" }, "optionalDependencies": { "@parcel/watcher": "^2.4.1" }, "bin": { "sass": "sass.js" } }, "sha512-elOcIZRTM76dvxNAjqYrucTSI0teAF/L2Lv0s6f6b7FOwcwIuA357bIE871580AjHJuSvLIRUosgV+lIWx6Rgg=="], - "sass-embedded": ["sass-embedded@1.93.3", "", { "dependencies": { "@bufbuild/protobuf": "^2.5.0", "buffer-builder": "^0.2.0", "colorjs.io": "^0.5.0", "immutable": "^5.0.2", "rxjs": "^7.4.0", "supports-color": "^8.1.1", "sync-child-process": "^1.0.2", "varint": "^6.0.0" }, "optionalDependencies": { "sass-embedded-all-unknown": "1.93.3", "sass-embedded-android-arm": "1.93.3", "sass-embedded-android-arm64": "1.93.3", "sass-embedded-android-riscv64": "1.93.3", "sass-embedded-android-x64": "1.93.3", "sass-embedded-darwin-arm64": "1.93.3", "sass-embedded-darwin-x64": "1.93.3", "sass-embedded-linux-arm": "1.93.3", "sass-embedded-linux-arm64": "1.93.3", "sass-embedded-linux-musl-arm": "1.93.3", "sass-embedded-linux-musl-arm64": "1.93.3", "sass-embedded-linux-musl-riscv64": "1.93.3", "sass-embedded-linux-musl-x64": "1.93.3", "sass-embedded-linux-riscv64": "1.93.3", "sass-embedded-linux-x64": "1.93.3", "sass-embedded-unknown-all": "1.93.3", "sass-embedded-win32-arm64": "1.93.3", "sass-embedded-win32-x64": "1.93.3" }, "bin": { "sass": "dist/bin/sass.js" } }, "sha512-+VUy01yfDqNmIVMd/LLKl2TTtY0ovZN0rTonh+FhKr65mFwIYgU9WzgIZKS7U9/SPCQvWTsTGx9jyt+qRm/XFw=="], + "sass-embedded": ["sass-embedded@1.95.1", "", { "dependencies": { "@bufbuild/protobuf": "^2.5.0", "buffer-builder": "^0.2.0", "colorjs.io": "^0.5.0", "immutable": "^5.0.2", "rxjs": "^7.4.0", "supports-color": "^8.1.1", "sync-child-process": "^1.0.2", "varint": "^6.0.0" }, "optionalDependencies": { "sass-embedded-all-unknown": "1.95.1", "sass-embedded-android-arm": "1.95.1", "sass-embedded-android-arm64": "1.95.1", "sass-embedded-android-riscv64": "1.95.1", "sass-embedded-android-x64": "1.95.1", "sass-embedded-darwin-arm64": "1.95.1", "sass-embedded-darwin-x64": "1.95.1", "sass-embedded-linux-arm": "1.95.1", "sass-embedded-linux-arm64": "1.95.1", "sass-embedded-linux-musl-arm": "1.95.1", "sass-embedded-linux-musl-arm64": "1.95.1", "sass-embedded-linux-musl-riscv64": "1.95.1", "sass-embedded-linux-musl-x64": "1.95.1", "sass-embedded-linux-riscv64": "1.95.1", "sass-embedded-linux-x64": "1.95.1", "sass-embedded-unknown-all": "1.95.1", "sass-embedded-win32-arm64": "1.95.1", "sass-embedded-win32-x64": "1.95.1" }, "bin": { "sass": "dist/bin/sass.js" } }, "sha512-l086+s40Z0qP7ckj4T+rI/7tZcwAfcKCG9ah9A808yINWOxZFv0kO0u/UHhR4G9Aimeyax/JNvqh8RE7z1wngg=="], - "sass-embedded-all-unknown": ["sass-embedded-all-unknown@1.93.3", "", { "dependencies": { "sass": "1.93.3" }, "cpu": [ "!arm", "!x64", "!arm64", ] }, "sha512-3okGgnE41eg+CPLtAPletu6nQ4N0ij7AeW+Sl5Km4j29XcmqZQeFwYjHe1AlKTEgLi/UAONk1O8i8/lupeKMbw=="], + "sass-embedded-all-unknown": ["sass-embedded-all-unknown@1.95.1", "", { "dependencies": { "sass": "1.95.1" }, "cpu": [ "!arm", "!x64", "!arm64", ] }, "sha512-ObGM3xSHEK2fu89GusvAdk1hId3D1R03CyQ6/AVTFSrcBFav1a3aWUmBWtImzf5LsVzliRnlAPPS6+rT/Ghb1A=="], - "sass-embedded-android-arm": ["sass-embedded-android-arm@1.93.3", "", { "os": "android", "cpu": "arm" }, "sha512-8xOw9bywfOD6Wv24BgCmgjkk6tMrsOTTHcb28KDxeJtFtoxiUyMbxo0vChpPAfp2Hyg2tFFKS60s0s4JYk+Raw=="], + "sass-embedded-android-arm": ["sass-embedded-android-arm@1.95.1", "", { "os": "android", "cpu": "arm" }, "sha512-siaN1TVEjhBP4QJ5UlDBRhyKmMbFhbdcyHj0B4hIuNcinuVprP6tH1NT0NkHvkXh2egBmTvjzZgJ1ySsCB32JA=="], - "sass-embedded-android-arm64": ["sass-embedded-android-arm64@1.93.3", "", { "os": "android", "cpu": "arm64" }, "sha512-uqUl3Kt1IqdGVAcAdbmC+NwuUJy8tM+2ZnB7/zrt6WxWVShVCRdFnWR9LT8HJr7eJN7AU8kSXxaVX/gedanPsg=="], + "sass-embedded-android-arm64": ["sass-embedded-android-arm64@1.95.1", "", { "os": "android", "cpu": "arm64" }, "sha512-E+3vZXhUOVHFiSITH2g53/ynxTG4zz8vTVrXGAKkZQwSe6aCO22uc1Pah23F3jOrDNF/YLrsyp82T/CIIczK3w=="], - "sass-embedded-android-riscv64": ["sass-embedded-android-riscv64@1.93.3", "", { "os": "android", "cpu": "none" }, "sha512-2jNJDmo+3qLocjWqYbXiBDnfgwrUeZgZFHJIwAefU7Fn66Ot7rsXl+XPwlokaCbTpj7eMFIqsRAZ/uDueXNCJg=="], + "sass-embedded-android-riscv64": ["sass-embedded-android-riscv64@1.95.1", "", { "os": "android", "cpu": "none" }, "sha512-UcPcr5JXVtInD+/XE+2DhwPsALUdRAHyippnnAP6MtdaT3+AnqqvzSVy9Gb6SKyeqEk4YxPmIlQpZCVODDT4eA=="], - "sass-embedded-android-x64": ["sass-embedded-android-x64@1.93.3", "", { "os": "android", "cpu": "x64" }, "sha512-y0RoAU6ZenQFcjM9PjQd3cRqRTjqwSbtWLL/p68y2oFyh0QGN0+LQ826fc0ZvU/AbqCsAizkqjzOn6cRZJxTTQ=="], + "sass-embedded-android-x64": ["sass-embedded-android-x64@1.95.1", "", { "os": "android", "cpu": "x64" }, "sha512-sW/TO+B0Wq9VDTa7YiO74DW4iF9jEYds+9yslaHtc69r/Ch+Zj+ZB6HeJysfmen91zn5CLJDGrnTSrIk+/COfQ=="], - "sass-embedded-darwin-arm64": ["sass-embedded-darwin-arm64@1.93.3", "", { "os": "darwin", "cpu": "arm64" }, "sha512-7zb/hpdMOdKteK17BOyyypemglVURd1Hdz6QGsggy60aUFfptTLQftLRg8r/xh1RbQAUKWFbYTNaM47J9yPxYg=="], + "sass-embedded-darwin-arm64": ["sass-embedded-darwin-arm64@1.95.1", "", { "os": "darwin", "cpu": "arm64" }, "sha512-SWTCwszlBzjin35T2OiGZSDRbC/sqg5Mjepih18lelELrz14eB9LcFTZeiqDfdnwx6qQqPWj2VufCpExr8jElA=="], - "sass-embedded-darwin-x64": ["sass-embedded-darwin-x64@1.93.3", "", { "os": "darwin", "cpu": "x64" }, "sha512-Ek1Vp8ZDQEe327Lz0b7h3hjvWH3u9XjJiQzveq74RPpJQ2q6d9LfWpjiRRohM4qK6o4XOHw1X10OMWPXJtdtWg=="], + "sass-embedded-darwin-x64": ["sass-embedded-darwin-x64@1.95.1", "", { "os": "darwin", "cpu": "x64" }, "sha512-0GZEgkE1e8E2h97lUtwgZbKHrJYmRE/KhWQBHv6ZueAto8DJcAFNFrIQiQoRJjraE6QTaw6ahSvc1YJ7gL4OQA=="], - "sass-embedded-linux-arm": ["sass-embedded-linux-arm@1.93.3", "", { "os": "linux", "cpu": "arm" }, "sha512-yeiv2y+dp8B4wNpd3+JsHYD0mvpXSfov7IGyQ1tMIR40qv+ROkRqYiqQvAOXf76Qwh4Y9OaYZtLpnsPjfeq6mA=="], + "sass-embedded-linux-arm": ["sass-embedded-linux-arm@1.95.1", "", { "os": "linux", "cpu": "arm" }, "sha512-zUAm/rztm5Uyy+DSs408VJg404siVgUuZyqId4tFwkPNC5WRKu25Z8bFMriyGaE4YfEqbNwFV07C16mJoGeVOA=="], - "sass-embedded-linux-arm64": ["sass-embedded-linux-arm64@1.93.3", "", { "os": "linux", "cpu": "arm64" }, "sha512-RBrHWgfd8Dd8w4fbmdRVXRrhh8oBAPyeWDTKAWw8ZEmuXfVl4ytjDuyxaVilh6rR1xTRTNpbaA/YWApBlLrrNw=="], + "sass-embedded-linux-arm64": ["sass-embedded-linux-arm64@1.95.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-MQxa+qVX7Os2rMpJ/AvhWup+1cS0JieQgCfi9cz1Zckn4zaUhg35+m2FQhfKvzv4afeW5bubTMOQeTRMQujbXw=="], - "sass-embedded-linux-musl-arm": ["sass-embedded-linux-musl-arm@1.93.3", "", { "os": "linux", "cpu": "arm" }, "sha512-fU0fwAwbp7sBE3h5DVU5UPzvaLg7a4yONfFWkkcCp6ZrOiPuGRHXXYriWQ0TUnWy4wE+svsVuWhwWgvlb/tkKg=="], + "sass-embedded-linux-musl-arm": ["sass-embedded-linux-musl-arm@1.95.1", "", { "os": "linux", "cpu": "arm" }, "sha512-gNdaGmM3nZ0jkFNmyXWyNlXZPdaMP+7n5Mk3yGFGShqRt/6T/bHh5SkyNnU2ZdP1z7R9poPItJhULrZJ42ETeA=="], - "sass-embedded-linux-musl-arm64": ["sass-embedded-linux-musl-arm64@1.93.3", "", { "os": "linux", "cpu": "arm64" }, "sha512-PS829l+eUng+9W4PFclXGb4uA2+965NHV3/Sa5U7qTywjeeUUYTZg70dJHSqvhrBEfCc2XJABeW3adLJbyQYkw=="], + "sass-embedded-linux-musl-arm64": ["sass-embedded-linux-musl-arm64@1.95.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-8lD5vHGzBjBRCMIr9CXCyjmy8Q1q+H4ygcYCIm/aPNYhrm9uPOzJfs8hv9kDRgRAASFkcPGlFw8tDH4QqiJ5wg=="], - "sass-embedded-linux-musl-riscv64": ["sass-embedded-linux-musl-riscv64@1.93.3", "", { "os": "linux", "cpu": "none" }, "sha512-cK1oBY+FWQquaIGEeQ5H74KTO8cWsSWwXb/WaildOO9U6wmUypTgUYKQ0o5o/29nZbWWlM1PHuwVYTSnT23Jjg=="], + "sass-embedded-linux-musl-riscv64": ["sass-embedded-linux-musl-riscv64@1.95.1", "", { "os": "linux", "cpu": "none" }, "sha512-WjKfHxnFc/jOL5QtmgYuiWCc4616V15DkpE+7z41JWEawRXku6w++w7AR+Zx/jbz93FZ/AsZp27IS3XUt80u3Q=="], - "sass-embedded-linux-musl-x64": ["sass-embedded-linux-musl-x64@1.93.3", "", { "os": "linux", "cpu": "x64" }, "sha512-A7wkrsHu2/I4Zpa0NMuPGkWDVV7QGGytxGyUq3opSXgAexHo/vBPlGoDXoRlSdex0cV+aTMRPjoGIfdmNlHwyg=="], + "sass-embedded-linux-musl-x64": ["sass-embedded-linux-musl-x64@1.95.1", "", { "os": "linux", "cpu": "x64" }, "sha512-3U6994SRUUmC8mPvSG/vNLUo2ZcGv3jHuPoBywTbJhGQI8gq0hef1MY8TU5mvtj9DhQYlah6MYktM4YrOQgqcQ=="], - "sass-embedded-linux-riscv64": ["sass-embedded-linux-riscv64@1.93.3", "", { "os": "linux", "cpu": "none" }, "sha512-vWkW1+HTF5qcaHa6hO80gx/QfB6GGjJUP0xLbnAoY4pwEnw5ulGv6RM8qYr8IDhWfVt/KH+lhJ2ZFxnJareisQ=="], + "sass-embedded-linux-riscv64": ["sass-embedded-linux-riscv64@1.95.1", "", { "os": "linux", "cpu": "none" }, "sha512-CJ0tEEQnfpJEMCQrdubLsmuVc/c66EgaCAO0ZgSJ/KpxBKF3O1lHN6e1UErRf6VO0rh8ExAOh75po12Vu849Og=="], - "sass-embedded-linux-x64": ["sass-embedded-linux-x64@1.93.3", "", { "os": "linux", "cpu": "x64" }, "sha512-k6uFxs+e5jSuk1Y0niCwuq42F9ZC5UEP7P+RIOurIm8w/5QFa0+YqeW+BPWEW5M1FqVOsNZH3qGn4ahqvAEjPA=="], + "sass-embedded-linux-x64": ["sass-embedded-linux-x64@1.95.1", "", { "os": "linux", "cpu": "x64" }, "sha512-nGnzrEpZZOsGOwrRVyX4t15M8ijZWhc4e4lLpOqaPm+lv23HFncfY05WxU5bRj0KAknrkeTM2IX/6veP2aeUdA=="], - "sass-embedded-unknown-all": ["sass-embedded-unknown-all@1.93.3", "", { "dependencies": { "sass": "1.93.3" }, "os": [ "!linux", "!win32", "!darwin", "!android", ] }, "sha512-o5wj2rLpXH0C+GJKt/VpWp6AnMsCCbfFmnMAttcrsa+U3yrs/guhZ3x55KAqqUsE8F47e3frbsDL+1OuQM5DAA=="], + "sass-embedded-unknown-all": ["sass-embedded-unknown-all@1.95.1", "", { "dependencies": { "sass": "1.95.1" }, "os": [ "!linux", "!win32", "!darwin", "!android", ] }, "sha512-bhywAcadVQoCotD4gVmyMBi2SENPvyLFPrXf33VK5mY487Nf/g5SgGCUuGmfTsbns4NBwbwR7PA/1fnJmeMtdA=="], - "sass-embedded-win32-arm64": ["sass-embedded-win32-arm64@1.93.3", "", { "os": "win32", "cpu": "arm64" }, "sha512-0dOfT9moy9YmBolodwYYXtLwNr4jL4HQC9rBfv6mVrD7ud8ue2kDbn+GVzj1hEJxvEexVSmDCf7MHUTLcGs9xQ=="], + "sass-embedded-win32-arm64": ["sass-embedded-win32-arm64@1.95.1", "", { "os": "win32", "cpu": "arm64" }, "sha512-RWWODCthWdMVODoq98lyIk9R56mgGJ4TFUjD9LSCe7fAYD/tiTkUabE4AUzkZqknQSYr0n0Q2uy7POSDIKvhVg=="], - "sass-embedded-win32-x64": ["sass-embedded-win32-x64@1.93.3", "", { "os": "win32", "cpu": "x64" }, "sha512-wHFVfxiS9hU/sNk7KReD+lJWRp3R0SLQEX4zfOnRP2zlvI2X4IQR5aZr9GNcuMP6TmNpX0nQPZTegS8+h9RrEg=="], + "sass-embedded-win32-x64": ["sass-embedded-win32-x64@1.95.1", "", { "os": "win32", "cpu": "x64" }, "sha512-jotHgOQnCb1XdjK0fhsyuhsfox7Y5EkrOc4h2caEpRcNCnsPTBZHqhuc8Lnw8HbKIhwKYkqWhexkjgz62MShhg=="], "sass-loader": ["sass-loader@16.0.6", "", { "dependencies": { "neo-async": "^2.6.2" }, "peerDependencies": { "@rspack/core": "0.x || 1.x", "node-sass": "^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0", "sass": "^1.3.0", "sass-embedded": "*", "webpack": "^5.0.0" }, "optionalPeers": ["@rspack/core", "node-sass", "sass", "sass-embedded", "webpack"] }, "sha512-sglGzId5gmlfxNs4gK2U3h7HlVRfx278YK6Ono5lwzuvi1jxig80YiuHkaDBVsYIKFhx8wN7XSCI0M2IDS/3qA=="], @@ -1021,7 +1021,7 @@ "tgui": ["tgui@workspace:packages/tgui"], - "tgui-core": ["tgui-core@5.4.1", "", { "dependencies": { "@floating-ui/react": "^0.27.16", "@nozbe/microfuzz": "^1.0.0" }, "peerDependencies": { "react": "^19.1.0", "react-dom": "^19.1.0" } }, "sha512-L897NbtiR/ORAP3XdVDiJPoLH+vsKGPE4Miq92pvtJ5RaojT5eBPq9GVMQwgCv5g812bGuCn83ntvBoVM8/TRA=="], + "tgui-core": ["tgui-core@5.5.10", "", { "dependencies": { "@floating-ui/react": "^0.27.16", "@nozbe/microfuzz": "^1.0.0" }, "peerDependencies": { "react": "^19.1.0", "react-dom": "^19.1.0" } }, "sha512-/LrZOS9BXSGItzNWzqGpQSo+5BmXQiydbc95+vJGpO/44bW9PqZ2/AnyvP6JCSbBhHT/PQSGVJscJcBnqB+eiA=="], "tgui-dev-server": ["tgui-dev-server@workspace:packages/tgui-dev-server"], @@ -1199,6 +1199,10 @@ "sass/chokidar": ["chokidar@4.0.3", "", { "dependencies": { "readdirp": "^4.0.1" } }, "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA=="], + "sass-embedded-all-unknown/sass": ["sass@1.95.1", "", { "dependencies": { "chokidar": "^4.0.0", "immutable": "^5.0.2", "source-map-js": ">=0.6.2 <2.0.0" }, "optionalDependencies": { "@parcel/watcher": "^2.4.1" }, "bin": { "sass": "sass.js" } }, "sha512-uPoDh5NIEZV4Dp5GBodkmNY9tSQfXY02pmCcUo+FR1P+x953HGkpw+vV28D4IqYB6f8webZtwoSaZaiPtpTeMg=="], + + "sass-embedded-unknown-all/sass": ["sass@1.95.1", "", { "dependencies": { "chokidar": "^4.0.0", "immutable": "^5.0.2", "source-map-js": ">=0.6.2 <2.0.0" }, "optionalDependencies": { "@parcel/watcher": "^2.4.1" }, "bin": { "sass": "sass.js" } }, "sha512-uPoDh5NIEZV4Dp5GBodkmNY9tSQfXY02pmCcUo+FR1P+x953HGkpw+vV28D4IqYB6f8webZtwoSaZaiPtpTeMg=="], + "send/debug": ["debug@2.6.9", "", { "dependencies": { "ms": "2.0.0" } }, "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA=="], "send/http-errors": ["http-errors@2.0.0", "", { "dependencies": { "depd": "2.0.0", "inherits": "2.0.4", "setprototypeof": "1.2.0", "statuses": "2.0.1", "toidentifier": "1.0.1" } }, "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ=="], @@ -1263,6 +1267,10 @@ "node-gyp/glob/path-scurry": ["path-scurry@1.11.1", "", { "dependencies": { "lru-cache": "^10.2.0", "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" } }, "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA=="], + "sass-embedded-all-unknown/sass/chokidar": ["chokidar@4.0.3", "", { "dependencies": { "readdirp": "^4.0.1" } }, "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA=="], + + "sass-embedded-unknown-all/sass/chokidar": ["chokidar@4.0.3", "", { "dependencies": { "readdirp": "^4.0.1" } }, "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA=="], + "sass/chokidar/readdirp": ["readdirp@4.1.2", "", {}, "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg=="], "send/debug/ms": ["ms@2.0.0", "", {}, "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="], @@ -1295,6 +1303,10 @@ "node-gyp/glob/path-scurry/lru-cache": ["lru-cache@10.4.3", "", {}, "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ=="], + "sass-embedded-all-unknown/sass/chokidar/readdirp": ["readdirp@4.1.2", "", {}, "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg=="], + + "sass-embedded-unknown-all/sass/chokidar/readdirp": ["readdirp@4.1.2", "", {}, "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg=="], + "serve-static/send/debug/ms": ["ms@2.0.0", "", {}, "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="], } } diff --git a/tgui/package.json b/tgui/package.json index 9d402260d6b..56bf522f0bc 100644 --- a/tgui/package.json +++ b/tgui/package.json @@ -16,15 +16,15 @@ }, "devDependencies": { "@happy-dom/global-registrator": "^17.6.3", - "@rspack/cli": "^1.6.6", - "@rspack/core": "^1.6.6", - "@types/bun": "^1.3.3", + "@rspack/cli": "^1.6.7", + "@rspack/core": "^1.6.7", + "@types/bun": "^1.3.4", "@types/react": "^19.2.7", "@types/react-dom": "^19.2.3", "@types/webpack-env": "^1.18.8", "@types/wicg-file-system-access": "^2023.10.7", "css-loader": "^7.1.2", - "sass-embedded": "^1.93.3", + "sass-embedded": "^1.95.1", "sass-loader": "^16.0.6", "typescript": "^5.9.3" } diff --git a/tgui/packages/common/colorpicker.ts b/tgui/packages/common/colorpicker.ts index 95449c4c83c..f51d3ec02e1 100644 --- a/tgui/packages/common/colorpicker.ts +++ b/tgui/packages/common/colorpicker.ts @@ -1,252 +1,3 @@ -/* - * MIT License - * https://github.com/omgovich/react-colorful/ - * - * Copyright (c) 2020 Vlad Shilov - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ -const round = (number: number, digits = 0, base = 10 ** digits): number => { - return Math.round(base * number) / base; -}; -export interface RgbColor { - r: number; - g: number; - b: number; -} -export interface RgbaColor extends RgbColor { - a: number; -} -export interface HslColor { - h: number; - s: number; - l: number; -} -export interface HslaColor extends HslColor { - a: number; -} -export interface HsvColor { - h: number; - s: number; - v: number; -} -export interface HsvaColor extends HsvColor { - a: number; -} -export type ObjectColor = - | RgbColor - | HslColor - | HsvColor - | RgbaColor - | HslaColor - | HsvaColor; -export type AnyColor = string | ObjectColor; -/** - * Valid CSS units. - * https://developer.mozilla.org/en-US/docs/Web/CSS/angle - */ -const angleUnits: Record = { - grad: 360 / 400, - turn: 360, - rad: 360 / (Math.PI * 2), -}; -export const hexToHsva = (hex: string): HsvaColor => rgbaToHsva(hexToRgba(hex)); -export const hexToRgba = (hex: string): RgbaColor => { - if (hex[0] === '#') hex = hex.substring(1); - if (hex.length < 6) { - return { - r: parseInt(hex[0] + hex[0], 16), - g: parseInt(hex[1] + hex[1], 16), - b: parseInt(hex[2] + hex[2], 16), - a: hex.length === 4 ? round(parseInt(hex[3] + hex[3], 16) / 255, 2) : 1, - }; - } - return { - r: parseInt(hex.substring(0, 2), 16), - g: parseInt(hex.substring(2, 4), 16), - b: parseInt(hex.substring(4, 6), 16), - a: hex.length === 8 ? round(parseInt(hex.substring(6, 8), 16) / 255, 2) : 1, - }; -}; -export const parseHue = (value: string, unit = 'deg'): number => { - return Number(value) * (angleUnits[unit] || 1); -}; -export const hslaStringToHsva = (hslString: string): HsvaColor => { - const matcher = - /hsla?\(?\s*(-?\d*\.?\d+)(deg|rad|grad|turn)?[,\s]+(-?\d*\.?\d+)%?[,\s]+(-?\d*\.?\d+)%?,?\s*[/\s]*(-?\d*\.?\d+)?(%)?\s*\)?/i; - const match = matcher.exec(hslString); - if (!match) return { h: 0, s: 0, v: 0, a: 1 }; - return hslaToHsva({ - h: parseHue(match[1], match[2]), - s: Number(match[3]), - l: Number(match[4]), - a: match[5] === undefined ? 1 : Number(match[5]) / (match[6] ? 100 : 1), - }); -}; -export const hslStringToHsva = hslaStringToHsva; -export const hslaToHsva = ({ h, s, l, a }: HslaColor): HsvaColor => { - s *= (l < 50 ? l : 100 - l) / 100; - return { - h: h, - s: s > 0 ? ((2 * s) / (l + s)) * 100 : 0, - v: l + s, - a, - }; -}; -export const hsvaToHex = (hsva: HsvaColor): string => - rgbaToHex(hsvaToRgba(hsva)); -export const hsvaToHsla = ({ h, s, v, a }: HsvaColor): HslaColor => { - const hh = ((200 - s) * v) / 100; - return { - h: round(h), - s: round( - hh > 0 && hh < 200 - ? ((s * v) / 100 / (hh <= 100 ? hh : 200 - hh)) * 100 - : 0, - ), - l: round(hh / 2), - a: round(a, 2), - }; -}; -export const hsvaToHslString = (hsva: HsvaColor): string => { - const { h, s, l } = hsvaToHsla(hsva); - return `hsl(${h}, ${s}%, ${l}%)`; -}; -export const hsvaToHsvString = (hsva: HsvaColor): string => { - const { h, s, v } = roundHsva(hsva); - return `hsv(${h}, ${s}%, ${v}%)`; -}; -export const hsvaToHsvaString = (hsva: HsvaColor): string => { - const { h, s, v, a } = roundHsva(hsva); - return `hsva(${h}, ${s}%, ${v}%, ${a})`; -}; -export const hsvaToHslaString = (hsva: HsvaColor): string => { - const { h, s, l, a } = hsvaToHsla(hsva); - return `hsla(${h}, ${s}%, ${l}%, ${a})`; -}; -export const hsvaToRgba = ({ h, s, v, a }: HsvaColor): RgbaColor => { - h = (h / 360) * 6; - s = s / 100; - v = v / 100; - const hh = Math.floor(h), - b = v * (1 - s), - c = v * (1 - (h - hh) * s), - d = v * (1 - (1 - h + hh) * s), - module = hh % 6; - return { - r: [v, c, b, b, d, v][module] * 255, - g: [d, v, v, c, b, b][module] * 255, - b: [b, b, d, v, v, c][module] * 255, - a: round(a, 2), - }; -}; -export const hsvaToRgbString = (hsva: HsvaColor): string => { - const { r, g, b } = hsvaToRgba(hsva); - return `rgb(${round(r)}, ${round(g)}, ${round(b)})`; -}; -export const hsvaToRgbaString = (hsva: HsvaColor): string => { - const { r, g, b, a } = hsvaToRgba(hsva); - return `rgba(${round(r)}, ${round(g)}, ${round(b)}, ${round(a, 2)})`; -}; -export const hsvaStringToHsva = (hsvString: string): HsvaColor => { - const matcher = - /hsva?\(?\s*(-?\d*\.?\d+)(deg|rad|grad|turn)?[,\s]+(-?\d*\.?\d+)%?[,\s]+(-?\d*\.?\d+)%?,?\s*[/\s]*(-?\d*\.?\d+)?(%)?\s*\)?/i; - const match = matcher.exec(hsvString); - if (!match) return { h: 0, s: 0, v: 0, a: 1 }; - return roundHsva({ - h: parseHue(match[1], match[2]), - s: Number(match[3]), - v: Number(match[4]), - a: match[5] === undefined ? 1 : Number(match[5]) / (match[6] ? 100 : 1), - }); -}; -export const hsvStringToHsva = hsvaStringToHsva; -export const rgbaStringToHsva = (rgbaString: string): HsvaColor => { - const matcher = - /rgba?\(?\s*(-?\d*\.?\d+)(%)?[,\s]+(-?\d*\.?\d+)(%)?[,\s]+(-?\d*\.?\d+)(%)?,?\s*[/\s]*(-?\d*\.?\d+)?(%)?\s*\)?/i; - const match = matcher.exec(rgbaString); - if (!match) return { h: 0, s: 0, v: 0, a: 1 }; - return rgbaToHsva({ - r: Number(match[1]) / (match[2] ? 100 / 255 : 1), - g: Number(match[3]) / (match[4] ? 100 / 255 : 1), - b: Number(match[5]) / (match[6] ? 100 / 255 : 1), - a: match[7] === undefined ? 1 : Number(match[7]) / (match[8] ? 100 : 1), - }); -}; -export const rgbStringToHsva = rgbaStringToHsva; -const format = (number: number) => { - const hex = number.toString(16); - return hex.length < 2 ? `0${hex}` : hex; -}; -export const rgbaToHex = ({ r, g, b, a }: RgbaColor): string => { - const alphaHex = a < 1 ? format(round(a * 255)) : ''; - return `#${format(round(r))}${format(round(g))}${format(round(b))}${alphaHex}`; -}; -export const rgbaToHsva = ({ r, g, b, a }: RgbaColor): HsvaColor => { - const max = Math.max(r, g, b); - const delta = max - Math.min(r, g, b); - // prettier-ignore - const hh = delta - ? max === r - ? (g - b) / delta - : max === g - ? 2 + (b - r) / delta - : 4 + (r - g) / delta - : 0; - return { - h: 60 * (hh < 0 ? hh + 6 : hh), - s: max ? (delta / max) * 100 : 0, - v: (max / 255) * 100, - a, - }; -}; -export const roundHsva = (hsva: HsvaColor): HsvaColor => ({ - h: round(hsva.h), - s: round(hsva.s), - v: round(hsva.v), - a: round(hsva.a, 2), -}); -export const rgbaToRgb = ({ r, g, b }: RgbaColor): RgbColor => ({ r, g, b }); -export const hslaToHsl = ({ h, s, l }: HslaColor): HslColor => ({ h, s, l }); -export const hsvaToHsv = (hsva: HsvaColor): HsvColor => { - const { h, s, v } = roundHsva(hsva); - return { h, s, v }; -}; -const hexMatcher = /^#?([0-9A-F]{3,8})$/i; -export const validHex = (value: string, alpha?: boolean): boolean => { - const match = hexMatcher.exec(value); - const length = match ? match[1].length : 0; - return ( - length === 3 || // '#rgb' format - length === 6 || // '#rrggbb' format - (!!alpha && length === 4) || // '#rgba' format - (!!alpha && length === 8) // '#rrggbbaa' format - ); -}; -// Source for the following luminance and contrast calculation code: https://blog.cristiana.tech/calculating-color-contrast-in-typescript-using-web-content-accessibility-guidelines-wcag -export const luminance = (rgb: RgbColor): number => { - const [r, g, b] = [rgb.r, rgb.g, rgb.b].map((v) => { - v /= 255; - return v <= 0.03928 ? v / 12.92 : ((v + 0.055) / 1.055) ** 2.4; - }); - return r * 0.2126 + g * 0.7152 + b * 0.0722; -}; -export const contrast = ( - foreground: RgbColor, - background: RgbColor, -): number => { - const foreground_luminance = luminance(foreground); - const background_luminance = luminance(background); - return background_luminance < foreground_luminance - ? (background_luminance + 0.05) / (foreground_luminance + 0.05) - : (foreground_luminance + 0.05) / (background_luminance + 0.05); -}; - export const colorList = [ ['003366', '336699', '3366CC', '003399', '000099', '0000CC', '000066'], [ diff --git a/tgui/packages/tgui-panel/package.json b/tgui/packages/tgui-panel/package.json index bec6f62f1a4..6a115ebe3fd 100644 --- a/tgui/packages/tgui-panel/package.json +++ b/tgui/packages/tgui-panel/package.json @@ -3,12 +3,12 @@ "version": "6.0.0", "dependencies": { "common": "workspace:*", - "dompurify": "^3.3.0", + "dompurify": "^3.3.1", "es-toolkit": "^1.42.0", "react": "^19.2.1", "react-dom": "^19.2.1", "tgui": "workspace:*", - "tgui-core": "^5.4.1", + "tgui-core": "^5.5.10", "tgui-dev-server": "workspace:*" }, "private": true diff --git a/tgui/packages/tgui-say/package.json b/tgui/packages/tgui-say/package.json index b44713b656d..2cfc89f12c4 100644 --- a/tgui/packages/tgui-say/package.json +++ b/tgui/packages/tgui-say/package.json @@ -6,7 +6,7 @@ "react": "^19.2.1", "react-dom": "^19.2.1", "tgui": "workspace:*", - "tgui-core": "^5.4.1" + "tgui-core": "^5.5.10" }, "private": true } diff --git a/tgui/packages/tgui/components/Interactive.tsx b/tgui/packages/tgui/components/Interactive.tsx deleted file mode 100644 index b338f8a4f38..00000000000 --- a/tgui/packages/tgui/components/Interactive.tsx +++ /dev/null @@ -1,143 +0,0 @@ -/** - * MIT License - * https://github.com/omgovich/react-colorful/ - * - * Copyright (c) 2020 Vlad Shilov - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -import React, { - Component, - createRef, - type ReactNode, - type RefObject, -} from 'react'; -import { isArrow, KEY } from 'tgui-core/keys'; -import { clamp } from 'tgui-core/math'; - -export interface Interaction { - left: number; - top: number; -} - -// Finds the proper window object to fix iframe embedding issues -const getParentWindow = (node?: HTMLDivElement | null): Window => { - return node?.ownerDocument.defaultView || window; -}; - -// Returns a relative position of the pointer inside the node's bounding box -const getRelativePosition = ( - node: HTMLDivElement, - event: MouseEvent, -): Interaction => { - const rect = node.getBoundingClientRect(); - const parentWindow = getParentWindow(node); - - const offsetX = event.pageX - (rect.left + parentWindow.scrollX); - const offsetY = event.pageY - (rect.top + parentWindow.scrollY); - - return { - left: clamp(offsetX / rect.width, 0, 1), - top: clamp(offsetY / rect.height, 0, 1), - }; -}; - -export interface InteractiveProps { - onMove: (interaction: Interaction) => void; - onKey: (offset: Interaction) => void; - children: ReactNode; - style?: React.CSSProperties; -} - -export class Interactive extends Component { - containerRef: RefObject; - - constructor(props: InteractiveProps) { - super(props); - this.containerRef = createRef(); - } - - handleMoveStart = (event: React.MouseEvent) => { - const el = this.containerRef?.current; - if (!el) return; - - // Prevent text selection - event.preventDefault(); - el.focus(); - this.props.onMove(getRelativePosition(el, event.nativeEvent)); - this.toggleDocumentEvents(true); - }; - - handleMove = (event: MouseEvent) => { - event.preventDefault(); - - const isDown = event.buttons > 0; - - if (isDown && this.containerRef?.current) { - this.props.onMove(getRelativePosition(this.containerRef.current, event)); - } else { - this.toggleDocumentEvents(false); - } - }; - - handleMoveEnd = () => { - this.toggleDocumentEvents(false); - }; - - handleKeyDown = (event: React.KeyboardEvent) => { - const pressedKey = event.key; - - if (!isArrow(pressedKey)) { - return; - } - event.preventDefault(); - this.props.onKey({ - left: - pressedKey === KEY.Right ? 0.05 : pressedKey === KEY.Left ? -0.05 : 0, - top: pressedKey === KEY.Down ? 0.05 : pressedKey === KEY.Up ? -0.05 : 0, - }); - }; - - toggleDocumentEvents(state?: boolean) { - const el = this.containerRef?.current; - const parentWindow = getParentWindow(el); - - const toggleEvent = state - ? parentWindow.addEventListener - : parentWindow.removeEventListener; - toggleEvent('mousemove', this.handleMove); - toggleEvent('mouseup', this.handleMoveEnd); - } - - componentDidMount() { - this.toggleDocumentEvents(true); - } - - componentWillUnmount() { - this.toggleDocumentEvents(false); - } - - render() { - const { style, children, ...rest } = this.props; - return ( -
- {children} -
- ); - } -} diff --git a/tgui/packages/tgui/components/Pointer.tsx b/tgui/packages/tgui/components/Pointer.tsx deleted file mode 100644 index 52ae0f59b10..00000000000 --- a/tgui/packages/tgui/components/Pointer.tsx +++ /dev/null @@ -1,46 +0,0 @@ -/** - * MIT License - * https://github.com/omgovich/react-colorful/ - * - * Copyright (c) 2020 Vlad Shilov - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -import type React from 'react'; -import { classes } from 'tgui-core/react'; - -interface PointerProps { - className?: string; - top?: number; - left: number; - color: string; -} - -export const Pointer: React.FC = ({ - className, - color, - left, - top = 0.5, -}) => { - const nodeClassName = classes(['react-colorful__pointer', className]); - - const style = { - top: `${top * 100}%`, - left: `${left * 100}%`, - }; - - return ( -
-
-
- ); -}; diff --git a/tgui/packages/tgui/components/index.ts b/tgui/packages/tgui/components/index.ts index 84c6265961f..097af00fd09 100644 --- a/tgui/packages/tgui/components/index.ts +++ b/tgui/packages/tgui/components/index.ts @@ -4,6 +4,4 @@ * @license MIT */ -export { Interactive } from './Interactive'; export { NanoMap } from './NanoMap'; -export { Pointer } from './Pointer'; diff --git a/tgui/packages/tgui/interfaces/ColorMate/Helpers/MatrixColorBox.tsx b/tgui/packages/tgui/interfaces/ColorMate/Helpers/MatrixColorBox.tsx index a75145df8a3..4b5ac8626f3 100644 --- a/tgui/packages/tgui/interfaces/ColorMate/Helpers/MatrixColorBox.tsx +++ b/tgui/packages/tgui/interfaces/ColorMate/Helpers/MatrixColorBox.tsx @@ -1,5 +1,5 @@ -import { type HsvaColor, hexToHsva, hsvaToHex } from 'common/colorpicker'; import { useEffect, useState } from 'react'; +import { type HsvaColor, hexToHsva, hsvaToHex } from 'tgui-core/color'; import { Box, Floating } from 'tgui-core/components'; import { ColorSelector } from '../../ColorPickerModal'; diff --git a/tgui/packages/tgui/interfaces/ColorPickerModal.tsx b/tgui/packages/tgui/interfaces/ColorPickerModal.tsx index 0fc73cd07df..98df3dbf1e6 100644 --- a/tgui/packages/tgui/interfaces/ColorPickerModal.tsx +++ b/tgui/packages/tgui/interfaces/ColorPickerModal.tsx @@ -4,8 +4,18 @@ * @license MIT */ +import { colorList } from 'common/colorpicker'; +import React, { + useCallback, + useEffect, + useEffectEvent, + useMemo, + useRef, + useState, +} from 'react'; +import { useBackend } from 'tgui/backend'; +import { Window } from 'tgui/layouts'; import { - colorList, type HsvaColor, hexToHsva, hsvaToHex, @@ -13,24 +23,16 @@ import { hsvaToRgba, rgbaToHsva, validHex, -} from 'common/colorpicker'; -import React, { - useCallback, - useEffect, - useEffectEvent, - useMemo, - useState, -} from 'react'; -import { useBackend } from 'tgui/backend'; -import { Pointer } from 'tgui/components'; -import { type Interaction, Interactive } from 'tgui/components/Interactive'; -import { Window } from 'tgui/layouts'; +} from 'tgui-core/color'; import { Autofocus, Box, Button, Input, + type Interaction, + Interactive, NumberInput, + Pointer, Section, Stack, Tooltip, @@ -668,6 +670,7 @@ const SaturationValue: React.FC = React.memo( }), [hsva.h], ); + const containerRef = useRef(null); return (
@@ -678,6 +681,7 @@ const SaturationValue: React.FC = React.memo( aria-valuetext={`Saturation ${Math.round( hsva.s, )}%, Brightness ${Math.round(hsva.v)}%`} + containerRef={containerRef} > = React.memo(({ className, hue, onChange }) => { const handleKey = (offset: Interaction) => { onChange({ h: clamp(hue + offset.left * 360, 0, 360) }); }; + const containerRef = useRef(null); const nodeClassName = classes(['react-colorful__hue', className]); return (
= React.memo( })}, ${hsvaToHslString({ h: color.h, s: 100, v: color.v, a: 1 })})`, [color], ); + const containerRef = useRef(null); return (
= React.memo( })}, ${hsvaToHslString({ h: color.h, s: color.s, v: 100, a: 1 })})`, [color], ); + const containerRef = useRef(null); return (
= React.memo( }; const selected = channels[target]; + const containerRef = useRef(null); return (