diff --git a/docker/frontend.Dockerfile b/docker/frontend.Dockerfile index 1301aec..68f7a64 100644 --- a/docker/frontend.Dockerfile +++ b/docker/frontend.Dockerfile @@ -17,9 +17,6 @@ CMD ["npm", "run", "dev", "--", "--host", "0.0.0.0", "--port", "3000"] # Builder stage for production FROM node:lts-alpine AS builder -# Install build dependencies for canvas -RUN apk add --no-cache python3 make g++ pkgconfig cairo-dev jpeg-dev pango-dev giflib-dev - WORKDIR /app/frontend COPY frontend/package*.json ./ @@ -27,8 +24,8 @@ COPY frontend/package*.json ./ RUN echo "=== Starting npm install ===" &&\ npm cache clean --force &&\ rm -rf node_modules ~/.npm /root/.npm &&\ - echo "=== npm install with verbose logging ===" &&\ - npm install --legacy-peer-deps --no-audit --prefer-online --fetch-retries=3 --fetch-retry-mintimeout=20000 --fetch-retry-maxtimeout=120000 --loglevel=verbose &&\ + echo "=== npm install ===" &&\ + npm install --ignore-scripts --legacy-peer-deps --no-audit --prefer-online --fetch-retries=3 --fetch-retry-mintimeout=20000 --fetch-retry-maxtimeout=120000 &&\ echo "=== npm install completed ===" &&\ npm cache clean --force diff --git a/frontend/package.json b/frontend/package.json index fc4443e..1feada8 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -27,8 +27,7 @@ "react-chartjs-2": "^5.2.0", "react-dom": "^18.3.1", "react-icons": "^5.5.0", - "react-router-dom": "^6.30.1", - "trianglify": "^4.1.1" + "react-router-dom": "^6.30.1" }, "devDependencies": { "@types/react": "^18.3.14", diff --git a/frontend/src/components/Layout.jsx b/frontend/src/components/Layout.jsx index 9833914..f647487 100644 --- a/frontend/src/components/Layout.jsx +++ b/frontend/src/components/Layout.jsx @@ -28,7 +28,6 @@ import { import { useCallback, useEffect, useRef, useState } from "react"; import { FaReddit, FaYoutube } from "react-icons/fa"; import { Link, useLocation, useNavigate } from "react-router-dom"; -import trianglify from "trianglify"; import { useAuth } from "../contexts/AuthContext"; import { useColorTheme } from "../contexts/ColorThemeContext"; import { useUpdateNotification } from "../contexts/UpdateNotificationContext"; @@ -237,31 +236,93 @@ const Layout = ({ children }) => { navigate("/hosts?action=add"); }; - // Generate Trianglify background for dark mode + // Generate clean radial gradient background with subtle triangular accents for dark mode useEffect(() => { const generateBackground = () => { if ( - bgCanvasRef.current && - themeConfig?.login && - document.documentElement.classList.contains("dark") + !bgCanvasRef.current || + !themeConfig?.login || + !document.documentElement.classList.contains("dark") ) { - // Get current date as seed for daily variation - const today = new Date(); - const dateSeed = `${today.getFullYear()}-${today.getMonth()}-${today.getDate()}`; + return; + } - // Generate pattern with selected theme configuration - const pattern = trianglify({ - width: window.innerWidth, - height: window.innerHeight, - cellSize: themeConfig.login.cellSize, - variance: themeConfig.login.variance, - seed: dateSeed, - xColors: themeConfig.login.xColors, - yColors: themeConfig.login.yColors, - }); + const canvas = bgCanvasRef.current; + canvas.width = window.innerWidth; + canvas.height = window.innerHeight; + const ctx = canvas.getContext("2d"); - // Render to canvas - pattern.toCanvas(bgCanvasRef.current); + // Get theme colors - pick first color from each palette + const xColors = themeConfig.login.xColors || [ + "#667eea", + "#764ba2", + "#f093fb", + "#4facfe", + ]; + const yColors = themeConfig.login.yColors || [ + "#667eea", + "#764ba2", + "#f093fb", + "#4facfe", + ]; + + // Use date for daily color rotation + const today = new Date(); + const seed = + today.getFullYear() * 10000 + today.getMonth() * 100 + today.getDate(); + const random = (s) => { + const x = Math.sin(s) * 10000; + return x - Math.floor(x); + }; + + const color1 = xColors[Math.floor(random(seed) * xColors.length)]; + const color2 = yColors[Math.floor(random(seed + 1000) * yColors.length)]; + + // Create clean radial gradient from center to bottom-right corner + const gradient = ctx.createRadialGradient( + canvas.width * 0.3, // Center slightly left + canvas.height * 0.3, // Center slightly up + 0, + canvas.width * 0.5, // Expand to cover screen + canvas.height * 0.5, + Math.max(canvas.width, canvas.height) * 1.2, + ); + + // Subtle gradient with darker corners + gradient.addColorStop(0, color1); + gradient.addColorStop(0.6, color2); + gradient.addColorStop(1, "#0a0a0a"); // Very dark edges + + ctx.fillStyle = gradient; + ctx.fillRect(0, 0, canvas.width, canvas.height); + + // Add subtle triangular shapes as accents across entire background + const cellSize = 180; + const cols = Math.ceil(canvas.width / cellSize) + 1; + const rows = Math.ceil(canvas.height / cellSize) + 1; + + for (let y = 0; y < rows; y++) { + for (let x = 0; x < cols; x++) { + const idx = y * cols + x; + // Draw more triangles (less sparse) + if (random(seed + idx + 5000) > 0.4) { + const baseX = + x * cellSize + random(seed + idx * 3) * cellSize * 0.8; + const baseY = + y * cellSize + random(seed + idx * 3 + 100) * cellSize * 0.8; + const size = 50 + random(seed + idx * 4) * 100; + + ctx.beginPath(); + ctx.moveTo(baseX, baseY); + ctx.lineTo(baseX + size, baseY); + ctx.lineTo(baseX + size / 2, baseY - size * 0.866); + ctx.closePath(); + + // More visible white with slightly higher opacity + ctx.fillStyle = `rgba(255, 255, 255, ${0.05 + random(seed + idx * 5) * 0.08})`; + ctx.fill(); + } + } } }; diff --git a/frontend/src/pages/Login.jsx b/frontend/src/pages/Login.jsx index 03c5054..4141c48 100644 --- a/frontend/src/pages/Login.jsx +++ b/frontend/src/pages/Login.jsx @@ -17,7 +17,6 @@ import { useEffect, useId, useRef, useState } from "react"; import { FaReddit, FaYoutube } from "react-icons/fa"; import { useNavigate } from "react-router-dom"; -import trianglify from "trianglify"; import DiscordIcon from "../components/DiscordIcon"; import { useAuth } from "../contexts/AuthContext"; import { useColorTheme } from "../contexts/ColorThemeContext"; @@ -57,27 +56,87 @@ const Login = () => { const navigate = useNavigate(); - // Generate Trianglify background based on selected theme + // Generate clean radial gradient background with subtle triangular accents useEffect(() => { const generateBackground = () => { - if (canvasRef.current && themeConfig?.login) { - // Get current date as seed for daily variation - const today = new Date(); - const dateSeed = `${today.getFullYear()}-${today.getMonth()}-${today.getDate()}`; + if (!canvasRef.current || !themeConfig?.login) return; - // Generate pattern with selected theme configuration - const pattern = trianglify({ - width: canvasRef.current.offsetWidth, - height: canvasRef.current.offsetHeight, - cellSize: themeConfig.login.cellSize, - variance: themeConfig.login.variance, - seed: dateSeed, - xColors: themeConfig.login.xColors, - yColors: themeConfig.login.yColors, - }); + const canvas = canvasRef.current; + canvas.width = canvas.offsetWidth; + canvas.height = canvas.offsetHeight; + const ctx = canvas.getContext("2d"); - // Render to canvas - pattern.toCanvas(canvasRef.current); + // Get theme colors - pick first color from each palette + const xColors = themeConfig.login.xColors || [ + "#667eea", + "#764ba2", + "#f093fb", + "#4facfe", + ]; + const yColors = themeConfig.login.yColors || [ + "#667eea", + "#764ba2", + "#f093fb", + "#4facfe", + ]; + + // Use date for daily color rotation + const today = new Date(); + const seed = + today.getFullYear() * 10000 + today.getMonth() * 100 + today.getDate(); + const random = (s) => { + const x = Math.sin(s) * 10000; + return x - Math.floor(x); + }; + + const color1 = xColors[Math.floor(random(seed) * xColors.length)]; + const color2 = yColors[Math.floor(random(seed + 1000) * yColors.length)]; + + // Create clean radial gradient from center to bottom-right corner + const gradient = ctx.createRadialGradient( + canvas.width * 0.3, // Center slightly left + canvas.height * 0.3, // Center slightly up + 0, + canvas.width * 0.5, // Expand to cover screen + canvas.height * 0.5, + Math.max(canvas.width, canvas.height) * 1.2, + ); + + // Subtle gradient with darker corners + gradient.addColorStop(0, color1); + gradient.addColorStop(0.6, color2); + gradient.addColorStop(1, "#0a0a0a"); // Very dark edges + + ctx.fillStyle = gradient; + ctx.fillRect(0, 0, canvas.width, canvas.height); + + // Add subtle triangular shapes as accents across entire background + const cellSize = 180; + const cols = Math.ceil(canvas.width / cellSize) + 1; + const rows = Math.ceil(canvas.height / cellSize) + 1; + + for (let y = 0; y < rows; y++) { + for (let x = 0; x < cols; x++) { + const idx = y * cols + x; + // Draw more triangles (less sparse) + if (random(seed + idx + 5000) > 0.4) { + const baseX = + x * cellSize + random(seed + idx * 3) * cellSize * 0.8; + const baseY = + y * cellSize + random(seed + idx * 3 + 100) * cellSize * 0.8; + const size = 50 + random(seed + idx * 4) * 100; + + ctx.beginPath(); + ctx.moveTo(baseX, baseY); + ctx.lineTo(baseX + size, baseY); + ctx.lineTo(baseX + size / 2, baseY - size * 0.866); + ctx.closePath(); + + // More visible white with slightly higher opacity + ctx.fillStyle = `rgba(255, 255, 255, ${0.05 + random(seed + idx * 5) * 0.08})`; + ctx.fill(); + } + } } }; @@ -90,7 +149,7 @@ const Login = () => { window.addEventListener("resize", handleResize); return () => window.removeEventListener("resize", handleResize); - }, [themeConfig]); // Regenerate when theme changes + }, [themeConfig]); // Check if signup is enabled useEffect(() => { diff --git a/package-lock.json b/package-lock.json index 8067f65..fb91b82 100644 --- a/package-lock.json +++ b/package-lock.json @@ -78,8 +78,7 @@ "react-chartjs-2": "^5.2.0", "react-dom": "^18.3.1", "react-icons": "^5.5.0", - "react-router-dom": "^6.30.1", - "trianglify": "^4.1.1" + "react-router-dom": "^6.30.1" }, "devDependencies": { "@types/react": "^18.3.14", @@ -642,34 +641,6 @@ "version": "0.3.4", "license": "MIT" }, - "node_modules/@mapbox/node-pre-gyp": { - "version": "1.0.11", - "license": "BSD-3-Clause", - "dependencies": { - "detect-libc": "^2.0.0", - "https-proxy-agent": "^5.0.0", - "make-dir": "^3.1.0", - "node-fetch": "^2.6.7", - "nopt": "^5.0.0", - "npmlog": "^5.0.1", - "rimraf": "^3.0.2", - "semver": "^7.3.5", - "tar": "^6.1.11" - }, - "bin": { - "node-pre-gyp": "bin/node-pre-gyp" - } - }, - "node_modules/@mapbox/node-pre-gyp/node_modules/semver": { - "version": "7.7.3", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/@msgpackr-extract/msgpackr-extract-linux-x64": { "version": "3.0.3", "cpu": [ @@ -962,10 +933,6 @@ "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0" } }, - "node_modules/abbrev": { - "version": "1.1.1", - "license": "ISC" - }, "node_modules/accepts": { "version": "1.3.8", "license": "MIT", @@ -977,16 +944,6 @@ "node": ">= 0.6" } }, - "node_modules/agent-base": { - "version": "6.0.2", - "license": "MIT", - "dependencies": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" - } - }, "node_modules/ansi-regex": { "version": "5.0.1", "license": "MIT", @@ -1024,21 +981,6 @@ "node": ">= 8" } }, - "node_modules/aproba": { - "version": "2.1.0", - "license": "ISC" - }, - "node_modules/are-we-there-yet": { - "version": "2.0.0", - "license": "ISC", - "dependencies": { - "delegates": "^1.0.0", - "readable-stream": "^3.6.0" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/arg": { "version": "5.0.2", "dev": true, @@ -1167,6 +1109,7 @@ }, "node_modules/brace-expansion": { "version": "1.1.12", + "dev": true, "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", @@ -1361,19 +1304,6 @@ ], "license": "CC-BY-4.0" }, - "node_modules/canvas": { - "version": "2.11.2", - "hasInstallScript": true, - "license": "MIT", - "dependencies": { - "@mapbox/node-pre-gyp": "^1.0.0", - "nan": "^2.17.0", - "simple-get": "^3.0.3" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/chalk": { "version": "4.1.2", "dev": true, @@ -1433,17 +1363,6 @@ "fsevents": "~2.3.2" } }, - "node_modules/chownr": { - "version": "2.0.0", - "license": "ISC", - "engines": { - "node": ">=10" - } - }, - "node_modules/chroma-js": { - "version": "2.6.0", - "license": "(BSD-3-Clause AND Apache-2.0)" - }, "node_modules/citty": { "version": "0.1.6", "devOptional": true, @@ -1509,13 +1428,6 @@ "simple-swizzle": "^0.2.2" } }, - "node_modules/color-support": { - "version": "1.1.3", - "license": "ISC", - "bin": { - "color-support": "bin.js" - } - }, "node_modules/color/node_modules/color-convert": { "version": "1.9.3", "license": "MIT", @@ -1555,6 +1467,7 @@ }, "node_modules/concat-map": { "version": "0.0.1", + "dev": true, "license": "MIT" }, "node_modules/concurrently": { @@ -1596,10 +1509,6 @@ "node": "^14.18.0 || >=16.10.0" } }, - "node_modules/console-control-strings": { - "version": "1.1.0", - "license": "ISC" - }, "node_modules/content-disposition": { "version": "0.5.4", "license": "MIT", @@ -1738,16 +1647,6 @@ "node": ">=0.10.0" } }, - "node_modules/decompress-response": { - "version": "4.2.1", - "license": "MIT", - "dependencies": { - "mimic-response": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/deepmerge-ts": { "version": "7.1.5", "devOptional": true, @@ -1761,10 +1660,6 @@ "devOptional": true, "license": "MIT" }, - "node_modules/delaunator": { - "version": "4.0.1", - "license": "ISC" - }, "node_modules/delayed-stream": { "version": "1.0.0", "license": "MIT", @@ -1772,10 +1667,6 @@ "node": ">=0.4.0" } }, - "node_modules/delegates": { - "version": "1.0.0", - "license": "MIT" - }, "node_modules/denque": { "version": "2.1.0", "license": "Apache-2.0", @@ -1806,6 +1697,7 @@ "node_modules/detect-libc": { "version": "2.1.2", "license": "Apache-2.0", + "optional": true, "engines": { "node": ">=8" } @@ -2293,34 +2185,6 @@ "node": ">= 0.6" } }, - "node_modules/fs-minipass": { - "version": "2.1.0", - "license": "ISC", - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/fs-minipass/node_modules/minipass": { - "version": "3.3.6", - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/fs-minipass/node_modules/yallist": { - "version": "4.0.0", - "license": "ISC" - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "license": "ISC" - }, "node_modules/function-bind": { "version": "1.1.2", "license": "MIT", @@ -2328,28 +2192,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/gauge": { - "version": "3.0.2", - "license": "ISC", - "dependencies": { - "aproba": "^1.0.3 || ^2.0.0", - "color-support": "^1.1.2", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.1", - "object-assign": "^4.1.1", - "signal-exit": "^3.0.0", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "wide-align": "^1.1.2" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/gauge/node_modules/signal-exit": { - "version": "3.0.7", - "license": "ISC" - }, "node_modules/gensync": { "version": "1.0.0-beta.2", "dev": true, @@ -2507,10 +2349,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/has-unicode": { - "version": "2.0.1", - "license": "ISC" - }, "node_modules/hasown": { "version": "2.0.2", "license": "MIT", @@ -2569,17 +2407,6 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/https-proxy-agent": { - "version": "5.0.1", - "license": "MIT", - "dependencies": { - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/iconv-lite": { "version": "0.4.24", "license": "MIT", @@ -2595,14 +2422,6 @@ "dev": true, "license": "ISC" }, - "node_modules/inflight": { - "version": "1.0.6", - "license": "ISC", - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, "node_modules/inherits": { "version": "2.0.4", "license": "ISC" @@ -2978,19 +2797,6 @@ "node": ">=12" } }, - "node_modules/make-dir": { - "version": "3.1.0", - "license": "MIT", - "dependencies": { - "semver": "^6.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/math-intrinsics": { "version": "1.1.0", "license": "MIT", @@ -3065,18 +2871,9 @@ "node": ">= 0.6" } }, - "node_modules/mimic-response": { - "version": "2.1.0", - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/minimatch": { "version": "3.1.2", + "dev": true, "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" @@ -3093,41 +2890,6 @@ "node": ">=16 || 14 >=14.17" } }, - "node_modules/minizlib": { - "version": "2.1.2", - "license": "MIT", - "dependencies": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/minizlib/node_modules/minipass": { - "version": "3.3.6", - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minizlib/node_modules/yallist": { - "version": "4.0.0", - "license": "ISC" - }, - "node_modules/mkdirp": { - "version": "1.0.4", - "license": "MIT", - "bin": { - "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/moment": { "version": "2.30.1", "license": "MIT", @@ -3176,10 +2938,6 @@ "thenify-all": "^1.0.0" } }, - "node_modules/nan": { - "version": "2.23.0", - "license": "MIT" - }, "node_modules/nanoid": { "version": "3.3.11", "dev": true, @@ -3208,24 +2966,6 @@ "version": "3.1.1", "license": "MIT" }, - "node_modules/node-fetch": { - "version": "2.7.0", - "license": "MIT", - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, "node_modules/node-fetch-native": { "version": "1.6.7", "devOptional": true, @@ -3306,19 +3046,6 @@ "node": ">=4" } }, - "node_modules/nopt": { - "version": "5.0.0", - "license": "ISC", - "dependencies": { - "abbrev": "1" - }, - "bin": { - "nopt": "bin/nopt.js" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/normalize-path": { "version": "3.0.0", "dev": true, @@ -3335,16 +3062,6 @@ "node": ">=0.10.0" } }, - "node_modules/npmlog": { - "version": "5.0.1", - "license": "ISC", - "dependencies": { - "are-we-there-yet": "^2.0.0", - "console-control-strings": "^1.1.0", - "gauge": "^3.0.0", - "set-blocking": "^2.0.0" - } - }, "node_modules/nypm": { "version": "0.6.2", "devOptional": true, @@ -3403,13 +3120,6 @@ "node": ">= 0.8" } }, - "node_modules/once": { - "version": "1.4.0", - "license": "ISC", - "dependencies": { - "wrappy": "1" - } - }, "node_modules/one-time": { "version": "1.0.0", "license": "MIT", @@ -3474,13 +3184,6 @@ "node": ">=8" } }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/path-key": { "version": "3.1.1", "dev": true, @@ -4078,37 +3781,6 @@ "node": ">=0.10.0" } }, - "node_modules/rimraf": { - "version": "3.0.2", - "license": "ISC", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/rimraf/node_modules/glob": { - "version": "7.2.3", - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/rollup": { "version": "4.52.3", "dev": true, @@ -4217,6 +3889,7 @@ }, "node_modules/semver": { "version": "6.3.1", + "dev": true, "license": "ISC", "bin": { "semver": "bin/semver.js" @@ -4388,33 +4061,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/simple-concat": { - "version": "1.0.1", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/simple-get": { - "version": "3.1.1", - "license": "MIT", - "dependencies": { - "decompress-response": "^4.2.0", - "once": "^1.3.1", - "simple-concat": "^1.0.0" - } - }, "node_modules/simple-swizzle": { "version": "0.2.4", "license": "MIT", @@ -4640,32 +4286,6 @@ "jiti": "bin/jiti.js" } }, - "node_modules/tar": { - "version": "6.2.1", - "license": "ISC", - "dependencies": { - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "minipass": "^5.0.0", - "minizlib": "^2.1.1", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/tar/node_modules/minipass": { - "version": "5.0.0", - "license": "ISC", - "engines": { - "node": ">=8" - } - }, - "node_modules/tar/node_modules/yallist": { - "version": "4.0.0", - "license": "ISC" - }, "node_modules/text-hex": { "version": "1.0.0", "license": "MIT" @@ -4761,10 +4381,6 @@ "nodetouch": "bin/nodetouch.js" } }, - "node_modules/tr46": { - "version": "0.0.3", - "license": "MIT" - }, "node_modules/tree-kill": { "version": "1.2.2", "dev": true, @@ -4773,15 +4389,6 @@ "tree-kill": "cli.js" } }, - "node_modules/trianglify": { - "version": "4.1.1", - "license": "GPL-3.0", - "dependencies": { - "canvas": "^2.6.1", - "chroma-js": "^2.1.0", - "delaunator": "^4.0.1" - } - }, "node_modules/triple-beam": { "version": "1.4.1", "license": "MIT", @@ -4990,18 +4597,6 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/webidl-conversions": { - "version": "3.0.1", - "license": "BSD-2-Clause" - }, - "node_modules/whatwg-url": { - "version": "5.0.0", - "license": "MIT", - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, "node_modules/which": { "version": "2.0.2", "dev": true, @@ -5020,13 +4615,6 @@ "version": "2.0.1", "license": "ISC" }, - "node_modules/wide-align": { - "version": "1.1.5", - "license": "ISC", - "dependencies": { - "string-width": "^1.0.2 || 2 || 3 || 4" - } - }, "node_modules/winston": { "version": "3.17.0", "license": "MIT", @@ -5092,10 +4680,6 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/wrappy": { - "version": "1.0.2", - "license": "ISC" - }, "node_modules/ws": { "version": "8.18.3", "license": "MIT", diff --git a/setup.sh b/setup.sh index 6cced59..4bd50a7 100755 --- a/setup.sh +++ b/setup.sh @@ -2931,6 +2931,8 @@ update_installation() { # Load existing .env to get database credentials if [ -f "$instance_dir/backend/.env" ]; then + # Unset color variables before sourcing to prevent ANSI escape sequences from leaking into .env + unset RED GREEN YELLOW BLUE NC source "$instance_dir/backend/.env" print_status "Loaded existing configuration"