hydra/package.json
Chubby 6ecb7ed6ed
feat(library): load resized CDN covers with ThumbHash placeholders (#3013)
* 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>
2026-10-29 18:36:47 +00:00

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"
}