From 9e56dae1614f2e1e47f002d9cd406efaad228d3e Mon Sep 17 00:00:00 2001 From: Zeeshaun Date: Wed, 6 May 2026 15:33:36 +0000 Subject: [PATCH] Updating --- baseball/README.md | 20 - baseball/package-lock.json | 956 ++++++++++++++++++- baseball/package.json | 7 +- baseball/src/app/api/dashboard/route.ts | 44 +- baseball/src/app/api/seed/route.ts | 15 - baseball/src/app/globals.css | 419 +------- baseball/src/app/layout.tsx | 5 +- baseball/src/components/AppShell.tsx | 108 ++- baseball/src/components/AppThemeProvider.tsx | 96 ++ baseball/src/components/ConfirmDialog.tsx | 40 + baseball/src/components/DashboardClient.tsx | 101 +- baseball/src/components/EmptyState.tsx | 19 +- baseball/src/components/LineupClient.tsx | 188 ++-- baseball/src/components/PlayerForm.tsx | 159 +-- baseball/src/components/RosterClient.tsx | 223 +++-- baseball/src/components/SectionCard.tsx | 31 +- baseball/src/components/SettingsClient.tsx | 65 +- baseball/src/components/StatusBadge.tsx | 7 +- baseball/src/lib/seed.ts | 99 -- baseball/src/scripts/seed.ts | 14 - baseball/tsconfig.tsbuildinfo | 2 +- 21 files changed, 1663 insertions(+), 955 deletions(-) delete mode 100644 baseball/src/app/api/seed/route.ts create mode 100644 baseball/src/components/AppThemeProvider.tsx create mode 100644 baseball/src/components/ConfirmDialog.tsx delete mode 100644 baseball/src/lib/seed.ts delete mode 100644 baseball/src/scripts/seed.ts diff --git a/baseball/README.md b/baseball/README.md index 451147f..5f6897d 100644 --- a/baseball/README.md +++ b/baseball/README.md @@ -16,7 +16,6 @@ Mobile-friendly roster and lineup planning app for Little League baseball. It in - See pitcher availability as `Available`, `Needs Rest`, or `Unknown` - Generate suggested batting orders and defensive assignments - Manually adjust generated lineups before saving -- Seed sample data for a quick demo - Placeholder auth utility for future expansion ## Setup @@ -50,30 +49,11 @@ npm run dev 5. Open `http://localhost:3000`. -## Sample Data - -You can load sample data in two ways: - -- Click `Load Sample Team` on the dashboard -- Run: - -```bash -npm run seed -``` - -The seed script adds: - -- Sample players -- Default pitching rest rules -- Sample pitching appearances -- One sample saved game/lineup - ## Scripts - `npm run dev` starts the development server - `npm run build` builds the app - `npm run start` runs the production build -- `npm run seed` seeds the database if it is empty ## Data Models diff --git a/baseball/package-lock.json b/baseball/package-lock.json index 03cab6f..f014cb5 100644 --- a/baseball/package-lock.json +++ b/baseball/package-lock.json @@ -8,6 +8,10 @@ "name": "little-league-roster-manager", "version": "0.1.0", "dependencies": { + "@emotion/react": "^11.14.0", + "@emotion/styled": "^11.14.1", + "@mui/icons-material": "^9.0.0", + "@mui/material": "^9.0.0", "clsx": "^2.1.1", "mongoose": "^8.14.3", "next": "^15.3.2", @@ -23,6 +27,145 @@ "typescript": "^5.8.3" } }, + "node_modules/@babel/code-frame": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz", + "integrity": "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==", + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.28.5", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/generator": { + "version": "7.29.1", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.1.tgz", + "integrity": "sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.0", + "@babel/types": "^7.29.0", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-globals": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", + "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz", + "integrity": "sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==", + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.29.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.3.tgz", + "integrity": "sha512-b3ctpQwp+PROvU/cttc4OYl4MzfJUWy6FZg+PMXfzmt/+39iHVF0sDfqay8TQM3JA2EUOyKcFZt75jWriQijsA==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.0" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.29.2", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.29.2.tgz", + "integrity": "sha512-JiDShH45zKHWyGe4ZNVRrCjBz8Nh9TMmZG1kh4QTK8hCBTWBi8Da+i7s1fJw7/lYpM4ccepSNfqzZ/QvABBi5g==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz", + "integrity": "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.28.6", + "@babel/parser": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.0.tgz", + "integrity": "sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.0", + "@babel/generator": "^7.29.0", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.29.0", + "@babel/template": "^7.28.6", + "@babel/types": "^7.29.0", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz", + "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==", + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@emnapi/runtime": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.10.0.tgz", @@ -33,6 +176,152 @@ "tslib": "^2.4.0" } }, + "node_modules/@emotion/babel-plugin": { + "version": "11.13.5", + "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.13.5.tgz", + "integrity": "sha512-pxHCpT2ex+0q+HH91/zsdHkw/lXd468DIN2zvfvLtPKLLMo6gQj7oLObq8PhkrxOZb/gGCq03S3Z7PDhS8pduQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.16.7", + "@babel/runtime": "^7.18.3", + "@emotion/hash": "^0.9.2", + "@emotion/memoize": "^0.9.0", + "@emotion/serialize": "^1.3.3", + "babel-plugin-macros": "^3.1.0", + "convert-source-map": "^1.5.0", + "escape-string-regexp": "^4.0.0", + "find-root": "^1.1.0", + "source-map": "^0.5.7", + "stylis": "4.2.0" + } + }, + "node_modules/@emotion/cache": { + "version": "11.14.0", + "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.14.0.tgz", + "integrity": "sha512-L/B1lc/TViYk4DcpGxtAVbx0ZyiKM5ktoIyafGkH6zg/tj+mA+NE//aPYKG0k8kCHSHVJrpLpcAlOBEXQ3SavA==", + "license": "MIT", + "dependencies": { + "@emotion/memoize": "^0.9.0", + "@emotion/sheet": "^1.4.0", + "@emotion/utils": "^1.4.2", + "@emotion/weak-memoize": "^0.4.0", + "stylis": "4.2.0" + } + }, + "node_modules/@emotion/hash": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.2.tgz", + "integrity": "sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g==", + "license": "MIT" + }, + "node_modules/@emotion/is-prop-valid": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.4.0.tgz", + "integrity": "sha512-QgD4fyscGcbbKwJmqNvUMSE02OsHUa+lAWKdEUIJKgqe5IwRSKd7+KhibEWdaKwgjLj0DRSHA9biAIqGBk05lw==", + "license": "MIT", + "dependencies": { + "@emotion/memoize": "^0.9.0" + } + }, + "node_modules/@emotion/memoize": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.9.0.tgz", + "integrity": "sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ==", + "license": "MIT" + }, + "node_modules/@emotion/react": { + "version": "11.14.0", + "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.14.0.tgz", + "integrity": "sha512-O000MLDBDdk/EohJPFUqvnp4qnHeYkVP5B0xEG0D/L7cOKP9kefu2DXn8dj74cQfsEzUqh+sr1RzFqiL1o+PpA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.18.3", + "@emotion/babel-plugin": "^11.13.5", + "@emotion/cache": "^11.14.0", + "@emotion/serialize": "^1.3.3", + "@emotion/use-insertion-effect-with-fallbacks": "^1.2.0", + "@emotion/utils": "^1.4.2", + "@emotion/weak-memoize": "^0.4.0", + "hoist-non-react-statics": "^3.3.1" + }, + "peerDependencies": { + "react": ">=16.8.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@emotion/serialize": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.3.3.tgz", + "integrity": "sha512-EISGqt7sSNWHGI76hC7x1CksiXPahbxEOrC5RjmFRJTqLyEK9/9hZvBbiYn70dw4wuwMKiEMCUlR6ZXTSWQqxA==", + "license": "MIT", + "dependencies": { + "@emotion/hash": "^0.9.2", + "@emotion/memoize": "^0.9.0", + "@emotion/unitless": "^0.10.0", + "@emotion/utils": "^1.4.2", + "csstype": "^3.0.2" + } + }, + "node_modules/@emotion/sheet": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.4.0.tgz", + "integrity": "sha512-fTBW9/8r2w3dXWYM4HCB1Rdp8NLibOw2+XELH5m5+AkWiL/KqYX6dc0kKYlaYyKjrQ6ds33MCdMPEwgs2z1rqg==", + "license": "MIT" + }, + "node_modules/@emotion/styled": { + "version": "11.14.1", + "resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-11.14.1.tgz", + "integrity": "sha512-qEEJt42DuToa3gurlH4Qqc1kVpNq8wO8cJtDzU46TjlzWjDlsVyevtYCRijVq3SrHsROS+gVQ8Fnea108GnKzw==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.18.3", + "@emotion/babel-plugin": "^11.13.5", + "@emotion/is-prop-valid": "^1.3.0", + "@emotion/serialize": "^1.3.3", + "@emotion/use-insertion-effect-with-fallbacks": "^1.2.0", + "@emotion/utils": "^1.4.2" + }, + "peerDependencies": { + "@emotion/react": "^11.0.0-rc.0", + "react": ">=16.8.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@emotion/unitless": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.10.0.tgz", + "integrity": "sha512-dFoMUuQA20zvtVTuxZww6OHoJYgrzfKM1t52mVySDJnMSEa08ruEvdYQbhvyu6soU+NeLVd3yKfTfT0NeV6qGg==", + "license": "MIT" + }, + "node_modules/@emotion/use-insertion-effect-with-fallbacks": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.2.0.tgz", + "integrity": "sha512-yJMtVdH59sxi/aVJBpk9FQq+OR8ll5GT8oWd57UpeaKEVGab41JWaCFA7FRLoMLloOZF/c/wsPoe+bfGmRKgDg==", + "license": "MIT", + "peerDependencies": { + "react": ">=16.8.0" + } + }, + "node_modules/@emotion/utils": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.4.2.tgz", + "integrity": "sha512-3vLclRofFziIa3J2wDh9jjbkUz9qk5Vi3IZ/FSTKViB0k+ef0fPV7dYrUIugbgupYDx7v9ud/SjrtEP8Y4xLoA==", + "license": "MIT" + }, + "node_modules/@emotion/weak-memoize": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.4.0.tgz", + "integrity": "sha512-snKqtPW01tN0ui7yu9rGv69aJXr/a/Ywvl11sUjNtEcRc+ng/mQriFL0wLXMef74iHa/EkftbDzU9F8iFbH+zg==", + "license": "MIT" + }, "node_modules/@esbuild/aix-ppc64": { "version": "0.27.7", "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.7.tgz", @@ -941,6 +1230,41 @@ "url": "https://opencollective.com/libvips" } }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, "node_modules/@mongodb-js/saslprep": { "version": "1.4.11", "resolved": "https://registry.npmjs.org/@mongodb-js/saslprep/-/saslprep-1.4.11.tgz", @@ -950,6 +1274,239 @@ "sparse-bitfield": "^3.0.3" } }, + "node_modules/@mui/core-downloads-tracker": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-9.0.0.tgz", + "integrity": "sha512-uwQNGkhv0lf7ufxw6QXev77BW6pWbW+7uxYjU5+rfp4lBkFtMEgJCsarTM3Tn+i0lGx6+Ol2u88JdGXr0GDskA==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + } + }, + "node_modules/@mui/icons-material": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-9.0.0.tgz", + "integrity": "sha512-oDwyvI6LgjWRC9MBcSGvLkPud9S9ELgSBQFYxa1rYcZn6Br55dn22SyvsPDMsn0G8OndFk53iMT45W5mNqrogw==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.29.2" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@mui/material": "^9.0.0", + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/material": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/@mui/material/-/material-9.0.0.tgz", + "integrity": "sha512-+VP/oQCDhDR87NQQgXnNBG8dwy6GNuQLnenS1pZvkbn2dKFSxRSRMybTpH9xUxXP+316mlYDy5CSbYtusnCWtw==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.29.2", + "@mui/core-downloads-tracker": "^9.0.0", + "@mui/system": "^9.0.0", + "@mui/types": "^9.0.0", + "@mui/utils": "^9.0.0", + "@popperjs/core": "^2.11.8", + "@types/react-transition-group": "^4.4.12", + "clsx": "^2.1.1", + "csstype": "^3.2.3", + "prop-types": "^15.8.1", + "react-is": "^19.2.4", + "react-transition-group": "^4.4.5" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@emotion/react": "^11.5.0", + "@emotion/styled": "^11.3.0", + "@mui/material-pigment-css": "^9.0.0", + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@emotion/react": { + "optional": true + }, + "@emotion/styled": { + "optional": true + }, + "@mui/material-pigment-css": { + "optional": true + }, + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/private-theming": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-9.0.0.tgz", + "integrity": "sha512-JtuZoaiCqwD6vjgYu6Xp3T7DZkrxJlgtDz5yESzhI34fEX5hHMh2VJUbuL9UOg8xrfIFMrq6dcYoH/7Zi4G0RA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.29.2", + "@mui/utils": "^9.0.0", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/styled-engine": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-9.0.0.tgz", + "integrity": "sha512-9RLGdX4Jg0aQPRuvqh/OLzYSPlgd5zyEw5/1HIRfdavSiOd03WtUaGZH9/w1RoTYuRKwpgy0hpIFaMHIqPVIWg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.29.2", + "@emotion/cache": "^11.14.0", + "@emotion/serialize": "^1.3.3", + "@emotion/sheet": "^1.4.0", + "csstype": "^3.2.3", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@emotion/react": "^11.4.1", + "@emotion/styled": "^11.3.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@emotion/react": { + "optional": true + }, + "@emotion/styled": { + "optional": true + } + } + }, + "node_modules/@mui/system": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/@mui/system/-/system-9.0.0.tgz", + "integrity": "sha512-YnC5Zg6j04IxiLc/boAKs0464jfZlLFVa7mf5E8lF0XOtZVUvG6R6gJK50lgUYdaaLdyLfxF6xR7LaPuEpeT/g==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.29.2", + "@mui/private-theming": "^9.0.0", + "@mui/styled-engine": "^9.0.0", + "@mui/types": "^9.0.0", + "@mui/utils": "^9.0.0", + "clsx": "^2.1.1", + "csstype": "^3.2.3", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@emotion/react": "^11.5.0", + "@emotion/styled": "^11.3.0", + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@emotion/react": { + "optional": true + }, + "@emotion/styled": { + "optional": true + }, + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/types": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/@mui/types/-/types-9.0.0.tgz", + "integrity": "sha512-i1cuFCAWN44b3AJWO7mh7tuh1sqbQSeVr/94oG0TX5uXivac8XalgE4/6fQZcmGZigzbQ35IXxj/4jLpRIBYZg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.29.2" + }, + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/utils": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-9.0.0.tgz", + "integrity": "sha512-bQcqyg/gjULUqTuyUjSAFr6LQGLvtkNtDbJerAtoUn9kGZ0hg5QJiN1PLHMLbeFpe3te1831uq7GFl2ITokGdg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.29.2", + "@mui/types": "^9.0.0", + "@types/prop-types": "^15.7.15", + "clsx": "^2.1.1", + "prop-types": "^15.8.1", + "react-is": "^19.2.4" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, "node_modules/@next/env": { "version": "15.5.15", "resolved": "https://registry.npmjs.org/@next/env/-/env-15.5.15.tgz", @@ -1084,6 +1641,16 @@ "node": ">= 10" } }, + "node_modules/@popperjs/core": { + "version": "2.11.8", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", + "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/popperjs" + } + }, "node_modules/@swc/helpers": { "version": "0.5.15", "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.15.tgz", @@ -1103,11 +1670,22 @@ "undici-types": "~6.21.0" } }, + "node_modules/@types/parse-json": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz", + "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==", + "license": "MIT" + }, + "node_modules/@types/prop-types": { + "version": "15.7.15", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.15.tgz", + "integrity": "sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==", + "license": "MIT" + }, "node_modules/@types/react": { "version": "19.2.14", "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.14.tgz", "integrity": "sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w==", - "dev": true, "license": "MIT", "dependencies": { "csstype": "^3.2.2" @@ -1123,6 +1701,15 @@ "@types/react": "^19.2.0" } }, + "node_modules/@types/react-transition-group": { + "version": "4.4.12", + "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.12.tgz", + "integrity": "sha512-8TV6R3h2j7a91c+1DXdJi3Syo69zzIZbz7Lg5tORM5LEJG7X/E6a1V3drRyBRZq7/utz7A+c4OgYLiLcYGHG6w==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*" + } + }, "node_modules/@types/webidl-conversions": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/@types/webidl-conversions/-/webidl-conversions-7.0.3.tgz", @@ -1138,6 +1725,21 @@ "@types/webidl-conversions": "*" } }, + "node_modules/babel-plugin-macros": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz", + "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.12.5", + "cosmiconfig": "^7.0.0", + "resolve": "^1.19.0" + }, + "engines": { + "node": ">=10", + "npm": ">=6" + } + }, "node_modules/bson": { "version": "6.10.4", "resolved": "https://registry.npmjs.org/bson/-/bson-6.10.4.tgz", @@ -1147,6 +1749,15 @@ "node": ">=16.20.1" } }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/caniuse-lite": { "version": "1.0.30001792", "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001792.tgz", @@ -1182,11 +1793,32 @@ "node": ">=6" } }, + "node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "license": "MIT" + }, + "node_modules/cosmiconfig": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", + "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", + "license": "MIT", + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/csstype": { "version": "3.2.3", "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", - "dev": true, "license": "MIT" }, "node_modules/debug": { @@ -1216,6 +1848,34 @@ "node": ">=8" } }, + "node_modules/dom-helpers": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz", + "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.8.7", + "csstype": "^3.0.2" + } + }, + "node_modules/error-ex": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz", + "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==", + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/esbuild": { "version": "0.27.7", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.7.tgz", @@ -1258,6 +1918,24 @@ "@esbuild/win32-x64": "0.27.7" } }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/find-root": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", + "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==", + "license": "MIT" + }, "node_modules/fsevents": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", @@ -1273,6 +1951,15 @@ "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/get-tsconfig": { "version": "4.14.0", "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.14.0.tgz", @@ -1286,6 +1973,94 @@ "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" } }, + "node_modules/hasown": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.3.tgz", + "integrity": "sha512-ej4AhfhfL2Q2zpMmLo7U1Uv9+PyhIZpgQLGT1F9miIGmiCJIoCgSmczFdrc97mWT4kVY72KA+WnnhJ5pghSvSg==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/hoist-non-react-statics": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", + "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", + "license": "BSD-3-Clause", + "dependencies": { + "react-is": "^16.7.0" + } + }, + "node_modules/hoist-non-react-statics/node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "license": "MIT" + }, + "node_modules/import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "license": "MIT" + }, + "node_modules/is-core-module": { + "version": "2.16.2", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.2.tgz", + "integrity": "sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA==", + "license": "MIT", + "dependencies": { + "hasown": "^2.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "license": "MIT" + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "license": "MIT" + }, "node_modules/kareem": { "version": "2.6.3", "resolved": "https://registry.npmjs.org/kareem/-/kareem-2.6.3.tgz", @@ -1295,6 +2070,24 @@ "node": ">=12.0.0" } }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "license": "MIT" + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "license": "MIT", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, "node_modules/memory-pager": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz", @@ -1476,6 +2269,60 @@ } } }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "license": "MIT" + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/picocolors": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", @@ -1510,6 +2357,23 @@ "node": "^10 || ^12 || >=14" } }, + "node_modules/prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "node_modules/prop-types/node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "license": "MIT" + }, "node_modules/punycode": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", @@ -1540,6 +2404,58 @@ "react": "^19.2.5" } }, + "node_modules/react-is": { + "version": "19.2.5", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-19.2.5.tgz", + "integrity": "sha512-Dn0t8IQhCmeIT3wu+Apm1/YVsJXsGWi6k4sPdnBIdqMVtHtv0IGi6dcpNpNkNac0zB2uUAqNX3MHzN8c+z2rwQ==", + "license": "MIT" + }, + "node_modules/react-transition-group": { + "version": "4.4.5", + "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz", + "integrity": "sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==", + "license": "BSD-3-Clause", + "dependencies": { + "@babel/runtime": "^7.5.5", + "dom-helpers": "^5.0.1", + "loose-envify": "^1.4.0", + "prop-types": "^15.6.2" + }, + "peerDependencies": { + "react": ">=16.6.0", + "react-dom": ">=16.6.0" + } + }, + "node_modules/resolve": { + "version": "1.22.12", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.12.tgz", + "integrity": "sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "is-core-module": "^2.16.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, "node_modules/resolve-pkg-maps": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", @@ -1620,6 +2536,15 @@ "integrity": "sha512-Rtlj66/b0ICeFzYTuNvX/EF1igRbbnGSvEyT79McoZa/DeGhMyC5pWKOEsZKnpkqtSeovd5FL/bjHWC3CIIvCQ==", "license": "MIT" }, + "node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/source-map-js": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", @@ -1661,6 +2586,24 @@ } } }, + "node_modules/stylis": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz", + "integrity": "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==", + "license": "MIT" + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/tr46": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/tr46/-/tr46-5.1.1.tgz", @@ -1742,6 +2685,15 @@ "node": ">=18" } }, + "node_modules/yaml": { + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.3.tgz", + "integrity": "sha512-vIYeF1u3CjlhAFekPPAk2h/Kv4T3mAkMox5OymRiJQB0spDP10LHvt+K7G9Ny6NuuMAb25/6n1qyUjAcGNf/AA==", + "license": "ISC", + "engines": { + "node": ">= 6" + } + }, "node_modules/zod": { "version": "3.25.76", "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", diff --git a/baseball/package.json b/baseball/package.json index 88e43bb..38534c2 100644 --- a/baseball/package.json +++ b/baseball/package.json @@ -6,10 +6,13 @@ "dev": "next dev", "build": "next build", "start": "next start", - "lint": "next lint", - "seed": "node --import tsx src/scripts/seed.ts" + "lint": "next lint" }, "dependencies": { + "@emotion/react": "^11.14.0", + "@emotion/styled": "^11.14.1", + "@mui/icons-material": "^9.0.0", + "@mui/material": "^9.0.0", "clsx": "^2.1.1", "mongoose": "^8.14.3", "next": "^15.3.2", diff --git a/baseball/src/app/api/dashboard/route.ts b/baseball/src/app/api/dashboard/route.ts index 54f8678..36ee318 100644 --- a/baseball/src/app/api/dashboard/route.ts +++ b/baseball/src/app/api/dashboard/route.ts @@ -31,28 +31,34 @@ export async function GET(request: Request) { gameDate ); + let availablePitchers = 0; + let needsRest = 0; + let unknownPitchers = 0; + + const recentPitching = players.map((player) => { + const summary = availabilityMap[String(player._id)]; + if (summary.status === "available") availablePitchers += 1; + if (summary.status === "needs-rest") needsRest += 1; + if (summary.status === "unknown") unknownPitchers += 1; + + return { + playerId: String(player._id), + playerName: formatPlayerName(player.firstName, player.lastName), + status: summary.status, + daysSinceLastAppearance: summary.daysSinceLastAppearance, + requiredRestDays: summary.requiredRestDays, + lastPitchedDate: summary.lastPitchedDate, + pitchCount: summary.lastPitchCount + }; + }); + const response: DashboardResponse = { rosterCount: players.length, activePlayers: players.filter((player) => player.isActive).length, - availablePitchers: 0, - needsRest: 0, - unknownPitchers: 0, - recentPitching: players.map((player) => { - const summary = availabilityMap[String(player._id)]; - if (summary.status === "available") response.availablePitchers += 1; - if (summary.status === "needs-rest") response.needsRest += 1; - if (summary.status === "unknown") response.unknownPitchers += 1; - - return { - playerId: String(player._id), - playerName: formatPlayerName(player.firstName, player.lastName), - status: summary.status, - daysSinceLastAppearance: summary.daysSinceLastAppearance, - requiredRestDays: summary.requiredRestDays, - lastPitchedDate: summary.lastPitchedDate, - pitchCount: summary.lastPitchCount - }; - }) + availablePitchers, + needsRest, + unknownPitchers, + recentPitching }; return NextResponse.json(serialize(response)); diff --git a/baseball/src/app/api/seed/route.ts b/baseball/src/app/api/seed/route.ts deleted file mode 100644 index 04f8c10..0000000 --- a/baseball/src/app/api/seed/route.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { NextResponse } from "next/server"; -import { handleApiError } from "@/app/api/_utils"; -import { seedDatabase } from "@/lib/seed"; - -export const runtime = "nodejs"; -export const dynamic = "force-dynamic"; - -export async function POST() { - try { - const result = await seedDatabase(); - return NextResponse.json(result); - } catch (error) { - return handleApiError(error); - } -} diff --git a/baseball/src/app/globals.css b/baseball/src/app/globals.css index 8771e83..8a0a096 100644 --- a/baseball/src/app/globals.css +++ b/baseball/src/app/globals.css @@ -1,19 +1,6 @@ :root { - --bg: #f4efe3; - --surface: rgba(255, 252, 246, 0.94); - --surface-strong: #fffdf8; - --ink: #152033; - --muted: #5e687c; - --line: rgba(21, 32, 51, 0.1); - --accent: #0d6a5b; - --accent-strong: #094f44; - --warning: #b87510; - --danger: #b53a2c; - --success: #177245; - --shadow: 0 20px 45px rgba(21, 32, 51, 0.12); - --radius-lg: 24px; - --radius-md: 18px; - --radius-sm: 12px; + --font-sans: "Avenir Next", "Segoe UI", "Trebuchet MS", sans-serif; + --font-display: "Iowan Old Style", "Palatino Linotype", "Book Antiqua", serif; } * { @@ -27,408 +14,14 @@ html { body { margin: 0; min-height: 100vh; - color: var(--ink); background: - radial-gradient(circle at top left, rgba(13, 106, 91, 0.2), transparent 32%), - radial-gradient(circle at top right, rgba(184, 117, 16, 0.18), transparent 28%), - linear-gradient(180deg, #f8f2e7 0%, var(--bg) 48%, #efe7d5 100%); - font-family: Georgia, "Times New Roman", serif; + radial-gradient(circle at top left, rgba(15, 92, 77, 0.18), transparent 28%), + radial-gradient(circle at top right, rgba(207, 111, 46, 0.18), transparent 24%), + linear-gradient(180deg, #fbf7ef 0%, #f4efe3 44%, #efe5d4 100%); + font-family: var(--font-sans); } a { color: inherit; text-decoration: none; } - -button, -input, -select, -textarea { - font: inherit; -} - -button { - cursor: pointer; -} - -.app-shell { - width: min(1120px, calc(100% - 24px)); - margin: 0 auto; - padding: 24px 0 64px; -} - -.hero { - display: flex; - justify-content: space-between; - gap: 20px; - padding: 28px; - border-radius: 28px; - background: linear-gradient(135deg, rgba(14, 65, 92, 0.96), rgba(13, 106, 91, 0.92)); - color: white; - box-shadow: var(--shadow); -} - -.hero h1 { - margin: 0; - font-size: clamp(2rem, 5vw, 3.4rem); - line-height: 1; -} - -.hero-copy, -.eyebrow { - margin: 0; -} - -.hero-copy { - margin-top: 12px; - max-width: 50rem; - color: rgba(255, 255, 255, 0.86); -} - -.eyebrow { - margin-bottom: 10px; - letter-spacing: 0.08em; - text-transform: uppercase; - font-size: 0.8rem; - color: rgba(255, 255, 255, 0.72); -} - -.hero-actions { - display: flex; - align-items: flex-start; -} - -.tabs { - display: grid; - grid-template-columns: repeat(4, minmax(0, 1fr)); - gap: 10px; - margin: 18px 0 24px; -} - -.tab { - border: 1px solid var(--line); - background: rgba(255, 255, 255, 0.72); - border-radius: 999px; - padding: 12px 14px; - text-align: center; - color: var(--muted); -} - -.tab-active { - background: var(--surface-strong); - color: var(--ink); - box-shadow: var(--shadow); -} - -.page-grid { - display: grid; - gap: 18px; -} - -.section-card { - background: var(--surface); - border: 1px solid rgba(255, 255, 255, 0.72); - border-radius: var(--radius-lg); - padding: 24px; - box-shadow: var(--shadow); - backdrop-filter: blur(14px); -} - -.section-heading h2, -.list-row h3, -.empty-state h3, -.player-card h3 { - margin: 0; -} - -.section-heading p, -.empty-state p, -.list-row p, -.muted-copy { - margin: 8px 0 0; - color: var(--muted); -} - -.stats-grid, -.card-grid { - display: grid; - gap: 16px; -} - -.stats-grid { - grid-template-columns: repeat(auto-fit, minmax(180px, 1fr)); -} - -.stat-card { - padding: 18px; - border-radius: var(--radius-md); - background: var(--surface-strong); - border: 1px solid var(--line); -} - -.stat-card span { - display: block; - color: var(--muted); -} - -.stat-card strong { - display: block; - margin-top: 10px; - font-size: 2rem; -} - -.stat-card-success strong { - color: var(--success); -} - -.stat-card-warning strong { - color: var(--warning); -} - -.list-stack { - display: grid; - gap: 12px; -} - -.list-row, -.picker-card { - display: flex; - align-items: center; - justify-content: space-between; - gap: 12px; - border: 1px solid var(--line); - border-radius: var(--radius-md); - padding: 14px 16px; - background: rgba(255, 255, 255, 0.7); -} - -.list-meta { - display: grid; - justify-items: end; - gap: 6px; -} - -.badge { - display: inline-flex; - align-items: center; - justify-content: center; - min-width: 108px; - padding: 8px 12px; - border-radius: 999px; - font-size: 0.85rem; - font-weight: 700; -} - -.badge-available { - background: rgba(23, 114, 69, 0.12); - color: var(--success); -} - -.badge-needs-rest { - background: rgba(181, 58, 44, 0.12); - color: var(--danger); -} - -.badge-unknown { - background: rgba(94, 104, 124, 0.12); - color: var(--muted); -} - -.empty-state { - padding: 28px; - border: 1px dashed var(--line); - border-radius: var(--radius-md); - text-align: center; -} - -.banner { - padding: 14px 16px; - border-radius: var(--radius-sm); - margin-bottom: 12px; -} - -.banner-success { - background: rgba(23, 114, 69, 0.12); - color: var(--success); -} - -.banner-error { - background: rgba(181, 58, 44, 0.12); - color: var(--danger); -} - -.form-grid { - display: grid; - grid-template-columns: repeat(2, minmax(0, 1fr)); - gap: 16px; -} - -.form-grid label, -.rule-table th, -.rule-table td { - font-size: 0.95rem; -} - -.form-grid label span { - display: block; - margin-bottom: 8px; - color: var(--muted); -} - -.full-width { - grid-column: 1 / -1; -} - -.form-grid input, -.form-grid select, -.form-grid textarea, -.rule-table input, -.list-row select { - width: 100%; - border: 1px solid var(--line); - border-radius: 14px; - background: white; - padding: 12px 14px; - color: var(--ink); -} - -.checkbox-row { - display: flex; - align-items: center; - gap: 10px; -} - -.checkbox-row span { - margin: 0; -} - -.checkbox-row input { - width: auto; -} - -.button { - border: 0; - border-radius: 999px; - padding: 12px 18px; - background: var(--accent); - color: white; - font-weight: 700; -} - -.button:disabled { - opacity: 0.45; - cursor: not-allowed; -} - -.button-secondary { - background: white; - color: var(--ink); - border: 1px solid var(--line); -} - -.button-danger { - background: var(--danger); -} - -.player-card { - display: grid; - gap: 12px; - padding: 18px; - border-radius: var(--radius-md); - background: rgba(255, 255, 255, 0.72); - border: 1px solid var(--line); -} - -.card-grid { - grid-template-columns: repeat(auto-fit, minmax(260px, 1fr)); -} - -.player-card-head { - display: flex; - justify-content: space-between; - gap: 12px; -} - -.player-card-head p, -.player-notes, -.player-meta dt { - margin: 6px 0 0; - color: var(--muted); -} - -.player-meta { - display: grid; - gap: 10px; - margin: 0; -} - -.player-meta dd { - margin: 4px 0 0; -} - -.action-row { - display: flex; - flex-wrap: wrap; - gap: 10px; -} - -.table-wrap { - overflow-x: auto; -} - -.rule-table { - width: 100%; - border-collapse: collapse; -} - -.rule-table th, -.rule-table td { - text-align: left; - padding: 12px; - border-bottom: 1px solid var(--line); -} - -.picker-grid { - display: grid; - gap: 12px; - margin-top: 18px; -} - -.picker-card input { - width: auto; -} - -.note-block { - margin-top: 16px; - border-left: 4px solid var(--warning); - padding-left: 14px; - color: var(--muted); -} - -@media (max-width: 760px) { - .app-shell { - width: min(100% - 16px, 1120px); - } - - .hero, - .tabs, - .form-grid { - grid-template-columns: 1fr; - } - - .hero, - .list-row, - .picker-card, - .player-card-head { - flex-direction: column; - align-items: stretch; - } - - .tabs { - display: grid; - } - - .list-meta { - justify-items: start; - } -} diff --git a/baseball/src/app/layout.tsx b/baseball/src/app/layout.tsx index 897c34a..0ca3184 100644 --- a/baseball/src/app/layout.tsx +++ b/baseball/src/app/layout.tsx @@ -1,4 +1,5 @@ import type { Metadata } from "next"; +import { AppThemeProvider } from "@/components/AppThemeProvider"; import "./globals.css"; export const metadata: Metadata = { @@ -9,7 +10,9 @@ export const metadata: Metadata = { export default function RootLayout({ children }: Readonly<{ children: React.ReactNode }>) { return ( - {children} + + {children} + ); } diff --git a/baseball/src/components/AppShell.tsx b/baseball/src/components/AppShell.tsx index 59e229a..43445c1 100644 --- a/baseball/src/components/AppShell.tsx +++ b/baseball/src/components/AppShell.tsx @@ -1,9 +1,9 @@ "use client"; +import SportsBaseballRoundedIcon from "@mui/icons-material/SportsBaseballRounded"; +import { Box, Chip, Container, Paper, Tab, Tabs, Typography } from "@mui/material"; import Link from "next/link"; -import type { Route } from "next"; import { usePathname } from "next/navigation"; -import { cn } from "@/lib/utils"; const navItems = [ { href: "/dashboard", label: "Dashboard" }, @@ -24,27 +24,95 @@ export function AppShell({ actions?: React.ReactNode; }) { const pathname = usePathname(); + const currentTab = navItems.find((item) => pathname === item.href)?.href ?? false; return ( -
-
-
-

