* feat(library): load resized CDN covers with ThumbHash placeholders Library and profile responses now carry an images map with resized WebP copies of each artwork URL and a ThumbHash. Cards use it to load the copy that fits instead of the full-size Steam image, and show the decoded ThumbHash until the image loads, instead of a blank box. - Grid and profile cards use a srcset of the cover widths. - The large library card loads its hero and logo at the width it needs. - A broken copy falls back to the original URL. - Decoded placeholders are cached, up to 1,000 entries. - Games without a copy render exactly as before. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014J6EZ4iUeZf8tKJxAZ18TP * fix(library): pick a larger hero when the window grows The large card read the window width only while rendering. Because the card is memoized, enlarging the window kept the smaller hero copy. The card now subscribes to resizes and re-renders only when the picked copy changes. Also stub the new image hook and helpers in the large-card achievement test, which failed to load them. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014J6EZ4iUeZf8tKJxAZ18TP --------- Co-authored-by: Chubby Granny Chaser <hydralauncher@proton.me> Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
163 lines
5.9 KiB
JSON
163 lines
5.9 KiB
JSON
{
|
|
"name": "hydralauncher",
|
|
"version": "4.3.0",
|
|
"description": "Hydra",
|
|
"main": "./out/main/index.js",
|
|
"author": "Los Broxas",
|
|
"repository": {
|
|
"type": "git",
|
|
"url": "https://github.com/hydralauncher/hydra.git"
|
|
},
|
|
"type": "module",
|
|
"engines": {
|
|
"npm": "please-use-yarn",
|
|
"yarn": ">= 1.19.1"
|
|
},
|
|
"scripts": {
|
|
"format": "prettier --write .",
|
|
"format-check": "prettier --check .",
|
|
"test": "node --import ./scripts/register-ts-node.mjs --test \"src/**/*.test.ts\" \"src/**/*.test.cjs\" \"scripts/*.test.mjs\"",
|
|
"lint": "eslint . --ext .js,.jsx,.cjs,.mjs,.ts,.tsx,.cts,.mts --fix",
|
|
"typecheck:node": "tsc --noEmit -p tsconfig.node.json --composite false",
|
|
"typecheck:web": "tsc --noEmit -p tsconfig.web.json --composite false",
|
|
"typecheck": "npm run typecheck:node && npm run typecheck:web",
|
|
"check:ota-bridge": "node scripts/check-ota-bridge.mjs",
|
|
"build:native": "node ./scripts/build-native-addon.cjs",
|
|
"prepare:legendary": "node ./scripts/prepare-legendary.cjs",
|
|
"start": "electron-vite preview",
|
|
"dev": "electron-vite dev",
|
|
"build": "npm run typecheck && electron-vite build",
|
|
"postinstall": "npm run build:native && electron-builder install-app-deps && node ./scripts/postinstall.cjs && npm run prepare:legendary",
|
|
"build:unpack": "npm run build:native && npm run build && electron-builder --dir",
|
|
"build:win": "npm run build:native && electron-vite build && electron-builder --win",
|
|
"build:mac": "npm run build:native && electron-vite build && electron-builder --mac",
|
|
"build:linux": "npm run build:native && electron-vite build && electron-builder --linux",
|
|
"dev:big-picture": "vite dev src/big-picture",
|
|
"prepare": "husky"
|
|
},
|
|
"dependencies": {
|
|
"@atlaskit/pragmatic-drag-and-drop": "^1.8.1",
|
|
"@electron-toolkit/preload": "^3.0.2",
|
|
"@electron-toolkit/utils": "^4.0.0",
|
|
"@floating-ui/dom": "^1.7.6",
|
|
"@fontsource/noto-sans": "^5.2.10",
|
|
"@fontsource/space-grotesk": "^5.2.10",
|
|
"@hookform/resolvers": "^5.2.2",
|
|
"@monaco-editor/react": "^4.6.0",
|
|
"@phosphor-icons/react": "^2.1.10",
|
|
"@primer/octicons-react": "^19.9.0",
|
|
"@radix-ui/react-dropdown-menu": "^2.1.16",
|
|
"@radix-ui/react-slot": "^1.2.4",
|
|
"@reduxjs/toolkit": "^2.2.3",
|
|
"@sentry/react": "^10.33.0",
|
|
"@tanstack/react-virtual": "^3.14.3",
|
|
"@tiptap/extension-bold": "^3.6.2",
|
|
"@tiptap/extension-italic": "^3.6.2",
|
|
"@tiptap/extension-link": "^3.6.2",
|
|
"@tiptap/extension-underline": "^3.6.2",
|
|
"@tiptap/pm": "^3.6.7",
|
|
"@tiptap/react": "^3.6.2",
|
|
"@tiptap/starter-kit": "^3.6.2",
|
|
"auto-launch": "^5.0.6",
|
|
"axios": "^1.18.0",
|
|
"axios-cookiejar-support": "^5.0.5",
|
|
"canvas-confetti": "^1.9.4",
|
|
"classic-level": "^2.0.0",
|
|
"classnames": "^2.5.1",
|
|
"color": "^4.2.3",
|
|
"color.js": "^1.2.0",
|
|
"country-flag-icons": "^1.6.17",
|
|
"crc": "^4.3.2",
|
|
"create-desktop-shortcuts": "^1.11.1",
|
|
"date-fns": "^3.6.0",
|
|
"detect-drives": "^1.3.0",
|
|
"electron-log": "^5.4.3",
|
|
"electron-updater": "^6.6.2",
|
|
"embla-carousel-autoplay": "^8.6.0",
|
|
"embla-carousel-react": "^8.6.0",
|
|
"file-type": "^21.3.2",
|
|
"framer-motion": "^12.15.0",
|
|
"hls.js": "^1.5.12",
|
|
"i18next": "^23.11.2",
|
|
"i18next-browser-languagedetector": "^7.2.1",
|
|
"jsdom": "^24.0.0",
|
|
"jsonwebtoken": "^9.0.2",
|
|
"lodash-es": "^4.18.1",
|
|
"lucide-react": "^0.544.0",
|
|
"markdown-it": "^14.0.0",
|
|
"node-7z": "^3.0.0",
|
|
"node-disk-info": "^1.3.0",
|
|
"parse-torrent": "^11.0.18",
|
|
"png-to-ico": "^3.0.1",
|
|
"rc-virtual-list": "^3.18.3",
|
|
"react-dnd": "^16.0.1",
|
|
"react-dnd-html5-backend": "^16.0.1",
|
|
"react-hook-form": "^7.53.0",
|
|
"react-i18next": "^14.1.0",
|
|
"react-infinite-scroll-component": "^6.1.0",
|
|
"react-loading-skeleton": "^3.4.0",
|
|
"react-redux": "^9.1.1",
|
|
"react-router-dom": "^6.22.3",
|
|
"react-shadow": "^20.6.0",
|
|
"react-tooltip": "^5.28.1",
|
|
"recharts": "^3.8.1",
|
|
"sharp": "^0.35.0",
|
|
"sound-play": "^1.1.0",
|
|
"steam-shortcut-editor": "https://github.com/hydralauncher/steam-shortcut-editor",
|
|
"string-argv": "^0.3.2",
|
|
"sudo-prompt": "^9.2.1",
|
|
"tar": "^7.5.21",
|
|
"thumbhash": "0.1.1",
|
|
"tough-cookie": "^5.1.1",
|
|
"user-agents": "^1.1.387",
|
|
"uuid": "^14.0.0",
|
|
"winreg": "^1.2.5",
|
|
"workwonders-sdk": "0.4.4",
|
|
"ws": "^8.18.0",
|
|
"yaml": "^2.8.3",
|
|
"yup": "^1.5.0",
|
|
"zustand": "^5.0.12"
|
|
},
|
|
"devDependencies": {
|
|
"@aws-sdk/client-s3": "^3.705.0",
|
|
"@commitlint/cli": "^19.6.0",
|
|
"@commitlint/config-conventional": "^19.6.0",
|
|
"@electron-toolkit/eslint-config-prettier": "^2.0.0",
|
|
"@electron-toolkit/eslint-config-ts": "^2.0.0",
|
|
"@electron-toolkit/tsconfig": "^1.0.1",
|
|
"@swc/core": "^1.4.16",
|
|
"@types/auto-launch": "^5.0.5",
|
|
"@types/canvas-confetti": "^1.9.0",
|
|
"@types/color": "^3.0.6",
|
|
"@types/jsdom": "^21.1.7",
|
|
"@types/jsonwebtoken": "^9.0.8",
|
|
"@types/lodash-es": "^4.17.12",
|
|
"@types/markdown-it": "^14.0.0",
|
|
"@types/node": "^20.12.7",
|
|
"@types/parse-torrent": "^5.8.7",
|
|
"@types/react": "^18.2.48",
|
|
"@types/react-dom": "^18.2.18",
|
|
"@types/sound-play": "^1.1.3",
|
|
"@types/user-agents": "^1.0.4",
|
|
"@types/winreg": "^1.2.36",
|
|
"@types/ws": "^8.18.1",
|
|
"@vitejs/plugin-react": "^4.2.1",
|
|
"electron": "^41.10.3",
|
|
"electron-builder": "^26.0.12",
|
|
"electron-vite": "^4.0.1",
|
|
"eslint": "^8.56.0",
|
|
"eslint-plugin-jsx-a11y": "^6.10.2",
|
|
"eslint-plugin-react": "^7.37.4",
|
|
"eslint-plugin-react-hooks": "^4.6.0",
|
|
"husky": "^9.1.7",
|
|
"prettier": "^3.4.2",
|
|
"react": "^18.2.0",
|
|
"react-dom": "^18.2.0",
|
|
"sass-embedded": "^1.80.6",
|
|
"ts-node": "^10.9.2",
|
|
"typescript": "^5.3.3",
|
|
"vite": "6.4.3",
|
|
"vite-plugin-svgr": "^4.5.0"
|
|
},
|
|
"packageManager": "yarn@1.22.22+sha512.a6b2f7906b721bba3d67d4aff083df04dad64c399707841b7acf00f6b133b7ac24255f2652fa22ae3534329dc6180534e98d17432037ff6fd140556e2bb3137e"
|
|
}
|