mirror of
https://github.com/VOREStation/VOREStation.git
synced 2026-07-17 10:05:27 +01:00
+1
-1
@@ -1,5 +1,5 @@
|
||||
{
|
||||
"$schema": "https://biomejs.dev/schemas/2.5.1/schema.json",
|
||||
"$schema": "https://biomejs.dev/schemas/2.5.3/schema.json",
|
||||
"assist": {
|
||||
"actions": {
|
||||
"source": {
|
||||
|
||||
@@ -4,30 +4,30 @@
|
||||
"workspaces": {
|
||||
"": {
|
||||
"devDependencies": {
|
||||
"@biomejs/biome": "^2.5.1",
|
||||
"prettier": "^3.9.1",
|
||||
"@biomejs/biome": "^2.5.3",
|
||||
"prettier": "^3.9.5",
|
||||
},
|
||||
},
|
||||
},
|
||||
"packages": {
|
||||
"@biomejs/biome": ["@biomejs/biome@2.5.1", "", { "optionalDependencies": { "@biomejs/cli-darwin-arm64": "2.5.1", "@biomejs/cli-darwin-x64": "2.5.1", "@biomejs/cli-linux-arm64": "2.5.1", "@biomejs/cli-linux-arm64-musl": "2.5.1", "@biomejs/cli-linux-x64": "2.5.1", "@biomejs/cli-linux-x64-musl": "2.5.1", "@biomejs/cli-win32-arm64": "2.5.1", "@biomejs/cli-win32-x64": "2.5.1" }, "bin": { "biome": "bin/biome" } }, "sha512-IXWLCxKmae+rI7LOHS1B3EbVisQ6GRAWbhN9msa6KjNCyFWrvKZWR4oUdinaNssrV852OrSHuSPa95h1GPJc7Q=="],
|
||||
"@biomejs/biome": ["@biomejs/biome@2.5.3", "", { "optionalDependencies": { "@biomejs/cli-darwin-arm64": "2.5.3", "@biomejs/cli-darwin-x64": "2.5.3", "@biomejs/cli-linux-arm64": "2.5.3", "@biomejs/cli-linux-arm64-musl": "2.5.3", "@biomejs/cli-linux-x64": "2.5.3", "@biomejs/cli-linux-x64-musl": "2.5.3", "@biomejs/cli-win32-arm64": "2.5.3", "@biomejs/cli-win32-x64": "2.5.3" }, "bin": { "biome": "bin/biome" } }, "sha512-MrJswFdei9EfDwwUy2tQrPDpK0AO+RmMFvBoaaJ6ayBc3sUbHdCE+XG5N8vp+5So41ZupZJQm0roHFFhMGVD7A=="],
|
||||
|
||||
"@biomejs/cli-darwin-arm64": ["@biomejs/cli-darwin-arm64@2.5.1", "", { "os": "darwin", "cpu": "arm64" }, "sha512-npqDzvqv7vFaWRiNN1Te71siRgPaqS9MpqgYCdP/CrUbkJ7ApezaeaKjueKHRN/JH/6lRjJQAHi8acQDCAz22w=="],
|
||||
"@biomejs/cli-darwin-arm64": ["@biomejs/cli-darwin-arm64@2.5.3", "", { "os": "darwin", "cpu": "arm64" }, "sha512-QhYP9muVQ0nUO5zztFuPbEwi4+94sJWVjaZds9aMi1l/KNZBiUjdiSUrGHsTaMGDXrYl+r4AS2sUKfgH3w+V3g=="],
|
||||
|
||||
"@biomejs/cli-darwin-x64": ["@biomejs/cli-darwin-x64@2.5.1", "", { "os": "darwin", "cpu": "x64" }, "sha512-RgwTqPAM8g2tn1j+b5oRjF/DbSBX8a4gwojtuG9XuhfK7GgomvZ9+T+tqjXiVbjLEeGJOoL6VEk8mvRTVeSybw=="],
|
||||
"@biomejs/cli-darwin-x64": ["@biomejs/cli-darwin-x64@2.5.3", "", { "os": "darwin", "cpu": "x64" }, "sha512-NC1Ss13UaW7QZX+y8j44bF7AP0jSJdBl6iRhe0MAkvaSqZy+mWg3GaXsrb+eSoHoGDBtaXWEbMVV0iVN2cZ7cQ=="],
|
||||
|
||||
"@biomejs/cli-linux-arm64": ["@biomejs/cli-linux-arm64@2.5.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-yhV35CzZh38VyMvTEXi3JTjxZBs++oCKK9KG8vB6VI5+uvQvZNR3BFWEKKzuOmx9DJJj7sQpZ4LQJcmbGTs3+Q=="],
|
||||
"@biomejs/cli-linux-arm64": ["@biomejs/cli-linux-arm64@2.5.3", "", { "os": "linux", "cpu": "arm64" }, "sha512-ksx1KWeyYW18ILL04msF/J4ZBtBDN33znYK8Z/aNv/vlBVxL9/g3mGP+omgHJKy4+KWbK87vcmmpmurfNjSgiA=="],
|
||||
|
||||
"@biomejs/cli-linux-arm64-musl": ["@biomejs/cli-linux-arm64-musl@2.5.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-WMcvMLgByyTqVxGlq918NBBYliq9FRR9GAQVETHb+VjGVqXCZFfHlZHC1FX4ibuYY/Hg6TJE3rHU0xVrdJXNRw=="],
|
||||
"@biomejs/cli-linux-arm64-musl": ["@biomejs/cli-linux-arm64-musl@2.5.3", "", { "os": "linux", "cpu": "arm64" }, "sha512-fccix0w6xp6csCXgxeC0dU/3ecgRQal0y+cv2SP9ajNlhe7Yrk2Ug7UDe2j9AT9ZDYitkXpvUKgZjjuoYeP4Vg=="],
|
||||
|
||||
"@biomejs/cli-linux-x64": ["@biomejs/cli-linux-x64@2.5.1", "", { "os": "linux", "cpu": "x64" }, "sha512-J/7uHSX7NfoYDI7HijAkd8lnQIOrRb2W7j3X+tw4R+N5ExvXGsyXFiGdQcfcxfOmNQmZVSQOCDk757fwpzqQcg=="],
|
||||
"@biomejs/cli-linux-x64": ["@biomejs/cli-linux-x64@2.5.3", "", { "os": "linux", "cpu": "x64" }, "sha512-yMkJtilsgvILDcVkh187aVLTb64xYsrxYajx5kym+r1ULkO5HUOfu9AYKLGQbOVLwJtT2utNw7hhFNg+17mUYA=="],
|
||||
|
||||
"@biomejs/cli-linux-x64-musl": ["@biomejs/cli-linux-x64-musl@2.5.1", "", { "os": "linux", "cpu": "x64" }, "sha512-ANTowtlLmPYm5yeMckWY8Xzb9Ix+JJP3tgHR/n6xRj1VWyIzzWtfRfih9hv9VmClwadpBvZduISZIbBsIlYG3A=="],
|
||||
"@biomejs/cli-linux-x64-musl": ["@biomejs/cli-linux-x64-musl@2.5.3", "", { "os": "linux", "cpu": "x64" }, "sha512-O/yU9YKRUiHhmcjF2f38PSjseVk3G4VLWYc0G2HWpzdBVREV6G8IGWIVEFf7MFPfWIzNUIvPsEjeAZQIOgnLcQ=="],
|
||||
|
||||
"@biomejs/cli-win32-arm64": ["@biomejs/cli-win32-arm64@2.5.1", "", { "os": "win32", "cpu": "arm64" }, "sha512-zgXnKNgWPC4iPF7Y1lR3STUeCUuZRpD6IiOrC7TZTlh0Lx6FiVUT05myuMQHQ9D+1cc7uyMldi4forE6lp0ivQ=="],
|
||||
"@biomejs/cli-win32-arm64": ["@biomejs/cli-win32-arm64@2.5.3", "", { "os": "win32", "cpu": "arm64" }, "sha512-cX5z+GYwRcqEok0AH3KSfQGgqYd0Nomfp6Fbe1uiTtELE38hdH2k842wQ9wLNaF/JJ7r4rjJQ4VR+ce+fRmQbw=="],
|
||||
|
||||
"@biomejs/cli-win32-x64": ["@biomejs/cli-win32-x64@2.5.1", "", { "os": "win32", "cpu": "x64" }, "sha512-6uxpR9hvaglANkZemeSiN/FhYgkGasrEGn267eXIWvjrjJ2LhDlk251IhjVJq6MXzkV2/bcXwLwSroLyPtqRZg=="],
|
||||
"@biomejs/cli-win32-x64": ["@biomejs/cli-win32-x64@2.5.3", "", { "os": "win32", "cpu": "x64" }, "sha512-ExSaJWi4/u6+GXCszlSKpWSjKNbDseAYqqkCznsCsZ/4uidZ/BEqsCc5/3ctlq6dfIubdIIRSVLC/PG9xPl70Q=="],
|
||||
|
||||
"prettier": ["prettier@3.9.1", "", { "bin": { "prettier": "bin/prettier.cjs" } }, "sha512-ppiDo2CSwexck1eyZUwJHg/N3nf1+6IRCv7W/VJ5vaLnVCmB7+3CdRfMwoCHBBX6xTrREDTksZ4OZl5SSf4zXA=="],
|
||||
"prettier": ["prettier@3.9.5", "", { "bin": { "prettier": "bin/prettier.cjs" } }, "sha512-/FVl766LpUfB5vXgCYOYa0MeV/441Ia99AeICQIQFTY/Nw0roZwULcXpku5i1/m5kt/baz+s4Zogspd839HSMg=="],
|
||||
}
|
||||
}
|
||||
|
||||
+2
-2
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"devDependencies": {
|
||||
"@biomejs/biome": "^2.5.1",
|
||||
"prettier": "^3.9.1"
|
||||
"@biomejs/biome": "^2.5.3",
|
||||
"prettier": "^3.9.5"
|
||||
},
|
||||
"scripts": {
|
||||
"tgui:fix": "biome check --write --unsafe tgui",
|
||||
|
||||
+68
-28
@@ -6,8 +6,8 @@
|
||||
"name": "tgui-workspace",
|
||||
"devDependencies": {
|
||||
"@happy-dom/global-registrator": "^20.10.6",
|
||||
"@rspack/cli": "^2.1.2",
|
||||
"@rspack/core": "^2.1.2",
|
||||
"@rspack/cli": "^2.1.3",
|
||||
"@rspack/core": "^2.1.3",
|
||||
"@testing-library/react": "^16.3.2",
|
||||
"@types/bun": "^1.3.14",
|
||||
"@types/react": "^19.2.17",
|
||||
@@ -17,7 +17,7 @@
|
||||
"css-loader": "^7.1.4",
|
||||
"sass-embedded": "^1.100.0",
|
||||
"sass-loader": "^17.0.0",
|
||||
"typescript": "^6.0.3",
|
||||
"typescript": "^7.0.2",
|
||||
},
|
||||
},
|
||||
"packages/common": {
|
||||
@@ -42,13 +42,13 @@
|
||||
"dependencies": {
|
||||
"common": "workspace:*",
|
||||
"dateformat": "^5.0.3",
|
||||
"dompurify": "^3.4.11",
|
||||
"dompurify": "^3.4.12",
|
||||
"es-toolkit": "^1.49.0",
|
||||
"highlight.js": "^11.11.1",
|
||||
"jotai": "^2.20.1",
|
||||
"js-yaml": "^5.2.1",
|
||||
"marked": "^18.0.5",
|
||||
"marked-base-url": "^1.1.9",
|
||||
"marked": "^18.0.6",
|
||||
"marked-base-url": "^1.1.10",
|
||||
"marked-smartypants": "^1.1.12",
|
||||
"react": "^19.2.7",
|
||||
"react-dom": "^19.2.7",
|
||||
@@ -71,7 +71,7 @@
|
||||
"version": "6.0.0",
|
||||
"dependencies": {
|
||||
"common": "workspace:*",
|
||||
"dompurify": "^3.4.11",
|
||||
"dompurify": "^3.4.12",
|
||||
"es-toolkit": "^1.49.0",
|
||||
"jotai": "^2.20.1",
|
||||
"react": "^19.2.7",
|
||||
@@ -98,7 +98,7 @@
|
||||
"version": "0.0.1",
|
||||
"dependencies": {
|
||||
"clean-css-cli": "^5.6.3",
|
||||
"terser": "^5.48.0",
|
||||
"terser": "^5.49.0",
|
||||
},
|
||||
},
|
||||
},
|
||||
@@ -181,35 +181,35 @@
|
||||
|
||||
"@pkgjs/parseargs": ["@pkgjs/parseargs@0.11.0", "", {}, "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg=="],
|
||||
|
||||
"@rspack/binding": ["@rspack/binding@2.1.2", "", { "optionalDependencies": { "@rspack/binding-darwin-arm64": "2.1.2", "@rspack/binding-darwin-x64": "2.1.2", "@rspack/binding-linux-arm64-gnu": "2.1.2", "@rspack/binding-linux-arm64-musl": "2.1.2", "@rspack/binding-linux-riscv64-gnu": "2.1.2", "@rspack/binding-linux-riscv64-musl": "2.1.2", "@rspack/binding-linux-x64-gnu": "2.1.2", "@rspack/binding-linux-x64-musl": "2.1.2", "@rspack/binding-wasm32-wasi": "2.1.2", "@rspack/binding-win32-arm64-msvc": "2.1.2", "@rspack/binding-win32-ia32-msvc": "2.1.2", "@rspack/binding-win32-x64-msvc": "2.1.2" } }, "sha512-/mFcRSUW7Pl19KeaBIujJvZYNJQu0wD5D3aa5h+Qcph26v7nmLYlX7eajIHGi8tt2qTZX1lXifw2KLIXKwYaRQ=="],
|
||||
"@rspack/binding": ["@rspack/binding@2.1.3", "", { "optionalDependencies": { "@rspack/binding-darwin-arm64": "2.1.3", "@rspack/binding-darwin-x64": "2.1.3", "@rspack/binding-linux-arm64-gnu": "2.1.3", "@rspack/binding-linux-arm64-musl": "2.1.3", "@rspack/binding-linux-riscv64-gnu": "2.1.3", "@rspack/binding-linux-riscv64-musl": "2.1.3", "@rspack/binding-linux-x64-gnu": "2.1.3", "@rspack/binding-linux-x64-musl": "2.1.3", "@rspack/binding-wasm32-wasi": "2.1.3", "@rspack/binding-win32-arm64-msvc": "2.1.3", "@rspack/binding-win32-ia32-msvc": "2.1.3", "@rspack/binding-win32-x64-msvc": "2.1.3" } }, "sha512-4UGXJqUHmm36tWG1GgFZz3p8sQ5JuSgWI+gq1xPPoihS41uYJL3cXuJnirTeWsmVrusmYZTQhgU3tl3VYGcJYg=="],
|
||||
|
||||
"@rspack/binding-darwin-arm64": ["@rspack/binding-darwin-arm64@2.1.2", "", { "os": "darwin", "cpu": "arm64" }, "sha512-IYcxareUOYJZz+uNMSIwn+iDRiVyjZNOjoxO/zL4OFaPK8Ncrw0ka/9DqL9Gd7OpnAXN1zK3uS8yD0O1yIYI3Q=="],
|
||||
"@rspack/binding-darwin-arm64": ["@rspack/binding-darwin-arm64@2.1.3", "", { "os": "darwin", "cpu": "arm64" }, "sha512-oOGI0RSL89Ehu9T22rugmfUY9OC2eBqLMeWRYsu7bhlUrjoXeVfGBBSEXCse666BQ1sAiM8hD/k7nqVria/okQ=="],
|
||||
|
||||
"@rspack/binding-darwin-x64": ["@rspack/binding-darwin-x64@2.1.2", "", { "os": "darwin", "cpu": "x64" }, "sha512-aoifkILvx/XEHyvg8yW57xu95nx7f9f/3ah1+RguHSNKcJMcoCep9VX1Ct1N0ftqg8MC0JUObc7xWL5W14hmjA=="],
|
||||
"@rspack/binding-darwin-x64": ["@rspack/binding-darwin-x64@2.1.3", "", { "os": "darwin", "cpu": "x64" }, "sha512-sVqWXNiFTMXAyN362y6IA+eJc8LXZKfHdhEJ/zDuMmRp+u2IvhgaF8tk3vX/OmeB9jydVjySijuiqk8No/FoCA=="],
|
||||
|
||||
"@rspack/binding-linux-arm64-gnu": ["@rspack/binding-linux-arm64-gnu@2.1.2", "", { "os": "linux", "cpu": "arm64" }, "sha512-My4m40tyJSgiCEf3bB2KIEX710q3nZg99LIjy+8Zxgi3oZTkg1bFmFRusFU5U4eN5408zfSqDDGvjDE3Yv7o4w=="],
|
||||
"@rspack/binding-linux-arm64-gnu": ["@rspack/binding-linux-arm64-gnu@2.1.3", "", { "os": "linux", "cpu": "arm64" }, "sha512-aCy9Zli/2Qf+Ee5otXfFQ6mhv5fEyn0wIoBVmouqtJoqOO21et6UTtJ+LHLsMDolwGLyHERAljeSFSmYX3/O5A=="],
|
||||
|
||||
"@rspack/binding-linux-arm64-musl": ["@rspack/binding-linux-arm64-musl@2.1.2", "", { "os": "linux", "cpu": "arm64" }, "sha512-yt+GGWUH7WPE8K97cRc8OpZhH7Pbj1vU+lkvKbDtF/rR8X9a/bJsA/nBqyUV2oBKOVbrp5I8rFZlnDskMqgvKw=="],
|
||||
"@rspack/binding-linux-arm64-musl": ["@rspack/binding-linux-arm64-musl@2.1.3", "", { "os": "linux", "cpu": "arm64" }, "sha512-flIE7eluz0d21Fn28EVm3vPwoJooOSqtmjLFVSuOMcoCbwV9clfor195oIrAppp/W7dL/3XquFuVfrsa01Jy8Q=="],
|
||||
|
||||
"@rspack/binding-linux-riscv64-gnu": ["@rspack/binding-linux-riscv64-gnu@2.1.2", "", { "os": "linux", "cpu": "none" }, "sha512-uys8Jyw8Z3ralvICbN/L/nZfy5qELIwpOY72rhIqhoDYwFcL4fmMaY7WsvUcJOjCB2rqOcWPaWKuF2oPvo9iDQ=="],
|
||||
"@rspack/binding-linux-riscv64-gnu": ["@rspack/binding-linux-riscv64-gnu@2.1.3", "", { "os": "linux", "cpu": "none" }, "sha512-yojg8elye1nhsNeGncw0NrZ4pMGF7NVebR80CLg72TXyzfYwFJlFTdU5yUYb1Gy+JXIvrSCwzQt2QkyiEvmkfg=="],
|
||||
|
||||
"@rspack/binding-linux-riscv64-musl": ["@rspack/binding-linux-riscv64-musl@2.1.2", "", { "os": "linux", "cpu": "none" }, "sha512-JYNVQwqCaRGQWvjHQYzZkIzQiwllMaJwh4Rdu3ww6W2OJcJUqT08sL1pkOtU0iCxT4VUYiRRcp93VGTGpHr8fg=="],
|
||||
"@rspack/binding-linux-riscv64-musl": ["@rspack/binding-linux-riscv64-musl@2.1.3", "", { "os": "linux", "cpu": "none" }, "sha512-6PvbXb3FOK4X3S5QGvoSW/sqExmsvAoPnQ/YSFrXvTphkXFezA7wnobmGBHT8JQP31hcFRzJHIZSIOKktzSzzg=="],
|
||||
|
||||
"@rspack/binding-linux-x64-gnu": ["@rspack/binding-linux-x64-gnu@2.1.2", "", { "os": "linux", "cpu": "x64" }, "sha512-KDoPy0Msf/JLhxgPPrJQzZeB4Qpqd32em8AP5lSW2s6jR5I35dHgAe9xc2A++EQtnSrU4GTn6DBvFC7q84SihQ=="],
|
||||
"@rspack/binding-linux-x64-gnu": ["@rspack/binding-linux-x64-gnu@2.1.3", "", { "os": "linux", "cpu": "x64" }, "sha512-lMXjoGKf0SnviH596fmTszgtnXLHmWOoE90G8grG9MvKVa3pelRmfps5ewZL9s8ENf3NXRfOxIhIf/M9as6MqA=="],
|
||||
|
||||
"@rspack/binding-linux-x64-musl": ["@rspack/binding-linux-x64-musl@2.1.2", "", { "os": "linux", "cpu": "x64" }, "sha512-66hWmIGvn4zCKAYXJE9Bp5SNSLYnLFq2Ke/efE+ZtWy43Dd5vk9AAOmThVGBwdwmIxmGtHGCp+cAuS4G0wu0TA=="],
|
||||
"@rspack/binding-linux-x64-musl": ["@rspack/binding-linux-x64-musl@2.1.3", "", { "os": "linux", "cpu": "x64" }, "sha512-0esT35v7pW2ZsJTMc/zDUHwpNXlPqyUCyuiLJvrAAUcdENrgOVe4DmFrgVJ2hwqI4GjeN1VBnGRJ8c+edAHH5w=="],
|
||||
|
||||
"@rspack/binding-wasm32-wasi": ["@rspack/binding-wasm32-wasi@2.1.2", "", { "dependencies": { "@emnapi/core": "1.11.1", "@emnapi/runtime": "1.11.1", "@napi-rs/wasm-runtime": "1.1.6" }, "cpu": "none" }, "sha512-EB4SqH8DW/E/OmqssNQvnIVGQiVUyYNlA/pcc6Ia4MlTNwu6eNDppcNLrToH+kSZpL4CpHSFfSM3eIsSuar2Rw=="],
|
||||
"@rspack/binding-wasm32-wasi": ["@rspack/binding-wasm32-wasi@2.1.3", "", { "dependencies": { "@emnapi/core": "1.11.1", "@emnapi/runtime": "1.11.1", "@napi-rs/wasm-runtime": "1.1.6" }, "cpu": "none" }, "sha512-UsrDjD59UEP0mhfN/Z+uTc3vLgiUvIr+mn92WC1sbQi9gtZohTYvaQYFhWuMkBqsACGcmZp704JAbbSrVrVYCA=="],
|
||||
|
||||
"@rspack/binding-win32-arm64-msvc": ["@rspack/binding-win32-arm64-msvc@2.1.2", "", { "os": "win32", "cpu": "arm64" }, "sha512-T6Fs/g32MRja/UpCq4AdyPRj8tA0cOkcEa4PrAcn/ztUgK8b/qMVxj5mhMI+n7k+kHZQnpeB1Q4HqdSJi6OocA=="],
|
||||
"@rspack/binding-win32-arm64-msvc": ["@rspack/binding-win32-arm64-msvc@2.1.3", "", { "os": "win32", "cpu": "arm64" }, "sha512-42RS/SwKBTkNvXIPZXqTn0yEFN8zwGRfRe/ly0GDvPp/KxpLMFWxJmLxgtoLompU+0UCGvV4KpcBENt3oWs6BA=="],
|
||||
|
||||
"@rspack/binding-win32-ia32-msvc": ["@rspack/binding-win32-ia32-msvc@2.1.2", "", { "os": "win32", "cpu": "ia32" }, "sha512-OtxkFVz14mVL4QK8QriSELn9B6PaYGHw1jGJwVDEzpu2ZxSHCTQPz9dVE1ekYtREEqZUkRU7Fp7VfhJSmjTt2Q=="],
|
||||
"@rspack/binding-win32-ia32-msvc": ["@rspack/binding-win32-ia32-msvc@2.1.3", "", { "os": "win32", "cpu": "ia32" }, "sha512-thk43H1JHHbetNF3txcsGXeOwZi2m6Luf/uVUqNORXjxr5VV8woHAgaAx4QXVZRg70z1VDjd8mBWnHBnKI0FGA=="],
|
||||
|
||||
"@rspack/binding-win32-x64-msvc": ["@rspack/binding-win32-x64-msvc@2.1.2", "", { "os": "win32", "cpu": "x64" }, "sha512-Am+nx9fLF3nzgD/K05Bs1Bb+WO8SFLWAYRbXkymaL1r+RQxjRj7jd5ap2PhGOCcfaNA4yVWkAFvmFP92eRu7bQ=="],
|
||||
"@rspack/binding-win32-x64-msvc": ["@rspack/binding-win32-x64-msvc@2.1.3", "", { "os": "win32", "cpu": "x64" }, "sha512-ObaUcj+BHo/aBL1weyM3orApaHyAR5Phr3YNEpQEifxjZbNKM1iO5X5prN4OqEv3H+7o5e/Wh9Fy3N7Vvd+psA=="],
|
||||
|
||||
"@rspack/cli": ["@rspack/cli@2.1.2", "", { "peerDependencies": { "@rspack/core": "^2.0.0-0", "@rspack/dev-server": "^2.0.0-0" }, "optionalPeers": ["@rspack/dev-server"], "bin": { "rspack": "./bin/rspack.js" } }, "sha512-GTBsKuaeqDii6NaGPkQwvycMSjqMUMMRGiAwH0sXsFIn8X7sFa4xpoL7pIhbebVBDGzYhUBqWzNQFuL5u2FeoQ=="],
|
||||
"@rspack/cli": ["@rspack/cli@2.1.3", "", { "peerDependencies": { "@rspack/core": "^2.0.0-0", "@rspack/dev-server": "^2.0.0-0" }, "optionalPeers": ["@rspack/dev-server"], "bin": { "rspack": "./bin/rspack.js" } }, "sha512-TUhLdSfXiSD5D4A85pW7m4vCC/MtPk00+OK1qVtM2OGad/xTPNUtkOrvOz9CEaOLW3L7vkwo+dHc5fqkFEsFPQ=="],
|
||||
|
||||
"@rspack/core": ["@rspack/core@2.1.2", "", { "dependencies": { "@rspack/binding": "2.1.2" }, "peerDependencies": { "@module-federation/runtime-tools": "^0.24.1 || ^2.0.0", "@swc/helpers": "^0.5.23" }, "optionalPeers": ["@module-federation/runtime-tools", "@swc/helpers"] }, "sha512-crpNQKhHfnzrIl4Sa4fjH30Ho5aAPgyqpmJZ41SkUFOzyKHdZKYfE5LF3CMh7MiFQFPPxiiKf5BcpxmtZZx4MQ=="],
|
||||
"@rspack/core": ["@rspack/core@2.1.3", "", { "dependencies": { "@rspack/binding": "2.1.3" }, "peerDependencies": { "@module-federation/runtime-tools": "^0.24.1 || ^2.0.0", "@swc/helpers": "^0.5.23" }, "optionalPeers": ["@module-federation/runtime-tools", "@swc/helpers"] }, "sha512-1iGnxLrP+iyY0ZSjLZeQTaxrISpQz4yLyqJPmaF/l4uw27/dBcrloszAeLOJQ9jiv7EJtU0T5zB+LOFPpivIxA=="],
|
||||
|
||||
"@testing-library/dom": ["@testing-library/dom@10.4.1", "", { "dependencies": { "@babel/code-frame": "^7.10.4", "@babel/runtime": "^7.12.5", "@types/aria-query": "^5.0.1", "aria-query": "5.3.0", "dom-accessibility-api": "^0.5.9", "lz-string": "^1.5.0", "picocolors": "1.1.1", "pretty-format": "^27.0.2" } }, "sha512-o4PXJQidqJl82ckFaXUeoAW+XysPLauYI43Abki5hABd853iMhitooc6znOnczgbTYmEP6U6/y1ZyKAIsvMKGg=="],
|
||||
|
||||
@@ -241,6 +241,46 @@
|
||||
|
||||
"@types/ws": ["@types/ws@8.18.1", "", { "dependencies": { "@types/node": "*" } }, "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg=="],
|
||||
|
||||
"@typescript/typescript-aix-ppc64": ["@typescript/typescript-aix-ppc64@7.0.2", "", { "os": "aix", "cpu": "ppc64" }, "sha512-MTKKkWB7p/0E9xi1d1tHtZ5PiLkGEMIq88pK2CubZjOsLtYTLqhgIgi6zepFa+9GHZ6h05NMCkQxGKiPXMxXtQ=="],
|
||||
|
||||
"@typescript/typescript-darwin-arm64": ["@typescript/typescript-darwin-arm64@7.0.2", "", { "os": "darwin", "cpu": "arm64" }, "sha512-gowzar9MwS/aRWp6f3a4KUqzRjAZjOsmGNCM6LcTgXum+dBfgsBVMN+AgvOCCbguXyick6LJhpBszxMebJ8syA=="],
|
||||
|
||||
"@typescript/typescript-darwin-x64": ["@typescript/typescript-darwin-x64@7.0.2", "", { "os": "darwin", "cpu": "x64" }, "sha512-SZ9xZInqApNlNGc9s0W1VSsktYSOe9cFqNOIqmN1Gs8SmkjKZYFt017G4VwPxASInODuAdbTW7sXiFUf893RgA=="],
|
||||
|
||||
"@typescript/typescript-freebsd-arm64": ["@typescript/typescript-freebsd-arm64@7.0.2", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-W5NH4y/J0plIIS5b2xvTEkU7JFxyqdMAOgf+Ilhl0vHQXKO5dZoxd+C/jEtq56c4F3wk71RB4BMRQ2XdI+bwYQ=="],
|
||||
|
||||
"@typescript/typescript-freebsd-x64": ["@typescript/typescript-freebsd-x64@7.0.2", "", { "os": "freebsd", "cpu": "x64" }, "sha512-UMGDx5sTpzNw3WiPebH7l90IWfJggEd+egHt/q6p7/Cm3zqoV7VxkGXt+3DxPIw8CcmvAB0j3sVVfbhX+M4Tpw=="],
|
||||
|
||||
"@typescript/typescript-linux-arm": ["@typescript/typescript-linux-arm@7.0.2", "", { "os": "linux", "cpu": "arm" }, "sha512-gffT3xPz9sR7j/YJExkyPntrI0P2EP9XbOyWzth2/Gs0RstK+90RBcO0ncXoXy/beYll1SXw846Nf2zdnEz0QQ=="],
|
||||
|
||||
"@typescript/typescript-linux-arm64": ["@typescript/typescript-linux-arm64@7.0.2", "", { "os": "linux", "cpu": "arm64" }, "sha512-Qh4eU4/y3yDjnfjjyPYihMj5/ODIlmt+Bzu17OI+fiSRDW57QmU5SiN63exPRNJPKUzcc1INa1NXdrJ+MqHjUQ=="],
|
||||
|
||||
"@typescript/typescript-linux-loong64": ["@typescript/typescript-linux-loong64@7.0.2", "", { "os": "linux", "cpu": "none" }, "sha512-uEHck9i8hoAzXPiYRib1O7miOnz23SxIeVl6F4LXox+qov1K35jHcEW6VHKvZI+pyvl7fZEP4MCU5LYvIq1GuQ=="],
|
||||
|
||||
"@typescript/typescript-linux-mips64el": ["@typescript/typescript-linux-mips64el@7.0.2", "", { "os": "linux", "cpu": "none" }, "sha512-R4KvAMnE43W5Qeqb0Ly56O3mWMWIAgsMyz36DCaycd5nbg/9kzm0liw3JocfRqyJY0KPmzFjbswozXyW0DnIYA=="],
|
||||
|
||||
"@typescript/typescript-linux-ppc64": ["@typescript/typescript-linux-ppc64@7.0.2", "", { "os": "linux", "cpu": "ppc64" }, "sha512-DORx5b3sd/4S7eayxm4FQv+A7CrkUIGRaHiwI8oiHTAI1fAPWhF4J0vAlkC8biAlHSVVwxMQ3tjZ2/DVbnQiiA=="],
|
||||
|
||||
"@typescript/typescript-linux-riscv64": ["@typescript/typescript-linux-riscv64@7.0.2", "", { "os": "linux", "cpu": "none" }, "sha512-wf0jqEDOjrPRnKwYRyyJDRo11KMbvMFrU+q4zqKyChODBzvlkbhNQfKvLxQCcwTpdDaXSHZTVuh0JoCrKCUMHQ=="],
|
||||
|
||||
"@typescript/typescript-linux-s390x": ["@typescript/typescript-linux-s390x@7.0.2", "", { "os": "linux", "cpu": "s390x" }, "sha512-IkwJc3L7yhytWd/ewjyxNDfOmswCm9GWMJT/ue/dU4aZNbwZeYAetq42VyLmsmSjvoX7z74X6ZaYCtzAr0EuGw=="],
|
||||
|
||||
"@typescript/typescript-linux-x64": ["@typescript/typescript-linux-x64@7.0.2", "", { "os": "linux", "cpu": "x64" }, "sha512-EYdf2cNg7rgCWJnxCdJ+F3V39O8ihb37eHAu1LK8oAFizgTQbPOK7zHHXbPt8rX24COqODXeI3sIf0fCXG7H/A=="],
|
||||
|
||||
"@typescript/typescript-netbsd-arm64": ["@typescript/typescript-netbsd-arm64@7.0.2", "", { "os": "none", "cpu": "arm64" }, "sha512-+polYF4MF04aPpO5FTkHran9yUQDSXqy5GiSDKpsll5jy3l3+g9QLhpf39T+ePtefhXLOGrLl0QIjkQP6VnelA=="],
|
||||
|
||||
"@typescript/typescript-netbsd-x64": ["@typescript/typescript-netbsd-x64@7.0.2", "", { "os": "none", "cpu": "x64" }, "sha512-8YIT0EHM/3dq10ZOVF/A7pc/YSMtbcecct4rWtexrnSCHOPcpC2KTLXfTCR6vDpnSiY12heNb1GiN/wu+T/FyA=="],
|
||||
|
||||
"@typescript/typescript-openbsd-arm64": ["@typescript/typescript-openbsd-arm64@7.0.2", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-APT8+ClYnuYm1u9+kgGXoMj2VzWzcymwh2gNSQVySHfkRDGOTVkoWLjCmOQSaO+PoqQ57B0flRp9SA+7GnnkzQ=="],
|
||||
|
||||
"@typescript/typescript-openbsd-x64": ["@typescript/typescript-openbsd-x64@7.0.2", "", { "os": "openbsd", "cpu": "x64" }, "sha512-yX7s+Q0Dln0Dt9tEzZsAjXXR/+ytBM7AlglaqyeMPxQszJ1JhlJdZ6jLA+IzldHtflX81em7lDao1xXu+aRRkg=="],
|
||||
|
||||
"@typescript/typescript-sunos-x64": ["@typescript/typescript-sunos-x64@7.0.2", "", { "os": "sunos", "cpu": "x64" }, "sha512-dLJDGaLZ1D4HPQn62u1n8mBDkJREwMsAkCdkwd4Ieqw+x3TUyTsqY0YiBCtE6H6OzzgGk3iuZ3vFWRS+E8/d1g=="],
|
||||
|
||||
"@typescript/typescript-win32-arm64": ["@typescript/typescript-win32-arm64@7.0.2", "", { "os": "win32", "cpu": "arm64" }, "sha512-Gyl1Vy6OsWesLzmq+EP0Fb7b4Nid5232AvcA2SFcdYreldpNtYFFofPjnt62y9hQy7VTaZp65ICJjuAQRaVcIQ=="],
|
||||
|
||||
"@typescript/typescript-win32-x64": ["@typescript/typescript-win32-x64@7.0.2", "", { "os": "win32", "cpu": "x64" }, "sha512-0BQ3HkAHHlKLSp1qRvf3SUhGpGsDuhB/jgFw75guyqbxJqEaS0Cw/VFO8i2nHglJUzQCRtMMR/IBAKE3ETMC4g=="],
|
||||
|
||||
"@xmldom/xmldom": ["@xmldom/xmldom@0.9.10", "", {}, "sha512-A9gOqLdi6cV4ibazAjcQufGj0B1y/vDqYrcuP6d/6x8P27gRS8643Dj9o1dEKtB6O7fwxb2FgBmJS2mX7gpvdw=="],
|
||||
|
||||
"a-sync-waterfall": ["a-sync-waterfall@1.0.1", "", {}, "sha512-RYTOHHdWipFUliRFMCS4X2Yn2X8M87V/OpSqWzKKOGhzqyUxzyVmhHDH9sAvG+ZuQf/TAOFsLCpMw09I1ufUnA=="],
|
||||
@@ -369,7 +409,7 @@
|
||||
|
||||
"domhandler": ["domhandler@5.0.3", "", { "dependencies": { "domelementtype": "^2.3.0" } }, "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w=="],
|
||||
|
||||
"dompurify": ["dompurify@3.4.11", "", { "optionalDependencies": { "@types/trusted-types": "^2.0.7" } }, "sha512-zhlUV12GsaRzMsf9q5M254YhA4+VuF0fG+QFqu6aYpoGlKtz+w8//jBcGVYBgQkR5GHjUomejY84AV+/uPbWdw=="],
|
||||
"dompurify": ["dompurify@3.4.12", "", { "optionalDependencies": { "@types/trusted-types": "^2.0.7" } }, "sha512-zQvGet8Z2sWbQhCmfFz/T5QWH2oBmjnqK3qvOjaqaNLrLEF912WamU+ohnTp0TCep/MFVHpdJuCZEdFOdTnEFg=="],
|
||||
|
||||
"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=="],
|
||||
|
||||
@@ -527,9 +567,9 @@
|
||||
|
||||
"make-fetch-happen": ["make-fetch-happen@14.0.3", "", { "dependencies": { "@npmcli/agent": "^3.0.0", "cacache": "^19.0.1", "http-cache-semantics": "^4.1.1", "minipass": "^7.0.2", "minipass-fetch": "^4.0.0", "minipass-flush": "^1.0.5", "minipass-pipeline": "^1.2.4", "negotiator": "^1.0.0", "proc-log": "^5.0.0", "promise-retry": "^2.0.1", "ssri": "^12.0.0" } }, "sha512-QMjGbFTP0blj97EeidG5hk/QhKQ3T4ICckQGLgz38QF7Vgbk6e6FTARN8KhKxyBbWn8R0HU+bnw8aSoFPD4qtQ=="],
|
||||
|
||||
"marked": ["marked@18.0.5", "", { "bin": { "marked": "bin/marked.js" } }, "sha512-S6GcvALHg6K4ohtu4E7x0a1AqhAjp6cV8KhLSyN9qVapnzJkusVBxZRcIU9AeYsbe6P1hKDusSbEOzGyyuce6w=="],
|
||||
"marked": ["marked@18.0.6", "", { "bin": { "marked": "bin/marked.js" } }, "sha512-MrV5puXBfuiy6wl6DLaq3BtIJQAJToAd5zt/ZKhRfGRAuFPALE7/4Y7jnxRQoEgK/pBgurGqLyAuRgZ2xOjr6w=="],
|
||||
|
||||
"marked-base-url": ["marked-base-url@1.1.9", "", { "peerDependencies": { "marked": ">= 4 < 19" } }, "sha512-TqSI1Wni8aaIMwEe6YFv6uMBnNR1KICzLCEho29fmBrnb0RDvn+/nAU8BiWjpky/C/9zNG+L6TuOrfJBaajs3A=="],
|
||||
"marked-base-url": ["marked-base-url@1.1.10", "", { "peerDependencies": { "marked": ">= 4 < 19" } }, "sha512-Szoa+MAjZg1eiDiYrzK3JwJrgRPG7gvVyf858eOonKJKJB2JGP+Z6V83gvH85labGN1VHPgANq3Jk4V47u9xAA=="],
|
||||
|
||||
"marked-smartypants": ["marked-smartypants@1.1.12", "", { "dependencies": { "smartypants": "^0.2.2" }, "peerDependencies": { "marked": ">=4 <19" } }, "sha512-Z0QL2GpihbSeG5aaCrQxMEoqvngMftF/gq1SrdlCnbecUSrX3HYgPtCZzCW+OyNe2ideQqaFdxfGryqQX1MBDA=="],
|
||||
|
||||
@@ -767,7 +807,7 @@
|
||||
|
||||
"tar": ["tar@7.5.19", "", { "dependencies": { "@isaacs/fs-minipass": "^4.0.0", "chownr": "^3.0.0", "minipass": "^7.1.2", "minizlib": "^3.1.0", "yallist": "^5.0.0" } }, "sha512-4LeEWl96twnS2Q7Bz4MGqgazLqO+hJN63GZxXoIqh1T3VweYD997gbU1ItNsQafqqXTXd5WFyFdReLtwvRBNiw=="],
|
||||
|
||||
"terser": ["terser@5.48.0", "", { "dependencies": { "@jridgewell/source-map": "^0.3.3", "acorn": "^8.15.0", "commander": "^2.20.0", "source-map-support": "~0.5.20" }, "bin": { "terser": "bin/terser" } }, "sha512-J/9An6vs9Us6wKRriSFXBWdRZapREHqFzdNUKk0pmu804EMR6dr6winwo7e5JDxN4xahxQsuysyYFwlwj4XN/Q=="],
|
||||
"terser": ["terser@5.49.0", "", { "dependencies": { "@jridgewell/source-map": "^0.3.3", "acorn": "^8.15.0", "commander": "^2.20.0", "source-map-support": "~0.5.20" }, "bin": { "terser": "bin/terser" } }, "sha512-SNiDnXyHSrxVcIOtVbULzcTmniUiwcV7Nwdyj1twVubeTmbjoa8p69KKDpfkdoOavuM4/GRm1+ykI8qqnavHoA=="],
|
||||
|
||||
"tgfont": ["tgfont@workspace:packages/tgfont"],
|
||||
|
||||
@@ -807,7 +847,7 @@
|
||||
|
||||
"type-fest": ["type-fest@0.7.1", "", {}, "sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg=="],
|
||||
|
||||
"typescript": ["typescript@6.0.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw=="],
|
||||
"typescript": ["typescript@7.0.2", "", { "optionalDependencies": { "@typescript/typescript-aix-ppc64": "7.0.2", "@typescript/typescript-darwin-arm64": "7.0.2", "@typescript/typescript-darwin-x64": "7.0.2", "@typescript/typescript-freebsd-arm64": "7.0.2", "@typescript/typescript-freebsd-x64": "7.0.2", "@typescript/typescript-linux-arm": "7.0.2", "@typescript/typescript-linux-arm64": "7.0.2", "@typescript/typescript-linux-loong64": "7.0.2", "@typescript/typescript-linux-mips64el": "7.0.2", "@typescript/typescript-linux-ppc64": "7.0.2", "@typescript/typescript-linux-riscv64": "7.0.2", "@typescript/typescript-linux-s390x": "7.0.2", "@typescript/typescript-linux-x64": "7.0.2", "@typescript/typescript-netbsd-arm64": "7.0.2", "@typescript/typescript-netbsd-x64": "7.0.2", "@typescript/typescript-openbsd-arm64": "7.0.2", "@typescript/typescript-openbsd-x64": "7.0.2", "@typescript/typescript-sunos-x64": "7.0.2", "@typescript/typescript-win32-arm64": "7.0.2", "@typescript/typescript-win32-x64": "7.0.2" }, "bin": { "tsc": "bin/tsc" } }, "sha512-8FYau96o3NKOhbjKi/qNvG/W5jhzxkbdm5sj9AbZ/5T5sWqn3hJgLfGx27sRKZWTvyzCP8dLRBTf5tBTSRVUNA=="],
|
||||
|
||||
"undici": ["undici@6.27.0", "", {}, "sha512-YmfV3YnEDzXRC5lZ2jWtWWHKGUm1zIt8AhesR1tens+HTNv+YZlN/dp6G727LOvMJ8xjP9Be7Y2Sdr96LDm+pg=="],
|
||||
|
||||
|
||||
+3
-3
@@ -4,8 +4,8 @@
|
||||
"type": "module",
|
||||
"devDependencies": {
|
||||
"@happy-dom/global-registrator": "^20.10.6",
|
||||
"@rspack/cli": "^2.1.2",
|
||||
"@rspack/core": "^2.1.2",
|
||||
"@rspack/cli": "^2.1.3",
|
||||
"@rspack/core": "^2.1.3",
|
||||
"@testing-library/react": "^16.3.2",
|
||||
"@types/bun": "^1.3.14",
|
||||
"@types/react": "^19.2.17",
|
||||
@@ -15,7 +15,7 @@
|
||||
"css-loader": "^7.1.4",
|
||||
"sass-embedded": "^1.100.0",
|
||||
"sass-loader": "^17.0.0",
|
||||
"typescript": "^6.0.3"
|
||||
"typescript": "^7.0.2"
|
||||
},
|
||||
"packageManager": "bun@1.3.3",
|
||||
"private": true,
|
||||
|
||||
@@ -3,10 +3,10 @@ import type { ServerWebSocket } from 'bun';
|
||||
import { createLogger, directLog } from '../logging';
|
||||
import { retrace } from './retrace';
|
||||
|
||||
interface LinkSocketData {
|
||||
type LinkSocketData = {
|
||||
id: string;
|
||||
createdAt: number;
|
||||
}
|
||||
};
|
||||
|
||||
let server: Bun.Server<LinkSocketData>;
|
||||
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
"version": "6.0.0",
|
||||
"dependencies": {
|
||||
"common": "workspace:*",
|
||||
"dompurify": "^3.4.11",
|
||||
"dompurify": "^3.4.12",
|
||||
"es-toolkit": "^1.49.0",
|
||||
"jotai": "^2.20.1",
|
||||
"react": "^19.2.7",
|
||||
|
||||
@@ -9,6 +9,6 @@
|
||||
},
|
||||
"dependencies": {
|
||||
"clean-css-cli": "^5.6.3",
|
||||
"terser": "^5.48.0"
|
||||
"terser": "^5.49.0"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import { useBackend } from 'tgui/backend';
|
||||
import { formatUnits } from 'tgui/interfaces/common/ChemicalContents';
|
||||
import { Box, Section, Stack } from 'tgui-core/components';
|
||||
import { formatUnits } from '../common/ChemicalContents';
|
||||
import type { Data } from './types';
|
||||
|
||||
export const BorgHypoRecipeDisplay = (props) => {
|
||||
|
||||
+1
-1
@@ -1,5 +1,5 @@
|
||||
import { MarkdownSpoilerText } from 'tgui/interfaces/common/SpoilerText';
|
||||
import { Box, Button, Section, Table } from 'tgui-core/components';
|
||||
import { MarkdownSpoilerText } from '../common/SpoilerText';
|
||||
import { getTagColor } from './constants';
|
||||
import { validateLink } from './functions';
|
||||
import type { mobEntry } from './types';
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
import { useBackend } from 'tgui/backend';
|
||||
import { BeakerContents } from 'tgui/interfaces/common/ChemicalContents';
|
||||
import { Box, Button, Section, Stack } from 'tgui-core/components';
|
||||
|
||||
import { BeakerContents } from '../common/ChemicalContents';
|
||||
import { removeAmounts } from './constants';
|
||||
import type { Data } from './types';
|
||||
|
||||
@@ -52,7 +51,7 @@ export const ChemDispenserBeaker = (props) => {
|
||||
}
|
||||
>
|
||||
<BeakerContents
|
||||
beakerLoaded={recordedContents || isBeakerLoaded}
|
||||
beakerLoaded={!!recordedContents || isBeakerLoaded}
|
||||
beakerContents={recordedContents || beakerContents}
|
||||
buttons={(chemical) => (
|
||||
<Stack>
|
||||
|
||||
@@ -1,9 +1,8 @@
|
||||
import { useBackend } from 'tgui/backend';
|
||||
import { BeakerContents } from 'tgui/interfaces/common/ChemicalContents';
|
||||
import { modalOpen } from 'tgui/interfaces/common/ComplexModal';
|
||||
import { Box, Button, Section, Stack } from 'tgui-core/components';
|
||||
import type { BooleanLike } from 'tgui-core/react';
|
||||
|
||||
import { BeakerContents } from '../common/ChemicalContents';
|
||||
import { modalOpen } from '../common/ComplexModal';
|
||||
import { transferAmounts } from './constants';
|
||||
import type { reagent } from './types';
|
||||
|
||||
@@ -15,33 +14,36 @@ export const ChemMasterBeaker = (props: {
|
||||
const { act } = useBackend();
|
||||
const { beaker, beakerReagents, bufferNonEmpty } = props;
|
||||
|
||||
const headerButton = (<> {bufferNonEmpty ? (
|
||||
<Button.Confirm
|
||||
icon="eject"
|
||||
disabled={!beaker}
|
||||
onClick={() => act('eject')}
|
||||
>
|
||||
Eject and Keep Buffer
|
||||
</Button.Confirm>
|
||||
const headerButton = bufferNonEmpty ? (
|
||||
<>
|
||||
<Button.Confirm
|
||||
icon="eject"
|
||||
disabled={!beaker}
|
||||
onClick={() => act('eject')}
|
||||
>
|
||||
Eject and Keep Buffer
|
||||
</Button.Confirm>
|
||||
<Button.Confirm
|
||||
icon="eject"
|
||||
disabled={!beaker}
|
||||
onClick={() => act('ejectandclear')}
|
||||
>
|
||||
Eject and Clear Buffer
|
||||
</Button.Confirm>
|
||||
</>
|
||||
) : (
|
||||
<Button icon="eject" disabled={!beaker} onClick={() => act('eject')}>
|
||||
Eject and Keep Buffer
|
||||
</Button>
|
||||
)}
|
||||
{bufferNonEmpty ? (
|
||||
<Button.Confirm
|
||||
icon="eject"
|
||||
disabled={!beaker}
|
||||
onClick={() => act('ejectandclear')}
|
||||
>
|
||||
Eject and Clear Buffer
|
||||
</Button.Confirm>
|
||||
) : (
|
||||
<Button icon="eject" disabled={!beaker} onClick={() => act('ejectandclear')}>
|
||||
Eject and Clear Buffer
|
||||
</Button>
|
||||
)}
|
||||
</>
|
||||
<>
|
||||
<Button icon="eject" disabled={!beaker} onClick={() => act('eject')}>
|
||||
Eject and Keep Buffer
|
||||
</Button>
|
||||
<Button
|
||||
icon="eject"
|
||||
disabled={!beaker}
|
||||
onClick={() => act('ejectandclear')}
|
||||
>
|
||||
Eject and Clear Buffer
|
||||
</Button>
|
||||
</>
|
||||
);
|
||||
|
||||
return (
|
||||
|
||||
@@ -1,9 +1,8 @@
|
||||
import { useBackend } from 'tgui/backend';
|
||||
import { BufferContents } from 'tgui/interfaces/common/ChemicalContents';
|
||||
import { modalOpen } from 'tgui/interfaces/common/ComplexModal';
|
||||
import { Box, Button, Section, Stack } from 'tgui-core/components';
|
||||
import type { BooleanLike } from 'tgui-core/react';
|
||||
|
||||
import { BufferContents } from '../common/ChemicalContents';
|
||||
import { modalOpen } from '../common/ComplexModal';
|
||||
import { transferAmounts } from './constants';
|
||||
import type { reagent } from './types';
|
||||
|
||||
|
||||
@@ -1,9 +1,8 @@
|
||||
import { useBackend } from 'tgui/backend';
|
||||
import { modalOpen } from 'tgui/interfaces/common/ComplexModal';
|
||||
import { Box, Button, Section } from 'tgui-core/components';
|
||||
import type { BooleanLike } from 'tgui-core/react';
|
||||
|
||||
import { modalOpen } from '../common/ComplexModal';
|
||||
|
||||
export const ChemMasterCustomization = (props: {
|
||||
loaded_pill_bottle: BooleanLike;
|
||||
loaded_pill_bottle_name: string;
|
||||
|
||||
@@ -1,8 +1,7 @@
|
||||
import { modalOpen } from 'tgui/interfaces/common/ComplexModal';
|
||||
import { Box, Button, LabeledList } from 'tgui-core/components';
|
||||
import { classes } from 'tgui-core/react';
|
||||
|
||||
import { modalOpen } from '../common/ComplexModal';
|
||||
|
||||
export const ChemMasterProductionChemical = (props: {
|
||||
pillsprite: string;
|
||||
bottlesprite: string;
|
||||
|
||||
@@ -1,8 +1,7 @@
|
||||
import { useBackend } from 'tgui/backend';
|
||||
import { modalOpen } from 'tgui/interfaces/common/ComplexModal';
|
||||
import { Button } from 'tgui-core/components';
|
||||
|
||||
import { modalOpen } from '../common/ComplexModal';
|
||||
|
||||
export const ChemMasterProductionCondiment = (props) => {
|
||||
const { act } = useBackend();
|
||||
return (
|
||||
|
||||
@@ -1,10 +1,9 @@
|
||||
import { useBackend } from 'tgui/backend';
|
||||
import { Window } from 'tgui/layouts';
|
||||
|
||||
import {
|
||||
ComplexModal,
|
||||
modalRegisterBodyOverride,
|
||||
} from '../common/ComplexModal';
|
||||
} from 'tgui/interfaces/common/ComplexModal';
|
||||
import { Window } from 'tgui/layouts';
|
||||
import { analyzeModalBodyOverride } from './ChemMasterAnalyzeModalBodyOverride';
|
||||
import { ChemMasterBeaker } from './ChemMasterBeaker';
|
||||
import { ChemMasterBuffer } from './ChemMasterBuffer';
|
||||
@@ -35,10 +34,7 @@ export const ChemMaster = (props) => {
|
||||
beakerReagents={beaker_reagents}
|
||||
bufferNonEmpty={buffer_reagents.length > 0}
|
||||
/>
|
||||
<ChemMasterBuffer
|
||||
mode={mode}
|
||||
bufferReagents={buffer_reagents}
|
||||
/>
|
||||
<ChemMasterBuffer mode={mode} bufferReagents={buffer_reagents} />
|
||||
<ChemMasterProduction
|
||||
isCondiment={condi}
|
||||
bufferNonEmpty={buffer_reagents.length > 0}
|
||||
|
||||
@@ -1,6 +1,9 @@
|
||||
import { useBackend } from 'tgui/backend';
|
||||
import {
|
||||
AnimatedArrows,
|
||||
AnimatedArrowsLeft,
|
||||
} from 'tgui/interfaces/common/AnimatedArrows';
|
||||
import { Box, Button, Section, Stack } from 'tgui-core/components';
|
||||
import { AnimatedArrows, AnimatedArrowsLeft } from '../common/AnimatedArrows';
|
||||
import { VorePanelTooltip } from '../VorePanel/VorePanelElements/VorePanelTooltip';
|
||||
import { gameTooltip } from './constants';
|
||||
import { gameStateToText, stateToColor } from './functions';
|
||||
|
||||
@@ -174,7 +174,7 @@ export const ColorPickerModal: React.FC<ColorPickerModalProps> = () => {
|
||||
);
|
||||
};
|
||||
|
||||
interface ColorPresetsProps {
|
||||
type ColorPresetsProps = {
|
||||
setColor: (color: HsvaColor) => void;
|
||||
setShowPresets: (show: boolean) => void;
|
||||
presetList?: string[][];
|
||||
@@ -182,7 +182,7 @@ interface ColorPresetsProps {
|
||||
onSelectedPreset: React.Dispatch<React.SetStateAction<number | undefined>>;
|
||||
allowEditing?: boolean;
|
||||
onAllowEditing?: React.Dispatch<React.SetStateAction<boolean>>;
|
||||
}
|
||||
};
|
||||
|
||||
const ColorPresets: React.FC<ColorPresetsProps> = React.memo(
|
||||
({
|
||||
@@ -275,7 +275,7 @@ const ColorPresets: React.FC<ColorPresetsProps> = React.memo(
|
||||
},
|
||||
);
|
||||
|
||||
interface ColorSelectorProps {
|
||||
type ColorSelectorProps = {
|
||||
color: HsvaColor;
|
||||
setColor: React.Dispatch<React.SetStateAction<HsvaColor>>;
|
||||
defaultColor: string;
|
||||
@@ -284,7 +284,7 @@ interface ColorSelectorProps {
|
||||
onSelectedPreset: React.Dispatch<React.SetStateAction<number | undefined>>;
|
||||
allowEditing?: boolean;
|
||||
onAllowEditing?: React.Dispatch<React.SetStateAction<boolean>>;
|
||||
}
|
||||
};
|
||||
|
||||
export const ColorSelector: React.FC<ColorSelectorProps> = React.memo(
|
||||
({
|
||||
@@ -399,10 +399,10 @@ export const ColorSelector: React.FC<ColorSelectorProps> = React.memo(
|
||||
},
|
||||
);
|
||||
|
||||
interface RowProps {
|
||||
type RowProps = {
|
||||
color: HsvaColor;
|
||||
handleChange: (c: Partial<HsvaColor>) => void;
|
||||
}
|
||||
};
|
||||
|
||||
const HueRow: React.FC<RowProps> = React.memo(({ color, handleChange }) => (
|
||||
<Stack.Item>
|
||||
@@ -467,10 +467,10 @@ const ValueRow: React.FC<RowProps> = React.memo(({ color, handleChange }) => (
|
||||
</Stack.Item>
|
||||
));
|
||||
|
||||
interface RGBRowProps {
|
||||
type RGBRowProps = {
|
||||
color: HsvaColor;
|
||||
handleChange: (c: HsvaColor) => void;
|
||||
}
|
||||
};
|
||||
|
||||
const RedRow: React.FC<RGBRowProps> = React.memo(({ color, handleChange }) => {
|
||||
const rgb = hsvaToRgba(color);
|
||||
@@ -549,13 +549,13 @@ const BlueRow: React.FC<RGBRowProps> = React.memo(({ color, handleChange }) => {
|
||||
);
|
||||
});
|
||||
|
||||
interface TextSetterProps {
|
||||
type TextSetterProps = {
|
||||
value: number;
|
||||
callback: (value: number) => void;
|
||||
min?: number;
|
||||
max?: number;
|
||||
unit?: string;
|
||||
}
|
||||
};
|
||||
|
||||
const TextSetter: React.FC<TextSetterProps> = React.memo(
|
||||
({ value, callback, min = 0, max = 100, unit }) => {
|
||||
@@ -573,13 +573,13 @@ const TextSetter: React.FC<TextSetterProps> = React.memo(
|
||||
},
|
||||
);
|
||||
|
||||
interface HexColorInputProps {
|
||||
type HexColorInputProps = {
|
||||
prefixed?: boolean;
|
||||
alpha?: boolean;
|
||||
color: string;
|
||||
fluid?: boolean;
|
||||
onChange: (newColor: string) => void;
|
||||
}
|
||||
};
|
||||
|
||||
const HexColorInput: React.FC<HexColorInputProps> = React.memo(
|
||||
({ alpha, color, fluid, onChange, ...rest }) => {
|
||||
@@ -641,10 +641,10 @@ const HexColorInput: React.FC<HexColorInputProps> = React.memo(
|
||||
},
|
||||
);
|
||||
|
||||
interface SaturationValueProps {
|
||||
type SaturationValueProps = {
|
||||
hsva: HsvaColor;
|
||||
onChange: (newColor: Partial<HsvaColor>) => void;
|
||||
}
|
||||
};
|
||||
|
||||
const SaturationValue: React.FC<SaturationValueProps> = React.memo(
|
||||
({ hsva, onChange }) => {
|
||||
@@ -698,11 +698,11 @@ const SaturationValue: React.FC<SaturationValueProps> = React.memo(
|
||||
},
|
||||
);
|
||||
|
||||
interface HueProps {
|
||||
type HueProps = {
|
||||
className?: string;
|
||||
hue: number;
|
||||
onChange: (newHue: Partial<HsvaColor>) => void;
|
||||
}
|
||||
};
|
||||
|
||||
const Hue: React.FC<HueProps> = React.memo(({ className, hue, onChange }) => {
|
||||
const handleMove = (interaction: Interaction) => {
|
||||
@@ -737,11 +737,11 @@ const Hue: React.FC<HueProps> = React.memo(({ className, hue, onChange }) => {
|
||||
);
|
||||
});
|
||||
|
||||
interface SaturationProps {
|
||||
type SaturationProps = {
|
||||
className?: string;
|
||||
color: HsvaColor;
|
||||
onChange: (newSaturation: Partial<HsvaColor>) => void;
|
||||
}
|
||||
};
|
||||
|
||||
const Saturation: React.FC<SaturationProps> = React.memo(
|
||||
({ className, color, onChange }) => {
|
||||
@@ -795,11 +795,11 @@ const Saturation: React.FC<SaturationProps> = React.memo(
|
||||
},
|
||||
);
|
||||
|
||||
interface ValueProps {
|
||||
type ValueProps = {
|
||||
className?: string;
|
||||
color: HsvaColor;
|
||||
onChange: (newValue: Partial<HsvaColor>) => void;
|
||||
}
|
||||
};
|
||||
|
||||
const Value: React.FC<ValueProps> = React.memo(
|
||||
({ className, color, onChange }) => {
|
||||
@@ -852,12 +852,12 @@ const Value: React.FC<ValueProps> = React.memo(
|
||||
},
|
||||
);
|
||||
|
||||
interface RGBSliderProps {
|
||||
type RGBSliderProps = {
|
||||
className?: string;
|
||||
color: HsvaColor;
|
||||
onChange: (newValue: HsvaColor) => void;
|
||||
target: 'r' | 'g' | 'b';
|
||||
}
|
||||
};
|
||||
|
||||
const RGBSlider: React.FC<RGBSliderProps> = React.memo(
|
||||
({ className, color, onChange, target }) => {
|
||||
|
||||
@@ -1,8 +1,7 @@
|
||||
import { useBackend } from 'tgui/backend';
|
||||
import { ComplexModal } from 'tgui/interfaces/common/ComplexModal';
|
||||
import { Window } from 'tgui/layouts';
|
||||
import { Stack } from 'tgui-core/components';
|
||||
|
||||
import { ComplexModal } from '../common/ComplexModal';
|
||||
import { DNAModifierIrradiating } from './DNAModifierIrradiating';
|
||||
import { DNAModifierMain } from './DNAModifierMain';
|
||||
import { DNAModifierOccupant } from './DNAModifierOccupant';
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
import { sortBy } from 'es-toolkit';
|
||||
import type { ReactNode } from 'react';
|
||||
import { useSharedState } from 'tgui/backend';
|
||||
import { SearchBar } from 'tgui/interfaces/common/SearchBar';
|
||||
import {
|
||||
Dimmer,
|
||||
Icon,
|
||||
@@ -9,7 +10,6 @@ import {
|
||||
VirtualList,
|
||||
} from 'tgui-core/components';
|
||||
import { classes } from 'tgui-core/react';
|
||||
import { SearchBar } from '../common/SearchBar';
|
||||
import type { Design, MaterialMap } from './Types';
|
||||
|
||||
/**
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
import { useBackend } from 'tgui/backend';
|
||||
import { modalOpen } from 'tgui/interfaces/common/ComplexModal';
|
||||
import { Box, Button, Image, LabeledList, Section } from 'tgui-core/components';
|
||||
|
||||
import { modalOpen } from '../common/ComplexModal';
|
||||
import { doEdit } from './functions';
|
||||
import type { Data } from './types';
|
||||
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
import { modalOpen } from 'tgui/interfaces/common/ComplexModal';
|
||||
import { flow } from 'tgui-core/fp';
|
||||
import { createSearch } from 'tgui-core/string';
|
||||
|
||||
import { modalOpen } from '../common/ComplexModal';
|
||||
import type { field, record } from './types';
|
||||
|
||||
export function doEdit(field: field) {
|
||||
|
||||
@@ -1,11 +1,10 @@
|
||||
import { useBackend } from 'tgui/backend';
|
||||
import { ComplexModal } from 'tgui/interfaces/common/ComplexModal';
|
||||
import { LoginInfo } from 'tgui/interfaces/common/LoginInfo';
|
||||
import { LoginScreen } from 'tgui/interfaces/common/LoginScreen';
|
||||
import { TemporaryNotice } from 'tgui/interfaces/common/TemporaryNotice';
|
||||
import { Window } from 'tgui/layouts';
|
||||
import { Section } from 'tgui-core/components';
|
||||
|
||||
import { ComplexModal } from '../common/ComplexModal';
|
||||
import { LoginInfo } from '../common/LoginInfo';
|
||||
import { LoginScreen } from '../common/LoginScreen';
|
||||
import { TemporaryNotice } from '../common/TemporaryNotice';
|
||||
import { GeneralRecordsList } from './GeneralRecordsList';
|
||||
import {
|
||||
GeneralRecordsMaintenance,
|
||||
|
||||
@@ -1,11 +1,13 @@
|
||||
import { Component } from 'react';
|
||||
import { resolveAsset } from 'tgui/assets';
|
||||
import { useBackend, useSharedState } from 'tgui/backend';
|
||||
import {
|
||||
type Connection,
|
||||
Connections,
|
||||
} from 'tgui/interfaces/common/Connections';
|
||||
// TODO: Replace when tgui-core is fixed https://github.com/tgstation/tgui-core/issues/25
|
||||
import { InfinitePlane } from 'tgui-core/components';
|
||||
import { decodeHtmlEntities } from 'tgui-core/string';
|
||||
|
||||
import { type Connection, Connections } from '../common/Connections';
|
||||
import { CircuitComponent } from './CircuitComponent';
|
||||
import type { PortProps } from './Port';
|
||||
import {
|
||||
|
||||
@@ -1,205 +0,0 @@
|
||||
import { useState } from 'react';
|
||||
import { useBackend } from 'tgui/backend';
|
||||
import { Window } from 'tgui/layouts';
|
||||
import {
|
||||
Box,
|
||||
Button,
|
||||
Collapsible,
|
||||
Input,
|
||||
Section,
|
||||
Stack,
|
||||
Table,
|
||||
} from 'tgui-core/components';
|
||||
import { createSearch } from 'tgui-core/string';
|
||||
|
||||
type Data = { amount: number; recipes: Record<string, recipe>[] };
|
||||
|
||||
type recipe = {
|
||||
res_amount: number;
|
||||
max_res_amount: number;
|
||||
req_amount: number;
|
||||
ref: string;
|
||||
};
|
||||
|
||||
export const MaterialStack = (props) => {
|
||||
const { data } = useBackend<Data>();
|
||||
|
||||
const { amount, recipes } = data;
|
||||
const [searchText, setSearchText] = useState('');
|
||||
|
||||
return (
|
||||
<Window width={400} height={600}>
|
||||
<Window.Content scrollable>
|
||||
<Section title={`Amount: ${amount}`}>
|
||||
<Stack vertical>
|
||||
<Stack.Item>
|
||||
<Input
|
||||
fluid
|
||||
placeholder="Search for recipe..."
|
||||
value={searchText}
|
||||
onChange={(val) => setSearchText(val)}
|
||||
/>
|
||||
</Stack.Item>
|
||||
<Stack.Item>
|
||||
<RecipeList recipes={recipes} searchText={searchText} />
|
||||
</Stack.Item>
|
||||
</Stack>
|
||||
</Section>
|
||||
</Window.Content>
|
||||
</Window>
|
||||
);
|
||||
};
|
||||
|
||||
const RecipeList = (props: {
|
||||
recipes: Record<string, recipe>[];
|
||||
searchText: string;
|
||||
}) => {
|
||||
const { recipes, searchText } = props;
|
||||
|
||||
const sortedKeys = Object.keys(recipes).sort();
|
||||
|
||||
const searcher = createSearch<string>(searchText, (recipe) => {
|
||||
return recipe;
|
||||
});
|
||||
|
||||
const filteredKeys = sortedKeys.filter(searcher);
|
||||
|
||||
// Shunt all categories to the top.
|
||||
// We're not using this for now, keeping it here in case someone really hates color coding later.
|
||||
// let nonCategories = sortedKeys.filter(item => recipes[item].ref !== undefined);
|
||||
// let categories = sortedKeys.filter(item => recipes[item].ref === undefined);
|
||||
|
||||
// categories.unshift("--DIVIDER--");
|
||||
|
||||
// let newSortedKeys = nonCategories.concat(categories);
|
||||
|
||||
return filteredKeys.map((title, index) => {
|
||||
// if (title === "--DIVIDER--") {
|
||||
// return (
|
||||
// <Box mt={1} mb={1}>
|
||||
// <Divider />
|
||||
// </Box>
|
||||
// );
|
||||
// }
|
||||
const recipe = recipes[title];
|
||||
if (recipe.ref === undefined) {
|
||||
return (
|
||||
<Collapsible key={index} ml={1} mb={-0.7} color="label" title={title}>
|
||||
<Box ml={1}>
|
||||
<RecipeList recipes={recipe} searchText={searchText} />
|
||||
</Box>
|
||||
</Collapsible>
|
||||
);
|
||||
} else {
|
||||
return <Recipe key={index} title={title} recipe={recipe} />;
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
const buildMultiplier = (recipe: recipe, amount: number) => {
|
||||
if (recipe.req_amount > amount) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
return Math.floor(amount / recipe.req_amount);
|
||||
};
|
||||
|
||||
const Multipliers = (props) => {
|
||||
const { act, data } = useBackend();
|
||||
|
||||
const { recipe, maxMultiplier } = props;
|
||||
|
||||
const maxM = Math.min(
|
||||
maxMultiplier,
|
||||
Math.floor(recipe.max_res_amount / recipe.res_amount),
|
||||
);
|
||||
|
||||
const multipliers = [5, 10, 25];
|
||||
|
||||
const finalResult: React.JSX.Element[] = [];
|
||||
|
||||
for (const multiplier of multipliers) {
|
||||
if (maxM >= multiplier) {
|
||||
finalResult.push(
|
||||
<Button
|
||||
onClick={() =>
|
||||
act('make', {
|
||||
ref: recipe.ref,
|
||||
multiplier: multiplier,
|
||||
})
|
||||
}
|
||||
>
|
||||
{`${multiplier * recipe.res_amount}x`}
|
||||
</Button>,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
if (multipliers.indexOf(maxM) === -1) {
|
||||
finalResult.push(
|
||||
<Button
|
||||
onClick={() =>
|
||||
act('make', {
|
||||
ref: recipe.ref,
|
||||
multiplier: maxM,
|
||||
})
|
||||
}
|
||||
>
|
||||
{`${maxM * recipe.res_amount}x`}
|
||||
</Button>,
|
||||
);
|
||||
}
|
||||
|
||||
return finalResult;
|
||||
};
|
||||
|
||||
const Recipe = (props: { recipe: recipe; title: string }) => {
|
||||
const { act, data } = useBackend<Data>();
|
||||
|
||||
const { amount } = data;
|
||||
|
||||
const { recipe, title } = props;
|
||||
|
||||
const { res_amount, max_res_amount, req_amount, ref } = recipe;
|
||||
|
||||
let buttonName = title;
|
||||
buttonName += ' (';
|
||||
buttonName += `${req_amount} `;
|
||||
buttonName += `sheet${req_amount > 1 ? 's' : ''}`;
|
||||
buttonName += ')';
|
||||
|
||||
if (res_amount > 1) {
|
||||
buttonName = `${res_amount}x ${buttonName}`;
|
||||
}
|
||||
|
||||
const maxMultiplier = buildMultiplier(recipe, amount);
|
||||
|
||||
return (
|
||||
<Box>
|
||||
<Table>
|
||||
<Table.Row>
|
||||
<Table.Cell>
|
||||
<Button
|
||||
fluid
|
||||
disabled={!maxMultiplier}
|
||||
icon="wrench"
|
||||
onClick={() =>
|
||||
act('make', {
|
||||
ref: recipe.ref,
|
||||
multiplier: 1,
|
||||
})
|
||||
}
|
||||
>
|
||||
{buttonName}
|
||||
</Button>
|
||||
</Table.Cell>
|
||||
{max_res_amount > 1 && maxMultiplier > 1 && (
|
||||
<Table.Cell collapsing>
|
||||
<Multipliers recipe={recipe} maxMultiplier={maxMultiplier} />
|
||||
</Table.Cell>
|
||||
)}
|
||||
</Table.Row>
|
||||
</Table>
|
||||
</Box>
|
||||
);
|
||||
};
|
||||
@@ -0,0 +1,104 @@
|
||||
import { useBackend } from 'tgui/backend';
|
||||
import { Box, Button, Table } from 'tgui-core/components';
|
||||
import { buildMultiplier } from './functions';
|
||||
import type { Data, Recipe } from './types';
|
||||
|
||||
export const RecipeElement = (props: { recipe: Recipe; title: string }) => {
|
||||
const { act, data } = useBackend<Data>();
|
||||
|
||||
const { amount } = data;
|
||||
|
||||
const { recipe, title } = props;
|
||||
|
||||
const { res_amount, max_res_amount, req_amount, ref } = recipe;
|
||||
|
||||
let buttonName = title;
|
||||
buttonName += ' (';
|
||||
buttonName += `${req_amount} `;
|
||||
buttonName += `sheet${req_amount > 1 ? 's' : ''}`;
|
||||
buttonName += ')';
|
||||
|
||||
if (res_amount > 1) {
|
||||
buttonName = `${res_amount}x ${buttonName}`;
|
||||
}
|
||||
|
||||
const maxMultiplier = buildMultiplier(recipe, amount);
|
||||
|
||||
return (
|
||||
<Box>
|
||||
<Table>
|
||||
<Table.Row>
|
||||
<Table.Cell>
|
||||
<Button
|
||||
fluid
|
||||
disabled={!maxMultiplier}
|
||||
icon="wrench"
|
||||
onClick={() =>
|
||||
act('make', {
|
||||
ref: recipe.ref,
|
||||
multiplier: 1,
|
||||
})
|
||||
}
|
||||
>
|
||||
{buttonName}
|
||||
</Button>
|
||||
</Table.Cell>
|
||||
{max_res_amount > 1 && maxMultiplier > 1 && (
|
||||
<Table.Cell collapsing>
|
||||
<Multipliers recipe={recipe} maxMultiplier={maxMultiplier} />
|
||||
</Table.Cell>
|
||||
)}
|
||||
</Table.Row>
|
||||
</Table>
|
||||
</Box>
|
||||
);
|
||||
};
|
||||
|
||||
const Multipliers = (props) => {
|
||||
const { act, data } = useBackend();
|
||||
|
||||
const { recipe, maxMultiplier } = props;
|
||||
|
||||
const maxM = Math.min(
|
||||
maxMultiplier,
|
||||
Math.floor(recipe.max_res_amount / recipe.res_amount),
|
||||
);
|
||||
|
||||
const multipliers = [5, 10, 25];
|
||||
|
||||
const finalResult: React.JSX.Element[] = [];
|
||||
|
||||
for (const multiplier of multipliers) {
|
||||
if (maxM >= multiplier) {
|
||||
finalResult.push(
|
||||
<Button
|
||||
onClick={() =>
|
||||
act('make', {
|
||||
ref: recipe.ref,
|
||||
multiplier: multiplier,
|
||||
})
|
||||
}
|
||||
>
|
||||
{`${multiplier * recipe.res_amount}x`}
|
||||
</Button>,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
if (multipliers.indexOf(maxM) === -1) {
|
||||
finalResult.push(
|
||||
<Button
|
||||
onClick={() =>
|
||||
act('make', {
|
||||
ref: recipe.ref,
|
||||
multiplier: maxM,
|
||||
})
|
||||
}
|
||||
>
|
||||
{`${maxM * recipe.res_amount}x`}
|
||||
</Button>,
|
||||
);
|
||||
}
|
||||
|
||||
return finalResult;
|
||||
};
|
||||
@@ -0,0 +1,53 @@
|
||||
import { Box, Collapsible } from 'tgui-core/components';
|
||||
import { createSearch } from 'tgui-core/string';
|
||||
import { isRecipe, treeSearch } from './functions';
|
||||
import { RecipeElement } from './RecipeElement';
|
||||
import type { RecipeTree } from './types';
|
||||
|
||||
export const RecipeList = (props: {
|
||||
recipes: RecipeTree;
|
||||
searchText: string;
|
||||
}) => {
|
||||
const { recipes, searchText } = props;
|
||||
|
||||
const sortedKeys = Object.keys(recipes).sort();
|
||||
|
||||
const searcher = createSearch<string>(searchText, (recipe) => {
|
||||
return recipe;
|
||||
});
|
||||
|
||||
const filteredKeys = sortedKeys.filter((title) =>
|
||||
treeSearch(title, recipes[title], searcher),
|
||||
);
|
||||
|
||||
// Shunt all categories to the top.
|
||||
// We're not using this for now, keeping it here in case someone really hates color coding later.
|
||||
// let nonCategories = sortedKeys.filter(item => recipes[item].ref !== undefined);
|
||||
// let categories = sortedKeys.filter(item => recipes[item].ref === undefined);
|
||||
|
||||
// categories.unshift("--DIVIDER--");
|
||||
|
||||
// let newSortedKeys = nonCategories.concat(categories);
|
||||
|
||||
return filteredKeys.map((title, index) => {
|
||||
// if (title === "--DIVIDER--") {
|
||||
// return (
|
||||
// <Box mt={1} mb={1}>
|
||||
// <Divider />
|
||||
// </Box>
|
||||
// );
|
||||
// }
|
||||
const recipe = recipes[title];
|
||||
if (isRecipe(recipe)) {
|
||||
return <RecipeElement key={index} title={title} recipe={recipe} />;
|
||||
} else {
|
||||
return (
|
||||
<Collapsible key={index} ml={1} mb={-0.7} color="label" title={title}>
|
||||
<Box ml={1}>
|
||||
<RecipeList recipes={recipe} searchText={searchText} />
|
||||
</Box>
|
||||
</Collapsible>
|
||||
);
|
||||
}
|
||||
});
|
||||
};
|
||||
@@ -0,0 +1,31 @@
|
||||
import type { Recipe, RecipeNode } from './types';
|
||||
|
||||
export function isRecipe(node: RecipeNode): node is Recipe {
|
||||
return 'ref' in node;
|
||||
}
|
||||
|
||||
export function treeSearch(
|
||||
title: string,
|
||||
node: RecipeNode,
|
||||
search: (s: string) => boolean,
|
||||
): boolean {
|
||||
if (search(title)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
if (isRecipe(node)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return Object.entries(node).some(([childTitle, child]) =>
|
||||
treeSearch(childTitle, child, search),
|
||||
);
|
||||
}
|
||||
|
||||
export function buildMultiplier(recipe: Recipe, amount: number) {
|
||||
if (recipe.req_amount > amount) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
return Math.floor(amount / recipe.req_amount);
|
||||
}
|
||||
@@ -0,0 +1,35 @@
|
||||
import { useState } from 'react';
|
||||
import { useBackend } from 'tgui/backend';
|
||||
import { Window } from 'tgui/layouts';
|
||||
import { Input, Section, Stack } from 'tgui-core/components';
|
||||
import { RecipeList } from './RecipeList';
|
||||
import type { Data } from './types';
|
||||
|
||||
export const MaterialStack = (props) => {
|
||||
const { data } = useBackend<Data>();
|
||||
|
||||
const { amount, recipes } = data;
|
||||
const [searchText, setSearchText] = useState('');
|
||||
|
||||
return (
|
||||
<Window width={400} height={600}>
|
||||
<Window.Content scrollable>
|
||||
<Section title={`Amount: ${amount}`}>
|
||||
<Stack vertical>
|
||||
<Stack.Item>
|
||||
<Input
|
||||
fluid
|
||||
placeholder="Search for recipe..."
|
||||
value={searchText}
|
||||
onChange={(val) => setSearchText(val)}
|
||||
/>
|
||||
</Stack.Item>
|
||||
<Stack.Item>
|
||||
<RecipeList recipes={recipes} searchText={searchText} />
|
||||
</Stack.Item>
|
||||
</Stack>
|
||||
</Section>
|
||||
</Window.Content>
|
||||
</Window>
|
||||
);
|
||||
};
|
||||
@@ -0,0 +1,14 @@
|
||||
export type Recipe = {
|
||||
res_amount: number;
|
||||
max_res_amount: number;
|
||||
req_amount: number;
|
||||
ref: string;
|
||||
};
|
||||
|
||||
export type RecipeTree = {
|
||||
[key: string]: Recipe | RecipeTree;
|
||||
};
|
||||
|
||||
export type RecipeNode = Recipe | RecipeTree;
|
||||
|
||||
export type Data = { amount: number; recipes: RecipeTree };
|
||||
@@ -1,7 +1,6 @@
|
||||
import { useBackend } from 'tgui/backend';
|
||||
import { modalOpen } from 'tgui/interfaces/common/ComplexModal';
|
||||
import { Box, Button, LabeledList, Section } from 'tgui-core/components';
|
||||
|
||||
import { modalOpen } from '../common/ComplexModal';
|
||||
import { doEdit } from '../GeneralRecords/functions';
|
||||
import type { Data } from './types';
|
||||
|
||||
|
||||
@@ -1,14 +1,13 @@
|
||||
import { useBackend } from 'tgui/backend';
|
||||
import { Window } from 'tgui/layouts';
|
||||
import { Section, Stack } from 'tgui-core/components';
|
||||
|
||||
import {
|
||||
ComplexModal,
|
||||
modalRegisterBodyOverride,
|
||||
} from '../common/ComplexModal';
|
||||
import { LoginInfo } from '../common/LoginInfo';
|
||||
import { LoginScreen } from '../common/LoginScreen';
|
||||
import { TemporaryNotice } from '../common/TemporaryNotice';
|
||||
} from 'tgui/interfaces/common/ComplexModal';
|
||||
import { LoginInfo } from 'tgui/interfaces/common/LoginInfo';
|
||||
import { LoginScreen } from 'tgui/interfaces/common/LoginScreen';
|
||||
import { TemporaryNotice } from 'tgui/interfaces/common/TemporaryNotice';
|
||||
import { Window } from 'tgui/layouts';
|
||||
import { Section, Stack } from 'tgui-core/components';
|
||||
import { MedicalRecordsList } from './MedicalRecordsList';
|
||||
import { MedicalRecordsMedbots } from './MedicalRecordsMedbots';
|
||||
import {
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
import { useBackend } from 'tgui/backend';
|
||||
import { FullscreenNotice } from 'tgui/interfaces/common/FullscreenNotice';
|
||||
import { Box } from 'tgui-core/components';
|
||||
|
||||
import { FullscreenNotice } from '../common/FullscreenNotice';
|
||||
import type { Data } from './types';
|
||||
|
||||
export const MessageMonitorHack = (props) => {
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
import { useBackend } from 'tgui/backend';
|
||||
import { FullscreenNotice } from 'tgui/interfaces/common/FullscreenNotice';
|
||||
import { Box, Button, Icon, Input } from 'tgui-core/components';
|
||||
|
||||
import { FullscreenNotice } from '../common/FullscreenNotice';
|
||||
import type { Data } from './types';
|
||||
|
||||
export const MessageMonitorLogin = (props) => {
|
||||
|
||||
@@ -1,8 +1,7 @@
|
||||
import { useBackend } from 'tgui/backend';
|
||||
import { TemporaryNotice } from 'tgui/interfaces/common/TemporaryNotice';
|
||||
import { Window } from 'tgui/layouts';
|
||||
import { Box } from 'tgui-core/components';
|
||||
|
||||
import { TemporaryNotice } from '../common/TemporaryNotice';
|
||||
import { MessageMonitorContent } from './MessageMonitorContent';
|
||||
import { MessageMonitorHack } from './MessageMonitorHack';
|
||||
import { MessageMonitorLogin } from './MessageMonitorLogin';
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
import { useBackend } from 'tgui/backend';
|
||||
import { RankIcon } from 'tgui/interfaces/common/RankIcon';
|
||||
import { Button, Icon, NoticeBox, Section, Stack } from 'tgui-core/components';
|
||||
|
||||
import { RankIcon } from '../common/RankIcon';
|
||||
import type { Target } from './types';
|
||||
|
||||
export const ModifyRobotNoModule = (props: { target: Target }) => {
|
||||
|
||||
@@ -1,8 +1,7 @@
|
||||
import { useSharedState } from 'tgui/backend';
|
||||
import { TemporaryNotice } from 'tgui/interfaces/common/TemporaryNotice';
|
||||
import { Window } from 'tgui/layouts';
|
||||
import { Box } from 'tgui-core/components';
|
||||
|
||||
import { TemporaryNotice } from '../common/TemporaryNotice';
|
||||
import {
|
||||
NEWSCASTER_SCREEN_MAIN,
|
||||
NEWSCASTER_SCREEN_NEWCHANNEL,
|
||||
|
||||
@@ -1,11 +1,10 @@
|
||||
import { useBackend } from 'tgui/backend';
|
||||
import { ComplexModal } from 'tgui/interfaces/common/ComplexModal';
|
||||
import { LoginInfo } from 'tgui/interfaces/common/LoginInfo';
|
||||
import { LoginScreen } from 'tgui/interfaces/common/LoginScreen';
|
||||
import { TemporaryNotice } from 'tgui/interfaces/common/TemporaryNotice';
|
||||
import { Window } from 'tgui/layouts';
|
||||
import { Section } from 'tgui-core/components';
|
||||
|
||||
import { ComplexModal } from '../common/ComplexModal';
|
||||
import { LoginInfo } from '../common/LoginInfo';
|
||||
import { LoginScreen } from '../common/LoginScreen';
|
||||
import { TemporaryNotice } from '../common/TemporaryNotice';
|
||||
import { SecurityRecordsList } from './SecurityRecordsList';
|
||||
import {
|
||||
SecurityRecordsMaintenance,
|
||||
|
||||
@@ -1,6 +1,9 @@
|
||||
import { useBackend } from 'tgui/backend';
|
||||
import {
|
||||
AnimatedArrows,
|
||||
AnimatedArrowsLeft,
|
||||
} from 'tgui/interfaces/common/AnimatedArrows';
|
||||
import { Box, Button, Section, Stack } from 'tgui-core/components';
|
||||
import { AnimatedArrows, AnimatedArrowsLeft } from '../common/AnimatedArrows';
|
||||
import { VorePanelTooltip } from '../VorePanel/VorePanelElements/VorePanelTooltip';
|
||||
import { gameStateToText, gameTooltip } from './constants';
|
||||
import { stateToColor } from './functions';
|
||||
|
||||
@@ -28,14 +28,14 @@ type SpawnPanelData = {
|
||||
preferences?: SpawnPanelPreferences;
|
||||
};
|
||||
|
||||
interface SpawnPreferences {
|
||||
type SpawnPreferences = {
|
||||
hide_icons: boolean;
|
||||
hide_mappings: boolean;
|
||||
sort_by: string;
|
||||
search_text: string;
|
||||
search_by: string;
|
||||
selected_atom?: string;
|
||||
}
|
||||
};
|
||||
|
||||
export function CreateObject(props: CreateObjectProps) {
|
||||
const { act, data } = useBackend<SpawnPanelData>();
|
||||
|
||||
@@ -12,10 +12,10 @@ type SpawnPanelData = {
|
||||
apply_icon_override?: boolean;
|
||||
};
|
||||
|
||||
interface CreateObjectAdvancedSettingsProps {
|
||||
type CreateObjectAdvancedSettingsProps = {
|
||||
iconSettings: IconSettings;
|
||||
onIconSettingsChange: (settings: Partial<IconSettings>) => void;
|
||||
}
|
||||
};
|
||||
|
||||
export function CreateObjectAdvancedSettings(
|
||||
props: CreateObjectAdvancedSettingsProps,
|
||||
|
||||
@@ -28,11 +28,11 @@ export type SpawnPanelData = {
|
||||
precise_mode: string;
|
||||
};
|
||||
|
||||
interface CreateObjectSettingsProps {
|
||||
type CreateObjectSettingsProps = {
|
||||
onCreateObject?: (obj: Record<string, unknown>) => void;
|
||||
setAdvancedSettings: (value: boolean) => void;
|
||||
iconSettings: IconSettings;
|
||||
}
|
||||
};
|
||||
|
||||
export function CreateObjectSettings(props: CreateObjectSettingsProps) {
|
||||
const { onCreateObject, setAdvancedSettings, iconSettings } = props;
|
||||
|
||||
@@ -9,12 +9,12 @@ import { CreateObject } from './CreateObject';
|
||||
import { CreateObjectAdvancedSettings } from './CreateObjectAdvancedSettings';
|
||||
import type { CreateObjectData } from './types';
|
||||
|
||||
export interface IconSettings {
|
||||
export type IconSettings = {
|
||||
icon: string | null;
|
||||
iconState: string | null;
|
||||
iconSize: number;
|
||||
applyIcon?: boolean;
|
||||
}
|
||||
};
|
||||
|
||||
export function SpawnPanel() {
|
||||
const [data, setData] = useState<CreateObjectData | undefined>();
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import type { BooleanLike } from 'tgui-core/react';
|
||||
|
||||
export interface SpawnPreferences {
|
||||
export type SpawnPreferences = {
|
||||
hide_icons: boolean;
|
||||
hide_mappings: boolean;
|
||||
sort_by: string;
|
||||
@@ -12,30 +12,30 @@ export interface SpawnPreferences {
|
||||
object_count: number;
|
||||
dir: number;
|
||||
object_name: string;
|
||||
}
|
||||
};
|
||||
|
||||
export interface SpawnPanelPreferences {
|
||||
export type SpawnPanelPreferences = {
|
||||
hide_icons: boolean;
|
||||
hide_mappings: boolean;
|
||||
sort_by: string;
|
||||
search_text: string;
|
||||
search_by: string;
|
||||
}
|
||||
};
|
||||
|
||||
export interface AtomData {
|
||||
export type AtomData = {
|
||||
icon: string;
|
||||
icon_state: string;
|
||||
name: string;
|
||||
description?: string;
|
||||
mapping: BooleanLike;
|
||||
type: 'Objects' | 'Turfs' | 'Mobs';
|
||||
}
|
||||
};
|
||||
|
||||
export interface CreateObjectData {
|
||||
export type CreateObjectData = {
|
||||
atoms: Record<string, AtomData>;
|
||||
}
|
||||
};
|
||||
|
||||
export interface CreateObjectProps {
|
||||
export type CreateObjectProps = {
|
||||
objList: CreateObjectData;
|
||||
setAdvancedSettings: (value: boolean) => void;
|
||||
iconSettings: {
|
||||
@@ -50,4 +50,4 @@ export interface CreateObjectProps {
|
||||
iconSize: number;
|
||||
}>,
|
||||
) => void;
|
||||
}
|
||||
};
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import { useBackend } from 'tgui/backend';
|
||||
import { buildIconData } from '../common/TechWebRecipeIcon';
|
||||
import { buildIconData } from 'tgui/interfaces/common/TechWebRecipeIcon';
|
||||
import type { NodeCache, TechWebData } from './types';
|
||||
|
||||
type Cost = {
|
||||
|
||||
@@ -1,12 +1,18 @@
|
||||
import type { Reagent } from 'tgui/interfaces/ChemDispenser/types';
|
||||
import { Box, Stack } from 'tgui-core/components';
|
||||
|
||||
export const formatUnits = (a) => `${a} unit${a === 1 ? '' : 's'}`;
|
||||
export function formatUnits(a: number) {
|
||||
return `${a} unit${a === 1 ? '' : 's'}`;
|
||||
}
|
||||
|
||||
/**
|
||||
* Displays a beaker's contents
|
||||
* @property {object} props
|
||||
*/
|
||||
export const BeakerContents = (props) => {
|
||||
export const BeakerContents = (props: {
|
||||
beakerLoaded: boolean;
|
||||
beakerContents: Reagent[];
|
||||
buttons: (chemical: Reagent, i: number) => React.JSX.Element;
|
||||
}) => {
|
||||
const { beakerLoaded, beakerContents = [], buttons } = props;
|
||||
return (
|
||||
<Box>
|
||||
@@ -15,36 +21,53 @@ export const BeakerContents = (props) => {
|
||||
<Box color="label">The beaker is empty.</Box>
|
||||
))}
|
||||
{beakerContents.map((chemical, i) => (
|
||||
<Box key={i} width="100%">
|
||||
<Stack align="center" justify="space-between">
|
||||
<Stack.Item color="label">
|
||||
{formatUnits(chemical.volume)} of {chemical.name}
|
||||
</Stack.Item>
|
||||
{!!buttons && <Stack.Item>{buttons(chemical, i)}</Stack.Item>}
|
||||
</Stack>
|
||||
</Box>
|
||||
<ChemEntry
|
||||
key={chemical.name}
|
||||
chemical={chemical}
|
||||
buttons={buttons}
|
||||
index={i}
|
||||
/>
|
||||
))}
|
||||
</Box>
|
||||
);
|
||||
};
|
||||
/** Like above, but for buffer contents */
|
||||
export const BufferContents = (props) => {
|
||||
|
||||
export const BufferContents = (props: {
|
||||
bufferContents: Reagent[];
|
||||
buttons: (chemical: Reagent, i: number) => React.JSX.Element;
|
||||
}) => {
|
||||
const { bufferContents = [], buttons } = props;
|
||||
return (
|
||||
<Box>
|
||||
{(bufferContents.length === 0 && (
|
||||
<Box color="label">The buffer is empty.</Box>
|
||||
))}
|
||||
{bufferContents.length === 0 && (
|
||||
<Box color="label">The buffer is empty.</Box>
|
||||
)}
|
||||
{bufferContents.map((chemical, i) => (
|
||||
<Box key={i} width="100%">
|
||||
<Stack align="center" justify="space-between">
|
||||
<Stack.Item color="label">
|
||||
{formatUnits(chemical.volume)} of {chemical.name}
|
||||
</Stack.Item>
|
||||
{!!buttons && <Stack.Item>{buttons(chemical, i)}</Stack.Item>}
|
||||
</Stack>
|
||||
</Box>
|
||||
<ChemEntry
|
||||
key={chemical.name}
|
||||
chemical={chemical}
|
||||
buttons={buttons}
|
||||
index={i}
|
||||
/>
|
||||
))}
|
||||
</Box>
|
||||
);
|
||||
};
|
||||
|
||||
const ChemEntry = (props: {
|
||||
chemical: Reagent;
|
||||
buttons: (chemical: Reagent, i: number) => React.JSX.Element;
|
||||
index: number;
|
||||
}) => {
|
||||
const { chemical, buttons, index } = props;
|
||||
return (
|
||||
<Box width="100%">
|
||||
<Stack align="center" justify="space-between">
|
||||
<Stack.Item color="label">
|
||||
{formatUnits(chemical.volume)} of {chemical.name}
|
||||
</Stack.Item>
|
||||
{!!buttons && <Stack.Item>{buttons(chemical, index)}</Stack.Item>}
|
||||
</Stack>
|
||||
</Box>
|
||||
);
|
||||
};
|
||||
|
||||
@@ -4,13 +4,13 @@
|
||||
"dependencies": {
|
||||
"common": "workspace:*",
|
||||
"dateformat": "^5.0.3",
|
||||
"dompurify": "^3.4.11",
|
||||
"dompurify": "^3.4.12",
|
||||
"es-toolkit": "^1.49.0",
|
||||
"highlight.js": "^11.11.1",
|
||||
"jotai": "^2.20.1",
|
||||
"js-yaml": "^5.2.1",
|
||||
"marked": "^18.0.5",
|
||||
"marked-base-url": "^1.1.9",
|
||||
"marked": "^18.0.6",
|
||||
"marked-base-url": "^1.1.10",
|
||||
"marked-smartypants": "^1.1.12",
|
||||
"react": "^19.2.7",
|
||||
"react-dom": "^19.2.7",
|
||||
|
||||
@@ -293,9 +293,6 @@ export const BunTarget = new Juke.Target({
|
||||
export const BiomeInstallTarget = new Juke.Target({
|
||||
dependsOn: [BunTarget],
|
||||
inputs: ['package.json', 'bun.lock'],
|
||||
onlyWhen: () => {
|
||||
return Juke.glob('node_modules/@biomejs/**').length === 0;
|
||||
},
|
||||
executes: () => {
|
||||
return bunRoot('install');
|
||||
},
|
||||
|
||||
Reference in New Issue
Block a user