Little League Coach Console

-

{title}

-

{subtitle}

-
- {actions ?
{actions}
: null} -
+ + + + + } + label="Little League Coach Console" + sx={{ + mb: 2, + color: "common.white", + bgcolor: "rgba(255,255,255,0.14)", + "& .MuiChip-icon": { color: "common.white" } + }} + /> + + {title} + + {subtitle} + + {actions ? {actions} : null} + + - + + + {navItems.map((item) => ( + + ))} + + -
{children}
-
+ + {children} + + ); } diff --git a/baseball/src/components/AppThemeProvider.tsx b/baseball/src/components/AppThemeProvider.tsx new file mode 100644 index 0000000..40a2911 --- /dev/null +++ b/baseball/src/components/AppThemeProvider.tsx @@ -0,0 +1,96 @@ +"use client"; + +import { CssBaseline, ThemeProvider, createTheme } from "@mui/material"; + +const theme = createTheme({ + palette: { + mode: "light", + primary: { + main: "#0f5c4d", + light: "#2d7a69", + dark: "#0a4338" + }, + secondary: { + main: "#cf6f2e", + light: "#e38a4a", + dark: "#a55720" + }, + background: { + default: "#f6f1e7", + paper: "#fffdf8" + }, + success: { + main: "#1f7a52" + }, + warning: { + main: "#ba7b11" + }, + error: { + main: "#ba4637" + } + }, + shape: { + borderRadius: 18 + }, + typography: { + fontFamily: "var(--font-sans)", + h1: { + fontFamily: "var(--font-display)", + fontWeight: 700, + letterSpacing: "-0.03em" + }, + h2: { + fontFamily: "var(--font-display)", + fontWeight: 700, + letterSpacing: "-0.02em" + }, + h3: { + fontWeight: 700 + }, + button: { + fontWeight: 700, + textTransform: "none" + } + }, + components: { + MuiPaper: { + styleOverrides: { + root: { + backgroundImage: "none" + } + } + }, + MuiButton: { + defaultProps: { + disableElevation: true + }, + styleOverrides: { + root: { + borderRadius: 999, + paddingInline: 18 + } + } + }, + MuiCard: { + styleOverrides: { + root: { + borderRadius: 22 + } + } + }, + MuiTextField: { + defaultProps: { + size: "small" + } + } + } +}); + +export function AppThemeProvider({ children }: { children: React.ReactNode }) { + return ( + + + {children} + + ); +} diff --git a/baseball/src/components/ConfirmDialog.tsx b/baseball/src/components/ConfirmDialog.tsx new file mode 100644 index 0000000..1cc6428 --- /dev/null +++ b/baseball/src/components/ConfirmDialog.tsx @@ -0,0 +1,40 @@ +"use client"; + +import { Button, Dialog, DialogActions, DialogContent, DialogTitle, Typography } from "@mui/material"; + +type ConfirmDialogProps = { + open: boolean; + title: string; + description: string; + confirmLabel?: string; + cancelLabel?: string; + onConfirm: () => void; + onCancel: () => void; +}; + +export function ConfirmDialog({ + open, + title, + description, + confirmLabel = "Confirm", + cancelLabel = "Cancel", + onConfirm, + onCancel +}: ConfirmDialogProps) { + return ( + + {title} + + {description} + + + + + + + ); +} diff --git a/baseball/src/components/DashboardClient.tsx b/baseball/src/components/DashboardClient.tsx index 8c8626b..ef44c80 100644 --- a/baseball/src/components/DashboardClient.tsx +++ b/baseball/src/components/DashboardClient.tsx @@ -1,5 +1,6 @@ "use client"; +import { Alert, Box, Card, CardContent, Divider, Stack, Typography } from "@mui/material"; import { useEffect, useState } from "react"; import { AppShell } from "@/components/AppShell"; import { EmptyState } from "@/components/EmptyState"; @@ -12,7 +13,6 @@ export function DashboardClient() { const [data, setData] = useState(null); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); - const [message, setMessage] = useState(null); async function loadDashboard() { setLoading(true); @@ -28,16 +28,6 @@ export function DashboardClient() { } } - async function seedSampleData() { - try { - const response = await fetchJson<{ seeded: boolean; reason?: string }>("/api/seed", { method: "POST" }); - setMessage(response.seeded ? "Sample team loaded." : response.reason ?? "Seed skipped."); - await loadDashboard(); - } catch (seedError) { - setError(seedError instanceof Error ? seedError.message : "Failed to seed data."); - } - } - useEffect(() => { void loadDashboard(); }, []); @@ -46,76 +36,75 @@ export function DashboardClient() { void seedSampleData()}> - Load Sample Team - - } > - {message ?
{message}
: null} - {error ?
{error}
: null} + {error ? {error} : null} {loading ? ( ) : data && data.rosterCount > 0 ? ( <> -
-
- Rostered Players - {data.rosterCount} -
-
- Active Today - {data.activePlayers} -
-
- Pitchers Available - {data.availablePitchers} -
-
- Need Rest - {data.needsRest} -
-
+ + {[ + { label: "Rostered Players", value: data.rosterCount }, + { label: "Active Today", value: data.activePlayers }, + { label: "Pitchers Available", value: data.availablePitchers, color: "success.main" }, + { label: "Need Rest", value: data.needsRest, color: "warning.main" } + ].map((item) => ( + + + + {item.label} + + + {item.value} + + + + ))} + -
+ } spacing={0}> {data.recentPitching.map((entry) => ( -
-
-

{entry.playerName}

-

+ + + {entry.playerName} + {entry.lastPitchedDate ? `${entry.pitchCount} pitches on ${entry.lastPitchedDate}` : "No pitching history recorded yet."} -

-
-
+ + + - + {entry.daysSinceLastAppearance === null ? "No history" : `${entry.daysSinceLastAppearance} day(s) since last outing`} - -
-
+ +
+ ))} -
+
) : ( - + void seedSampleData()}> - Load Sample Team - - } + description="Add your team on the roster screen, then return here to review availability and game-day readiness." /> )} diff --git a/baseball/src/components/EmptyState.tsx b/baseball/src/components/EmptyState.tsx index 15c509c..f989f6c 100644 --- a/baseball/src/components/EmptyState.tsx +++ b/baseball/src/components/EmptyState.tsx @@ -1,3 +1,5 @@ +import { Box, Typography } from "@mui/material"; + export function EmptyState({ title, description, @@ -8,10 +10,19 @@ export function EmptyState({ action?: React.ReactNode; }) { return ( -
-

{title}

-

{description}

+ + {title} + {description} {action} -
+ ); } diff --git a/baseball/src/components/LineupClient.tsx b/baseball/src/components/LineupClient.tsx index 3f02368..91e24f7 100644 --- a/baseball/src/components/LineupClient.tsx +++ b/baseball/src/components/LineupClient.tsx @@ -1,5 +1,6 @@ "use client"; +import { Alert, Box, Button, Card, CardContent, Checkbox, Divider, FormControlLabel, MenuItem, Stack, TextField, Typography } from "@mui/material"; import { useEffect, useMemo, useState } from "react"; import { AppShell } from "@/components/AppShell"; import { EmptyState } from "@/components/EmptyState"; @@ -94,73 +95,102 @@ export function LineupClient() { title="Generate Lineup" subtitle="Choose the active group, pick an eligible starter, then adjust the suggested lineup as needed." > - {message ?
{message}
: null} - {error ?
{error}
: null} + {message ? {message} : null} + {error ? {error} : null} -
- - - -
- - + -
-
+ + + -
+ {players.map((player) => ( - + + + + + setSelectedPlayerIds((current) => + event.target.checked ? [...current, player._id] : current.filter((id) => id !== player._id) + ) + } + /> + + {formatPlayerName(player.firstName, player.lastName)} + + #{player.jerseyNumber} {player.primaryPosition} + + + + + + ))} -
+
{generated ? ( <> -
+ } spacing={0}> {generated.battingOrder.map((slot, index) => ( -
-
-

Spot {index + 1}

-
- -
+ + ))} -
+
-
+ } spacing={0}> {FIELD_POSITIONS.map((position) => { const assignment = generated.defensiveAssignments.find((entry) => entry.position === position); return ( -
-
-

{position}

-
- -
+ + ); })} -
+ {generated.notes.length > 0 ? ( -
+ {generated.notes.map((note) => ( -

{note}

+ + {note} + ))} -
+ ) : null}
diff --git a/baseball/src/components/PlayerForm.tsx b/baseball/src/components/PlayerForm.tsx index 05078cf..859bd29 100644 --- a/baseball/src/components/PlayerForm.tsx +++ b/baseball/src/components/PlayerForm.tsx @@ -1,5 +1,6 @@ "use client"; +import { Box, Button, Checkbox, FormControlLabel, MenuItem, Stack, TextField } from "@mui/material"; import { HANDEDNESS_OPTIONS, POSITIONS } from "@/lib/constants"; import type { PlayerInput, PlayerRecord } from "@/lib/types"; @@ -45,84 +46,88 @@ export function PlayerForm({ submitLabel: string; }) { return ( -
- - - - - - - - -