From 009245d12b4060029d9ad9178a30d752a3a25879 Mon Sep 17 00:00:00 2001 From: idittrich-valueon <137774853+idittrich-valueon@users.noreply.github.com> Date: Wed, 4 Jun 2025 11:26:06 +0200 Subject: [PATCH 01/32] Update int_poweron-nyla-int.yml --- .github/workflows/int_poweron-nyla-int.yml | 33 +++++++++++----------- 1 file changed, 17 insertions(+), 16 deletions(-) diff --git a/.github/workflows/int_poweron-nyla-int.yml b/.github/workflows/int_poweron-nyla-int.yml index 6101e82..8249fff 100644 --- a/.github/workflows/int_poweron-nyla-int.yml +++ b/.github/workflows/int_poweron-nyla-int.yml @@ -29,8 +29,9 @@ jobs: npm run build --if-present npm run test --if-present - - name: Zip artifact for deployment - run: zip release.zip ./* -r + - name: Zip build output for deployment + run: zip -r release.zip dist + - name: Upload artifact for deployment job uses: actions/upload-artifact@v4 @@ -41,12 +42,12 @@ jobs: deploy: runs-on: ubuntu-latest needs: build - environment: - name: 'Production' + environment: + name: 'Production' url: ${{ steps.deploy-to-webapp.outputs.webapp-url }} - permissions: - id-token: write #This is required for requesting the JWT - contents: read #This is required for actions/checkout + permissions: + id-token: write #This is required for requesting the JWT + contents: read #This is required for actions/checkout steps: - name: Download artifact from build job @@ -56,13 +57,13 @@ jobs: - name: Unzip artifact for deployment run: unzip release.zip - - - name: Login to Azure - uses: azure/login@v2 - with: - client-id: ${{ secrets.AZUREAPPSERVICE_CLIENTID_6DD84FBFF4714B219CFB34DCFFCD5AB8 }} - tenant-id: ${{ secrets.AZUREAPPSERVICE_TENANTID_F971FF000D07422C8DE63D80087B1699 }} - subscription-id: ${{ secrets.AZUREAPPSERVICE_SUBSCRIPTIONID_B5B74D4E312E4B0AB251704F387F2166 }} + + - name: Login to Azure + uses: azure/login@v2 + with: + client-id: ${{ secrets.AZUREAPPSERVICE_CLIENTID_6DD84FBFF4714B219CFB34DCFFCD5AB8 }} + tenant-id: ${{ secrets.AZUREAPPSERVICE_TENANTID_F971FF000D07422C8DE63D80087B1699 }} + subscription-id: ${{ secrets.AZUREAPPSERVICE_SUBSCRIPTIONID_B5B74D4E312E4B0AB251704F387F2166 }} - name: 'Deploy to Azure Web App' id: deploy-to-webapp @@ -70,5 +71,5 @@ jobs: with: app-name: 'poweron-nyla-int' slot-name: 'Production' - package: . - \ No newline at end of file + package: ./dist + From b818bbc210acecf9799de9be8aed8fe302840d97 Mon Sep 17 00:00:00 2001 From: idittrich-valueon <137774853+idittrich-valueon@users.noreply.github.com> Date: Wed, 4 Jun 2025 11:27:56 +0200 Subject: [PATCH 02/32] Delete main_poweron-nyla.yml --- .github/workflows/main_poweron-nyla.yml | 61 ------------------------- 1 file changed, 61 deletions(-) diff --git a/.github/workflows/main_poweron-nyla.yml b/.github/workflows/main_poweron-nyla.yml index 8b61534..d3f5a12 100644 --- a/.github/workflows/main_poweron-nyla.yml +++ b/.github/workflows/main_poweron-nyla.yml @@ -1,62 +1 @@ -name: Deploy React App to Azure Web App -on: - push: - branches: - - main # oder dein Branch - workflow_dispatch: # Ermöglicht manuelles Triggern - -jobs: - build-and-deploy: - runs-on: ubuntu-latest - - steps: - - name: Checkout Code - uses: actions/checkout@v3 - - - name: Setup Node.js - uses: actions/setup-node@v3 - with: - node-version: '18' - cache: 'npm' # Aktiviert Caching für schnellere Builds - - - name: Install dependencies - run: | - npm ci - npm install express - - - name: Build React app - run: npm run build - - - name: Prepare deployment package - run: | - # Create deployment package with build files and necessary configs - mkdir deploy - cp -r dist/* deploy/ - # Create a simple server.js for serving the app - echo "const express = require('express');" > deploy/server.js - echo "const path = require('path');" >> deploy/server.js - echo "const app = express();" >> deploy/server.js - echo "app.use(express.static(path.join(__dirname)));" >> deploy/server.js - echo "app.get('/*', function(req, res) { res.sendFile(path.join(__dirname, 'index.html')); });" >> deploy/server.js - echo "const port = process.env.PORT || 8080;" >> deploy/server.js - echo "app.listen(port, () => console.log('Server running on port', port));" >> deploy/server.js - # Create a new package.json for deployment - echo '{ - "name": "frontend", - "version": "1.0.0", - "private": true, - "scripts": { - "start": "node server.js" - }, - "dependencies": { - "express": "^4.18.2" - } - }' > deploy/package.json - - - name: 'Deploy to Azure Web App' - uses: azure/webapps-deploy@v3 - with: - app-name: 'poweron-nyla' - publish-profile: ${{ secrets.AZUREAPPSERVICE_PUBLISHPROFILE_D6C9359A57C5448A8C0BFA2D4C4B2068 }} - package: ./deploy From 8962fcfd22501914c49128620e9cc3da1c924e16 Mon Sep 17 00:00:00 2001 From: idittrich-valueon <137774853+idittrich-valueon@users.noreply.github.com> Date: Wed, 4 Jun 2025 11:34:56 +0200 Subject: [PATCH 03/32] Update int_poweron-nyla-int.yml --- .github/workflows/int_poweron-nyla-int.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/int_poweron-nyla-int.yml b/.github/workflows/int_poweron-nyla-int.yml index 8249fff..e751339 100644 --- a/.github/workflows/int_poweron-nyla-int.yml +++ b/.github/workflows/int_poweron-nyla-int.yml @@ -71,5 +71,5 @@ jobs: with: app-name: 'poweron-nyla-int' slot-name: 'Production' - package: ./dist + package: ./dist/ From 06487072b49e46eeb58b45fd2bc93f3d9d85e73a Mon Sep 17 00:00:00 2001 From: idittrich-valueon <137774853+idittrich-valueon@users.noreply.github.com> Date: Wed, 4 Jun 2025 09:50:45 +0000 Subject: [PATCH 04/32] Update int_poweron-nyla-int.yml --- .github/workflows/int_poweron-nyla-int.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/int_poweron-nyla-int.yml b/.github/workflows/int_poweron-nyla-int.yml index e751339..79f0b47 100644 --- a/.github/workflows/int_poweron-nyla-int.yml +++ b/.github/workflows/int_poweron-nyla-int.yml @@ -21,7 +21,7 @@ jobs: - name: Set up Node.js version uses: actions/setup-node@v3 with: - node-version: '20.x' + node-version: '18.x' - name: npm install, build, and test run: | @@ -56,7 +56,7 @@ jobs: name: node-app - name: Unzip artifact for deployment - run: unzip release.zip + run: unzip release.zip -d /home/site/wwwroot - name: Login to Azure uses: azure/login@v2 From fe7157d055e54b9ae43e187685b4837d1a19145e Mon Sep 17 00:00:00 2001 From: idittrich-valueon <137774853+idittrich-valueon@users.noreply.github.com> Date: Wed, 4 Jun 2025 11:53:07 +0200 Subject: [PATCH 05/32] Update int_poweron-nyla-int.yml --- .github/workflows/int_poweron-nyla-int.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/int_poweron-nyla-int.yml b/.github/workflows/int_poweron-nyla-int.yml index 79f0b47..80af57a 100644 --- a/.github/workflows/int_poweron-nyla-int.yml +++ b/.github/workflows/int_poweron-nyla-int.yml @@ -56,7 +56,7 @@ jobs: name: node-app - name: Unzip artifact for deployment - run: unzip release.zip -d /home/site/wwwroot + run: unzip release.zip - name: Login to Azure uses: azure/login@v2 @@ -71,5 +71,5 @@ jobs: with: app-name: 'poweron-nyla-int' slot-name: 'Production' - package: ./dist/ + package: . From 210d2521c1b37cecc1b4d78358adabafb1ad5737 Mon Sep 17 00:00:00 2001 From: idittrich-valueon <137774853+idittrich-valueon@users.noreply.github.com> Date: Wed, 4 Jun 2025 11:54:52 +0200 Subject: [PATCH 06/32] Update int_poweron-nyla-int.yml --- .github/workflows/int_poweron-nyla-int.yml | 97 ++++++++++------------ 1 file changed, 42 insertions(+), 55 deletions(-) diff --git a/.github/workflows/int_poweron-nyla-int.yml b/.github/workflows/int_poweron-nyla-int.yml index 80af57a..8b61534 100644 --- a/.github/workflows/int_poweron-nyla-int.yml +++ b/.github/workflows/int_poweron-nyla-int.yml @@ -1,75 +1,62 @@ -# Docs for the Azure Web Apps Deploy action: https://github.com/Azure/webapps-deploy -# More GitHub Actions for Azure: https://github.com/Azure/actions - -name: Build and deploy Node.js app to Azure Web App - poweron-nyla-int +name: Deploy React App to Azure Web App on: push: branches: - - int - workflow_dispatch: + - main # oder dein Branch + workflow_dispatch: # Ermöglicht manuelles Triggern jobs: - build: + build-and-deploy: runs-on: ubuntu-latest - permissions: - contents: read #This is required for actions/checkout steps: - - uses: actions/checkout@v4 + - name: Checkout Code + uses: actions/checkout@v3 - - name: Set up Node.js version + - name: Setup Node.js uses: actions/setup-node@v3 with: - node-version: '18.x' + node-version: '18' + cache: 'npm' # Aktiviert Caching für schnellere Builds - - name: npm install, build, and test + - name: Install dependencies run: | - npm install - npm run build --if-present - npm run test --if-present + npm ci + npm install express - - name: Zip build output for deployment - run: zip -r release.zip dist + - name: Build React app + run: npm run build - - - name: Upload artifact for deployment job - uses: actions/upload-artifact@v4 - with: - name: node-app - path: release.zip - - deploy: - runs-on: ubuntu-latest - needs: build - environment: - name: 'Production' - url: ${{ steps.deploy-to-webapp.outputs.webapp-url }} - permissions: - id-token: write #This is required for requesting the JWT - contents: read #This is required for actions/checkout - - steps: - - name: Download artifact from build job - uses: actions/download-artifact@v4 - with: - name: node-app - - - name: Unzip artifact for deployment - run: unzip release.zip - - - name: Login to Azure - uses: azure/login@v2 - with: - client-id: ${{ secrets.AZUREAPPSERVICE_CLIENTID_6DD84FBFF4714B219CFB34DCFFCD5AB8 }} - tenant-id: ${{ secrets.AZUREAPPSERVICE_TENANTID_F971FF000D07422C8DE63D80087B1699 }} - subscription-id: ${{ secrets.AZUREAPPSERVICE_SUBSCRIPTIONID_B5B74D4E312E4B0AB251704F387F2166 }} + - name: Prepare deployment package + run: | + # Create deployment package with build files and necessary configs + mkdir deploy + cp -r dist/* deploy/ + # Create a simple server.js for serving the app + echo "const express = require('express');" > deploy/server.js + echo "const path = require('path');" >> deploy/server.js + echo "const app = express();" >> deploy/server.js + echo "app.use(express.static(path.join(__dirname)));" >> deploy/server.js + echo "app.get('/*', function(req, res) { res.sendFile(path.join(__dirname, 'index.html')); });" >> deploy/server.js + echo "const port = process.env.PORT || 8080;" >> deploy/server.js + echo "app.listen(port, () => console.log('Server running on port', port));" >> deploy/server.js + # Create a new package.json for deployment + echo '{ + "name": "frontend", + "version": "1.0.0", + "private": true, + "scripts": { + "start": "node server.js" + }, + "dependencies": { + "express": "^4.18.2" + } + }' > deploy/package.json - name: 'Deploy to Azure Web App' - id: deploy-to-webapp uses: azure/webapps-deploy@v3 with: - app-name: 'poweron-nyla-int' - slot-name: 'Production' - package: . - + app-name: 'poweron-nyla' + publish-profile: ${{ secrets.AZUREAPPSERVICE_PUBLISHPROFILE_D6C9359A57C5448A8C0BFA2D4C4B2068 }} + package: ./deploy From 93ad90ff70cb7cbc3167ddf540f5f2c015c053d2 Mon Sep 17 00:00:00 2001 From: idittrich-valueon <137774853+idittrich-valueon@users.noreply.github.com> Date: Wed, 4 Jun 2025 11:58:15 +0200 Subject: [PATCH 07/32] Update int_poweron-nyla-int.yml --- .github/workflows/int_poweron-nyla-int.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/int_poweron-nyla-int.yml b/.github/workflows/int_poweron-nyla-int.yml index 8b61534..2be83d8 100644 --- a/.github/workflows/int_poweron-nyla-int.yml +++ b/.github/workflows/int_poweron-nyla-int.yml @@ -3,7 +3,7 @@ name: Deploy React App to Azure Web App on: push: branches: - - main # oder dein Branch + - int # oder dein Branch workflow_dispatch: # Ermöglicht manuelles Triggern jobs: From 81858b47c5dbadc5ad756d3c649bffec2814ecc1 Mon Sep 17 00:00:00 2001 From: idittrich-valueon Date: Wed, 4 Jun 2025 12:20:50 +0200 Subject: [PATCH 08/32] Trigger Azure deployment - fix server.js missing issue --- README.md | Bin 0 -> 46 bytes server.js | 19 +++++++++++++++++++ 2 files changed, 19 insertions(+) create mode 100644 README.md create mode 100644 server.js diff --git a/README.md b/README.md new file mode 100644 index 0000000000000000000000000000000000000000..36fc52810a1b41477b92fbfe6fd3ceafbc010633 GIT binary patch literal 46 wcmezWPnki1A%vlbA(J5;2vdP91%?zLUBHmTkk3%bkPBqzF_bXyGH@{f00>tJjQ{`u literal 0 HcmV?d00001 diff --git a/server.js b/server.js new file mode 100644 index 0000000..bd5984e --- /dev/null +++ b/server.js @@ -0,0 +1,19 @@ +const express = require('express'); +const path = require('path'); +const app = express(); + +// Serve static files from the dist directory +app.use(express.static(path.join(__dirname, 'dist'))); + +// Handle React Router - send all requests to index.html +app.get('/*', function(req, res) { + res.sendFile(path.join(__dirname, 'dist', 'index.html')); +}); + +// Use Azure's PORT environment variable or fallback to 3000 +const port = process.env.PORT || 3000; + +// Listen on all interfaces (important for Azure) +app.listen(port, '0.0.0.0', () => { + console.log(`Server running on port ${port}`); +}); \ No newline at end of file From 1a8aabbfdca6c5c63e78ecf2a09a1145c7824d8d Mon Sep 17 00:00:00 2001 From: idittrich-valueon Date: Wed, 4 Jun 2025 12:24:00 +0200 Subject: [PATCH 09/32] Fix Azure deployment - improve server.js creation and add debugging --- .github/workflows/int_poweron-nyla-int.yml | 69 +++++++++++++++------- 1 file changed, 48 insertions(+), 21 deletions(-) diff --git a/.github/workflows/int_poweron-nyla-int.yml b/.github/workflows/int_poweron-nyla-int.yml index 2be83d8..87b4f6a 100644 --- a/.github/workflows/int_poweron-nyla-int.yml +++ b/.github/workflows/int_poweron-nyla-int.yml @@ -31,28 +31,55 @@ jobs: - name: Prepare deployment package run: | # Create deployment package with build files and necessary configs - mkdir deploy + mkdir -p deploy + + # Copy all build files cp -r dist/* deploy/ - # Create a simple server.js for serving the app - echo "const express = require('express');" > deploy/server.js - echo "const path = require('path');" >> deploy/server.js - echo "const app = express();" >> deploy/server.js - echo "app.use(express.static(path.join(__dirname)));" >> deploy/server.js - echo "app.get('/*', function(req, res) { res.sendFile(path.join(__dirname, 'index.html')); });" >> deploy/server.js - echo "const port = process.env.PORT || 8080;" >> deploy/server.js - echo "app.listen(port, () => console.log('Server running on port', port));" >> deploy/server.js - # Create a new package.json for deployment - echo '{ - "name": "frontend", - "version": "1.0.0", - "private": true, - "scripts": { - "start": "node server.js" - }, - "dependencies": { - "express": "^4.18.2" - } - }' > deploy/package.json + + # Create server.js with proper content + cat > deploy/server.js << 'EOF' +const express = require('express'); +const path = require('path'); +const app = express(); + +// Serve static files +app.use(express.static(path.join(__dirname))); + +// Handle React Router +app.get('/*', function(req, res) { + res.sendFile(path.join(__dirname, 'index.html')); +}); + +// Use environment PORT or default to 8080 +const port = process.env.PORT || 8080; + +app.listen(port, '0.0.0.0', () => { + console.log(`Server running on port ${port}`); +}); +EOF + + # Create package.json for deployment + cat > deploy/package.json << 'EOF' +{ + "name": "frontend", + "version": "1.0.0", + "private": true, + "scripts": { + "start": "node server.js" + }, + "dependencies": { + "express": "^4.18.2" + } +} +EOF + + # Verify files were created + echo "=== Deployment package contents ===" + ls -la deploy/ + echo "=== server.js content ===" + cat deploy/server.js + echo "=== package.json content ===" + cat deploy/package.json - name: 'Deploy to Azure Web App' uses: azure/webapps-deploy@v3 From 7e68eeb501f4522fad28bcbfa2aa712142d3d0bf Mon Sep 17 00:00:00 2001 From: idittrich-valueon Date: Wed, 4 Jun 2025 12:25:25 +0200 Subject: [PATCH 10/32] Fix YAML syntax error in GitHub Actions workflow --- .github/workflows/int_poweron-nyla-int.yml | 64 ++++++++++------------ 1 file changed, 30 insertions(+), 34 deletions(-) diff --git a/.github/workflows/int_poweron-nyla-int.yml b/.github/workflows/int_poweron-nyla-int.yml index 87b4f6a..597a361 100644 --- a/.github/workflows/int_poweron-nyla-int.yml +++ b/.github/workflows/int_poweron-nyla-int.yml @@ -36,42 +36,38 @@ jobs: # Copy all build files cp -r dist/* deploy/ - # Create server.js with proper content - cat > deploy/server.js << 'EOF' -const express = require('express'); -const path = require('path'); -const app = express(); - -// Serve static files -app.use(express.static(path.join(__dirname))); - -// Handle React Router -app.get('/*', function(req, res) { - res.sendFile(path.join(__dirname, 'index.html')); -}); - -// Use environment PORT or default to 8080 -const port = process.env.PORT || 8080; - -app.listen(port, '0.0.0.0', () => { - console.log(`Server running on port ${port}`); -}); -EOF + # Create server.js file + echo "const express = require('express');" > deploy/server.js + echo "const path = require('path');" >> deploy/server.js + echo "const app = express();" >> deploy/server.js + echo "" >> deploy/server.js + echo "// Serve static files" >> deploy/server.js + echo "app.use(express.static(path.join(__dirname)));" >> deploy/server.js + echo "" >> deploy/server.js + echo "// Handle React Router" >> deploy/server.js + echo "app.get('/*', function(req, res) {" >> deploy/server.js + echo " res.sendFile(path.join(__dirname, 'index.html'));" >> deploy/server.js + echo "});" >> deploy/server.js + echo "" >> deploy/server.js + echo "// Use environment PORT or default to 8080" >> deploy/server.js + echo "const port = process.env.PORT || 8080;" >> deploy/server.js + echo "" >> deploy/server.js + echo "app.listen(port, '0.0.0.0', () => {" >> deploy/server.js + echo " console.log(\`Server running on port \${port}\`);" >> deploy/server.js + echo "});" >> deploy/server.js # Create package.json for deployment - cat > deploy/package.json << 'EOF' -{ - "name": "frontend", - "version": "1.0.0", - "private": true, - "scripts": { - "start": "node server.js" - }, - "dependencies": { - "express": "^4.18.2" - } -} -EOF + echo '{' > deploy/package.json + echo ' "name": "frontend",' >> deploy/package.json + echo ' "version": "1.0.0",' >> deploy/package.json + echo ' "private": true,' >> deploy/package.json + echo ' "scripts": {' >> deploy/package.json + echo ' "start": "node server.js"' >> deploy/package.json + echo ' },' >> deploy/package.json + echo ' "dependencies": {' >> deploy/package.json + echo ' "express": "^4.18.2"' >> deploy/package.json + echo ' }' >> deploy/package.json + echo '}' >> deploy/package.json # Verify files were created echo "=== Deployment package contents ===" From 9d1c1a8217b06c1ef98642e6d8784b9d0079a2a4 Mon Sep 17 00:00:00 2001 From: idittrich-valueon Date: Wed, 4 Jun 2025 12:28:17 +0200 Subject: [PATCH 11/32] Simplify deployment - use pre-created server.js file --- .github/workflows/int_poweron-nyla-int.yml | 23 +++------------------- deploy-server.js | 21 ++++++++++++++++++++ 2 files changed, 24 insertions(+), 20 deletions(-) create mode 100644 deploy-server.js diff --git a/.github/workflows/int_poweron-nyla-int.yml b/.github/workflows/int_poweron-nyla-int.yml index 597a361..7734429 100644 --- a/.github/workflows/int_poweron-nyla-int.yml +++ b/.github/workflows/int_poweron-nyla-int.yml @@ -36,26 +36,9 @@ jobs: # Copy all build files cp -r dist/* deploy/ - # Create server.js file - echo "const express = require('express');" > deploy/server.js - echo "const path = require('path');" >> deploy/server.js - echo "const app = express();" >> deploy/server.js - echo "" >> deploy/server.js - echo "// Serve static files" >> deploy/server.js - echo "app.use(express.static(path.join(__dirname)));" >> deploy/server.js - echo "" >> deploy/server.js - echo "// Handle React Router" >> deploy/server.js - echo "app.get('/*', function(req, res) {" >> deploy/server.js - echo " res.sendFile(path.join(__dirname, 'index.html'));" >> deploy/server.js - echo "});" >> deploy/server.js - echo "" >> deploy/server.js - echo "// Use environment PORT or default to 8080" >> deploy/server.js - echo "const port = process.env.PORT || 8080;" >> deploy/server.js - echo "" >> deploy/server.js - echo "app.listen(port, '0.0.0.0', () => {" >> deploy/server.js - echo " console.log(\`Server running on port \${port}\`);" >> deploy/server.js - echo "});" >> deploy/server.js - + # Copy the pre-created server file + cp deploy-server.js deploy/server.js + # Create package.json for deployment echo '{' > deploy/package.json echo ' "name": "frontend",' >> deploy/package.json diff --git a/deploy-server.js b/deploy-server.js new file mode 100644 index 0000000..8214b2c --- /dev/null +++ b/deploy-server.js @@ -0,0 +1,21 @@ +const express = require('express'); +const path = require('path'); +const app = express(); + +// Serve static files from current directory +app.use(express.static(path.join(__dirname))); + +// Handle React Router - send all requests to index.html +app.get('/*', function(req, res) { + res.sendFile(path.join(__dirname, 'index.html')); +}); + +// Use Azure's PORT environment variable or fallback to 8080 +const port = process.env.PORT || 8080; + +// Listen on all interfaces (important for Azure) +app.listen(port, '0.0.0.0', () => { + console.log(`Server running on port ${port}`); + console.log(`Environment: ${process.env.NODE_ENV || 'development'}`); + console.log(`Directory: ${__dirname}`); +}); \ No newline at end of file From c6998cc888646b1c08e8c20c6d7bd2e94100f207 Mon Sep 17 00:00:00 2001 From: idittrich-valueon Date: Wed, 4 Jun 2025 12:33:42 +0200 Subject: [PATCH 12/32] Fix ES module compatibility - convert server.js to ES module syntax --- .github/workflows/int_poweron-nyla-int.yml | 1 + deploy-server.js | 9 +++++++-- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/.github/workflows/int_poweron-nyla-int.yml b/.github/workflows/int_poweron-nyla-int.yml index 7734429..f0a478b 100644 --- a/.github/workflows/int_poweron-nyla-int.yml +++ b/.github/workflows/int_poweron-nyla-int.yml @@ -66,3 +66,4 @@ jobs: app-name: 'poweron-nyla' publish-profile: ${{ secrets.AZUREAPPSERVICE_PUBLISHPROFILE_D6C9359A57C5448A8C0BFA2D4C4B2068 }} package: ./deploy + clean: true diff --git a/deploy-server.js b/deploy-server.js index 8214b2c..dd43008 100644 --- a/deploy-server.js +++ b/deploy-server.js @@ -1,5 +1,10 @@ -const express = require('express'); -const path = require('path'); +import express from 'express'; +import path from 'path'; +import { fileURLToPath } from 'url'; + +const __filename = fileURLToPath(import.meta.url); +const __dirname = path.dirname(__filename); + const app = express(); // Serve static files from current directory From 97e119d15b5271549dd7ed77c956b41869ce1b71 Mon Sep 17 00:00:00 2001 From: idittrich-valueon Date: Wed, 4 Jun 2025 12:42:38 +0200 Subject: [PATCH 13/32] Add Express dependency for Azure --- .github/workflows/int_poweron-nyla-int.yml | 49 +- package-lock.json | 594 +++++++++++++++++++++ package.json | 4 +- 3 files changed, 620 insertions(+), 27 deletions(-) diff --git a/.github/workflows/int_poweron-nyla-int.yml b/.github/workflows/int_poweron-nyla-int.yml index f0a478b..5e0706c 100644 --- a/.github/workflows/int_poweron-nyla-int.yml +++ b/.github/workflows/int_poweron-nyla-int.yml @@ -28,42 +28,39 @@ jobs: - name: Build React app run: npm run build - - name: Prepare deployment package + - name: Create server.js for Azure run: | - # Create deployment package with build files and necessary configs - mkdir -p deploy + # Create ES module compatible server.js directly in root + cat > server.js << 'EOF' + import express from 'express'; + import path from 'path'; + import { fileURLToPath } from 'url'; - # Copy all build files - cp -r dist/* deploy/ + const __filename = fileURLToPath(import.meta.url); + const __dirname = path.dirname(__filename); - # Copy the pre-created server file - cp deploy-server.js deploy/server.js + const app = express(); - # Create package.json for deployment - echo '{' > deploy/package.json - echo ' "name": "frontend",' >> deploy/package.json - echo ' "version": "1.0.0",' >> deploy/package.json - echo ' "private": true,' >> deploy/package.json - echo ' "scripts": {' >> deploy/package.json - echo ' "start": "node server.js"' >> deploy/package.json - echo ' },' >> deploy/package.json - echo ' "dependencies": {' >> deploy/package.json - echo ' "express": "^4.18.2"' >> deploy/package.json - echo ' }' >> deploy/package.json - echo '}' >> deploy/package.json + app.use(express.static(path.join(__dirname, 'dist'))); - # Verify files were created - echo "=== Deployment package contents ===" - ls -la deploy/ + app.get('/*', function(req, res) { + res.sendFile(path.join(__dirname, 'dist', 'index.html')); + }); + + const port = process.env.PORT || 8080; + app.listen(port, '0.0.0.0', () => { + console.log(`Server running on port ${port}`); + console.log(`Serving from: ${__dirname}/dist`); + }); + EOF + + # Verify the file was created echo "=== server.js content ===" - cat deploy/server.js - echo "=== package.json content ===" - cat deploy/package.json + cat server.js - name: 'Deploy to Azure Web App' uses: azure/webapps-deploy@v3 with: app-name: 'poweron-nyla' publish-profile: ${{ secrets.AZUREAPPSERVICE_PUBLISHPROFILE_D6C9359A57C5448A8C0BFA2D4C4B2068 }} - package: ./deploy clean: true diff --git a/package-lock.json b/package-lock.json index 54f4896..d7d74d4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,6 +12,7 @@ "@azure/msal-react": "^3.0.12", "axios": "^1.8.3", "dotenv": "^16.0.3", + "express": "^4.18.2", "framer-motion": "^12.7.3", "fs": "^0.0.1-security", "js-cookie": "^3.0.5", @@ -1399,6 +1400,18 @@ "vite": "^4.2.0 || ^5.0.0 || ^6.0.0" } }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/acorn": { "version": "8.14.1", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.1.tgz", @@ -1457,6 +1470,11 @@ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "dev": true }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" + }, "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", @@ -1495,6 +1513,42 @@ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "dev": true }, + "node_modules/body-parser": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", + "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.1", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/body-parser/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/body-parser/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, "node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -1542,6 +1596,14 @@ "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==" }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/call-bind-apply-helpers": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", @@ -1554,6 +1616,21 @@ "node": ">= 0.4" } }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", @@ -1688,6 +1765,25 @@ "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", "dev": true }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/convert-source-map": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", @@ -1702,6 +1798,11 @@ "node": ">=18" } }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" + }, "node_modules/cross-spawn": { "version": "7.0.6", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", @@ -1763,6 +1864,14 @@ "node": ">=0.4.0" } }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/dequal": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", @@ -1771,6 +1880,15 @@ "node": ">=6" } }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, "node_modules/devlop": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", @@ -1815,12 +1933,25 @@ "safe-buffer": "^5.0.1" } }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" + }, "node_modules/electron-to-chromium": { "version": "1.5.158", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.158.tgz", "integrity": "sha512-9vcp2xHhkvraY6AHw2WMi+GDSLPX42qe2xjYaVoZqFRJiOcilVQFq9mZmpuHEQpzlgGDelKlV7ZiGcmMsc8WxQ==", "dev": true }, + "node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/es-define-property": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", @@ -1911,6 +2042,11 @@ "node": ">=6" } }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" + }, "node_modules/escape-string-regexp": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", @@ -2100,6 +2236,76 @@ "node": ">=0.10.0" } }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/express": { + "version": "4.18.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", + "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.1", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.5.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.2.0", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.11.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/express/node_modules/cookie": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/express/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/express/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, "node_modules/extend": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", @@ -2160,6 +2366,36 @@ "node": ">= 12" } }, + "node_modules/finalhandler": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, "node_modules/find-up": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", @@ -2228,6 +2464,14 @@ "node": ">= 6" } }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/framer-motion": { "version": "12.15.0", "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-12.15.0.tgz", @@ -2254,6 +2498,14 @@ } } }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/fs": { "version": "0.0.1-security", "resolved": "https://registry.npmjs.org/fs/-/fs-0.0.1-security.tgz", @@ -2452,6 +2704,32 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/ignore": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", @@ -2486,11 +2764,24 @@ "node": ">=0.8.19" } }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, "node_modules/inline-style-parser": { "version": "0.2.4", "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.2.4.tgz", "integrity": "sha512-0aO8FkhNZlj/ZIbNi7Lxxr12obT7cL1moPfE4tg1LkX7LlLfC6DeX4l2ZEud1ukP9jNQyNnfzQVqwbwmAATY4Q==" }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "engines": { + "node": ">= 0.10" + } + }, "node_modules/is-alphabetical": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-2.0.1.tgz", @@ -2955,6 +3246,27 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/micromark": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.2.tgz", @@ -3376,6 +3688,17 @@ } ] }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/mime-db": { "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", @@ -3474,6 +3797,14 @@ "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", "dev": true }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/node-releases": { "version": "2.0.19", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", @@ -3488,6 +3819,28 @@ "node": ">=0.10.0" } }, + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/optionator": { "version": "0.9.4", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", @@ -3570,6 +3923,14 @@ "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz", "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==" }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -3588,6 +3949,11 @@ "node": ">=8" } }, + "node_modules/path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" + }, "node_modules/pg": { "version": "8.16.0", "resolved": "https://registry.npmjs.org/pg/-/pg-8.16.0.tgz", @@ -3778,6 +4144,18 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, "node_modules/proxy-from-env": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", @@ -3792,6 +4170,42 @@ "node": ">=6" } }, + "node_modules/qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/react": { "version": "19.1.0", "resolved": "https://registry.npmjs.org/react/-/react-19.1.0.tgz", @@ -4009,6 +4423,11 @@ } ] }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, "node_modules/scheduler": { "version": "0.26.0", "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.26.0.tgz", @@ -4023,11 +4442,66 @@ "semver": "bin/semver.js" } }, + "node_modules/send": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/send/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/serve-static": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, "node_modules/set-cookie-parser": { "version": "2.7.1", "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.1.tgz", "integrity": "sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ==" }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -4049,6 +4523,74 @@ "node": ">=8" } }, + "node_modules/side-channel": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/source-map-js": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", @@ -4075,6 +4617,14 @@ "node": ">= 10.x" } }, + "node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/stringify-entities": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz", @@ -4144,6 +4694,14 @@ "url": "https://github.com/sponsors/SuperchupuDev" } }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "engines": { + "node": ">=0.6" + } + }, "node_modules/trim-lines": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz", @@ -4179,6 +4737,18 @@ "node": ">= 0.8.0" } }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/unified": { "version": "11.0.5", "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.5.tgz", @@ -4260,6 +4830,14 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/update-browserslist-db": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", @@ -4299,6 +4877,22 @@ "punycode": "^2.1.0" } }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/vfile": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz", diff --git a/package.json b/package.json index 297ea64..7cedb5b 100644 --- a/package.json +++ b/package.json @@ -7,13 +7,15 @@ "dev": "vite --port 5176", "build": "vite build", "lint": "eslint .", - "preview": "vite preview" + "preview": "vite preview", + "start": "node server.js" }, "dependencies": { "@azure/msal-browser": "^4.12.0", "@azure/msal-react": "^3.0.12", "axios": "^1.8.3", "dotenv": "^16.0.3", + "express": "^4.18.2", "framer-motion": "^12.7.3", "fs": "^0.0.1-security", "js-cookie": "^3.0.5", From f67c5202c992ccfae4c338ccacb7528f99c7d9fc Mon Sep 17 00:00:00 2001 From: idittrich-valueon Date: Wed, 4 Jun 2025 12:52:21 +0200 Subject: [PATCH 14/32] Fix workflow server.js creation with proper echo syntax --- .github/workflows/int_poweron-nyla-int.yml | 42 +++++++++++----------- 1 file changed, 20 insertions(+), 22 deletions(-) diff --git a/.github/workflows/int_poweron-nyla-int.yml b/.github/workflows/int_poweron-nyla-int.yml index 5e0706c..e4bb2bf 100644 --- a/.github/workflows/int_poweron-nyla-int.yml +++ b/.github/workflows/int_poweron-nyla-int.yml @@ -31,28 +31,26 @@ jobs: - name: Create server.js for Azure run: | # Create ES module compatible server.js directly in root - cat > server.js << 'EOF' - import express from 'express'; - import path from 'path'; - import { fileURLToPath } from 'url'; - - const __filename = fileURLToPath(import.meta.url); - const __dirname = path.dirname(__filename); - - const app = express(); - - app.use(express.static(path.join(__dirname, 'dist'))); - - app.get('/*', function(req, res) { - res.sendFile(path.join(__dirname, 'dist', 'index.html')); - }); - - const port = process.env.PORT || 8080; - app.listen(port, '0.0.0.0', () => { - console.log(`Server running on port ${port}`); - console.log(`Serving from: ${__dirname}/dist`); - }); - EOF + echo "import express from 'express';" > server.js + echo "import path from 'path';" >> server.js + echo "import { fileURLToPath } from 'url';" >> server.js + echo "" >> server.js + echo "const __filename = fileURLToPath(import.meta.url);" >> server.js + echo "const __dirname = path.dirname(__filename);" >> server.js + echo "" >> server.js + echo "const app = express();" >> server.js + echo "" >> server.js + echo "app.use(express.static(path.join(__dirname, 'dist')));" >> server.js + echo "" >> server.js + echo "app.get('/*', function(req, res) {" >> server.js + echo " res.sendFile(path.join(__dirname, 'dist', 'index.html'));" >> server.js + echo "});" >> server.js + echo "" >> server.js + echo "const port = process.env.PORT || 8080;" >> server.js + echo "app.listen(port, '0.0.0.0', () => {" >> server.js + echo " console.log(\`Server running on port \${port}\`);" >> server.js + echo " console.log(\`Serving from: \${__dirname}/dist\`);" >> server.js + echo "});" >> server.js # Verify the file was created echo "=== server.js content ===" From c18e8b357b8f5bdb471e41e5a745bfb78ccf179d Mon Sep 17 00:00:00 2001 From: idittrich-valueon <137774853+idittrich-valueon@users.noreply.github.com> Date: Wed, 4 Jun 2025 21:07:57 +0200 Subject: [PATCH 15/32] Add or update the Azure App Service build and deployment workflow config --- .github/workflows/int_poweron-nyla-int.yml | 98 ++++++++++++---------- 1 file changed, 54 insertions(+), 44 deletions(-) diff --git a/.github/workflows/int_poweron-nyla-int.yml b/.github/workflows/int_poweron-nyla-int.yml index e4bb2bf..aba9f9a 100644 --- a/.github/workflows/int_poweron-nyla-int.yml +++ b/.github/workflows/int_poweron-nyla-int.yml @@ -1,64 +1,74 @@ -name: Deploy React App to Azure Web App +# Docs for the Azure Web Apps Deploy action: https://github.com/Azure/webapps-deploy +# More GitHub Actions for Azure: https://github.com/Azure/actions + +name: Build and deploy Node.js app to Azure Web App - poweron-nyla-int on: push: branches: - - int # oder dein Branch - workflow_dispatch: # Ermöglicht manuelles Triggern + - int + workflow_dispatch: jobs: - build-and-deploy: + build: runs-on: ubuntu-latest + permissions: + contents: read #This is required for actions/checkout steps: - - name: Checkout Code - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - - name: Setup Node.js + - name: Set up Node.js version uses: actions/setup-node@v3 with: - node-version: '18' - cache: 'npm' # Aktiviert Caching für schnellere Builds + node-version: '18.x' - - name: Install dependencies + - name: npm install, build, and test run: | - npm ci - npm install express + npm install + npm run build --if-present + npm run test --if-present - - name: Build React app - run: npm run build + - name: Zip artifact for deployment + run: zip release.zip ./* -r - - name: Create server.js for Azure - run: | - # Create ES module compatible server.js directly in root - echo "import express from 'express';" > server.js - echo "import path from 'path';" >> server.js - echo "import { fileURLToPath } from 'url';" >> server.js - echo "" >> server.js - echo "const __filename = fileURLToPath(import.meta.url);" >> server.js - echo "const __dirname = path.dirname(__filename);" >> server.js - echo "" >> server.js - echo "const app = express();" >> server.js - echo "" >> server.js - echo "app.use(express.static(path.join(__dirname, 'dist')));" >> server.js - echo "" >> server.js - echo "app.get('/*', function(req, res) {" >> server.js - echo " res.sendFile(path.join(__dirname, 'dist', 'index.html'));" >> server.js - echo "});" >> server.js - echo "" >> server.js - echo "const port = process.env.PORT || 8080;" >> server.js - echo "app.listen(port, '0.0.0.0', () => {" >> server.js - echo " console.log(\`Server running on port \${port}\`);" >> server.js - echo " console.log(\`Serving from: \${__dirname}/dist\`);" >> server.js - echo "});" >> server.js - - # Verify the file was created - echo "=== server.js content ===" - cat server.js + - name: Upload artifact for deployment job + uses: actions/upload-artifact@v4 + with: + name: node-app + path: release.zip + + deploy: + runs-on: ubuntu-latest + needs: build + environment: + name: 'Production' + url: ${{ steps.deploy-to-webapp.outputs.webapp-url }} + permissions: + id-token: write #This is required for requesting the JWT + contents: read #This is required for actions/checkout + + steps: + - name: Download artifact from build job + uses: actions/download-artifact@v4 + with: + name: node-app + + - name: Unzip artifact for deployment + run: unzip release.zip + + - name: Login to Azure + uses: azure/login@v2 + with: + client-id: ${{ secrets.AZUREAPPSERVICE_CLIENTID_F22B84BEF16242F48E913761794EFA64 }} + tenant-id: ${{ secrets.AZUREAPPSERVICE_TENANTID_91A621FECC4E4239B35E8842FAD714A4 }} + subscription-id: ${{ secrets.AZUREAPPSERVICE_SUBSCRIPTIONID_89F1F8736D6D4566AF238A83525E0BD5 }} - name: 'Deploy to Azure Web App' + id: deploy-to-webapp uses: azure/webapps-deploy@v3 with: - app-name: 'poweron-nyla' - publish-profile: ${{ secrets.AZUREAPPSERVICE_PUBLISHPROFILE_D6C9359A57C5448A8C0BFA2D4C4B2068 }} - clean: true + app-name: 'poweron-nyla-int' + slot-name: 'Production' + package: . + \ No newline at end of file From 0c8d15b268cdce4e457d1d23e1cec63231a1d95d Mon Sep 17 00:00:00 2001 From: idittrich-valueon Date: Wed, 4 Jun 2025 21:21:42 +0200 Subject: [PATCH 16/32] test --- .github/workflows/int_poweron-nyla-int.yml | 89 +++++++++++----------- 1 file changed, 46 insertions(+), 43 deletions(-) diff --git a/.github/workflows/int_poweron-nyla-int.yml b/.github/workflows/int_poweron-nyla-int.yml index e4bb2bf..b9f446d 100644 --- a/.github/workflows/int_poweron-nyla-int.yml +++ b/.github/workflows/int_poweron-nyla-int.yml @@ -1,64 +1,67 @@ -name: Deploy React App to Azure Web App +name: Build and deploy Node.js app to Azure Web App - poweron-nyla-int on: push: branches: - - int # oder dein Branch - workflow_dispatch: # Ermöglicht manuelles Triggern + - int + workflow_dispatch: jobs: - build-and-deploy: + build: runs-on: ubuntu-latest steps: - - name: Checkout Code - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - - name: Setup Node.js + - name: Set up Node.js version uses: actions/setup-node@v3 with: node-version: '18' - cache: 'npm' # Aktiviert Caching für schnellere Builds + cache: 'npm' - - name: Install dependencies + - name: npm install, build run: | npm ci - npm install express + npm run build --if-present - - name: Build React app - run: npm run build + - name: Zip artifact for deployment + run: zip release.zip ./* -r - - name: Create server.js for Azure - run: | - # Create ES module compatible server.js directly in root - echo "import express from 'express';" > server.js - echo "import path from 'path';" >> server.js - echo "import { fileURLToPath } from 'url';" >> server.js - echo "" >> server.js - echo "const __filename = fileURLToPath(import.meta.url);" >> server.js - echo "const __dirname = path.dirname(__filename);" >> server.js - echo "" >> server.js - echo "const app = express();" >> server.js - echo "" >> server.js - echo "app.use(express.static(path.join(__dirname, 'dist')));" >> server.js - echo "" >> server.js - echo "app.get('/*', function(req, res) {" >> server.js - echo " res.sendFile(path.join(__dirname, 'dist', 'index.html'));" >> server.js - echo "});" >> server.js - echo "" >> server.js - echo "const port = process.env.PORT || 8080;" >> server.js - echo "app.listen(port, '0.0.0.0', () => {" >> server.js - echo " console.log(\`Server running on port \${port}\`);" >> server.js - echo " console.log(\`Serving from: \${__dirname}/dist\`);" >> server.js - echo "});" >> server.js - - # Verify the file was created - echo "=== server.js content ===" - cat server.js + - name: Upload artifact for deployment job + uses: actions/upload-artifact@v3 + with: + name: node-app + path: release.zip + + deploy: + runs-on: ubuntu-latest + needs: build + environment: + name: 'Production' + url: ${{ steps.deploy-to-webapp.outputs.webapp-url }} + permissions: + id-token: write #This is required for requesting the JWT + + steps: + - name: Download artifact from build job + uses: actions/download-artifact@v3 + with: + name: node-app + + - name: Unzip artifact for deployment + run: unzip release.zip + + - name: Login to Azure + uses: azure/login@v1 + with: + client-id: ${{ secrets.AZUREAPPSERVICE_CLIENTID_XXXXXXXXXXXXXXXX }} + tenant-id: ${{ secrets.AZUREAPPSERVICE_TENANTID_XXXXXXXXXXXXXXXX }} + subscription-id: ${{ secrets.AZUREAPPSERVICE_SUBSCRIPTIONID_XXXXXXXXXXXXXXXX }} - name: 'Deploy to Azure Web App' - uses: azure/webapps-deploy@v3 + id: deploy-to-webapp + uses: azure/webapps-deploy@v2 with: - app-name: 'poweron-nyla' - publish-profile: ${{ secrets.AZUREAPPSERVICE_PUBLISHPROFILE_D6C9359A57C5448A8C0BFA2D4C4B2068 }} - clean: true + app-name: 'poweron-nyla-int' + slot-name: 'Production' + package: . \ No newline at end of file From 05777e4ed291c9bd2c7f3af0892de7c2d7ce0c18 Mon Sep 17 00:00:00 2001 From: idittrich-valueon Date: Wed, 4 Jun 2025 21:23:12 +0200 Subject: [PATCH 17/32] test --- .github/workflows/int_poweron-nyla-int.yml | 152 +++++++++++++++------ 1 file changed, 114 insertions(+), 38 deletions(-) diff --git a/.github/workflows/int_poweron-nyla-int.yml b/.github/workflows/int_poweron-nyla-int.yml index 3fd01c6..fce4169 100644 --- a/.github/workflows/int_poweron-nyla-int.yml +++ b/.github/workflows/int_poweron-nyla-int.yml @@ -1,4 +1,74 @@ -name: Deploy React App to Azure Web App +name: Build and deploy Node.js app to Azure Web App - poweron-nyla-int + +on: + push: + branches: + - int + workflow_dispatch: + +jobs: + build: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v4 + + - name: Set up Node.js version + uses: actions/setup-node@v3 + with: + node-version: '18' + cache: 'npm' + + - name: npm install, build + run: | + npm ci + npm run build --if-present + + - name: Zip artifact for deployment + run: zip release.zip ./* -r + + - name: Upload artifact for deployment job + uses: actions/upload-artifact@v3 + with: + name: node-app + path: release.zip + + deploy: + runs-on: ubuntu-latest + needs: build + environment: + name: 'Production' + url: ${{ steps.deploy-to-webapp.outputs.webapp-url }} + permissions: + id-token: write #This is required for requesting the JWT + + steps: + - name: Download artifact from build job + uses: actions/download-artifact@v3 + with: + name: node-app + + - name: Unzip artifact for deployment + run: unzip release.zip + + - name: Login to Azure + uses: azure/login@v1 + with: + client-id: ${{ secrets.AZUREAPPSERVICE_CLIENTID_XXXXXXXXXXXXXXXX }} + tenant-id: ${{ secrets.AZUREAPPSERVICE_TENANTID_XXXXXXXXXXXXXXXX }} + subscription-id: ${{ secrets.AZUREAPPSERVICE_SUBSCRIPTIONID_XXXXXXXXXXXXXXXX }} + + - name: 'Deploy to Azure Web App' + id: deploy-to-webapp + uses: azure/webapps-deploy@v2 + with: + app-name: 'poweron-nyla-int' + slot-name: 'Production' + package: . +# Docs for the Azure Web Apps Deploy action: https://github.com/Azure/webapps-deploy +# More GitHub Actions for Azure: https://github.com/Azure/actions + +name: Build and deploy Node.js app to Azure Web App - poweron-nyla-int on: push: @@ -18,48 +88,54 @@ jobs: - name: Set up Node.js version uses: actions/setup-node@v3 with: - node-version: '18' - cache: 'npm' # Aktiviert Caching für schnellere Builds + node-version: '18.x' - - name: Install dependencies + - name: npm install, build, and test run: | - npm ci - npm install express + npm install + npm run build --if-present + npm run test --if-present - - name: Build React app - run: npm run build + - name: Zip artifact for deployment + run: zip release.zip ./* -r - - name: Create server.js for Azure - run: | - # Create ES module compatible server.js directly in root - echo "import express from 'express';" > server.js - echo "import path from 'path';" >> server.js - echo "import { fileURLToPath } from 'url';" >> server.js - echo "" >> server.js - echo "const __filename = fileURLToPath(import.meta.url);" >> server.js - echo "const __dirname = path.dirname(__filename);" >> server.js - echo "" >> server.js - echo "const app = express();" >> server.js - echo "" >> server.js - echo "app.use(express.static(path.join(__dirname, 'dist')));" >> server.js - echo "" >> server.js - echo "app.get('/*', function(req, res) {" >> server.js - echo " res.sendFile(path.join(__dirname, 'dist', 'index.html'));" >> server.js - echo "});" >> server.js - echo "" >> server.js - echo "const port = process.env.PORT || 8080;" >> server.js - echo "app.listen(port, '0.0.0.0', () => {" >> server.js - echo " console.log(\`Server running on port \${port}\`);" >> server.js - echo " console.log(\`Serving from: \${__dirname}/dist\`);" >> server.js - echo "});" >> server.js - - # Verify the file was created - echo "=== server.js content ===" - cat server.js + - name: Upload artifact for deployment job + uses: actions/upload-artifact@v4 + with: + name: node-app + path: release.zip + + deploy: + runs-on: ubuntu-latest + needs: build + environment: + name: 'Production' + url: ${{ steps.deploy-to-webapp.outputs.webapp-url }} + permissions: + id-token: write #This is required for requesting the JWT + contents: read #This is required for actions/checkout + + steps: + - name: Download artifact from build job + uses: actions/download-artifact@v4 + with: + name: node-app + + - name: Unzip artifact for deployment + run: unzip release.zip + + - name: Login to Azure + uses: azure/login@v2 + with: + client-id: ${{ secrets.AZUREAPPSERVICE_CLIENTID_F22B84BEF16242F48E913761794EFA64 }} + tenant-id: ${{ secrets.AZUREAPPSERVICE_TENANTID_91A621FECC4E4239B35E8842FAD714A4 }} + subscription-id: ${{ secrets.AZUREAPPSERVICE_SUBSCRIPTIONID_89F1F8736D6D4566AF238A83525E0BD5 }} - name: 'Deploy to Azure Web App' + id: deploy-to-webapp uses: azure/webapps-deploy@v3 with: - app-name: 'poweron-nyla' - publish-profile: ${{ secrets.AZUREAPPSERVICE_PUBLISHPROFILE_D6C9359A57C5448A8C0BFA2D4C4B2068 }} - clean: true + app-name: 'poweron-nyla-int' + slot-name: 'Production' + package: . + \ No newline at end of file From 2486b485e3f49e645fd8688ac565665c49eda28a Mon Sep 17 00:00:00 2001 From: idittrich-valueon Date: Wed, 4 Jun 2025 21:25:42 +0200 Subject: [PATCH 18/32] test again --- .github/workflows/int_poweron-nyla-int.yml | 76 +--------------------- 1 file changed, 1 insertion(+), 75 deletions(-) diff --git a/.github/workflows/int_poweron-nyla-int.yml b/.github/workflows/int_poweron-nyla-int.yml index fce4169..b9f446d 100644 --- a/.github/workflows/int_poweron-nyla-int.yml +++ b/.github/workflows/int_poweron-nyla-int.yml @@ -64,78 +64,4 @@ jobs: with: app-name: 'poweron-nyla-int' slot-name: 'Production' - package: . -# Docs for the Azure Web Apps Deploy action: https://github.com/Azure/webapps-deploy -# More GitHub Actions for Azure: https://github.com/Azure/actions - -name: Build and deploy Node.js app to Azure Web App - poweron-nyla-int - -on: - push: - branches: - - int - workflow_dispatch: - -jobs: - build: - runs-on: ubuntu-latest - permissions: - contents: read #This is required for actions/checkout - - steps: - - uses: actions/checkout@v4 - - - name: Set up Node.js version - uses: actions/setup-node@v3 - with: - node-version: '18.x' - - - name: npm install, build, and test - run: | - npm install - npm run build --if-present - npm run test --if-present - - - name: Zip artifact for deployment - run: zip release.zip ./* -r - - - name: Upload artifact for deployment job - uses: actions/upload-artifact@v4 - with: - name: node-app - path: release.zip - - deploy: - runs-on: ubuntu-latest - needs: build - environment: - name: 'Production' - url: ${{ steps.deploy-to-webapp.outputs.webapp-url }} - permissions: - id-token: write #This is required for requesting the JWT - contents: read #This is required for actions/checkout - - steps: - - name: Download artifact from build job - uses: actions/download-artifact@v4 - with: - name: node-app - - - name: Unzip artifact for deployment - run: unzip release.zip - - - name: Login to Azure - uses: azure/login@v2 - with: - client-id: ${{ secrets.AZUREAPPSERVICE_CLIENTID_F22B84BEF16242F48E913761794EFA64 }} - tenant-id: ${{ secrets.AZUREAPPSERVICE_TENANTID_91A621FECC4E4239B35E8842FAD714A4 }} - subscription-id: ${{ secrets.AZUREAPPSERVICE_SUBSCRIPTIONID_89F1F8736D6D4566AF238A83525E0BD5 }} - - - name: 'Deploy to Azure Web App' - id: deploy-to-webapp - uses: azure/webapps-deploy@v3 - with: - app-name: 'poweron-nyla-int' - slot-name: 'Production' - package: . - \ No newline at end of file + package: . \ No newline at end of file From 0997719e33c0455dba601666218c0d70015ad473 Mon Sep 17 00:00:00 2001 From: idittrich-valueon Date: Wed, 4 Jun 2025 21:28:50 +0200 Subject: [PATCH 19/32] deleted main yml file --- .github/workflows/main_poweron-nyla.yml | 1 - 1 file changed, 1 deletion(-) delete mode 100644 .github/workflows/main_poweron-nyla.yml diff --git a/.github/workflows/main_poweron-nyla.yml b/.github/workflows/main_poweron-nyla.yml deleted file mode 100644 index d3f5a12..0000000 --- a/.github/workflows/main_poweron-nyla.yml +++ /dev/null @@ -1 +0,0 @@ - From 5980771b55a4382a5ca13c6b2e89a2825036c6fb Mon Sep 17 00:00:00 2001 From: idittrich-valueon Date: Wed, 4 Jun 2025 21:30:25 +0200 Subject: [PATCH 20/32] updated yml file --- .github/workflows/int_poweron-nyla-int.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/int_poweron-nyla-int.yml b/.github/workflows/int_poweron-nyla-int.yml index b9f446d..e64a22b 100644 --- a/.github/workflows/int_poweron-nyla-int.yml +++ b/.github/workflows/int_poweron-nyla-int.yml @@ -14,7 +14,7 @@ jobs: - uses: actions/checkout@v4 - name: Set up Node.js version - uses: actions/setup-node@v3 + uses: actions/setup-node@v4 with: node-version: '18' cache: 'npm' @@ -28,7 +28,7 @@ jobs: run: zip release.zip ./* -r - name: Upload artifact for deployment job - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: name: node-app path: release.zip @@ -44,7 +44,7 @@ jobs: steps: - name: Download artifact from build job - uses: actions/download-artifact@v3 + uses: actions/download-artifact@v4 with: name: node-app From 2e9b5e7216c73671600d23f860f6bf50873b0e45 Mon Sep 17 00:00:00 2001 From: idittrich-valueon Date: Wed, 4 Jun 2025 21:34:30 +0200 Subject: [PATCH 21/32] added secrets --- .github/workflows/int_poweron-nyla-int.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/int_poweron-nyla-int.yml b/.github/workflows/int_poweron-nyla-int.yml index e64a22b..756e8cb 100644 --- a/.github/workflows/int_poweron-nyla-int.yml +++ b/.github/workflows/int_poweron-nyla-int.yml @@ -54,9 +54,9 @@ jobs: - name: Login to Azure uses: azure/login@v1 with: - client-id: ${{ secrets.AZUREAPPSERVICE_CLIENTID_XXXXXXXXXXXXXXXX }} - tenant-id: ${{ secrets.AZUREAPPSERVICE_TENANTID_XXXXXXXXXXXXXXXX }} - subscription-id: ${{ secrets.AZUREAPPSERVICE_SUBSCRIPTIONID_XXXXXXXXXXXXXXXX }} + client-id: ${{ secrets.AZUREAPPSERVICE_CLIENTID_F22B84BEF16242F48E913761794EFA64 }} + tenant-id: ${{ secrets.AZUREAPPSERVICE_TENANTID_91A621FECC4E4239B35E8842FAD714A4 }} + subscription-id: ${{ secrets.AZUREAPPSERVICE_SUBSCRIPTIONID_89F1F8736D6D4566AF238A83525E0BD5 }} - name: 'Deploy to Azure Web App' id: deploy-to-webapp From 3f82878eb0b782ade60744438d81c0ca4f88a970 Mon Sep 17 00:00:00 2001 From: idittrich-valueon Date: Wed, 4 Jun 2025 21:40:04 +0200 Subject: [PATCH 22/32] fixed modules --- .github/workflows/int_poweron-nyla-int.yml | 2 +- server.js | 9 +++++++-- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/.github/workflows/int_poweron-nyla-int.yml b/.github/workflows/int_poweron-nyla-int.yml index 756e8cb..cc3e3e2 100644 --- a/.github/workflows/int_poweron-nyla-int.yml +++ b/.github/workflows/int_poweron-nyla-int.yml @@ -25,7 +25,7 @@ jobs: npm run build --if-present - name: Zip artifact for deployment - run: zip release.zip ./* -r + run: zip release.zip ./* -r -x "node_modules/*" ".git/*" "*.md" ".github/*" - name: Upload artifact for deployment job uses: actions/upload-artifact@v4 diff --git a/server.js b/server.js index bd5984e..4943d52 100644 --- a/server.js +++ b/server.js @@ -1,5 +1,10 @@ -const express = require('express'); -const path = require('path'); +import express from 'express'; +import path from 'path'; +import { fileURLToPath } from 'url'; + +const __filename = fileURLToPath(import.meta.url); +const __dirname = path.dirname(__filename); + const app = express(); // Serve static files from the dist directory From 98445d9c5f56377fec2373d936f7aa7618bf2cab Mon Sep 17 00:00:00 2001 From: idittrich-valueon Date: Wed, 4 Jun 2025 21:49:42 +0200 Subject: [PATCH 23/32] fixed yml --- .github/workflows/int_poweron-nyla-int.yml | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/.github/workflows/int_poweron-nyla-int.yml b/.github/workflows/int_poweron-nyla-int.yml index cc3e3e2..e42dec1 100644 --- a/.github/workflows/int_poweron-nyla-int.yml +++ b/.github/workflows/int_poweron-nyla-int.yml @@ -24,14 +24,16 @@ jobs: npm ci npm run build --if-present - - name: Zip artifact for deployment - run: zip release.zip ./* -r -x "node_modules/*" ".git/*" "*.md" ".github/*" - - name: Upload artifact for deployment job uses: actions/upload-artifact@v4 with: name: node-app - path: release.zip + path: | + . + !node_modules + !.git + !.github + !README.md deploy: runs-on: ubuntu-latest @@ -48,9 +50,6 @@ jobs: with: name: node-app - - name: Unzip artifact for deployment - run: unzip release.zip - - name: Login to Azure uses: azure/login@v1 with: From 4dc5ed84b89e6a6bf555ca56e561c84bc080f35f Mon Sep 17 00:00:00 2001 From: idittrich-valueon Date: Wed, 4 Jun 2025 22:09:41 +0200 Subject: [PATCH 24/32] renamed github actions --- .github/workflows/int_poweron-nyla-int.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/int_poweron-nyla-int.yml b/.github/workflows/int_poweron-nyla-int.yml index e42dec1..93f6eea 100644 --- a/.github/workflows/int_poweron-nyla-int.yml +++ b/.github/workflows/int_poweron-nyla-int.yml @@ -1,5 +1,4 @@ -name: Build and deploy Node.js app to Azure Web App - poweron-nyla-int - +name: Build and deploy Nyla App to int on: push: branches: From 29d0c8a2a297e82a8a46bb7204868592d318a7de Mon Sep 17 00:00:00 2001 From: idittrich-valueon Date: Mon, 16 Jun 2025 09:40:38 +0200 Subject: [PATCH 25/32] changed base url --- src/api.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/api.ts b/src/api.ts index 4699eed..6fda148 100644 --- a/src/api.ts +++ b/src/api.ts @@ -2,7 +2,7 @@ import axios from 'axios'; const api = axios.create({ - baseURL: 'https://gateway.poweron-center.net', + baseURL: 'https://gateway-int.poweron-center.net', //baseURL: 'http://localhost:8000', withCredentials: true }); From 6a70ebb2a24cb5fca3fe0b4bec294bb95db07ab1 Mon Sep 17 00:00:00 2001 From: idittrich-valueon Date: Mon, 16 Jun 2025 09:51:32 +0200 Subject: [PATCH 26/32] updated environment file --- .env | 3 +-- .env.production | 7 +++++++ .gitignore | 5 +++++ src/api.ts | 3 +-- 4 files changed, 14 insertions(+), 4 deletions(-) create mode 100644 .env.production diff --git a/.env b/.env index 3d34738..d5b5a6c 100644 --- a/.env +++ b/.env @@ -1,5 +1,4 @@ -VITE_API_URL="https://gateway.poweron-center.net" -#VITE_API_URL="http://127.0.0.1:8000" +VITE_API_URL="http://127.0.0.1:8000" VITE_MICROSOFT_CLIENT_ID="24cd6c8a-b592-4905-a5ba-d5fa9f911154" VITE_MICROSOFT_TENANT_ID="6a51aaeb-2467-4186-9504-2a05aedc591f" VITE_ENTRA_CLIENT_SECRET="2iw8Q~jwqG1iacxHopBt5pstu6R45UC1gIQabcbD" diff --git a/.env.production b/.env.production new file mode 100644 index 0000000..96d54dc --- /dev/null +++ b/.env.production @@ -0,0 +1,7 @@ +VITE_API_URL="https://gateway-int.poweron-center.net" +VITE_MICROSOFT_CLIENT_ID="24cd6c8a-b592-4905-a5ba-d5fa9f911154" +VITE_MICROSOFT_TENANT_ID="6a51aaeb-2467-4186-9504-2a05aedc591f" +VITE_ENTRA_CLIENT_SECRET="2iw8Q~jwqG1iacxHopBt5pstu6R45UC1gIQabcbD" +VITE_ENTRA_AUTHORITY="https://login.microsoftonline.com/6a51aaeb-2467-4186-9504-2a05aedc591f" +VITE_ENTRA_REDIRECT_PATH="/auth/callback/" +VITE_ENTRA_REDIRECT_URI="https://gateway.poweron-center.net/api/msft/auth/callback/" diff --git a/.gitignore b/.gitignore index a547bf3..5cbc969 100644 --- a/.gitignore +++ b/.gitignore @@ -22,3 +22,8 @@ dist-ssr *.njsproj *.sln *.sw? + +# Environment files +.env +.env.local +.env.*.local \ No newline at end of file diff --git a/src/api.ts b/src/api.ts index 6fda148..79eb618 100644 --- a/src/api.ts +++ b/src/api.ts @@ -2,8 +2,7 @@ import axios from 'axios'; const api = axios.create({ - baseURL: 'https://gateway-int.poweron-center.net', - //baseURL: 'http://localhost:8000', + baseURL: import.meta.env.VITE_API_BASE_URL, withCredentials: true }); From 970147816e682612f90db89250d054d22a09435a Mon Sep 17 00:00:00 2001 From: idittrich-valueon Date: Mon, 16 Jun 2025 10:08:13 +0200 Subject: [PATCH 27/32] updated base url --- .env | 2 +- .env.production | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.env b/.env index d5b5a6c..cccab81 100644 --- a/.env +++ b/.env @@ -1,4 +1,4 @@ -VITE_API_URL="http://127.0.0.1:8000" +VITE_API_BASE_URL="http://localhost:8000" VITE_MICROSOFT_CLIENT_ID="24cd6c8a-b592-4905-a5ba-d5fa9f911154" VITE_MICROSOFT_TENANT_ID="6a51aaeb-2467-4186-9504-2a05aedc591f" VITE_ENTRA_CLIENT_SECRET="2iw8Q~jwqG1iacxHopBt5pstu6R45UC1gIQabcbD" diff --git a/.env.production b/.env.production index 96d54dc..3a4c552 100644 --- a/.env.production +++ b/.env.production @@ -1,4 +1,4 @@ -VITE_API_URL="https://gateway-int.poweron-center.net" +VITE_API_BASE_URL="https://gateway-int.poweron-center.net" VITE_MICROSOFT_CLIENT_ID="24cd6c8a-b592-4905-a5ba-d5fa9f911154" VITE_MICROSOFT_TENANT_ID="6a51aaeb-2467-4186-9504-2a05aedc591f" VITE_ENTRA_CLIENT_SECRET="2iw8Q~jwqG1iacxHopBt5pstu6R45UC1gIQabcbD" From 5b21a3bfce387963615d2ee7091ca2e2c600ba02 Mon Sep 17 00:00:00 2001 From: idittrich-valueon Date: Mon, 16 Jun 2025 10:20:49 +0200 Subject: [PATCH 28/32] updated base url again --- .github/workflows/int_poweron-nyla-int.yml | 10 ++++++++++ src/hooks/useAuthentication.ts | 2 +- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/.github/workflows/int_poweron-nyla-int.yml b/.github/workflows/int_poweron-nyla-int.yml index 93f6eea..36a503d 100644 --- a/.github/workflows/int_poweron-nyla-int.yml +++ b/.github/workflows/int_poweron-nyla-int.yml @@ -18,6 +18,16 @@ jobs: node-version: '18' cache: 'npm' + - name: Create production environment file + run: | + echo 'VITE_API_BASE_URL="https://gateway-int.poweron-center.net"' > .env.production + echo 'VITE_MICROSOFT_CLIENT_ID="24cd6c8a-b592-4905-a5ba-d5fa9f911154"' >> .env.production + echo 'VITE_MICROSOFT_TENANT_ID="6a51aaeb-2467-4186-9504-2a05aedc591f"' >> .env.production + echo 'VITE_ENTRA_CLIENT_SECRET="2iw8Q~jwqG1iacxHopBt5pstu6R45UC1gIQabcbD"' >> .env.production + echo 'VITE_ENTRA_AUTHORITY="https://login.microsoftonline.com/6a51aaeb-2467-4186-9504-2a05aedc591f"' >> .env.production + echo 'VITE_ENTRA_REDIRECT_PATH="/auth/callback/"' >> .env.production + echo 'VITE_ENTRA_REDIRECT_URI="https://gateway-int.poweron-center.net/api/msft/auth/callback/"' >> .env.production + - name: npm install, build run: | npm ci diff --git a/src/hooks/useAuthentication.ts b/src/hooks/useAuthentication.ts index b0094a6..7882250 100644 --- a/src/hooks/useAuthentication.ts +++ b/src/hooks/useAuthentication.ts @@ -32,7 +32,7 @@ export function useAuth() { // Create a custom axios instance for this request const instance = axios.create({ - baseURL: 'https://gateway.poweron-center.net', + baseURL: import.meta.env.VITE_API_BASE_URL, withCredentials: true, headers: { 'Content-Type': 'application/x-www-form-urlencoded' From 29fde91580cffa982bf2d35d86b9cc00152fba41 Mon Sep 17 00:00:00 2001 From: idittrich-valueon Date: Mon, 16 Jun 2025 14:15:13 +0200 Subject: [PATCH 29/32] added new logo and styling --- src/App.tsx | 4 + src/assets/LogoPowerOn.png | Bin 1556 -> 0 bytes src/assets/background.png | Bin 1673 -> 0 bytes src/assets/{ => logos}/Frame 43.png | Bin src/assets/logos/PowerOn Details.PNG | Bin 0 -> 40428 bytes src/assets/logos/PowerOn.png | Bin 0 -> 61568 bytes src/assets/logos/PowerOn_transparent.png | Bin 0 -> 72631 bytes src/assets/react.svg | 1 - src/assets/styles/dark.css | 28 +++ src/assets/styles/light.css | 55 +++++ .../DashboardChat/DashboardChat.module.css | 89 ++++---- .../DashboardChatArea.module.css | 199 +++++++++-------- .../DashboardChatAreaMessageItem.tsx | 9 + .../FilePreviewPopup.module.css | 205 +++++++++--------- .../DashboardChatHistory.module.css | 31 ++- .../DashboardChatHistoryItem.module.css | 52 +++-- .../DashboardChatHistoryItem.tsx | 18 +- .../DashboardLog/DashboardLog.module.css | 15 +- .../DashboardPrompt.module.css | 20 +- .../DashboardPromptSet.module.css | 35 +-- .../DashboardPromptSetItem.module.css | 52 +++-- .../DashboardPromptSettings.module.css | 14 +- .../DateienSelector.module.css | 71 +++--- .../DateienUploadTool.module.css | 69 +++--- src/components/Dateien/DateienItem.module.css | 46 ++-- .../Dateien/DateienLists.module.css | 20 +- .../Mitglieder/MitgliederItem.module.css | 14 +- src/components/Sidebar/Sidebar.module.css | 13 +- src/components/Sidebar/Sidebar.tsx | 2 +- src/components/Sidebar/SidebarData.tsx | 2 +- src/components/Sidebar/SidebarItem.module.css | 10 +- .../Sidebar/SidebarSubmenu.module.css | 9 +- src/components/Sidebar/SidebarUser.module.css | 18 +- src/pages/Dashboard.module.css | 1 + src/pages/Dateien/Dateien.module.css | 24 +- .../Einstellungen/Einstellungen.module.css | 168 ++++++++++++++ src/pages/Einstellungen/Einstellungen.tsx | 82 +++++++ src/pages/Home.module.css | 11 +- src/pages/Login.module.css | 52 +++-- src/pages/Login.tsx | 4 +- src/pages/Mitglieder/Mitglieder.module.css | 21 +- src/pages/Register.module.css | 69 +++--- src/pages/Register.tsx | 4 +- 43 files changed, 1012 insertions(+), 525 deletions(-) delete mode 100644 src/assets/LogoPowerOn.png delete mode 100644 src/assets/background.png rename src/assets/{ => logos}/Frame 43.png (100%) create mode 100644 src/assets/logos/PowerOn Details.PNG create mode 100644 src/assets/logos/PowerOn.png create mode 100644 src/assets/logos/PowerOn_transparent.png delete mode 100644 src/assets/react.svg create mode 100644 src/assets/styles/dark.css create mode 100644 src/assets/styles/light.css create mode 100644 src/pages/Einstellungen/Einstellungen.module.css create mode 100644 src/pages/Einstellungen/Einstellungen.tsx diff --git a/src/App.tsx b/src/App.tsx index 399b49f..3dd7453 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -9,6 +9,9 @@ import Home from './pages/Home'; import Dateien from './pages/Dateien/Dateien'; import Mitglieder from './pages/Mitglieder/Mitglieder'; import Dashboard from './pages/Dashboard'; +import Einstellungen from './pages/Einstellungen/Einstellungen'; +// Import the global light theme CSS variables as default +import './assets/styles/light.css'; function App() { return ( @@ -26,6 +29,7 @@ function App() { } /> } /> } /> + } /> diff --git a/src/assets/LogoPowerOn.png b/src/assets/LogoPowerOn.png deleted file mode 100644 index b881f67722577eab8b693a91454edbadf06e7fb9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1556 zcmbu9`8yK~0LQl|p<-A%)Jx8_r&^C4uPbdf+fr&wW3+U+61iI2Xm1la5{3~&ucNk! z(Vlp{uD4?->2M@sqRgC@ z$Bi4-dX{K5xHj6C2|iH(fUe=M00H^@ZEGhm$^(x9RJ}5huYqPD`WPAjs7cpdILCm6ey{2+M=Z zPZTFhS!-bC0P$( zA|hV@M4y+4-6(-K7aKo$4eK?in8V0-t1~p0s{Wx5R%g&Ohgtan*-UGz(mSbVtao}8 ziE_5IK5b_e-mK<4!%db1NVZe*-oTR$)ZcQUIVlA?SV)hlzB@NlPd6;0_Jm1f8}Rmv z@~Cc9MHtG~L3MApRsG=hnCS{tTTjm=6iO@Om>bp4kBd2jMM57*XY#;v7EP7Sxjsi- zhv;*xMR&~SygS_^y5`uoruwJME|SNU588Mtt6C=n@(_uF0zN$Ji}f}N+HngEm(9;( z1$}@LKF`RnvD%hp%5~-b044Dze(q;j8~qijW6_ZJp6h$v|_BC8)EwP$rB~rMKOIE2yy8_`XJ60FMfKG9XK5i z%(30l6QvbC}kmfAdc2Q zI4GH_bED6F9_XDtAgByGa)cc7+rHD?RF4 zu2D2N9>M$g%lv`*J5P~*76u44T_l7n-GqM& z@)siqPQAl{%YNX$qbWR8GmFiS~T}(v*&3CgZUc4^QG-c>vl|LGR2_lSGR+O9b*q0 zHfb+!W=L`p+7;;{Auqe`mJAYJV&}J|Y$P3ONz|}T-wGymH4enbb~} zsgo3SR?t$o5|0CdqXV~64_^y;el_E5G1ZqP|UrC&f^4 zEOx4Prlju0rjM$vK`&*&`!clf^%p>lXucfFi1D>**~s<^VpV**w}j?;la2{5_iCkA zYwo(tR%&xZ^rSSKP#H{v!@MsyWQ|Fs9Gk-{uDDB=oD@TOoQ~X%VW$k{V{hV~8qZb# zLdrRPDW^6ed&P$GHEKzYsgyxlUpbHH0wxw|Ve>lrS0|c`&4=DZZnHQ^Hkn_j7Z25X zc~|dOVnqlg_|L?e8ew;U+pyAMdAK!r1Bn}|r+_6;{f6l)~;q9jY diff --git a/src/assets/background.png b/src/assets/background.png deleted file mode 100644 index d2521b984ea35c7ef352240519d1ed3e8ead57dc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1673 zcmZ`(4OEg>7{-+@{5dXXspTwBnzK%VAu5HKKP4Dq)6$bO9oy72M-bk| zBr4|o%S^Cb`A4Ey(K(2gq-c(m88RfNM&$q4_kpvv)9yLC|pr^1$$q=1!+S=#q){Q?sfeWC=O<+VQ9X$%v-y-yf};6b#C06 z$vMHw3Y|U}CACa!|K9vdvZ*L0toEr{XGO19_boTUlgK&m(2L3v>J^e2o?Dy^tPtL{ zgO-JqK0obsJg>avkl3Mwy(v3aXa4^r2^1OpOeFyDF3 zkwY?ekA9F-4`ALc;t1RAQ{S}Y6kP?-nrPz^;H8L@ec#ztpKb&*ZW-7n3%wb-m;EsS z(kg+OB|cKopeHR-RXFX^U;CMk43oPA{_NqJlt^>tH^*I`xj}0-Gl+W9TB>oWEs=S( zzAKEf=VLS4(TlV(E3ul?)E0~Y3QR5Fi%VutuC6Db+)RQK0gTfd>*CRLdj0%x}au{*ZCzrmay_igyjXwaMBTjF`Oc~k< z3iu*#795KZ>$t;tV(uWaOE`%O_kL2W(E(O*KBp50IT95txHMnUjat#hhdBbjYFpWy z1A9vei`==_J8HRTQq!E4^#T00 zcM94A9SMEko}@_niai0+&-6d$YO4h{`TE{A&< z7Q=q;8qift5;O7%df~UO?mz%-wibcB)>Gu6bT=0_9|bQY&|A){-U2Qf<;^b!^%oLb zgH2_uDk#E9mi8}u<_iC@r`UlT=^{8>zT!yO6zMgRZ+ diff --git a/src/assets/Frame 43.png b/src/assets/logos/Frame 43.png similarity index 100% rename from src/assets/Frame 43.png rename to src/assets/logos/Frame 43.png diff --git a/src/assets/logos/PowerOn Details.PNG b/src/assets/logos/PowerOn Details.PNG new file mode 100644 index 0000000000000000000000000000000000000000..d35eb4f0c41868f560c4c6ea06f9534d01c1c286 GIT binary patch literal 40428 zcmeFZXH-+$_CAcqW2K2m69JK?ROwPe4j>{@qDKi32uQC1k=`xz76j={Km{T69-7j7 zl>iAvdJUoXkpBj~zpLYZe!snr!4NhXdzHD?oX>pbGYNXEp-g%C`eiaQGD?+)_x~j$ z`NSu=Swdh>Nt>* z(Q}=Aol*IhbB&BF`L)V@`Dd>Bc%oY`%U~tJ4Q=P7xn1LRIKCXbu!?43flFe`bJ7WH znwc`Aib_gOBQ0`sH&UmKDb9y7Q8vE{i>D|%bGCW-`Q1&~c&4}UJnZa2@(&;0Jb#Ik z^Pj6%75+M-pl~zd%9|CUM|6iiCnVfs78`#^^uCo6G43+2Z*4j^zMr>kGS@D|3Cs}q zNBK_s=Qm;h|2Jf0|6gpv!s}TVuC_3rC{7{0sN=s*cKcQM&B9*8d{7Zb+KbiaLY2Ke zb^;F>PVMl#@gcusFD6W7W8t03%eJ~hn}5Gi*W}Hf{*v+2w<~n;wEM4ZU2Z?RZSoe! zar!tzj4>gd9ED@eK3}eU`s9J>UH+!qnw9u8E7=O4NE=u@J;li{{`vdubLQkBJEec3#amWV7VZk_%yHKAcycA^bk$dypT`A7 zU@P$QL9ZmP(v7m7ew-2W+%@R2Bd&ps^cECoceUKhR9WF$W~$;iEbZ@$zt)p*okBpE zpK`}Z^R@U3yQ|k%z#gmNIcysX+Ywqyw{^bZX--Cdg+8zNNQ~~F>_T(~jwSf&Wu4P8 zUOgGESj?Ddnk8_P)7M1F%K5-WHVaGJyau#*d}`;TXRu%)RoiM~x0i=RzNkZUlm=@; zjYRz6_r$j15Dbs1{&*Y;zAInkb(m?XLUv$#_x*iZVOx)^;M48zjVYfPiIhDCKHcS# z`>?xuZ-1s>dY+3^JrO$Nv)}zb&3Nc6+avFzj+UsW-R=^VTj)=1$xoqNwh3o;vK_IfB;MHAlxlme z+@rB0;|VRAPeZC5$rCZPqLFqh!gwJc6VgrvA5-GPB~UcdHU<+=In(Z4de(uvI`b)fnK-+$RX8xnO#REx)YV(%v0 zn2hYM4!_<}cO#zCU;>dnVz6L!;~=Dk$F@s*^T3sx3FRb6-sK`3uY==!7NLDxl2POq za_-4RkjraZkH9ZsI1a2vuwxi7!ccE6y}90&o(TS(cpI~wcbqM73GUk3R?bHU9KFv@2GOWQMdn3y7>9?Ki0jXuu`L`m3sTogwtJk6f4(jDmC zVVXT?G-1)>R=u$i(h`-ps-1#z#}gf`feRs*C~S==>M<Eu5DE298T5!s<*%y?B9d^RZLTzV{=+~nz`}R5+nPXzg=NIiGJqbQNEufNdubR>USgN$J^(wQa zN>o58i^91ezn5FAUuLftAfk|y4p6BAf;%S;t zZ^_q3_67;58Zr6U_qM`-L9Al+%fBBbf^?=^>XH)qwM*p2q{qy27034agdO_(xi45V z`(D0EK6}35Yg=X*j@8jaK6Mf5-&?L6+A)16_bs_$fV8kXl>`|XW7x^<^?o_3w@DBa z=BjjP&vsOGN*vtbw#S|$AGq3*T6+9*YFA!tyeJ20pPl6H%LEKCwG-G=OeJ{Vd*wJI zAZnj{{82e88CjrGIghv3?w7d<^QnCMNw(OJx~M9Yvt*d=s{Xqe>2Z`3^-ptpPxo+L zJ8;Ck&C8DS*a#OTS(PhjU9$jf!4k0*AO-v?-|`QI_brs=LXh&CWMme&_whMhbuGRu zEy+92Hjd{Ii+BhJG>0Y&1FE@a&fv1M)-M{D{ZNNmFX9S^Xy2@lPfuv zFlJclG<vPHGq&2VmqULJtMW$gYel zX$c9FRSf*RubsK&q{_DoMc3C$IAKTuoW@ba<*=If-CMdHv z)166|FB|mdO>0!<$Fj292|O|SxLmHReSsm}`*vl4DIX-1jO^y$>aFI)8m@#Uc5rHx z&G82r2SIHF1>LT?K{7@}ALT^((>Tt=%x`(;hcI7DRT?Ys-!gO9m-GznQ`W17%jqo+ zeXDuzw*}{ovl_DK1)8ld7pJI~^8(vyb$}9|o6s?;xVO>B6N$%x)yp?5bnxU%LeV<8YTwzy$;ciLE{P{bCHveRIKn;h4M|+RLF6dTb@mINhImNlB4o9f z8GpWK`rs1*IOhr654+co^S2qrxy~wZd!S#Q+S@5A>V{R4v1Z=D7wx&E&Zp064_QZW(H~??Dd}?rVkO@HCijevER0 zRo<3pzcXb2#CPQR^c{IfFAeWz7Dq;PdvaIK#l%L*uxUrDdF_?XOiJbRIHbCZ#uFQv z+d5k?+)vGFV@9P+XB$N_lk4v8x7j;H5gd=&LkP!fX(mK}fkh0m$Lgu>dhbf9WiHVy zSNG>sY?fSw%NoOX^2)h5=L)!S>*` zn^V`^%ojg99%|Vw*vqlpj>xAy@Q9vOJEORy$^D|VtlY=o#xorqvm8nq``tag-Q`^|2=m@&5OBAVuE{oKB1%PD{* z8MkFGE7>0T4CC`?Giu=^? zfC$jg*p4sN_~m|cJruaEU4vKQzm;2RMvksKRgF0*YPmSV7jPWcgtafkM)a8(v0IN1 z*m2M6)!yF6)DCo&h2F}mUT-RKA|w0ivin_gZlaqptwqpza%1oCbDi`CAERUG0~@G} z(S3%Lz`pmTa;IZGR4jH!oiQ2f<=RY0Ov}-)1gi*=z*s~+v-_h5slG{~9OqA#YQ#;S z1Ocl@o&cO1u3I+6>cYmcXIUTV0;^2gm9$HA4UXI{FYfAXyP%F9=1TS4SZoZU$*Cz+ zC{J!SDP@N)+<(TVvwZdB+J%UT<+NP?2O5?)v2$}1QjQzvEUAU-58Yz7MFxJ8uJ8?g z!b$JB+oPSlV!vk5^S7FhqdFD{&o}1{_TTJF0)tdTa)z9D>6O&C_V6^Ey4TPG9NamS zg;R+hpg7O1zMT>-qG7J;i6I61dr_>`WI9{`sQ=v8ng4HFi*BUJlD;!8(Kqt4SH-#X zz{pz-!0CJI^x_gzh6ew=lW1#W5PEMt)Yj%K85#QddI)o8T`a=i)~mO%7rr}((|sVZ zTMweHO(;wEf)a(N0fhZYV3FDybczq&`I~KPpKVQFI6zPrt$yLGoUALyO>m-9?tf9; z6cVch-8$V+bfk6!5J)wgL2K;A$q0YJs=vv|WNvtEM9ocfluf+{9If?g0Cl+yBwUJX zRpQ@;cX5T<+b!V^f(A)tpV?4OrDhH8GXgzY+J$6_ z@AlkIi4&eKEVabri57rkTx>FophO=!VPN+xbjt{rPnw#!D zO>c#n^BEOT39?Ur6s>ZJ`GI#SyPxVZ*|S?6iJ>C9d!A;8Iy-*AasUyiQYc zAZ+t-{p$CM{V_N4E++&ZG|wBHTgd`V&Is?2KCUdp-uT0?TsZKf z$S)o^e92Ur;(#Q5!T5aoCHR-#nKtsvTnt9z*9}X*1v8@FsYQ4rK;V08{Za_iyMHowD^bVM)_dP(UskZM)C6MB+MvPPPbrVgM&UqcNhfq z_;Z(y#s*~O?i64xnjB(3+VLCK3@Oo4uiC|Gif;vWXrm5tf9)?1{md(lX*Eu9o_bIS z0NlGAgsP2?;Wiwr$+gnCPDg6-l~}!b2>?}LYy1YXi}?!e0kFqc)nsM;n^&+@VyJ$B zh)mi|9l>`rmy!^XC^vpD<8x3Z!6kP*O;r*)?WIw{QrXWNdk~>ru^2vUhEr@|d5R`x z#Ujgn5>Wb8Qt@>^@H68V4Ak=~)|+NfstjCpAQ!`zM~e`MtczZ;65C05g& z(;{g>#5ePiK)_7Wb6GAj!E#tfo&!?*{QSe4`|mx#uf|=?r!gjd{giE?I@Ub39qzS< zgl>blq#r)J$oQxm>p47;21(LjseS4m&bqp_%9(0D2FMM?OfY)7st$ODDYwk50A4d+`BEOn(qr4Z!d*weN<=HSF6xAo07KOax_ z(=e8_zZ^*iBnon)8}=|G#sgg=BAkK+)?)9{`kbV*JpO=T(Hooi%{%& zzKYh&udyowIc7x-aperzq`0Q+F)@H*SGql9F=^#Bb>i&mkWyGu8Y{# z)#0>qOcq0nOIf{72$02o;wI)mU{2aExO7?Wq4g3K{N2YKns6|FafYpy^kHOGLUGqW z)%mzS$PIDes?=be@AEuQD=X`8S3Zaxu9>dP3!5#aQBK*rzwuS^t%i~M0IR-n41=^I zSF=f)mm%V9Z{d6z9^P&}I8<73TxM!%UG>e%`1ds{-A;H95QA&^Zdb)#INKAtWxBTx zqv-RJ5;(PvQdf3NrXzh4IfW)-Y75Wgs4+N+CztdA?!o=nRjuWuceKnOJdQX`5KEi3 z>s6VfLh^MYPg2P)=P(gRsa1f1;%4)aMZfmv-Y>$^i#RS?rH;B2_~zVAroSlfC=xj7uw4BrRAisDp zAoXq!KL_-7ynPepV2{aipC42z&3Mk(dfLEV?Yu)ua7|316%e_se@2}xuEG~> zrK(*!0Tg2`*9T~Os>Rp!%yII8(UF53_?Jl?pB&jdBm8^$M=J-pm9 zXd5QAH!QU%bMR^DK>X5J=J+}3Vib-BCEI#!0S<-VL@jIyl%gY}sRJ8KT@{b()_1!a|l! zcgJB@cKB=As97SRBAhuk3{Hb?R!UDS5}Te6BL2G;d@8Q)#_@ND^9G$49qHFHIpi`1 z#cFrPzR+rEHKx3CYc{s-+VKt5U3KHi&Bdj-dDn~_SNGBhdu{XwyL4?|q|0y~`mWhF z4z?7s?}vJNm9tC`spVG8-lX9h>)o_!BQRS!1iNF`TXzsO=I_^Az?xM~iXA!xYLf@F7!D+i6$8k=k`7(?T16kqIp8?hJcc zo_uew8;0)*nMf(W>tznsdof5p=k9xPY*&^SecwAZhTAZVX#(rw&Xf9K0I&%EG~w-B z#_;T`zRrNB^qMRin>+dEpH}bh#FR9*DMqEkaJL*6FtHNaPEJx{O!zDv{N+EV50NNn zcSz&8`91l^S^_DK)A}#4TT^z65*)42z^nYk9GWBV)03kCUQ@4ly|MRXT_ zP^GIwcbqk=@dA?5#6;OD3ompG{$N|DCjoJh2~Iewty<(L9y4A47JwVLiq7u}B4&@Sk#+sq}HfA5PS4y(bxP*~k<*MoOX&&pmzHoIMK zR0JjbEmo3a=RGpYoi_bhrhx>&*hR(L@iM$nkKZ8rL%xKIPO7g$DtSJiEB~6^qXZAh zE9kJiE=sLIZX2YTN%u3)ifw$uO;v(r6S1uTtr&+m#@lo%hlNRN+#@aqi7p`ys>T{X zXUBtyRMeh}TF+$&;07BPot0`*XNj+^%sK zZiP?tf}mpfJMF!1?~w8NPIs1ux4-Vp2b{8Ah$yYlOhr$RIwniRr1tg}*Ve_sCk5Ew zvprbfeSM>}Hi0XM;w8r?gXBY40yUir$vD!+Zt{{n6#gr08eApkIjSY9P%DBqeQppk z^O%vKLcy`?hBd|ZIXVWdkN?dI2`6^FKyrgt_G~*7l9eaGIb-Y!TJDW6=HF|Y5u@%r zaFTg~3-Zff#S*1nF6rfd;8R11D71t{tyx~tG1t2`-yTtp2}tH>&CY-4=yS4w2n>a%!@tB-PREkd|VHYb&r-qQpx=8~N8tg5>y7uZ{JX_D=if zlEzi3gBhMKiGV;xBzi!W9y%5!ELe@M33{;4udx@gUy&UdoQlow<0pl}YUjW0 z$XL3IS;XpHUvOIxo@dI+SR4?{ZjQ;t%h63wS;xd}Ys{_j$b=de@z4W1e$(8bY?zZnmP+Z9Z0MmiMMHK5vT!@Y6{1wMbjl6?C&jV2wKWqKtXdn#NiO)1?_z6q zhtj)P+tP`suolR}iN{m3IQ*`;VtITulSQaawB64bm2?zfK9GR6?(4r7#pZQj2{Sxf zcZ4YC*}868VsBTc326;ne;*=^l8^`!M9-$|u=3!X&G|8=-Cm&*Y?F!NBedjB#F>gp zGb#4ztf-WS)`_D=$v5`#ZsY^k8w!>dj2o*j_hp0s$VG$7>4#1I0uxCSDn&1?U{A=P zEP@;SRRj8R%nsi1wQ1>E=A3O!q-Mbmq$(*#etzoRmbzj=`+rl2-jBgRYT0ai0rVaN zO--@0jaFF+1WI4xI<+DzTzd&;aM^s%0N$g)Qayv=;N1%!tI0x>2JCJoer$ZBbsDb@ zYjdfS-3t89$n9X1wmNt@J?9dtNWq^Q*F*)DHVdx|Q)mXLJPm7dV6*dSmY4K$R!^um zy^m=+APiZ5@aNUB5kaA6YGZsVU#q!GaZ{DZ<_2O$Ynt_clTKAFVO0Ipcp$zs#0GGRXKz=b;nKP!Sq0SOldy&eQ2Io$kx% zmlWIT?*I1BDtN@ye0rR)5;vfL!}>)^J3urd)wv*aCGEw(*q0RTUXCf0b3k~=bu|eI zV+^dAzdrnF_vJ&K;-!mB*YAa60je+_!7MQ+JJS7BCZPh=bmoB2P3>V>kl_)Zdk}ck zYkUtUrbA1vo(GK+Cr}ondJ9)`sRyp7T{6iEOdAt9{QF{rwyn zF`~I{5&ELs?7#U~l4@_~?ITq-rqnGziR;W(uH`1gaLyCSJ*2>_QnFqR5fXJNoaIMI zXBH=gP54Y)2|8E3p6GHdeX2PjF7PDigk6JzD?t?rLfw78P6SiWKczn$J!|E66oI{UOp2~ zW2F526`!;mNfiE?bc(@M+XpT=M-gedlBkJtCIhyk8p|lnKa-;Z$JzR~hd5yC%ko$5 zb>!jBtR8rH#HUv*vqhSW9hFQ4qh9LWOE~=ThE%WLj12IJtYwctBu342C$FHFeDf@N zy<3Z7N`EabNxN5V9RT%5|AuQHcNd$?2Q#kF8kSi<5Y&Fcb--6I}e+uNTw-Q13;2y zV$|9lrh4zuZJ3i2d+mCSWn10_IkCcV%rZRiX^&2XZQI&GjP@ygyCT#jZ(O6#l>qp+ zOoQIz(VJ<6U4l&Vo$|7$3m4rEgEYNc1D^!YU0@M4PhXYL-u@$%@cmaJEknNt=58FR zN96L@Pw&+{tINwRn!8(dMLp7WvaZBn*Ld!mOpILvv1-H#bBT+g2sQgFrU>%T8-eQa zsk@2qFxu*&#UQ2iMEQBoCB=L$ySk@#&np&d5N#_wLtFqss!%lW{EAUD3x@{9y`ade zd{CCOsd_MgwXaQp2C!bJ&v|={r4l^g@4I3pir&W+I$Ee+&3}PhNvLuIsN3_TdRZHJ z2fIkvs+XD03H5nl2sL$xDH?Q#{>XbZ50kFOL7|L$ig968pUXri6ozPlaDBWO6r}B> z`f!K-HBt^MSID-Vz^z3DYM3e~M39-3x0usb8zf=YFI28`;@ZFkHg6l-%wGHX_b(=d zfFs3@7+ck%_o?`ptSqGK^yjXbL=)0mtE2F{*ZfkF3fAgNUj2pffCDUzir~S}jyqa8x$wz`0+*8q`|rQA%cXXR z(V@LF4%!|x=}}}AUbdF`+^LsbW^%85bZoU|bs{g`@v;i!Gk|eL9&}kf%^KbsSGE)| zT*$telfq~}N=SJ$C**qQaLJcj!e?#${+lOS(mGD1ERSZgDbt*U3qSA(0fmKjlZGnY z0Vqav_lqQ;w(!RA>uP0*mkuFub#HR5kt_H&$$Xq4{$UZgFc*_>nC&OFmfnuCvEYt5GK%bXK80|1o0ZN&T$)K4$3*!SiN8T? zqrfCe>{Gqtl~g6;5SLiW$A*siN8Gj;ALgjDPkl)BtNFg2Hj)varK#muT~S@r*8I#l zbY!WxuQ~c3xGKM%k8VW^ddaFd$JTvabe4LWuwy|A7VlDe(}N|f?Xc!7Plbl00I?wj zxF>5YPW`lVB8Zk|mj><+xzc~2a)qLHmnVbm7tWvcCB?!YJW<2Rs7RO{A1_K=upY@4 zMx>T}xVZKHLJp;q;_N-l@-N^xbd_8ej7_=WX*1dpCi(2BLBw>%nv zF*)u`LvAoy|C7^ubdkM;xKLuZy8RsX^hSczgq5;x;qxa|$TKA+HR0@VuT51m7DN-* zQ245FW-NSSJOf;ucIM?n_(T3A`zJEHh=7kD0|s|`({l3GbXro6ODb~}n&rXdl9rzV z>$Sq_3_~jQaP~7nlPQrV(SOthXd*RhL%7Q*4uYuJ%wn~!&6DPL2tBF|?p??`Rhg85 zS*yk}n+k1=E$(B#uIeKr!|o$VK6NOabhZZP=N3*F!H(noGgpBh#aYY!GvUxGY#?rR zb5;KO8%^g{ZFHxrr<$tKgx&QG3N20dmqCLuS7(M z3WrLjT-?-d=Cz;5v;6c<2Vr?Vd^_Ri^%7ocd?ScIf;Se=crQGOasOyahX8whZ2|*K z52qHdNwVXdsM(=HK;&)qBxmm`BxJyAp>RP82W7^F=CVuKgXt0*=HN8;zz(* zNfj6FCq&`1ouX;`M-K21x-Y1p?XDQ9H}GTqy{2M0N9dy{oZLozq5d!Y^B`JVyT*C5 zv1S>XXw(FV5L9%Z^3RQ4-UKvLxlScwLrN&+0T3YZD#6T&Df?eb-sJjhTkt}s+D|`lJH3(`wOhi{P}ENGJ1cVP^&UDvik2BAj(B(*ou?-} z%LFv%-?aL-+oOhlkveffekb*@6FF6o8zri&kqR_j6Rf={=bNM?>#O~CbU;u$4s-7Y z=z2eJ*Q?k5JuFwe;k034){GgHDJ&VOtUdB)7=Za_@`z|V`G$K~%SLmT8FSpo*=Fpy z^5C6zZ?p};j*7IA=3B4qI4G3OO?nlkR2$nKi7gr6n zP5+?5eSzS0t0YW_r|ql<*6B`m=ckA;WuzK8+nGT`=@;9zXMt;C^0-aaaTVJNuaU-? zdr)FVaCU4Nc(-0=?ohGijIvw|W>~=e`=`P2i1pHMAE2qxhNWH-3niNkoc{ol%ycMF zUe%gw{J`n2=@aN`O^hjtnFR1nl1iiZIxe&SdX;J{R2M-_SH-&b7&h<%SdwcxhgRGm zjWJcM-71~!3mFaDnq4{v55LglTCKGk`w1rwE8Y!KXIYz%@6BaY*O~p_cr1`lQ9Gc{ z3bFJf-S->b;v~;ecbXO;SUp&F`bkk410}Q+#t6{fLc$E@P(QxnqaMV3c*}d8_>Rqv z#5n>8AcJ(T$5dC_Pf>pb4d?@PlgXwa9`d8-cORE6EkEMVciqP?GBiqAO97#C;Chvk zmXkJ~l4VzJ&kAPjK(HG(i(%o#%H`xMx9V&+1JsKhxUzKSQy7aIvdGD$QLt~ZQ*8lkk(;0QUP*}nL*fAsNbYGO?x&Vl()O; zrC52V1U^dJ^ncflh&|SFt}&gQc=-eT#PHfEhe+c1`FAx_^}j#|s+a9H9Gbb;Qp1+i z>g(fG{)NL0^P;ulV9u(TRJ-e4bykxBk$Q;@qeGJiyLVi27nvfn5GQ4}pO)UGoTanf z6#jU(YQ8U80b0YZup1um;p3NZHz*7HG!`5X?(BjC85eYptNZX#n~!y} zLi6eczr=rDBsC^XOikkrxho3VshBkJ#HbzaLxEuNx5kg)0PTIEH~U%X|47HKGh1bm zXrMLly3**o;J&1DRl9-%-$M3<)Y7CA=f;rkw&HVtn`$z&1)B;wWcE-~9rxzxoW&t@ zDi6Gh@$8D1_$U|r2X`{EHKeMNbpy8UljYP7+fOm|d=#(>0Fr`>rdSRzqPSXFx%MyX_Pw5^kwoPCWyyRSTs34wP(^F?~r7NRb-~#$n122b(1=U-*y^;J> zF&vu+Ybx8E^Oc;Hh`#giX1hW0V2h6F&7t^hzrbm42HU*9xU^8xK<;e6OsoF!Gam-! zbcwD(&P)<&G^u;oy|7J7Em-ONrBa{WxJU6Y`d-K)|^01ZCZvf;4DW#bN+orbafBB(JC_G7b6vW8K za(k4ppX=iY?PB)b#^Y#D_*Rx^`LiZb`H#nQ=TZb^6>42OMj`k zq?hV#yXUbrn*pFA>B^4^=HCwXLP=$`xeep(R{?TyP@R~h`>m3Xc%`%szp6? z|IxM7zuP@^OansEj)!rY8n`F(_MMo+|A~KnG3GtR%go$nBv}F3NIV-?n-i(cR#oD? zS})yY_k*|KCmBudbw7`c_kysu6F@-M=xDSu?i4-{Mi4DLmL05pv8?2}-jOXT=KeMC zA1GC9qRR&r-z3e^{h26dHWvDJMFE42{Jnn>ARkN!*Y;IZ8LUM!{4TZEQ6fSs1n`r=+_W6h?wn{%Gu%4T0|L>F=yCs}z@&5vK!&9m>triZ;oiFT>m)&y zn2BhKn*}G~(2vxfH`FxUl1VQ4Jlg!H9axL!YTntlx!0E3Rc-R!c=2rbwJrsabDHF- zww^LUrIgCCe7eBk(;DQWIzP&HEM0EOsG%kb#1XSEo`q|A2VRs?8Rg5bHOJ71bfZgB z%jE$n&(Lb4PXlL=5hwjzC$$Gx&+SHZPhAhKUfJwY;-Pq*pQd-#-jX2o$5Jte-S1jm zFL6}xN}Wb`$p2hr|I(>d&i!d0<5+}Jbk4P<(d+A5I+lump{EHeXuZ*$x{u@%CefCs zi@8lbX1>=bYWGREFoiK{F&U`NmXvv09$sx65Mo@Fvo^p%V2l`5z6YWmPJ?@0Qe07e z&m6l1@ah##^Jgbn4;hTVZV%ITT}_4ydqJzBDyT#+nTIyk&r#RQHru^7lGV^$AD=r` ze~c~L%=i2@3T2-@1XH$Qn2MKMf%kJp1(hyBE7KGp_7{~@ z1aiV7`dknOgX>=v^FN6X4gm$U3nwt=yB)Q1+=pj{+&=^!O`nLL#LG2XA1iaYnRj14ot2SfJhUKPW5x66no(GwGXPPjClmnbU2tXEE`DBl+9XBy#h?Efzv) zOj~pE#KTBx|LWkiL3uCeh_|on%BP>yCc`bT_eMu$Tl*j(Q#YSUJ=-FhMMMF_DkRZm zVV4WZ%6ds{%mT0|3cHDtgF8>JD)@0TGdFKU?F-i% z2{8O#PdiPc(Cys|=F_i1Q8S9ujftfw@`)jCprW2_u3K4^R>O(o-=Rdi9zdaj(f3$2Pib6AWZCsU;M^|)>_(78u;OpeDBRvWpR5aH)qN$KHqqiXKx2us?Nc}JHvf{rZ2-6iM?g`*qQkd> z6}9e*p9lk1I_N)%Z{uW`afxb!NTy=UXYqPK1G^)HtK<9;r3zqQr3IdVBscpit*3K- zOWQgfr@H$8$XZVDe0s2XPw7M=gA1`CoQLmP;rRTm9@@;|4qaiw&|)I*96fr8S~^WGvUeN10_IJ@a4 z4Cg9aXKE{IGO3#;{)0@?t?E~T`d@vUZG7Y4m;1sF4D z^T6k8>?Cg>_y^Znvlrfk!i5#I{wjrofqsntDD+M;_ILAs){!$)KE`z|!MevS-#$F| zKA5|V6486_=B2;yc~S6to=a?|o!G*qYnVg5(e-V|Z?Aq;?$qXbeG$cTrMskl5IDCZzyI2+e zhoL+kI%&19wh#Zn^M-fi*B0K%obQG1ds|5L8Q;u5s2lFkwjU#TwQyWd1Vj-}S{lHG z9k)X^Lnlm)*9R@RUh6oW;+}Z^G}SLoF}JsFTvo!aCh@LT)J>Sz)|U1-I@BmAG4F~@ zI4V~`471wZ2?h28$*F7>K7@$1p!b&4`6{YHE#n`N*0Bk=JB~KE9TnL08sH_GG(5@<_xCJ2-X1;q z`?nM5pZ2l7Mg})K*JMiaINWtxUqeRCL?H(*GZ(ZwJ{c07AD*S474?pzAO9;y?$k?9 z-vCS5t~P#z*j4WvqR&mib{={3jJXJJPY(5C4=m@|N<4g4?;?{rHv5!uU1)`-6`ppx z9?Ru-+A)U_*^G|NJ`p`%f!u(TSTrpqa3xlV}wrIN4@$|p!TO{KubCQv#fPNe-TONECyx$M)0 zm*4gZ9=Tdd=oYD@1I0|eno5uTk14!D zYrKyvULILOAZmJ9s@bvCN46W5#GpA{2IDuM%u@(1<~d;z0%TK z69qu((+vXqv7Z(tZY_fv8ih08_mJ7t2t6w?C2>61j03#dBt!wmpvC{J+|xAa%+Nh` zSEG55$jRkUO!5fQs@78c5P6yPIf(X zFN(Bg^Af1Sa0BHjp8aDa8&P%Ta6spz>qCP|&bhl0K`u>>`sOdVdDy_!!=pu9{4@ik z06gt_1s23crtXN{qf-2OX1#$z3ZT&`+l=ef-m#G?Tw5+q0C&`eY8qtq=2E$7NO`>8 zPcc-0_}n(Gu^YZ!fC!tO z`K&vO!qZ9zAD8 z-SLx11}K%e;upvaMlF7R&&g!K!yNz}l%0T!1Il&!=36E7<|I;Ip+i4Rt_S8l+&jS5 zp5!uXv{}>O8yVoH0pjuetEq`x2%%)h><+Dc0+AF!*~N3 z6s3Y{8R0Etjs#9#V7zw3n9uj)+}nr?zj=a$ERk}B=uGws*8^(HZvq8N4#NE9EKBx0VQ9*qR>A}dlXm6Q|YFeS|MPD1@BKZ`zLuJFyVQ4;l12D)m%b$V#^eCF;%P= zNpZq((6i|6V?z#PsZHSCJkji0~czIHe@;p6y20nVAXi-Pbcw5NX#QV-qyG z6D!A_5!QAENLib}t7B{LoG1~lNF5{Y(G@lhBGh%(F*zQy5HnRIRZ26jqV2!OMOjl;h@odic z6~i%(<3V@>B>kR`{C3Y{=Cgs7kec|IV=aU}-hr4apcgYgLU=K!&FDnoLH-QzQeY;e z6TX<7wD+bmCC&I-y0<}^BuYRR>vij0h@v-*H;_=!@*Z2JRs@}MTk8`y(>=KQ`|Rs^ zGc8NHvIm+9P$G#BnExZhIoa9mm%c6P-EJ@8FkMnLAcb>CR(P;*DXYlwPMxM*;60#g z$WlP2L|6r@<@`l5Xc8+~PhBC#BOfCT!W6L^5oL4-VAwR(vRwBdSNjHh$3RV=8Zcj= zn=H=@E^0bwSewG-0rpG?F6sdwc*+g}w3M z-p5&20u@9wwIOY-!A}OdtdP)lq3VxqOkDfAR#PiTMF9)CN>NCnUU&s<^ zTe&9#>i@^N`>4l2NrFEo<*{%uFhe$05YFc5(A(drLG{r+NoO6wrOx~pM4#(N>|XZ- zD$YTZ1^rDC0o*F*q6g0B2>#@F-!|5p*AM|TF*zpDSd3Lh?6>daFI4P)J2*R!2Kvh@ z0WQ|48C7a2fcNxCw3wFgn@B3YDF9MgWm*xnj=v&|f44(x4+fVK54(b`KGx>$&>a))T|$5aP#^?mIRzx3 z5>Hw*CH?AVjpFusj_nB-xL^<1`G#dHKGQMEnwF7!CR0-@%fdrpTm&LJaGcSk_{U}pqx%H;n58`o<|&R( z65p`bExb^WpueV*%=;!?ACMva`~SoWd85fqtoLW4PORV~>!s8$)a8;lUDo@9)h!W# zY?6u&5nZ>PF=y_CbCqsF?B?2R$M3m&no`UgjI7>wzP^$H&jk+KTCkrk!K+Dcs5hqpS7DaRXJ|NVS$ z@|Le*`P)2qixAD!pOrRy*&x3j%jsHI@PTK~7w*6!%pE{FT>waq;Rxpg!5YCM=l+o< zL!DVF+JuK28_Tf?`F?>w4=F@bZ|yxV?Dr93D9#n(>xl$ zf7o5j4k*)hg8fv`anj2XT;_$u$~CiwH+y?}vL+Z1B$~X##+}!x52tN(!hcy%}k<+0;Ied=f34_gfCmqrM$%XvW5j^49%ftPpIOme;Yz zSq+UGvr--civM0a!Z8g6?F1t|H)EODU04c?(fehG4N7}kAI6OR$0#kHmZPf}(6UD5 zHl1l%(KL>(~_1F{M{2YV#Y!yyeSVes-ZR6sGZZtp!pL+Xg6c zKhcRlkDk9(g2tsGpv0f0{qunR6ZeN<4!VA!vC!&742De@D7`k>r9QF_nU1u^RfU30 z_%FJuzN+1XvcN;c^X)WrM{608@yRIK;ii6|NeQ#A#xJ|KaNWTR7pSG5e50*Y<}*rc zs4grHXtK4;odgi+Wp!2@7kaSG$~^Y>Vo93CUkaeHuV9CK`4VrSI!}A;wDG}bu^4eD z7)O#&8P|!dtvnC3fgrM~Sg?Ddt7yvyeJhw;gL$&dFGV9Txp z1CLSL)GP?dW$QsE-mPm1c|Ze@JvYwg`ftII@e_i;)Asi8r2FO#>6S`L-7PN%C8(5O zb8>0-e|Ga6ZUW!8>Xms4GQNPn7nWhTOga-7NT^kylp%rZkB$TWPy@FA1%L~~b+ojA zh?CPF)9mmS(ETDV(E%BYEsPd>(v5%?t}&7i2bzfHqyxf}fh(28gWHlv@gQz@*A|)(Gf;Wu&4y_qIRnoT`9M?1miHA77m#h8(wkn?8YbD7Pl`7S)2 zh<=DG^?reonypy-JWLnAs8HgzU&`HHvUJ1A*A-<(E4&&~JG)9}iMW_cY^>kYFI-#w zjO=u>=Q`JQ=5k%edoJ^S zy`Qh=>-lx0=sY4V+;r0 zfwz8nDD3psY~(Pi_H&uO(?V$PCtvl^5TKjrTWE^be-F>1yjZ!jo|il7p$g;hlsdO8 z=5w?wrrn=t8^b^T8z36f{t((9N%{r|Pt5d|$8|6>nm*1@E^6}kW3wo^M7t_&l1^8z zvo@3kwET}2C05h)bfIoh@<_JtNFYt<%jaRZydrso zY8GrviU)8v#$7Zom(cb+!;}{6#Jy_7^9AdY3h)_jTjs#JfonU3Ft0wf62H zP@ATkdELSjXb!30o&Rfm4s-Y8&&bER4o;M(O%?JgNAIW>FV;^6w6-wfTc0G|FIr!h z4|dbtM$-ZR)&>x+z<{ycC$4K2*TaVbyWMVLjJ<(Kk3m1E9z2$j^d0l`c=EaBggR$h zEk)k>$yNY&AkIUZbii=tTMBP2?LLr_zx7I4F2w7b_C#EAWAwq>KR~8!ZKMJ3{z&;Z z^;mqFsT0tI2_x_R^(~wEn8^LF6v$T<0Ec@O{q{E2I`A-Cu4Pg-G_tZ`0%$c?=XtVp zO?7tChnw^YE+#U-x#g1VZ7e6?r*CGqqB}?K0Od~dkKp!ZOJ*~eCMGxQX|Oe$qv=WH za;s!|T9<5x%NV&b$L>2R0X4R@P9^xyN=$5W3_{Pu$G^D{SnTq=wQJY=H-<5^GyoeX zPftaBj!CJy>Q6_>!UB0y7xY3h+|*n+1wj6Q_1yKDDlDq+M%>T;v__+C&qczn+sB<- zmTj*5^tgMC`CMW*JTUUz?}pSXYLYC6N3)!;aLls2Tt9b9RZ8tTig5Ni>oB8~*!E&y z^QUzHs&~i8D=v>W_E*QNmDj|!-oBDfFzZ3PxisJXxxv$$?DV;;eT#ZJ#OPtY1~l$S zoOF^ivUFqY7)RzjA09dr(GE!D-%v{U1)sGnG64VCS1ueqNad!DjujXD6MisI@YIhr zOkBX-(c65eH8AsML_;fR0CMi}900g3)(!1|GCwz}G2%>f(gg0`;UUMNIH(lv;bAckv*;+i=A)AsrmuAFQR_bx2j%Id!$=t@TcSuc{n#b&SZ>x zHE1;7*v07f=jD>8#i%>=N={L@IFQ=eqU@y?z*hRkT@*Dn2BfXLG3Axg>yv-2M!| zPWO*UoiSf+d$L83f%UVxcNCF?G%mp{(gri_Ye06@uJ_jB1N>Wu`HN2I69&;o+jp${ zfoe!N;^4_s&$3RJ?swn2f)Q4dY+4!++2;H>o7--FpcWM$Hu!My&0&i;$_jPT0ZlET>e{nu#@`rr_C=ZlvBhPjl zXMiyzX$OY#}m+{Uhb`kErvG(qFDtqG4=d9S&+U^G$ z?d2|5nt!PIZPDOos;}QGD6u%HJ(lUVI(7vC5VYJGg+3NibuTfi9%SfEY`z(NDe4YN zb%h2f04;Rk*ZuWgd8u|H6jV{&1SD2Gx#!7&wXFUsUelC6PdbguIrUys~ z$nps9T7J@(+&ZU+G;^>4irH6IPAz*?ld`WV z0%)lmQuGHm{P3Y(CZ%=ER_DB!y&$Mx&P7YFKZ;b88V;t%RA-Z3i_}p65m&mLyLNGf zC4$Pi@^QYQ5_}fc90&>GK=CKIp?T5sg;VLZQi{UztiM<6Snc6YR^FY7Cd{EEAoW0A zKKbGO<+RC(8{aMYq;6OAO+q%K;%j*_Cp%h<&9Qr3X{GyX4$)ecLmd{GBdZKhQ@d^w#CY?;q|+%|H=ftk6p{?r%sy=4kh zQ1R&7zpe8flZ~axFU;e11U`9U2z5QFUZcRg_IcRgnwvi#zS!SQAIeZoUhKmV;x_!} zmLC+I_d1rW(Sz-s?e+e!wI?iLu-m?dw{J37^%1>6Do{a@|9~SohiCEv#6zi%VQzO< z1Dd<4g1{G_)N(CDN{^It4Sz`h6g~g5L(HtPIRL6NmxyjY+@xMqz2+_EpZoYJpG<(z z>)w30w_9CDQ%VM)JD_6e@Qeq;6wg!nJDOnh-i-ZFg7M4$ z(VJUmo9sr0tJ*y$0o<+?*2UBq$npfYK7OjMfFSt~Cw*BGU{Srci`2Ot; z$q8{L{IYA1%oL^U%kh-~<2e8)-{3SZm+?-QtW`)y@{A=ihHl zg-;pFj$Mx{t_gL=E-Jt%ZS&>d*A+r9E`R}K=@X&-hxA26C5GDiXtxUn7wyk1Cj4bU zd-x8tzU`FlwuME=Tqq?eIN4ToI6nRe6`%gShwV)^{6Wymds3k7R@38(nXezx&!G|( zw?YqeJPyNVQ~MOfXuU-P=DiAEfEdLo*gfHt!~P^isY|m9RtH~_p1hmH&T3ejY`*@a z%`C3K#3gn z1poZ>MmL&!>qRMm*Bun|>lj+c{zwN&VFW7fVg#(W$T<>J z-p1{>36!%lVY#5G|D;jXW^%s|83LsjJGr{juXK zk6Mhq#;W_xFCU#cw|f#niunvseF1(Kt#9(r6az?G<7mez#<{8I-X99r=dY(=)4C5Y zWC5bJbS&ZTX&!)gT%yIbPh70&poID>EedVz8o^gvjW}%6*Qh{2Hzn z;O)*!&C3J*HJ`n$)V@AfHn{~$D%*}%O5?ST1*XJvc3uLw-SU1fq~S0CGnocpW%3(2 ztRva)f=HO+49QsgYj~PNfAR+s zJ>aUt3{Q<7R7f%xY;*+n=FiQEgG||UTOD|wA^Y_UD(tdN1a8k^SL+=6cwA|kk znuwTqiA_bJhRGxa24}wF!+223?6s3c+71NFsYLQCZIhmloG;AcmsD3tK5;->WKgz= zzfDl@nc#2G{@I_C<8f)Sbl0&2R>xJfkesT3WQdD6-!>Vz8_I`e{um~qWqGdt=#H_ zelFWeNx2TR5(xJS*Py4A_uw8$3T%WZ+^K!pP(2tkvJh5%lbjeG)0H$wmo$PI2xr|+z3*0+~ra%ahK5I=WH`nG#i zPs=tWbohEt%iL<(>ES}vvpPrTCzvLhVw}&Doi<@rR{$QZ@8xz^)Yei`9iy8c(gDop znPt~$AS^U;Pg;glB1>N^B>d(6p(vrc5}I~!d-Bqx38k=qcDxoVheh5&*CN z^87?$1)7Uvk2=m9*?$(6huHxH7R%Y=)G5<*MrY#80ItjBRlupYsoGq{0|eCWFSd!c zrpxKd@@qPWoTlmS{iuB%06|$Aq&mP-LpDkS88k97j$*2qQX}&fc|aI%O=+LY2@JeC zMrPkf&vT&rdEy-H&{y_lTbtXCOWno0O^NSi+J{7`+uC_|@}@=gGFo>w58uOn#XW8R zYu2v1%`n{O6M>&mNn2Oun7D;~QQDsZ&(T_~_uhPtyPAoLG7DP&uBog)(ss^mWil-- z%kCVqFgRpZusju%Y^WQ)9(GVkyeHf^9M);nSxkQQGN5s-%$u4oINK#YI@YeR zPxK!_K)qIeV(rcu6aVHyI?IN}}le+6oqt_FWanHtZIOvPALSxey>?oX^Xugp0D zk7TH6K>aamm11gP>KU>w5<~Ck@?NjO*^IG2DRri1>D%rJb@u$qSk*So;@v$~njo*Of6?q*9J%<8fjLIfVTV3+KF(!YV{U{xqoGY))` zc!4^|>4l4GO`M|xlc&ms>>__(kU0tNULL`JO78t?sZjqNQ^&@@SU8`Lp`u zs9&vcez8e zzENW^!@Wl{dfsY3wbAQyV#wR5V?)}J*5&)%x0->I7JC0ulsdiwG@1O-8z{4f+I&;) z_K1LM%-nIA1|MOX%V8vYdEO}CnD9ulgbd=3_q*%esrIoX4-1FPik*#llPh6>YUYbX zymal&Z}HPHC?`lEjR!C$or{7u(fwhr+R9VP+ww|!%HLgF*3fo+Elf1v@H-siX@ic%B(0v)DCyZ3yGPOfD(}@i(hwOQ9Dn{Oo80H?XF2G9W7J4>;){r{G2Ol7pJO$){cgd%z;3p z{LqfkUr2eh&iksBL&5mF_8zah?kh|^AmIiJ0${?Xhi{J%G`&68`W9pOfU>iEe{O3BNX`XbiobJ;Nt*6{_ja;^*Q_;4R|ZQ)nrz)GUL6 z%pflIX~Ona^nfy1Rq0B5MtsTx9xN!UtYnHBj5Baa#PD5ccEmd8>ksyRi)x=n$N`tp zV?(u-w*g|`_ue|E_KQ&7ZTSqZn9D5`{_~ow0S|J9>0Nb5ckO*(#@oXCd{PHptS;|| zwUWgvgNf&l*~zkwHdj`ZqPa2+AR@|AO7bn*RMIbu7`i6xv>R&rL|p&<;H;8W$CH+! zDDG@gJZ}^)`zlW69yOTOb;{~VJXy~_oY&xO6ZCQ#$*Y*Y%C~JH{jaUm?k>%Vo9kY2 z5_W-~3_07))5HBpX%yf+oXN3 zO5vj1QRsh~J_j~?Nz1g9%2lb=y9o*n7SO7p&qp)Eq1}siJj?y9#ZbynM%Lc1nMKS} zwJ>3aIJZDs3({ZNw9=?$Hh6m{ivM~%H)3}}{=QFFR_vEi#KSa2t@ zvBkC#cf-T&8YDXL(TFhjrb4wk@gKxk5SLpgbbJC8`(5_QhG2FXN<_(YWh3TNY}aLE z{d3nPoMU)`3XfIU1Ie=&Ts$$|FnxdsSBv<5%?0_Nn^$Ee`~}x2e>C{q*=HcbG2{!- zT#CKn5obcGLhpzio#vPYj2#LLyW=UC*7D)qq~~Aum;jej+Xhp66`2=F!*ia{n@R!f zsSEp%IG>?W@=#(+`?JZcj4&ZLlsdMxK5CTq6c)_F%t@y)iA$Sg;n=oSAe)Hn?y7p$ zw*qsk|DNF>MeJ!p%y#wh%J1P-(WFnv%H23bB{Gw@b((sLcsqODM71JX3^-DOxUN-W zuRE~o+lmnt!bYnhniIQE7;;xAl3Aj9wSr@6JnN_o?TO(duyFU48<#`nb)45%0y}W2 z@2_8GX6x=;-lXQqNpFCR)0HCIaW`7J5FH!$S!9`aP2R4I;LOYT&0Tc?bG7cF6-%aM z_;J!D++pg5?9sm%Qz{r zvTGK6RV8fwg2UXZ`+8!m;d73Lj=?3#j9HvZtS4?gSFAp7LLN-HI7kDG^XZpsUQX#W zfyb}Aaa|yvzF47b%0TAeJhnXGrYbz^AWkjA&w>;S8vub5zFuazVeT%T)7AwdN#rV(+>s`HQf4r{GjzCi z|DS|}vKS%dc9SJxcX-#y2)m3~QJ2ij4Cjy5q2G$zTsa43e#PPL-PuL?q(GC4oEMtpaS~Gr9Bb5ewpq2PpYvpUTY2 zC_%q8Z!c%P{n1(3+;Z1|d8Cy*t1N}Cj&*@Vru!n%HO^yzgwhP{8p?LsheE;6(y zkRD0NX33`Gpliof0dru-eft!`hTc}EE8CYHE@IQYa&}2}E`or&>I@}~IhBg#8Z(o5Ty_0B2#;$ttL_)_k%y*r=LD;&x@8|$kJ-rT^ zNGXeCxUvmTH#WRZHOX;XT=mI?G6y;A^k{K&u?Ba8#6qx6do@<=mjm;K|Det94J)EA zXZPTaHBDv0q4!!4cqW`t%bwOfd&)7C0hA~g@?gvKK@Hgr@7Q5sxbQOfO`pq3yV8L& zMVFP0T{1`X6SQDtu%IV1e1Q2T9(7Yyw#AC*qXX=4yyVR2>KmyRw*W8vc6#9)We+bh zBkY_)4e+?VHi}X~8~7Q%;=;Vl9Q58Xj5fjr$I!{GJ)R{hF#tFNAC=vB`43{rR8@+3-3|So2g}Os9Ads#Qj;Y3 zXaHl7AE&aivi6iVy+S@wvApZz2FyKhjFtZS_8iZl*74NzvfzcVEq7Noe~#}AU3jj4 zdR=%tvE_p=CK#okzl>Lv`EzO)aTil~Z}_hL^*x>%flJe#ea{YF_oT_I=U}7RK~8~V zjO8?KnT2WfStLPn7%^wcG=7)r#U*ZP5$S0rNP^E*+-l0@aPsIgLD(`blE5^hmSGwo zi4sEGGnTjHR@rptzU74f9$RU58TpV)hf}UcMm2JB9G+n|-@xY`q|G~gqH zw?cn~Q4aWl_Te0>dV9DL5YHZ~JAgh3Rt64!?Gm%BQ?DEID<7Vr3tRM^_hi35pV7{gKk^GI1U$<^F)8jKj-g%p1x2)%D=aU6p z9y+2dk}|{auF!H-mfSii6AB_S9nl>}!@l+FE#W|kg_Dk7*S{U<=g;iOYfH6w!%9RP zaW~xKv;5)fzXhAs6FOFD-_e|?65~HOsQC6MG1^{P?K*Se!N=Xul0vg2oN0XpBliH& z`za#pO$0kS@1S3p!!Om!J+-)M1<%@|kB(s1hjbVjU6@RryNV3{0|&s91~RIdJ| zoO9z{;lhSwknshsJK%-ASUBPCWflVd$FPz6-bKz^REiB2W1AH#<(xb@sYw?)K}o0b zxbH! zo|#m(t>cu7we><5U))qGPD~ZESZj5{yUb3RQ8}$jfV-?TgY!68>7t)Ify- zX(LOIOIfAO)8!+E+X3E5z{_lX6Nz>&JYN7-80kOF?rk0C4vIF(Jv7)36psSw**RS$ z33kGGm-#NCRQ~yc0(-@PFU*tpt4YNSq_&Z!z18{Ws8B)q?<3=G{l9f`-yg0uUKT+_ zNR|zI`?1rmYD$RI`t;bgEyZf;Bx-k`RZxelvDbh4mgN2*GkVfbIi_9^H`dt%;vDu% zDCdo4G~gnn7^mh0wi&qL5YbH`hY?0zj#|HxfQZPG;@NQT)>hZ7Z!IP9wJq!P7Etf5lc!pp2v!Zbm`ux30CsF^7}Umq)+`#}br{Ra+Ih?kk%=dyjl z_rS$H39$=q;jzu;W^w`4-9oY5-5ujY2D^t*WnkWnr~thDk$({;*Cc1l+Evg9DFA6r z?h9t!VCmvpU34}EW)&l+6UR!JCvP0mSmSiD0ya?xqwUtm%5J&enry@Sq5SO}1`N9W z!iQWA`dvQ2ja(frMpxW+cJR7X-3VDnl#c`~wF1XlY?OPPklO0G5M5G^&dJPp5SEY#XlvRw4sJY{Mf;5>3Rp_b=?)X$4M*E&TAe zv*pQ#l^Z8dO^UNgSJdJq6ky>>x+@!`7j#*`;zw`Cv_*Cau_s8LJ{(G$kMtR;UzeR) zI#6hZa>I_}?PR8w$(~BfGnwC2wY|MQ1R~?xACmQAs|M`lY?9;PL$#C|ys5`>G>};- zt&V!szr)!m4nA+4ZMaUv2M^vFd|8FA?Lsu)5WXRIheOVo5Bs)i_@hd0Q8yN$(ez}v zaAnY!Ids`aC?|c|AI+(!)h%jtl_oE=mG+00M-v#my!ya;RAR$)Evs`hGEZ&*aM?}N zXK|Sa3u)f1nWFxYe$fMMw;0-G!GaFd-G4Bn`)2i1aMk5erX%RxNuC~zTDL4-wD^7S zgW+Pmc~9O8%8+CIclc0$^@Zmhn%IS(fQTRT;OV~bD}&v)oSjjy{C~{)&a0EobdQNw z+Q$ucYE+9=aM!bX9)qjmJ$g=@sOU8W@2}73yZK)8GIgJ21~k7nRNb!`SFw?G9$XL& zu5$+t-_fJ^pm^EUT}`Ljdwd-t=ck3!M#G&IYibO59*f?| zB{s*JMO62ohqb=Ve&da}K!Zou*Ko}dfk#aDo!T1PBAdk~JF6(rr2!>B{nDnX{h?4h z;_{imXEbs1Rl`+c=&6C{m8tRfo`Wz()OmAy{RVzIL&=#?5oj0I( zupO0>h*ni)(~HgNAcHFFN>9em4kmC&>3B7ec`B8m?7cI1Xk-)O#txlUl8*x7#Dz>z z7rf8__a#NeN3`B}WW`1q;+W%X8+!A(D7>rEENjx!;2Ok!g0Am>ddkBw9SYLl37QfW zqogZySHdY#40g10o!l827}*tNp)UYMlhJ}VEHdbEyzsaCU1T}*xMY8VVIoh?Wx%+2 zqvJwl*a5(1SY9(@D<)&G>$yYpwQR60%OH>h2-#Y1TH%%0l2Ja~Jh%7O2E>gL`Xndh zHK*2_D26823^kRp3zv+hKfz=jB6W5y8%-1KAAX>`rZQnK_xf|1{az5uKv@vq#0saG)SU=iYi+ zQux)gyj8Dg@^E2$OgYFQGk&R&=34UIdC0LtLCK3ve}%d25LBRo%*$-*1cJN=_jRM_ z`hVaA%cL_6b1Cn#+`H*8lyj9O$(#fw$vnG51E=YT7<68o`w0vVYwC$!nWqWlSSI%8r1|ms5)1 zCgm{jpl@*6`Wm?iL%51?t>d_d^BpGZkL?e;^)_=uVhu|vQ4}rL!Re2lU#?+q-v|ru z3tBXe!1dUvd3#bHE=1#j#(~dlz0mt)+Y?+S#&=J%I44}Z0#E1kSPkB`I%&~SdYl_t zIXqKLomV#XB1ZtG?)0IxLQp#Gr~Vsl8}0)axwXPt5Cl%3N$byFIS3!-*oJ0A#^hWx z)~Kj`6V5g`il&0=JZu`!k`Oknm<`GCH~|R+YGgF2P-wx^rcowrL_3Pd!Pwd)@Rxz`a?Mho2Zi5W(CByfEd-B z+hpBrs!deD%2xgBYL;pZ(Z!`d5Xd8<{Q86thqOkvT{X)86f(uW9P51OXx5+`_V$9N zC*+4FPO!W?GLsjP5!s~sAPf(Z(}^c9SEatcmngIYaqV^2%jUZ3Jm0Q7K|p42g?8R6 zS4$l=br!x++7lgD-&(si8qCVKX1M0lAFj*w(b+w?HY);C(aFnP4Zhb*AWDJL?Cb!Wq=8lA%>0P1qreLm9NpL7w`y@$&~et7}Kj z{3L4-Y4gac8v}Av1u|K$>e}cq(>ZN$tO=QG(mx9(AH$;7k(_SN6ZGct=}|4`WD5&4 z*(w(KE$(mi~Y7o6nb2c;ZYNH)nFvh_yZ?xb2ub#0`i`WxNr;L_F_G`n3Y}P zCbg#D*60n67Pnw>x3G(aV^3@HATPH|Tk3lsCkrpG>QZjUB=4wFhbyRhyK(i(WQmV% zenp$}Oy3 zqb_?DoJB)oxkfkDK}y?&+$ayA>_z$MEb8t;KERDAg+`~23fnk^<7DHb=B+#}r8I85 z;9}glooq=#zRC-tJ?fZDF8D-n{y7m-j9X!@zZ1L%>P|eM`h(2Qh^)LzinA7aq=qM7`gEkkJoCVW z^wcVT!ib*+Km334U2D+~3SK`nN;A=*N~Yqf;|@Jwk>k|dkEJrR0g#~av1Bt7oLZX# z@Hn652|G0}&xyS$!l&ytW-nf4;6cK!%)aYB$D@G=&c`EW_jUxg!kOmSV*KMGZ3v=%CZ#I~Ei9HSgss~8 z_V!yLeqp_Np{YzX0u@>I81r;EAHo42qY&Qmnx~U6vHSgbZX*#JtP4CQ4$s{JxuMQE z7F%yx$<~e-`ne}=ko;a?u6#wap;Ppt6M$fmp^~3~eaNI7c#KlmwG&byE<>X46U_x< z3U_#gK6@R+F?;%vKIM}&^q@z6uj{W&)xsg&leJ^?ID&!EvFpyq7-ktv7U>gZL7(_o zCg9GdU|!)nA>RTFFkp@+N*8&vatZqnWw2?Z8eGtGGp`B0MIsGLxz#W{GYOv}szoY` z7#5+NoS^Aanp>4R!QTYg8t0p|JxdU({Ru$TeJ-C-!>Lhg0Z-}yg`bEMJY@Pd-|R(q zVwqTM_r9JTJV1X>O0?!0*V{~&RGy>2{c`mTMN{@kkY{VkjlNh4NB!&zdV#!6SW zSmugh8#gE%ay4W9l!TW&up&**qX`Cqve#J-oibSKzWgup>?x>^@)UzXg%^y!k{KTm1Abig@XFdJ5n^Nhepxi zAoX-n#b}tD1rhB=#P}N#M0uQW_H+dYnTF$;xy zTM&xM;|fD~BCd6POsj^8LY*97Xr$Tz)&q48M!rs+!(~r#HN$BaFu=7)P$of} zmDlo4qHHU=6pcp7QKMa4Sy$NTHG{gboTun$Ks`>o{jTcm1FCxCzpHvHsp2Nca5x$- zRE!9^@O&Eenee{$2__CaCKDp%+a$hnJOziW*kLvbUDT)tO}Ss42s~JBtGvcwcxtLv zQ)UTd6T&RcHusu~hsy$Ib_fLNodx{O=#>Vo3cW_vlZhr)6IdWT;!o@)%A@+WWB3(Q zBlz(^Q!qX=7NZR;E0gNK(|_zMFiLmcjvt-p?*XMBHom16 zb_l6Y@VrBGmVoeQuv|?(lGivS={x{bq`|^eLK6CQOphnF73doEU92PmhyweBUTG&M z|CUQu2@mwE+Rj7LrpuLYpa6j|xWUz@%I>1SbAa2I)3{B}P^-LWkWEr)mx+o5x?%w# z4XpQiBrqrc5(WGur;{1NXtZ|AMKqU%WK%UX5yusc4gnjL^PLTlgay<--9|0zz`u;q zwOlti_Lf`tgg9a)^La0cRE-TdU5XxQn(O+LL*@m{g*6oxlya_>*gAy6HdUyHf2)c~ zKYWNhk>_-)zM~#%N#r)^LX-CMRo9t#+2TJ&lEHTt%4FNZq|8di-XKqf_x<^|?Y{=b znJz!)*Ml1X$9z@et*bCYSUt=lBP;+A(0Sc|DNcpf&b|lVvpM8zVb9Xt#Vy9hb&Pg)HGc!g zSYw|EA;JY^aOc!PVK-&|y^|QS;Mj0r@&a?vU~h9+AhOq4PkN22zPqwoLMA++)(~#! zhwO`7Y12N#Kv5W^tgz-wfVW=S#5Ea0P!kWB?sAO%_t3`ZU1k40Hb^w)zqP71W-mNM zSHN*|3lt;4Y!dQWM9;KrSHg9E2XoyI%LNxdnyOZvY{rh7YFFJ8w8DB2hjhP|{g-b< zfvo}xZz@vR%Lrn91Xy}$l`ErKTSy>`%K}Sn9fs_efm0=U##J{ei$0RuwyasZ9=o!7 z?4+B52JakPWWA>6klV_r^kBFfG>m#jNlpz=J>MivZ?_1XD*k$p;s59!Q0oBJWPbMc zY%kdRJ)2cNSaDA-7*`8hCON<9f93Asa~3~*4f63^Ul4)Cv3Ivg-Tixu#(l5s2JE?q zOI{k5vm)es41+bD>niW)^ZBgQv{nrq-V`}~K2+8h2-mruv8nrs-XJ}vl+0B;{UbNH zAi4nh)0-2$$RRM%C+BZ24^>_TM*+JE)?pCd39J!bZ4t0$UHY~S>GWfIuEpM_3vaat z3`rCrzuls*bX=DL4VH|knN2Z@$Z-ABeK)OnOktQ`)-VWLTaNL;Un_+Y;pP7lY7UsX zt(&us67M}d9CWS#fPGd>Rbd2M73u_Hs646&_}CSAdC;)-#*g=&puvKRk5T8A@hPpm zwWi_8>gM5cy+$Y@gd;a}gxXpaKx3%@_V$OA=U4Pd#L2RSqT}29VdAY#NXBn{2-p}q z^uT2^Yl|8hufissk=Ee{MR)fn{FOh+u5EKp`;)7_ujwKGqQJ1Z*N(ZfqkiM5e_BeX zFDr*v7(PGB|3JqA_~4&~sH2v8bCkbKE0nL@tLNvW9$+?VEZ_wgxIv;5wmXnZgk-t91&a3Jv z9YvF1j0NI+xd4!lw@llvZ>C=A2<&O-U#_qswb^hHgXH(cYhizmZJU~ zk7A*3L@{fRyZM#2Hfo5`n$6t17JU)r`{y*N58MBE*0a?;uuDSZz73)M;lvZ|?kk>e zZDWv1g6yC~?un4iz%xJ2aJvW|l#h>(&i%Z;~9S$=T+hD!+H$PH) z!$2b>pgPj(75T`)a2jQc>;-sthOKjuvi=Fflav8Tcmx}A;EYfXBHDdA>UDP;%)I zz4;a&$!M$7{u7C_E(Q(_oq_W}sYmIUvzK?>!M0R+t)}g9 zY0i!syUqJO1Dm)t8$<1;J&w8h2O&;z-NhR|0U?abxN@!K^g)x1w=5fu);bbC-enjC z3&%NDgf>KiYI7mjmXEVxH*HqswC!Y}4n>dT#HTOOW*Y^kr%B~sBWuq{chU6PZkZ$Eq5k7A0 zp(x7N&Fbk`jPD?%visJc+sFDbiv$_mWEtG4k*F9;&ELY|ManC=N2>x%1uQ6Hb!b6- z>e=Vc>&d;InzE2< z7`hwY!Zxe)=rMAf$#f{)!$iUv?%`beXb=$Mu>W~CT-5D}ainR|9Xomk>0vUQb*HpR$@;Zjb~v?RrwHGKejS)HEg_>#*Q>QT9zJ6;SufUQW{i&C<-<<2@geBlA) zKsO?6e&NL=I6XL)*arFe0xKGJC|1^~>2_Y5pb7}bq&gD)Vl3dz(-m~LOt8!I%h08) z{;)Bg35#U?+*r(zi*Pu!xG_Z-%9y2#$I9LW*R_Ccr%Pd2`85+D-I+0ZVvAUY?K)E) z?_7eDtL%A{DoUUtnpcK@VcwXN{+U!35V!~Qh}$c7!0)hapHfG3e}(-y=!Q1zC7RWa z-M(Ml+#6Z(A((;aZ?SF0Ju#m?P+5WtI0C;uss$lcbfYP*O^{Vg(FVyV(C9kLEheGm z;-dlI@(n@dSa|5Z(&Maf^)$J!lv-Dv7wb6fa6BZ%AspX0g z^4vDb)e5Kn63;$BsQF-+d>4G3N=;SU4c(ta#uVOuMb=Y-tPG5XTHG)o0zt*~Q1Dju zCP>HWs+ub)^e67KfWXajYsYJjQtG^gV-a@+%FJMWM+Z7Xy^?-c5j_T$C6Rld4ecv; z%-g`vzU_ZmSsUP?tgA{gz?N!YpB&fR@vEG46{JjxPG0H$`wwSt(`pEto@f%|jMI$p ze6B)PXEuS0=Uz;RKO3~Qnrk=DXfK-7ED!Y_G)TT{w1L0Q-s&O@dg^KVx`mMr+@JOa z0>b^naWEu{r5DLAPj%hfDn;40o$}MIzr-A7ujFd+RydY;e%Kfg3?_Tqs6uR)WZUfJFI$mE>kD?gsLIMoeLGlnMNg=UB zM(NAn+;lD@HtiL7Ku*9P=w2hzl^#1@@`uM>ky(MW)}$98%k4zg_BEr@7`#6^>J@RE z)QvIE8~*o&ox+xD8r8t-Ir`9a?;uf(AaEa5OGjq(jZW9FnBR$iNf_X z--E(CgpTSatOpw~4ql4--WQG~W0PdbQYH14_>E4h3c*se$`HxS_2zeL37B&)7Wth1>zs@#g!v`^KrHR~#QQb+ zLY&x~V^8g_muk?GhJA8qZhzPF0gX3K=05DrQ0q^SM`2?z=-JfO8Q$YId+tTFFGjcN zRLY!+qvI5IMf=X1UBUCHAtIjECHm|G@b|bvlr9H)>#{=$6h-D85k!*;uJiM_bkHu% zl;!p-0$#abG_Xu}U)y5QrTIL3=BITr4y7jL8v;&ezYI9Zc}hcuT9W2BE59B{0m@Mc zUW#LUeqGCZQd^xYhB=RBtwFWcy)0-<1U5+Eb8qGaV{uP#{Fl@Jg8^|-N!>ssvZ5sO*H!He4s$I-H?Zi)g$L=uOq>{L917X6 z6cgH-;m6=#jR-O7FWIz$JXLpU{r0<>)mSFDdqY%s)G@9$1h#p-D38;Z%JPfgbbSgn zJgUxoFeJzf5{Q*NvHlQ-n*Zkbyd{%RZT;^CR5DaxDP~Z_AX1CBnQv8Qy;%T7sgx18 zj&+j{b#B1^-85oKK56-IjF^Hg%59HUFR+31UYS;gVbZxWCQ#&OveaAi7+@R~tST)= z`G!io>q5p)@2=G~+T7C+6${zOEU2?`C>#{J%dpefK}(n#hDd`pi|Fpq&+MR@3JLJ_ z+=hEVe4N5-IfrFafCU6viHo7d2K&QhvOQI1mqt`2V#jE$FAheO`%fv)V>EBU*|B*L zN)AeBEMw1?edpzYGOaC6>QN=O2X2VO;iHN8cL>oKI*tVti8s-nfzf`b zLR8M&tJ{AM-gSGTuUh3eNutQKNaXEQUKj^p)t-5vie?TcT#_G3)s z6^l%QqAs_=m4@G|<&veMCcA#0HG;aoy~)Qom-KAiDB{-*mJ$2WuKcr2f1^l(0|iG|S_wKgwNJbAzP(##>yu;(IlT)` z2c`RQOOawAr;IVVbmekG?0D-by%SvM=oIvi@vOQ2e^^7siT`;#I*4-+(#G!AGbcb1 z5*!gQ>!V{ZM3acBm`|7M&FoF4LyjQhM@9H6Iam&~poUbX7yL$YjR1gY8<{yP=JNqo zDoN10!zRx7R8W1*yedRJPS);Wor;V53e_6_PRjL)9d!TN*){|A&vy>QKVVC{%lYdr z$JMt{-3|LpxdH}v0XvESj24gGAOPdT&ibmlSZ?Vl@eQ74x>btw@VtAprbz@&gmQXB z2(hNn$FwC-xQqB&!OFQB@M-1;jedfficy9>Dw#6%r*3b##gAK4kvO$}CxX9yOa76~ zvMR3-b)r7%92mQ}r`Awgv%Cr{lx5?H8u|tWdO7q=$h$V^qV~Ij<}!E0%s7P^b7V`A z7`137o~wuJB=Z;wBkz3|!@ucw3=;KYn=Rf^7u9?QY literal 0 HcmV?d00001 diff --git a/src/assets/logos/PowerOn.png b/src/assets/logos/PowerOn.png new file mode 100644 index 0000000000000000000000000000000000000000..ec1658a93753b4719fb3d5391022ddad40ee55a6 GIT binary patch literal 61568 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 literal 0 HcmV?d00001 diff --git a/src/assets/logos/PowerOn_transparent.png b/src/assets/logos/PowerOn_transparent.png new file mode 100644 index 0000000000000000000000000000000000000000..e8d4904f9a81e4f87e46b2c40762e9791d5b94ac GIT binary patch literal 72631 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≶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 R6BdFbJYD@<);T3K0RVdBCMW;^ literal 0 HcmV?d00001 diff --git a/src/assets/react.svg b/src/assets/react.svg deleted file mode 100644 index 6c87de9..0000000 --- a/src/assets/react.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/assets/styles/dark.css b/src/assets/styles/dark.css new file mode 100644 index 0000000..93df05f --- /dev/null +++ b/src/assets/styles/dark.css @@ -0,0 +1,28 @@ +:root { + --color-bg: #121212; + --color-surface: #1E1E1E; + --color-text: #E5E7EB; + + --color-primary: #B266FF; + --color-primary-hover: #C68AFF; + --color-primary-disabled: #5C2B80; + + --color-secondary: #6F7BE5; + --color-secondary-hover: #8592FF; + --color-secondary-disabled: #3B4370; + + --color-red: #FF6F7A; + --color-red-hover: #FF8B94; + --color-red-disabled: #80383E; + + --color-secondary-red: #D65D6A; + --color-secondary-red-hover: #E17683; + --color-secondary-red-disabled: #70363C; + + --color-gray: #A0A4AA; + --color-gray-hover: #C4C8CD; + --color-gray-disabled: #505357; + + --font-family: "Trebuchet MS", sans-serif; + } + \ No newline at end of file diff --git a/src/assets/styles/light.css b/src/assets/styles/light.css new file mode 100644 index 0000000..14a6616 --- /dev/null +++ b/src/assets/styles/light.css @@ -0,0 +1,55 @@ +:root { + --color-bg: #FFFFFF; + --color-surface: #F8F9FA; + --color-text: #24262B; + + --color-primary: #8F00FF; + --color-primary-hover: #A020FF; + --color-primary-disabled: #D1A6F9; + + --color-secondary: #3F51B5; + --color-secondary-hover: #5A6CE0; + --color-secondary-disabled: #BEC5EB; + + --color-red: #D85B65; + --color-red-hover: #E77A81; + --color-red-disabled: #F3C0C4; + + --color-secondary-red: #B94A55; + --color-secondary-red-hover: #D46872; + --color-secondary-red-disabled: #E8B7BA; + + --color-gray: #6C757D; + --color-gray-hover: #8A9299; + --color-gray-disabled: #D6D8DB; + + --font-family: "Trebuchet MS", sans-serif; +} + +/* Dark theme overrides */ +.dark-theme { + --color-bg: #121212; + --color-surface: #1E1E1E; + --color-text: #E5E7EB; + + --color-primary: #B266FF; + --color-primary-hover: #C68AFF; + --color-primary-disabled: #5C2B80; + + --color-secondary: #6F7BE5; + --color-secondary-hover: #8592FF; + --color-secondary-disabled: #3B4370; + + --color-red: #FF6F7A; + --color-red-hover: #FF8B94; + --color-red-disabled: #80383E; + + --color-secondary-red: #D65D6A; + --color-secondary-red-hover: #E17683; + --color-secondary-red-disabled: #70363C; + + --color-gray: #A0A4AA; + --color-gray-hover: #C4C8CD; + --color-gray-disabled: #505357; +} + \ No newline at end of file diff --git a/src/components/Dashboard/DashboardChat/DashboardChat.module.css b/src/components/Dashboard/DashboardChat/DashboardChat.module.css index 3eda629..8fc3ff8 100644 --- a/src/components/Dashboard/DashboardChat/DashboardChat.module.css +++ b/src/components/Dashboard/DashboardChat/DashboardChat.module.css @@ -4,14 +4,13 @@ flex-direction: column; align-self: stretch; border-radius: 30px; - border: 1px solid var(--f-1-f-1-f-1, #F1F1F1); - background: var(--Grayscale-True-White, #FFF); + background: var(--color-bg); position: relative; box-shadow: 0px 2px 6px 0px rgba(194, 194, 194, 0.10); height: 100%; min-height: 0; overflow: hidden; - + font-family: var(--font-family); } .dashboard_chat.expanded { @@ -49,19 +48,20 @@ cursor: pointer; padding: 0; transition: all 0.2s ease; + font-family: var(--font-family); } .chat_button_active { - color: var(--Grayscale-Black, #24262B); + color: var(--color-text); } .chat_button_inactive { - color: #A0A0A0; + color: var(--color-gray); } .chat_button_collapsed { opacity: 50%; - color: #A0A0A0; + color: var(--color-gray); } .iconContainer { @@ -74,23 +74,23 @@ cursor: pointer; display: flex; align-items: center; - color: var(--Brand-Green-Green, #3A8088); + color: var(--color-secondary); } .expandIcon:hover, .collapseIcon:hover { - color: #333; + color: var(--color-secondary-hover); } .horizontalLine { width: 100%; - background-color: var(--Grayscale-Black, #24262B); + background-color: var(--color-text); height: 1px; margin-top: 20px; } .horizontalLineLight { width: calc(100%); - background-color: #F1F1F1; + background-color: var(--color-gray-disabled); height: 2px; margin-top: 39px; margin-left: -20px; @@ -128,20 +128,22 @@ .message_input { flex: 1; padding: 12px 16px; - border: 1px solid #E0E0E0; border-radius: 12px; outline: none; font-size: 14px; + font-family: var(--font-family); + background-color: var(--color-bg); + color: var(--color-text); } .message_input:focus { - border-color: #666; + border-color: var(--color-primary); } .send_button { padding: 12px 12px; - background-color: var(--Brand-Green-Green, #3A8088); - color: white; + background-color: var(--color-secondary); + color: var(--color-bg); border: none; border-radius: 12px; cursor: pointer; @@ -150,6 +152,7 @@ display: flex; align-items: center; justify-content: center; + font-family: var(--font-family); } .send_button_icon { @@ -160,43 +163,45 @@ } .send_button:disabled { - background-color: #ccc; + background-color: var(--color-gray-disabled); cursor: not-allowed; opacity: 0.6; } .message_input:disabled { - background-color: #f5f5f5; + background-color: var(--color-surface); cursor: not-allowed; opacity: 0.6; } .loading_message { padding: 10px; - background-color: #e3f2fd; - border-left: 4px solid #2196f3; + background-color: var(--color-secondary-disabled); + border-left: 4px solid var(--color-secondary); border-radius: 4px; margin-bottom: 10px; } .loading_message p { margin: 0; - color: #1976d2; + color: var(--color-secondary); font-size: 14px; + font-family: var(--font-family); } .error_message { padding: 10px; - background-color: #ffebee; - border-left: 4px solid #f44336; + background-color: var(--color-red-disabled); + border-left: 4px solid var(--color-red); border-radius: 4px; margin-bottom: 10px; } .error_message p { margin: 0; - color: #c62828; + color: var(--color-red); font-size: 14px; + font-family: var(--font-family); } .message { @@ -204,25 +209,26 @@ padding: 12px; border-radius: 12px; max-width: 80%; + font-family: var(--font-family); } .message_user { - background-color: var(--Brand-Green-Green, #3A8088); - color: white; + background-color: var(--color-secondary); + color: var(--color-bg); margin-left: auto; margin-right: 0; } .message_assistant { - background-color: #f5f5f5; - color: #333; + background-color: var(--color-surface); + color: var(--color-text); margin-left: 0; margin-right: auto; } .message_system { - background-color: #fff3cd; - color: #856404; + background-color: var(--color-primary-disabled); + color: var(--color-primary); margin-left: auto; margin-right: auto; text-align: center; @@ -233,6 +239,7 @@ font-weight: 600; margin-bottom: 4px; opacity: 0.8; + font-family: var(--font-family); } .message_content { @@ -240,40 +247,44 @@ line-height: 1.4; white-space: pre-wrap; word-wrap: break-word; + font-family: var(--font-family); } .message_timestamp { font-size: 11px; margin-top: 4px; opacity: 0.6; + font-family: var(--font-family); } .placeholder_text { text-align: center; - color: #999; + color: var(--color-gray); font-style: italic; margin: 20px 0; + font-family: var(--font-family); } .workflow_status { padding: 8px 12px; - background-color: #e8f5e8; - border-left: 4px solid #4caf50; + background-color: var(--color-secondary-disabled); + border-left: 4px solid var(--color-secondary); border-radius: 4px; margin-bottom: 10px; } .workflow_status p { margin: 0; - color: #2e7d32; + color: var(--color-secondary); font-size: 13px; font-style: italic; + font-family: var(--font-family); } .completion_message { padding: 10px 12px; - background-color: #e8f5e8; - border-left: 4px solid #4caf50; + background-color: var(--color-secondary-disabled); + border-left: 4px solid var(--color-secondary); border-radius: 4px; margin-bottom: 10px; text-align: center; @@ -281,14 +292,15 @@ .completion_message p { margin: 0 0 10px 0; - color: #2e7d32; + color: var(--color-secondary); font-size: 14px; font-weight: 600; + font-family: var(--font-family); } .new_workflow_button { - background-color: var(--Brand-Green-Green, #3A8088); - color: white; + background-color: var(--color-secondary); + color: var(--color-bg); border: none; border-radius: 8px; padding: 8px 16px; @@ -296,9 +308,10 @@ font-weight: 500; cursor: pointer; transition: background-color 0.2s ease; + font-family: var(--font-family); } .new_workflow_button:hover { - background-color: #2d6b73; + background-color: var(--color-secondary-hover); } diff --git a/src/components/Dashboard/DashboardChat/DashboardChatArea/DashboardChatArea.module.css b/src/components/Dashboard/DashboardChat/DashboardChatArea/DashboardChatArea.module.css index cb23fb4..2b81981 100644 --- a/src/components/Dashboard/DashboardChat/DashboardChatArea/DashboardChatArea.module.css +++ b/src/components/Dashboard/DashboardChat/DashboardChatArea/DashboardChatArea.module.css @@ -4,6 +4,7 @@ flex: 1; min-height: 0; overflow: hidden; + font-family: var(--font-family); } .chat_messages { @@ -26,12 +27,12 @@ } .chat_messages::-webkit-scrollbar-thumb { - background: #ccc; + background: var(--color-gray-disabled); border-radius: 3px; } .chat_messages::-webkit-scrollbar-thumb:hover { - background: #999; + background: var(--color-gray); } .messages_container { @@ -65,26 +66,29 @@ .message_input { flex: 1; padding: 12px 16px; - border: 1px solid #E0E0E0; + border: 1px solid var(--color-gray-disabled); border-radius: 12px; outline: none; font-size: 14px; + font-family: var(--font-family); + background-color: var(--color-bg); + color: var(--color-text); } .message_input:focus { - border-color: #666; + border-color: var(--color-secondary); } .message_input:disabled { - background-color: #f5f5f5; + background-color: var(--color-surface); cursor: not-allowed; opacity: 0.6; } .attachment_button { padding: 11px 11px; - background-color: #e6f2f2; - color: var(--Brand-Green-Green, #3A8088); + background-color: var(--color-secondary-disabled); + color: var(--color-secondary); border: none; border-radius: 12px; cursor: pointer; @@ -94,15 +98,16 @@ align-items: center; justify-content: center; transition: background-color 0.2s ease, border-color 0.2s ease; + font-family: var(--font-family); } .attachment_button:hover { - background-color: #cce3e4; - color: var(--Brand-Green-Green, #3A8088); + background-color: var(--color-secondary-hover); + color: var(--color-bg); } .attachment_button:disabled { - background-color: #f5f5f5; + background-color: var(--color-surface); cursor: not-allowed; opacity: 0.6; } @@ -120,11 +125,12 @@ align-items: center; gap: 6px; padding: 6px 8px; - background-color: #f0f8f8; - border: 1px solid #cce7e8; + background-color: var(--color-secondary-disabled); + border: 1px solid var(--color-secondary); border-radius: 8px; font-size: 12px; - color: #3a8088; + color: var(--color-secondary); + font-family: var(--font-family); } .attached_file_icon { @@ -141,7 +147,7 @@ .attached_file_remove { background: none; border: none; - color: #999; + color: var(--color-gray); cursor: pointer; padding: 0; margin-left: 4px; @@ -155,15 +161,15 @@ } .attached_file_remove:hover { - background-color: #ddd; - color: #666; + background-color: var(--color-gray-disabled); + color: var(--color-text); } .send_button { padding: 12px 12px; - background-color: var(--Brand-Green-Green, #3A8088); - color: white; - border: 1px solid var(--Brand-Green-Green, #3A8088); + background-color: var(--color-secondary); + color: var(--color-bg); + border: 1px solid var(--color-secondary); border-radius: 12px; cursor: pointer; font-size: 14px; @@ -171,10 +177,11 @@ display: flex; align-items: center; justify-content: center; + font-family: var(--font-family); } .send_button:hover { - background-color: #34737b; + background-color: var(--color-secondary-hover); } .send_button_icon { @@ -185,16 +192,16 @@ } .send_button:disabled { - background-color: #ccc; + background-color: var(--color-gray-disabled); cursor: not-allowed; opacity: 0.6; - border: 1px solid #ccc; + border: 1px solid var(--color-gray-disabled); } .stop_button { padding: 12px 12px; - background-color: #D85B65; - color: white; + background-color: var(--color-red); + color: var(--color-bg); border: none; border-radius: 12px; cursor: pointer; @@ -203,45 +210,47 @@ display: flex; align-items: center; justify-content: center; - transition: background-color 0.2s ease; + font-family: var(--font-family); } .stop_button:hover { - background-color: #c3525b; + background-color: var(--color-red-hover); } .stop_button:disabled { - background-color: #ccc; + background-color: var(--color-gray-disabled); cursor: not-allowed; opacity: 0.6; } .loading_message { padding: 10px; - background-color: #e3f2fd; - border-left: 4px solid #2196f3; + background-color: var(--color-secondary-disabled); + border-left: 4px solid var(--color-secondary); border-radius: 4px; margin-bottom: 10px; } .loading_message p { margin: 0; - color: #1976d2; + color: var(--color-secondary); font-size: 14px; + font-family: var(--font-family); } .error_message { padding: 10px; - background-color: #fceff0; - border-left: 4px solid #d85d67; + background-color: var(--color-red-disabled); + border-left: 4px solid var(--color-red); border-radius: 4px; margin-bottom: 10px; } .error_message p { margin: 0; - color: #d85d67; + color: var(--color-red); font-size: 14px; + font-family: var(--font-family); } .message { @@ -249,25 +258,26 @@ padding: 12px; border-radius: 12px; max-width: 80%; + font-family: var(--font-family); } .message_user { - background-color: var(--Brand-Green-Green, #3A8088); - color: white; + background-color: var(--color-secondary); + color: var(--color-bg); margin-left: auto; margin-right: 0; } .message_assistant { - background-color: #f5f5f5; - color: #333; + background-color: var(--color-surface); + color: var(--color-text); margin-left: 0; margin-right: auto; } .message_system { - background-color: #fff3cd; - color: #856404; + background-color: var(--color-primary-disabled); + color: var(--color-primary); margin-left: auto; margin-right: auto; text-align: center; @@ -278,6 +288,7 @@ font-weight: 600; margin-bottom: 4px; opacity: 0.8; + font-family: var(--font-family); } .message_content { @@ -285,66 +296,72 @@ line-height: 1.4; white-space: pre-wrap; word-wrap: break-word; + font-family: var(--font-family); } .message_timestamp { font-size: 11px; margin-top: 4px; opacity: 0.6; + font-family: var(--font-family); } .placeholder_text { text-align: center; - color: #999; + color: var(--color-gray); font-style: italic; margin: 20px 0; + font-family: var(--font-family); } .workflow_status { padding: 8px 12px; - background-color: #e6f2f2; - border-left: 4px solid #3a8088; + background-color: var(--color-secondary-disabled); + border-left: 4px solid var(--color-secondary); border-radius: 4px; - margin: 10px 0; + margin-bottom: 10px; } .workflow_status p { margin: 0; - color: #3a8088; + color: var(--color-secondary); font-size: 13px; font-style: italic; + font-family: var(--font-family); } .completion_message { padding: 10px 12px; - background-color: #e6f2f2; - border-left: 4px solid #3a8088; + background-color: var(--color-secondary-disabled); + border-left: 4px solid var(--color-secondary); border-radius: 4px; - margin: 10px 0; + margin-bottom: 10px; text-align: center; } .completion_message p { margin: 0 0 10px 0; - color: #3a8088; + color: var(--color-secondary); font-size: 14px; font-weight: 600; + font-family: var(--font-family); } .new_workflow_button { - background-color: var(--Brand-Green-Green, #3A8088); - color: white; + background-color: var(--color-secondary); + color: var(--color-bg); border: none; - border-radius: 15px; + border-radius: 8px; padding: 8px 16px; font-size: 12px; font-weight: 500; cursor: pointer; transition: background-color 0.2s ease; + font-family: var(--font-family); } .new_workflow_button:hover { - background-color: #2d6b73; + background-color: var(--color-secondary-hover); } .message_documents { @@ -359,95 +376,105 @@ align-items: center; gap: 8px; padding: 8px 10px; - background-color: rgba(255, 255, 255, 0.1); - border: 1px solid rgba(255, 255, 255, 0.2); - border-radius: 8px; - font-size: 13px; - transition: background-color 0.2s ease; + background-color: var(--color-bg); + border: 1px solid var(--color-gray-disabled); + border-radius: 6px; cursor: pointer; - text-decoration: none; - color: inherit; + transition: all 0.2s ease; + font-size: 13px; } .document_item:hover { - background-color: rgba(255, 255, 255, 0.2); + border-color: var(--color-primary); + background-color: var(--color-surface); } .message_assistant .document_item { - background-color: rgba(0, 0, 0, 0.05); - border-color: rgba(0, 0, 0, 0.1); + background-color: var(--color-bg); + border-color: var(--color-gray-disabled); } .message_assistant .document_item:hover { - background-color: rgba(0, 0, 0, 0.1); + border-color: var(--color-primary); + background-color: var(--color-surface); } .document_icon { - width: 16px; - height: 16px; + font-size: 16px; + color: var(--color-secondary); flex-shrink: 0; - opacity: 0.8; } .document_info { + flex: 1; + min-width: 0; display: flex; flex-direction: column; gap: 2px; - min-width: 0; } .document_name { font-weight: 500; - white-space: nowrap; + color: var(--color-text); overflow: hidden; text-overflow: ellipsis; + white-space: nowrap; + font-family: var(--font-family); } .document_meta { - font-size: 11px; - opacity: 0.7; display: flex; gap: 8px; + font-size: 11px; + color: var(--color-gray); + font-family: var(--font-family); } .document_size { - white-space: nowrap; + font-size: 11px; + color: var(--color-gray); } .document_type { - white-space: nowrap; + font-size: 11px; + color: var(--color-gray); } .document_actions { display: flex; gap: 4px; - margin-left: auto; - flex-shrink: 0; + opacity: 1; + transition: opacity 0.2s ease; +} + +.document_item:hover .document_actions { + opacity: 1; } .document_action_button { + background: none; + border: none; + color: var(--color-gray); + cursor: pointer; + padding: 4px; + border-radius: 4px; + font-size: 14px; display: flex; align-items: center; justify-content: center; - width: 28px; - height: 28px; - border: none; - border-radius: 6px; - background-color: rgba(255, 255, 255, 0.15); - color: inherit; - cursor: pointer; - transition: background-color 0.2s ease; - font-size: 14px; + transition: all 0.2s ease; } .document_action_button:hover { - background-color: rgba(255, 255, 255, 0.25); + background-color: var(--color-surface); + color: var(--color-text); } .message_assistant .document_action_button { - background-color: rgba(0, 0, 0, 0.08); + color: var(--color-gray); } .message_assistant .document_action_button:hover { - background-color: rgba(0, 0, 0, 0.15); + background-color: var(--color-surface); + color: var(--color-text); } \ No newline at end of file diff --git a/src/components/Dashboard/DashboardChat/DashboardChatArea/DashboardChatAreaMessageItem.tsx b/src/components/Dashboard/DashboardChat/DashboardChatArea/DashboardChatAreaMessageItem.tsx index fb65f13..2a67813 100644 --- a/src/components/Dashboard/DashboardChat/DashboardChatArea/DashboardChatAreaMessageItem.tsx +++ b/src/components/Dashboard/DashboardChat/DashboardChatArea/DashboardChatAreaMessageItem.tsx @@ -64,6 +64,15 @@ const MessageItem: React.FC = ({ message, index }) => { const [previewDocument, setPreviewDocument] = useState(null); const [isPreviewOpen, setIsPreviewOpen] = useState(false); + // Debug logging to see if documents are present + console.log('MessageItem rendering:', { + messageId: message.id, + role: message.role, + hasDocuments: !!message.documents, + documentsLength: message.documents?.length || 0, + documents: message.documents + }); + const handleDocumentClick = (document: Document) => { // If there's a downloadUrl, use it; otherwise try the url const downloadLink = document.downloadUrl || document.url; diff --git a/src/components/Dashboard/DashboardChat/DashboardChatArea/FilePreviewPopup.module.css b/src/components/Dashboard/DashboardChat/DashboardChatArea/FilePreviewPopup.module.css index f13d6ca..6a9decb 100644 --- a/src/components/Dashboard/DashboardChat/DashboardChatArea/FilePreviewPopup.module.css +++ b/src/components/Dashboard/DashboardChat/DashboardChatArea/FilePreviewPopup.module.css @@ -13,7 +13,7 @@ } .popup { - background: white; + background: var(--color-bg); border-radius: 12px; box-shadow: 0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04); max-width: 90vw; @@ -22,6 +22,7 @@ display: flex; flex-direction: column; overflow: hidden; + font-family: var(--font-family); } .header { @@ -29,8 +30,8 @@ align-items: center; justify-content: space-between; padding: 16px 20px; - border-bottom: 1px solid #e5e7eb; - background-color: #f9fafb; + border-bottom: 1px solid var(--color-gray-disabled); + background-color: var(--color-surface); flex-shrink: 0; } @@ -38,12 +39,13 @@ margin: 0; font-size: 18px; font-weight: 600; - color: #111827; + color: var(--color-text); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; flex: 1; margin-right: 16px; + font-family: var(--font-family); } .close_button { @@ -55,7 +57,7 @@ border: none; border-radius: 8px; background-color: transparent; - color: #6b7280; + color: var(--color-gray); cursor: pointer; transition: all 0.2s ease; font-size: 18px; @@ -63,8 +65,8 @@ } .close_button:hover { - background-color: #e5e7eb; - color: #374151; + background-color: var(--color-gray-disabled); + color: var(--color-text); } .content { @@ -81,10 +83,11 @@ display: flex; align-items: center; justify-content: center; - color: #6b7280; + color: var(--color-gray); font-size: 16px; width: 100%; height: 100%; + font-family: var(--font-family); } .error { @@ -92,11 +95,12 @@ flex-direction: column; align-items: center; justify-content: center; - color: #dc2626; + color: var(--color-red); font-size: 16px; text-align: center; width: 100%; height: 100%; + font-family: var(--font-family); } .no_preview { @@ -104,11 +108,12 @@ flex-direction: column; align-items: center; justify-content: center; - color: #6b7280; + color: var(--color-gray); font-size: 16px; font-style: italic; width: 100%; height: 100%; + font-family: var(--font-family); } .image_preview { @@ -129,14 +134,14 @@ .text_preview { width: 100%; height: 100%; - background-color: #f8fafc; - border: 1px solid #e2e8f0; + background-color: var(--color-surface); + border: 1px solid var(--color-gray-disabled); border-radius: 8px; padding: 16px; font-family: 'Courier New', monospace; font-size: 14px; line-height: 1.5; - color: #334155; + color: var(--color-text); overflow: auto; white-space: pre-wrap; word-wrap: break-word; @@ -146,15 +151,15 @@ .enhanced_text_preview { width: 100%; height: 100%; - background-color: #ffffff; - border: 1px solid #e2e8f0; + background-color: var(--color-bg); + border: 1px solid var(--color-gray-disabled); border-radius: 8px; padding: 32px; overflow: auto; - font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', sans-serif; + font-family: var(--font-family); box-sizing: border-box; line-height: 1.7; - color: #374151; + color: var(--color-text); } .text_line { @@ -170,68 +175,70 @@ .text_header { font-weight: 600; font-size: 1.1em; - color: #1f2937; + color: var(--color-text); margin: 16px 0 8px 0; padding-bottom: 4px; - border-bottom: 1px solid #e5e7eb; + border-bottom: 1px solid var(--color-gray-disabled); + font-family: var(--font-family); } .text_numbered { margin: 8px 0; padding-left: 8px; - color: #4b5563; + color: var(--color-gray); + font-family: var(--font-family); } .text_bullet { margin: 4px 0; padding-left: 8px; - color: #4b5563; + color: var(--color-gray); + font-family: var(--font-family); } .text_indented { - background-color: #f8fafc; + background-color: var(--color-surface); padding: 8px 12px; margin: 4px 0; - border-left: 3px solid #d1d5db; + border-left: 3px solid var(--color-gray-disabled); border-radius: 4px; font-family: 'Courier New', monospace; font-size: 0.9em; - color: #6b7280; + color: var(--color-gray); } .code_preview { width: 100%; height: 100%; - background-color: #1f2937; - border: 1px solid #374151; + background-color: var(--color-surface); + border: 1px solid var(--color-gray-disabled); border-radius: 8px; - padding: 16px; + overflow: auto; font-family: 'Courier New', monospace; font-size: 14px; - line-height: 1.5; - color: #f9fafb; - overflow: auto; - white-space: pre-wrap; - word-wrap: break-word; + line-height: 1.4; + color: var(--color-text); box-sizing: border-box; + display: flex; + flex-direction: column; } .python_code_preview { width: 100%; height: 100%; - background-color: #0d1117; - border: 1px solid #30363d; + background-color: var(--color-surface); + border: 1px solid var(--color-gray-disabled); border-radius: 8px; - overflow: hidden; + overflow: auto; box-sizing: border-box; display: flex; flex-direction: column; } .code_header { - background-color: #161b22; - padding: 12px 16px; - border-bottom: 1px solid #30363d; + background-color: var(--color-gray-disabled); + padding: 8px 16px; + border-bottom: 1px solid var(--color-gray-disabled); display: flex; justify-content: space-between; align-items: center; @@ -239,41 +246,38 @@ } .code_language { - background-color: #1f6feb; - color: #ffffff; - padding: 4px 8px; - border-radius: 12px; font-size: 12px; - font-weight: 500; + font-weight: 600; + color: var(--color-text); text-transform: uppercase; letter-spacing: 0.5px; + font-family: var(--font-family); } .code_filename { - color: #7d8590; - font-size: 14px; - font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', sans-serif; - font-weight: 500; + font-size: 12px; + color: var(--color-gray); + font-family: var(--font-family); } .python_code_content { - flex: 1; - margin: 0; padding: 16px; - background-color: #0d1117; - color: #e6edf3; - font-family: 'Consolas', 'Monaco', 'Courier New', monospace; - font-size: 14px; - line-height: 1.6; overflow: auto; + flex: 1; + background-color: var(--color-bg); + font-family: 'Courier New', monospace; + font-size: 14px; + line-height: 1.4; + color: var(--color-text); white-space: pre; - tab-size: 4; + word-wrap: break-word; } .python_code_content code { - font-family: inherit; - font-size: inherit; - color: inherit; + font-family: 'Courier New', monospace; + font-size: 14px; + line-height: 1.4; + color: var(--color-text); background: none; padding: 0; } @@ -281,157 +285,156 @@ .markdown_preview { width: 100%; height: 100%; - background-color: #ffffff; - border: 1px solid #e2e8f0; + background-color: var(--color-bg); + border: 1px solid var(--color-gray-disabled); border-radius: 8px; - padding: 24px; + padding: 32px; overflow: auto; - font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', sans-serif; + font-family: var(--font-family); box-sizing: border-box; + line-height: 1.6; + color: var(--color-text); } .markdown_preview h1 { font-size: 2em; - font-weight: 600; + font-weight: 700; margin: 0 0 16px 0; + color: var(--color-text); + border-bottom: 2px solid var(--color-gray-disabled); padding-bottom: 8px; - border-bottom: 1px solid #e2e8f0; - color: #1f2937; } .markdown_preview h2 { font-size: 1.5em; font-weight: 600; margin: 24px 0 12px 0; - color: #374151; + color: var(--color-text); } .markdown_preview h3 { font-size: 1.25em; font-weight: 600; - margin: 20px 0 8px 0; - color: #4b5563; + margin: 20px 0 10px 0; + color: var(--color-text); } .markdown_preview h4, .markdown_preview h5, .markdown_preview h6 { - font-size: 1em; + font-size: 1.1em; font-weight: 600; margin: 16px 0 8px 0; - color: #6b7280; + color: var(--color-text); } .markdown_preview p { margin: 0 0 16px 0; line-height: 1.7; - color: #374151; } .markdown_preview ul, .markdown_preview ol { margin: 0 0 16px 20px; - padding-left: 20px; + line-height: 1.7; } .markdown_preview li { margin: 4px 0; line-height: 1.6; - color: #374151; } .markdown_preview blockquote { margin: 16px 0; padding: 12px 16px; - background-color: #f8fafc; - border-left: 4px solid #3b82f6; - color: #4b5563; + border-left: 4px solid var(--color-primary); + background-color: var(--color-surface); font-style: italic; + color: var(--color-gray); } .markdown_preview code { - background-color: #f1f5f9; - padding: 2px 4px; + background-color: var(--color-surface); + padding: 2px 6px; border-radius: 4px; font-family: 'Courier New', monospace; - font-size: 0.875em; - color: #dc2626; + font-size: 0.9em; + color: var(--color-secondary); } .markdown_preview pre { - background-color: #1f2937; - color: #f9fafb; - padding: 16px; + background-color: var(--color-surface); + border: 1px solid var(--color-gray-disabled); border-radius: 8px; - overflow-x: auto; + padding: 16px; margin: 16px 0; + overflow-x: auto; font-family: 'Courier New', monospace; - font-size: 0.875em; - line-height: 1.5; + font-size: 14px; + line-height: 1.4; } .markdown_preview pre code { background: none; padding: 0; - color: inherit; border-radius: 0; + color: var(--color-text); } .markdown_preview table { - width: 100%; border-collapse: collapse; + width: 100%; margin: 16px 0; - border: 1px solid #e2e8f0; + border: 1px solid var(--color-gray-disabled); } .markdown_preview th, .markdown_preview td { + border: 1px solid var(--color-gray-disabled); padding: 8px 12px; text-align: left; - border: 1px solid #e2e8f0; } .markdown_preview th { - background-color: #f8fafc; + background-color: var(--color-surface); font-weight: 600; - color: #374151; } .markdown_preview td { - color: #4b5563; + background-color: var(--color-bg); } .markdown_preview a { - color: #3b82f6; + color: var(--color-secondary); text-decoration: underline; } .markdown_preview a:hover { - color: #1d4ed8; + color: var(--color-secondary-hover); } .markdown_preview hr { border: none; height: 1px; - background-color: #e2e8f0; + background-color: var(--color-gray-disabled); margin: 24px 0; } .markdown_preview strong { - font-weight: 600; - color: #1f2937; + font-weight: 700; + color: var(--color-text); } .markdown_preview em { font-style: italic; - color: #4b5563; + color: var(--color-gray); } /* Responsive design */ @media (max-width: 768px) { .popup { width: 95vw; - max-height: 95vh; + height: 85vh; } .header { @@ -447,6 +450,6 @@ } .pdf_preview { - height: 400px; + height: calc(100% - 60px); } } \ No newline at end of file diff --git a/src/components/Dashboard/DashboardChat/DashboardChatHistory/DashboardChatHistory.module.css b/src/components/Dashboard/DashboardChat/DashboardChatHistory/DashboardChatHistory.module.css index e3fd1d3..d98e673 100644 --- a/src/components/Dashboard/DashboardChat/DashboardChatHistory/DashboardChatHistory.module.css +++ b/src/components/Dashboard/DashboardChat/DashboardChatHistory/DashboardChatHistory.module.css @@ -3,6 +3,7 @@ display: flex; flex-direction: column; overflow: hidden; + font-family: var(--font-family); } .container { @@ -24,16 +25,18 @@ .history_title { font-size: 18px; font-weight: 600; - color: #333; + color: var(--color-text); margin: 0; + font-family: var(--font-family); } .workflowCount { font-size: 14px; - color: #666; - background-color: #f5f5f5; + color: var(--color-gray); + background-color: var(--color-surface); padding: 4px 12px; border-radius: 12px; + font-family: var(--font-family); } .scrollableContent { @@ -53,9 +56,10 @@ align-items: center; justify-content: center; height: 200px; - color: #999; + color: var(--color-gray); font-size: 16px; text-align: center; + font-family: var(--font-family); } .loadingContainer { @@ -66,8 +70,9 @@ } .loadingText { - color: #666; + color: var(--color-gray); font-size: 16px; + font-family: var(--font-family); } .errorContainer { @@ -80,24 +85,26 @@ } .errorText { - color: #f44336; + color: var(--color-red); font-size: 16px; text-align: center; + font-family: var(--font-family); } .retryButton { - background-color: #2196F3; - color: white; + background-color: var(--color-secondary); + color: var(--color-bg); border: none; padding: 8px 16px; border-radius: 8px; cursor: pointer; font-size: 14px; transition: background-color 0.2s ease; + font-family: var(--font-family); } .retryButton:hover { - background-color: #1976D2; + background-color: var(--color-secondary-hover); } /* Scrollbar styling */ @@ -106,15 +113,15 @@ } .scrollableContent::-webkit-scrollbar-track { - background: #f1f1f1; + background: var(--color-surface); border-radius: 3px; } .scrollableContent::-webkit-scrollbar-thumb { - background: #c1c1c1; + background: var(--color-gray-disabled); border-radius: 3px; } .scrollableContent::-webkit-scrollbar-thumb:hover { - background: #a8a8a8; + background: var(--color-gray); } \ No newline at end of file diff --git a/src/components/Dashboard/DashboardChat/DashboardChatHistory/DashboardChatHistoryItem.module.css b/src/components/Dashboard/DashboardChat/DashboardChatHistory/DashboardChatHistoryItem.module.css index 6368ded..6ee1e96 100644 --- a/src/components/Dashboard/DashboardChat/DashboardChatHistory/DashboardChatHistoryItem.module.css +++ b/src/components/Dashboard/DashboardChat/DashboardChatHistory/DashboardChatHistoryItem.module.css @@ -1,14 +1,15 @@ .workflowItem { - background: white; + background: var(--color-bg); border-radius: 12px; - border: 1px solid #e0e0e0; + border: 1px solid var(--color-gray-disabled); margin-bottom: 12px; transition: all 0.2s ease; box-shadow: 0 2px 4px rgba(0, 0, 0, 0.05); + font-family: var(--font-family); } .workflowItem:hover { - border-color: #d0d0d0; + border-color: var(--color-gray); box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1); } @@ -31,9 +32,10 @@ .workflowId { font-size: 16px; font-weight: 600; - color: #333; + color: var(--color-text); margin: 0 0 8px 0; line-height: 1.2; + font-family: var(--font-family); } .workflowMeta { @@ -48,15 +50,18 @@ font-weight: 600; padding: 4px 8px; border-radius: 12px; - background-color: #f4f3f5; + background-color: var(--color-secondary-disabled); + color: var(--color-secondary); + font-family: var(--font-family); } .workflowRound { font-size: 12px; - color: #888098; - background-color: #f4f3f5; + color: var(--color-gray); + background-color: var(--color-surface); padding: 2px 6px; border-radius: 8px; + font-family: var(--font-family); } .workflowDates { @@ -67,9 +72,10 @@ .workflowDate { font-size: 12px; - color: #666; + color: var(--color-gray); margin: 0; line-height: 1.3; + font-family: var(--font-family); } .workflowDescription { @@ -79,27 +85,28 @@ .messagePreview { margin-bottom: 8px; padding: 8px; - background-color: #f4f3f5; + background-color: var(--color-surface); border-radius: 6px; - border-left: 3px solid #888098; + border-left: 3px solid var(--color-gray); } - .previewText { font-size: 13px; - color: #888098; + color: var(--color-gray); margin: 0; line-height: 1.4; word-break: break-word; font-style: italic; + font-family: var(--font-family); } .workflowName { font-size: 14px; - color: #555; + color: var(--color-gray); margin: 0; line-height: 1.4; word-break: break-word; + font-family: var(--font-family); } .actionButtons { @@ -128,32 +135,33 @@ } .resumeButton { - background-color: #3a8088; - color: white; + background-color: var(--color-secondary); + color: var(--color-bg); } .resumeButton:hover:not(:disabled) { - background-color: #34737b; + background-color: var(--color-secondary-hover); transform: translateY(-1px); } .deleteButton { - background-color: #d85b65; - color: white; + background-color: var(--color-red); + color: var(--color-bg); } .deleteButton:hover:not(:disabled) { - background-color: #c3525b; + background-color: var(--color-red-hover); transform: translateY(-1px); } .deletingMessage { padding: 8px 16px; - background-color: #fff3cd; - border-top: 1px solid #e0e0e0; - color: #856404; + background-color: var(--color-primary-disabled); + border-top: 1px solid var(--color-gray-disabled); + color: var(--color-primary); font-size: 12px; text-align: center; + font-family: var(--font-family); } @media (max-width: 768px) { diff --git a/src/components/Dashboard/DashboardChat/DashboardChatHistory/DashboardChatHistoryItem.tsx b/src/components/Dashboard/DashboardChat/DashboardChatHistory/DashboardChatHistoryItem.tsx index 37c7f22..a13d917 100644 --- a/src/components/Dashboard/DashboardChat/DashboardChatHistory/DashboardChatHistoryItem.tsx +++ b/src/components/Dashboard/DashboardChat/DashboardChatHistory/DashboardChatHistoryItem.tsx @@ -53,18 +53,18 @@ function DashboardChatHistoryItem({ workflow, onDelete, onResume }: DashboardCha case 'completed': case 'finished': case 'done': - return '#3a8088'; + return 'var(--color-secondary)'; case 'running': case 'processing': - return '#888098'; + return 'var(--color-gray)'; case 'error': case 'failed': - return '#d85d67'; + return 'var(--color-red)'; case 'stopped': case 'cancelled': - return '#d85d67'; + return 'var(--color-red)'; default: - return '#888098'; + return 'var(--color-gray)'; } }; @@ -73,17 +73,17 @@ function DashboardChatHistoryItem({ workflow, onDelete, onResume }: DashboardCha case 'completed': case 'finished': case 'done': - return '#e6f2f2'; + return 'var(--color-secondary-disabled)'; case 'running': case 'processing': - return '#f0f0f5'; + return 'var(--color-gray-disabled)'; case 'error': case 'failed': case 'stopped': case 'cancelled': - return '#fceff0'; + return 'var(--color-red-disabled)'; default: - return '#f0f0f5'; + return 'var(--color-gray-disabled)'; } }; diff --git a/src/components/Dashboard/DashboardLog/DashboardLog.module.css b/src/components/Dashboard/DashboardLog/DashboardLog.module.css index 51f2e0f..577ec53 100644 --- a/src/components/Dashboard/DashboardLog/DashboardLog.module.css +++ b/src/components/Dashboard/DashboardLog/DashboardLog.module.css @@ -4,8 +4,7 @@ flex-direction: column; align-self: stretch; border-radius: 30px; - border: 1px solid var(--f-1-f-1-f-1, #F1F1F1); - background: var(--Grayscale-True-White, #FFF); + background: var(--color-bg); position: relative; box-shadow: 0px 2px 6px 0px rgba(194, 194, 194, 0.10); height: 100%; @@ -40,36 +39,36 @@ border: none; background: none; outline: none; - color: var(--Grayscale-Black, #24262B); + color: var(--color-text); cursor: default; } .log_title_collapsed { opacity: 50%; - color: #A0A0A0; + color: var(--color-gray); } .collapseIcon { cursor: pointer; display: flex; align-items: center; - color: #666; + color: var(--color-gray); } .collapseIcon:hover { - color: #333; + color: var(--color-gray); } .horizontalLine { width: 100%; - background-color: black; + background-color: var(--color-gray); height: 2px; margin-top: 19px; } .horizontalLineLight { width: calc(100%); - background-color: #F1F1F1; + background-color: var(--color-gray); height: 2px; margin-top: 39px; margin-left: -20px; diff --git a/src/components/Dashboard/DashboardPrompt/DashboardPrompt.module.css b/src/components/Dashboard/DashboardPrompt/DashboardPrompt.module.css index b182aa9..cbe517c 100644 --- a/src/components/Dashboard/DashboardPrompt/DashboardPrompt.module.css +++ b/src/components/Dashboard/DashboardPrompt/DashboardPrompt.module.css @@ -4,12 +4,12 @@ flex-direction: column; align-self: stretch; border-radius: 30px; - border: 1px solid var(--f-1-f-1-f-1, #F1F1F1); - background: var(--Grayscale-True-White, #FFF); + background: var(--color-bg); position: relative; box-shadow: 0px 2px 6px 0px rgba(194, 194, 194, 0.10); width: 100%; transition: height 0.3s ease; + font-family: var(--font-family); } .dashboard_prompt:not(.collapsed) { @@ -46,8 +46,9 @@ border: none; background: none; outline: none; - color: var(--Grayscale-Black, #24262B); + color: var(--color-text); transition: opacity 0.3s ease, color 0.3s ease; + font-family: var(--font-family); } .prompt_button_inactive { @@ -56,7 +57,7 @@ .prompt_button_collapsed { opacity: 50%; - color: #A0A0A0; + color: var(--color-gray); } .buttonWrapper { @@ -68,17 +69,17 @@ cursor: pointer; display: flex; align-items: center; - color: #666; + color: var(--color-gray); transition: color 0.3s ease; } .expandIcon:hover { - color: #333; + color: var(--color-text); } .horizontalLine { width: 100%; - background-color: black; + background-color: var(--color-text); height: 2px; margin-top: 19px; transition: opacity 0.3s ease; @@ -86,7 +87,7 @@ .horizontalLineLight { width: calc(100%); - background-color: #F1F1F1; + background-color: var(--color-gray-disabled); height: 2px; margin-top: 39px; margin-left: -20px; @@ -111,6 +112,7 @@ opacity: 1; position: relative; } + .content_collapsed { opacity: 0; max-height: 0; @@ -142,10 +144,12 @@ will-change: transform, opacity; transition: transform 0.3s cubic-bezier(0.4,0,0.2,1), opacity 0.3s cubic-bezier(0.4,0,0.2,1); } + .collapseContent.collapsed { transform: translateY(-100%); opacity: 0; } + .collapseContent.expanded { transform: translateY(0); opacity: 1; diff --git a/src/components/Dashboard/DashboardPrompt/DashboardPromptSet/DashboardPromptSet.module.css b/src/components/Dashboard/DashboardPrompt/DashboardPromptSet/DashboardPromptSet.module.css index 5d9f36c..402abcb 100644 --- a/src/components/Dashboard/DashboardPrompt/DashboardPromptSet/DashboardPromptSet.module.css +++ b/src/components/Dashboard/DashboardPrompt/DashboardPromptSet/DashboardPromptSet.module.css @@ -2,6 +2,7 @@ display: flex; flex-direction: column; overflow: hidden; + font-family: var(--font-family); } .header { @@ -16,8 +17,8 @@ .addButton { border-radius: 30px; - background: var(--Brand-Green-Green, #3A8088); - color: white; + background: var(--color-secondary); + color: var(--color-bg); border: none; outline: none; text-align: left; @@ -28,15 +29,19 @@ display: flex; gap: 10px; align-items: center; + font-family: var(--font-family); + transition: background-color 0.2s ease; } .addButton:hover { cursor: pointer; + background: var(--color-secondary-hover); } .promptCount { font-size: 0.875rem; - color: #6b7280; + color: var(--color-gray); + font-family: var(--font-family); } .scrollableContent { @@ -57,12 +62,12 @@ } .scrollableContent::-webkit-scrollbar-thumb { - background: #ccc; + background: var(--color-gray-disabled); border-radius: 3px; } .scrollableContent::-webkit-scrollbar-thumb:hover { - background: #999; + background: var(--color-gray); } .promptsList { @@ -80,39 +85,43 @@ } .loadingText { - color: #6b7280; + color: var(--color-gray); + font-family: var(--font-family); } .errorContainer { padding: 1rem; - background-color: #fef2f2; - border: 1px solid #fecaca; + background-color: var(--color-red-disabled); + border: 1px solid var(--color-red); border-radius: 0.5rem; } .errorText { - color: #b91c1c; + color: var(--color-red); + font-family: var(--font-family); } .retryButton { margin-top: 0.5rem; padding: 0.5rem 1rem; - background-color: #dc2626; - color: white; + background-color: var(--color-red); + color: var(--color-bg); border-radius: 0.375rem; border: none; cursor: pointer; transition: background-color 0.2s; + font-family: var(--font-family); } .retryButton:hover { - background-color: #b91c1c; + background-color: var(--color-red-hover); } .emptyState { text-align: center; padding: 2rem; - color: #6b7280; + color: var(--color-gray); + font-family: var(--font-family); } diff --git a/src/components/Dashboard/DashboardPrompt/DashboardPromptSet/DashboardPromptSetItem.module.css b/src/components/Dashboard/DashboardPrompt/DashboardPromptSet/DashboardPromptSetItem.module.css index aafb6c9..9477ad9 100644 --- a/src/components/Dashboard/DashboardPrompt/DashboardPromptSet/DashboardPromptSetItem.module.css +++ b/src/components/Dashboard/DashboardPrompt/DashboardPromptSet/DashboardPromptSetItem.module.css @@ -1,5 +1,5 @@ .promptItem { - background: var(--Grayscale-Light-Gray, #F9F9F9); + background: var(--color-surface); border-radius: 30px; display: flex; padding: 20px; @@ -7,7 +7,7 @@ align-items: flex-start; align-self: stretch; justify-content: top; - font-family: 'Avenir', sans-serif; + font-family: var(--font-family); gap: 11px; font-size: 14px; } @@ -28,13 +28,15 @@ .promptName { font-weight: 400; - color: #000; + color: var(--color-text); margin:0; + font-family: var(--font-family); } .promptDate { font: 14px; - color: #6b7280; + color: var(--color-gray); + font-family: var(--font-family); } .promptText { @@ -44,6 +46,8 @@ min-height: 0; opacity: 0.5; margin:0; + color: var(--color-text); + font-family: var(--font-family); } .promptText.p { @@ -60,10 +64,12 @@ .actionButton { padding: 0.5rem; border-radius: 12px; - background: var(--Brand-Green-Green, #3A8088); - color: #fff; + background: var(--color-secondary); + color: var(--color-bg); cursor: pointer; border: none; + font-family: var(--font-family); + transition: background-color 0.2s ease; } .actionButton:disabled { @@ -73,39 +79,39 @@ .runButton { border-radius: 12px; - background: var(--Brand-Green-Green, #3A8088); - color: #fff; + background: var(--color-secondary); + color: var(--color-bg); } .runButton:hover:not(:disabled) { border-radius: 12px; - background: var(--Brand-Green-Green, #3A8088); - color: #fff; + background: var(--color-secondary-hover); + color: var(--color-bg); cursor: pointer; } .shareButton { border-radius: 12px; - background: var(--Brand-Green-Green, #3A8088); - color: #fff; + background: var(--color-secondary); + color: var(--color-bg); } .shareButton:hover:not(:disabled) { border-radius: 12px; - background: var(--Brand-Green-Green, #3A8088); - color: #fff; + background: var(--color-secondary-hover); + color: var(--color-bg); } .deleteButton { border-radius: 12px; - background: var(--Brand-Green-Green, #3A8088); - color: #fff; + background: var(--color-red); + color: var(--color-bg); } .deleteButton:hover:not(:disabled) { border-radius: 12px; - background: var(--Brand-Green-Green, #3A8088); - color: #fff; + background: var(--color-red-hover); + color: var(--color-bg); } .promptContent { @@ -120,15 +126,17 @@ .errorMessage { margin-top: 0.75rem; padding: 0.5rem; - background-color: #fef2f2; - border: 1px solid #fecaca; + background-color: var(--color-red-disabled); + border: 1px solid var(--color-red); border-radius: 0.25rem; font-size: 0.875rem; - color: #b91c1c; + color: var(--color-red); + font-family: var(--font-family); } .deletingMessage { margin-top: 0.75rem; font-size: 0.875rem; - color: #6b7280; + color: var(--color-gray); + font-family: var(--font-family); } diff --git a/src/components/Dashboard/DashboardPrompt/DashboardPromptSettings/DashboardPromptSettings.module.css b/src/components/Dashboard/DashboardPrompt/DashboardPromptSettings/DashboardPromptSettings.module.css index edd64e3..071b746 100644 --- a/src/components/Dashboard/DashboardPrompt/DashboardPromptSettings/DashboardPromptSettings.module.css +++ b/src/components/Dashboard/DashboardPrompt/DashboardPromptSettings/DashboardPromptSettings.module.css @@ -3,6 +3,7 @@ flex-direction: column; height: 100%; position: relative; + font-family: var(--font-family); } .cancelContainer { @@ -17,19 +18,20 @@ align-items: center; gap: 4px; padding: 8px 16px; - background: white; - border: 1px solid #ddd; + background: var(--color-bg); + border: 1px solid var(--color-gray-disabled); border-radius: 20px; - color: #666; + color: var(--color-gray); font-size: 14px; cursor: pointer; transition: all 0.2s; - font-family: Arial, Helvetica, sans-serif; + font-family: var(--font-family); } .cancelButton:hover { - background-color: #f5f5f5; - border-color: #ccc; + background-color: var(--color-surface); + border-color: var(--color-gray); + color: var(--color-text); } .cancelIcon { diff --git a/src/components/Dateien/DateienHinzufügen/DateienSelector.module.css b/src/components/Dateien/DateienHinzufügen/DateienSelector.module.css index fa99e69..24273b7 100644 --- a/src/components/Dateien/DateienHinzufügen/DateienSelector.module.css +++ b/src/components/Dateien/DateienHinzufügen/DateienSelector.module.css @@ -13,7 +13,7 @@ } .modal { - background: white; + background: var(--color-bg); border-radius: 12px; box-shadow: 0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04); max-width: 90vw; @@ -23,6 +23,7 @@ display: flex; flex-direction: column; overflow: hidden; + font-family: var(--font-family); } .header { @@ -30,8 +31,8 @@ align-items: center; justify-content: space-between; padding: 20px; - border-bottom: 1px solid #e5e7eb; - background-color: #f9fafb; + border-bottom: 1px solid var(--color-gray-disabled); + background-color: var(--color-surface); flex-shrink: 0; } @@ -39,7 +40,8 @@ margin: 0; font-size: 20px; font-weight: 600; - color: #111827; + color: var(--color-text); + font-family: var(--font-family); } .closeButton { @@ -51,15 +53,15 @@ border: none; border-radius: 8px; background-color: transparent; - color: #6b7280; + color: var(--color-gray); cursor: pointer; transition: all 0.2s ease; font-size: 18px; } .closeButton:hover { - background-color: #e5e7eb; - color: #374151; + background-color: var(--color-gray-disabled); + color: var(--color-text); } .content { @@ -71,8 +73,8 @@ .tabNavigation { display: flex; - border-bottom: 1px solid #e5e7eb; - background-color: #f9fafb; + border-bottom: 1px solid var(--color-gray-disabled); + background-color: var(--color-surface); padding: 0 20px; } @@ -80,22 +82,23 @@ padding: 12px 16px; border: none; background: none; - color: #6b7280; + color: var(--color-gray); font-size: 14px; font-weight: 500; cursor: pointer; border-bottom: 2px solid transparent; transition: all 0.2s ease; white-space: nowrap; + font-family: var(--font-family); } .tabButton:hover { - color: #374151; + color: var(--color-text); } .tabButton.active { - color: var(--Brand-Green-Green, #3A8088); - border-bottom-color: var(--Brand-Green-Green, #3A8088); + color: var(--color-secondary); + border-bottom-color: var(--color-secondary); } .actionBar { @@ -103,8 +106,8 @@ align-items: center; justify-content: space-between; padding: 16px 20px; - border-bottom: 1px solid #e5e7eb; - background-color: #ffffff; + border-bottom: 1px solid var(--color-gray-disabled); + background-color: var(--color-bg); } .selectionControls { @@ -118,24 +121,26 @@ align-items: center; gap: 8px; padding: 8px 12px; - border: 1px solid #d1d5db; + border: 1px solid var(--color-gray-disabled); border-radius: 6px; - background-color: #ffffff; - color: #374151; + background-color: var(--color-bg); + color: var(--color-text); font-size: 14px; cursor: pointer; transition: all 0.2s ease; + font-family: var(--font-family); } .selectAllButton:hover { - background-color: #f9fafb; - border-color: #9ca3af; + background-color: var(--color-surface); + border-color: var(--color-gray); } .selectionCount { font-size: 14px; - color: #6b7280; + color: var(--color-gray); font-weight: 500; + font-family: var(--font-family); } .uploadButton { @@ -145,16 +150,17 @@ padding: 10px 16px; border: none; border-radius: 8px; - background-color: var(--Brand-Green-Green, #3A8088); - color: white; + background-color: var(--color-secondary); + color: var(--color-bg); font-size: 14px; font-weight: 500; cursor: pointer; transition: background-color 0.2s ease; + font-family: var(--font-family); } .uploadButton:hover { - background-color: #2d6b73; + background-color: var(--color-secondary-hover); } .fileListContainer { @@ -170,13 +176,14 @@ align-items: center; justify-content: center; height: 200px; - color: #6b7280; + color: var(--color-gray); font-size: 16px; text-align: center; + font-family: var(--font-family); } .error { - color: #dc2626; + color: var(--color-red); } .selectableFileList { @@ -190,21 +197,21 @@ align-items: center; gap: 12px; padding: 12px; - border: 1px solid #e5e7eb; + border: 1px solid var(--color-gray-disabled); border-radius: 8px; - background-color: #ffffff; + background-color: var(--color-bg); cursor: pointer; transition: all 0.2s ease; } .selectableFileItem:hover { - background-color: #f9fafb; - border-color: #d1d5db; + background-color: var(--color-surface); + border-color: var(--color-primary); } .selectableFileItem.selected { - background-color: #f0f8f8; - border-color: var(--Brand-Green-Green, #3A8088); + background-color: var(--color-primary-disabled); + border-color: var(--color-primary); } .fileCheckbox { diff --git a/src/components/Dateien/DateienHinzufügen/DateienUploadTool.module.css b/src/components/Dateien/DateienHinzufügen/DateienUploadTool.module.css index b762b8e..540573e 100644 --- a/src/components/Dateien/DateienHinzufügen/DateienUploadTool.module.css +++ b/src/components/Dateien/DateienHinzufügen/DateienUploadTool.module.css @@ -14,18 +14,19 @@ .h2 { font-size: 24px; font-weight: 600; - font-family: 'Arial', sans-serif; - + font-family: var(--font-family); + color: var(--color-text); } .modal { - background: white; + background: var(--color-bg); padding: 35px 40px 30px 40px; border-radius: 30px; width: 90%; max-width: 500px; position: relative; box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1); + font-family: var(--font-family); } .modalHeader { @@ -38,7 +39,8 @@ .modalHeader h2 { margin: 0; font-size: 1.5rem; - color: #333; + color: var(--color-text); + font-family: var(--font-family); } .closeButton { @@ -46,7 +48,7 @@ border: none; font-size: 1.5rem; cursor: pointer; - color: #666; + color: var(--color-gray); padding: 0.25rem; display: flex; align-items: center; @@ -54,7 +56,7 @@ } .closeButton:hover { - color: #333; + color: var(--color-text); } .closeButton:disabled { @@ -68,49 +70,52 @@ margin-bottom: 1rem; text-align: center; font-weight: 500; + font-family: var(--font-family); } .uploadStatus.success { - background-color: #e6f2f2; - color: #3a8088; - border: 1px solid #3a8088; + background-color: var(--color-secondary-disabled); + color: var(--color-secondary); + border: 1px solid var(--color-secondary); } .uploadStatus.error { - background-color: #fceff0; - color: #d85d67; - border: 1px solid #d85d67; + background-color: var(--color-red-disabled); + color: var(--color-red); + border: 1px solid var(--color-red); } .dropzone { - border: 2px dashed #ccc; + border: 2px dashed var(--color-gray-disabled); border-radius: 15px; padding: 2rem; text-align: center; cursor: pointer; margin: 1rem 0; transition: all 0.3s ease; + background-color: var(--color-bg); } .dropzone.active { - border-color: #3a8088; - background-color: #e6f2f2; + border-color: var(--color-secondary); + background-color: var(--color-secondary-disabled); } .dropzone.uploading { - border-color: #3a8088; - background-color: #e6f2f2; + border-color: var(--color-secondary); + background-color: var(--color-secondary-disabled); cursor: wait; } .uploadIcon { font-size: 3rem; - color: #666; + color: var(--color-gray); margin-bottom: 1rem; } .dropzoneText { - color: #666; + color: var(--color-gray); + font-family: var(--font-family); } .dropzoneText p { @@ -118,43 +123,41 @@ } .browseButton { - background-color: #3a8088; - color: white; + background-color: var(--color-secondary); + color: var(--color-bg); border: none; padding: 0.5rem 1rem; border-radius: 15px; cursor: pointer; - + font-family: var(--font-family); } .browseButton:hover { - background-color: #34737b; + background-color: var(--color-secondary-hover); } .browseButton:disabled { - background-color: #f4f3f5; - color: #888098; + background-color: var(--color-gray-disabled); + color: var(--color-gray); cursor: not-allowed; } - - .uploadButton { - background-color: #3a8088; - color: white; + background-color: var(--color-secondary); + color: var(--color-bg); border: none; padding: 0.5rem 1rem; border-radius: 15px; cursor: pointer; - + font-family: var(--font-family); } .uploadButton:hover { - background-color: #34737b; + background-color: var(--color-secondary-hover); } .uploadButton:disabled { - background-color: #f4f3f5; - color: #888098; + background-color: var(--color-gray-disabled); + color: var(--color-gray); cursor: not-allowed; } \ No newline at end of file diff --git a/src/components/Dateien/DateienItem.module.css b/src/components/Dateien/DateienItem.module.css index d423336..607ed9e 100644 --- a/src/components/Dateien/DateienItem.module.css +++ b/src/components/Dateien/DateienItem.module.css @@ -4,12 +4,13 @@ height: 60px; padding: 0px 16px; justify-content: space-between; - color: var(--Grayscale-Black, #24262B); + color: var(--color-text); transition: background-color 0.2s ease; + font-family: var(--font-family); } .fileItem:hover { - background-color: #f9f9f9; + background-color: var(--color-surface); } /* Column layout matching the header structure */ @@ -18,8 +19,9 @@ align-items: center; overflow: hidden; font-weight: 500; - color: #333; + color: var(--color-text); padding-left: 14px; /* Align with table header */ + font-family: var(--font-family); } .fileName span { @@ -31,28 +33,31 @@ .fileType { font-size: 14px; - color: #666; + color: var(--color-gray); overflow: hidden; white-space: nowrap; text-overflow: ellipsis; display: flex; flex-direction: column; gap: 2px; + font-family: var(--font-family); } .fileSource { font-size: 12px; - color: #888; + color: var(--color-gray-hover); font-weight: 400; opacity: 0.8; + font-family: var(--font-family); } .fileSize { font-size: 14px; - color: #666; + color: var(--color-gray); overflow: hidden; white-space: nowrap; text-overflow: ellipsis; + font-family: var(--font-family); } .fileDateWithActions { @@ -64,16 +69,17 @@ .fileDate { font-size: 14px; - color: #666; + color: var(--color-gray); overflow: hidden; white-space: nowrap; text-overflow: ellipsis; margin-right: 8px; + font-family: var(--font-family); } .icon { font-size: 18px; - color: #757575; + color: var(--color-gray); flex-shrink: 0; } @@ -95,34 +101,35 @@ border: none; border-radius: 4px; background-color: transparent; - color: var(--text-color-secondary, #666); + color: var(--color-gray); cursor: pointer; transition: all 0.2s ease; min-width: 32px; + font-family: var(--font-family); } .downloadButton:hover:not(:disabled), .deleteButton:hover:not(:disabled), .previewButton:hover:not(:disabled) { - background-color: var(--background-color-hover, #e8e8e8); - color: var(--text-color-primary, #333); + background-color: var(--color-surface); + color: var(--color-text); } .deleteButton:hover:not(:disabled) { - color: #dc2626; + color: var(--color-red); } .previewButton:hover:not(:disabled) { - color: #3b82f6; + color: var(--color-secondary); } .deleteButton.confirm { - background-color: #fee2e2; - color: #dc2626; + background-color: var(--color-red-disabled); + color: var(--color-red); } .deleteButton.confirm:hover:not(:disabled) { - background-color: #fecaca; + background-color: var(--color-red-hover); } .downloadButton:disabled, @@ -139,18 +146,19 @@ .downloadButton.downloading, .deleteButton.deleting { - background-color: var(--background-color-light, #f5f5f5); + background-color: var(--color-surface); } .actionText { font-size: 12px; - color: var(--text-color-secondary, #666); + color: var(--color-gray); animation: pulse 1.5s infinite; white-space: nowrap; + font-family: var(--font-family); } .deleteButton.confirm .actionText { - color: #dc2626; + color: var(--color-red); animation: none; } diff --git a/src/components/Dateien/DateienLists.module.css b/src/components/Dateien/DateienLists.module.css index 279015a..b1cd95e 100644 --- a/src/components/Dateien/DateienLists.module.css +++ b/src/components/Dateien/DateienLists.module.css @@ -4,8 +4,9 @@ justify-content: center; align-items: center; padding: 60px 20px; - color: var(--text-color-secondary, #666); + color: var(--color-gray); font-style: italic; + font-family: var(--font-family); } /* Files table container */ @@ -30,8 +31,8 @@ position: sticky; top: 0; z-index: 10; - background-color: #fff; - border-bottom: 1px solid #f1f1f1; + background-color: var(--color-bg); + border-bottom: 1px solid var(--color-gray-disabled); margin-bottom: 10px; flex-shrink: 0; } @@ -42,15 +43,16 @@ align-items: center; font-weight: 500; font-size: 14px; - color: #333; + color: var(--color-text); cursor: pointer; white-space: nowrap; padding-left: 0; transition: color 0.2s ease; + font-family: var(--font-family); } .headerCell:hover { - color: var(--Grayscale-Black, #24262B); + color: var(--color-primary); } /* Adjust first column for icon space */ @@ -62,12 +64,12 @@ .sortIcon { margin-left: 6px; font-size: 14px; - color: #666; + color: var(--color-gray); transition: color 0.2s ease; } .headerCell:hover .sortIcon { - color: var(--Grayscale-Black, #24262B); + color: var(--color-primary); } /* File list styling */ @@ -85,7 +87,7 @@ .filesList li { display: grid !important; grid-template-columns: 45% 15% 15% 25%; - border-bottom: 1px solid #f1f1f1; + border-bottom: 1px solid var(--color-gray-disabled); height: 60px; padding: 0 16px; align-items: center; @@ -94,7 +96,7 @@ } .filesList li:hover { - background-color: #f9f9f9; + background-color: var(--color-surface); } diff --git a/src/components/Mitglieder/MitgliederItem.module.css b/src/components/Mitglieder/MitgliederItem.module.css index ecc7396..3b6cf50 100644 --- a/src/components/Mitglieder/MitgliederItem.module.css +++ b/src/components/Mitglieder/MitgliederItem.module.css @@ -4,7 +4,8 @@ height: 70px; padding: 0px 16px; justify-content: space-between; - color: var(--Grayscale-Black, #24262B); + color: var(--color-text); + font-family: var(--font-family); } .userProfile { @@ -13,7 +14,7 @@ .profileIcon { font-size: 36px; - color: var(--Grayscale-Gray, #E9E9E9); + color: var(--color-gray-disabled); } .userInfo { @@ -27,6 +28,8 @@ .userName { margin: 0; font-size: 14px; + color: var(--color-text); + font-family: var(--font-family); } .userEmail, @@ -34,20 +37,21 @@ margin: 0; font-size: 12px; font-weight: light; + color: var(--color-gray); + font-family: var(--font-family); } .actions { display: flex; - align-items: center; justify-content: center; } .editBtn:hover { - color: var(--Brand-Green-Green, #3A8088); + color: var(--color-secondary); } .deleteBtn:hover { - color: var(--Brand-Green-Green, #3A8088); + color: var(--color-red); } \ No newline at end of file diff --git a/src/components/Sidebar/Sidebar.module.css b/src/components/Sidebar/Sidebar.module.css index 91b8f51..f69c064 100644 --- a/src/components/Sidebar/Sidebar.module.css +++ b/src/components/Sidebar/Sidebar.module.css @@ -1,13 +1,14 @@ /* Allgemeine Stile */ .sidebarContainer { border-radius: 30px; - border: 1px solid var(--f-1-f-1-f-1, #F1F1F1); - background: var(--Grayscale-True-White, #FFF); + border: none; + background: var(--color-bg); box-shadow: 0px 2px 6px 0px rgba(194, 194, 194, 0.10); width: 240px; flex-shrink: 0; margin-top: 51px; margin-left: 49px; + padding-bottom: 1px; } .sidebar { @@ -17,21 +18,23 @@ align-items: flex-start; flex-shrink: 0; margin: 0 0 30px 0; + font-family: var(--font-family); } .logoContainer { display: flex; width: 200px; height: 60px; - padding: 13px 20px; + padding: 13px 20px 7px 20px; justify-content: center; - align-items: flex-start; + align-items: center; flex-shrink: 0; } .logo { - max-width: 100%; + max-width: 80%; height: auto; + color: var(--color-primary); } diff --git a/src/components/Sidebar/Sidebar.tsx b/src/components/Sidebar/Sidebar.tsx index dce007f..97fd34e 100644 --- a/src/components/Sidebar/Sidebar.tsx +++ b/src/components/Sidebar/Sidebar.tsx @@ -22,7 +22,7 @@ const Sidebar: React.FC = ({ data }) => { return (
- Logo + Logo
diff --git a/src/components/Sidebar/SidebarData.tsx b/src/components/Sidebar/SidebarData.tsx index 5136b3b..53c3f5e 100644 --- a/src/components/Sidebar/SidebarData.tsx +++ b/src/components/Sidebar/SidebarData.tsx @@ -50,7 +50,7 @@ const useSidebarData = () => { { id: '7', name: 'Settings', - link: '', + link: 'einstellungen', icon: GoGear, }, { diff --git a/src/components/Sidebar/SidebarItem.module.css b/src/components/Sidebar/SidebarItem.module.css index 4641ad2..cdb2a7e 100644 --- a/src/components/Sidebar/SidebarItem.module.css +++ b/src/components/Sidebar/SidebarItem.module.css @@ -12,24 +12,24 @@ padding: 0 3px 0 15px; align-items: center; gap: 9px; - color: var(--Grayscale-Black, #24262B); + color: var(--color-text); } .menu li:hover, .menu li.active { - background: var(--Brand-Purple-Purple, #5F59D4); - color: white; + background: var(--color-secondary); + color: var(--color-bg); border-top-right-radius: 12px; border-bottom-right-radius: 12px; } .menu li:hover a, .menu li.active a { - color: white; + color: var(--color-bg); text-decoration: none; } .menu li a { text-decoration: none; - font-family: Avenir, Helvetica, Arial, sans-serif; + font-family: var(--font-family); font-size: 14px; font-style: normal; font-weight: 500; diff --git a/src/components/Sidebar/SidebarSubmenu.module.css b/src/components/Sidebar/SidebarSubmenu.module.css index 2d128a4..480ce38 100644 --- a/src/components/Sidebar/SidebarSubmenu.module.css +++ b/src/components/Sidebar/SidebarSubmenu.module.css @@ -1,6 +1,6 @@ .submenu { position: relative; - background-color: white; + background-color: var(--color-bg); overflow: hidden; } @@ -19,7 +19,7 @@ .verticalLine { width: 1px; - background-color: #F1F1F1; + background-color: var(--color-gray-disabled); margin-left: 46px; margin-right: -40px; } @@ -32,7 +32,7 @@ .submenuList li { width: 153px; height: 20px; - color: var(--Grayscale-Black, #24262B); + color: var(--color-text); margin: 4px 0; position: relative; overflow: hidden; @@ -44,10 +44,11 @@ font-style: normal; font-weight: 500; line-height: normal; - color: var(--Grayscale-Black, #24262B); + color: var(--color-text); text-decoration: none; display: block; overflow: hidden; + font-family: var(--font-family); } .textContainer { diff --git a/src/components/Sidebar/SidebarUser.module.css b/src/components/Sidebar/SidebarUser.module.css index e5b67c6..6e8cc22 100644 --- a/src/components/Sidebar/SidebarUser.module.css +++ b/src/components/Sidebar/SidebarUser.module.css @@ -7,6 +7,7 @@ flex-direction: column; align-items: flex-start; gap: 8px; + font-family: var(--font-family); } .user_info { @@ -18,7 +19,7 @@ .user_icon { font-size: 40px; - color: #666; + color: var(--color-gray); flex-shrink: 0; } @@ -32,32 +33,37 @@ margin: 0; font-size: 16pt; line-height: 1.2; + color: var(--color-text); + font-family: var(--font-family); } .user_section p { margin: 0; font-size: 0.9rem; - color: #666; + color: var(--color-gray); + font-family: var(--font-family); } .logout_button { margin-top: 4px; padding: 8px 16px; - background-color: var(--Brand-Purple-Purple, #5F59D4); - color: white; + background-color: var(--color-secondary); + color: var(--color-bg); border: none; - border-radius: 4px; + border-radius: 15px; cursor: pointer; font-size: 14px; + font-family: var(--font-family); transition: background-color 0.2s; width: 100%; } .logout_button:hover { + background-color: var(--color-secondary-hover); cursor: pointer; } .logout_button:active { - background-color: #b71c1c; + background-color: var(--color-red); } diff --git a/src/pages/Dashboard.module.css b/src/pages/Dashboard.module.css index e560362..8578ecd 100644 --- a/src/pages/Dashboard.module.css +++ b/src/pages/Dashboard.module.css @@ -3,6 +3,7 @@ display: flex; flex-direction: column; gap: 20px; + font-family: var(--font-family); } .chatLogContainer { diff --git a/src/pages/Dateien/Dateien.module.css b/src/pages/Dateien/Dateien.module.css index 3faa985..4e798eb 100644 --- a/src/pages/Dateien/Dateien.module.css +++ b/src/pages/Dateien/Dateien.module.css @@ -5,17 +5,18 @@ flex-direction: column; align-self: stretch; border-radius: 30px; - border: 1px solid var(--f-1-f-1-f-1, #F1F1F1); - background: var(--Grayscale-True-White, #FFF); + border: 1px solid var(--color-gray-disabled); + background: var(--color-bg); position: relative; box-shadow: 0px 2px 6px 0px rgba(194, 194, 194, 0.10); max-height: calc(100vh - 100px); overflow: hidden; + font-family: var(--font-family); } .horizontalLineLight { width: calc(100% + 60px); - background-color: #F1F1F1; + background-color: var(--color-gray-disabled); height: 1px; margin-left: -30px; margin-bottom: 0; @@ -34,8 +35,8 @@ .datei_hinzufügen_button { border-radius: 30px; - background: #3a8080; - color: #fff; + background: var(--color-secondary); + color: var(--color-bg); border: none; outline: none; text-align: left; @@ -48,11 +49,12 @@ align-items: center; flex-shrink: 0; transition: background-color 0.2s ease; + font-family: var(--font-family); } .datei_hinzufügen_button:hover { cursor: pointer; - background-color: #34737b; + background-color: var(--color-secondary-hover); } .add_icon { @@ -87,19 +89,19 @@ transition: all 0.2s ease; white-space: nowrap; position: relative; + font-family: var(--font-family); } .tabButtonActive { - color: var(--Grayscale-Black, #24262B); + color: var(--color-text); } .tabButtonInactive { - color: #A0A0A0; + color: var(--color-gray); } .tabButtonInactive:hover { - background-color: var(--background-color-hover, #f5f5f5); - color: var(--text-color-primary, #333); + color: var(--color-text); } .tabUnderline { @@ -107,7 +109,7 @@ bottom: -2px; left: 0; height: 1px; - background-color: var(--Grayscale-Black, #24262B); + background-color: var(--color-text); border-radius: 1px; } diff --git a/src/pages/Einstellungen/Einstellungen.module.css b/src/pages/Einstellungen/Einstellungen.module.css new file mode 100644 index 0000000..e44b5eb --- /dev/null +++ b/src/pages/Einstellungen/Einstellungen.module.css @@ -0,0 +1,168 @@ +.einstellungenContainer { + margin: 51px 49px 0 36px; + display: flex; + flex-direction: column; + align-self: stretch; + max-height: calc(100vh - 100px); + overflow: hidden; + font-family: var(--font-family); +} + +.contentWrapper { + flex: 1; + overflow-y: auto; + padding: 20px 0; +} + +.settingsCard { + display: flex; + padding: 30px; + flex-direction: column; + align-self: stretch; + border-radius: 30px; + background: var(--color-bg); + position: relative; + box-shadow: 0px 2px 6px 0px rgba(194, 194, 194, 0.10); + max-width: 800px; + margin: 0 auto; + gap: 30px; +} + +.title { + font-size: 2rem; + font-weight: 600; + color: var(--color-text); + margin: 0 0 20px 0; + font-family: var(--font-family); +} + +.settingsSection { + display: flex; + flex-direction: column; + gap: 20px; +} + +.sectionTitle { + font-size: 1.25rem; + font-weight: 500; + color: var(--color-text); + margin: 0; + padding-bottom: 10px; + border-bottom: 1px solid var(--color-gray-disabled); + font-family: var(--font-family); +} + +.settingItem { + display: flex; + justify-content: space-between; + align-items: center; + padding: 20px; + background: var(--color-surface); + border-radius: 20px; + gap: 20px; +} + +.settingInfo { + display: flex; + flex-direction: column; + gap: 5px; + flex: 1; +} + +.settingLabel { + font-size: 1rem; + font-weight: 500; + color: var(--color-text); + font-family: var(--font-family); +} + +.settingDescription { + font-size: 0.875rem; + color: var(--color-gray); + font-family: var(--font-family); +} + +.themeToggle { + display: flex; + align-items: center; + gap: 12px; + padding: 12px 20px; + border-radius: 25px; + border: 2px solid var(--color-gray-disabled); + background: var(--color-bg); + color: var(--color-text); + cursor: pointer; + transition: all 0.3s ease; + font-family: var(--font-family); + font-size: 0.875rem; + font-weight: 500; + min-width: 120px; +} + +.themeToggle:hover { + border-color: var(--color-secondary); + transform: translateY(-2px); + box-shadow: 0 4px 12px rgba(63, 81, 181, 0.15); +} + +.themeToggle.light { + background: linear-gradient(135deg, var(--color-bg) 0%, var(--color-surface) 100%); +} + +.themeToggle.dark { + background: linear-gradient(135deg, var(--color-surface) 0%, var(--color-bg) 100%); + border-color: var(--color-primary); +} + +.themeToggle.dark:hover { + border-color: var(--color-primary-hover); + box-shadow: 0 4px 12px rgba(178, 102, 255, 0.15); +} + +.toggleSlider { + display: flex; + align-items: center; + justify-content: center; + width: 28px; + height: 28px; + border-radius: 50%; + background: var(--color-secondary); + transition: all 0.3s ease; +} + +.dark .toggleSlider { + background: var(--color-primary); +} + +.toggleIcon { + font-size: 16px; + display: flex; + align-items: center; + justify-content: center; +} + +.toggleLabel { + color: var(--color-text); + font-weight: 500; +} + +/* Responsive design */ +@media (max-width: 768px) { + .einstellungenContainer { + margin: 20px; + } + + .settingsCard { + padding: 20px; + } + + .settingItem { + flex-direction: column; + align-items: flex-start; + gap: 15px; + } + + .themeToggle { + align-self: flex-end; + } +} \ No newline at end of file diff --git a/src/pages/Einstellungen/Einstellungen.tsx b/src/pages/Einstellungen/Einstellungen.tsx new file mode 100644 index 0000000..36c0313 --- /dev/null +++ b/src/pages/Einstellungen/Einstellungen.tsx @@ -0,0 +1,82 @@ +import React, { useState, useEffect } from 'react'; +import styles from './Einstellungen.module.css'; + +function Einstellungen() { + const [isDarkMode, setIsDarkMode] = useState(false); + + // Load saved theme preference on component mount + useEffect(() => { + const savedTheme = localStorage.getItem('theme'); + const prefersDark = savedTheme === 'dark' || (!savedTheme && window.matchMedia('(prefers-color-scheme: dark)').matches); + setIsDarkMode(prefersDark); + applyTheme(prefersDark); + }, []); + + const applyTheme = (isDark: boolean) => { + if (isDark) { + document.documentElement.classList.add('dark-theme'); + document.documentElement.classList.remove('light-theme'); + } else { + document.documentElement.classList.add('light-theme'); + document.documentElement.classList.remove('dark-theme'); + } + document.documentElement.setAttribute('data-theme', isDark ? 'dark' : 'light'); + }; + + const toggleTheme = () => { + const newIsDarkMode = !isDarkMode; + setIsDarkMode(newIsDarkMode); + applyTheme(newIsDarkMode); + localStorage.setItem('theme', newIsDarkMode ? 'dark' : 'light'); + }; + + return ( +
+
+
+

Einstellungen

+ +
+

Darstellung

+ +
+
+ Theme + + Wechseln Sie zwischen hellem und dunklem Modus + +
+ + +
+
+ +
+

Über

+
+
+ Version + 1.0.0 +
+
+
+
+
+
+ ); +} + +export default Einstellungen; \ No newline at end of file diff --git a/src/pages/Home.module.css b/src/pages/Home.module.css index 9aa5cd2..7fef3c5 100644 --- a/src/pages/Home.module.css +++ b/src/pages/Home.module.css @@ -1,10 +1,10 @@ .homeContainer { position: relative; - background-color: #F7F7F7; + background-color: var(--color-surface); min-height: calc(100vh - 15px); max-height: calc(100vh - 15px); width: 100%; - font-family: Arial, Helvetica, sans-serif; + font-family: var(--font-family); z-index: 0; overflow: hidden; padding: 0 49px 0 36px; @@ -16,10 +16,9 @@ position: absolute; top: 0; left: 0; width: 100%; height: 100%; - background-image: url('../../assets/background.png'); - background-repeat: repeat; - background-size: 50px; - opacity: 0.2; /* Adjust this to your liking */ + background-image: radial-gradient(circle, var(--color-gray-disabled) 1px, transparent 1px); + background-size: 8px 8px; + opacity: 0.4; z-index: -1; pointer-events: none; } diff --git a/src/pages/Login.module.css b/src/pages/Login.module.css index 9cf55d6..854b927 100644 --- a/src/pages/Login.module.css +++ b/src/pages/Login.module.css @@ -1,7 +1,7 @@ .container { display: flex; min-height: 100vh; - background-color: #ffffff; + background-color: var(--color-bg); } .leftPanel { @@ -9,12 +9,12 @@ display: flex; flex-direction: column; padding: 3rem; - background-color: #ffffff; + background-color: var(--color-bg); } .rightPanel { flex: 1; - background-color: #ffffff; + background-color: var(--color-bg); display: flex; align-items: center; justify-content: center; @@ -38,7 +38,8 @@ font-size: 2rem; font-weight: 600; margin-bottom: 2rem; - color: #1a1a1a; + color: var(--color-text); + font-family: var(--font-family); } .loginForm { @@ -50,21 +51,23 @@ .input { width: 100%; padding: 12px 16px; - border: 1px solid #e0e0e0; + border: 1px solid var(--color-gray-disabled); border-radius: 8px; font-size: 1rem; transition: all 0.2s ease; - background-color: #ffffff; + background-color: var(--color-bg); + color: var(--color-text); + font-family: var(--font-family); } .input:focus { outline: none; - border-color: #0078d4; - box-shadow: 0 0 0 2px rgba(0, 120, 212, 0.1); + border-color: var(--color-secondary); + box-shadow: 0 0 0 2px rgba(63, 81, 181, 0.1); } .input::placeholder { - color: #757575; + color: var(--color-gray); } .button { @@ -77,24 +80,25 @@ transition: all 0.2s ease; border: none; text-align: center; + font-family: var(--font-family); } .primaryButton { - background-color: #0078d4; - color: white; + background-color: var(--color-secondary); + color: var(--color-bg); } .primaryButton:hover { - background-color: #006cbd; + background-color: var(--color-secondary-hover); } .microsoftButton { - background-color: #2f2f2f; - color: white; + background-color: var(--color-text); + color: var(--color-bg); } .microsoftButton:hover { - background-color: #1f1f1f; + background-color: var(--color-gray); } .divider { @@ -108,13 +112,14 @@ .divider::after { content: ''; flex: 1; - border-bottom: 1px solid #e0e0e0; + border-bottom: 1px solid var(--color-gray-disabled); } .divider span { padding: 0 1rem; - color: #757575; + color: var(--color-gray); font-size: 0.9rem; + font-family: var(--font-family); } .registerLink { @@ -126,18 +131,20 @@ } .registerLink span { - color: #757575; + color: var(--color-gray); font-size: 0.9rem; + font-family: var(--font-family); } .textButton { background: none; border: none; - color: #0078d4; + color: var(--color-secondary); font-weight: 500; cursor: pointer; padding: 0; font-size: 0.9rem; + font-family: var(--font-family); } .textButton:hover { @@ -161,12 +168,13 @@ button:disabled { } .error { - color: #dc3545; - background-color: #f8d7da; - border: 1px solid #f5c6cb; + color: var(--color-red); + background-color: var(--color-red-disabled); + border: 1px solid var(--color-red); border-radius: 8px; padding: 12px; margin-bottom: 1rem; font-size: 0.9rem; text-align: center; + font-family: var(--font-family); } diff --git a/src/pages/Login.tsx b/src/pages/Login.tsx index a6c1ed1..14ce531 100644 --- a/src/pages/Login.tsx +++ b/src/pages/Login.tsx @@ -3,8 +3,8 @@ import { loginRequest } from '../auth/authConfig'; import { useNavigate, useLocation } from 'react-router-dom'; import { useState, useEffect } from 'react'; import styles from './Login.module.css'; -import agentDiagram from '../assets/Frame 43.png'; -import logo from '../assets/LogoPowerOn.png'; +import agentDiagram from '../assets/logos/Frame 43.png'; +import logo from '../assets/logos/PowerOn.png'; import { useAuth, useMsalAuth } from '../hooks/useAuthentication'; function Login() { diff --git a/src/pages/Mitglieder/Mitglieder.module.css b/src/pages/Mitglieder/Mitglieder.module.css index b22b137..848edca 100644 --- a/src/pages/Mitglieder/Mitglieder.module.css +++ b/src/pages/Mitglieder/Mitglieder.module.css @@ -5,17 +5,18 @@ flex-direction: column; align-self: stretch; border-radius: 30px; - border: 1px solid var(--f-1-f-1-f-1, #F1F1F1); - background: var(--Grayscale-True-White, #FFF); + border: 1px solid var(--color-gray-disabled); + background: var(--color-bg); position: relative; box-shadow: 0px 2px 6px 0px rgba(194, 194, 194, 0.10); max-height: calc(100vh - 100px); overflow: hidden; + font-family: var(--font-family); } .horizontalLineLight { width: 100%; - background-color: #F1F1F1; + background-color: var(--color-gray-disabled); height: 1px; margin-top: 90px; margin-left: -30px; @@ -27,16 +28,17 @@ gap: 30px; align-items: flex-start; height: 62px; - color: var(--Grayscale-Black, #24262B); + color: var(--color-text); padding-top: 30px; padding-bottom: 30px; + font-family: var(--font-family); } .mitglieder_hinzufügen_button { border-radius: 30px; - background: var(--Grayscale-Gray, #E9E9E9); - + background: var(--color-gray-disabled); + color: var(--color-text); border: none; outline: none; text-align: left; @@ -48,10 +50,13 @@ display: flex; gap: 10px; align-items: center; + font-family: var(--font-family); + transition: background-color 0.2s ease; } .mitglieder_hinzufügen_button:hover { cursor: pointer; + background-color: var(--color-gray); } .add_icon { @@ -72,9 +77,11 @@ align-items: center; height: 60px; /* Specific height for each item */ padding: 0 16px; - border-bottom: 1px solid #F1F1F1; + border-bottom: 1px solid var(--color-gray-disabled); font-size: 16px; transition: background-color 0.2s ease; + color: var(--color-text); + font-family: var(--font-family); } .actions { diff --git a/src/pages/Register.module.css b/src/pages/Register.module.css index af82fcd..ecb11c2 100644 --- a/src/pages/Register.module.css +++ b/src/pages/Register.module.css @@ -1,7 +1,7 @@ .container { display: flex; min-height: 100vh; - background-color: #ffffff; + background-color: var(--color-bg); } .leftPanel { @@ -9,12 +9,12 @@ display: flex; flex-direction: column; padding: 3rem; - background-color: #ffffff; + background-color: var(--color-bg); } .rightPanel { flex: 1; - background-color: #ffffff; + background-color: var(--color-bg); display: flex; align-items: center; justify-content: center; @@ -38,7 +38,8 @@ font-size: 2rem; font-weight: 600; margin-bottom: 2rem; - color: #1a1a1a; + color: var(--color-text); + font-family: var(--font-family); } .registerForm { @@ -56,27 +57,30 @@ .inputGroup label { font-size: 0.9rem; font-weight: 500; - color: #1a1a1a; + color: var(--color-text); + font-family: var(--font-family); } .input { width: 100%; padding: 12px 16px; - border: 1px solid #e0e0e0; + border: 1px solid var(--color-gray-disabled); border-radius: 8px; font-size: 1rem; transition: all 0.2s ease; - background-color: #ffffff; + background-color: var(--color-bg); + color: var(--color-text); + font-family: var(--font-family); } .input:focus { outline: none; - border-color: #0078d4; - box-shadow: 0 0 0 2px rgba(0, 120, 212, 0.1); + border-color: var(--color-secondary); + box-shadow: 0 0 0 2px rgba(63, 81, 181, 0.1); } .input::placeholder { - color: #757575; + color: var(--color-gray); } .button { @@ -90,30 +94,32 @@ border: none; text-align: center; margin-top: 1rem; + font-family: var(--font-family); } .primaryButton { - background-color: #0078d4; - color: white; + background-color: var(--color-secondary); + color: var(--color-bg); } .primaryButton:hover { - background-color: #006cbd; + background-color: var(--color-secondary-hover); } .primaryButton:disabled { - background-color: #cccccc; + background-color: var(--color-gray-disabled); cursor: not-allowed; } .error { - color: #dc3545; - background-color: #f8d7da; - border: 1px solid #f5c6cb; + color: var(--color-red); + background-color: var(--color-red-disabled); + border: 1px solid var(--color-red); border-radius: 8px; padding: 12px; font-size: 0.9rem; text-align: center; + font-family: var(--font-family); } .loginLink { @@ -123,22 +129,24 @@ gap: 0.5rem; margin-top: 1.5rem; padding-top: 1.5rem; - border-top: 1px solid #e0e0e0; + border-top: 1px solid var(--color-gray-disabled); } .loginLink span { - color: #757575; + color: var(--color-gray); font-size: 0.9rem; + font-family: var(--font-family); } .textButton { background: none; border: none; - color: #0078d4; + color: var(--color-secondary); font-weight: 500; cursor: pointer; padding: 0; font-size: 0.9rem; + font-family: var(--font-family); } .textButton:hover { @@ -159,7 +167,7 @@ /* Required field indicator */ label[htmlFor]::after { content: ' *'; - color: #dc3545; + color: var(--color-red); } .msalButton { @@ -169,21 +177,23 @@ label[htmlFor]::after { gap: 10px; width: 100%; padding: 10px; - background-color: #fff; - border: 1px solid #ccc; + background-color: var(--color-bg); + border: 1px solid var(--color-gray-disabled); border-radius: 4px; font-size: 16px; cursor: pointer; transition: background-color 0.2s; margin-bottom: 20px; + color: var(--color-text); + font-family: var(--font-family); } .msalButton:hover { - background-color: #f5f5f5; + background-color: var(--color-surface); } .msalButton:disabled { - background-color: #f5f5f5; + background-color: var(--color-surface); cursor: not-allowed; } @@ -203,11 +213,12 @@ label[htmlFor]::after { .divider::after { content: ''; flex: 1; - border-bottom: 1px solid #ccc; + border-bottom: 1px solid var(--color-gray-disabled); } .divider span { - padding: 0 10px; - color: #666; - font-size: 14px; + padding: 0 1rem; + color: var(--color-gray); + font-size: 0.9rem; + font-family: var(--font-family); } diff --git a/src/pages/Register.tsx b/src/pages/Register.tsx index 9de5715..f409af3 100644 --- a/src/pages/Register.tsx +++ b/src/pages/Register.tsx @@ -1,8 +1,8 @@ import { useState } from 'react'; import { useNavigate } from 'react-router-dom'; import styles from './Register.module.css'; -import logo from '../assets/LogoPowerOn.png'; -import agentDiagram from '../assets/Frame 43.png'; +import logo from '../assets/logos/PowerOn.png'; +import agentDiagram from '../assets/logos/Frame 43.png'; import { useRegister, useMsalRegister } from '../hooks/useAuthentication'; interface RegisterFormData { From 15c85416c453e376f0b17be48fcbe1655c405d9b Mon Sep 17 00:00:00 2001 From: idittrich-valueon Date: Mon, 16 Jun 2025 14:44:56 +0200 Subject: [PATCH 30/32] changed logo filepath --- {src/assets => public}/logos/Frame 43.png | Bin {src/assets => public}/logos/PowerOn Details.PNG | Bin {src/assets => public}/logos/PowerOn.png | Bin .../assets => public}/logos/PowerOn_transparent.png | Bin src/components/Sidebar/Sidebar.tsx | 2 +- src/pages/Login.tsx | 4 ++-- src/pages/Register.tsx | 4 ++-- 7 files changed, 5 insertions(+), 5 deletions(-) rename {src/assets => public}/logos/Frame 43.png (100%) rename {src/assets => public}/logos/PowerOn Details.PNG (100%) rename {src/assets => public}/logos/PowerOn.png (100%) rename {src/assets => public}/logos/PowerOn_transparent.png (100%) diff --git a/src/assets/logos/Frame 43.png b/public/logos/Frame 43.png similarity index 100% rename from src/assets/logos/Frame 43.png rename to public/logos/Frame 43.png diff --git a/src/assets/logos/PowerOn Details.PNG b/public/logos/PowerOn Details.PNG similarity index 100% rename from src/assets/logos/PowerOn Details.PNG rename to public/logos/PowerOn Details.PNG diff --git a/src/assets/logos/PowerOn.png b/public/logos/PowerOn.png similarity index 100% rename from src/assets/logos/PowerOn.png rename to public/logos/PowerOn.png diff --git a/src/assets/logos/PowerOn_transparent.png b/public/logos/PowerOn_transparent.png similarity index 100% rename from src/assets/logos/PowerOn_transparent.png rename to public/logos/PowerOn_transparent.png diff --git a/src/components/Sidebar/Sidebar.tsx b/src/components/Sidebar/Sidebar.tsx index 97fd34e..7ea3f1e 100644 --- a/src/components/Sidebar/Sidebar.tsx +++ b/src/components/Sidebar/Sidebar.tsx @@ -22,7 +22,7 @@ const Sidebar: React.FC = ({ data }) => { return (
- Logo + Logo
diff --git a/src/pages/Login.tsx b/src/pages/Login.tsx index 14ce531..aa176a3 100644 --- a/src/pages/Login.tsx +++ b/src/pages/Login.tsx @@ -3,8 +3,8 @@ import { loginRequest } from '../auth/authConfig'; import { useNavigate, useLocation } from 'react-router-dom'; import { useState, useEffect } from 'react'; import styles from './Login.module.css'; -import agentDiagram from '../assets/logos/Frame 43.png'; -import logo from '../assets/logos/PowerOn.png'; +import agentDiagram from '/logos/Frame 43.png'; +import logo from '/logos/PowerOn.png'; import { useAuth, useMsalAuth } from '../hooks/useAuthentication'; function Login() { diff --git a/src/pages/Register.tsx b/src/pages/Register.tsx index f409af3..c77d10b 100644 --- a/src/pages/Register.tsx +++ b/src/pages/Register.tsx @@ -1,8 +1,8 @@ import { useState } from 'react'; import { useNavigate } from 'react-router-dom'; import styles from './Register.module.css'; -import logo from '../assets/logos/PowerOn.png'; -import agentDiagram from '../assets/logos/Frame 43.png'; +import logo from '/logos/PowerOn.png'; +import agentDiagram from '/logos/Frame 43.png'; import { useRegister, useMsalRegister } from '../hooks/useAuthentication'; interface RegisterFormData { From 98fbd5f6d0ceb46486d08068b62c210f3ec98b7c Mon Sep 17 00:00:00 2001 From: idittrich-valueon Date: Mon, 16 Jun 2025 15:09:24 +0200 Subject: [PATCH 31/32] changed layout to remove white border --- src/App.tsx | 3 +++ src/components/Sidebar/Sidebar.module.css | 7 +++++-- src/components/Sidebar/SidebarData.tsx | 2 +- src/components/Sidebar/SidebarUser.module.css | 2 +- src/index.css | 18 ++++++++++++++++++ src/pages/Home.module.css | 10 +++++----- 6 files changed, 33 insertions(+), 9 deletions(-) create mode 100644 src/index.css diff --git a/src/App.tsx b/src/App.tsx index 3dd7453..80f2e51 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -1,5 +1,8 @@ import { BrowserRouter as Router, Routes, Route } from 'react-router-dom'; +// Import global CSS reset first +import './index.css'; + import Login from './pages/Login'; import Register from './pages/Register'; diff --git a/src/components/Sidebar/Sidebar.module.css b/src/components/Sidebar/Sidebar.module.css index f69c064..b88cd57 100644 --- a/src/components/Sidebar/Sidebar.module.css +++ b/src/components/Sidebar/Sidebar.module.css @@ -5,15 +5,18 @@ background: var(--color-bg); box-shadow: 0px 2px 6px 0px rgba(194, 194, 194, 0.10); width: 240px; - flex-shrink: 0; margin-top: 51px; margin-left: 49px; padding-bottom: 1px; + display: flex; + justify-content: center; + align-items: center; + flex-direction: column; } .sidebar { display: flex; - width: 200px; + width: 240px; flex-direction: column; align-items: flex-start; flex-shrink: 0; diff --git a/src/components/Sidebar/SidebarData.tsx b/src/components/Sidebar/SidebarData.tsx index 53c3f5e..0f279d1 100644 --- a/src/components/Sidebar/SidebarData.tsx +++ b/src/components/Sidebar/SidebarData.tsx @@ -50,7 +50,7 @@ const useSidebarData = () => { { id: '7', name: 'Settings', - link: 'einstellungen', + link: '/einstellungen', icon: GoGear, }, { diff --git a/src/components/Sidebar/SidebarUser.module.css b/src/components/Sidebar/SidebarUser.module.css index 6e8cc22..e6e9e41 100644 --- a/src/components/Sidebar/SidebarUser.module.css +++ b/src/components/Sidebar/SidebarUser.module.css @@ -1,6 +1,6 @@ .user_section { display: flex; - width: 200px; + width: 240px; height: auto; min-height: 100px; padding: 20px; diff --git a/src/index.css b/src/index.css new file mode 100644 index 0000000..34d6aee --- /dev/null +++ b/src/index.css @@ -0,0 +1,18 @@ +/* Global CSS Reset */ +* { + box-sizing: border-box; +} + +html, body { + margin: 0; + padding: 0; + height: 100%; + overflow: hidden; +} + +#root { + height: 100vh; + width: 100vw; + margin: 0; + padding: 0; +} \ No newline at end of file diff --git a/src/pages/Home.module.css b/src/pages/Home.module.css index 7fef3c5..10d4319 100644 --- a/src/pages/Home.module.css +++ b/src/pages/Home.module.css @@ -1,14 +1,13 @@ .homeContainer { position: relative; background-color: var(--color-surface); - min-height: calc(100vh - 15px); - max-height: calc(100vh - 15px); - width: 100%; + min-height: 100vh; + max-height: 100vh; + width: 100vw; font-family: var(--font-family); z-index: 0; overflow: hidden; - padding: 0 49px 0 36px; - width: calc(100% - 49px - 36px); + padding: 0 49px 0 0; } .homeContainer::before { @@ -34,4 +33,5 @@ .body { display: flex; max-width: 100vw; + height: 100vh; } \ No newline at end of file From 8f557efaa7d9415f92f8ec57a8f17bc9d87b89a7 Mon Sep 17 00:00:00 2001 From: idittrich-valueon Date: Mon, 16 Jun 2025 17:12:14 +0200 Subject: [PATCH 32/32] final commit --- src/components/Sidebar/Sidebar.module.css | 6 +++--- src/components/Sidebar/SidebarData.tsx | 2 +- src/pages/Dashboard.module.css | 16 ++++++++++------ src/pages/Dashboard.tsx | 4 ++-- src/pages/Einstellungen/Einstellungen.module.css | 6 ++++-- 5 files changed, 20 insertions(+), 14 deletions(-) diff --git a/src/components/Sidebar/Sidebar.module.css b/src/components/Sidebar/Sidebar.module.css index b88cd57..7f7e6cf 100644 --- a/src/components/Sidebar/Sidebar.module.css +++ b/src/components/Sidebar/Sidebar.module.css @@ -26,9 +26,9 @@ .logoContainer { display: flex; - width: 200px; - height: 60px; - padding: 13px 20px 7px 20px; + width: 100%; + height: auto; + padding: 30px 20px 7px 20px; justify-content: center; align-items: center; flex-shrink: 0; diff --git a/src/components/Sidebar/SidebarData.tsx b/src/components/Sidebar/SidebarData.tsx index 0f279d1..72f3748 100644 --- a/src/components/Sidebar/SidebarData.tsx +++ b/src/components/Sidebar/SidebarData.tsx @@ -49,7 +49,7 @@ const useSidebarData = () => { }, { id: '7', - name: 'Settings', + name: 'Einstellungen', link: '/einstellungen', icon: GoGear, }, diff --git a/src/pages/Dashboard.module.css b/src/pages/Dashboard.module.css index 8578ecd..2b3199e 100644 --- a/src/pages/Dashboard.module.css +++ b/src/pages/Dashboard.module.css @@ -4,12 +4,16 @@ flex-direction: column; gap: 20px; font-family: var(--font-family); + width: 98%; + max-height: calc(100vh - 100px); + } .chatLogContainer { display: flex; gap: 20px; transition: all 0.3s ease; + } .chatLogContainer.expanded { @@ -27,15 +31,15 @@ } .chatArea45vh { - height: 45vh; -} - -.chatArea60vh { height: 60vh; } +.chatArea60vh { + height: 85vh; +} + .logArea15vh { - height: 15vh; + height: 10vh; } .logArea25vh { @@ -47,7 +51,7 @@ } .logArea60vh { - height: 60vh; + height: 85vh; } .promptArea30vh { diff --git a/src/pages/Dashboard.tsx b/src/pages/Dashboard.tsx index 8d1c68f..3ed4cad 100644 --- a/src/pages/Dashboard.tsx +++ b/src/pages/Dashboard.tsx @@ -63,13 +63,13 @@ function Dashboard () { // Memoize style objects to prevent infinite re-renders const promptStyle = useMemo(() => ({ - marginBottom: !isPromptAreaCollapsed ? "40px" : "0" + marginBottom: !isPromptAreaCollapsed ? "0px" : "0" }), [isPromptAreaCollapsed]); const chatStyle = useMemo(() => ({ width: isChatExpanded ? "100%" : "calc(50% - 10px)", flex: isChatExpanded ? "none" : "1", - marginBottom: isChatExpanded ? "40px" : "0" + marginBottom: isChatExpanded ? "0px" : "0" }), [isChatExpanded]); const logStyle = useMemo(() => ({ diff --git a/src/pages/Einstellungen/Einstellungen.module.css b/src/pages/Einstellungen/Einstellungen.module.css index e44b5eb..776edfa 100644 --- a/src/pages/Einstellungen/Einstellungen.module.css +++ b/src/pages/Einstellungen/Einstellungen.module.css @@ -3,15 +3,17 @@ display: flex; flex-direction: column; align-self: stretch; + justify-content: top; max-height: calc(100vh - 100px); overflow: hidden; font-family: var(--font-family); + width: 98%; } .contentWrapper { flex: 1; overflow-y: auto; - padding: 20px 0; + padding: 0px 0; } .settingsCard { @@ -23,7 +25,7 @@ background: var(--color-bg); position: relative; box-shadow: 0px 2px 6px 0px rgba(194, 194, 194, 0.10); - max-width: 800px; + width: 100%; margin: 0 auto; gap: 30px; }