{ "name": "kvm-ui", "version": "2025.12.11.1200", "private": true, "type": "module", "scripts": { "dev": "./dev_device.sh", "dev:ssl": "USE_SSL=true ./dev_device.sh", "dev:cloud": "vite dev --mode=cloud-development", "build": "npm run build:prod", "build:device": "npm run i18n:compile && tsc && vite build --mode=device --emptyOutDir", "build:staging": "npm run i18n:compile && tsc && vite build --mode=cloud-staging", "build:prod": "npm run i18n:compile && tsc && vite build --mode=cloud-production", "lint": "npm run i18n:compile && npm run lint:only", "lint:only": "oxlint ./src", "lint:fix": "npm run i18n:compile && npm run lint:fixonly", "lint:fixonly": "oxlint ./src --fix", "i18n": "npm run i18n:resort && npm run i18n:validate && npm run i18n:compile", "i18n:resort": "python3 tools/resort_messages.py", "i18n:validate": "inlang validate --project ./localization/jetKVM.UI.inlang", "i18n:compile": "paraglide-js compile --project ./localization/jetKVM.UI.inlang --outdir ./localization/paraglide", "i18n:machine-translate": "inlang machine translate --project ./localization/jetKVM.UI.inlang && npm run i18n:resort", "i18n:audit": "npm run i18n:find-dupes && npm run i18n:find-excess && npm run i18n:find-unused", "i18n:find-excess": "python3 ./tools/find_excess_messages.py", "i18n:find-unused": "python3 ./tools/find_unused_messages.py", "i18n:find-dupes": "python3 ./tools/find_duplicate_translations.py", "test:e2e": "playwright test", "prepare": "cd .. && husky ui/.husky" }, "dependencies": { "@headlessui/react": "^2.2.9", "@headlessui/tailwindcss": "^0.2.2", "@heroicons/react": "^2.2.0", "@vitejs/plugin-basic-ssl": "^2.3.0", "@xterm/addon-clipboard": "^0.1.0", "@xterm/addon-fit": "^0.10.0", "@xterm/addon-unicode11": "^0.8.0", "@xterm/addon-web-links": "^0.11.0", "@xterm/addon-webgl": "^0.18.0", "@xterm/xterm": "^5.5.0", "cva": "^1.0.0-beta.4", "dayjs": "^1.11.19", "focus-trap-react": "^11.0.4", "framer-motion": "^12.23.26", "mini-svg-data-uri": "^1.4.4", "react": "^19.2.3", "react-animate-height": "^3.2.3", "react-dom": "^19.2.3", "react-hook-form": "^7.68.0", "react-hot-toast": "^2.6.0", "react-icons": "^5.5.0", "react-router": "^7.10.1", "react-simple-keyboard": "^3.8.141", "react-use-websocket": "^4.13.0", "react-xtermjs": "^1.0.10", "recharts": "^3.5.1", "semver": "^7.7.3", "tailwind-merge": "^3.4.0", "tesseract.js": "^7.0.0", "tslog": "^4.10.2", "usehooks-ts": "^3.1.1", "validator": "^13.15.23", "zustand": "^4.5.2" }, "devDependencies": { "@inlang/cli": "^3.0.12", "@inlang/paraglide-js": "^2.6.0", "@inlang/plugin-m-function-matcher": "^2.1.0", "@inlang/plugin-message-format": "^4.0.0", "@inlang/sdk": "^2.4.9", "@playwright/test": "^1.49.0", "@tailwindcss/forms": "^0.5.10", "@tailwindcss/postcss": "^4.1.18", "@tailwindcss/typography": "^0.5.19", "@tailwindcss/vite": "^4.2.2", "@types/node": "^24.10.1", "@types/react": "^19.2.7", "@types/react-dom": "^19.2.3", "@types/semver": "^7.7.1", "@types/validator": "^13.15.10", "@vitejs/plugin-react-swc": "^4.3.0", "autoprefixer": "^10.4.23", "husky": "^9.1.7", "lint-staged": "^16.4.0", "oxfmt": "^0.42.0", "oxlint": "^1.57.0", "oxlint-tsgolint": "^0.18.1", "postcss": "^8.5.6", "tailwindcss": "^4.1.18", "typescript": "^5.9.3", "vite": "^8.0.3" }, "lint-staged": { "*.{ts,tsx}": "oxlint --fix --deny-warnings", "*.{ts,tsx,js,jsx,css,md}": "oxfmt", "localization/messages/*.json": "npm run i18n:resort" }, "engines": { "node": "^22.21.1" } }