Saves games keep in the browser now sync with the signed-in player's account: Ruffle SharedObjects and HTML5 localStorage, IndexedDB databases (exported and imported whole, typed arrays and blobs included), and streamed games' save files. Games share the app's origin, so storage that changes while a game runs is attributed to it. Before a game starts, the account's save is loaded unless this browser has a newer one; changes upload as they happen; and a Saves dialog in the player restores any of the last 10, keeping the save it replaces as a backup.
94 lines
3.1 KiB
JSON
94 lines
3.1 KiB
JSON
{
|
|
"name": "flashpoint-web-frontend",
|
|
"private": true,
|
|
"version": "1.0.0",
|
|
"type": "module",
|
|
"scripts": {
|
|
"dev": "vite",
|
|
"build": "tsc && vite build",
|
|
"build:analyze": "VITE_ANALYZE=true tsc && vite build",
|
|
"preview": "vite preview",
|
|
"test": "vitest run",
|
|
"test:watch": "vitest",
|
|
"test:ui": "vitest --ui",
|
|
"test:coverage": "vitest run --coverage",
|
|
"lint": "eslint . --ext ts,tsx --report-unused-disable-directives --max-warnings 0",
|
|
"typecheck": "tsc --noEmit",
|
|
"format": "prettier --write \"src/**/*.{ts,tsx,js,jsx,css,json}\"",
|
|
"format:check": "prettier --check \"src/**/*.{ts,tsx,js,jsx,css,json}\"",
|
|
"check-bundle": "VITE_ANALYZE=true vite build"
|
|
},
|
|
"dependencies": {
|
|
"@hookform/resolvers": "^5.2.2",
|
|
"@radix-ui/react-alert-dialog": "^1.1.15",
|
|
"@radix-ui/react-avatar": "^1.1.11",
|
|
"@radix-ui/react-checkbox": "^1.3.3",
|
|
"@radix-ui/react-collapsible": "^1.1.12",
|
|
"@radix-ui/react-dialog": "^1.1.15",
|
|
"@radix-ui/react-dropdown-menu": "^2.1.16",
|
|
"@radix-ui/react-label": "^2.1.8",
|
|
"@radix-ui/react-popover": "^1.1.15",
|
|
"@radix-ui/react-radio-group": "^1.3.8",
|
|
"@radix-ui/react-scroll-area": "^1.2.10",
|
|
"@radix-ui/react-select": "^2.2.6",
|
|
"@radix-ui/react-separator": "^1.1.8",
|
|
"@radix-ui/react-slot": "^1.2.4",
|
|
"@radix-ui/react-switch": "^1.2.6",
|
|
"@radix-ui/react-tabs": "^1.1.13",
|
|
"@radix-ui/react-toast": "^1.2.15",
|
|
"@radix-ui/react-toggle": "^1.1.10",
|
|
"@radix-ui/react-toggle-group": "^1.1.11",
|
|
"@radix-ui/react-tooltip": "^1.2.8",
|
|
"@tanstack/react-query": "^5.28.9",
|
|
"@tanstack/react-table": "^8.21.3",
|
|
"@tanstack/react-virtual": "^3.13.18",
|
|
"axios": "^1.6.8",
|
|
"class-variance-authority": "^0.7.1",
|
|
"clsx": "^2.1.0",
|
|
"date-fns": "^3.6.0",
|
|
"framer-motion": "^12.27.0",
|
|
"lucide-react": "^0.358.0",
|
|
"lz-string": "^1.5.0",
|
|
"react": "^18.3.1",
|
|
"react-day-picker": "^9.13.0",
|
|
"react-dom": "^18.3.1",
|
|
"react-hook-form": "^7.71.1",
|
|
"react-markdown": "^10.1.0",
|
|
"react-router-dom": "^6.22.3",
|
|
"recharts": "^3.6.0",
|
|
"remark-gfm": "^4.0.1",
|
|
"sonner": "^2.0.7",
|
|
"tailwind-merge": "^3.4.0",
|
|
"tailwindcss-animate": "^1.0.7",
|
|
"zod": "^4.3.5",
|
|
"zustand": "^4.5.2"
|
|
},
|
|
"devDependencies": {
|
|
"@tailwindcss/typography": "^0.5.19",
|
|
"@testing-library/jest-dom": "^6.9.1",
|
|
"@testing-library/react": "^16.3.2",
|
|
"@testing-library/user-event": "^14.6.1",
|
|
"@types/lz-string": "^1.3.34",
|
|
"@types/react": "^18.2.66",
|
|
"@types/react-dom": "^18.2.22",
|
|
"@typescript-eslint/eslint-plugin": "^7.2.0",
|
|
"@typescript-eslint/parser": "^7.2.0",
|
|
"@vitejs/plugin-react": "^4.2.1",
|
|
"@vitest/coverage-v8": "^4.0.18",
|
|
"@vitest/ui": "^4.0.18",
|
|
"autoprefixer": "^10.4.19",
|
|
"eslint": "^8.57.0",
|
|
"eslint-plugin-react-hooks": "^4.6.0",
|
|
"eslint-plugin-react-refresh": "^0.4.6",
|
|
"fake-indexeddb": "^6.2.5",
|
|
"jsdom": "^27.4.0",
|
|
"msw": "^2.12.7",
|
|
"postcss": "^8.4.38",
|
|
"rollup-plugin-visualizer": "^6.0.5",
|
|
"tailwindcss": "^3.4.1",
|
|
"typescript": "^5.4.2",
|
|
"vite": "^5.2.0",
|
|
"vitest": "^4.0.18"
|
|
}
|
|
}
|