diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 9fa70e9a1d..f608fc33d1 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -23,14 +23,14 @@ jobs: uses: actions/setup-node@v4 with: node-version: 20 - cache: 'yarn' + cache: 'npm' - name: Install Dependencies - run: yarn install --frozen-lockfile + run: npm ci # We don't run tests here since we assume it's already done during PR process. # - name: Update Browser List # run: npx browserslist@latest --update-db - name: Build React App - run: yarn run build && cp build/index.html build/200.html + run: npm run build && cp build/index.html build/200.html env: NODE_ENV: ${{ github.ref_name == 'main' && 'production' || 'development' }} REACT_APP_APIENDPOINT: ${{ vars.REACT_APP_API_ENDPOINT }} diff --git a/.github/workflows/pull_request_test.yml b/.github/workflows/pull_request_test.yml index 6cb5c6778e..a0b3eb660c 100644 --- a/.github/workflows/pull_request_test.yml +++ b/.github/workflows/pull_request_test.yml @@ -49,10 +49,10 @@ jobs: - uses: actions/setup-node@v4 with: node-version: 20 - cache: 'yarn' + cache: 'npm' - name: Install Dependencies - run: yarn install --frozen-lockfile + run: npm ci - name: Run Unit Tests for Changed Files Only - run: yarn run test:changed + run: npm run test:changed - name: Run Lint - run: yarn run lint \ No newline at end of file + run: npm run lint \ No newline at end of file diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index ce356edad2..3c49c1db4b 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -12,17 +12,17 @@ jobs: - name: Checkout repository uses: actions/checkout@v3 - - name: Set up Node.js & cache Yarn + - name: Set up Node.js & cache npm uses: actions/setup-node@v4 with: node-version: 20 - cache: yarn + cache: npm - name: Install dependencies - run: yarn install + run: npm ci - name: Run tests - run: yarn test + run: npm test - name: Upload test results if: failure() diff --git a/fix-conflicts.js b/fix-conflicts.js new file mode 100644 index 0000000000..233171dd7e --- /dev/null +++ b/fix-conflicts.js @@ -0,0 +1,70 @@ +const fs = require('fs'); + +const files = [ + 'src/components/Announcements/SocialMediaComposer.module.css', + 'src/components/ApplicationAnalytics/jobAnalytics.module.css', + 'src/components/BMDashboard/AddMaterial/AddMaterial.module.css', + 'src/components/BMDashboard/Equipment/Update/UpdateEquipment.module.css', + 'src/components/BMDashboard/Issues/issueChart.module.css', + 'src/components/BMDashboard/Issues/issueCharts.module.css', + 'src/components/BMDashboard/ItemList/ItemListView.module.css', + 'src/components/BMDashboard/Lesson/LessonForm.module.css', + 'src/components/BMDashboard/LessonList/LessonCard.module.css', + 'src/components/BMDashboard/Projects/ProjectDetails/ProjectDetails.module.css', + 'src/components/BMDashboard/UtilizationChart/UtilizationChart.module.css', + 'src/components/BMDashboard/WeeklyProjectSummary/GroupedBarGraphInjurySeverity/InjuryCategoryBarChart.module.css', + 'src/components/BMDashboard/WeeklyProjectSummary/IssueBreakdownChart.module.css', + 'src/components/Collaboration/Collaboration.module.css', + 'src/components/CommunityPortal/Activities/ActivityAttendance.module.css', + 'src/components/CommunityPortal/Activities/activityId/ActivityComments.module.css', + 'src/components/EductionPortal/EvaluationResults/EvaluationResults.module.css', + 'src/components/EductionPortal/EvaluationResults/OverallPerformance.module.css', + 'src/components/EductionPortal/EvaluationResults/TeacherFeedback.module.css', + 'src/components/EductionPortal/StudentTasks/StudentTasks.module.css', + 'src/components/EductionPortal/StudentTasks/TaskDetails.module.css', + 'src/components/ExperienceDonutChart/ExperienceDonutChart.module.css', + 'src/components/Header/Header.module.css', + 'src/components/HGNForm/TopCommunityMembers/TopCommunityMembers.module.css', + 'src/components/HGNPRDashboard/ReviewersStackedBarChart/ReviewersStackedBarChart.module.css', + 'src/components/HGNSkillsDashboard/SkillsProfilePage/styles/ProfileDetails.module.css', + 'src/components/LandingPage/HelpModal.module.css', + 'src/components/LBDashboard/SentimentBreakdownDonutChart/SentimentBreakdownDonutChart.module.css', + 'src/components/MaterialSummary/MaterialSummary.module.css', + 'src/components/Projects/projects.module.css', +]; + +function resolveKeepHead(content) { + const lines = content.split('\n'); + const result = []; + let state = 'normal'; + for (const line of lines) { + if (line.startsWith('<<<<<<< ')) { + state = 'head'; + } else if (line === '=======' && state === 'head') { + state = 'other'; + } else if (line.startsWith('>>>>>>> ') && state === 'other') { + state = 'normal'; + } else if (state !== 'other') { + result.push(line); + } + } + return result.join('\n'); +} + +let count = 0; +for (const f of files) { + if (!fs.existsSync(f)) { + console.log('NOT FOUND: ' + f); + continue; + } + const content = fs.readFileSync(f, 'utf8'); + if (!content.includes('<<<<<<<')) { + console.log('No conflict: ' + f); + continue; + } + const resolved = resolveKeepHead(content); + fs.writeFileSync(f, resolved, 'utf8'); + console.log('Fixed: ' + f); + count++; +} +console.log('Total: ' + count); diff --git a/jsconfig.json b/jsconfig.json index 5ce1fff917..e180e0ae0f 100644 --- a/jsconfig.json +++ b/jsconfig.json @@ -7,4 +7,3 @@ }, "include": ["src"] } - diff --git a/package-lock.json b/package-lock.json index 339a54f0bb..e608c36c1d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -70,6 +70,7 @@ "joi-browser": "^13.4.0", "jquery": "^3.7.1", "jspdf": "^4.2.1", + "jspdf-autotable": "^5.0.7", "jwt-decode": "^2.2.0", "leaflet": "^1.9.4", "leaflet.heat": "^0.2.0", @@ -359,18 +360,18 @@ "license": "MIT" }, "node_modules/@ant-design/icons/node_modules/@ant-design/colors": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@ant-design/colors/-/colors-8.0.0.tgz", - "integrity": "sha512-6YzkKCw30EI/E9kHOIXsQDHmMvTllT8STzjMb4K2qzit33RW2pqCJP0sk+hidBntXxE+Vz4n1+RvCTfBw6OErw==", + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/@ant-design/colors/-/colors-8.0.1.tgz", + "integrity": "sha512-foPVl0+SWIslGUtD/xBr1p9U4AKzPhNYEseXYRRo5QSzGACYZrQbe11AYJbYfAWnWSpGBx6JjBmSeugUsD9vqQ==", "license": "MIT", "dependencies": { "@ant-design/fast-color": "^3.0.0" } }, "node_modules/@ant-design/icons/node_modules/@ant-design/fast-color": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@ant-design/fast-color/-/fast-color-3.0.0.tgz", - "integrity": "sha512-eqvpP7xEDm2S7dUzl5srEQCBTXZMmY3ekf97zI+M2DHOYyKdJGH0qua0JACHTqbkRnD/KHFQP9J1uMJ/XWVzzA==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@ant-design/fast-color/-/fast-color-3.0.1.tgz", + "integrity": "sha512-esKJegpW4nckh0o6kV3Tkb7NPIZYbPnnFxmQDUmL08ukXZAvV85TZBr70eGuke/CIArLaP6aw8lt9KILjnWuOw==", "license": "MIT", "engines": { "node": ">=8.x" @@ -601,9 +602,9 @@ } }, "node_modules/@antv/g2": { - "version": "5.4.7", - "resolved": "https://registry.npmjs.org/@antv/g2/-/g2-5.4.7.tgz", - "integrity": "sha512-pYXOZ4Am+xgQbPshbHlbAsH6+DTPZ2iF8b63Vtfp19CoRuq6oO3cNZl+yweBs2WxLLSxVzjDkwBmB1kZBXOpFg==", + "version": "5.4.8", + "resolved": "https://registry.npmjs.org/@antv/g2/-/g2-5.4.8.tgz", + "integrity": "sha512-IvgIpwmT4M5/QAd3Mn2WiHIDeBqFJ4WA2gcZhRRSZuZ2KmgCqZWZwwIT0hc+kIGxwYeDoCQqf//t6FMVu3ryBg==", "license": "MIT", "dependencies": { "@antv/component": "^2.1.9", @@ -635,6 +636,7 @@ "resolved": "https://registry.npmjs.org/@antv/g6/-/g6-5.0.51.tgz", "integrity": "sha512-/88LJDZ7FHKtpyJibXOnJWZ8gFRp32mLb8KzEFrMuiIC/dsZgTf/oYVw6L4tLKooPXfXqUtrJb2tWFMGR04EMg==", "license": "MIT", + "peer": true, "dependencies": { "@antv/algorithm": "^0.1.26", "@antv/component": "^2.1.7", @@ -832,6 +834,7 @@ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.0.tgz", "integrity": "sha512-UlLAnTPrFdNGoFtbSXwcGFQBtQZJCNjaN6hQNP3UPvuNXT1i82N26KL3dZeIpNalWywr9IuQuncaAfUaS1g6sQ==", "license": "MIT", + "peer": true, "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.27.1", @@ -3061,6 +3064,7 @@ } ], "license": "MIT", + "peer": true, "engines": { "node": ">=18" }, @@ -3084,6 +3088,7 @@ } ], "license": "MIT", + "peer": true, "engines": { "node": ">=18" } @@ -3170,20 +3175,20 @@ } }, "node_modules/@emnapi/core": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.8.1.tgz", - "integrity": "sha512-AvT9QFpxK0Zd8J0jopedNm+w/2fIzvtPKPjqyw9jwvBaReTTqPBk9Hixaz7KbjimP+QNz605/XnjFcDAL2pqBg==", + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.10.0.tgz", + "integrity": "sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw==", "license": "MIT", "optional": true, "dependencies": { - "@emnapi/wasi-threads": "1.1.0", + "@emnapi/wasi-threads": "1.2.1", "tslib": "^2.4.0" } }, "node_modules/@emnapi/runtime": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.8.1.tgz", - "integrity": "sha512-mehfKSMWjjNol8659Z8KxEMrdSJDDot5SXMq00dM8BN4o+CLNXQ0xH2V7EchNHV4RmbZLmmPdEaXZc5H2FXmDg==", + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.10.0.tgz", + "integrity": "sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==", "license": "MIT", "optional": true, "dependencies": { @@ -3191,9 +3196,9 @@ } }, "node_modules/@emnapi/wasi-threads": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.1.0.tgz", - "integrity": "sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.1.tgz", + "integrity": "sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==", "license": "MIT", "optional": true, "dependencies": { @@ -3245,9 +3250,9 @@ "license": "MIT" }, "node_modules/@emotion/is-prop-valid": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.3.1.tgz", - "integrity": "sha512-/ACwoqx7XQi9knQs/G0qKvv5teDMhD7bXYns9N/wM8ah8iNb8jZ2uNO0YOgiq2o2poIvVtJS2YALasQuMSQ7Kw==", + "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" @@ -3264,6 +3269,7 @@ "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.14.0.tgz", "integrity": "sha512-O000MLDBDdk/EohJPFUqvnp4qnHeYkVP5B0xEG0D/L7cOKP9kefu2DXn8dj74cQfsEzUqh+sr1RzFqiL1o+PpA==", "license": "MIT", + "peer": true, "dependencies": { "@babel/runtime": "^7.18.3", "@emotion/babel-plugin": "^11.13.5", @@ -3307,6 +3313,7 @@ "resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-11.14.1.tgz", "integrity": "sha512-qEEJt42DuToa3gurlH4Qqc1kVpNq8wO8cJtDzU46TjlzWjDlsVyevtYCRijVq3SrHsROS+gVQ8Fnea108GnKzw==", "license": "MIT", + "peer": true, "dependencies": { "@babel/runtime": "^7.18.3", "@emotion/babel-plugin": "^11.13.5", @@ -4090,6 +4097,7 @@ "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-6.7.2.tgz", "integrity": "sha512-yxtOBWDrdi5DD5o1pmVdq3WMCvnobT0LU6R8RyyVXPvFRd2o79/0NCuQoCjNTeZz9EzA9xS3JxNWfv54RIHFEA==", "license": "MIT", + "peer": true, "dependencies": { "@fortawesome/fontawesome-common-types": "6.7.2" }, @@ -4247,7 +4255,8 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/redux/-/redux-5.0.1.tgz", "integrity": "sha512-M9/ELqF6fy8FwmkpnF0S3YKOqMyoWJ4+CS5Efg2ct3oY9daQvd/Pc71FpGZsVsbl3Cpb+IIcjBDUnnyBdQbq4w==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/@humanwhocodes/config-array": { "version": "0.13.0", @@ -5310,16 +5319,16 @@ } }, "node_modules/@jest/environment-jsdom-abstract/node_modules/@sinclair/typebox": { - "version": "0.34.49", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.49.tgz", - "integrity": "sha512-brySQQs7Jtn0joV8Xh9ZV/hZb9Ozb0pmazDIASBkYKCjXrXU3mpcFahmK/z4YDhGkQvP9mWJbVyahdtU5wQA+A==", + "version": "0.34.48", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.48.tgz", + "integrity": "sha512-kKJTNuK3AQOrgjjotVxMrCn1sUJwM76wMszfq1kdU4uYVJjvEWuFQ6HgvLt4Xz3fSmZlTOxJ/Ie13KnIcWQXFA==", "dev": true, "license": "MIT" }, "node_modules/@jest/environment-jsdom-abstract/node_modules/@sinonjs/fake-timers": { - "version": "15.3.2", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-15.3.2.tgz", - "integrity": "sha512-mrn35Jl2pCpns+mE3HaZa1yPN5EYCRgiMI+135COjr2hr8Cls9DXqIZ57vZe2cz7y2XVSq92tcs6kGQcT1J8Rw==", + "version": "15.1.1", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-15.1.1.tgz", + "integrity": "sha512-cO5W33JgAPbOh07tvZjUOJ7oWhtaqGHiZw+11DPbyqh2kHTBc3eF/CjJDeQ4205RLQsX6rxCuYOroFQwl7JDRw==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -6373,6 +6382,7 @@ "resolved": "https://registry.npmjs.org/@mui/material/-/material-7.3.1.tgz", "integrity": "sha512-Xf6Shbo03YmcBedZMwSpEFOwpYDtU7tC+rhAHTrA9FHk0FpsDqiQ9jUa1j/9s3HLs7KWb5mDcGnlwdh9Q9KAag==", "license": "MIT", + "peer": true, "dependencies": { "@babel/runtime": "^7.28.2", "@mui/core-downloads-tracker": "^7.3.1", @@ -6483,6 +6493,7 @@ "resolved": "https://registry.npmjs.org/@mui/system/-/system-7.3.1.tgz", "integrity": "sha512-mIidecvcNVpNJMdPDmCeoSL5zshKBbYPcphjuh6ZMjhybhqhZ4mX6k9zmIWh6XOXcqRQMg5KrcjnO0QstrNj3w==", "license": "MIT", + "peer": true, "dependencies": { "@babel/runtime": "^7.28.2", "@mui/private-theming": "^7.3.1", @@ -6954,8 +6965,8 @@ }, "node_modules/@parcel/watcher-linux-x64-glibc": { "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.1.tgz", - "integrity": "sha512-9lHBdJITeNR++EvSQVUcaZoWupyHfXe1jZvGZ06O/5MflPcuPLtEphScIBL+AiCWBO46tDSHzWyD0uDmmZqsgA==", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.1.tgz", + "integrity": "sha512-GcESn8NZySmfwlTsIur+49yDqSny2IhPeZfXunQi48DMugKeZ7uy1FX83pO0X22sHntJ4Ub+9k34XQCX+oHt2A==", "cpu": [ "x64" ], @@ -6963,7 +6974,7 @@ "license": "MIT", "optional": true, "os": [ - "win32" + "linux" ], "engines": { "node": ">= 10.0.0" @@ -7091,15 +7102,16 @@ "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", "license": "MIT", + "peer": true, "funding": { "type": "opencollective", "url": "https://opencollective.com/popperjs" } }, "node_modules/@rc-component/async-validator": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/@rc-component/async-validator/-/async-validator-5.0.4.tgz", - "integrity": "sha512-qgGdcVIF604M9EqjNF0hbUTz42bz/RDtxWdWuU5EQe3hi7M8ob54B6B35rOsvX5eSvIHIzT9iH1R3n+hk3CGfg==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@rc-component/async-validator/-/async-validator-5.1.0.tgz", + "integrity": "sha512-n4HcR5siNUXRX23nDizbZBQPO0ZM/5oTtmKZ6/eqL0L2bo747cklFdZGRN2f+c9qWGICwDzrhW0H7tE9PptdcA==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.24.4" @@ -7244,9 +7256,9 @@ } }, "node_modules/@rc-component/util": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@rc-component/util/-/util-1.7.0.tgz", - "integrity": "sha512-tIvIGj4Vl6fsZFvWSkYw9sAfiCKUXMyhVz6kpKyZbwyZyRPqv2vxYZROdaO1VB4gqTNvUZFXh6i3APUiterw5g==", + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@rc-component/util/-/util-1.10.0.tgz", + "integrity": "sha512-aY9GLBuiUdpyfIUpAWSYer4Tu3mVaZCo5A0q9NtXcazT3MRiI3/WNHCR+DUn5VAtR6iRRf0ynCqQUcHli5UdYw==", "license": "MIT", "dependencies": { "is-mobile": "^5.0.0", @@ -7304,7 +7316,8 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/redux/-/redux-5.0.1.tgz", "integrity": "sha512-M9/ELqF6fy8FwmkpnF0S3YKOqMyoWJ4+CS5Efg2ct3oY9daQvd/Pc71FpGZsVsbl3Cpb+IIcjBDUnnyBdQbq4w==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/@reduxjs/toolkit/node_modules/redux-thunk": { "version": "3.1.0", @@ -7372,9 +7385,9 @@ ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.60.2.tgz", - "integrity": "sha512-UwRE7CGpvSVEQS8gUMBe1uADWjNnVgP3Iusyda1nSRwNDCsRjnGc7w6El6WLQsXmZTbLZx9cecegumcitNfpmA==", + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.60.1.tgz", + "integrity": "sha512-mjCpF7GmkRtSJwon+Rq1N8+pI+8l7w5g9Z3vWj4T7abguC4Czwi3Yu/pFaLvA3TTeMVjnu3ctigusqWUfjZzvw==", "cpu": [ "arm64" ], @@ -7743,9 +7756,9 @@ "license": "MIT" }, "node_modules/@tanstack/query-core": { - "version": "5.90.16", - "resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-5.90.16.tgz", - "integrity": "sha512-MvtWckSVufs/ja463/K4PyJeqT+HMlJWtw6PrCpywznd2NSgO3m4KwO9RqbFqGg6iDE8vVMFWMeQI4Io3eEYww==", + "version": "5.95.2", + "resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-5.95.2.tgz", + "integrity": "sha512-o4T8vZHZET4Bib3jZ/tCW9/7080urD4c+0/AUaYVpIqOsr7y0reBc1oX3ttNaSW5mYyvZHctiQ/UOP2PfdmFEQ==", "license": "MIT", "funding": { "type": "github", @@ -7753,12 +7766,12 @@ } }, "node_modules/@tanstack/react-query": { - "version": "5.90.16", - "resolved": "https://registry.npmjs.org/@tanstack/react-query/-/react-query-5.90.16.tgz", - "integrity": "sha512-bpMGOmV4OPmif7TNMteU/Ehf/hoC0Kf98PDc0F4BZkFrEapRMEqI/V6YS0lyzwSV6PQpY1y4xxArUIfBW5LVxQ==", + "version": "5.95.2", + "resolved": "https://registry.npmjs.org/@tanstack/react-query/-/react-query-5.95.2.tgz", + "integrity": "sha512-/wGkvLj/st5Ud1Q76KF1uFxScV7WeqN1slQx5280ycwAyYkIPGaRZAEgHxe3bjirSd5Zpwkj6zNcR4cqYni/ZA==", "license": "MIT", "dependencies": { - "@tanstack/query-core": "5.90.16" + "@tanstack/query-core": "5.95.2" }, "funding": { "type": "github", @@ -7774,6 +7787,7 @@ "integrity": "sha512-o4PXJQidqJl82ckFaXUeoAW+XysPLauYI43Abki5hABd853iMhitooc6znOnczgbTYmEP6U6/y1ZyKAIsvMKGg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/code-frame": "^7.10.4", "@babel/runtime": "^7.12.5", @@ -8611,6 +8625,7 @@ "resolved": "https://registry.npmjs.org/@types/react/-/react-19.1.12.tgz", "integrity": "sha512-cMoR+FoAf/Jyq6+Df2/Z41jISvGZZ2eTlnsaJRptmZ76Caldwy1odD4xTr/gNV9VLj0AWgg/nmkevIyUfIIq5w==", "license": "MIT", + "peer": true, "dependencies": { "csstype": "^3.0.2" } @@ -8679,9 +8694,9 @@ "license": "MIT" }, "node_modules/@types/stylis": { - "version": "4.2.5", - "resolved": "https://registry.npmjs.org/@types/stylis/-/stylis-4.2.5.tgz", - "integrity": "sha512-1Xve+NMN7FWjY14vLoY5tL3BVEQ/n42YLwaqJIPYhotZ9uBHt87VceMwWQpzmdEt2TNXIorIFG+YeCUUW7RInw==", + "version": "4.2.7", + "resolved": "https://registry.npmjs.org/@types/stylis/-/stylis-4.2.7.tgz", + "integrity": "sha512-VgDNokpBoKF+wrdvhAAfS55OMQpL6QRglwTwNC3kIgBrzZxA4WsFj+2eLfEA/uMUDzBcEhYmjSbwQakn/i3ajA==", "license": "MIT" }, "node_modules/@types/testing-library__jest-dom": { @@ -8736,20 +8751,20 @@ "license": "MIT" }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.59.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.59.0.tgz", - "integrity": "sha512-HyAZtpdkgZwpq8Sz3FSUvCR4c+ScbuWa9AksK2Jweub7w4M3yTz4O11AqVJzLYjy/B9ZWPyc81I+mOdJU/bDQw==", + "version": "8.57.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.57.2.tgz", + "integrity": "sha512-NZZgp0Fm2IkD+La5PR81sd+g+8oS6JwJje+aRWsDocxHkjyRw0J5L5ZTlN3LI1LlOcGL7ph3eaIUmTXMIjLk0w==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/regexpp": "^4.12.2", - "@typescript-eslint/scope-manager": "8.59.0", - "@typescript-eslint/type-utils": "8.59.0", - "@typescript-eslint/utils": "8.59.0", - "@typescript-eslint/visitor-keys": "8.59.0", + "@typescript-eslint/scope-manager": "8.57.2", + "@typescript-eslint/type-utils": "8.57.2", + "@typescript-eslint/utils": "8.57.2", + "@typescript-eslint/visitor-keys": "8.57.2", "ignore": "^7.0.5", "natural-compare": "^1.4.0", - "ts-api-utils": "^2.5.0" + "ts-api-utils": "^2.4.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -8759,9 +8774,9 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@typescript-eslint/parser": "^8.59.0", + "@typescript-eslint/parser": "^8.57.2", "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", - "typescript": ">=4.8.4 <6.1.0" + "typescript": ">=4.8.4 <6.0.0" } }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { @@ -8775,16 +8790,17 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "8.59.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.59.0.tgz", - "integrity": "sha512-TI1XGwKbDpo9tRW8UDIXCOeLk55qe9ZFGs8MTKU6/M08HWTw52DD/IYhfQtOEhEdPhLMT26Ka/x7p70nd3dzDg==", + "version": "8.57.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.57.2.tgz", + "integrity": "sha512-30ScMRHIAD33JJQkgfGW1t8CURZtjc2JpTrq5n2HFhOefbAhb7ucc7xJwdWcrEtqUIYJ73Nybpsggii6GtAHjA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { - "@typescript-eslint/scope-manager": "8.59.0", - "@typescript-eslint/types": "8.59.0", - "@typescript-eslint/typescript-estree": "8.59.0", - "@typescript-eslint/visitor-keys": "8.59.0", + "@typescript-eslint/scope-manager": "8.57.2", + "@typescript-eslint/types": "8.57.2", + "@typescript-eslint/typescript-estree": "8.57.2", + "@typescript-eslint/visitor-keys": "8.57.2", "debug": "^4.4.3" }, "engines": { @@ -8796,18 +8812,18 @@ }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", - "typescript": ">=4.8.4 <6.1.0" + "typescript": ">=4.8.4 <6.0.0" } }, "node_modules/@typescript-eslint/project-service": { - "version": "8.59.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.59.0.tgz", - "integrity": "sha512-Lw5ITrR5s5TbC19YSvlr63ZfLaJoU6vtKTHyB0GQOpX0W7d5/Ir6vUahWi/8Sps/nOukZQ0IB3SmlxZnjaKVnw==", + "version": "8.57.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.57.2.tgz", + "integrity": "sha512-FuH0wipFywXRTHf+bTTjNyuNQQsQC3qh/dYzaM4I4W0jrCqjCVuUh99+xd9KamUfmCGPvbO8NDngo/vsnNVqgw==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.59.0", - "@typescript-eslint/types": "^8.59.0", + "@typescript-eslint/tsconfig-utils": "^8.57.2", + "@typescript-eslint/types": "^8.57.2", "debug": "^4.4.3" }, "engines": { @@ -8818,18 +8834,18 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "typescript": ">=4.8.4 <6.1.0" + "typescript": ">=4.8.4 <6.0.0" } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "8.59.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.59.0.tgz", - "integrity": "sha512-UzR16Ut8IpA3Mc4DbgAShlPPkVm8xXMWafXxB0BocaVRHs8ZGakAxGRskF7FId3sdk9lgGD73GSFaWmWFDE4dg==", + "version": "8.57.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.57.2.tgz", + "integrity": "sha512-snZKH+W4WbWkrBqj4gUNRIGb/jipDW3qMqVJ4C9rzdFc+wLwruxk+2a5D+uoFcKPAqyqEnSb4l2ULuZf95eSkw==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.59.0", - "@typescript-eslint/visitor-keys": "8.59.0" + "@typescript-eslint/types": "8.57.2", + "@typescript-eslint/visitor-keys": "8.57.2" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -8840,9 +8856,9 @@ } }, "node_modules/@typescript-eslint/tsconfig-utils": { - "version": "8.59.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.59.0.tgz", - "integrity": "sha512-91Sbl3s4Kb3SybliIY6muFBmHVv+pYXfybC4Oolp3dvk8BvIE3wOPc+403CWIT7mJNkfQRGtdqghzs2+Z91Tqg==", + "version": "8.57.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.57.2.tgz", + "integrity": "sha512-3Lm5DSM+DCowsUOJC+YqHHnKEfFh5CoGkj5Z31NQSNF4l5wdOwqGn99wmwN/LImhfY3KJnmordBq/4+VDe2eKw==", "dev": true, "license": "MIT", "engines": { @@ -8853,21 +8869,21 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "typescript": ">=4.8.4 <6.1.0" + "typescript": ">=4.8.4 <6.0.0" } }, "node_modules/@typescript-eslint/type-utils": { - "version": "8.59.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.59.0.tgz", - "integrity": "sha512-3TRiZaQSltGqGeNrJzzr1+8YcEobKH9rHnqIp/1psfKFmhRQDNMGP5hBufanYTGznwShzVLs3Mz+gDN7HkWfXg==", + "version": "8.57.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.57.2.tgz", + "integrity": "sha512-Co6ZCShm6kIbAM/s+oYVpKFfW7LBc6FXoPXjTRQ449PPNBY8U0KZXuevz5IFuuUj2H9ss40atTaf9dlGLzbWZg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.59.0", - "@typescript-eslint/typescript-estree": "8.59.0", - "@typescript-eslint/utils": "8.59.0", + "@typescript-eslint/types": "8.57.2", + "@typescript-eslint/typescript-estree": "8.57.2", + "@typescript-eslint/utils": "8.57.2", "debug": "^4.4.3", - "ts-api-utils": "^2.5.0" + "ts-api-utils": "^2.4.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -8878,13 +8894,13 @@ }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", - "typescript": ">=4.8.4 <6.1.0" + "typescript": ">=4.8.4 <6.0.0" } }, "node_modules/@typescript-eslint/types": { - "version": "8.59.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.59.0.tgz", - "integrity": "sha512-nLzdsT1gdOgFxxxwrlNVUBzSNBEEHJ86bblmk4QAS6stfig7rcJzWKqCyxFy3YRRHXDWEkb2NralA1nOYkkm/A==", + "version": "8.57.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.57.2.tgz", + "integrity": "sha512-/iZM6FnM4tnx9csuTxspMW4BOSegshwX5oBDznJ7S4WggL7Vczz5d2W11ecc4vRrQMQHXRSxzrCsyG5EsPPTbA==", "dev": true, "license": "MIT", "engines": { @@ -8896,21 +8912,21 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.59.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.59.0.tgz", - "integrity": "sha512-O9Re9P1BmBLFJyikRbQpLku/QA3/AueZNO9WePLBwQrvkixTmDe8u76B6CYUAITRl/rHawggEqUGn5QIkVRLMw==", + "version": "8.57.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.57.2.tgz", + "integrity": "sha512-2MKM+I6g8tJxfSmFKOnHv2t8Sk3T6rF20A1Puk0svLK+uVapDZB/4pfAeB7nE83uAZrU6OxW+HmOd5wHVdXwXA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/project-service": "8.59.0", - "@typescript-eslint/tsconfig-utils": "8.59.0", - "@typescript-eslint/types": "8.59.0", - "@typescript-eslint/visitor-keys": "8.59.0", + "@typescript-eslint/project-service": "8.57.2", + "@typescript-eslint/tsconfig-utils": "8.57.2", + "@typescript-eslint/types": "8.57.2", + "@typescript-eslint/visitor-keys": "8.57.2", "debug": "^4.4.3", "minimatch": "^10.2.2", "semver": "^7.7.3", "tinyglobby": "^0.2.15", - "ts-api-utils": "^2.5.0" + "ts-api-utils": "^2.4.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -8920,7 +8936,7 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "typescript": ">=4.8.4 <6.1.0" + "typescript": ">=4.8.4 <6.0.0" } }, "node_modules/@typescript-eslint/typescript-estree/node_modules/balanced-match": { @@ -8934,9 +8950,9 @@ } }, "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.5.tgz", - "integrity": "sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==", + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.4.tgz", + "integrity": "sha512-h+DEnpVvxmfVefa4jFbCf5HdH5YMDXRsmKflpf1pILZWRFlTbJpxeU55nJl4Smt5HQaGzg1o6RHFPJaOqnmBDg==", "dev": true, "license": "MIT", "dependencies": { @@ -8947,13 +8963,13 @@ } }, "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { - "version": "10.2.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", - "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", + "version": "10.2.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.4.tgz", + "integrity": "sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg==", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { - "brace-expansion": "^5.0.5" + "brace-expansion": "^5.0.2" }, "engines": { "node": "18 || 20 || >=22" @@ -8963,16 +8979,16 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "8.59.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.59.0.tgz", - "integrity": "sha512-I1R/K7V07XsMJ12Oaxg/O9GfrysGTmCRhvZJBv0RE0NcULMzjqVpR5kRRQjHsz3J/bElU7HwCO7zkqL+MSUz+g==", + "version": "8.57.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.57.2.tgz", + "integrity": "sha512-krRIbvPK1ju1WBKIefiX+bngPs+odIQUtR7kymzPfo1POVw3jlF+nLkmexdSSd4UCbDcQn+wMBATOOmpBbqgKg==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.9.1", - "@typescript-eslint/scope-manager": "8.59.0", - "@typescript-eslint/types": "8.59.0", - "@typescript-eslint/typescript-estree": "8.59.0" + "@typescript-eslint/scope-manager": "8.57.2", + "@typescript-eslint/types": "8.57.2", + "@typescript-eslint/typescript-estree": "8.57.2" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -8983,17 +8999,17 @@ }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", - "typescript": ">=4.8.4 <6.1.0" + "typescript": ">=4.8.4 <6.0.0" } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.59.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.59.0.tgz", - "integrity": "sha512-/uejZt4dSere1bx12WLlPfv8GktzcaDtuJ7s42/HEZ5zGj9oxRaD4bj7qwSunXkf+pbAhFt2zjpHYUiT5lHf0Q==", + "version": "8.57.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.57.2.tgz", + "integrity": "sha512-zhahknjobV2FiD6Ee9iLbS7OV9zi10rG26odsQdfBO/hjSzUQbkIYgda+iNKK1zNiW2ey+Lf8MU5btN17V3dUw==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.59.0", + "@typescript-eslint/types": "8.57.2", "eslint-visitor-keys": "^5.0.0" }, "engines": { @@ -9399,6 +9415,7 @@ "integrity": "sha512-xHif5tkQOZK4YjA44rrzmvXMI1cb1Qato3P+NL/gwyoK5LdZx0f5Q59Il25JtuhN/htBvrT+Copt3Q4Ma4gJbg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@vitest/utils": "3.2.2", "fflate": "^0.8.2", @@ -9611,6 +9628,7 @@ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", "license": "MIT", + "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -9655,6 +9673,7 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.18.0.tgz", "integrity": "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==", "license": "MIT", + "peer": true, "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", @@ -10137,14 +10156,15 @@ } }, "node_modules/axios": { - "version": "1.15.2", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.15.2.tgz", - "integrity": "sha512-wLrXxPtcrPTsNlJmKjkPnNPK2Ihe0hn0wGSaTEiHRPxwjvJwT3hKmXF4dpqxmPO9SoNb2FsYXj/xEo0gHN+D5A==", + "version": "1.13.6", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.13.6.tgz", + "integrity": "sha512-ChTCHMouEe2kn713WHbQGcuYrr6fXTBiu460OTwWrWob16g1bXn4vtz07Ope7ewMozJAnEquLk5lWQWtBig9DQ==", "license": "MIT", + "peer": true, "dependencies": { "follow-redirects": "^1.15.11", "form-data": "^4.0.5", - "proxy-from-env": "^2.1.0" + "proxy-from-env": "^1.1.0" } }, "node_modules/axios-mock-adapter": { @@ -10230,6 +10250,7 @@ "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz", "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==", "license": "MIT", + "peer": true, "dependencies": { "@babel/runtime": "^7.12.5", "cosmiconfig": "^7.0.0", @@ -10371,9 +10392,9 @@ "license": "MIT" }, "node_modules/baseline-browser-mapping": { - "version": "2.10.21", - "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.21.tgz", - "integrity": "sha512-Q+rUQ7Uz8AHM7DEaNdwvfFCTq7a43lNTzuS94eiWqwyxfV/wJv+oUivef51T91mmRY4d4A1u9rcSvkeufCVXlA==", + "version": "2.10.10", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.10.tgz", + "integrity": "sha512-sUoJ3IMxx4AyRqO4MLeHlnGDkyXRoUG0/AI9fjK+vS72ekpV0yWVY7O0BVjmBcRtkNcsAO2QDZ4tdKKGoI6YaQ==", "license": "Apache-2.0", "bin": { "baseline-browser-mapping": "dist/cli.cjs" @@ -10387,7 +10408,6 @@ "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", "license": "MIT", - "peer": true, "engines": { "node": "*" } @@ -10540,9 +10560,9 @@ } }, "node_modules/browserslist": { - "version": "4.28.2", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.2.tgz", - "integrity": "sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg==", + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz", + "integrity": "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==", "funding": [ { "type": "opencollective", @@ -10558,12 +10578,13 @@ } ], "license": "MIT", + "peer": true, "dependencies": { - "baseline-browser-mapping": "^2.10.12", - "caniuse-lite": "^1.0.30001782", - "electron-to-chromium": "^1.5.328", - "node-releases": "^2.0.36", - "update-browserslist-db": "^1.2.3" + "baseline-browser-mapping": "^2.9.0", + "caniuse-lite": "^1.0.30001759", + "electron-to-chromium": "^1.5.263", + "node-releases": "^2.0.27", + "update-browserslist-db": "^1.2.0" }, "bin": { "browserslist": "cli.js" @@ -10745,9 +10766,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001790", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001790.tgz", - "integrity": "sha512-bOoxfJPyYo+ds6W0YfptaCWbFnJYjh2Y1Eow5lRv+vI2u8ganPZqNm1JwNh0t2ELQCqIWg4B3dWEusgAmsoyOw==", + "version": "1.0.30001781", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001781.tgz", + "integrity": "sha512-RdwNCyMsNBftLjW6w01z8bKEvT6e/5tpPVEgtn22TiLGlstHOVecsX2KHFkD5e/vRnIE4EGzpuIODb3mtswtkw==", "funding": [ { "type": "opencollective", @@ -10841,6 +10862,7 @@ "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-4.5.0.tgz", "integrity": "sha512-aYeC/jDgSEx8SHWZvANYMioYMZ2KX02W6f6uVfyteuCGcadDLcYVHdfdygsTQkQ4TKn5lghoojAsPj5pu0SnvQ==", "license": "MIT", + "peer": true, "dependencies": { "@kurkle/color": "^0.3.0" }, @@ -11597,9 +11619,9 @@ } }, "node_modules/csstype": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", - "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", "license": "MIT" }, "node_modules/d3": { @@ -11974,6 +11996,7 @@ "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz", "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==", "license": "ISC", + "peer": true, "engines": { "node": ">=12" } @@ -12148,6 +12171,7 @@ "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.30.0.tgz", "integrity": "sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==", "license": "MIT", + "peer": true, "dependencies": { "@babel/runtime": "^7.21.0" }, @@ -12172,7 +12196,8 @@ "version": "1.11.18", "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.18.tgz", "integrity": "sha512-zFBQ7WFRvVRhKcWoUh+ZA1g2HVgUbsZm9sbddh8EC5iv93sui8DVVz1Npvz+r6meo9VKfa8NyLWBsQK1VvIKPA==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/debug": { "version": "4.4.3", @@ -12485,9 +12510,9 @@ } }, "node_modules/dompurify": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.4.1.tgz", - "integrity": "sha512-JahakDAIg1gyOm7dlgWSDjV4n7Ip2PKR55NIT6jrMfIgLFgWo81vdr1/QGqWtFNRqXP9UV71oVePtjqS2ebnPw==", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.3.3.tgz", + "integrity": "sha512-Oj6pzI2+RqBfFG+qOaOLbFXLQ90ARpcGG6UePL82bJLtdsa6CYJD7nmiU8MW9nQNOtCHV3lZ/Bzq1X0QYbBZCA==", "license": "(MPL-2.0 OR Apache-2.0)", "optionalDependencies": { "@types/trusted-types": "^2.0.7" @@ -12537,9 +12562,9 @@ "license": "MIT" }, "node_modules/electron-to-chromium": { - "version": "1.5.344", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.344.tgz", - "integrity": "sha512-4MxfbmNDm+KPh066EZy+eUnkcDPcZ35wNmOWzFuh/ijvHsve6kbLTLURy88uCNK5FbpN+yk2nQY6BYh1GEt+wg==", + "version": "1.5.321", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.321.tgz", + "integrity": "sha512-L2C7Q279W2D/J4PLZLk7sebOILDSWos7bMsMNN06rK482umHUrh/3lM8G7IlHFOYip2oAg5nha1rCMxr/rs6ZQ==", "license": "ISC" }, "node_modules/elliptic": { @@ -12586,7 +12611,6 @@ "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", "license": "MIT", - "peer": true, "engines": { "node": ">= 4" } @@ -12605,13 +12629,13 @@ } }, "node_modules/enhanced-resolve": { - "version": "5.21.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.21.0.tgz", - "integrity": "sha512-otxSQPw4lkOZWkHpB3zaEQs6gWYEsmX4xQF68ElXC/TWvGxGMSGOvoNbaLXm6/cS/fSfHtsEdw90y20PCd+sCA==", + "version": "5.20.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.20.1.tgz", + "integrity": "sha512-Qohcme7V1inbAfvjItgw0EaxVX5q2rdVEZHRBrEQdRZTssLDGsL8Lwrznl8oQ/6kuTJONLaDcGjkNP247XEhcA==", "license": "MIT", "dependencies": { "graceful-fs": "^4.2.4", - "tapable": "^2.3.3" + "tapable": "^2.3.0" }, "engines": { "node": ">=10.13.0" @@ -12917,6 +12941,7 @@ "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", @@ -14416,6 +14441,7 @@ "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", "license": "ISC", "dependencies": { "fs.realpath": "^1.0.0", @@ -15150,6 +15176,7 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", "license": "ISC", "dependencies": { "once": "^1.3.0", @@ -17277,16 +17304,16 @@ } }, "node_modules/jest-environment-jsdom/node_modules/@sinclair/typebox": { - "version": "0.34.49", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.49.tgz", - "integrity": "sha512-brySQQs7Jtn0joV8Xh9ZV/hZb9Ozb0pmazDIASBkYKCjXrXU3mpcFahmK/z4YDhGkQvP9mWJbVyahdtU5wQA+A==", + "version": "0.34.48", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.48.tgz", + "integrity": "sha512-kKJTNuK3AQOrgjjotVxMrCn1sUJwM76wMszfq1kdU4uYVJjvEWuFQ6HgvLt4Xz3fSmZlTOxJ/Ie13KnIcWQXFA==", "dev": true, "license": "MIT" }, "node_modules/jest-environment-jsdom/node_modules/@sinonjs/fake-timers": { - "version": "15.3.2", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-15.3.2.tgz", - "integrity": "sha512-mrn35Jl2pCpns+mE3HaZa1yPN5EYCRgiMI+135COjr2hr8Cls9DXqIZ57vZe2cz7y2XVSq92tcs6kGQcT1J8Rw==", + "version": "15.1.1", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-15.1.1.tgz", + "integrity": "sha512-cO5W33JgAPbOh07tvZjUOJ7oWhtaqGHiZw+11DPbyqh2kHTBc3eF/CjJDeQ4205RLQsX6rxCuYOroFQwl7JDRw==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -19748,7 +19775,8 @@ "version": "3.7.1", "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.7.1.tgz", "integrity": "sha512-m4avr8yL8kmFN8psrbFFFmB/If14iN5o9nw/NgnnM+kybDJpRsAynV2BsfpTYrTRysYUdADVD7CkUUizgkpLfg==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/js-tokens": { "version": "4.0.0", @@ -19775,6 +19803,7 @@ "integrity": "sha512-Cvc9WUhxSMEo4McES3P7oK3QaXldCfNWp7pl2NNeiIFlCoLr3kfq9kb1fxftiwk1FLV7CvpvDfonxtzUDeSOPg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "cssstyle": "^4.2.1", "data-urls": "^5.0.0", @@ -19885,6 +19914,7 @@ "resolved": "https://registry.npmjs.org/jspdf/-/jspdf-4.2.1.tgz", "integrity": "sha512-YyAXyvnmjTbR4bHQRLzex3CuINCDlQnBqoSYyjJwTP2x9jDLuKDzy7aKUl0hgx3uhcl7xzg32agn5vlie6HIlQ==", "license": "MIT", + "peer": true, "dependencies": { "@babel/runtime": "^7.28.6", "fast-png": "^6.2.0", @@ -19897,6 +19927,15 @@ "html2canvas": "^1.0.0-rc.5" } }, + "node_modules/jspdf-autotable": { + "version": "5.0.7", + "resolved": "https://registry.npmjs.org/jspdf-autotable/-/jspdf-autotable-5.0.7.tgz", + "integrity": "sha512-2wr7H6liNDBYNwt25hMQwXkEWFOEopgKIvR1Eukuw6Zmprm/ZcnmLTQEjW7Xx3FCbD3v7pflLcnMAv/h1jFDQw==", + "license": "MIT", + "peerDependencies": { + "jspdf": "^2 || ^3 || ^4" + } + }, "node_modules/jsx-ast-utils": { "version": "3.3.5", "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", @@ -19976,7 +20015,8 @@ "version": "1.9.4", "resolved": "https://registry.npmjs.org/leaflet/-/leaflet-1.9.4.tgz", "integrity": "sha512-nxS1ynzJOmOlHp+iL3FyWqK89GtNL8U8rvlMOsQdTTssxZwCXh8N2NB3GDQOL+YR3XnWyZAxwQixURb+FA74PA==", - "license": "BSD-2-Clause" + "license": "BSD-2-Clause", + "peer": true }, "node_modules/leaflet.heat": { "version": "0.2.0", @@ -20016,9 +20056,9 @@ } }, "node_modules/libphonenumber-js": { - "version": "1.12.42", - "resolved": "https://registry.npmjs.org/libphonenumber-js/-/libphonenumber-js-1.12.42.tgz", - "integrity": "sha512-oKQFPTibqQwZZkChCDVMFVJXMZdyJNqDWZWYNn8BgyAaK/6yFJEowxCY0RVFirRyWP63hMRuKlkSEd9qlvbWXg==", + "version": "1.12.40", + "resolved": "https://registry.npmjs.org/libphonenumber-js/-/libphonenumber-js-1.12.40.tgz", + "integrity": "sha512-HKGs7GowShNls3Zh+7DTr6wYpPk5jC78l508yQQY3e8ZgJChM3A9JZghmMJZuK+5bogSfuTafpjksGSR3aMIEg==", "license": "MIT" }, "node_modules/lines-and-columns": { @@ -20098,7 +20138,6 @@ "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", "license": "MIT", - "peer": true, "dependencies": { "big.js": "^5.2.2", "emojis-list": "^3.0.0", @@ -20345,9 +20384,9 @@ } }, "node_modules/mdn-data": { - "version": "2.28.0", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.28.0.tgz", - "integrity": "sha512-uy9AS1yt+wW5eUEefgE3lOpqPghanUttycV0GXKbiXyBjwvbeE8XPj4u1C+voRfz7dEjwU4NDHTMfZ/s/JtZrQ==", + "version": "2.27.1", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.27.1.tgz", + "integrity": "sha512-9Yubnt3e8A0OKwxYSXyhLymGW4sCufcLG6VdiDdUGVkPhpqLxlvP5vl1983gQjJl3tqbrM731mjaZaP68AgosQ==", "dev": true, "license": "CC0-1.0" }, @@ -20367,6 +20406,12 @@ "url": "https://github.com/sindresorhus/mem?sponsor=1" } }, + "node_modules/memoize-one": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-6.0.0.tgz", + "integrity": "sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==", + "license": "MIT" + }, "node_modules/meow": { "version": "13.2.0", "resolved": "https://registry.npmjs.org/meow/-/meow-13.2.0.tgz", @@ -20568,6 +20613,7 @@ "resolved": "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz", "integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==", "license": "MIT", + "peer": true, "engines": { "node": "*" } @@ -20607,6 +20653,7 @@ "dev": true, "hasInstallScript": true, "license": "MIT", + "peer": true, "dependencies": { "@bundled-es-modules/cookie": "^2.0.1", "@bundled-es-modules/statuses": "^1.0.1", @@ -20735,9 +20782,9 @@ "license": "MIT" }, "node_modules/node-releases": { - "version": "2.0.38", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.38.tgz", - "integrity": "sha512-3qT/88Y3FbH/Kx4szpQQ4HzUbVrHPKTLVpVocKiLfoYvw9XSGOX2FmD2d6DrXbVYyAQTF2HeF6My8jmzx7/CRw==", + "version": "2.0.27", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz", + "integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==", "license": "MIT" }, "node_modules/normalize-path": { @@ -21378,6 +21425,7 @@ "integrity": "sha512-Wb4p1J4zyFTbM+u6WuO4XstYx4Ky9Cewe4DWrel7B0w6VVICvPwdOpotjzcf6eD8TsckVnIMNONQyPIUFOUbCQ==", "deprecated": "You can find the new Popper v2 at @popperjs/core, this package is dedicated to the legacy v1", "license": "MIT", + "peer": true, "funding": { "type": "opencollective", "url": "https://opencollective.com/popperjs" @@ -21412,6 +21460,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", @@ -21461,6 +21510,7 @@ "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -21491,6 +21541,7 @@ "integrity": "sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew==", "dev": true, "license": "MIT", + "peer": true, "bin": { "prettier": "bin-prettier.js" }, @@ -21557,6 +21608,7 @@ "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", "license": "MIT", + "peer": true, "dependencies": { "loose-envify": "^1.4.0", "object-assign": "^4.1.1", @@ -21589,13 +21641,10 @@ "license": "MIT" }, "node_modules/proxy-from-env": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-2.1.0.tgz", - "integrity": "sha512-cJ+oHTW1VAEa8cJslgmUZrc+sjRKgAKl3Zyse6+PV38hZe/V6Z14TbCuXcan9F9ghlz4QrFr2c92TNF82UkYHA==", - "license": "MIT", - "engines": { - "node": ">=10" - } + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "license": "MIT" }, "node_modules/psl": { "version": "1.15.0", @@ -22354,6 +22403,7 @@ "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", "license": "MIT", + "peer": true, "dependencies": { "loose-envify": "^1.1.0" }, @@ -22497,6 +22547,7 @@ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", "license": "MIT", + "peer": true, "dependencies": { "loose-envify": "^1.1.0", "scheduler": "^0.23.2" @@ -22634,6 +22685,7 @@ "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-7.2.9.tgz", "integrity": "sha512-Gx4L3uM182jEEayZfRbI/G11ZpYdNAnBs70lFVMNdHJI76XYtR+7m0MN+eAs7UHBPhWXcnFPaS+9owSCJQHNpQ==", "license": "MIT", + "peer": true, "dependencies": { "@babel/runtime": "^7.15.4", "@types/react-redux": "^7.1.20", @@ -22695,6 +22747,7 @@ "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-5.3.4.tgz", "integrity": "sha512-m4EqFMHv/Ih4kpcBCONHbkT68KoAeHN4p3lAGoNryfHi0dMy0kCzEZakiKRsvg5wHZ/JLrLW8o8KomWiz/qbYQ==", "license": "MIT", + "peer": true, "dependencies": { "@babel/runtime": "^7.12.13", "history": "^4.9.0", @@ -22763,12 +22816,6 @@ "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, - "node_modules/react-select/node_modules/memoize-one": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-6.0.0.tgz", - "integrity": "sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==", - "license": "MIT" - }, "node_modules/react-simple-maps": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/react-simple-maps/-/react-simple-maps-3.0.0.tgz", @@ -22845,7 +22892,8 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-2.0.0.tgz", "integrity": "sha512-XoGGqhLUN/W14NmaqcO/bb1nqjDAw5WtSYb2X8wiuQWvSZUsUVYsOSkOybUrNvcBjaywBdYPy03eXHMXjk9nZA==", - "license": "BSD-3-Clause" + "license": "BSD-3-Clause", + "peer": true }, "node_modules/react-simple-maps/node_modules/d3-timer": { "version": "2.0.0", @@ -23306,6 +23354,7 @@ "resolved": "https://registry.npmjs.org/redux/-/redux-4.2.1.tgz", "integrity": "sha512-LAUYz4lc+Do8/g7aeRa8JkyDErK6ekstQaqWQrNRW//MY1TvCEpMtpTWvlQ+FPbWCx+Xixu/6SHt5N0HR+SB4w==", "license": "MIT", + "peer": true, "dependencies": { "@babel/runtime": "^7.9.2" } @@ -23837,6 +23886,7 @@ "integrity": "sha512-aFOZHGf+ur+bp1bCHZ+u8otKGh77ZtmFyXDo4tlYvT7PWql41Kwd8wdkPqhhT+h2879IVblcHFglIMofsFd1EA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "chokidar": "^4.0.0", "immutable": "^5.0.2", @@ -24713,20 +24763,20 @@ } }, "node_modules/styled-components": { - "version": "6.1.19", - "resolved": "https://registry.npmjs.org/styled-components/-/styled-components-6.1.19.tgz", - "integrity": "sha512-1v/e3Dl1BknC37cXMhwGomhO8AkYmN41CqyX9xhUDxry1ns3BFQy2lLDRQXJRdVVWB9OHemv/53xaStimvWyuA==", + "version": "6.3.12", + "resolved": "https://registry.npmjs.org/styled-components/-/styled-components-6.3.12.tgz", + "integrity": "sha512-hFR6xsVkVYbsdcUlzPYFvFfoc6o2KlV0VvgRIQwSYMtdThM7SCxnjX9efh/cWce2kTq16I/Kl3xM98xiLptsXA==", "license": "MIT", "dependencies": { - "@emotion/is-prop-valid": "1.2.2", - "@emotion/unitless": "0.8.1", - "@types/stylis": "4.2.5", + "@emotion/is-prop-valid": "1.4.0", + "@emotion/unitless": "0.10.0", + "@types/stylis": "4.2.7", "css-to-react-native": "3.2.0", - "csstype": "3.1.3", + "csstype": "3.2.3", "postcss": "8.4.49", "shallowequal": "1.1.0", - "stylis": "4.3.2", - "tslib": "2.6.2" + "stylis": "4.3.6", + "tslib": "2.8.1" }, "engines": { "node": ">= 16" @@ -24738,29 +24788,13 @@ "peerDependencies": { "react": ">= 16.8.0", "react-dom": ">= 16.8.0" + }, + "peerDependenciesMeta": { + "react-dom": { + "optional": true + } } }, - "node_modules/styled-components/node_modules/@emotion/is-prop-valid": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.2.2.tgz", - "integrity": "sha512-uNsoYd37AFmaCdXlg6EYD1KaPOaRWRByMCYzbKUX4+hhMfrxdVSelShywL4JVaAeM/eHUOSprYBQls+/neX3pw==", - "license": "MIT", - "dependencies": { - "@emotion/memoize": "^0.8.1" - } - }, - "node_modules/styled-components/node_modules/@emotion/memoize": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.1.tgz", - "integrity": "sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==", - "license": "MIT" - }, - "node_modules/styled-components/node_modules/@emotion/unitless": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.8.1.tgz", - "integrity": "sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ==", - "license": "MIT" - }, "node_modules/styled-components/node_modules/postcss": { "version": "8.4.49", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.49.tgz", @@ -24790,17 +24824,11 @@ } }, "node_modules/styled-components/node_modules/stylis": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.3.2.tgz", - "integrity": "sha512-bhtUjWd/z6ltJiQwg0dUfxEJ+W+jdqQd8TbWLWyeIJHlnsqmGLRFFd8e5mA0AZi/zx90smXRlN66YMTcaSFifg==", + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.3.6.tgz", + "integrity": "sha512-yQ3rwFWRfwNUY7H5vpU0wfdkNSnvnJinhF9830Swlaxl03zsOjCfmX0ugac+3LtK0lYSgwL/KXc8oYL3mG4YFQ==", "license": "MIT" }, - "node_modules/styled-components/node_modules/tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", - "license": "0BSD" - }, "node_modules/stylelint": { "version": "16.25.0", "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-16.25.0.tgz", @@ -25184,9 +25212,9 @@ } }, "node_modules/tapable": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.3.tgz", - "integrity": "sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.2.tgz", + "integrity": "sha512-1MOpMXuhGzGL5TTCZFItxCc0AARf1EZFQkGqMm7ERKj8+Hgr5oLvJOVFcC+lRmR8hCe2S3jC4T5D7Vg/d7/fhA==", "license": "MIT", "engines": { "node": ">=6" @@ -25215,9 +25243,9 @@ } }, "node_modules/terser-webpack-plugin": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.5.0.tgz", - "integrity": "sha512-UYhptBwhWvfIjKd/UuFo6D8uq9xpGLDK+z8EDsj/zWhrTaH34cKEbrkMKfV5YWqGBvAYA3tlzZbs2R+qYrbQJA==", + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.4.0.tgz", + "integrity": "sha512-Bn5vxm48flOIfkdl5CaD2+1CiUVbonWQ3KQPyP7/EuIl9Gbzq/gQFOzaMFUEgVjB1396tcK0SG8XcNJ/2kDH8g==", "license": "MIT", "dependencies": { "@jridgewell/trace-mapping": "^0.3.25", @@ -25354,14 +25382,14 @@ "license": "MIT" }, "node_modules/tinyglobby": { - "version": "0.2.16", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.16.tgz", - "integrity": "sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==", + "version": "0.2.15", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", "dev": true, "license": "MIT", "dependencies": { "fdir": "^6.5.0", - "picomatch": "^4.0.4" + "picomatch": "^4.0.3" }, "engines": { "node": ">=12.0.0" @@ -25389,11 +25417,12 @@ } }, "node_modules/tinyglobby/node_modules/picomatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", - "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=12" }, @@ -25405,7 +25434,8 @@ "version": "7.9.1", "resolved": "https://registry.npmjs.org/tinymce/-/tinymce-7.9.1.tgz", "integrity": "sha512-zaOHwmiP1EqTeLRXAvVriDb00JYnfEjWGPdKEuac7MiZJ5aiDMZ4Unc98Gmajn+PBljOmO1GKV6G0KwWn3+k8A==", - "license": "GPL-2.0-or-later" + "license": "GPL-2.0-or-later", + "peer": true }, "node_modules/tinypool": { "version": "1.1.1", @@ -25750,6 +25780,7 @@ "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", "dev": true, "license": "Apache-2.0", + "peer": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -26105,6 +26136,7 @@ "integrity": "sha512-cZn6NDFE7wdTpINgs++ZJ4N49W2vRp8LCKrn3Ob1kYNtOo21vfDoaV5GzBfLU4MovSAB8uNRm4jgzVQZ+mBzPQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "esbuild": "^0.25.0", "fdir": "^6.4.4", @@ -26221,6 +26253,7 @@ "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=12" }, @@ -26234,6 +26267,7 @@ "integrity": "sha512-fyNn/Rp016Bt5qvY0OQvIUCwW2vnaEBLxP42PmKbNIoasSYjML+8xyeADOPvBe+Xfl/ubIw4og7Lt9jflRsCNw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@types/chai": "^5.2.2", "@vitest/expect": "3.2.2", @@ -26369,10 +26403,11 @@ } }, "node_modules/webpack": { - "version": "5.106.2", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.106.2.tgz", - "integrity": "sha512-wGN3qcrBQIFmQ/c0AiOAQBvrZ5lmY8vbbMv4Mxfgzqd/B6+9pXtLo73WuS1dSGXM5QYY3hZnIbvx+K1xxe6FyA==", + "version": "5.105.4", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.105.4.tgz", + "integrity": "sha512-jTywjboN9aHxFlToqb0K0Zs9SbBoW4zRUlGzI2tYNxVYcEi/IPpn+Xi4ye5jTLvX2YeLuic/IvxNot+Q1jMoOw==", "license": "MIT", + "peer": true, "dependencies": { "@types/eslint-scope": "^3.7.7", "@types/estree": "^1.0.8", @@ -26390,8 +26425,9 @@ "events": "^3.2.0", "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.2.11", + "json-parse-even-better-errors": "^2.3.1", "loader-runner": "^4.3.1", - "mime-db": "^1.54.0", + "mime-types": "^2.1.27", "neo-async": "^2.6.2", "schema-utils": "^4.3.3", "tapable": "^2.3.0", @@ -26416,9 +26452,9 @@ } }, "node_modules/webpack-sources": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.4.0.tgz", - "integrity": "sha512-gHwIe1cgBvvfLeu1Yz/dcFpmHfKDVxxyqI+kzqmuxZED81z2ChxpyqPaWcNqigPywhaEke7AjSGga+kxY55gjQ==", + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.3.4.tgz", + "integrity": "sha512-7tP1PdV4vF+lYPnkMR0jMY5/la2ub5Fc/8VQrrU+lXkiM6C4TjVfGw7iKfyhnTQOsD+6Q/iKw0eFciziRgD58Q==", "license": "MIT", "engines": { "node": ">=10.13.0" @@ -26430,15 +26466,6 @@ "integrity": "sha512-5POEcUuZybH7IdmGsD8wlf0AI55wMecM9rVBTI/qEAy2c1kTOm3DjFYjrBdI2K3BaJjJYfYFeRtM0t9ssnRuxw==", "license": "MIT" }, - "node_modules/webpack/node_modules/mime-db": { - "version": "1.54.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", - "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, "node_modules/whatwg-encoding": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz", @@ -26850,9 +26877,9 @@ "license": "ISC" }, "node_modules/yaml": { - "version": "2.8.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.2.tgz", - "integrity": "sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A==", + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.1.tgz", + "integrity": "sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw==", "dev": true, "license": "ISC", "bin": { @@ -26860,9 +26887,6 @@ }, "engines": { "node": ">= 14.6" - }, - "funding": { - "url": "https://github.com/sponsors/eemeli" } }, "node_modules/yargs": { diff --git a/src/App.module.css b/src/App.module.css index 87e3fe6107..67f21ff449 100644 --- a/src/App.module.css +++ b/src/App.module.css @@ -1,3 +1,4 @@ +/* stylelint-disable no-descending-specificity */ html { overflow-x: hidden; height: 100%; @@ -16,6 +17,7 @@ button { #root { height: 100%; + overflow: auto hidden; /* background-color: var(--background-color); */ overflow: auto; @@ -55,6 +57,7 @@ button { } .accordion-toggle.collapsed::after { + /* symbol for down chevron */ content: '\f078'; } @@ -64,22 +67,29 @@ button { } .hgn-leaderboard { + /* background-color:#FFCCBC */ background-color: black; } .bg-super { + /* medium blue #0000CD */ background-color: #00d !important; } .bg-awesome { background-color: #909 !important; + + /* violet */ } .bg-super-awesome { background-color: #609 !important; + + /* purple */ } .bg-orange { + /* brighter orange */ background-color: #fa5 !important; } @@ -89,10 +99,14 @@ button { .bg-bright-red { background-color: #f30 !important; + + /* bright-red */ } .bg-almost-red { background-color: #c36 !important; + + /* 90%to100%-red */ } .bg-oxford-blue { @@ -144,6 +158,7 @@ button { } .text-custom-grey { + color: rgb(192 192 192) !important; color: #c0c0c0 !important; } diff --git a/src/actions/ToastStyles.module.css b/src/actions/ToastStyles.module.css index fdd8868104..c67a5eb8d3 100644 --- a/src/actions/ToastStyles.module.css +++ b/src/actions/ToastStyles.module.css @@ -1,3 +1,4 @@ +/* stylelint-disable */ /* Toast content container */ .toastContent { font-size: 1rem; diff --git a/src/assets/images/BlueskyIcon.svg b/src/assets/images/BlueskyIcon.svg new file mode 100644 index 0000000000..c71e2018a6 --- /dev/null +++ b/src/assets/images/BlueskyIcon.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/components/ActualCostBreakdown/ActualCostBreakdown.module.css b/src/components/ActualCostBreakdown/ActualCostBreakdown.module.css index b7a4157740..800abea63e 100644 --- a/src/components/ActualCostBreakdown/ActualCostBreakdown.module.css +++ b/src/components/ActualCostBreakdown/ActualCostBreakdown.module.css @@ -1,3 +1,4 @@ +/* stylelint-disable */ .actual-cost-breakdown { padding: 20px 30px; background: transparent; @@ -114,7 +115,7 @@ .custom-dropdown-trigger:focus { outline: none; border-color: #4A90E2; - box-shadow: 0 0 0 3px rgba(74, 144, 226, 0.1); + box-shadow: 0 0 0 3px rgb(74 144 226 / 10%); } .custom-dropdown-trigger .selected-value { @@ -153,11 +154,10 @@ background: #fff; border: 1.5px solid #e0e0e0; border-radius: 6px; - box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15); + box-shadow: 0 4px 12px rgb(0 0 0 / 15%); z-index: 100; max-height: 300px; - overflow-y: auto; - overflow-x: hidden; + overflow: hidden auto; } .custom-dropdown-menu::-webkit-scrollbar { @@ -226,7 +226,7 @@ .form-control:focus { outline: none; border-color: #4A90E2; - box-shadow: 0 0 0 3px rgba(74, 144, 226, 0.1); + box-shadow: 0 0 0 3px rgb(74 144 226 / 10%); } .filter-select { @@ -445,22 +445,22 @@ /* Custom tooltip */ .custom-tooltip { - background: rgba(0, 0, 0, 0.85); + background: rgb(0 0 0 / 85%); color: #fff; padding: 12px 16px; border-radius: 6px; - box-shadow: 0 4px 12px rgba(0, 0, 0, 0.2); + box-shadow: 0 4px 12px rgb(0 0 0 / 20%); } .tooltip-label { font-weight: 600; - margin: 0 0 6px 0; + margin: 0 0 6px; font-size: 14px; color: #fff; } .tooltip-value { - margin: 0 0 4px 0; + margin: 0 0 4px; font-size: 13px; color: #fff; } @@ -473,13 +473,13 @@ } /* Responsive design */ -@media (max-width: 1024px) { +@media (width <= 1024px) { .chart-area { min-height: 500px; } } -@media (max-width: 768px) { +@media (width <= 768px) { .actual-cost-breakdown { padding: 20px; } @@ -519,7 +519,7 @@ } } -@media (max-width: 480px) { +@media (width <= 480px) { .actual-cost-breakdown { padding: 15px; margin: 10px 0; diff --git a/src/components/Announcements/Announcements.module.css b/src/components/Announcements/Announcements.module.css index 93e9749301..f25ec807c5 100644 --- a/src/components/Announcements/Announcements.module.css +++ b/src/components/Announcements/Announcements.module.css @@ -1,3 +1,5 @@ +/* stylelint-disable no-descending-specificity */ + /* Announcements.module.css */ :global(h2), @@ -61,15 +63,32 @@ button.sendButton:hover { box-sizing: border-box; /* Ensures padding is included in width */ } +.emailUpdateContainerDark { + background: #14233a; + color: #e2e8f0; +} + .editor { flex: 1; + /* Editor takes up remaining space */ margin-right: 20px; + /* Add some spacing between editor and email inputs */ } +.editorDark { + background: #14233a; + color: #e2e8f0; +} + +.editorDark :global(h3) { + color: #e2e8f0; +} + .editor :global(h2) { margin-top: 0; + /* Remove top margin for the heading */ } @@ -84,11 +103,13 @@ button.sendButton:hover { border-radius: 20px; width: 300px; box-sizing: border-box; /* Ensures padding is included in width */ + /* Set a fixed width for the email inputs container */ } .emails :global(h3) { margin-top: 0; + /* Remove top margin for the email input headings */ } @@ -113,15 +134,16 @@ button.sendButton:hover { } /* Responsive design: Adjusts the preview section on smaller screens. */ -@media (max-width: 768px) { +@media (width <= 768px) { .emailContentPreview { margin-top: 10px; + /* Reduce margin top on smaller screens */ } } /* Responsive design: Adjust the layout for smaller screens */ -@media (max-width: 800px) { +@media (width <= 800px) { .emailUpdateContainer { display: flex; flex-direction: column; @@ -180,7 +202,6 @@ button.sendButton:hover { border-top-left-radius: 10px; border-top-right-radius: 10px; margin-right: 4px; - cursor: pointer; transition: all 0.2s ease; display: flex; @@ -240,8 +261,7 @@ button.sendButton:hover { .tabGrid { display: grid !important; gap: 8px; - overflow-x: auto; - overflow-y: hidden; + overflow: auto hidden; scroll-behavior: smooth; scrollbar-width: thin; scrollbar-color: #888 #f1f1f1; @@ -270,12 +290,12 @@ button.sendButton:hover { } .tabGrid.dark > .navItem .tabNavItem { - box-shadow: -2px 0 6px rgba(0, 0, 0, 0.25), 2px 0 6px rgba(0, 0, 0, 0.25); + box-shadow: -2px 0 6px rgb(0 0 0 / 25%), 2px 0 6px rgb(0 0 0 / 25%); } .tabGrid.dark > .navItem:nth-child(-n + 12) .tabNavItem { - box-shadow: -2px 0 6px rgba(0, 0, 0, 0.25), 2px 0 6px rgba(0, 0, 0, 0.25), - 0 6px 6px rgba(0, 0, 0, 0.35); + box-shadow: -2px 0 6px rgb(0 0 0 / 25%), 2px 0 6px rgb(0 0 0 / 25%), + 0 6px 6px rgb(0 0 0 / 35%); } .tabGrid.dark::-webkit-scrollbar-track { @@ -348,7 +368,7 @@ button.sendButton:hover { color: #ddd; } -.tabGrid.twoRows > .navItem:nth-child(n + calc(var(--cols, 12) + 1)) { +.tabGrid.twoRows > .navItem:nth-child(n + 14) { margin-top: -12px; transform: translateY(8px); z-index: 0; @@ -358,16 +378,16 @@ button.sendButton:hover { filter: brightness(1.05); } -@media (max-width: 1024px) { +@media (width <= 1024px) { .tabGrid { grid-template-columns: repeat(auto-fit, minmax(110px, 1fr)); - grid-template-columns: repeat(auto, minmax(110px, 120px)); + grid-template-columns: repeat(auto-fill, minmax(110px, 120px)); } } -@media (max-width: 700px) { +@media (width <= 700px) { .tabGrid { - grid-template-columns: repeat(auto, minmax(95px, 100px)); + grid-template-columns: repeat(auto-fill, minmax(95px, 100px)); } .tabGrid .navLink.tabNavItem { @@ -375,7 +395,7 @@ button.sendButton:hover { } } -@media (max-width: 460px) { +@media (width <= 460px) { .tabLabel { display: none; } @@ -386,7 +406,7 @@ button.sendButton:hover { } .tabGrid { - grid-template-columns: repeat(auto, minmax(70px, 80px)); + grid-template-columns: repeat(auto-fill, minmax(70px, 80px)); } .tabGrid > .navItem { @@ -402,72 +422,95 @@ button.sendButton:hover { .tabGrid > .navItem:nth-child(1) { z-index: 12; } + .tabGrid > .navItem:nth-child(2) { z-index: 11; } + .tabGrid > .navItem:nth-child(3) { z-index: 10; } + .tabGrid > .navItem:nth-child(4) { z-index: 9; } + .tabGrid > .navItem:nth-child(5) { z-index: 8; } + .tabGrid > .navItem:nth-child(6) { z-index: 7; } + .tabGrid > .navItem:nth-child(7) { z-index: 6; } + .tabGrid > .navItem:nth-child(8) { z-index: 5; } + .tabGrid > .navItem:nth-child(9) { z-index: 4; } + .tabGrid > .navItem:nth-child(10) { z-index: 3; } + .tabGrid > .navItem:nth-child(11) { z-index: 2; } + .tabGrid > .navItem:nth-child(12) { z-index: 1; } + .tabGrid > .navItem:nth-child(13) { z-index: 24; } + .tabGrid > .navItem:nth-child(14) { z-index: 23; } + .tabGrid > .navItem:nth-child(15) { z-index: 22; } + .tabGrid > .navItem:nth-child(16) { z-index: 21; } + .tabGrid > .navItem:nth-child(17) { z-index: 20; } + .tabGrid > .navItem:nth-child(18) { z-index: 19; } + .tabGrid > .navItem:nth-child(19) { z-index: 18; } + .tabGrid > .navItem:nth-child(20) { z-index: 17; } + .tabGrid > .navItem:nth-child(21) { z-index: 16; } + .tabGrid > .navItem:nth-child(22) { z-index: 15; } + .tabGrid > .navItem:nth-child(23) { z-index: 14; } + .tabGrid > .navItem:nth-child(24) { z-index: 13; } @@ -480,10 +523,10 @@ button.sendButton:hover { .tabGrid > .navItem .tabNavItem { /* left + right only */ - box-shadow: -2px 0 6px rgba(0, 0, 0, 0.12), 2px 0 6px rgba(0, 0, 0, 0.12); + box-shadow: -2px 0 6px rgb(0 0 0 / 12%), 2px 0 6px rgb(0 0 0 / 12%); } .tabGrid > .navItem:nth-child(-n + 12) .tabNavItem { - box-shadow: -2px 0 6px rgba(0, 0, 0, 0.12), 2px 0 6px rgba(0, 0, 0, 0.12), - 0 6px 6px rgba(0, 0, 0, 0.2); + box-shadow: -2px 0 6px rgb(0 0 0 / 12%), 2px 0 6px rgb(0 0 0 / 12%), + 0 6px 6px rgb(0 0 0 / 20%); } diff --git a/src/components/Announcements/BlueskyPostDetails.jsx b/src/components/Announcements/BlueskyPostDetails.jsx new file mode 100644 index 0000000000..e836164d42 --- /dev/null +++ b/src/components/Announcements/BlueskyPostDetails.jsx @@ -0,0 +1,850 @@ +import { useEffect, useRef, useState } from 'react'; +import { Alert, Button, Card, Container, Form, Modal, Spinner } from 'react-bootstrap'; +import PropTypes from 'prop-types'; +import { useSelector } from 'react-redux'; +import styles from './BlueskyPostDetails.module.css'; + +const API_BASE_URL = 'http://localhost:4500/api/bluesky'; +const SUCCESS_PREFIX = '[OK]'; +const ERROR_PREFIX = '[ERROR]'; +const INFO_PREFIX = '[INFO]'; + +function formatDate(dateString) { + const date = new Date(dateString); + const now = new Date(); + const diffInMinutes = Math.floor((now - date) / (1000 * 60)); + const showYear = date.getFullYear() !== now.getFullYear(); + + if (diffInMinutes < 1) return 'Just now'; + if (diffInMinutes < 60) return `${diffInMinutes}m ago`; + + const diffInHours = Math.floor(diffInMinutes / 60); + if (diffInHours < 24) return `${diffInHours}h ago`; + + const diffInDays = Math.floor(diffInHours / 24); + if (diffInDays < 7) return `${diffInDays}d ago`; + + return date.toLocaleDateString('en-US', { + month: 'short', + day: 'numeric', + year: showYear ? 'numeric' : undefined, + }); +} + +function getStatusVariant(status) { + if (status.includes(SUCCESS_PREFIX)) return 'success'; + if (status.includes(ERROR_PREFIX)) return 'danger'; + return 'info'; +} + +const CHAR_LIMIT = 300; + +function ConnectionCard({ handle, appPassword, onHandleChange, onPasswordChange, onConnect }) { + return ( + +
+ + Connect to Bluesky +
+
+
+ + Handle + + + + App Password + + + + Create an App Password at bsky.app/settings/app-passwords + + + + +
+
+
+ ); +} + +ConnectionCard.propTypes = { + handle: PropTypes.string.isRequired, + appPassword: PropTypes.string.isRequired, + onHandleChange: PropTypes.func.isRequired, + onPasswordChange: PropTypes.func.isRequired, + onConnect: PropTypes.func.isRequired, +}; + +function UploadDropZone({ + dropZoneRef, + fileInputRef, + darkMode, + isDragging, + onDragEnter, + onDragOver, + onDragLeave, + onDrop, + onFileChange, +}) { + return ( + + ); +} + +UploadDropZone.propTypes = { + dropZoneRef: PropTypes.shape({ current: PropTypes.any }), + fileInputRef: PropTypes.shape({ current: PropTypes.any }), + darkMode: PropTypes.bool.isRequired, + isDragging: PropTypes.bool.isRequired, + onDragEnter: PropTypes.func.isRequired, + onDragOver: PropTypes.func.isRequired, + onDragLeave: PropTypes.func.isRequired, + onDrop: PropTypes.func.isRequired, + onFileChange: PropTypes.func.isRequired, +}; + +function MediaDisplay({ media }) { + if (!Array.isArray(media) || media.length === 0) { + return null; + } + + return ( +
+ {media.map(item => { + const mediaKey = item.url || item.thumb; + + if (item.type === 'image') { + return ( +
+ +
+ ); + } + + if (item.type === 'video') { + return ( +
+ + {item.title && {item.title}} +
+ ); + } + + if (item.type === 'gif') { + return ( +
+
+ + {item.thumb && ( +
+ GIF +
+ )} +
+ {item.title && {item.title}} +
+ ); + } + + return null; + })} +
+ ); +} + +MediaDisplay.propTypes = { + media: PropTypes.arrayOf( + PropTypes.shape({ + type: PropTypes.string.isRequired, + url: PropTypes.string, + thumb: PropTypes.string, + alt: PropTypes.string, + title: PropTypes.string, + }), + ), +}; + +function PostsCard({ posts, isLoading, deletingPost, onRefresh, onViewPost, onDeletePost }) { + return ( + +
+
+ Your Posts + {posts.length > 0 && {posts.length}} +
+ +
+
+ {posts.length > 0 ? ( + posts.map(post => ( +
+
+ 🦋 +
+
+

{post.text}

+ +
+ + ❤️ {post.likeCount ?? 0} + + + 🔁 {post.repostCount ?? 0} + + {formatDate(post.createdAt)} +
+ + +
+
+
+
+ )) + ) : ( +
+ 🦋 +

+ {isLoading ? 'Loading posts…' : 'No posts yet. Create your first post!'} +

+
+ )} +
+
+ ); +} + +PostsCard.propTypes = { + posts: PropTypes.arrayOf(PropTypes.object).isRequired, + isLoading: PropTypes.bool.isRequired, + deletingPost: PropTypes.string, + onRefresh: PropTypes.func.isRequired, + onViewPost: PropTypes.func.isRequired, + onDeletePost: PropTypes.func.isRequired, +}; + +function BlueskyPostDetails() { + const darkMode = useSelector(state => state.theme.darkMode); + const [handle, setHandle] = useState(''); + const [appPassword, setAppPassword] = useState(''); + const [isConnected, setIsConnected] = useState(false); + const [postText, setPostText] = useState(''); + const [selectedImage, setSelectedImage] = useState(null); + const [imagePreview, setImagePreview] = useState(null); + const [status, setStatus] = useState(''); + const [posts, setPosts] = useState([]); + const [isLoading, setIsLoading] = useState(false); + const [deletingPost, setDeletingPost] = useState(null); + const [showDeleteModal, setShowDeleteModal] = useState(false); + const [postToDelete, setPostToDelete] = useState(null); + const [isDragging, setIsDragging] = useState(false); + const dropZoneRef = useRef(null); + const fileInputRef = useRef(null); + + const clearImage = () => { + setSelectedImage(null); + setImagePreview(null); + if (fileInputRef.current) { + fileInputRef.current.value = ''; + } + }; + + const checkSession = async () => { + try { + const response = await fetch(`${API_BASE_URL}/session`, { + credentials: 'include', + }); + const result = await response.json(); + + if (result.success && result.isConnected) { + setIsConnected(true); + setHandle(result.handle || ''); + setStatus(currentStatus => + currentStatus === '' ? `${SUCCESS_PREFIX} Connected to Bluesky` : currentStatus, + ); + return; + } + + setIsConnected(false); + setStatus(currentStatus => + currentStatus.includes(SUCCESS_PREFIX) + ? `${ERROR_PREFIX} Session expired. Please reconnect.` + : currentStatus, + ); + } catch (error) { + setIsConnected(false); + const errorMessage = + error instanceof Error && error.message + ? error.message + : 'Unable to verify the current Bluesky session.'; + setStatus(`${ERROR_PREFIX} ${errorMessage}`); + } + }; + + useEffect(() => { + checkSession(); + const intervalId = setInterval(checkSession, 5 * 60 * 1000); + return () => clearInterval(intervalId); + }, []); + + useEffect(() => { + if (isConnected) { + const loadPosts = async () => { + await getPosts(); + }; + loadPosts(); + return; + } + + setPosts([]); + }, [isConnected]); + + const handleImageFile = file => { + if (!file.type.startsWith('image/')) { + setStatus(`${ERROR_PREFIX} Only image files are allowed`); + return; + } + + const isGif = file.type === 'image/gif'; + const maxSize = isGif ? 5000000 : 1000000; + if (file.size > maxSize) { + setStatus( + `${ERROR_PREFIX} ${isGif ? 'GIF' : 'Image'} size must be less than ${ + isGif ? '5MB' : '1MB' + }`, + ); + return; + } + + setSelectedImage(file); + const reader = new FileReader(); + reader.onloadend = () => { + const result = reader.result; + if (typeof result === 'string') { + setImagePreview(result); + return; + } + + setStatus(`${ERROR_PREFIX} Unable to preview the selected image.`); + clearImage(); + }; + reader.readAsDataURL(file); + }; + + const handleDragEnter = event => { + event.preventDefault(); + event.stopPropagation(); + setIsDragging(true); + }; + + const handleDragLeave = event => { + event.preventDefault(); + event.stopPropagation(); + setIsDragging(false); + }; + + const handleDragOver = event => { + event.preventDefault(); + event.stopPropagation(); + }; + + const handleDrop = event => { + event.preventDefault(); + event.stopPropagation(); + setIsDragging(false); + + const [file] = event.dataTransfer.files || []; + if (file) { + handleImageFile(file); + } + }; + + const handleImageSelect = event => { + const [file] = event.target.files || []; + if (file) { + handleImageFile(file); + } + }; + + const connectToBluesky = async () => { + if (handle === '' || appPassword === '') { + setStatus(`${ERROR_PREFIX} Handle and password are required`); + return; + } + + try { + setStatus(`${INFO_PREFIX} Connecting...`); + const response = await fetch(`${API_BASE_URL}/connect`, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + credentials: 'include', + body: JSON.stringify({ + handle, + password: appPassword, + }), + }); + const result = await response.json(); + + if (!response.ok) { + throw new Error(result.error || `HTTP error! status: ${response.status}`); + } + + if (result.success) { + setIsConnected(true); + setStatus(`${SUCCESS_PREFIX} Connected to Bluesky! DID: ${result.did}`); + return; + } + + setStatus(result.error || `${ERROR_PREFIX} Failed to connect`); + } catch (error) { + setStatus(error.message); + } + }; + + const disconnectFromBluesky = async () => { + try { + setStatus(`${INFO_PREFIX} Disconnecting...`); + const response = await fetch(`${API_BASE_URL}/disconnect`, { + method: 'POST', + credentials: 'include', + }); + const result = await response.json(); + + if (!response.ok) { + throw new Error(result.error || `HTTP error! status: ${response.status}`); + } + + setIsConnected(false); + setHandle(''); + setAppPassword(''); + setPostText(''); + clearImage(); + setStatus(`${SUCCESS_PREFIX} Disconnected from Bluesky`); + } catch (error) { + setStatus(error.message); + } + }; + + const getPosts = async () => { + setIsLoading(true); + try { + const response = await fetch(`${API_BASE_URL}/posts`, { + credentials: 'include', + }); + const result = await response.json(); + + if (!response.ok) { + throw new Error(result.error || `HTTP error! status: ${response.status}`); + } + + if (result.success) { + setPosts(result.posts); + setStatus( + result.posts.length > 0 + ? `${SUCCESS_PREFIX} Posts loaded!` + : `${INFO_PREFIX} No posts found`, + ); + return; + } + + setStatus(result.error || `${ERROR_PREFIX} Failed to load posts`); + } catch (error) { + setStatus(error.message); + if (error.message.includes('401') || error.message.includes('Unauthorized')) { + setIsConnected(false); + setStatus(`${ERROR_PREFIX} Session expired. Please reconnect.`); + } + } finally { + setIsLoading(false); + } + }; + + const createPost = async () => { + if (!isConnected) { + setStatus(`${ERROR_PREFIX} Please connect to Bluesky first`); + return; + } + + const trimmedText = postText.trim(); + if (trimmedText === '' && !selectedImage) { + setStatus(`${ERROR_PREFIX} Please provide text or an image for the post`); + return; + } + + try { + setStatus(`${INFO_PREFIX} Creating post...`); + const formData = new FormData(); + formData.append('text', trimmedText); + if (selectedImage) { + formData.append('image', selectedImage); + } + + const response = await fetch(`${API_BASE_URL}/post`, { + method: 'POST', + credentials: 'include', + body: formData, + }); + const result = await response.json(); + + if (!result.success) { + throw new Error(result.error || 'Failed to create post'); + } + + setStatus(`${SUCCESS_PREFIX} Posted successfully!`); + setPostText(''); + clearImage(); + await getPosts(); + } catch (error) { + setStatus(error.message); + if (error.message.includes('401') || error.message.includes('Unauthorized')) { + setIsConnected(false); + setStatus(`${ERROR_PREFIX} Session expired. Please reconnect.`); + } + } + }; + + const handleDelete = uri => { + setPostToDelete(uri); + setShowDeleteModal(true); + }; + + const confirmDelete = async () => { + if (postToDelete === null) { + return; + } + + try { + setShowDeleteModal(false); + setDeletingPost(postToDelete); + setStatus(`${INFO_PREFIX} Deleting post...`); + const response = await fetch(`${API_BASE_URL}/post/${encodeURIComponent(postToDelete)}`, { + method: 'DELETE', + credentials: 'include', + }); + const result = await response.json(); + + if (!response.ok) { + throw new Error(result.error || `HTTP error! status: ${response.status}`); + } + + if (result.success) { + setStatus(`${SUCCESS_PREFIX} Post deleted successfully!`); + setPosts(currentPosts => currentPosts.filter(post => post.uri !== postToDelete)); + return; + } + + setStatus(result.error || `${ERROR_PREFIX} Failed to delete post`); + } catch (error) { + setStatus(error.message); + if (error.message.includes('401') || error.message.includes('Unauthorized')) { + setIsConnected(false); + setStatus(`${ERROR_PREFIX} Session expired. Please reconnect.`); + } + } finally { + setDeletingPost(null); + setPostToDelete(null); + } + }; + + const cancelDelete = () => { + setShowDeleteModal(false); + setPostToDelete(null); + }; + + const viewPost = uri => { + if (typeof uri !== 'string' || !uri.startsWith('at://')) { + setStatus(`${ERROR_PREFIX} Invalid URI`); + return; + } + + const rkey = uri.split('/').at(-1); + const didMatch = /at:\/\/(did:[^/]+)/.exec(uri); + if (didMatch === null || rkey === undefined) { + setStatus(`${ERROR_PREFIX} Invalid Bluesky post identifier`); + return; + } + + const did = didMatch[1]; + const url = `https://bsky.app/profile/${did}/post/${rkey}`; + window.open(url, '_blank', 'noopener,noreferrer'); + }; + + const charsLeft = CHAR_LIMIT - postText.length; + const charsPercent = Math.min((postText.length / CHAR_LIMIT) * 100, 100); + const getCharColor = remainingChars => { + if (remainingChars < 0) return '#e53e3e'; + if (remainingChars <= 20) return '#ed8936'; + return '#0085ff'; + }; + const charColor = getCharColor(charsLeft); + const canPost = + isConnected && (postText.trim() !== '' || selectedImage !== null) && charsLeft >= 0; + + return ( + + {/* Status alert — shown at top */} + {status !== '' && ( + setStatus('')} + > + {status.replace(/^\[(OK|ERROR|INFO)\]\s*/, '')} + + )} + + {isConnected ? ( + <> + {/* Connected header bar */} +
+
+ + @{handle} +
+ +
+ + {/* Composer card */} + +
+
Create a Post
+ setPostText(event.target.value)} + placeholder="What's on your mind?" + className={styles['composer-textarea']} + maxLength={CHAR_LIMIT + 50} + /> + {/* Character counter */} +
+
+
+
+ + {charsLeft < 0 ? `${Math.abs(charsLeft)} over limit` : `${charsLeft} remaining`} + +
+ + + + {imagePreview && ( +
+ Preview + +
+ )} + +
+ +
+
+ + + + + ) : ( + setHandle(event.target.value)} + onPasswordChange={event => setAppPassword(event.target.value)} + onConnect={connectToBluesky} + /> + )} + + + + Delete Post + + + Are you sure you want to delete this post? This action cannot be undone. + + + + + + + + ); +} + +export default BlueskyPostDetails; diff --git a/src/components/Announcements/BlueskyPostDetails.module.css b/src/components/Announcements/BlueskyPostDetails.module.css new file mode 100644 index 0000000000..85d7ca6e26 --- /dev/null +++ b/src/components/Announcements/BlueskyPostDetails.module.css @@ -0,0 +1,579 @@ +/* stylelint-disable */ +/* BlueskyPostDetails.module.css */ + +/* ── Container ─────────────────────────────────────────── */ +.bluesky-post-details { + max-width: 680px; + margin: 24px auto; + padding: 0 16px 40px; + font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; +} + +.dark { + color: #e2e8f0; +} + +/* ── Status alert ───────────────────────────────────────── */ +.status-alert { + border-radius: 10px; + font-size: 14px; +} + +/* ── Connected header bar ───────────────────────────────── */ +.connected-bar { + display: flex; + align-items: center; + justify-content: space-between; + background: #f0f7ff; + border: 1px solid #bdd8ff; + border-radius: 12px; + padding: 10px 16px; + margin-bottom: 20px; +} + +.connected-badge { + display: flex; + align-items: center; + gap: 8px; + font-size: 14px; + font-weight: 600; + color: #05c; +} + +.connected-dot { + width: 10px; + height: 10px; + background: #38a169; + border-radius: 50%; + display: inline-block; + box-shadow: 0 0 0 3px rgb(56 161 105 / 25%); +} + +.disconnect-btn { + background: transparent; + border: 1px solid #e53e3e; + color: #e53e3e; + border-radius: 8px; + padding: 5px 14px; + font-size: 13px; + font-weight: 600; + cursor: pointer; + transition: all 0.15s ease; +} + +.disconnect-btn:hover { + background: #e53e3e; + color: #fff; +} + +/* ── Connection card ────────────────────────────────────── */ +.connection-card { + border-radius: 14px; + box-shadow: 0 4px 20px rgb(0 0 0 / 8%); + overflow: hidden; +} + +.dark .connection-card, +.dark .composer-card, +.dark .posts-card { + background: #13253a; + border: 1px solid #2f435d; + box-shadow: 0 3px 14px rgb(0 0 0 / 30%); +} + +.brand-header { + display: flex; + align-items: center; + gap: 12px; + padding: 20px 24px; + background: linear-gradient(135deg, #0085ff 0%, #00b4ff 100%); + color: #fff; + font-size: 20px; + font-weight: 700; +} + +.form-label { + font-weight: 600; + font-size: 13px; + color: #4a5568; + margin-bottom: 6px; +} + +.dark .form-label, +.dark .section-title, +.dark .post-text { + color: #e2e8f0; +} + +.form-input { + border-radius: 8px; + border: 1.5px solid #e2e8f0; + padding: 10px 14px; + font-size: 15px; + transition: border-color 0.2s ease; +} + +.dark .form-input, +.dark .composer-textarea { + background: #1a2a3d; + border-color: #3b516b; + color: #f7fafc; +} + +.dark .form-input::placeholder, +.dark .composer-textarea::placeholder { + color: #9fb3c8; +} + +.form-input:focus { + border-color: #0085ff; + box-shadow: 0 0 0 3px rgb(0 133 255 / 15%); +} + +.hint-link { + font-size: 12px; + color: #0085ff; + text-decoration: none; +} + +.hint-link:hover { + text-decoration: underline; +} + +/* ── Primary Bluesky button ─────────────────────────────── */ +.bluesky-btn-primary { + background: #0085ff; + color: #fff; + border: none; + border-radius: 24px; + padding: 10px 28px; + font-weight: 700; + font-size: 15px; + cursor: pointer; + transition: background 0.2s ease, transform 0.1s ease; +} + +.bluesky-btn-primary:disabled { + background: #a0c4e8; + cursor: not-allowed; + transform: none; +} + +.bluesky-btn-primary:hover:not(:disabled) { + background: #006acc; + transform: translateY(-1px); +} + +/* ── Composer card ──────────────────────────────────────── */ +.composer-card { + border-radius: 14px; + box-shadow: 0 2px 12px rgb(0 0 0 / 6%); +} + +.section-title { + font-size: 16px; + font-weight: 700; + color: #2d3748; + margin-bottom: 12px; +} + +.composer-textarea { + width: 100%; + border-radius: 10px; + border: 1.5px solid #e2e8f0; + padding: 12px 14px; + font-size: 15px; + resize: vertical; + transition: border-color 0.2s ease; + line-height: 1.6; +} + +.composer-textarea:focus { + border-color: #0085ff; + box-shadow: 0 0 0 3px rgb(0 133 255 / 15%); + outline: none; +} + +/* ── Character counter ──────────────────────────────────── */ +.char-counter { + display: flex; + align-items: center; + justify-content: space-between; + margin: 6px 0 16px; + gap: 12px; +} + +.char-bar-track { + flex: 1; + height: 4px; + background: #e2e8f0; + border-radius: 2px; + overflow: hidden; +} + +.char-bar-fill { + height: 100%; + border-radius: 2px; + transition: width 0.15s ease, background 0.15s ease; +} + +.char-counter span { + font-size: 12px; + white-space: nowrap; + min-width: 100px; + text-align: right; +} + +/* ── Image preview ──────────────────────────────────────── */ +.image-preview-wrap { + position: relative; + display: inline-block; +} + +.image-preview { + max-width: 220px; + max-height: 180px; + object-fit: contain; + border-radius: 10px; + border: 1.5px solid #e2e8f0; +} + +.remove-image-btn { + position: absolute; + top: -8px; + right: -8px; + width: 24px; + height: 24px; + border-radius: 50%; + background: #e53e3e; + color: #fff; + border: none; + font-size: 11px; + font-weight: 700; + cursor: pointer; + display: flex; + align-items: center; + justify-content: center; + transition: background 0.15s; +} + +.remove-image-btn:hover { + background: #c53030; +} + +.composer-footer { + display: flex; + justify-content: flex-end; + margin-top: 12px; +} + +/* ── Drop zone ──────────────────────────────────────────── */ +.drop-zone { + border: 2px dashed #cbd5e0; + border-radius: 10px; + padding: 20px; + text-align: center; + cursor: pointer; + transition: all 0.2s ease; + background: #f7fafc; +} + +.dark .drop-zone { + background: #1a2a3d; + border-color: #3b516b; +} + +.dark-file-input { + color: #e2e8f0; +} + +.dark-file-input::file-selector-button { + background: #2d4b6d; + border: 1px solid #4b6787; + color: #e2e8f0; +} + +.dark-text-muted { + color: #b6c6d8; +} + +.drop-zone:hover, +.drop-zone.dragging { + border-color: #0085ff; + background: rgb(0 133 255 / 5%); + transform: scale(1.01); +} + +/* ── Posts card ─────────────────────────────────────────── */ +.posts-card { + border-radius: 14px; + box-shadow: 0 2px 12px rgb(0 0 0 / 6%); + overflow: hidden; +} + +.post-count { + display: inline-flex; + align-items: center; + justify-content: center; + background: #0085ff; + color: #fff; + border-radius: 12px; + font-size: 11px; + font-weight: 700; + min-width: 22px; + height: 20px; + padding: 0 6px; + margin-left: 8px; + vertical-align: middle; +} + +.refresh-btn { + background: transparent; + border: 1.5px solid #0085ff; + color: #0085ff; + border-radius: 20px; + padding: 5px 16px; + font-size: 13px; + font-weight: 600; + cursor: pointer; + transition: all 0.15s ease; +} + +.refresh-btn:disabled { + opacity: 0.6; + cursor: not-allowed; +} + +.refresh-btn:hover:not(:disabled) { + background: #0085ff; + color: #fff; +} + +/* ── Post item ──────────────────────────────────────────── */ +.post-item { + display: flex; + gap: 12px; + padding: 16px 0; + border-bottom: 1px solid #edf2f7; +} + +.dark .post-item { + border-bottom-color: #2f435d; +} + +.post-item:last-child { + border-bottom: none; +} + +.post-avatar { + flex-shrink: 0; + width: 40px; + height: 40px; + border-radius: 50%; + background: linear-gradient(135deg, #0085ff, #00b4ff); + display: flex; + align-items: center; + justify-content: center; + font-size: 18px; +} + +.post-body { + flex: 1; + min-width: 0; +} + +.post-text { + font-size: 14px; + color: #2d3748; + margin-bottom: 8px; + line-height: 1.6; + overflow-wrap: break-word; +} + +.post-meta { + display: flex; + align-items: center; + gap: 12px; + flex-wrap: wrap; +} + +.post-stat { + font-size: 13px; + color: #718096; + display: flex; + align-items: center; + gap: 4px; +} + +.dark .post-stat { + color: #b6c6d8; +} + +.post-time { + font-size: 12px; + color: #a0aec0; + margin-right: auto; +} + +.dark .post-time { + color: #97abc3; +} + +.post-actions { + display: flex; + gap: 8px; +} + +.action-btn-view, +.action-btn-delete { + border: none; + border-radius: 16px; + padding: 4px 12px; + font-size: 12px; + font-weight: 600; + cursor: pointer; + transition: all 0.15s ease; +} + +.action-btn-view { + background: #ebf4ff; + color: #0085ff; +} + +.dark .action-btn-view { + background: #24486a; + color: #e8f3ff; +} + +.action-btn-view:hover { + background: #0085ff; + color: #fff; +} + +.action-btn-delete { + background: #fff5f5; + color: #e53e3e; +} + +.dark .action-btn-delete { + background: #5a2630; + color: #ffd8dd; +} + +.action-btn-delete:disabled { + opacity: 0.5; + cursor: not-allowed; +} + +.action-btn-delete:hover:not(:disabled) { + background: #e53e3e; + color: #fff; +} + +/* ── Empty state ────────────────────────────────────────── */ +.empty-state { + text-align: center; + padding: 48px 24px; + color: #a0aec0; +} + +.dark .empty-state { + color: #9fb3c8; +} + +.empty-icon { + font-size: 40px; + display: block; + margin-bottom: 12px; +} + +/* ── Post media ─────────────────────────────────────────── */ +.post-media { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(160px, 1fr)); + gap: 8px; + margin: 8px 0; +} + +.image-container, +.video-container, +.gif-container { + position: relative; + width: 100%; + aspect-ratio: 16 / 9; + overflow: hidden; + border-radius: 10px; + box-shadow: 0 2px 8px rgb(0 0 0 / 8%); +} + +.media-button { + padding: 0; + margin: 0; + border: none; + background: none; + width: 100%; + height: 100%; + cursor: pointer; + border-radius: 10px; + overflow: hidden; + transition: transform 0.2s ease; +} + +.media-button:hover { + transform: scale(1.03); +} + +.media-button:focus { + outline: 2px solid #0085ff; + outline-offset: 2px; +} + +.media-item { + width: 100%; + height: 100%; + object-fit: cover; +} + +.video-container video { + width: 100%; + height: 100%; + object-fit: contain; + background: #000; +} + +.gif-overlay { + position: absolute; + top: 6px; + right: 6px; + z-index: 1; +} + +.gif-badge { + display: inline-block; + padding: 2px 6px; + background: rgb(0 0 0 / 70%); + color: #fff; + border-radius: 4px; + font-size: 11px; + font-weight: 700; + letter-spacing: 0.5px; +} + +/* ── Modal header ───────────────────────────────────────── */ +.modal-header { + border-bottom: 1px solid #edf2f7; +} + +.dark .connected-bar { + background: #17314f; + border-color: #2f557e; +} + +.dark .connected-badge { + color: #9fc5f4; +} + +.dark .char-bar-track { + background: #3b516b; +} + diff --git a/src/components/Announcements/SocialMediaComposer.module.css b/src/components/Announcements/SocialMediaComposer.module.css index ace613aced..fe19c5021b 100644 --- a/src/components/Announcements/SocialMediaComposer.module.css +++ b/src/components/Announcements/SocialMediaComposer.module.css @@ -1,18 +1,19 @@ +/* stylelint-disable */ /* Social Media Composer - LIGHT MODE BY DEFAULT */ /* Main Container - WHITE background in light mode */ .social-media-composer { padding: 1.5rem; - background: #ffffff; + background: #fff; border-radius: 8px; - box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1); + box-shadow: 0 2px 8px rgb(0 0 0 / 10%); } .platform-title { font-size: 1.5rem; font-weight: 600; margin-bottom: 1rem; - color: #333333; + color: #333; text-transform: capitalize; } @@ -34,7 +35,7 @@ cursor: pointer; font-size: 0.95rem; font-weight: 500; - color: #666666; + color: #666; transition: all 0.2s; white-space: nowrap; min-width: 120px; @@ -66,13 +67,14 @@ width: 100%; min-height: 150px; padding: 12px; - border: 1px solid #cccccc; + border: 1px solid #ccc; border-radius: 6px; font-family: inherit; font-size: 1rem; resize: vertical; - background: #ffffff; - color: #000000; + background: #fff; + color: #000; + /* BLACK TEXT */ box-sizing: border-box; } @@ -80,11 +82,11 @@ .post-textarea:focus { outline: none; border-color: #007bff; - box-shadow: 0 0 0 3px rgba(0, 123, 255, 0.1); + box-shadow: 0 0 0 3px rgb(0 123 255 / 10%); } .post-textarea::placeholder { - color: #999999; + color: #999; } /* Upload Section */ @@ -97,15 +99,15 @@ .section-label { font-weight: 500; font-size: 0.9rem; - color: #333333; + color: #333; } .file-input { padding: 0.5rem; - border: 1px solid #cccccc; + border: 1px solid #ccc; border-radius: 4px; - background: #ffffff; - color: #333333; + background: #fff; + color: #333; cursor: pointer; } @@ -137,7 +139,7 @@ display: flex; align-items: center; justify-content: center; - box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2); + box-shadow: 0 2px 4px rgb(0 0 0 / 20%); transition: background 0.2s; } @@ -154,9 +156,10 @@ width: 100%; padding: 8px 12px; border-radius: 4px; - border: 1px solid #cccccc; - background: #ffffff; - color: #000000; + border: 1px solid #ccc; + background: #fff; + color: #000; + /* BLACK TEXT */ font-family: inherit; font-size: 0.9rem; @@ -169,7 +172,7 @@ } .alt-text-input::placeholder { - color: #999999; + color: #999; } /* Schedule Section */ @@ -187,11 +190,12 @@ .datetime-input { flex: 1; padding: 0.5rem; - border: 1px solid #cccccc; + border: 1px solid #ccc; border-radius: 4px; font-family: inherit; - background: #ffffff; - color: #000000; + background: #fff; + color: #000; + /* BLACK TEXT */ } @@ -268,11 +272,11 @@ position: absolute; bottom: calc(100% + 8px); left: 0; - background: #ffffff; - border: 1px solid #cccccc; + background: #fff; + border: 1px solid #ccc; border-radius: 6px; padding: 1rem; - box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15); + box-shadow: 0 4px 12px rgb(0 0 0 / 15%); z-index: 1000; min-width: 200px; } @@ -283,7 +287,7 @@ gap: 0.5rem; padding: 0.5rem; cursor: pointer; - color: #333333; + color: #333; } .crosspost-option:hover { @@ -301,7 +305,7 @@ padding-top: 0.5rem; border-top: 1px solid #e0e0e0; font-size: 0.75rem; - color: #666666; + color: #666; } /* Edit Banner */ @@ -338,14 +342,14 @@ .history-content, .details-content { padding: 1rem; - background: #ffffff; - color: #333333; + background: #fff; + color: #333; } .scheduled-content h4, .history-content h4 { margin-bottom: 1rem; - color: #333333; + color: #333; } .posts-list { @@ -369,14 +373,14 @@ } .post-text { - color: #333333; + color: #333; margin-bottom: 0.5rem; line-height: 1.5; } .post-meta { font-size: 0.85rem; - color: #666666; + color: #666; margin-bottom: 0.5rem; } @@ -437,7 +441,7 @@ gap: 1rem; margin: 0.5rem 0; font-size: 0.9rem; - color: #666666; + color: #666; } .post-media { @@ -460,23 +464,23 @@ /* Details Content */ .details-content { - color: #333333; + color: #333; } .details-content ul { padding-left: 1.5rem; line-height: 1.8; - color: #333333; + color: #333; } .details-content strong { - color: #333333; + color: #333; } /* Preview Modal Content */ .preview-container { padding: 1rem; - background: #ffffff; + background: #fff; } .preview-header { @@ -492,11 +496,11 @@ border-radius: 6px; white-space: pre-wrap; line-height: 1.6; - color: #333333; + color: #333; } /* Mobile Responsiveness */ -@media (max-width: 768px) { +@media (width <= 768px) { .tabs-container { overflow-x: auto; } @@ -551,7 +555,7 @@ } } -@media (max-width: 480px) { +@media (width <= 480px) { .social-media-composer { padding: 1rem; } @@ -588,7 +592,7 @@ } .tabs-container { - border-bottom-color: #444444; + border-bottom-color: #444; } .tab-button { @@ -608,12 +612,12 @@ .post-textarea { background: #2a2a2a; - border-color: #444444; + border-color: #444; color: #e0e0e0; } .post-textarea::placeholder { - color: #666666; + color: #666; } .section-label { @@ -622,29 +626,29 @@ .file-input { background: #2a2a2a; - border-color: #444444; + border-color: #444; color: #e0e0e0; } .alt-text-input { background: #2a2a2a; - border-color: #444444; + border-color: #444; color: #e0e0e0; } .alt-text-input::placeholder { - color: #666666; + color: #666; } .datetime-input { background: #2a2a2a; - border-color: #444444; + border-color: #444; color: #e0e0e0; } .crosspost-dropdown { background: #2a2a2a; - border-color: #444444; + border-color: #444; } .crosspost-option { @@ -652,12 +656,12 @@ } .crosspost-option:hover { - background: #333333; + background: #333; } .crosspost-note { color: #a0a0a0; - border-top-color: #444444; + border-top-color: #444; } .edit-banner { @@ -680,7 +684,7 @@ .post-card { background: #2a2a2a; - border-color: #444444; + border-color: #444; } .post-text { @@ -713,7 +717,7 @@ .preview-content { background: #2a2a2a; - border-color: #444444; + border-color: #444; color: #e0e0e0; } } diff --git a/src/components/Announcements/index.jsx b/src/components/Announcements/index.jsx index b342bc9643..372d815b25 100644 --- a/src/components/Announcements/index.jsx +++ b/src/components/Announcements/index.jsx @@ -13,9 +13,11 @@ import { } from '@fortawesome/free-solid-svg-icons'; import { faFacebook, faLinkedin, faMedium } from '@fortawesome/free-brands-svg-icons'; import ReactTooltip from 'react-tooltip'; + import styles from './Announcements.module.css'; import SocialMediaComposer from './SocialMediaComposer'; import TruthSocialAutoPoster from '../AutoPoster/TruthSocialAutoPoster'; +import BlueskyPostDetails from './BlueskyPostDetails'; import EmailPanel from './platforms/email'; import LinkedInAutoPoster from './platforms/linkedin'; import SlashdotAutoPoster from './platforms/slashdot'; @@ -154,6 +156,11 @@ function Announcements({ title, email: initialEmail }) { + {/* Bluesky uses the dedicated BlueskyPostDetails component */} + + + + {[ 'x', 'facebook', @@ -161,7 +168,6 @@ function Announcements({ title, email: initialEmail }) { 'instagram', 'threads', 'mastodon', - 'bluesky', 'youtube', 'reddit', 'tumblr', @@ -175,8 +181,13 @@ function Announcements({ title, email: initialEmail }) { 'slashdot', 'blogger', ].map(platform => { - const PlatformComposer = - platform === 'slashdot' ? SlashdotAutoPoster : SocialMediaComposer; + let PlatformComposer = SocialMediaComposer; + if (platform === 'slashdot') { + PlatformComposer = SlashdotAutoPoster; + } else if (platform === 'bluesky') { + PlatformComposer = BlueskyPostDetails; + } + return ( diff --git a/src/components/Announcements/platforms/email/index.jsx b/src/components/Announcements/platforms/email/index.jsx index 4adaf446be..5bda831a27 100644 --- a/src/components/Announcements/platforms/email/index.jsx +++ b/src/components/Announcements/platforms/email/index.jsx @@ -143,8 +143,12 @@ export default function EmailPanel({ title, initialEmail }) { }; return ( -
-
+
+
{title ?

{title}

:

Weekly Progress Editor

}
{showEditor && ( diff --git a/src/components/Announcements/platforms/slashdot/Slashdot.module.css b/src/components/Announcements/platforms/slashdot/Slashdot.module.css index 8046d7e059..3e2c66329f 100644 --- a/src/components/Announcements/platforms/slashdot/Slashdot.module.css +++ b/src/components/Announcements/platforms/slashdot/Slashdot.module.css @@ -1,3 +1,4 @@ +/* stylelint-disable declaration-property-value-keyword-no-deprecated */ .slashdot-autoposter { @@ -48,7 +49,7 @@ background: #d7ecff; color: #0d6efd; border-color: #99c8ff; - box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.6); + box-shadow: inset 0 1px 0 rgb(255 255 255 / 60%); } .slashdot-autoposter.dark .slashdot-subtab { @@ -68,7 +69,7 @@ border: 1px solid #d6dde7; border-radius: 12px; padding: 20px 22px; - box-shadow: 0 10px 24px rgba(15, 37, 80, 0.08); + box-shadow: 0 10px 24px rgb(15 37 80 / 8%); transition: border-color 0.2s ease, box-shadow 0.2s ease; } @@ -80,7 +81,7 @@ .slashdot-card.invalid { border-color: #d9534f; - box-shadow: 0 0 0 1px rgba(217, 83, 79, 0.18); + box-shadow: 0 0 0 1px rgb(217 83 79 / 18%); } .slashdot-autoposter.dark .slashdot-card.invalid { @@ -114,6 +115,7 @@ .slashdot-autoposter.dark .slashdot-field__meta { color: #9aa9c6; } + .slashdot-field__required { color: #d9534f; margin-left: 4px; @@ -122,6 +124,7 @@ .slashdot-autoposter.dark .slashdot-field__required { color: #ff9384; } + .slashdot-field__input { width: 100%; border: 1px solid #c7d1e5; @@ -141,13 +144,14 @@ .slashdot-field__input--invalid { border-color: #d9534f; - box-shadow: 0 0 0 1px rgba(217, 83, 79, 0.2); + box-shadow: 0 0 0 1px rgb(217 83 79 / 20%); } .slashdot-autoposter.dark .slashdot-field__input--invalid { border-color: #ff9384; - box-shadow: 0 0 0 1px rgba(255, 147, 132, 0.3); + box-shadow: 0 0 0 1px rgb(255 147 132 / 30%); } + .slashdot-field__textarea { resize: vertical; min-height: 110px; @@ -201,7 +205,7 @@ } .slashdot-autoposter.dark .slashdot-chip { - background: rgba(13, 110, 253, 0.22); + background: rgb(13 110 253 / 22%); color: #cfe0ff; } @@ -251,7 +255,7 @@ .slashdot-preview__body { white-space: pre-wrap; - font-family: 'SFMono-Regular', Menlo, Monaco, Consolas, 'Liberation Mono', 'Courier New', + font-family: SFMono-Regular, Menlo, Monaco, Consolas, 'Liberation Mono', 'Courier New', monospace; background: #f8f9fb; border: 1px solid #d6dde7; @@ -365,12 +369,12 @@ .slashdot-saved__item--active { border-color: #0d6efd; - box-shadow: 0 0 0 1px rgba(13, 110, 253, 0.24); + box-shadow: 0 0 0 1px rgb(13 110 253 / 24%); } .slashdot-autoposter.dark .slashdot-saved__item--active { border-color: #4785ff; - box-shadow: 0 0 0 1px rgba(71, 133, 255, 0.32); + box-shadow: 0 0 0 1px rgb(71 133 255 / 32%); } .slashdot-saved__header { @@ -416,13 +420,13 @@ gap: 10px; } -@media (max-width: 960px) { +@media (width <= 960px) { .slashdot-scheduler__grid { grid-template-columns: 1fr; } } -@media (max-width: 640px) { +@media (width <= 640px) { .slashdot-autoposter { gap: 18px; } diff --git a/src/components/ApplicantSourceDonutChart/ApplicantSourceDonutChart.module.css b/src/components/ApplicantSourceDonutChart/ApplicantSourceDonutChart.module.css index 7208b34309..32d1c9679f 100644 --- a/src/components/ApplicantSourceDonutChart/ApplicantSourceDonutChart.module.css +++ b/src/components/ApplicantSourceDonutChart/ApplicantSourceDonutChart.module.css @@ -1,3 +1,4 @@ +/* stylelint-disable */ .page { min-height: 100vh; padding: 2rem 0; @@ -46,7 +47,7 @@ .darkContainer { background-color: #111827; border-radius: 12px; - box-shadow: 0 0 0 1px rgba(148, 163, 184, 0.08); + box-shadow: 0 0 0 1px rgb(148 163 184 / 8%); padding-bottom: 2rem; } @@ -65,14 +66,14 @@ border-color: #3b82f6 !important; } -@media (max-width: 1024px) { +@media (width <= 1024px) { .applicantChartContainer { padding: 1.5rem 1.75rem; max-width: 100%; } } -@media (max-width: 768px) { +@media (width <= 768px) { .page { padding: 1.5rem 0.75rem; } @@ -111,7 +112,7 @@ background-color: #1e293b !important; border: 1px solid #475569 !important; border-radius: 6px !important; - box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.3), 0 2px 4px -1px rgba(0, 0, 0, 0.2) !important; + box-shadow: 0 4px 6px -1px rgb(0 0 0 / 30%), 0 2px 4px -1px rgb(0 0 0 / 20%) !important; } .dark :global(.recharts-tooltip-label) { diff --git a/src/components/ApplicantVolunteerRatio/ApplicantVolunteerRatio.module.css b/src/components/ApplicantVolunteerRatio/ApplicantVolunteerRatio.module.css index 7893a740d3..e0888478eb 100644 --- a/src/components/ApplicantVolunteerRatio/ApplicantVolunteerRatio.module.css +++ b/src/components/ApplicantVolunteerRatio/ApplicantVolunteerRatio.module.css @@ -1,3 +1,4 @@ +/* stylelint-disable */ /* Container */ .page { max-width: 1200px; @@ -56,7 +57,7 @@ /* Validation Error */ .validationError { - color: #ffcc00; + color: #fc0; margin-top: 8px; font-weight: bold; } @@ -88,7 +89,7 @@ .dark :global(.react-datepicker__input-container input) { background-color: #0b2434; border-color: #2b4a6b; - color: #ffffff; + color: #fff; } .dark :global(.react-datepicker) { @@ -104,100 +105,100 @@ .dark :global(.react-datepicker__current-month), .dark :global(.react-datepicker__day-name), .dark :global(.react-datepicker__day) { - color: #ffffff; + color: #fff; } .dark :global(.react-datepicker__day:hover) { - background-color: rgba(255, 255, 255, 0.1); + background-color: rgb(255 255 255 / 10%); } .dark :global(.react-datepicker__day--selected) { - background-color: rgba(67, 160, 71, 0.22); + background-color: rgb(67 160 71 / 22%); } /* React Select Dark Mode Overrides */ .dark :global(.custom-select__control) { background-color: #0b2434 !important; border-color: #2b4a6b !important; - color: #ffffff !important; + color: #fff !important; } .dark :global(.custom-select__menu) { background-color: #0b2434 !important; - color: #ffffff !important; + color: #fff !important; } /* Target menu when it's portaled to body in dark mode */ :global(.dark-mode-body) :global(.custom-select__menu) { background-color: #0b2434 !important; - color: #ffffff !important; + color: #fff !important; } .dark :global(.custom-select__option) { background-color: transparent !important; - color: #ffffff !important; + color: #fff !important; } :global(.dark-mode-body) :global(.custom-select__option) { background-color: transparent !important; - color: #ffffff !important; + color: #fff !important; } .dark :global(.custom-select__option--is-focused) { - background-color: rgba(255, 255, 255, 0.06) !important; + background-color: rgb(255 255 255 / 6%) !important; } :global(.dark-mode-body) :global(.custom-select__option--is-focused) { - background-color: rgba(255, 255, 255, 0.06) !important; + background-color: rgb(255 255 255 / 6%) !important; } .dark :global(.custom-select__option--is-selected) { - background-color: rgba(67, 160, 71, 0.22) !important; + background-color: rgb(67 160 71 / 22%) !important; } :global(.dark-mode-body) :global(.custom-select__option--is-selected) { - background-color: rgba(67, 160, 71, 0.22) !important; + background-color: rgb(67 160 71 / 22%) !important; } .dark :global(.custom-select__multi-value) { - background-color: rgba(255, 255, 255, 0.06) !important; + background-color: rgb(255 255 255 / 6%) !important; } .dark :global(.custom-select__multi-value__label) { - color: #ffffff !important; + color: #fff !important; } .dark :global(.custom-select__multi-value__remove) { - color: #ffffff !important; + color: #fff !important; } .dark :global(.custom-select__multi-value__remove:hover) { - background-color: rgba(255, 255, 255, 0.1) !important; - color: #ffffff !important; + background-color: rgb(255 255 255 / 10%) !important; + color: #fff !important; } .dark :global(.custom-select__placeholder) { - color: rgba(224, 224, 224, 0.9) !important; + color: rgb(224 224 224 / 90%) !important; } .dark :global(.custom-select__single-value) { - color: #ffffff !important; + color: #fff !important; } .dark :global(.custom-select__input-container) { - color: #ffffff !important; + color: #fff !important; } .dark :global(.custom-select__dropdown-indicator) { - color: #ffffff !important; + color: #fff !important; } .dark :global(.custom-select__clear-indicator) { - color: #ffffff !important; + color: #fff !important; } .dark :global(.custom-select__indicator-separator) { - background-color: rgba(255, 255, 255, 0.06) !important; + background-color: rgb(255 255 255 / 6%) !important; } /* Body Dark Mode */ diff --git a/src/components/ApplicantsChart/ApplicantsChart.module.css b/src/components/ApplicantsChart/ApplicantsChart.module.css index 23c64f4cdf..e923e34984 100644 --- a/src/components/ApplicantsChart/ApplicantsChart.module.css +++ b/src/components/ApplicantsChart/ApplicantsChart.module.css @@ -1,3 +1,5 @@ +/* stylelint-disable no-descending-specificity */ + /* Dark mode hover styles for DatePicker calendar */ .text-light .hgn-datepicker-dark-calendar .react-datepicker { background-color: #1f2937 !important; @@ -23,21 +25,21 @@ .text-light .hgn-datepicker-dark-calendar .react-datepicker__day:hover { background-color: #374151 !important; - color: #ffffff !important; + color: #fff !important; border-radius: 0 !important; } .text-light .hgn-datepicker-dark-calendar .react-datepicker__day--selected, .text-light .hgn-datepicker-dark-calendar .react-datepicker__day--keyboard-selected { background-color: #2563eb !important; - color: #ffffff !important; + color: #fff !important; border-radius: 0 !important; } .text-light .hgn-datepicker-dark-calendar .react-datepicker__day--in-range, .text-light .hgn-datepicker-dark-calendar .react-datepicker__day--in-selecting-range { background-color: #1e3a8a !important; - color: #ffffff !important; + color: #fff !important; border-radius: 0 !important; } @@ -91,6 +93,7 @@ color: #9ca3af !important; opacity: 1 !important; } + .disabledDay { color: #9ca3af !important; /* gray */ pointer-events: none; @@ -154,42 +157,42 @@ /* Custom tooltip styles - ensure text is always visible */ .customTooltip { - background-color: #ffffff !important; - color: #000000 !important; + background-color: #fff !important; + color: #000 !important; } .customTooltip * { - color: #000000 !important; + color: #000 !important; } .tooltipAgeGroup { - color: #000000 !important; + color: #000 !important; font-weight: 600 !important; } .tooltipApplicants { - color: #000000 !important; + color: #000 !important; } .tooltipApplicants strong { - color: #000000 !important; + color: #000 !important; font-weight: 700 !important; } .tooltipChange { - color: #000000 !important; + color: #000 !important; } /* Global tooltip styles to override any parent dark mode styles */ :global(.recharts-tooltip-wrapper) .customTooltip, :global(.recharts-tooltip-wrapper) .customTooltip * { - color: #000000 !important; - background-color: #ffffff !important; + color: #000 !important; + background-color: #fff !important; } /* Override text-light class for tooltip */ :global(.text-light) :global(.recharts-tooltip-wrapper) .customTooltip, :global(.text-light) :global(.recharts-tooltip-wrapper) .customTooltip * { - color: #000000 !important; - background-color: #ffffff !important; + color: #000 !important; + background-color: #fff !important; } diff --git a/src/components/ApplicantsChart/ApplicationChart.module.css b/src/components/ApplicantsChart/ApplicationChart.module.css index 915abd978d..dc5a610ca6 100644 --- a/src/components/ApplicantsChart/ApplicationChart.module.css +++ b/src/components/ApplicantsChart/ApplicationChart.module.css @@ -1,3 +1,4 @@ +/* stylelint-disable declaration-property-value-no-unknown */ .ApplicantChart { width: 100vw; height: 100vh; diff --git a/src/components/ApplicantsChart/TimeFilter.module.css b/src/components/ApplicantsChart/TimeFilter.module.css index 85bab8b44f..ea7f50f035 100644 --- a/src/components/ApplicantsChart/TimeFilter.module.css +++ b/src/components/ApplicantsChart/TimeFilter.module.css @@ -1,3 +1,4 @@ +/* stylelint-disable */ .TimeFilter { display: flex; flex-direction: column; diff --git a/src/components/ApplicationAnalytics/jobAnalytics.module.css b/src/components/ApplicationAnalytics/jobAnalytics.module.css index 75ffea3748..0872f8f230 100644 --- a/src/components/ApplicationAnalytics/jobAnalytics.module.css +++ b/src/components/ApplicationAnalytics/jobAnalytics.module.css @@ -1,3 +1,4 @@ +/* stylelint-disable */ /* ============================================================ Development-added container styles (used by index.jsx) ============================================================ */ @@ -691,7 +692,6 @@ color: var(--muted); } -/* stylelint-disable-next-line no-descending-specificity */ .jaFooter strong { color: var(--text); font-weight: 600; @@ -708,7 +708,6 @@ font-size: 13px; } -/* stylelint-disable-next-line no-descending-specificity */ .jaFilter select, .jaFilter input[type='date'] { background: var(--card); @@ -742,7 +741,6 @@ gap: 8px; } -/* stylelint-disable-next-line no-descending-specificity */ .jaDateRange input[type='date'] { flex: 1 1 120px; min-width: 0; diff --git a/src/components/ApplicationTimeChart/ApplicationTimeChart.module.css b/src/components/ApplicationTimeChart/ApplicationTimeChart.module.css index cb28b2f326..c4b3ced28c 100644 --- a/src/components/ApplicationTimeChart/ApplicationTimeChart.module.css +++ b/src/components/ApplicationTimeChart/ApplicationTimeChart.module.css @@ -1,3 +1,4 @@ +/* stylelint-disable */ /* ApplicationTimeChart.module.css */ .pageContainer { @@ -23,13 +24,13 @@ transition: background-color 0.3s ease, color 0.3s ease; } -@media (max-width: 768px) { +@media (width <= 768px) { .pageContainer { padding: 15px; } } -@media (max-width: 480px) { +@media (width <= 480px) { .pageContainer { padding: 10px; } @@ -45,7 +46,7 @@ flex: 1; border: 2px solid #4285f4; border-radius: 8px; - background-color: #ffffff; + background-color: #fff; padding: 20px; overflow: visible; transition: background-color 0.3s ease, border-color 0.3s ease; @@ -60,7 +61,7 @@ font-size: 20px; font-weight: 400; color: #5f6368; - margin: 0 0 30px 0; + margin: 0 0 30px; font-family: Arial, sans-serif; transition: color 0.3s ease; } @@ -72,15 +73,13 @@ .chartArea { min-height: 400px; position: relative; - padding-left: 140px; + padding: 20px 108px 40px 140px; + /* Room for value labels placed to the right of each bar (not on the bar) */ - padding-right: 108px; - padding-top: 20px; - padding-bottom: 40px; } /* Responsive design for mobile */ -@media (max-width: 768px) { +@media (width <= 768px) { .chartArea { padding-left: 100px; padding-right: 88px; @@ -88,7 +87,7 @@ } } -@media (max-width: 480px) { +@media (width <= 480px) { .chartArea { padding-left: 80px; padding-right: 72px; @@ -98,10 +97,7 @@ .grid { position: absolute; - left: 140px; - right: 108px; - top: 20px; - bottom: 40px; + inset: 20px 108px 40px 140px; background-image: linear-gradient(to right, #e0e0e0 1px, transparent 1px), linear-gradient(to bottom, #e0e0e0 1px, transparent 1px); opacity: 0.5; @@ -114,14 +110,14 @@ linear-gradient(to bottom, #5a6c7d 1px, transparent 1px); } -@media (max-width: 768px) { +@media (width <= 768px) { .grid { left: 100px; right: 88px; } } -@media (max-width: 480px) { +@media (width <= 480px) { .grid { left: 80px; right: 72px; @@ -139,13 +135,13 @@ justify-content: space-between; } -@media (max-width: 768px) { +@media (width <= 768px) { .yAxis { width: 90px; } } -@media (max-width: 480px) { +@media (width <= 480px) { .yAxis { width: 70px; } @@ -167,7 +163,7 @@ border-right-color: #5a6c7d; } -@media (max-width: 480px) { +@media (width <= 480px) { .yAxisItem { font-size: 10px; padding-right: 5px; @@ -191,14 +187,14 @@ border-top-color: #5a6c7d; } -@media (max-width: 768px) { +@media (width <= 768px) { .xAxis { left: 100px; right: 88px; } } -@media (max-width: 480px) { +@media (width <= 480px) { .xAxis { left: 80px; right: 72px; @@ -207,23 +203,20 @@ .bars { position: absolute; - left: 140px; - right: 108px; - top: 20px; - bottom: 40px; + inset: 20px 108px 40px 140px; display: flex; flex-direction: column; justify-content: space-between; } -@media (max-width: 768px) { +@media (width <= 768px) { .bars { left: 100px; right: 88px; } } -@media (max-width: 480px) { +@media (width <= 480px) { .bars { left: 80px; right: 72px; @@ -271,10 +264,10 @@ .dataLabel.darkMode { color: #f1f5f9; - text-shadow: 0 1px 2px rgba(0, 0, 0, 0.45); + text-shadow: 0 1px 2px rgb(0 0 0 / 45%); } -@media (max-width: 480px) { +@media (width <= 480px) { .dataLabel { font-size: 12px; margin-left: 8px; @@ -295,7 +288,7 @@ color: #e0e0e0; } -@media (max-width: 480px) { +@media (width <= 480px) { .xAxisLabel { font-size: 10px; bottom: -20px; @@ -316,14 +309,14 @@ color: #e0e0e0; } -@media (max-width: 768px) { +@media (width <= 768px) { .noData { height: 300px; font-size: 14px; } } -@media (max-width: 480px) { +@media (width <= 480px) { .noData { height: 250px; font-size: 12px; @@ -345,7 +338,7 @@ color: #e0e0e0; } -@media (max-width: 480px) { +@media (width <= 480px) { .summary { font-size: 12px; padding: 10px; @@ -359,14 +352,14 @@ min-width: 150px; } -@media (max-width: 768px) { +@media (width <= 768px) { .filters { min-width: 120px; gap: 15px; } } -@media (max-width: 480px) { +@media (width <= 480px) { .filters { min-width: 100px; gap: 10px; @@ -377,7 +370,7 @@ border: 1px solid #dadce0; border-radius: 4px; padding: 12px; - background-color: #ffffff; + background-color: #fff; transition: background-color 0.3s ease, border-color 0.3s ease; } @@ -386,7 +379,7 @@ border-color: #5a6c7d; } -@media (max-width: 480px) { +@media (width <= 480px) { .filterCard { padding: 8px; } @@ -404,7 +397,7 @@ color: #e0e0e0; } -@media (max-width: 480px) { +@media (width <= 480px) { .filterTitle { font-size: 12px; margin-bottom: 6px; @@ -417,7 +410,7 @@ border: 1px solid #dadce0; border-radius: 4px; font-size: 14px; - background-color: #ffffff; + background-color: #fff; color: #3c4043; transition: background-color 0.3s ease, border-color 0.3s ease, color 0.3s ease; } @@ -430,7 +423,7 @@ /* Native