From 8e91c68417a21226acf0afc8bb3db4cd23e29d73 Mon Sep 17 00:00:00 2001 From: brysonbw Date: Sun, 17 Aug 2025 19:37:35 -0600 Subject: [PATCH 1/4] Refactor layout, components, and views --- .prettierignore | 1 - eslint.config.cjs | 35 - eslint.config.js | 43 ++ index.html | 1 - package-lock.json | 721 +++++++++--------- package.json | 32 +- src/app.ts | 39 +- src/assets/img/discord-icon.png | Bin 0 -> 13796 bytes .../footer/footer-component-styles.ts | 47 -- .../footer/{footer-component.ts => footer.ts} | 57 +- .../header/header-component-styles.ts | 45 -- src/components/header/header-component.ts | 33 - src/components/header/header.ts | 95 +++ .../three-js/globe-viewer/globe-viewer.ts | 37 +- src/main.css | 80 -- src/main.ts | 15 - src/routes.ts | 8 +- src/utils/generateUUID.ts | 20 - src/utils/helperFunctions.ts | 8 + src/views/about-view.ts | 79 +- src/views/home-view.ts | 199 ++++- src/views/not-found-view.ts | 50 +- .../partials/landing-partial-view-styles.ts | 87 --- src/views/partials/landing-partial-view.ts | 91 --- vite.config.js | 23 + 25 files changed, 911 insertions(+), 935 deletions(-) delete mode 100644 eslint.config.cjs create mode 100644 eslint.config.js create mode 100644 src/assets/img/discord-icon.png delete mode 100644 src/components/footer/footer-component-styles.ts rename src/components/footer/{footer-component.ts => footer.ts} (52%) delete mode 100644 src/components/header/header-component-styles.ts delete mode 100644 src/components/header/header-component.ts create mode 100644 src/components/header/header.ts delete mode 100644 src/utils/generateUUID.ts create mode 100644 src/utils/helperFunctions.ts delete mode 100644 src/views/partials/landing-partial-view-styles.ts delete mode 100644 src/views/partials/landing-partial-view.ts diff --git a/.prettierignore b/.prettierignore index 089fcb8..814ad3a 100644 --- a/.prettierignore +++ b/.prettierignore @@ -3,6 +3,5 @@ dist/ build coverage -test package-lock.json diff --git a/eslint.config.cjs b/eslint.config.cjs deleted file mode 100644 index f93acc0..0000000 --- a/eslint.config.cjs +++ /dev/null @@ -1,35 +0,0 @@ -// @ts-check -const eslint = require('@eslint/js'); -const tseslint = require('typescript-eslint'); -const liteslint = require('eslint-plugin-lit'); -const eslintPluginPrettierRecommended = require('eslint-plugin-prettier/recommended'); - -module.exports = tseslint.config( - { - files: ['**/*.ts'], - extends: [ - eslint.configs.recommended, - ...tseslint.configs.recommended, - ...tseslint.configs.stylistic, - eslintPluginPrettierRecommended, - liteslint.configs['flat/recommended'], - ], - rules: { - // Prettier - 'prettier/prettier': ['error'], - // Typescript - '@typescript-eslint/consistent-type-definitions': 'off', - '@typescript-eslint/no-explicit-any': 'warn', - '@typescript-eslint/no-inferrable-types': 'off', - '@typescript-eslint/explicit-function-return-type': 'error', - '@typescript-eslint/prefer-for-of': 'off', - // Lit - 'lit/no-legacy-template-syntax': 'error', - 'lit/no-template-arrow': 'warn', - }, - }, - { - files: ['test/**/*.{js,ts}'], - rules: {}, - } -); diff --git a/eslint.config.js b/eslint.config.js new file mode 100644 index 0000000..60dd32d --- /dev/null +++ b/eslint.config.js @@ -0,0 +1,43 @@ +import eslint from '@eslint/js'; +import tseslint from 'typescript-eslint'; +import liteslint from 'eslint-plugin-lit'; +import eslintPluginPrettierRecommended from 'eslint-plugin-prettier/recommended'; +import globals from 'globals'; +import { globalIgnores } from 'eslint/config'; + +export default [ + eslint.configs.recommended, + ...tseslint.configs.recommended, + ...tseslint.configs.stylistic, + eslintPluginPrettierRecommended, + liteslint.configs['flat/recommended'], + globalIgnores(['dist/**/*']), + { + files: ['**/*.{js,ts}'], + languageOptions: { + ecmaVersion: 'latest', + sourceType: 'module', + globals: { + ...globals.browser, + }, + }, + plugins: {}, + rules: { + // Prettier + 'prettier/prettier': 'error', + // Typescript + '@typescript-eslint/consistent-type-definitions': 'off', + '@typescript-eslint/no-explicit-any': 'warn', + '@typescript-eslint/no-inferrable-types': 'off', + '@typescript-eslint/explicit-function-return-type': 'error', + '@typescript-eslint/prefer-for-of': 'off', + // Lit + 'lit/no-legacy-template-syntax': 'error', + 'lit/no-template-arrow': 'off', + }, + }, + { + files: ['tests/**/*.{js,ts}'], + rules: {}, + }, +]; diff --git a/index.html b/index.html index 2685b6a..c647a81 100644 --- a/index.html +++ b/index.html @@ -37,7 +37,6 @@ content="https://res.cloudinary.com/dlsmexwxn/image/upload/v1736167788/ccw-img_htd4c0.png" /> Code Cause - diff --git a/package-lock.json b/package-lock.json index 359ce4e..b86a580 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,32 +1,37 @@ { "name": "code-cause-web", - "version": "0.0.0", + "version": "1.0.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "code-cause-web", - "version": "0.0.0", + "version": "1.0.1", "dependencies": { "@vaadin/router": "^2.0.0", - "lit": "^3.3.0", - "three": "^0.177.0", - "three-stdlib": "^2.36.0" + "lit": "^3.3.1", + "three": "^0.179.1", + "three-stdlib": "^2.36.0", + "uuid": "^11.1.0" }, "devDependencies": { - "@types/three": "^0.177.0", - "@vitejs/plugin-legacy": "^6.1.1", - "eslint": "^9.29.0", - "eslint-config-prettier": "^10.1.5", + "@types/three": "^0.179.0", + "@vitejs/plugin-legacy": "^7.2.1", + "eslint": "^9.33.0", + "eslint-config-prettier": "^10.1.8", "eslint-plugin-lit": "^2.1.1", - "eslint-plugin-prettier": "^5.5.0", - "prettier": "^3.6.0", + "eslint-plugin-prettier": "^5.5.4", + "prettier": "^3.6.2", "prettier-eslint": "^16.4.2", "terser": "^5.43.1", - "typescript": "~5.8.3", - "typescript-eslint": "^8.34.1", - "vite": "^6.3.5", + "typescript": "~5.9.2", + "typescript-eslint": "^8.39.1", + "vite": "^7.1.2", "vite-plugin-eslint": "^1.8.1" + }, + "engines": { + "node": ">=20", + "npm": ">=9.6.3" } }, "node_modules/@ampproject/remapping": { @@ -59,9 +64,9 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.27.5", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.27.5.tgz", - "integrity": "sha512-KiRAp/VoJaWkkte84TvUd9qjdbZAdiqyvMxrGl1N6vzFogKmaLgoM3L1kgtLicp2HP5fBJS8JrZKLVIZGVJAVg==", + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.0.tgz", + "integrity": "sha512-60X7qkglvrap8mn1lh2ebxXdZYtUcpd7gsmy9kLaBJ4i/WdY8PqTSdxyA8qraikqKQK5C1KRBKXqznrVapyNaw==", "dev": true, "license": "MIT", "engines": { @@ -69,22 +74,22 @@ } }, "node_modules/@babel/core": { - "version": "7.27.4", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.27.4.tgz", - "integrity": "sha512-bXYxrXFubeYdvB0NhD/NBB3Qi6aZeV20GOWVI47t2dkecCEoneR4NPVcb7abpXDEvejgrUfFtG6vG/zxAKmg+g==", + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.3.tgz", + "integrity": "sha512-yDBHV9kQNcr2/sUr9jghVyz9C3Y5G2zUM2H2lo+9mKv4sFgbA8s8Z9t8D1jiTkGoO/NoIfKMyKWr4s6CN23ZwQ==", "dev": true, "license": "MIT", "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.27.1", - "@babel/generator": "^7.27.3", + "@babel/generator": "^7.28.3", "@babel/helper-compilation-targets": "^7.27.2", - "@babel/helper-module-transforms": "^7.27.3", - "@babel/helpers": "^7.27.4", - "@babel/parser": "^7.27.4", + "@babel/helper-module-transforms": "^7.28.3", + "@babel/helpers": "^7.28.3", + "@babel/parser": "^7.28.3", "@babel/template": "^7.27.2", - "@babel/traverse": "^7.27.4", - "@babel/types": "^7.27.3", + "@babel/traverse": "^7.28.3", + "@babel/types": "^7.28.2", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -110,16 +115,16 @@ } }, "node_modules/@babel/generator": { - "version": "7.27.5", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.27.5.tgz", - "integrity": "sha512-ZGhA37l0e/g2s1Cnzdix0O3aLYm66eF8aufiVteOgnwxgnRP8GoyMj7VWsgWnQbVKXyge7hqrFh2K2TQM6t1Hw==", + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.3.tgz", + "integrity": "sha512-3lSpxGgvnmZznmBkCRnVREPUFJv2wrv9iAoFDvADJc0ypmdOxdUtcLeBgBJ6zE0PMeTKnxeQzyk0xTBq4Ep7zw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/parser": "^7.27.5", - "@babel/types": "^7.27.3", - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25", + "@babel/parser": "^7.28.3", + "@babel/types": "^7.28.2", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", "jsesc": "^3.0.2" }, "engines": { @@ -167,18 +172,18 @@ } }, "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.27.1.tgz", - "integrity": "sha512-QwGAmuvM17btKU5VqXfb+Giw4JcN0hjuufz3DYnpeVDvZLAObloM77bhMXiqry3Iio+Ai4phVRDwl6WU10+r5A==", + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.28.3.tgz", + "integrity": "sha512-V9f6ZFIYSLNEbuGA/92uOvYsGCJNsuA8ESZ4ldc09bWk/j8H8TKiPw8Mk1eG6olpnO0ALHJmYfZvF4MEE4gajg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-annotate-as-pure": "^7.27.3", "@babel/helper-member-expression-to-functions": "^7.27.1", "@babel/helper-optimise-call-expression": "^7.27.1", "@babel/helper-replace-supers": "^7.27.1", "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", - "@babel/traverse": "^7.27.1", + "@babel/traverse": "^7.28.3", "semver": "^6.3.1" }, "engines": { @@ -227,22 +232,32 @@ } }, "node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.6.4", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.4.tgz", - "integrity": "sha512-jljfR1rGnXXNWnmQg2K3+bvhkxB51Rl32QRaOTuwwjviGrHzIbSc8+x9CpraDtbT7mfyjXObULP4w/adunNwAw==", + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.5.tgz", + "integrity": "sha512-uJnGFcPsWQK8fvjgGP5LZUZZsYGIoPeRjSF5PGwrelYgq7Q15/Ft9NGFp1zglwgIv//W0uG4BevRuSJRyylZPg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-compilation-targets": "^7.22.6", - "@babel/helper-plugin-utils": "^7.22.5", - "debug": "^4.1.1", + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-plugin-utils": "^7.27.1", + "debug": "^4.4.1", "lodash.debounce": "^4.0.8", - "resolve": "^1.14.2" + "resolve": "^1.22.10" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, + "node_modules/@babel/helper-globals": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", + "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/helper-member-expression-to-functions": { "version": "7.27.1", "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.27.1.tgz", @@ -272,15 +287,15 @@ } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.27.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.27.3.tgz", - "integrity": "sha512-dSOvYwvyLsWBeIRyOeHXp5vPj5l1I011r52FM1+r1jCERv+aFXYk4whgQccYEGYxK2H3ZAIA8nuPkQ0HaUo3qg==", + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.3.tgz", + "integrity": "sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==", "dev": true, "license": "MIT", "dependencies": { "@babel/helper-module-imports": "^7.27.1", "@babel/helper-validator-identifier": "^7.27.1", - "@babel/traverse": "^7.27.3" + "@babel/traverse": "^7.28.3" }, "engines": { "node": ">=6.9.0" @@ -393,42 +408,42 @@ } }, "node_modules/@babel/helper-wrap-function": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.27.1.tgz", - "integrity": "sha512-NFJK2sHUvrjo8wAU/nQTWU890/zB2jj0qBcCbZbbf+005cAsv6tMjXz31fBign6M5ov1o0Bllu+9nbqkfsjjJQ==", + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.28.3.tgz", + "integrity": "sha512-zdf983tNfLZFletc0RRXYrHrucBEg95NIFMkn6K9dbeMYnsgHaSBGcQqdsCSStG2PYwRre0Qc2NNSCXbG+xc6g==", "dev": true, "license": "MIT", "dependencies": { - "@babel/template": "^7.27.1", - "@babel/traverse": "^7.27.1", - "@babel/types": "^7.27.1" + "@babel/template": "^7.27.2", + "@babel/traverse": "^7.28.3", + "@babel/types": "^7.28.2" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helpers": { - "version": "7.27.6", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.27.6.tgz", - "integrity": "sha512-muE8Tt8M22638HU31A3CgfSUciwz1fhATfoVai05aPXGor//CdWDCbnlY1yvBPo07njuVOCNGCSp/GTt12lIug==", + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.3.tgz", + "integrity": "sha512-PTNtvUQihsAsDHMOP5pfobP8C6CM4JWXmP8DrEIt46c3r2bf87Ua1zoqevsMo9g+tWDwgWrFP5EIxuBx5RudAw==", "dev": true, "license": "MIT", "dependencies": { "@babel/template": "^7.27.2", - "@babel/types": "^7.27.6" + "@babel/types": "^7.28.2" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/parser": { - "version": "7.27.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.27.5.tgz", - "integrity": "sha512-OsQd175SxWkGlzbny8J3K8TnnDD0N3lrIUtB92xwyRpzaenGZhxDvxN/JgU00U3CDZNj9tPuDJ5H0WS4Nt3vKg==", + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.3.tgz", + "integrity": "sha512-7+Ey1mAgYqFAx2h0RuoxcQT5+MlG3GTV0TQrgr7/ZliKsm/MNDxVVutlWaziMq7wJNAz8MTqz55XLpWvva6StA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.27.3" + "@babel/types": "^7.28.2" }, "bin": { "parser": "bin/babel-parser.js" @@ -505,14 +520,14 @@ } }, "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.27.1.tgz", - "integrity": "sha512-6BpaYGDavZqkI6yT+KSPdpZFfpnd68UKXbcjI9pJ13pvHhPrCKWOOLp+ysvMeA+DxnhuPpgIaRpxRxo5A9t5jw==", + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.28.3.tgz", + "integrity": "sha512-b6YTX108evsvE4YgWyQ921ZAFFQm3Bn+CA3+ZXlNVnPhx+UfsVURoPjfGAPCjBgrqo30yX/C2nZGX96DxvR9Iw==", "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", - "@babel/traverse": "^7.27.1" + "@babel/traverse": "^7.28.3" }, "engines": { "node": ">=6.9.0" @@ -600,15 +615,15 @@ } }, "node_modules/@babel/plugin-transform-async-generator-functions": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.27.1.tgz", - "integrity": "sha512-eST9RrwlpaoJBDHShc+DS2SG4ATTi2MYNb4OxYkf3n+7eb49LWpnS+HSpVfW4x927qQwgk8A2hGNVaajAEw0EA==", + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.28.0.tgz", + "integrity": "sha512-BEOdvX4+M765icNPZeidyADIvQ1m1gmunXufXxvRESy/jNNyfovIqUyE7MVgGBjWktCoJlzvFA1To2O4ymIO3Q==", "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-remap-async-to-generator": "^7.27.1", - "@babel/traverse": "^7.27.1" + "@babel/traverse": "^7.28.0" }, "engines": { "node": ">=6.9.0" @@ -652,9 +667,9 @@ } }, "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.27.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.27.5.tgz", - "integrity": "sha512-JF6uE2s67f0y2RZcm2kpAUEbD50vH62TyWVebxwHAlbSdM49VqPz8t4a1uIjp4NIOIZ4xzLfjY5emt/RCyC7TQ==", + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.28.0.tgz", + "integrity": "sha512-gKKnwjpdx5sER/wl0WN0efUBFzF/56YZO0RJrSYP4CljXnP31ByY7fol89AzomdlLNzI36AvOTmYHsnZTCkq8Q==", "dev": true, "license": "MIT", "dependencies": { @@ -685,13 +700,13 @@ } }, "node_modules/@babel/plugin-transform-class-static-block": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.27.1.tgz", - "integrity": "sha512-s734HmYU78MVzZ++joYM+NkJusItbdRcbm+AGRgJCt3iA+yux0QpD9cBVdz3tKyrjVYWRl7j0mHSmv4lhV0aoA==", + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.28.3.tgz", + "integrity": "sha512-LtPXlBbRoc4Njl/oh1CeD/3jC+atytbnf/UqLoqTDcEYGUPj022+rvfkbDYieUrSj3CaV4yHDByPE+T2HwfsJg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.27.1", + "@babel/helper-create-class-features-plugin": "^7.28.3", "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { @@ -702,18 +717,18 @@ } }, "node_modules/@babel/plugin-transform-classes": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.27.1.tgz", - "integrity": "sha512-7iLhfFAubmpeJe/Wo2TVuDrykh/zlWXLzPNdL0Jqn/Xu8R3QQ8h9ff8FQoISZOsw74/HFqFI7NX63HN7QFIHKA==", + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.28.3.tgz", + "integrity": "sha512-DoEWC5SuxuARF2KdKmGUq3ghfPMO6ZzR12Dnp5gubwbeWJo4dbNWXJPVlwvh4Zlq6Z7YVvL8VFxeSOJgjsx4Sg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.27.1", - "@babel/helper-compilation-targets": "^7.27.1", + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-globals": "^7.28.0", "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-replace-supers": "^7.27.1", - "@babel/traverse": "^7.27.1", - "globals": "^11.1.0" + "@babel/traverse": "^7.28.3" }, "engines": { "node": ">=6.9.0" @@ -722,16 +737,6 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-classes/node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, "node_modules/@babel/plugin-transform-computed-properties": { "version": "7.27.1", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.27.1.tgz", @@ -750,13 +755,14 @@ } }, "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.27.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.27.3.tgz", - "integrity": "sha512-s4Jrok82JpiaIprtY2nHsYmrThKvvwgHwjgd7UMiYhZaN0asdXNLr0y+NjTfkA7SyQE5i2Fb7eawUOZmLvyqOA==", + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.28.0.tgz", + "integrity": "sha512-v1nrSMBiKcodhsyJ4Gf+Z0U/yawmJDBOTpEB3mcQY52r9RIyPneGyAS/yM6seP/8I+mWI3elOMtT5dB8GJVs+A==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/traverse": "^7.28.0" }, "engines": { "node": ">=6.9.0" @@ -831,6 +837,23 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-transform-explicit-resource-management": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-explicit-resource-management/-/plugin-transform-explicit-resource-management-7.28.0.tgz", + "integrity": "sha512-K8nhUcn3f6iB+P3gwCv/no7OdzOZQcKchW6N389V6PD8NUWKZHzndOd9sPDVbMoBsbmjMqlB4L9fm+fEFNVlwQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/plugin-transform-destructuring": "^7.28.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, "node_modules/@babel/plugin-transform-exponentiation-operator": { "version": "7.27.1", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.27.1.tgz", @@ -1098,16 +1121,17 @@ } }, "node_modules/@babel/plugin-transform-object-rest-spread": { - "version": "7.27.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.27.3.tgz", - "integrity": "sha512-7ZZtznF9g4l2JCImCo5LNKFHB5eXnN39lLtLY5Tg+VkR0jwOt7TBciMckuiQIOIW7L5tkQOCh3bVGYeXgMx52Q==", + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.28.0.tgz", + "integrity": "sha512-9VNGikXxzu5eCiQjdE4IZn8sb9q7Xsk5EXLDBKUYg1e/Tve8/05+KJEtcxGxAgCY5t/BpKQM+JEL/yT4tvgiUA==", "dev": true, "license": "MIT", "dependencies": { "@babel/helper-compilation-targets": "^7.27.2", "@babel/helper-plugin-utils": "^7.27.1", - "@babel/plugin-transform-destructuring": "^7.27.3", - "@babel/plugin-transform-parameters": "^7.27.1" + "@babel/plugin-transform-destructuring": "^7.28.0", + "@babel/plugin-transform-parameters": "^7.27.7", + "@babel/traverse": "^7.28.0" }, "engines": { "node": ">=6.9.0" @@ -1167,9 +1191,9 @@ } }, "node_modules/@babel/plugin-transform-parameters": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.27.1.tgz", - "integrity": "sha512-018KRk76HWKeZ5l4oTj2zPpSh+NbGdt0st5S6x0pga6HgrjBOJb24mMDHorFopOOd6YHkLgOZ+zaCjZGPO4aKg==", + "version": "7.27.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.27.7.tgz", + "integrity": "sha512-qBkYTYCb76RRxUM6CcZA5KRu8K4SM8ajzVeUgVdMVO9NN9uI/GaVmBg/WKJJGnNokV9SY8FxNOVWGXzqzUidBg==", "dev": true, "license": "MIT", "dependencies": { @@ -1234,9 +1258,9 @@ } }, "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.27.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.27.5.tgz", - "integrity": "sha512-uhB8yHerfe3MWnuLAhEbeQ4afVoqv8BQsPqrTv7e/jZ9y00kJL6l9a/f4OWaKxotmjzewfEyXE1vgDJenkQ2/Q==", + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.28.3.tgz", + "integrity": "sha512-K3/M/a4+ESb5LEldjQb+XSrpY0nF+ZBFlTCbSnKaYAMfD8v33O6PMs4uYnOk19HlcsI8WMu3McdFPTiQHF/1/A==", "dev": true, "license": "MIT", "dependencies": { @@ -1431,13 +1455,13 @@ } }, "node_modules/@babel/preset-env": { - "version": "7.27.2", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.27.2.tgz", - "integrity": "sha512-Ma4zSuYSlGNRlCLO+EAzLnCmJK2vdstgv+n7aUP+/IKZrOfWHOJVdSJtuub8RzHTj3ahD37k5OKJWvzf16TQyQ==", + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.28.3.tgz", + "integrity": "sha512-ROiDcM+GbYVPYBOeCR6uBXKkQpBExLl8k9HO1ygXEyds39j+vCCsjmj7S8GOniZQlEs81QlkdJZe76IpLSiqpg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.27.2", + "@babel/compat-data": "^7.28.0", "@babel/helper-compilation-targets": "^7.27.2", "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-validator-option": "^7.27.1", @@ -1445,25 +1469,26 @@ "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.27.1", "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.27.1", "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.27.1", - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.27.1", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.28.3", "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", "@babel/plugin-syntax-import-assertions": "^7.27.1", "@babel/plugin-syntax-import-attributes": "^7.27.1", "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", "@babel/plugin-transform-arrow-functions": "^7.27.1", - "@babel/plugin-transform-async-generator-functions": "^7.27.1", + "@babel/plugin-transform-async-generator-functions": "^7.28.0", "@babel/plugin-transform-async-to-generator": "^7.27.1", "@babel/plugin-transform-block-scoped-functions": "^7.27.1", - "@babel/plugin-transform-block-scoping": "^7.27.1", + "@babel/plugin-transform-block-scoping": "^7.28.0", "@babel/plugin-transform-class-properties": "^7.27.1", - "@babel/plugin-transform-class-static-block": "^7.27.1", - "@babel/plugin-transform-classes": "^7.27.1", + "@babel/plugin-transform-class-static-block": "^7.28.3", + "@babel/plugin-transform-classes": "^7.28.3", "@babel/plugin-transform-computed-properties": "^7.27.1", - "@babel/plugin-transform-destructuring": "^7.27.1", + "@babel/plugin-transform-destructuring": "^7.28.0", "@babel/plugin-transform-dotall-regex": "^7.27.1", "@babel/plugin-transform-duplicate-keys": "^7.27.1", "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.27.1", "@babel/plugin-transform-dynamic-import": "^7.27.1", + "@babel/plugin-transform-explicit-resource-management": "^7.28.0", "@babel/plugin-transform-exponentiation-operator": "^7.27.1", "@babel/plugin-transform-export-namespace-from": "^7.27.1", "@babel/plugin-transform-for-of": "^7.27.1", @@ -1480,15 +1505,15 @@ "@babel/plugin-transform-new-target": "^7.27.1", "@babel/plugin-transform-nullish-coalescing-operator": "^7.27.1", "@babel/plugin-transform-numeric-separator": "^7.27.1", - "@babel/plugin-transform-object-rest-spread": "^7.27.2", + "@babel/plugin-transform-object-rest-spread": "^7.28.0", "@babel/plugin-transform-object-super": "^7.27.1", "@babel/plugin-transform-optional-catch-binding": "^7.27.1", "@babel/plugin-transform-optional-chaining": "^7.27.1", - "@babel/plugin-transform-parameters": "^7.27.1", + "@babel/plugin-transform-parameters": "^7.27.7", "@babel/plugin-transform-private-methods": "^7.27.1", "@babel/plugin-transform-private-property-in-object": "^7.27.1", "@babel/plugin-transform-property-literals": "^7.27.1", - "@babel/plugin-transform-regenerator": "^7.27.1", + "@babel/plugin-transform-regenerator": "^7.28.3", "@babel/plugin-transform-regexp-modifiers": "^7.27.1", "@babel/plugin-transform-reserved-words": "^7.27.1", "@babel/plugin-transform-shorthand-properties": "^7.27.1", @@ -1501,10 +1526,10 @@ "@babel/plugin-transform-unicode-regex": "^7.27.1", "@babel/plugin-transform-unicode-sets-regex": "^7.27.1", "@babel/preset-modules": "0.1.6-no-external-plugins", - "babel-plugin-polyfill-corejs2": "^0.4.10", - "babel-plugin-polyfill-corejs3": "^0.11.0", - "babel-plugin-polyfill-regenerator": "^0.6.1", - "core-js-compat": "^3.40.0", + "babel-plugin-polyfill-corejs2": "^0.4.14", + "babel-plugin-polyfill-corejs3": "^0.13.0", + "babel-plugin-polyfill-regenerator": "^0.6.5", + "core-js-compat": "^3.43.0", "semver": "^6.3.1" }, "engines": { @@ -1555,38 +1580,28 @@ } }, "node_modules/@babel/traverse": { - "version": "7.27.4", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.27.4.tgz", - "integrity": "sha512-oNcu2QbHqts9BtOWJosOVJapWjBDSxGCpFvikNR5TGDYDQf3JwpIoMzIKrvfoti93cLfPJEG4tH9SPVeyCGgdA==", + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.3.tgz", + "integrity": "sha512-7w4kZYHneL3A6NP2nxzHvT3HCZ7puDZZjFMqDpBPECub79sTtSO5CGXDkKrTQq8ksAwfD/XI2MRFX23njdDaIQ==", "dev": true, "license": "MIT", "dependencies": { "@babel/code-frame": "^7.27.1", - "@babel/generator": "^7.27.3", - "@babel/parser": "^7.27.4", + "@babel/generator": "^7.28.3", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.28.3", "@babel/template": "^7.27.2", - "@babel/types": "^7.27.3", - "debug": "^4.3.1", - "globals": "^11.1.0" + "@babel/types": "^7.28.2", + "debug": "^4.3.1" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/traverse/node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, "node_modules/@babel/types": { - "version": "7.27.6", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.27.6.tgz", - "integrity": "sha512-ETyHEk2VHHvl9b9jZP5IHPavHYk57EhanlRRuae9XCpb/j5bDCbPPMOBfCWhnl/7EDJz0jEMCi/RhccCE8r1+Q==", + "version": "7.28.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.2.tgz", + "integrity": "sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ==", "dev": true, "license": "MIT", "dependencies": { @@ -2072,9 +2087,9 @@ } }, "node_modules/@eslint/config-array": { - "version": "0.20.1", - "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.20.1.tgz", - "integrity": "sha512-OL0RJzC/CBzli0DrrR31qzj6d6i6Mm3HByuhflhl4LOBiWxN+3i6/t/ZQQNii4tjksXi8r2CRW1wMpWA2ULUEw==", + "version": "0.21.0", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.0.tgz", + "integrity": "sha512-ENIdc4iLu0d93HeYirvKmrzshzofPw6VkZRKQGe9Nv46ZnWUzcF1xV01dcvEg/1wXUR61OmmlSfyeyO7EvjLxQ==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -2087,9 +2102,9 @@ } }, "node_modules/@eslint/config-helpers": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.2.3.tgz", - "integrity": "sha512-u180qk2Um1le4yf0ruXH3PYFeEZeYC3p/4wCTKrr2U1CmGdzGi3KtY0nuPDH48UJxlKCC5RDzbcbh4X0XlqgHg==", + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.3.1.tgz", + "integrity": "sha512-xR93k9WhrDYpXHORXpxVL5oHj3Era7wo6k/Wd8/IsQNnZUTzkGS29lyn3nAT05v6ltUuTFVCCYDEGfy2Or/sPA==", "dev": true, "license": "Apache-2.0", "engines": { @@ -2097,9 +2112,9 @@ } }, "node_modules/@eslint/core": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.14.0.tgz", - "integrity": "sha512-qIbV0/JZr7iSDjqAc60IqbLdsj9GDt16xQtWD+B78d/HAlvysGdZZ6rpJHGAc2T0FQx1X6thsSPdnoiGKdNtdg==", + "version": "0.15.2", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.15.2.tgz", + "integrity": "sha512-78Md3/Rrxh83gCxoUc0EiciuOHsIITzLy53m3d9UyiW8y9Dj2D29FeETqyKA+BRK76tnTp6RXWb3pCay8Oyomg==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -2134,9 +2149,9 @@ } }, "node_modules/@eslint/js": { - "version": "9.29.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.29.0.tgz", - "integrity": "sha512-3PIF4cBw/y+1u2EazflInpV+lYsSG0aByVIQzAgb1m1MhHFSbqTyNqtBKHgWf/9Ykud+DhILS9EGkmekVhbKoQ==", + "version": "9.33.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.33.0.tgz", + "integrity": "sha512-5K1/mKhWaMfreBGJTwval43JJmkip0RmM+3+IuqupeSKNC/Th2Kc7ucaq5ovTSra/OOKB9c58CGSz3QMVbWt0A==", "dev": true, "license": "MIT", "engines": { @@ -2157,32 +2172,19 @@ } }, "node_modules/@eslint/plugin-kit": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.3.2.tgz", - "integrity": "sha512-4SaFZCNfJqvk/kenHpI8xvN42DMaoycy4PzKc5otHxRswww1kAt82OlBuwRVLofCACCTZEcla2Ydxv8scMXaTg==", + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.3.5.tgz", + "integrity": "sha512-Z5kJ+wU3oA7MMIqVR9tyZRtjYPr4OC004Q4Rw7pgOKUOKkJfZ3O24nz3WYfGRpMDNmcOi3TwQOmgm7B7Tpii0w==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@eslint/core": "^0.15.0", + "@eslint/core": "^0.15.2", "levn": "^0.4.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "node_modules/@eslint/plugin-kit/node_modules/@eslint/core": { - "version": "0.15.0", - "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.15.0.tgz", - "integrity": "sha512-b7ePw78tEWWkpgZCDYkbqDOP8dmM6qe+AOC6iuJqlq1R/0ahMAeH3qynpnqKFGkMltrp44ohV4ubGyvLX28tzw==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@types/json-schema": "^7.0.15" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, "node_modules/@humanfs/core": { "version": "0.19.1", "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", @@ -2287,18 +2289,14 @@ } }, "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz", - "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", "dev": true, "license": "MIT", "dependencies": { - "@jridgewell/set-array": "^1.2.1", - "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/sourcemap-codec": "^1.5.0", "@jridgewell/trace-mapping": "^0.3.24" - }, - "engines": { - "node": ">=6.0.0" } }, "node_modules/@jridgewell/resolve-uri": { @@ -2311,16 +2309,6 @@ "node": ">=6.0.0" } }, - "node_modules/@jridgewell/set-array": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", - "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, "node_modules/@jridgewell/source-map": { "version": "0.3.6", "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz", @@ -2340,9 +2328,9 @@ "license": "MIT" }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.25", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", - "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "version": "0.3.30", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.30.tgz", + "integrity": "sha512-GQ7Nw5G2lTu/BtHTKfXhKHok2WGetd4XYcVKGx00SjAk8GMwgJM3zr6zORiPGuOE+/vkc90KtTosSSvaCjKb2Q==", "dev": true, "license": "MIT", "dependencies": { @@ -2782,9 +2770,9 @@ "license": "MIT" }, "node_modules/@types/three": { - "version": "0.177.0", - "resolved": "https://registry.npmjs.org/@types/three/-/three-0.177.0.tgz", - "integrity": "sha512-/ZAkn4OLUijKQySNci47lFO+4JLE1TihEjsGWPUT+4jWqxtwOPPEwJV1C3k5MEx0mcBPCdkFjzRzDOnHEI1R+A==", + "version": "0.179.0", + "resolved": "https://registry.npmjs.org/@types/three/-/three-0.179.0.tgz", + "integrity": "sha512-VgbFG2Pgsm84BqdegZzr7w2aKbQxmgzIu4Dy7/75ygiD/0P68LKmp5ie08KMPNqGTQwIge8s6D1guZf1RnZE0A==", "dev": true, "license": "MIT", "dependencies": { @@ -2794,7 +2782,7 @@ "@types/webxr": "*", "@webgpu/types": "*", "fflate": "~0.8.2", - "meshoptimizer": "~0.18.1" + "meshoptimizer": "~0.22.0" } }, "node_modules/@types/three/node_modules/fflate": { @@ -2817,17 +2805,17 @@ "license": "MIT" }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.34.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.34.1.tgz", - "integrity": "sha512-STXcN6ebF6li4PxwNeFnqF8/2BNDvBupf2OPx2yWNzr6mKNGF7q49VM00Pz5FaomJyqvbXpY6PhO+T9w139YEQ==", + "version": "8.39.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.39.1.tgz", + "integrity": "sha512-yYegZ5n3Yr6eOcqgj2nJH8cH/ZZgF+l0YIdKILSDjYFRjgYQMgv/lRjV5Z7Up04b9VYUondt8EPMqg7kTWgJ2g==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "8.34.1", - "@typescript-eslint/type-utils": "8.34.1", - "@typescript-eslint/utils": "8.34.1", - "@typescript-eslint/visitor-keys": "8.34.1", + "@typescript-eslint/scope-manager": "8.39.1", + "@typescript-eslint/type-utils": "8.39.1", + "@typescript-eslint/utils": "8.39.1", + "@typescript-eslint/visitor-keys": "8.39.1", "graphemer": "^1.4.0", "ignore": "^7.0.0", "natural-compare": "^1.4.0", @@ -2841,9 +2829,9 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@typescript-eslint/parser": "^8.34.1", + "@typescript-eslint/parser": "^8.39.1", "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <5.9.0" + "typescript": ">=4.8.4 <6.0.0" } }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { @@ -2857,16 +2845,16 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "8.34.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.34.1.tgz", - "integrity": "sha512-4O3idHxhyzjClSMJ0a29AcoK0+YwnEqzI6oz3vlRf3xw0zbzt15MzXwItOlnr5nIth6zlY2RENLsOPvhyrKAQA==", + "version": "8.39.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.39.1.tgz", + "integrity": "sha512-pUXGCuHnnKw6PyYq93lLRiZm3vjuslIy7tus1lIQTYVK9bL8XBgJnCWm8a0KcTtHC84Yya1Q6rtll+duSMj0dg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/scope-manager": "8.34.1", - "@typescript-eslint/types": "8.34.1", - "@typescript-eslint/typescript-estree": "8.34.1", - "@typescript-eslint/visitor-keys": "8.34.1", + "@typescript-eslint/scope-manager": "8.39.1", + "@typescript-eslint/types": "8.39.1", + "@typescript-eslint/typescript-estree": "8.39.1", + "@typescript-eslint/visitor-keys": "8.39.1", "debug": "^4.3.4" }, "engines": { @@ -2878,18 +2866,18 @@ }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <5.9.0" + "typescript": ">=4.8.4 <6.0.0" } }, "node_modules/@typescript-eslint/project-service": { - "version": "8.34.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.34.1.tgz", - "integrity": "sha512-nuHlOmFZfuRwLJKDGQOVc0xnQrAmuq1Mj/ISou5044y1ajGNp2BNliIqp7F2LPQ5sForz8lempMFCovfeS1XoA==", + "version": "8.39.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.39.1.tgz", + "integrity": "sha512-8fZxek3ONTwBu9ptw5nCKqZOSkXshZB7uAxuFF0J/wTMkKydjXCzqqga7MlFMpHi9DoG4BadhmTkITBcg8Aybw==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.34.1", - "@typescript-eslint/types": "^8.34.1", + "@typescript-eslint/tsconfig-utils": "^8.39.1", + "@typescript-eslint/types": "^8.39.1", "debug": "^4.3.4" }, "engines": { @@ -2900,18 +2888,18 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "typescript": ">=4.8.4 <5.9.0" + "typescript": ">=4.8.4 <6.0.0" } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "8.34.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.34.1.tgz", - "integrity": "sha512-beu6o6QY4hJAgL1E8RaXNC071G4Kso2MGmJskCFQhRhg8VOH/FDbC8soP8NHN7e/Hdphwp8G8cE6OBzC8o41ZA==", + "version": "8.39.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.39.1.tgz", + "integrity": "sha512-RkBKGBrjgskFGWuyUGz/EtD8AF/GW49S21J8dvMzpJitOF1slLEbbHnNEtAHtnDAnx8qDEdRrULRnWVx27wGBw==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.34.1", - "@typescript-eslint/visitor-keys": "8.34.1" + "@typescript-eslint/types": "8.39.1", + "@typescript-eslint/visitor-keys": "8.39.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -2922,9 +2910,9 @@ } }, "node_modules/@typescript-eslint/tsconfig-utils": { - "version": "8.34.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.34.1.tgz", - "integrity": "sha512-K4Sjdo4/xF9NEeA2khOb7Y5nY6NSXBnod87uniVYW9kHP+hNlDV8trUSFeynA2uxWam4gIWgWoygPrv9VMWrYg==", + "version": "8.39.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.39.1.tgz", + "integrity": "sha512-ePUPGVtTMR8XMU2Hee8kD0Pu4NDE1CN9Q1sxGSGd/mbOtGZDM7pnhXNJnzW63zk/q+Z54zVzj44HtwXln5CvHA==", "dev": true, "license": "MIT", "engines": { @@ -2935,18 +2923,19 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "typescript": ">=4.8.4 <5.9.0" + "typescript": ">=4.8.4 <6.0.0" } }, "node_modules/@typescript-eslint/type-utils": { - "version": "8.34.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.34.1.tgz", - "integrity": "sha512-Tv7tCCr6e5m8hP4+xFugcrwTOucB8lshffJ6zf1mF1TbU67R+ntCc6DzLNKM+s/uzDyv8gLq7tufaAhIBYeV8g==", + "version": "8.39.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.39.1.tgz", + "integrity": "sha512-gu9/ahyatyAdQbKeHnhT4R+y3YLtqqHyvkfDxaBYk97EcbfChSJXyaJnIL3ygUv7OuZatePHmQvuH5ru0lnVeA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/typescript-estree": "8.34.1", - "@typescript-eslint/utils": "8.34.1", + "@typescript-eslint/types": "8.39.1", + "@typescript-eslint/typescript-estree": "8.39.1", + "@typescript-eslint/utils": "8.39.1", "debug": "^4.3.4", "ts-api-utils": "^2.1.0" }, @@ -2959,13 +2948,13 @@ }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <5.9.0" + "typescript": ">=4.8.4 <6.0.0" } }, "node_modules/@typescript-eslint/types": { - "version": "8.34.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.34.1.tgz", - "integrity": "sha512-rjLVbmE7HR18kDsjNIZQHxmv9RZwlgzavryL5Lnj2ujIRTeXlKtILHgRNmQ3j4daw7zd+mQgy+uyt6Zo6I0IGA==", + "version": "8.39.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.39.1.tgz", + "integrity": "sha512-7sPDKQQp+S11laqTrhHqeAbsCfMkwJMrV7oTDvtDds4mEofJYir414bYKUEb8YPUm9QL3U+8f6L6YExSoAGdQw==", "dev": true, "license": "MIT", "engines": { @@ -2977,16 +2966,16 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.34.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.34.1.tgz", - "integrity": "sha512-rjCNqqYPuMUF5ODD+hWBNmOitjBWghkGKJg6hiCHzUvXRy6rK22Jd3rwbP2Xi+R7oYVvIKhokHVhH41BxPV5mA==", + "version": "8.39.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.39.1.tgz", + "integrity": "sha512-EKkpcPuIux48dddVDXyQBlKdeTPMmALqBUbEk38McWv0qVEZwOpVJBi7ugK5qVNgeuYjGNQxrrnoM/5+TI/BPw==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/project-service": "8.34.1", - "@typescript-eslint/tsconfig-utils": "8.34.1", - "@typescript-eslint/types": "8.34.1", - "@typescript-eslint/visitor-keys": "8.34.1", + "@typescript-eslint/project-service": "8.39.1", + "@typescript-eslint/tsconfig-utils": "8.39.1", + "@typescript-eslint/types": "8.39.1", + "@typescript-eslint/visitor-keys": "8.39.1", "debug": "^4.3.4", "fast-glob": "^3.3.2", "is-glob": "^4.0.3", @@ -3002,7 +2991,7 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "typescript": ">=4.8.4 <5.9.0" + "typescript": ">=4.8.4 <6.0.0" } }, "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { @@ -3032,16 +3021,16 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "8.34.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.34.1.tgz", - "integrity": "sha512-mqOwUdZ3KjtGk7xJJnLbHxTuWVn3GO2WZZuM+Slhkun4+qthLdXx32C8xIXbO1kfCECb3jIs3eoxK3eryk7aoQ==", + "version": "8.39.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.39.1.tgz", + "integrity": "sha512-VF5tZ2XnUSTuiqZFXCZfZs1cgkdd3O/sSYmdo2EpSyDlC86UM/8YytTmKnehOW3TGAlivqTDT6bS87B/GQ/jyg==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.7.0", - "@typescript-eslint/scope-manager": "8.34.1", - "@typescript-eslint/types": "8.34.1", - "@typescript-eslint/typescript-estree": "8.34.1" + "@typescript-eslint/scope-manager": "8.39.1", + "@typescript-eslint/types": "8.39.1", + "@typescript-eslint/typescript-estree": "8.39.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -3052,17 +3041,17 @@ }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <5.9.0" + "typescript": ">=4.8.4 <6.0.0" } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.34.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.34.1.tgz", - "integrity": "sha512-xoh5rJ+tgsRKoXnkBPFRLZ7rjKM0AfVbC68UZ/ECXoDbfggb9RbEySN359acY1vS3qZ0jVTVWzbtfapwm5ztxw==", + "version": "8.39.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.39.1.tgz", + "integrity": "sha512-W8FQi6kEh2e8zVhQ0eeRnxdvIoOkAp/CPAahcNio6nO9dsIwb9b34z90KOlheoyuVf6LSOEdjlkxSkapNEc+4A==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.34.1", + "@typescript-eslint/types": "8.39.1", "eslint-visitor-keys": "^4.2.1" }, "engines": { @@ -3111,30 +3100,34 @@ } }, "node_modules/@vitejs/plugin-legacy": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-legacy/-/plugin-legacy-6.1.1.tgz", - "integrity": "sha512-BvusL+mYZ0q5qS5Rq3D70QxZBmhyiHRaXLtYJHH5AEsAmdSqJR4xe5KwMi1H3w8/9lVJwhkLYqFQ9vmWYWy6kA==", + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-legacy/-/plugin-legacy-7.2.1.tgz", + "integrity": "sha512-CaXb/y0mlfu7jQRELEJJc2/5w2bX2m1JraARgFnvSB2yfvnCNJVWWlqAo6WjnKoepOwKx8gs0ugJThPLKCOXIg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/core": "^7.26.10", - "@babel/preset-env": "^7.26.9", - "browserslist": "^4.24.4", + "@babel/core": "^7.28.0", + "@babel/plugin-transform-dynamic-import": "^7.27.1", + "@babel/plugin-transform-modules-systemjs": "^7.27.1", + "@babel/preset-env": "^7.28.0", + "babel-plugin-polyfill-corejs3": "^0.13.0", + "babel-plugin-polyfill-regenerator": "^0.6.5", + "browserslist": "^4.25.1", "browserslist-to-esbuild": "^2.1.1", - "core-js": "^3.41.0", + "core-js": "^3.45.0", "magic-string": "^0.30.17", "regenerator-runtime": "^0.14.1", "systemjs": "^6.15.1" }, "engines": { - "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + "node": "^20.19.0 || >=22.12.0" }, "funding": { "url": "https://github.com/vitejs/vite?sponsor=1" }, "peerDependencies": { "terser": "^5.16.0", - "vite": "^6.0.0" + "vite": "^7.0.0" } }, "node_modules/@webgpu/types": { @@ -3228,14 +3221,14 @@ } }, "node_modules/babel-plugin-polyfill-corejs2": { - "version": "0.4.13", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.13.tgz", - "integrity": "sha512-3sX/eOms8kd3q2KZ6DAhKPc0dgm525Gqq5NtWKZ7QYYZEv57OQ54KtblzJzH1lQF/eQxO8KjWGIK9IPUJNus5g==", + "version": "0.4.14", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.14.tgz", + "integrity": "sha512-Co2Y9wX854ts6U8gAAPXfn0GmAyctHuK8n0Yhfjd6t30g7yvKjspvvOo9yG+z52PZRgFErt7Ka2pYnXCjLKEpg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.22.6", - "@babel/helper-define-polyfill-provider": "^0.6.4", + "@babel/compat-data": "^7.27.7", + "@babel/helper-define-polyfill-provider": "^0.6.5", "semver": "^6.3.1" }, "peerDependencies": { @@ -3253,27 +3246,27 @@ } }, "node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.11.1.tgz", - "integrity": "sha512-yGCqvBT4rwMczo28xkH/noxJ6MZ4nJfkVYdoDaC/utLtWrXxv27HVrzAeSbqR8SxDsp46n0YF47EbHoixy6rXQ==", + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.13.0.tgz", + "integrity": "sha512-U+GNwMdSFgzVmfhNm8GJUX88AadB3uo9KpJqS3FaqNIPKgySuvMb+bHPsOmmuWyIcuqZj/pzt1RUIUZns4y2+A==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.6.3", - "core-js-compat": "^3.40.0" + "@babel/helper-define-polyfill-provider": "^0.6.5", + "core-js-compat": "^3.43.0" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, "node_modules/babel-plugin-polyfill-regenerator": { - "version": "0.6.4", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.4.tgz", - "integrity": "sha512-7gD3pRadPrbjhjLyxebmx/WrFYcuSjZ0XbdUujQMZ/fcE9oeewk2U/7PCvez84UeuK3oSjmPZ0Ch0dlupQvGzw==", + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.5.tgz", + "integrity": "sha512-ISqQ2frbiNU9vIJkzg7dlPpznPZ4jOiUQ1uSmB0fEHeowtN3COYRsXr/xexn64NpU13P06jc/L5TgiJXOgrbEg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.6.4" + "@babel/helper-define-polyfill-provider": "^0.6.5" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" @@ -3311,9 +3304,9 @@ } }, "node_modules/browserslist": { - "version": "4.25.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.25.0.tgz", - "integrity": "sha512-PJ8gYKeS5e/whHBh8xrwYK+dAvEj7JXtz6uTucnMRB8OiGTsKccFekoRrjajPBHV8oOY+2tI4uxeceSimKwMFA==", + "version": "4.25.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.25.2.tgz", + "integrity": "sha512-0si2SJK3ooGzIawRu61ZdPCO1IncZwS8IzuX73sPZsXW6EQ/w/DAfPyKI8l1ETTCr2MnvqWitmlCUxgdul45jA==", "dev": true, "funding": [ { @@ -3331,8 +3324,8 @@ ], "license": "MIT", "dependencies": { - "caniuse-lite": "^1.0.30001718", - "electron-to-chromium": "^1.5.160", + "caniuse-lite": "^1.0.30001733", + "electron-to-chromium": "^1.5.199", "node-releases": "^2.0.19", "update-browserslist-db": "^1.1.3" }, @@ -3380,9 +3373,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001724", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001724.tgz", - "integrity": "sha512-WqJo7p0TbHDOythNTqYujmaJTvtYRZrjpP8TCvH6Vb9CYJerJNKamKzIWOM4BkQatWj9H2lYulpdAQNBe7QhNA==", + "version": "1.0.30001735", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001735.tgz", + "integrity": "sha512-EV/laoX7Wq2J9TQlyIXRxTJqIw4sxfXS4OYgudGxBYRuTv0q7AM6yMEpU/Vo1I94thg9U6EZ2NfZx9GJq83u7w==", "dev": true, "funding": [ { @@ -3469,9 +3462,9 @@ "license": "MIT" }, "node_modules/core-js": { - "version": "3.43.0", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.43.0.tgz", - "integrity": "sha512-N6wEbTTZSYOY2rYAn85CuvWWkCK6QweMn7/4Nr3w+gDBeBhk/x4EJeY6FPo4QzDoJZxVTv8U7CMvgWk6pOHHqA==", + "version": "3.45.0", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.45.0.tgz", + "integrity": "sha512-c2KZL9lP4DjkN3hk/an4pWn5b5ZefhRJnAc42n6LJ19kSnbeRbdQZE5dSeE2LBol1OwJD3X1BQvFTAsa8ReeDA==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -3481,13 +3474,13 @@ } }, "node_modules/core-js-compat": { - "version": "3.43.0", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.43.0.tgz", - "integrity": "sha512-2GML2ZsCc5LR7hZYz4AXmjQw8zuy2T//2QntwdnpuYI7jteT6GVYJL7F6C2C57R7gSYrcqVW3lAALefdbhBLDA==", + "version": "3.45.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.45.0.tgz", + "integrity": "sha512-gRoVMBawZg0OnxaVv3zpqLLxaHmsubEGyTnqdpI/CEBvX4JadI1dMSHxagThprYRtSVbuQxvi6iUatdPxohHpA==", "dev": true, "license": "MIT", "dependencies": { - "browserslist": "^4.25.0" + "browserslist": "^4.25.1" }, "funding": { "type": "opencollective", @@ -3574,9 +3567,9 @@ "license": "Apache-2.0" }, "node_modules/electron-to-chromium": { - "version": "1.5.171", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.171.tgz", - "integrity": "sha512-scWpzXEJEMrGJa4Y6m/tVotb0WuvNmasv3wWVzUAeCgKU0ToFOhUW6Z+xWnRQANMYGxN4ngJXIThgBJOqzVPCQ==", + "version": "1.5.203", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.203.tgz", + "integrity": "sha512-uz4i0vLhfm6dLZWbz/iH88KNDV+ivj5+2SA+utpgjKaj9Q0iDLuwk6Idhe9BTxciHudyx6IvTvijhkPvFGUQ0g==", "dev": true, "license": "ISC" }, @@ -3645,20 +3638,20 @@ } }, "node_modules/eslint": { - "version": "9.29.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.29.0.tgz", - "integrity": "sha512-GsGizj2Y1rCWDu6XoEekL3RLilp0voSePurjZIkxL3wlm5o5EC9VpgaP7lrCvjnkuLvzFBQWB3vWB3K5KQTveQ==", + "version": "9.33.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.33.0.tgz", + "integrity": "sha512-TS9bTNIryDzStCpJN93aC5VRSW3uTx9sClUn4B87pwiCaJh220otoI0X8mJKr+VcPtniMdN8GKjlwgWGUv5ZKA==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.12.1", - "@eslint/config-array": "^0.20.1", - "@eslint/config-helpers": "^0.2.1", - "@eslint/core": "^0.14.0", + "@eslint/config-array": "^0.21.0", + "@eslint/config-helpers": "^0.3.1", + "@eslint/core": "^0.15.2", "@eslint/eslintrc": "^3.3.1", - "@eslint/js": "9.29.0", - "@eslint/plugin-kit": "^0.3.1", + "@eslint/js": "9.33.0", + "@eslint/plugin-kit": "^0.3.5", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", @@ -3706,9 +3699,9 @@ } }, "node_modules/eslint-config-prettier": { - "version": "10.1.5", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-10.1.5.tgz", - "integrity": "sha512-zc1UmCpNltmVY34vuLRV61r1K27sWuX39E+uyUnY8xS2Bex88VV9cugG+UZbRSRGtGyFboj+D8JODyme1plMpw==", + "version": "10.1.8", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-10.1.8.tgz", + "integrity": "sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w==", "dev": true, "license": "MIT", "bin": { @@ -3739,9 +3732,9 @@ } }, "node_modules/eslint-plugin-prettier": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.5.0.tgz", - "integrity": "sha512-8qsOYwkkGrahrgoUv76NZi23koqXOGiiEzXMrT8Q7VcYaUISR+5MorIUxfWqYXN0fN/31WbSrxCxFkVQ43wwrA==", + "version": "5.5.4", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.5.4.tgz", + "integrity": "sha512-swNtI95SToIz05YINMA6Ox5R057IMAmWZ26GqPxusAp1TZzj+IdY9tXNWWD3vkF/wEqydCONcwjTFpxybBqZsg==", "dev": true, "license": "MIT", "dependencies": { @@ -4401,9 +4394,9 @@ } }, "node_modules/lit": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/lit/-/lit-3.3.0.tgz", - "integrity": "sha512-DGVsqsOIHBww2DqnuZzW7QsuCdahp50ojuDaBPC7jUDRpYoH0z7kHBBYZewRzer75FwtrkmkKk7iOAwSaWdBmw==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/lit/-/lit-3.3.1.tgz", + "integrity": "sha512-Ksr/8L3PTapbdXJCk+EJVB78jDodUMaP54gD24W186zGRARvwrsPfS60wae/SSCTCNZVPd1chXqio1qHQmu4NA==", "license": "BSD-3-Clause", "dependencies": { "@lit/reactive-element": "^2.1.0", @@ -4584,9 +4577,9 @@ } }, "node_modules/meshoptimizer": { - "version": "0.18.1", - "resolved": "https://registry.npmjs.org/meshoptimizer/-/meshoptimizer-0.18.1.tgz", - "integrity": "sha512-ZhoIoL7TNV4s5B6+rx5mC//fw8/POGyNxS/DZyCJeiZ12ScLfVwRE/GfsxwiTkMYYD5DmK2/JXnEVXqL4rF+Sw==", + "version": "0.22.0", + "resolved": "https://registry.npmjs.org/meshoptimizer/-/meshoptimizer-0.22.0.tgz", + "integrity": "sha512-IebiK79sqIy+E4EgOr+CAw+Ke8hAspXKzBd0JdgEmPHiAwmvEj2S4h1rfvo+o/BnfEYd/jAOg5IeeIjzlzSnDg==", "dev": true, "license": "MIT" }, @@ -4821,9 +4814,9 @@ "license": "ISC" }, "node_modules/picomatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", - "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, "license": "MIT", "engines": { @@ -4879,9 +4872,9 @@ } }, "node_modules/prettier": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.6.0.tgz", - "integrity": "sha512-ujSB9uXHJKzM/2GBuE0hBOUgC77CN3Bnpqa+g80bkv3T3A93wL/xlzDATHhnhkzifz/UE2SNOvmbTz5hSkDlHw==", + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.6.2.tgz", + "integrity": "sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==", "dev": true, "license": "MIT", "bin": { @@ -5765,9 +5758,9 @@ "license": "MIT" }, "node_modules/three": { - "version": "0.177.0", - "resolved": "https://registry.npmjs.org/three/-/three-0.177.0.tgz", - "integrity": "sha512-EiXv5/qWAaGI+Vz2A+JfavwYCMdGjxVsrn3oBwllUoqYeaBO75J63ZfyaQKoiLrqNHoTlUc6PFgMXnS0kI45zg==", + "version": "0.179.1", + "resolved": "https://registry.npmjs.org/three/-/three-0.179.1.tgz", + "integrity": "sha512-5y/elSIQbrvKOISxpwXCR4sQqHtGiOI+MKLc3SsBdDXA2hz3Mdp3X59aUp8DyybMa34aeBwbFTpdoLJaUDEWSw==", "license": "MIT" }, "node_modules/three-stdlib": { @@ -5863,9 +5856,9 @@ } }, "node_modules/typescript": { - "version": "5.8.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz", - "integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==", + "version": "5.9.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.2.tgz", + "integrity": "sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A==", "dev": true, "license": "Apache-2.0", "bin": { @@ -5877,15 +5870,16 @@ } }, "node_modules/typescript-eslint": { - "version": "8.34.1", - "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.34.1.tgz", - "integrity": "sha512-XjS+b6Vg9oT1BaIUfkW3M3LvqZE++rbzAMEHuccCfO/YkP43ha6w3jTEMilQxMF92nVOYCcdjv1ZUhAa1D/0ow==", + "version": "8.39.1", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.39.1.tgz", + "integrity": "sha512-GDUv6/NDYngUlNvwaHM1RamYftxf782IyEDbdj3SeaIHHv8fNQVRC++fITT7kUJV/5rIA/tkoRSSskt6osEfqg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/eslint-plugin": "8.34.1", - "@typescript-eslint/parser": "8.34.1", - "@typescript-eslint/utils": "8.34.1" + "@typescript-eslint/eslint-plugin": "8.39.1", + "@typescript-eslint/parser": "8.39.1", + "@typescript-eslint/typescript-estree": "8.39.1", + "@typescript-eslint/utils": "8.39.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -5896,7 +5890,7 @@ }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <5.9.0" + "typescript": ">=4.8.4 <6.0.0" } }, "node_modules/unicode-canonical-property-names-ecmascript": { @@ -5984,25 +5978,38 @@ "punycode": "^2.1.0" } }, + "node_modules/uuid": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-11.1.0.tgz", + "integrity": "sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist/esm/bin/uuid" + } + }, "node_modules/vite": { - "version": "6.3.5", - "resolved": "https://registry.npmjs.org/vite/-/vite-6.3.5.tgz", - "integrity": "sha512-cZn6NDFE7wdTpINgs++ZJ4N49W2vRp8LCKrn3Ob1kYNtOo21vfDoaV5GzBfLU4MovSAB8uNRm4jgzVQZ+mBzPQ==", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/vite/-/vite-7.1.2.tgz", + "integrity": "sha512-J0SQBPlQiEXAF7tajiH+rUooJPo0l8KQgyg4/aMunNtrOa7bwuZJsJbDWzeljqQpgftxuq5yNJxQ91O9ts29UQ==", "dev": true, "license": "MIT", "dependencies": { "esbuild": "^0.25.0", - "fdir": "^6.4.4", - "picomatch": "^4.0.2", - "postcss": "^8.5.3", - "rollup": "^4.34.9", - "tinyglobby": "^0.2.13" + "fdir": "^6.4.6", + "picomatch": "^4.0.3", + "postcss": "^8.5.6", + "rollup": "^4.43.0", + "tinyglobby": "^0.2.14" }, "bin": { "vite": "bin/vite.js" }, "engines": { - "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + "node": "^20.19.0 || >=22.12.0" }, "funding": { "url": "https://github.com/vitejs/vite?sponsor=1" @@ -6011,14 +6018,14 @@ "fsevents": "~2.3.3" }, "peerDependencies": { - "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", + "@types/node": "^20.19.0 || >=22.12.0", "jiti": ">=1.21.0", - "less": "*", + "less": "^4.0.0", "lightningcss": "^1.21.0", - "sass": "*", - "sass-embedded": "*", - "stylus": "*", - "sugarss": "*", + "sass": "^1.70.0", + "sass-embedded": "^1.70.0", + "stylus": ">=0.54.8", + "sugarss": "^5.0.0", "terser": "^5.16.0", "tsx": "^4.8.1", "yaml": "^2.4.2" diff --git a/package.json b/package.json index f3f8d26..7ffd442 100644 --- a/package.json +++ b/package.json @@ -1,12 +1,11 @@ { "name": "code-cause-web", "private": true, - "version": "1.0.0", + "version": "1.0.1", "type": "module", "engines": { - "node": ">=18.20.5 <=22.14.0", - "npm": ">=9.0.0", - "yarn": "Please use npm" + "node": ">=20", + "npm": ">=9.6.3" }, "scripts": { "dev": "vite --port 3000", @@ -17,23 +16,24 @@ }, "dependencies": { "@vaadin/router": "^2.0.0", - "lit": "^3.3.0", - "three": "^0.177.0", - "three-stdlib": "^2.36.0" + "lit": "^3.3.1", + "three": "^0.179.1", + "three-stdlib": "^2.36.0", + "uuid": "^11.1.0" }, "devDependencies": { - "@types/three": "^0.177.0", - "@vitejs/plugin-legacy": "^6.1.1", - "eslint": "^9.29.0", - "eslint-config-prettier": "^10.1.5", + "@types/three": "^0.179.0", + "@vitejs/plugin-legacy": "^7.2.1", + "eslint": "^9.33.0", + "eslint-config-prettier": "^10.1.8", "eslint-plugin-lit": "^2.1.1", - "eslint-plugin-prettier": "^5.5.0", - "prettier": "^3.6.0", + "eslint-plugin-prettier": "^5.5.4", + "prettier": "^3.6.2", "prettier-eslint": "^16.4.2", "terser": "^5.43.1", - "typescript": "~5.8.3", - "typescript-eslint": "^8.34.1", - "vite": "^6.3.5", + "typescript": "~5.9.2", + "typescript-eslint": "^8.39.1", + "vite": "^7.1.2", "vite-plugin-eslint": "^1.8.1" } } diff --git a/src/app.ts b/src/app.ts index bc2a697..d2e9db8 100644 --- a/src/app.ts +++ b/src/app.ts @@ -1,26 +1,49 @@ -import { LitElement, html, type TemplateResult } from 'lit'; +import { LitElement, html, css, type TemplateResult } from 'lit'; import { customElement, query } from 'lit/decorators.js'; import { Router } from '@vaadin/router'; import { routes } from './routes'; -import './components/header/header-component'; -import './components/footer/footer-component'; +import './components/header/header'; +import './components/footer/footer'; @customElement('app-root') export class AppRoot extends LitElement { @query('#outlet') - private _outlet!: HTMLElement; + private _outlet!: HTMLElement | null; firstUpdated(): void { const router = new Router(this._outlet); router.setRoutes(routes); } - render(): TemplateResult<1> { + render(): TemplateResult { return html` - -
- +
+ +
+ +
`; } + + static styles = css` + :host { + display: flex; + flex-direction: column; + min-height: 100vh; + } + + main { + width: min(95ch, 100% - 4rem); + margin-inline: auto; + display: flex; + flex-direction: column; + flex: 1; + } + + #outlet { + flex: 1; + display: flex; + } + `; } diff --git a/src/assets/img/discord-icon.png b/src/assets/img/discord-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..c49cc20a02056e0e05fa8edf8dbef012cf510d1e GIT binary patch literal 13796 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 QW*I { + render(): TemplateResult { return html`
`; } + + static styles = css` + .footer-container { + display: flex; + justify-content: center; + align-items: center; + min-height: 10vh; + flex-wrap: wrap; + } + + .footer-text { + display: flex; + gap: 10px; + justify-content: center; + align-items: center; + color: #acacac; + font-size: 1rem; + } + + a { + text-decoration: none; + color: #4b7ce6; + } + + a:hover { + text-decoration: underline; + } + + .github-icon { + filter: brightness(0) invert(1); + width: 24px; + height: 24px; + } + + .icon { + width: 20px; + height: 20px; + display: block; + } + + @media only screen and (max-width: 640px) { + .footer-text { + font-size: 0.7rem; + } + } + `; } declare global { interface HTMLElementTagNameMap { - 'footer-component': FooterComponent; + 'app-footer': FooterComponent; } } diff --git a/src/components/header/header-component-styles.ts b/src/components/header/header-component-styles.ts deleted file mode 100644 index 550adf7..0000000 --- a/src/components/header/header-component-styles.ts +++ /dev/null @@ -1,45 +0,0 @@ -import { css } from 'lit'; - -export const headerComponentStyles = css` - nav { - display: flex; - justify-content: space-between; - align-items: center; - } - - .nav-logo { - display: flex; - justify-content: center; - align-items: center; - } - - .logo { - height: 1.8rem; - width: auto; - align-items: center; - margin-right: 0.25rem; - } - - .app-title { - font-size: 1.125rem; - font-weight: 500; - } - - .nav-links { - display: flex; - gap: 1.5rem; - } - - .nav-links a { - text-decoration: none; - color: var(--text); - font-weight: 500; - } - - a:hover { - color: #4b7ce6; - } - - @media (max-width: 768px) { - } -`; diff --git a/src/components/header/header-component.ts b/src/components/header/header-component.ts deleted file mode 100644 index 4e10b12..0000000 --- a/src/components/header/header-component.ts +++ /dev/null @@ -1,33 +0,0 @@ -import { html, LitElement, type TemplateResult } from 'lit'; -import { customElement, property } from 'lit/decorators.js'; -import { headerComponentStyles } from './header-component-styles'; -import logo from '../../assets/img/code-cause-logo.png'; - -@customElement('header-component') -export class HeaderComponent extends LitElement { - static styles = headerComponentStyles; - - @property() src = logo; - @property() alt = 'code-cause-logo-img'; - - render(): TemplateResult<1> { - return html`
- -
`; - } -} - -declare global { - interface HTMLElementTagNameMap { - 'header-component': HeaderComponent; - } -} diff --git a/src/components/header/header.ts b/src/components/header/header.ts new file mode 100644 index 0000000..049b831 --- /dev/null +++ b/src/components/header/header.ts @@ -0,0 +1,95 @@ +import { html, LitElement, css, type TemplateResult, nothing } from 'lit'; +import { customElement, state } from 'lit/decorators.js'; +import logo from '../../assets/img/code-cause-logo.png'; + +@customElement('app-header') +export class HeaderComponent extends LitElement { + @state() + private _isPageNotFoundInView: boolean = false; + + connectedCallback(): void { + super.connectedCallback(); + window.addEventListener('is-page-not-found', this.onPageNotFoundView); + } + + disconnectedCallback(): void { + super.disconnectedCallback(); + window.removeEventListener('is-page-not-found', this.onPageNotFoundView); + } + + render(): TemplateResult { + return html`${!this._isPageNotFoundInView + ? html`
+ +
` + : nothing}`; + } + + /** + * Handle `is-page-not-found` event - get value true/false if page not found view is showing to show/hide header + * @param event + */ + private onPageNotFoundView = (event: Event): void => { + if (event instanceof CustomEvent) { + if (event.detail !== this._isPageNotFoundInView) { + this._isPageNotFoundInView = event.detail; + } + } + }; + + static styles = css` + nav { + display: flex; + justify-content: space-between; + align-items: center; + } + + .nav-logo { + display: flex; + justify-content: center; + align-items: center; + } + + .logo { + height: 1.8rem; + width: auto; + align-items: center; + margin-right: 0.25rem; + } + + .app-title { + font-size: 1.125rem; + font-weight: 500; + } + + .nav-links { + display: flex; + gap: 1.5rem; + } + + .nav-links a { + text-decoration: none; + color: var(--text); + font-weight: 500; + } + + a:hover { + color: #4b7ce6; + } + `; +} + +declare global { + interface HTMLElementTagNameMap { + 'app-header': HeaderComponent; + } +} diff --git a/src/components/three-js/globe-viewer/globe-viewer.ts b/src/components/three-js/globe-viewer/globe-viewer.ts index b3c32d1..e572638 100644 --- a/src/components/three-js/globe-viewer/globe-viewer.ts +++ b/src/components/three-js/globe-viewer/globe-viewer.ts @@ -5,22 +5,6 @@ import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls.js'; @customElement('globe-viewer') export class GlobeViewer extends LitElement { - static styles = css` - :host { - display: block; - width: 100%; - height: 150px; - background-color: inherit; - position: relative; - } - - .renderer-container { - width: 100%; - height: 100%; - overflow: hidden; - } - `; - private _scene!: THREE.Scene; private _camera!: THREE.PerspectiveCamera; private _renderer!: THREE.WebGLRenderer; @@ -101,9 +85,28 @@ export class GlobeViewer extends LitElement { this._renderer.render(this._scene, this._camera); }; - render(): TemplateResult<1> { + render(): TemplateResult { return html`
`; } + + static styles = css` + :host { + display: block; + width: 100%; + height: 150px; + background-color: inherit; + position: relative; + } + + .renderer-container { + width: 100%; + height: 100%; + overflow: hidden; + display: flex; + justify-content: center; + align-items: center; + } + `; } declare global { diff --git a/src/main.css b/src/main.css index 913cbf8..93ce80b 100644 --- a/src/main.css +++ b/src/main.css @@ -7,42 +7,18 @@ --background-color: #111827; } -/* Box sizing rules */ *, *::before, *::after { box-sizing: border-box; } -/* Prevent font size inflation */ html { -moz-text-size-adjust: none; -webkit-text-size-adjust: none; text-size-adjust: none; } -/* Remove default margin in favour of better control in authored CSS */ -body, -h1, -h2, -h3, -h4, -p, -figure, -blockquote, -dl, -dd { - margin-block-end: 0; -} - -/* Remove list styles on ul, ol elements with a list role, which suggests default styling will be removed */ -ul[role='list'], -ol[role='list'] { - list-style: none; -} - -/* Set core body defaults */ - body { min-height: 100vh; font-family: @@ -65,59 +41,3 @@ body { background-color: var(--background-color); color: var(--primary-text-color); } - -main { - width: min(95ch, 100% - 4rem); - margin-inline: auto; -} - -/* Set shorter line heights on headings and interactive elements */ -h1, -h2, -h3, -h4, -button, -input, -label { - line-height: 1.1; -} - -/* Balance text wrapping on headings */ -h1, -h2, -h3, -h4 { - text-wrap: balance; -} - -/* A elements that don't have a class get default styles */ -a:not([class]) { - text-decoration-skip-ink: auto; - color: currentColor; -} - -/* Make images easier to work with */ -img, -picture { - max-width: 100%; - display: block; -} - -/* Inherit fonts for inputs and buttons */ -input, -button, -textarea, -select { - font-family: inherit; - font-size: inherit; -} - -/* Make sure textareas without a rows attribute are not tiny */ -textarea:not([rows]) { - min-height: 10em; -} - -/* Anything that has been anchored to should have extra scroll margin */ -:target { - scroll-margin-block: 5ex; -} diff --git a/src/main.ts b/src/main.ts index 6874f7b..36c3352 100644 --- a/src/main.ts +++ b/src/main.ts @@ -1,16 +1 @@ import './app'; -import { randomUUID } from './utils/generateUUID'; - -const NONCE = randomUUID(); - -let meta = document.querySelector('meta[http-equiv="Content-Security-Policy"]'); - -if (!meta) { - meta = document.createElement('meta'); - meta.setAttribute('http-equiv', 'Content-Security-Policy'); - document.head.appendChild(meta); -} - -const csp = `object-src 'none'; media-src 'none'; base-uri 'none'; script-src 'self' 'nonce-${NONCE}'; style-src 'nonce-${NONCE}'; img-src 'self' 'nonce-${NONCE}';`; - -meta.setAttribute('content', `${csp}`); diff --git a/src/routes.ts b/src/routes.ts index 638cb4e..63ccf90 100644 --- a/src/routes.ts +++ b/src/routes.ts @@ -4,6 +4,7 @@ import type { RouteContext, Commands, } from '@vaadin/router'; +import { APP_TITLE } from './utils/constants'; export const routes: Route[] = [ { @@ -14,8 +15,7 @@ export const routes: Route[] = [ commands: Commands ): Promise { await import('./views/home-view'); - document.title = - 'Code Cause | Inspiring innovation, empowering collaboration, enabling progress, and driving impact through code'; + document.title = `${APP_TITLE} | Inspiring innovation, empowering collaboration, enabling progress, and driving impact through code`; return commands.component('home-view'); }, }, @@ -27,7 +27,7 @@ export const routes: Route[] = [ commands: Commands ): Promise { await import('./views/about-view'); - document.title = 'Code Cause | About'; + document.title = `${APP_TITLE} | About`; return commands.component('about-view'); }, }, @@ -39,7 +39,7 @@ export const routes: Route[] = [ commands: Commands ): Promise { await import('./views/not-found-view'); - document.title = 'Code Cause | Page not found'; + document.title = `${APP_TITLE} | Page not found`; return commands.component('not-found-view'); }, }, diff --git a/src/utils/generateUUID.ts b/src/utils/generateUUID.ts deleted file mode 100644 index c0e5d62..0000000 --- a/src/utils/generateUUID.ts +++ /dev/null @@ -1,20 +0,0 @@ -export function randomUUID(): string { - if (crypto && typeof crypto?.randomUUID === 'function') { - return crypto.randomUUID(); - } - - // Fallback if older browser and/or crypto.randomUUID() not supported - let uuid = ''; - const chars = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'; - for (let i = 0; i < chars.length; i++) { - const randomValue = (Math.random() * 16) | 0; // Generate random value (0-15) - if (chars[i] === 'x') { - uuid += randomValue.toString(16); // Replace 'x' with random hex value - } else if (chars[i] === 'y') { - uuid += ((randomValue & 0x3) | 0x8).toString(16); // Replace 'y' with a value between 8 and 11 - } else { - uuid += chars[i]; // Preserve the dashes and '4' in the template - } - } - return uuid; -} diff --git a/src/utils/helperFunctions.ts b/src/utils/helperFunctions.ts new file mode 100644 index 0000000..e3eb5de --- /dev/null +++ b/src/utils/helperFunctions.ts @@ -0,0 +1,8 @@ +import { v4 as uuidv4 } from 'uuid'; +export function UUIDv4(): string { + if (crypto && typeof crypto?.randomUUID === 'function') { + return crypto.randomUUID(); + } + // Fallback + return uuidv4(); +} diff --git a/src/views/about-view.ts b/src/views/about-view.ts index b7802ff..0019fbb 100644 --- a/src/views/about-view.ts +++ b/src/views/about-view.ts @@ -3,48 +3,8 @@ import { customElement } from 'lit/decorators.js'; @customElement('about-view') export class AboutView extends LitElement { - static styles = css` - main { - width: 100%; - max-width: 768px; - margin-left: auto; - margin-right: auto; - } - - h3 { - font-weight: 700; - line-height: 1.5; - margin-bottom: 1.5rem; - } - - h3.title { - font-size: 1.875rem; - font-weight: 700; - } - - h3.sub-title { - font-size: 1.25rem; - font-weight: 700; - margin-top: 1.25rem; - margin-bottom: 1.5rem; - } - - p { - color: #e5e7eb; - margin: 0; - } - - hr { - margin-top: 1.5rem; - margin-bottom: 1.5rem; - border-top-width: 1px; - border-color: #374151; - border-style: solid; - } - `; - - render(): TemplateResult<1> { - return html`
+ render(): TemplateResult { + return html`

About Us

@@ -85,8 +45,41 @@ export class AboutView extends LitElement {


-
`; + `; } + + static styles = css` + h3 { + font-weight: 700; + line-height: 1.5; + margin-bottom: 1.5rem; + } + + h3.title { + font-size: 1.875rem; + font-weight: 700; + } + + h3.sub-title { + font-size: 1.25rem; + font-weight: 700; + margin-top: 1.25rem; + margin-bottom: 1.5rem; + } + + p { + color: #e5e7eb; + margin: 0; + } + + hr { + margin-top: 1.5rem; + margin-bottom: 1.5rem; + border-top-width: 1px; + border-color: #374151; + border-style: solid; + } + `; } declare global { diff --git a/src/views/home-view.ts b/src/views/home-view.ts index 2717267..e65d998 100644 --- a/src/views/home-view.ts +++ b/src/views/home-view.ts @@ -1,17 +1,204 @@ -import { LitElement, html, type TemplateResult } from 'lit'; +import { LitElement, html, css, type TemplateResult } from 'lit'; import { customElement } from 'lit/decorators.js'; +import discord from '../assets/img/discord-icon.png'; +import person1 from '../assets/img/person-1.png'; +import person2 from '../assets/img/person-2.png'; +import person3 from '../assets/img/person-3.png'; +import person4 from '../assets/img/person-4.png'; -import './partials/landing-partial-view'; +import '../components/three-js/globe-viewer/globe-viewer'; + +const PERSON_IMAGES: readonly { + alt: string; + path: string; + id: string; +}[] = [ + { alt: 'person-1', path: person1, id: '1' }, + { alt: 'person-2', path: person2, id: '2' }, + { alt: 'person-3', path: person3, id: '3' }, + { alt: 'person-4', path: person4, id: '4' }, +]; @customElement('home-view') export class HomeView extends LitElement { - landingPartialViewTemplate(): TemplateResult<1> { - return html``; + connectedCallback(): void { + super.connectedCallback(); + this.dispatchEvent( + new CustomEvent('is-page-not-found', { + detail: false, + bubbles: true, + composed: true, + }) + ); + } + + render(): TemplateResult { + return html` +
+ + + + ${this.heroSectionTemplate()} + + ${this.callToActionSectionTemplate()} +
+ `; } - render(): TemplateResult<1> { - return html` ${this.landingPartialViewTemplate()} `; + private heroSectionTemplate(): TemplateResult { + return html`
+
+

Building a Better World Through Code

+

+ Uniting developers to build a future driven by purpose, innovation, + and good faith. Bridging imagination with action to shape a better + tomorrow through technology. +

+ +
+
`; } + + private callToActionSectionTemplate(): TemplateResult { + return html`
+
+
+ ${PERSON_IMAGES.map( + (img) => + html`${img.alt}` + )} +
+
+

Join Today

+

+ Join a global, tech-driven community of developers, united in + creating solutions that serve the greater good of humanity. +

+
+ +
+
`; + } + + static styles = css` + :host { + width: 100%; + height: 100%; + display: block; + } + + .wrapper { + display: flex; + flex-direction: column; + justify-content: center; + text-align: center; + width: 100%; + } + .container { + display: flex; + flex-direction: column; + max-width: 66.666667%; + margin: 0 auto; + } + + h1 { + font-weight: 700; + font-size: 2rem; + } + + p { + color: #dddde1; + } + + a { + color: var(--white); + text-decoration: none; + padding: 0.5em; + padding-right: 1em; + padding-left: 1em; + border-radius: 20px; + border: 1px solid #2e2e2e; + } + + .learn-more:hover { + border: 1px solid #555555; + } + + .learn-more { + background-color: #212a39; + } + + .cta-buttons { + margin-top: 4rem; + } + + #cta-section .container { + margin-top: 150px; + } + + .user-images { + display: flex; + align-items: center; + justify-content: center; + } + + .user-avatar { + height: 2rem; + width: 2rem; + border-radius: 9999px; + object-fit: cover; + } + + .community-cta { + display: inline-flex; + align-items: center; + gap: 8px; + background-color: #5865f2; + } + + .community-cta:hover { + border: 1px solid #555555; + } + + .discord-icon { + filter: brightness(0) invert(1); + width: 20px; + height: 15px; + } + + @media only screen and (max-width: 640px) { + h1 { + font-size: 2.75rem; + } + .container { + max-width: 90%; + } + } + + @media (min-width: 1280px) { + h1 { + font-size: 4rem; + } + } + `; } declare global { diff --git a/src/views/not-found-view.ts b/src/views/not-found-view.ts index 92cc39e..21583c3 100644 --- a/src/views/not-found-view.ts +++ b/src/views/not-found-view.ts @@ -3,12 +3,36 @@ import { customElement } from 'lit/decorators.js'; @customElement('not-found-view') export class NotFoundView extends LitElement { + connectedCallback(): void { + super.connectedCallback(); + this.dispatchEvent( + new CustomEvent('is-page-not-found', { + detail: true, + bubbles: true, + composed: true, + }) + ); + } + + render(): TemplateResult { + return html`
+
+

Page Not Found

+
+
+

Unfortunately, the requested resource could not be found.

+
+ +
`; + } + static styles = css` - .container { - max-width: 512px; + :host { width: 100%; - margin: 0 auto; - padding: 1rem; + display: flex; + justify-content: center; text-align: center; } @@ -16,16 +40,12 @@ export class NotFoundView extends LitElement { font-weight: 600; font-size: 1.875rem; line-height: 2.25rem; - margin-top: 20px; } .message { font-size: 0.875rem; font-weight: 500; color: #9ca3af; - display: flex; - justify-content: center; - margin-top: 15px; margin-bottom: 20px; } @@ -46,7 +66,6 @@ export class NotFoundView extends LitElement { font-weight: 500; cursor: pointer; transition: background-color 0.2s ease; - outline-color: none; border: none; color: var(--white); } @@ -55,19 +74,6 @@ export class NotFoundView extends LitElement { background-color: #0056b3; } `; - render(): TemplateResult<1> { - return html`
-
-

Page Not Found

-
-
-

Unfortunately, the requested resource could not be found.

-
- -
`; - } } declare global { diff --git a/src/views/partials/landing-partial-view-styles.ts b/src/views/partials/landing-partial-view-styles.ts deleted file mode 100644 index 9d0f5d2..0000000 --- a/src/views/partials/landing-partial-view-styles.ts +++ /dev/null @@ -1,87 +0,0 @@ -import { css } from 'lit'; - -export const landingPartialViewStyles = css` - .wrapper { - display: flex; - flex-direction: column; - justify-content: center; - text-align: center; - width: 100%; - } - .container { - display: flex; - flex-direction: column; - max-width: 66.666667%; - margin: 0 auto; - } - - h1 { - font-weight: 700; - font-size: 2rem; - } - - p { - color: #dddde1; - } - - a { - color: var(--white); - text-decoration: none; - padding: 0.5em; - padding-right: 1em; - padding-left: 1em; - border-radius: 20px; - border: 1px solid #2e2e2e; - } - - a:hover { - border: 1px solid #555555; - } - - a.community-cta { - background-color: #7d3986; - } - - a.learn-more { - background-color: #212a39; - } - - .cta-buttons { - margin-top: 4rem; - } - - #cta-section .container { - margin-top: 150px; - } - - .user-images { - display: flex; - align-items: center; - justify-content: center; - } - - .user-avatar { - height: 2rem; - width: 2rem; - border-radius: 9999px; - object-fit: cover; - } - - @media only screen and (max-width: 640px) { - h1 { - font-size: 2.75rem; - } - a.discord { - font-size: 0.9rem; - } - .container { - max-width: 90%; - } - } - - @media (min-width: 1280px) { - h1 { - font-size: 4rem; - } - } -`; diff --git a/src/views/partials/landing-partial-view.ts b/src/views/partials/landing-partial-view.ts deleted file mode 100644 index 7a1b87b..0000000 --- a/src/views/partials/landing-partial-view.ts +++ /dev/null @@ -1,91 +0,0 @@ -import { html, LitElement, type TemplateResult } from 'lit'; -import { customElement } from 'lit/decorators.js'; -import '../../components/three-js/globe-viewer/globe-viewer'; -import { landingPartialViewStyles } from './landing-partial-view-styles'; -import person1 from '../../assets/img/person-1.png'; -import person2 from '../../assets/img/person-2.png'; -import person3 from '../../assets/img/person-3.png'; -import person4 from '../../assets/img/person-4.png'; - -@customElement('landing-partial-view') -export class LandingPartialView extends LitElement { - static styles = landingPartialViewStyles; - - private _personImages = [ - { alt: 'person-1', path: person1, id: '1' }, - { alt: 'person-2', path: person2, id: '2' }, - { alt: 'person-3', path: person3, id: '3' }, - { alt: 'person-4', path: person4, id: '4' }, - ]; - - threeGlobeViewerTemplate(): TemplateResult<1> { - return html` `; - } - - heroSectionTemplate(): TemplateResult<1> { - return html`
-
-

Building a Better World Through Code

-

- Uniting developers to build a future driven by purpose, innovation, - and good faith. Bridging imagination with action to shape a better - tomorrow through technology. -

- -
-
`; - } - - callToActionSectionTemplate(): TemplateResult<1> { - return html`
-
-
- ${this._personImages.map( - (personImg) => - html`${personImg.alt}` - )} -
-
-

Join Today

-

- Join a global, tech-driven community of developers, united in - creating solutions that serve the greater good of humanity. -

-
- -
-
`; - } - - render(): TemplateResult<1> { - return html` -
- ${this.threeGlobeViewerTemplate()} ${this.heroSectionTemplate()} - ${this.callToActionSectionTemplate()} -
- `; - } -} - -declare global { - interface HTMLElementTagNameMap { - 'landing-partial-view': LandingPartialView; - } -} diff --git a/vite.config.js b/vite.config.js index 6f0766f..fa154f7 100644 --- a/vite.config.js +++ b/vite.config.js @@ -1,6 +1,8 @@ +/* eslint-disable @typescript-eslint/explicit-function-return-type */ import { defineConfig } from 'vite'; import eslint from 'vite-plugin-eslint'; import legacy from '@vitejs/plugin-legacy'; +import { UUIDv4 } from './src/utils/helperFunctions'; export default defineConfig({ plugins: [ @@ -8,6 +10,27 @@ export default defineConfig({ legacy({ targets: ['defaults', 'not IE 11'], }), + { + name: 'csp', + transformIndexHtml(html) { + const NONCE = UUIDv4(); + const csp = `object-src 'none'; media-src 'none'; base-uri 'none'; script-src 'self' 'nonce-${NONCE}'; style-src 'self' 'nonce-${NONCE}'; style-src-attr 'nonce-${NONCE}'; img-src 'self' 'nonce-${NONCE}';`; + html = html.replace(/