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
+
+
+
+ );
+}
+
+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 (
+
+ );
+ }
+
+ 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 && (
+
+

+
+
+ )}
+
+
+
+
+
+
+
+
+ >
+ ) : (
+ 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