diff --git a/.gitignore b/.gitignore index 7f30cbf2..1753fa3d 100644 --- a/.gitignore +++ b/.gitignore @@ -44,7 +44,8 @@ yarn-error.log* # serverless .serverless -.serverless_nextjs -# Sentry Config File -.env.sentry-build-plugin -Notes.md +.serverless_nextjs +# Sentry Config File +.env.sentry-build-plugin +Notes.md +/src/styles/vendor diff --git a/next-env.d.ts b/next-env.d.ts index cb4c1e39..3a636e00 100644 --- a/next-env.d.ts +++ b/next-env.d.ts @@ -1,6 +1,6 @@ /// /// -import "./.next/dev/types/routes.d.ts"; +import "./.next/types/routes.d.ts"; // NOTE: This file should not be edited // see https://nextjs.org/docs/app/api-reference/config/typescript for more information. diff --git a/next.config.mjs b/next.config.mjs index 8ba162b9..a1eb859f 100644 --- a/next.config.mjs +++ b/next.config.mjs @@ -151,7 +151,10 @@ const nextConfig = { // Transpile packages transpilePackages: [ - "mui-tel-input" + "mui-tel-input", + "@churchapps/apphelper-website", + "@churchapps/apphelper-markdown", + "@churchapps/apphelper-donations" ], // Compiler optimizations diff --git a/package-lock.json b/package-lock.json index 6775eae7..0fc58007 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,14 +9,14 @@ "version": "0.1.0", "hasInstallScript": true, "dependencies": { - "@churchapps/apphelper": "0.6.19", - "@churchapps/apphelper-donations": "^0.6.17", - "@churchapps/apphelper-forms": "^0.6.14", - "@churchapps/apphelper-login": "^0.6.18", - "@churchapps/apphelper-markdown": "^0.6.15", - "@churchapps/apphelper-website": "^0.6.17", - "@churchapps/content-providers": "^0.1.6", - "@churchapps/helpers": "1.2.30", + "@churchapps/apphelper": "0.6.20", + "@churchapps/apphelper-donations": "0.6.18", + "@churchapps/apphelper-forms": "0.6.15", + "@churchapps/apphelper-login": "0.6.19", + "@churchapps/apphelper-markdown": "0.6.18", + "@churchapps/apphelper-website": "0.6.19", + "@churchapps/content-providers": "0.1.8", + "@churchapps/helpers": "1.2.31", "@emotion/react": "^11.14.0", "@emotion/styled": "^11.14.1", "@mui/icons-material": "^7.3.6", @@ -45,6 +45,7 @@ "react-dnd-html5-backend": "^16.0.1", "react-dom": "^19.2.1", "react-ga4": "^2.1.0", + "react-google-recaptcha": "^3.1.0", "react-image-file-resizer": "^0.4.8", "react-router-dom": "^7.6.3", "react-youtube": "^10.1.0", @@ -349,12 +350,11 @@ } }, "node_modules/@churchapps/apphelper": { - "version": "0.6.19", - "resolved": "https://registry.npmjs.org/@churchapps/apphelper/-/apphelper-0.6.19.tgz", - "integrity": "sha512-0fOtvzI7+Ei3f5lQEOhibqg2jGcr6VHQreuPyoaWlsMTxitoJplHMxnzAqjaOnYHIfuw0rhFiHGpYxh6FjtORQ==", + "version": "0.6.20", + "resolved": "https://registry.npmjs.org/@churchapps/apphelper/-/apphelper-0.6.20.tgz", + "integrity": "sha512-o1vAxzaL/jD3JYuZqhLH395WYrzD5dMLioQ9303+45NG5Ex8okxgOy701LJ4CsrutG11aOOMlSuOlpv2C2yRYQ==", "license": "MIT", "dependencies": { - "@churchapps/helpers": "^1.2.19", "@emotion/cache": "^11.14.0", "@emotion/react": "^11.14.0", "@emotion/styled": "^11.14.1", @@ -399,60 +399,65 @@ } }, "node_modules/@churchapps/apphelper-donations": { - "version": "0.6.17", - "resolved": "https://registry.npmjs.org/@churchapps/apphelper-donations/-/apphelper-donations-0.6.17.tgz", - "integrity": "sha512-ZbE0IUY3Okspf12KSrG5nQXaMQ/8iEKLcTK2sChkN7J/R7IxbbxSsRjdg1JZRiBmhhbCaIbmaRLS5dnHsbGkVw==", + "version": "0.6.18", + "resolved": "https://registry.npmjs.org/@churchapps/apphelper-donations/-/apphelper-donations-0.6.18.tgz", + "integrity": "sha512-9J4t2JuCj31C4+DUrmUV6iMg8jMPnp96gTpWMjEE90dvsEDHyYHDEdIqTse5qBEZMA1N4Lc9k6LdcLnIRCH/0g==", "license": "MIT", "dependencies": { - "@emotion/react": "^11.14.0", - "@emotion/styled": "^11.14.1", "@stripe/react-stripe-js": "^3.9.0", "@stripe/stripe-js": "^7.8.0", - "@types/react-google-recaptcha": "^2.1.9", - "axios": "^1.11.0", - "date-fns": "^4.1.0", - "i18next": "^25.3.2", - "jwt-decode": "^4.0.0", - "react-cookie": "^8.0.1", - "react-google-recaptcha": "^3.1.0", - "react-i18next": "^15.6.1", "rrule": "^2.8.1" }, "peerDependencies": { "@churchapps/apphelper": "^0.6.0", - "@churchapps/helpers": "^1.2.4", + "@churchapps/helpers": "file:../helpers", + "@emotion/react": "^11.14.0", + "@emotion/styled": "^11.14.1", + "@mui/icons-material": "^7.3.4", "@mui/material": "^7.3.1", + "axios": "^1.11.0", + "date-fns": "^4.1.0", + "i18next": "^25.3.2", + "jwt-decode": "^4.0.0", "react": "^18.0.0 || ^19.0.0", + "react-cookie": "^8.0.1", "react-dom": "^18.0.0 || ^19.0.0", + "react-google-recaptcha": "^3.1.0", + "react-i18next": "^15.6.1", "react-router-dom": "^7.6.3" + }, + "peerDependenciesMeta": { + "react-google-recaptcha": { + "optional": true + } } }, "node_modules/@churchapps/apphelper-forms": { - "version": "0.6.14", - "resolved": "https://registry.npmjs.org/@churchapps/apphelper-forms/-/apphelper-forms-0.6.14.tgz", - "integrity": "sha512-WK4OxsmJCBDq6e3DhUA/a3tlYb7dFKPvozFjDCpUYn9kBiHinkaEXQWiA5hS79rOODQBOJcPbEYp5b0QXnXKDg==", + "version": "0.6.15", + "resolved": "https://registry.npmjs.org/@churchapps/apphelper-forms/-/apphelper-forms-0.6.15.tgz", + "integrity": "sha512-7hbx4dX6WkSzA9n9neVKdoSJ9lzHqyMYtXNEXeruNUAEOndx4dYauqujFGTpLAIvS+MyYOqNV06qLQp9YEebTg==", "license": "MIT", "dependencies": { - "@churchapps/apphelper-donations": "^0.6.0", + "@churchapps/apphelper-donations": "^0.6.0" + }, + "peerDependencies": { + "@churchapps/apphelper": "^0.6.0", + "@churchapps/helpers": "^1.2.19", "@emotion/react": "^11.14.0", "@emotion/styled": "^11.14.1", + "@mui/material": "^7.3.1", "axios": "^1.11.0", "date-fns": "^4.1.0", "i18next": "^25.3.2", - "react-i18next": "^15.6.1" - }, - "peerDependencies": { - "@churchapps/apphelper": "^0.6.0", - "@churchapps/helpers": "^1.2.4", - "@mui/material": "^7.3.1", "react": "^18.0.0 || ^19.0.0", - "react-dom": "^18.0.0 || ^19.0.0" + "react-dom": "^18.0.0 || ^19.0.0", + "react-i18next": "^15.6.1" } }, "node_modules/@churchapps/apphelper-login": { - "version": "0.6.18", - "resolved": "https://registry.npmjs.org/@churchapps/apphelper-login/-/apphelper-login-0.6.18.tgz", - "integrity": "sha512-Y19UbUA9is9/Z7XjpzLzqRdDa96u9/P7Ky3Ok9RPW67Xc34wEIDKlYUt289Rs97l96+Yfc+MzO74ukJy1ooVrg==", + "version": "0.6.19", + "resolved": "https://registry.npmjs.org/@churchapps/apphelper-login/-/apphelper-login-0.6.19.tgz", + "integrity": "sha512-k6eFPW5tRiz3fVt1H+RFj+QupjFPT00t/bbgJ+EBRjn4B1LVzPuTVpIOMYNdAyZcxZZK+z6IMV+DkZr32P51Zg==", "license": "MIT", "dependencies": { "@mui/icons-material": "^7.3.1", @@ -483,9 +488,9 @@ } }, "node_modules/@churchapps/apphelper-markdown": { - "version": "0.6.15", - "resolved": "https://registry.npmjs.org/@churchapps/apphelper-markdown/-/apphelper-markdown-0.6.15.tgz", - "integrity": "sha512-jf1jSOQVkZAWJG4YBJhaqxD8mZBkufCMeBxu/V2qqgjnUW7z9VMwn2MKxrHbscgapiMeZREUzu5HtaU9K4iTNw==", + "version": "0.6.18", + "resolved": "https://registry.npmjs.org/@churchapps/apphelper-markdown/-/apphelper-markdown-0.6.18.tgz", + "integrity": "sha512-YgfBrUxiAH416BoqDgiTTHMPykTFSpEKJLMRsQHuXc/mh5fCxgRfSq36hhuNxdNgzDVLwfopZXbJL66hwkecYA==", "license": "MIT", "dependencies": { "@lexical/code": "^0.33.1", @@ -504,23 +509,27 @@ }, "peerDependencies": { "@churchapps/apphelper": "^0.6.0", - "@churchapps/helpers": "^1.2.4", + "@churchapps/helpers": "^1.2.19", + "@mui/icons-material": "^7.3.4", "@mui/material": "^7.3.1", "react": "^18.0.0 || ^19.0.0", "react-dom": "^18.0.0 || ^19.0.0" } }, "node_modules/@churchapps/apphelper-website": { - "version": "0.6.17", - "resolved": "https://registry.npmjs.org/@churchapps/apphelper-website/-/apphelper-website-0.6.17.tgz", - "integrity": "sha512-f84sk7PJR+RNC/n3La+9v4QOageHHDZIrjrcsMoQNrNWC8rJmgoryj67J8hzUyNwXPS4tPuBidaNfe2LCQl1Hw==", + "version": "0.6.19", + "resolved": "https://registry.npmjs.org/@churchapps/apphelper-website/-/apphelper-website-0.6.19.tgz", + "integrity": "sha512-HIjfMZAzIeBENCTucZCOLdpxoOIw+LkwWzxgkZLGWfMowT0dBiOz62DY+q0N52FD22p4AZ3A5NBJLiklBRV5LQ==", "license": "MIT", "dependencies": { "rrule": "^2.8.1" }, "peerDependencies": { "@churchapps/apphelper": "^0.6.5", - "@churchapps/helpers": "^1.2.5", + "@churchapps/apphelper-donations": "^0.6.17", + "@churchapps/apphelper-forms": "^0.6.14", + "@churchapps/apphelper-markdown": "^0.6.18", + "@churchapps/helpers": "^1.2.19", "@mui/icons-material": "^7.3.4", "@mui/material": "^7.3.1", "@react-google-maps/api": "^2.20.0", @@ -533,15 +542,13 @@ } }, "node_modules/@churchapps/content-providers": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/@churchapps/content-providers/-/content-providers-0.1.6.tgz", - "integrity": "sha512-lZg2BUOE18V2GFqMwEtum9fvhzZmoo6gTuujvm4zShWtaq47sFVCmOkNRdELJ0B1+BSiVKsrYQyF82855Z7lYg==", + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/@churchapps/content-providers/-/content-providers-0.1.8.tgz", + "integrity": "sha512-OJpOb3yWmiDWin/WHlGNSl9HWUTRkWpZ6LtKwnZ/Vaito5/rfrrXvPpbJPeDw07tDWXjU4/fVFsil6gp2y+2PQ==", "license": "MIT" }, "node_modules/@churchapps/helpers": { - "version": "1.2.30", - "resolved": "https://registry.npmjs.org/@churchapps/helpers/-/helpers-1.2.30.tgz", - "integrity": "sha512-MmKEqEX/Zmzk64KertWvaeDkXwws7hI3a7WDIPKIeYsWpghrcZdd1XIppWOLwBWszVBOTLFBT8vSfS++sx+YlA==", + "version": "1.2.31", "license": "MIT", "dependencies": { "dayjs": "^1.11.18" @@ -1674,17 +1681,6 @@ "node": ">=6.0.0" } }, - "node_modules/@jridgewell/source-map": { - "version": "0.3.11", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.11.tgz", - "integrity": "sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==", - "license": "MIT", - "peer": true, - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25" - } - }, "node_modules/@jridgewell/sourcemap-codec": { "version": "1.5.5", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", @@ -2951,7 +2947,7 @@ "version": "1.58.1", "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.58.1.tgz", "integrity": "sha512-6LdVIUERWxQMmUSSQi0I53GgCBYgM2RpGngCPY7hSeju+VrKjq3lvs7HpJoPbDiY5QM5EYRtRX5fvrinnMAz3w==", - "devOptional": true, + "dev": true, "license": "Apache-2.0", "dependencies": { "playwright": "1.58.1" @@ -4670,28 +4666,6 @@ "dev": true, "license": "MIT" }, - "node_modules/@types/eslint": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.1.tgz", - "integrity": "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==", - "license": "MIT", - "peer": true, - "dependencies": { - "@types/estree": "*", - "@types/json-schema": "*" - } - }, - "node_modules/@types/eslint-scope": { - "version": "3.7.7", - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", - "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", - "license": "MIT", - "peer": true, - "dependencies": { - "@types/eslint": "*", - "@types/estree": "*" - } - }, "node_modules/@types/estree": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", @@ -4727,6 +4701,7 @@ "version": "7.0.15", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true, "license": "MIT" }, "node_modules/@types/json5": { @@ -4811,21 +4786,12 @@ "version": "19.2.3", "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.3.tgz", "integrity": "sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==", - "devOptional": true, + "dev": true, "license": "MIT", "peerDependencies": { "@types/react": "^19.2.0" } }, - "node_modules/@types/react-google-recaptcha": { - "version": "2.1.9", - "resolved": "https://registry.npmjs.org/@types/react-google-recaptcha/-/react-google-recaptcha-2.1.9.tgz", - "integrity": "sha512-nT31LrBDuoSZJN4QuwtQSF3O89FVHC4jLhM+NtKEmVF5R1e8OY0Jo4//x2Yapn2aNHguwgX5doAq8Zo+Ehd0ug==", - "license": "MIT", - "dependencies": { - "@types/react": "*" - } - }, "node_modules/@types/react-transition-group": { "version": "4.4.12", "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.12.tgz", @@ -5376,181 +5342,6 @@ "win32" ] }, - "node_modules/@webassemblyjs/ast": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz", - "integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==", - "license": "MIT", - "peer": true, - "dependencies": { - "@webassemblyjs/helper-numbers": "1.13.2", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2" - } - }, - "node_modules/@webassemblyjs/floating-point-hex-parser": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz", - "integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==", - "license": "MIT", - "peer": true - }, - "node_modules/@webassemblyjs/helper-api-error": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz", - "integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==", - "license": "MIT", - "peer": true - }, - "node_modules/@webassemblyjs/helper-buffer": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz", - "integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==", - "license": "MIT", - "peer": true - }, - "node_modules/@webassemblyjs/helper-numbers": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz", - "integrity": "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==", - "license": "MIT", - "peer": true, - "dependencies": { - "@webassemblyjs/floating-point-hex-parser": "1.13.2", - "@webassemblyjs/helper-api-error": "1.13.2", - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@webassemblyjs/helper-wasm-bytecode": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz", - "integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==", - "license": "MIT", - "peer": true - }, - "node_modules/@webassemblyjs/helper-wasm-section": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz", - "integrity": "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==", - "license": "MIT", - "peer": true, - "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-buffer": "1.14.1", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2", - "@webassemblyjs/wasm-gen": "1.14.1" - } - }, - "node_modules/@webassemblyjs/ieee754": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz", - "integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==", - "license": "MIT", - "peer": true, - "dependencies": { - "@xtuc/ieee754": "^1.2.0" - } - }, - "node_modules/@webassemblyjs/leb128": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.13.2.tgz", - "integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==", - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@webassemblyjs/utf8": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz", - "integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==", - "license": "MIT", - "peer": true - }, - "node_modules/@webassemblyjs/wasm-edit": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz", - "integrity": "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==", - "license": "MIT", - "peer": true, - "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-buffer": "1.14.1", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2", - "@webassemblyjs/helper-wasm-section": "1.14.1", - "@webassemblyjs/wasm-gen": "1.14.1", - "@webassemblyjs/wasm-opt": "1.14.1", - "@webassemblyjs/wasm-parser": "1.14.1", - "@webassemblyjs/wast-printer": "1.14.1" - } - }, - "node_modules/@webassemblyjs/wasm-gen": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz", - "integrity": "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==", - "license": "MIT", - "peer": true, - "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2", - "@webassemblyjs/ieee754": "1.13.2", - "@webassemblyjs/leb128": "1.13.2", - "@webassemblyjs/utf8": "1.13.2" - } - }, - "node_modules/@webassemblyjs/wasm-opt": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz", - "integrity": "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==", - "license": "MIT", - "peer": true, - "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-buffer": "1.14.1", - "@webassemblyjs/wasm-gen": "1.14.1", - "@webassemblyjs/wasm-parser": "1.14.1" - } - }, - "node_modules/@webassemblyjs/wasm-parser": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz", - "integrity": "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==", - "license": "MIT", - "peer": true, - "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-api-error": "1.13.2", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2", - "@webassemblyjs/ieee754": "1.13.2", - "@webassemblyjs/leb128": "1.13.2", - "@webassemblyjs/utf8": "1.13.2" - } - }, - "node_modules/@webassemblyjs/wast-printer": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz", - "integrity": "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==", - "license": "MIT", - "peer": true, - "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@xtuc/ieee754": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", - "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", - "license": "BSD-3-Clause", - "peer": true - }, - "node_modules/@xtuc/long": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", - "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", - "license": "Apache-2.0", - "peer": true - }, "node_modules/@youversion/platform-core": { "version": "0.5.8", "resolved": "https://registry.npmjs.org/@youversion/platform-core/-/platform-core-0.5.8.tgz", @@ -5598,9 +5389,9 @@ } }, "node_modules/acorn": { - "version": "8.15.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", - "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", + "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", "license": "MIT", "bin": { "acorn": "bin/acorn" @@ -5618,19 +5409,6 @@ "acorn": "^8" } }, - "node_modules/acorn-import-phases": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/acorn-import-phases/-/acorn-import-phases-1.0.4.tgz", - "integrity": "sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ==", - "license": "MIT", - "peer": true, - "engines": { - "node": ">=10.13.0" - }, - "peerDependencies": { - "acorn": "^8.14.0" - } - }, "node_modules/acorn-jsx": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", @@ -5670,48 +5448,6 @@ "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/ajv-formats": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", - "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", - "license": "MIT", - "peer": true, - "dependencies": { - "ajv": "^8.0.0" - }, - "peerDependencies": { - "ajv": "^8.0.0" - }, - "peerDependenciesMeta": { - "ajv": { - "optional": true - } - } - }, - "node_modules/ajv-formats/node_modules/ajv": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", - "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", - "license": "MIT", - "peer": true, - "dependencies": { - "fast-deep-equal": "^3.1.3", - "fast-uri": "^3.0.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ajv-formats/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "license": "MIT", - "peer": true - }, "node_modules/ansi-regex": { "version": "6.2.2", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", @@ -6119,13 +5855,6 @@ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" } }, - "node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "license": "MIT", - "peer": true - }, "node_modules/call-bind": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", @@ -6257,16 +5986,6 @@ "node": ">= 6" } }, - "node_modules/chrome-trace-event": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz", - "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==", - "license": "MIT", - "peer": true, - "engines": { - "node": ">=6.0" - } - }, "node_modules/cjs-module-lexer": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-2.2.0.tgz", @@ -6411,13 +6130,6 @@ "node": ">= 0.8" } }, - "node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "license": "MIT", - "peer": true - }, "node_modules/commondir": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", @@ -6870,20 +6582,6 @@ "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", "license": "MIT" }, - "node_modules/enhanced-resolve": { - "version": "5.19.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.19.0.tgz", - "integrity": "sha512-phv3E1Xl4tQOShqSte26C7Fl84EwUdZsyOuSSk9qtAGyyQs2s3jJzComh+Abf4g187lUUAvH+H26omrqia2aGg==", - "license": "MIT", - "peer": true, - "dependencies": { - "graceful-fs": "^4.2.4", - "tapable": "^2.3.0" - }, - "engines": { - "node": ">=10.13.0" - } - }, "node_modules/entities": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", @@ -7020,13 +6718,6 @@ "node": ">= 0.4" } }, - "node_modules/es-module-lexer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.0.0.tgz", - "integrity": "sha512-5POEcUuZybH7IdmGsD8wlf0AI55wMecM9rVBTI/qEAy2c1kTOm3DjFYjrBdI2K3BaJjJYfYFeRtM0t9ssnRuxw==", - "license": "MIT", - "peer": true - }, "node_modules/es-object-atoms": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", @@ -7594,6 +7285,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, "license": "BSD-2-Clause", "dependencies": { "estraverse": "^5.2.0" @@ -7606,6 +7298,7 @@ "version": "5.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, "license": "BSD-2-Clause", "engines": { "node": ">=4.0" @@ -7627,16 +7320,6 @@ "node": ">=0.10.0" } }, - "node_modules/events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", - "license": "MIT", - "peer": true, - "engines": { - "node": ">=0.8.x" - } - }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -7687,23 +7370,6 @@ "dev": true, "license": "MIT" }, - "node_modules/fast-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.0.tgz", - "integrity": "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fastify" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/fastify" - } - ], - "license": "BSD-3-Clause", - "peer": true - }, "node_modules/fastq": { "version": "1.20.1", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz", @@ -8106,13 +7772,6 @@ "node": ">=10.13.0" } }, - "node_modules/glob-to-regexp": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", - "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", - "license": "BSD-2-Clause", - "peer": true - }, "node_modules/globalize": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/globalize/-/globalize-0.1.1.tgz", @@ -8160,13 +7819,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "license": "ISC", - "peer": true - }, "node_modules/has-bigints": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz", @@ -8184,6 +7836,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -8962,17 +8615,6 @@ "node": ">=18" } }, - "node_modules/isomorphic.js": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/isomorphic.js/-/isomorphic.js-0.2.5.tgz", - "integrity": "sha512-PIeMbHqMt4DnUP3MA/Flc0HElYjMXArsw1qwJZcm9sqR8mq3l8NYizFMty0pWwE/tzIGH3EKK5+jes5mAr85yw==", - "license": "MIT", - "peer": true, - "funding": { - "type": "GitHub Sponsors ❤", - "url": "https://github.com/sponsors/dmonad" - } - }, "node_modules/iterator.prototype": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.5.tgz", @@ -9006,37 +8648,6 @@ "@pkgjs/parseargs": "^0.11.0" } }, - "node_modules/jest-worker": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", - "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", - "license": "MIT", - "peer": true, - "dependencies": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "engines": { - "node": ">= 10.13.0" - } - }, - "node_modules/jest-worker/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "license": "MIT", - "peer": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, "node_modules/js-cookie": { "version": "3.0.5", "resolved": "https://registry.npmjs.org/js-cookie/-/js-cookie-3.0.5.tgz", @@ -9258,28 +8869,6 @@ "integrity": "sha512-+kiCS/GshQmCs/meMb8MQT4AMvw3S3Ef0lSCv2Xi6Itvs59OD+NjQWNfYkDteIbKtVE/w0Yiqh56VyGwIb8UcA==", "license": "MIT" }, - "node_modules/lib0": { - "version": "0.2.117", - "resolved": "https://registry.npmjs.org/lib0/-/lib0-0.2.117.tgz", - "integrity": "sha512-DeXj9X5xDCjgKLU/7RR+/HQEVzuuEUiwldwOGsHK/sfAfELGWEyTcf0x+uOvCvK3O2zPmZePXWL85vtia6GyZw==", - "license": "MIT", - "peer": true, - "dependencies": { - "isomorphic.js": "^0.2.4" - }, - "bin": { - "0ecdsa-generate-keypair": "bin/0ecdsa-generate-keypair.js", - "0gentesthtml": "bin/gentesthtml.js", - "0serve": "bin/0serve.js" - }, - "engines": { - "node": ">=16" - }, - "funding": { - "type": "GitHub Sponsors ❤", - "url": "https://github.com/sponsors/dmonad" - } - }, "node_modules/libphonenumber-js": { "version": "1.12.36", "resolved": "https://registry.npmjs.org/libphonenumber-js/-/libphonenumber-js-1.12.36.tgz", @@ -9298,20 +8887,6 @@ "integrity": "sha512-kPEjMFtZvwL9TaZo0uZ2ml+Ye9HUMmPwbYRJ324qF9tqMejwykJ5ggTyvzmrbBeapCAbk98BSbTeovHEEP1uCA==", "license": "MIT" }, - "node_modules/loader-runner": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.1.tgz", - "integrity": "sha512-IWqP2SCPhyVFTBtRcgMHdzlf9ul25NwaFx4wCEH/KjAXuuHY4yNjvPXsBokp8jCB936PyWRaPKUNh8NvylLp2Q==", - "license": "MIT", - "peer": true, - "engines": { - "node": ">=6.11.5" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, "node_modules/locate-path": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", @@ -9452,13 +9027,6 @@ "integrity": "sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==", "license": "MIT" }, - "node_modules/merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "license": "MIT", - "peer": true - }, "node_modules/merge2": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", @@ -9676,13 +9244,6 @@ "dev": true, "license": "MIT" }, - "node_modules/neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", - "license": "MIT", - "peer": true - }, "node_modules/next": { "version": "16.1.6", "resolved": "https://registry.npmjs.org/next/-/next-16.1.6.tgz", @@ -10174,7 +9735,7 @@ "version": "1.58.1", "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.58.1.tgz", "integrity": "sha512-+2uTZHxSCcxjvGc5C891LrS1/NlxglGxzrC4seZiVjcYVQfUa87wBL6rTDqzGjuoWNjnBzRqKmF6zRYGMvQUaQ==", - "devOptional": true, + "dev": true, "license": "Apache-2.0", "dependencies": { "playwright-core": "1.58.1" @@ -10193,7 +9754,7 @@ "version": "1.58.1", "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.58.1.tgz", "integrity": "sha512-bcWzOaTxcW+VOOGBCQgnaKToLJ65d6AqfLVKEWvexyS3AS6rbXl+xdpYRMGSRBClPvyj44njOWoxjNdL/H9UNg==", - "devOptional": true, + "dev": true, "license": "Apache-2.0", "bin": { "playwright-core": "cli.js" @@ -10361,16 +9922,6 @@ ], "license": "MIT" }, - "node_modules/randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "license": "MIT", - "peer": true, - "dependencies": { - "safe-buffer": "^5.1.0" - } - }, "node_modules/react": { "version": "19.2.4", "resolved": "https://registry.npmjs.org/react/-/react-19.2.4.tgz", @@ -10903,16 +10454,6 @@ "node": ">=0.10.0" } }, - "node_modules/require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "license": "MIT", - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/require-in-the-middle": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/require-in-the-middle/-/require-in-the-middle-8.0.1.tgz", @@ -11086,27 +10627,6 @@ "dev": true, "license": "MIT" }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "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", - "peer": true - }, "node_modules/safe-push-apply": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz", @@ -11173,63 +10693,6 @@ "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==", "license": "MIT" }, - "node_modules/schema-utils": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.3.tgz", - "integrity": "sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==", - "license": "MIT", - "peer": true, - "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.9.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.1.0" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/schema-utils/node_modules/ajv": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", - "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", - "license": "MIT", - "peer": true, - "dependencies": { - "fast-deep-equal": "^3.1.3", - "fast-uri": "^3.0.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/schema-utils/node_modules/ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "license": "MIT", - "peer": true, - "dependencies": { - "fast-deep-equal": "^3.1.3" - }, - "peerDependencies": { - "ajv": "^8.8.2" - } - }, - "node_modules/schema-utils/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "license": "MIT", - "peer": true - }, "node_modules/semver": { "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", @@ -11239,16 +10702,6 @@ "semver": "bin/semver.js" } }, - "node_modules/serialize-javascript": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", - "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", - "license": "BSD-3-Clause", - "peer": true, - "dependencies": { - "randombytes": "^2.1.0" - } - }, "node_modules/set-cookie-parser": { "version": "2.7.2", "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.2.tgz", @@ -11504,27 +10957,6 @@ "node": ">=0.10.0" } }, - "node_modules/source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "license": "MIT", - "peer": true, - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/source-map-support/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "license": "BSD-3-Clause", - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/stable-hash": { "version": "0.0.5", "resolved": "https://registry.npmjs.org/stable-hash/-/stable-hash-0.0.5.tgz", @@ -11882,74 +11314,6 @@ "url": "https://github.com/sponsors/dcastil" } }, - "node_modules/tapable": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.0.tgz", - "integrity": "sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==", - "license": "MIT", - "peer": true, - "engines": { - "node": ">=6" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/terser": { - "version": "5.46.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.46.0.tgz", - "integrity": "sha512-jTwoImyr/QbOWFFso3YoU3ik0jBBDJ6JTOQiy/J2YxVJdZCc+5u7skhNwiOR3FQIygFqVUPHl7qbbxtjW2K3Qg==", - "license": "BSD-2-Clause", - "peer": true, - "dependencies": { - "@jridgewell/source-map": "^0.3.3", - "acorn": "^8.15.0", - "commander": "^2.20.0", - "source-map-support": "~0.5.20" - }, - "bin": { - "terser": "bin/terser" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/terser-webpack-plugin": { - "version": "5.3.16", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.16.tgz", - "integrity": "sha512-h9oBFCWrq78NyWWVcSwZarJkZ01c2AyGrzs1crmHZO3QUg9D61Wu4NPjBy69n7JqylFF5y+CsUZYmYEIZ3mR+Q==", - "license": "MIT", - "peer": true, - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.25", - "jest-worker": "^27.4.5", - "schema-utils": "^4.3.0", - "serialize-javascript": "^6.0.2", - "terser": "^5.31.1" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.1.0" - }, - "peerDependenciesMeta": { - "@swc/core": { - "optional": true - }, - "esbuild": { - "optional": true - }, - "uglify-js": { - "optional": true - } - } - }, "node_modules/through2": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", @@ -12230,7 +11594,7 @@ "version": "5.9.3", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", - "devOptional": true, + "dev": true, "license": "Apache-2.0", "bin": { "tsc": "bin/tsc", @@ -12479,20 +11843,6 @@ "loose-envify": "^1.0.0" } }, - "node_modules/watchpack": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.5.1.tgz", - "integrity": "sha512-Zn5uXdcFNIA1+1Ei5McRd+iRzfhENPCe7LeABkJtNulSxjma+l7ltNx55BWZkRlwRnpOgHqxnjyaDgJnNXnqzg==", - "license": "MIT", - "peer": true, - "dependencies": { - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.1.2" - }, - "engines": { - "node": ">=10.13.0" - } - }, "node_modules/webfontloader": { "version": "1.6.28", "resolved": "https://registry.npmjs.org/webfontloader/-/webfontloader-1.6.28.tgz", @@ -12508,59 +11858,10 @@ "node": ">=12" } }, - "node_modules/webpack": { - "version": "5.105.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.105.0.tgz", - "integrity": "sha512-gX/dMkRQc7QOMzgTe6KsYFM7DxeIONQSui1s0n/0xht36HvrgbxtM1xBlgx596NbpHuQU8P7QpKwrZYwUX48nw==", - "license": "MIT", - "peer": true, - "dependencies": { - "@types/eslint-scope": "^3.7.7", - "@types/estree": "^1.0.8", - "@types/json-schema": "^7.0.15", - "@webassemblyjs/ast": "^1.14.1", - "@webassemblyjs/wasm-edit": "^1.14.1", - "@webassemblyjs/wasm-parser": "^1.14.1", - "acorn": "^8.15.0", - "acorn-import-phases": "^1.0.3", - "browserslist": "^4.28.1", - "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.19.0", - "es-module-lexer": "^2.0.0", - "eslint-scope": "5.1.1", - "events": "^3.2.0", - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.2.11", - "json-parse-even-better-errors": "^2.3.1", - "loader-runner": "^4.3.1", - "mime-types": "^2.1.27", - "neo-async": "^2.6.2", - "schema-utils": "^4.3.3", - "tapable": "^2.3.0", - "terser-webpack-plugin": "^5.3.16", - "watchpack": "^2.5.1", - "webpack-sources": "^3.3.3" - }, - "bin": { - "webpack": "bin/webpack.js" - }, - "engines": { - "node": ">=10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependenciesMeta": { - "webpack-cli": { - "optional": true - } - } - }, "node_modules/webpack-sources": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.3.3.tgz", - "integrity": "sha512-yd1RBzSGanHkitROoPFd6qsrxt+oFhg/129YzheDGqeustzX0vTZJZsSsQjVQC4yzBQ56K55XU8gaNCtIzOnTg==", + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.3.4.tgz", + "integrity": "sha512-7tP1PdV4vF+lYPnkMR0jMY5/la2ub5Fc/8VQrrU+lXkiM6C4TjVfGw7iKfyhnTQOsD+6Q/iKw0eFciziRgD58Q==", "license": "MIT", "engines": { "node": ">=10.13.0" @@ -12572,30 +11873,6 @@ "integrity": "sha512-kyDivFZ7ZM0BVOUteVbDFhlRt7Ah/CSPwJdi8hBpkK7QLumUqdLtVfm/PX/hkcnrvr0i77fO5+TjZ94Pe+C9iw==", "license": "MIT" }, - "node_modules/webpack/node_modules/eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "license": "BSD-2-Clause", - "peer": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/webpack/node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "license": "BSD-2-Clause", - "peer": true, - "engines": { - "node": ">=4.0" - } - }, "node_modules/whatwg-encoding": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz", @@ -12991,24 +12268,6 @@ "node": ">=8" } }, - "node_modules/yjs": { - "version": "13.6.29", - "resolved": "https://registry.npmjs.org/yjs/-/yjs-13.6.29.tgz", - "integrity": "sha512-kHqDPdltoXH+X4w1lVmMtddE3Oeqq48nM40FD5ojTd8xYhQpzIDcfE2keMSU5bAgRPJBe225WTUdyUgj1DtbiQ==", - "license": "MIT", - "peer": true, - "dependencies": { - "lib0": "^0.2.99" - }, - "engines": { - "node": ">=16.0.0", - "npm": ">=8.0.0" - }, - "funding": { - "type": "GitHub Sponsors ❤", - "url": "https://github.com/sponsors/dmonad" - } - }, "node_modules/yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", diff --git a/package.json b/package.json index 7114167d..43334b3d 100644 --- a/package.json +++ b/package.json @@ -17,17 +17,17 @@ "test": "playwright test", "test:headed": "playwright test --headed", "test:ui": "playwright test --ui", - "postinstall": "copyfiles -a -f node_modules/@churchapps/apphelper/public/locales/** public/apphelper/locales && copyfiles -a -f node_modules/@churchapps/apphelper-markdown/dist/editor.css public/apphelper/css && copyfiles -a -f node_modules/react-cropper/node_modules/cropperjs/dist/cropper.css public/css" + "postinstall": "copyfiles -a -f node_modules/@churchapps/apphelper/public/locales/** public/apphelper/locales && copyfiles -a -f node_modules/@churchapps/apphelper-markdown/dist/editor.css public/apphelper/css && copyfiles -a -f node_modules/react-cropper/node_modules/cropperjs/dist/cropper.css public/css && copyfiles -a -f node_modules/@churchapps/apphelper-website/dist/styles/animations.css node_modules/@churchapps/apphelper-website/dist/styles/pages.css src/styles/vendor && copyfiles -a -f node_modules/@churchapps/apphelper-markdown/dist/components/markdownEditor/editor.css public/apphelper/css/markdown && copyfiles -a -u 7 \"node_modules/@churchapps/apphelper-markdown/dist/components/markdownEditor/images/**/*\" public/apphelper/css/markdown/images" }, "dependencies": { - "@churchapps/apphelper": "0.6.19", - "@churchapps/apphelper-donations": "^0.6.17", - "@churchapps/apphelper-forms": "^0.6.14", - "@churchapps/apphelper-login": "^0.6.18", - "@churchapps/apphelper-markdown": "^0.6.15", - "@churchapps/apphelper-website": "^0.6.17", - "@churchapps/content-providers": "^0.1.6", - "@churchapps/helpers": "1.2.30", + "@churchapps/apphelper": "0.6.20", + "@churchapps/apphelper-donations": "0.6.18", + "@churchapps/apphelper-forms": "0.6.15", + "@churchapps/apphelper-login": "0.6.19", + "@churchapps/apphelper-markdown": "0.6.18", + "@churchapps/apphelper-website": "0.6.19", + "@churchapps/content-providers": "0.1.8", + "@churchapps/helpers": "1.2.31", "@emotion/react": "^11.14.0", "@emotion/styled": "^11.14.1", "@mui/icons-material": "^7.3.6", @@ -58,6 +58,7 @@ "react-ga4": "^2.1.0", "react-image-file-resizer": "^0.4.8", "react-router-dom": "^7.6.3", + "react-google-recaptcha": "^3.1.0", "react-youtube": "^10.1.0", "rrule": "^2.8.1", "webfontloader": "^1.6.28" diff --git a/playwright.config.ts b/playwright.config.ts index fb690322..63da97f1 100644 --- a/playwright.config.ts +++ b/playwright.config.ts @@ -14,7 +14,7 @@ export default defineConfig({ }, use: { - baseURL: 'https://grace.demo.b1.church', + baseURL: process.env.BASE_URL || 'https://grace.demo.b1.church', trace: 'retain-on-failure', screenshot: 'only-on-failure', video: 'off', diff --git a/public/apphelper/css/markdown/editor.css b/public/apphelper/css/markdown/editor.css new file mode 100644 index 00000000..596f1252 --- /dev/null +++ b/public/apphelper/css/markdown/editor.css @@ -0,0 +1,787 @@ +.other h2 { + font-size: 18px; + color: #444; + margin-bottom: 7px; +} + +.other a { + color: #777; + text-decoration: underline; + font-size: 14px; +} + +.other ul { + padding: 0; + margin: 0; + list-style-type: none; +} + +/* +.editor-list-ol li { + list-style-type: decimal !important; +} + +.editor-list-ul li { + list-style-type: disc !important; +} +*/ + +.text-left { + text-align: left; +} + +.text-right { + text-align: right; +} + +.text-center { + text-align: center; +} + +.editor-container { + /*margin: 20px auto 20px auto;*/ + border-radius: 2px; + /*color: #000;*/ + position: relative; + /*line-height: 20px;*/ + /*font-weight: 400;*/ + border-radius: 5px; +} + +.editor-inner { + position: relative; +} + +.editor-input { + min-height: 150px; + resize: none; + font-size: 15px; + caret-color: rgb(5, 5, 5); + position: relative; + tab-size: 1; + outline: 0; + padding: 15px 10px; + caret-color: #444; +} + +.editor-container.preview .editor-input { + padding: 0px 0px; +} + +.editor-placeholder { + color: #999; + overflow: hidden; + position: absolute; + text-overflow: ellipsis; + top: 15px; + left: 10px; + font-size: 15px; + user-select: none; + display: inline-block; + pointer-events: none; +} + +.editor-text-bold { + font-weight: bold; +} + +.editor-text-italic { + font-style: italic; +} + +.editor-text-underline { + text-decoration: underline; +} + +.editor-text-strikethrough { + text-decoration: line-through; +} + +.editor-text-underlineStrikethrough { + text-decoration: underline line-through; +} + +.editor-text-code { + background-color: rgb(240, 242, 245); + padding: 1px 0.25rem; + font-family: Menlo, Consolas, Monaco, monospace; + font-size: 94%; +} + +.editor-link { + color: rgb(33, 111, 219); + text-decoration: none; +} + +.tree-view-output { + display: block; + background: #222; + color: #fff; + padding: 5px; + font-size: 12px; + white-space: pre-wrap; + margin: 1px auto 10px auto; + max-height: 250px; + position: relative; + border-bottom-left-radius: 10px; + border-bottom-right-radius: 10px; + overflow: auto; + line-height: 14px; +} + +.editor-code { + background-color: rgb(240, 242, 245); + font-family: Menlo, Consolas, Monaco, monospace; + display: block; + padding: 8px 8px 8px 52px; + line-height: 1.53; + font-size: 13px; + margin: 0; + margin-top: 8px; + margin-bottom: 8px; + tab-size: 2; + /* white-space: pre; */ + overflow-x: auto; + position: relative; +} + +.editor-code:before { + content: attr(data-gutter); + position: absolute; + background-color: #eee; + left: 0; + top: 0; + border-right: 1px solid #ccc; + padding: 8px; + color: #777; + white-space: pre-wrap; + text-align: right; + min-width: 25px; +} + +.editor-code:after { + content: attr(data-highlight-language); + top: 0; + right: 3px; + padding: 3px; + font-size: 10px; + text-transform: uppercase; + position: absolute; + color: rgba(0, 0, 0, 0.5); +} + +.editor-tokenComment { + color: slategray; +} + +.editor-tokenPunctuation { + color: #999; +} + +.editor-tokenProperty { + color: #905; +} + +.editor-tokenSelector { + color: #690; +} + +.editor-tokenOperator { + color: #9a6e3a; +} + +.editor-tokenAttr { + color: #07a; +} + +.editor-tokenVariable { + color: #e90; +} + +.editor-tokenFunction { + color: #dd4a68; +} + +.editor-paragraph { + margin: 0; + margin-bottom: 8px; + position: relative; + /* + display: flex; + align-items: flex-end; + */ +} + +.editor-paragraph:last-child { + margin-bottom: 0; +} +.editor-heading-h1 { + line-height: 30px; +} +/* +.editor-heading-h1 { + font-size: 24px; + font-weight: 400; + margin: 0; + margin-bottom: 12px; + padding: 0; + line-height: 24px; +} + +.editor-heading-h2 { + font-size: 15px; + font-weight: 700; + margin: 0; + margin-top: 10px; + padding: 0; +} +*/ +.editor-quote { + margin: 0; + margin-left: 20px; + font-size: 15px; + color: rgb(101, 103, 107); + border-left-color: rgb(206, 208, 212); + border-left-width: 4px; + border-left-style: solid; + padding-left: 16px; +} + +/* +.editor-list-ol { + padding: 0; + margin: 0; + margin-left: 16px; +} + +.editor-list-ul { + padding: 0; + margin: 0; + margin-left: 16px; +} + +.editor-listitem { + margin: 8px 32px 8px 32px; +} +*/ +.editor-nested-listitem { + list-style-type: none; +} + + +.debug-timetravel-panel { + overflow: hidden; + padding: 0 0 10px 0; + margin: auto; + display: flex; +} + +.debug-timetravel-panel-slider { + padding: 0; + flex: 8; +} + +.debug-timetravel-panel-button { + padding: 0; + border: 0; + background: none; + flex: 1; + color: #fff; + font-size: 12px; +} + +.debug-timetravel-panel-button:hover { + text-decoration: underline; +} + +.debug-timetravel-button { + border: 0; + padding: 0; + font-size: 12px; + top: 10px; + right: 15px; + position: absolute; + background: none; + color: #fff; +} + +.debug-timetravel-button:hover { + text-decoration: underline; +} + +.emoji { + color: transparent; + background-size: 16px 16px; + background-position: center; + background-repeat: no-repeat; + vertical-align: middle; + margin: 0 -1px; +} + +.emoji-inner { + padding: 0 0.15em; +} + +.emoji-inner::selection { + color: transparent; + background-color: rgba(150, 150, 150, 0.4); +} + +.emoji-inner::-moz-selection { + color: transparent; + background-color: rgba(150, 150, 150, 0.4); +} + +.emoji.happysmile { + background-image: url(./images/emoji/1F642.png); +} + +.toolbar { + display: flex; + position:sticky; + top: 0; + background-color: white; + z-index: 1; + margin-bottom: 1px; + padding: 4px; + border-top-left-radius: 10px; + border-top-right-radius: 10px; + vertical-align: middle; + border-bottom: 1px solid lightgray; +} + +.toolbar button.toolbar-item { + border: 0; + display: flex; + background: none; + border-radius: 10px; + padding: 8px; + cursor: pointer; + vertical-align: middle; +} + +.toolbar button.toolbar-item:disabled { + cursor: not-allowed; +} + +.toolbar button.toolbar-item.spaced { + margin-right: 2px; +} + +.toolbar button.toolbar-item i.format { + background-size: contain; + display: inline-block; + height: 18px; + width: 18px; + margin-top: 2px; + vertical-align: -0.25em; + display: flex; + opacity: 0.6; +} + +.toolbar button.toolbar-item:disabled i.format { + opacity: 0.2; +} + +.toolbar button.toolbar-item.active { + background-color: rgba(223, 232, 250, 0.3); +} + +.toolbar button.toolbar-item.active i { + opacity: 1; +} + +.toolbar .toolbar-item:hover:not([disabled]) { + background-color: #eee; +} + +.toolbar .divider { + width: 1px; + background-color: #eee; + margin: 0 4px; +} + +.toolbar select.toolbar-item { + border: 0; + display: flex; + background: none; + border-radius: 10px; + padding: 8px; + vertical-align: middle; + -webkit-appearance: none; + -moz-appearance: none; + width: 70px; + font-size: 14px; + color: #777; + text-overflow: ellipsis; +} + +.toolbar select.code-language { + text-transform: capitalize; + width: 130px; +} + +.toolbar .toolbar-item .text { + display: flex; + line-height: 20px; + width: 200px; + vertical-align: middle; + font-size: 14px; + color: #777; + text-overflow: ellipsis; + width: 70px; + overflow: hidden; + height: 20px; + text-align: left; +} + +.toolbar .toolbar-item .icon { + display: flex; + width: 20px; + height: 20px; + user-select: none; + margin-right: 8px; + line-height: 16px; + background-size: contain; +} + +.toolbar i.chevron-down { + margin-top: 3px; + width: 16px; + height: 16px; + display: flex; + user-select: none; +} + +.toolbar i.chevron-down.inside { + width: 16px; + height: 16px; + display: flex; + margin-left: -25px; + margin-top: 11px; + margin-right: 10px; + pointer-events: none; +} + +i.chevron-down { + background-color: transparent; + background-size: contain; + display: inline-block; + height: 8px; + width: 8px; + background-image: url(./images/icons/chevron-down.svg); +} + +#block-controls button:hover { + background-color: #efefef; +} + +#block-controls button:focus-visible { + border-color: blue; +} + +#block-controls span.block-type { + background-size: contain; + display: block; + width: 18px; + height: 18px; + margin: 2px; +} + +#block-controls span.block-type.paragraph { + background-image: url(./images/icons/text-paragraph.svg); +} + +#block-controls span.block-type.h1 { + background-image: url(./images/icons/type-h1.svg); +} + +#block-controls span.block-type.h2 { + background-image: url(./images/icons/type-h2.svg); +} + +#block-controls span.block-type.quote { + background-image: url(./images/icons/chat-square-quote.svg); +} + +#block-controls span.block-type.ul { + background-image: url(./images/icons/list-ul.svg); +} + +#block-controls span.block-type.ol { + background-image: url(./images/icons/list-ol.svg); +} + +#block-controls span.block-type.code { + background-image: url(./images/icons/code.svg); +} + +.dropdown { + z-index: 1301; + display: block; + position: absolute; + box-shadow: 0 12px 28px 0 rgba(0, 0, 0, 0.2), 0 2px 4px 0 rgba(0, 0, 0, 0.1), + inset 0 0 0 1px rgba(255, 255, 255, 0.5); + border-radius: 8px; + min-width: 100px; + min-height: 40px; + background-color: #fff; +} + +.dropdown .item { + margin: 0 8px 0 8px; + padding: 8px; + color: #050505; + cursor: pointer; + line-height: 16px; + font-size: 15px; + display: flex; + align-content: center; + flex-direction: row; + flex-shrink: 0; + justify-content: space-between; + background-color: #fff; + border-radius: 8px; + border: 0; + min-width: 268px; +} + +.dropdown .item .active { + display: flex; + width: 20px; + height: 20px; + background-size: contain; +} + +.dropdown .item:first-child { + margin-top: 8px; +} + +.dropdown .item:last-child { + margin-bottom: 8px; +} + +.dropdown .item:hover { + background-color: #eee; +} + +.dropdown .item .text { + display: flex; + line-height: 20px; + flex-grow: 1; + width: 200px; +} + +.dropdown .item .icon { + display: flex; + width: 20px; + height: 20px; + user-select: none; + margin-right: 12px; + line-height: 16px; + background-size: contain; +} + +.link-editor { + position: absolute; + z-index: 1301; + top: -10000px; + left: -10000px; + margin-top: -6px; + max-width: 300px; + width: 100%; + opacity: 0; + background-color: #fff; + box-shadow: 0px 5px 10px rgba(0, 0, 0, 0.3); + border-radius: 8px; + transition: opacity 0.5s; + padding:10px; +} +.link-editor .MuiFormControl-root { + margin-top:10px; + margin-bottom: 10px; +} + +i.undo { + background-image: url(./images/icons/arrow-counterclockwise.svg); +} + +i.redo { + background-image: url(./images/icons/arrow-clockwise.svg); +} + +.icon.paragraph { + background-image: url(./images/icons/text-paragraph.svg); +} + +.icon.large-heading, +.icon.h1 { + background-image: url(./images/icons/type-h1.svg); +} + +.icon.small-heading, +.icon.h2 { + background-image: url(./images/icons/type-h2.svg); +} + +.icon.h3 { + background-image: url(./images/icons/type-h3.svg); +} + +.icon.h4 { + background-image: url(./images/icons/type-h4.svg); +} + +.icon.bullet-list, +.icon.ul { + background-image: url(./images/icons/list-ul.svg); +} + +.icon.numbered-list, +.icon.ol { + background-image: url(./images/icons/list-ol.svg); +} + +.icon.quote { + background-image: url(./images/icons/chat-square-quote.svg); +} + +.icon.code { + background-image: url(./images/icons/code.svg); +} + +i.bold { + background-image: url(./images/icons/type-bold.svg); +} + +i.italic { + background-image: url(./images/icons/type-italic.svg); +} + +i.underline { + background-image: url(./images/icons/type-underline.svg); +} + +i.strikethrough { + background-image: url(./images/icons/type-strikethrough.svg); +} + +i.code { + background-image: url(./images/icons/code.svg); +} + +i.link { + background-image: url(./images/icons/link.svg); +} + +i.left-align { + background-image: url(./images/icons/text-left.svg); +} + +i.center-align { + background-image: url(./images/icons/text-center.svg); +} + +i.right-align { + background-image: url(./images/icons/text-right.svg); +} + +i.justify-align { + background-image: url(./images/icons/justify.svg); +} + +.typeahead-popover { + background: #fff; + box-shadow: 0px 5px 10px rgba(0, 0, 0, 0.3); + border-radius: 8px; + margin-top: 25px; +} + +.typeahead-popover ul { + padding: 0; + list-style: none; + margin: 0; + border-radius: 8px; + max-height: 200px; + overflow-y: scroll; +} + +.typeahead-popover ul::-webkit-scrollbar { + display: none; +} + +.typeahead-popover ul { + -ms-overflow-style: none; + scrollbar-width: none; +} + +.typeahead-popover ul li { + margin: 0; + min-width: 180px; + font-size: 14px; + outline: none; + cursor: pointer; + border-radius: 8px; +} + +.typeahead-popover ul li.selected { + background: #eee; +} + +.typeahead-popover li { + margin: 0 8px 0 8px; + padding: 8px; + color: #050505; + cursor: pointer; + line-height: 16px; + font-size: 15px; + display: flex; + align-content: center; + flex-direction: row; + flex-shrink: 0; + background-color: #fff; + border-radius: 8px; + border: 0; +} + +.typeahead-popover li.active { + display: flex; + width: 20px; + height: 20px; + background-size: contain; +} + +.typeahead-popover li:first-child { + border-radius: 8px 8px 0px 0px; +} + +.typeahead-popover li:last-child { + border-radius: 0px 0px 8px 8px; +} + +.typeahead-popover li:hover { + background-color: #eee; +} + +.typeahead-popover li .text { + display: flex; + line-height: 20px; + flex-grow: 1; + min-width: 150px; +} + +.typeahead-popover li .icon { + display: flex; + width: 20px; + height: 20px; + user-select: none; + margin-right: 8px; + line-height: 16px; + background-size: contain; + background-repeat: no-repeat; + background-position: center; +} + +.emoji-menu { + width: 200px; +} diff --git a/public/apphelper/css/markdown/images/emoji/1F600.png b/public/apphelper/css/markdown/images/emoji/1F600.png new file mode 100644 index 00000000..ba0e4feb Binary files /dev/null and b/public/apphelper/css/markdown/images/emoji/1F600.png differ diff --git a/public/apphelper/css/markdown/images/emoji/1F641.png b/public/apphelper/css/markdown/images/emoji/1F641.png new file mode 100644 index 00000000..0dd4e5be Binary files /dev/null and b/public/apphelper/css/markdown/images/emoji/1F641.png differ diff --git a/public/apphelper/css/markdown/images/emoji/1F642.png b/public/apphelper/css/markdown/images/emoji/1F642.png new file mode 100644 index 00000000..b37115fd Binary files /dev/null and b/public/apphelper/css/markdown/images/emoji/1F642.png differ diff --git a/public/apphelper/css/markdown/images/emoji/2764.png b/public/apphelper/css/markdown/images/emoji/2764.png new file mode 100644 index 00000000..2c6c24a9 Binary files /dev/null and b/public/apphelper/css/markdown/images/emoji/2764.png differ diff --git a/public/apphelper/css/markdown/images/icons/arrow-clockwise.svg b/public/apphelper/css/markdown/images/icons/arrow-clockwise.svg new file mode 100644 index 00000000..b072eb09 --- /dev/null +++ b/public/apphelper/css/markdown/images/icons/arrow-clockwise.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/public/apphelper/css/markdown/images/icons/arrow-counterclockwise.svg b/public/apphelper/css/markdown/images/icons/arrow-counterclockwise.svg new file mode 100644 index 00000000..b0b23b9b --- /dev/null +++ b/public/apphelper/css/markdown/images/icons/arrow-counterclockwise.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/public/apphelper/css/markdown/images/icons/chat-square-quote.svg b/public/apphelper/css/markdown/images/icons/chat-square-quote.svg new file mode 100644 index 00000000..40893f49 --- /dev/null +++ b/public/apphelper/css/markdown/images/icons/chat-square-quote.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/public/apphelper/css/markdown/images/icons/chevron-down.svg b/public/apphelper/css/markdown/images/icons/chevron-down.svg new file mode 100644 index 00000000..1f0b8bc7 --- /dev/null +++ b/public/apphelper/css/markdown/images/icons/chevron-down.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/public/apphelper/css/markdown/images/icons/code.svg b/public/apphelper/css/markdown/images/icons/code.svg new file mode 100644 index 00000000..079f5c67 --- /dev/null +++ b/public/apphelper/css/markdown/images/icons/code.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/public/apphelper/css/markdown/images/icons/journal-code.svg b/public/apphelper/css/markdown/images/icons/journal-code.svg new file mode 100644 index 00000000..82098b9c --- /dev/null +++ b/public/apphelper/css/markdown/images/icons/journal-code.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/public/apphelper/css/markdown/images/icons/journal-text.svg b/public/apphelper/css/markdown/images/icons/journal-text.svg new file mode 100644 index 00000000..9b66f43a --- /dev/null +++ b/public/apphelper/css/markdown/images/icons/journal-text.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/public/apphelper/css/markdown/images/icons/justify.svg b/public/apphelper/css/markdown/images/icons/justify.svg new file mode 100644 index 00000000..009bd721 --- /dev/null +++ b/public/apphelper/css/markdown/images/icons/justify.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/public/apphelper/css/markdown/images/icons/link.svg b/public/apphelper/css/markdown/images/icons/link.svg new file mode 100644 index 00000000..df35bc8a --- /dev/null +++ b/public/apphelper/css/markdown/images/icons/link.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/public/apphelper/css/markdown/images/icons/list-ol.svg b/public/apphelper/css/markdown/images/icons/list-ol.svg new file mode 100644 index 00000000..5782568d --- /dev/null +++ b/public/apphelper/css/markdown/images/icons/list-ol.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/public/apphelper/css/markdown/images/icons/list-ul.svg b/public/apphelper/css/markdown/images/icons/list-ul.svg new file mode 100644 index 00000000..217d1539 --- /dev/null +++ b/public/apphelper/css/markdown/images/icons/list-ul.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/public/apphelper/css/markdown/images/icons/pencil-fill.svg b/public/apphelper/css/markdown/images/icons/pencil-fill.svg new file mode 100644 index 00000000..59d2830c --- /dev/null +++ b/public/apphelper/css/markdown/images/icons/pencil-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/public/apphelper/css/markdown/images/icons/text-center.svg b/public/apphelper/css/markdown/images/icons/text-center.svg new file mode 100644 index 00000000..2887a99f --- /dev/null +++ b/public/apphelper/css/markdown/images/icons/text-center.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/public/apphelper/css/markdown/images/icons/text-left.svg b/public/apphelper/css/markdown/images/icons/text-left.svg new file mode 100644 index 00000000..04526116 --- /dev/null +++ b/public/apphelper/css/markdown/images/icons/text-left.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/public/apphelper/css/markdown/images/icons/text-paragraph.svg b/public/apphelper/css/markdown/images/icons/text-paragraph.svg new file mode 100644 index 00000000..9779beab --- /dev/null +++ b/public/apphelper/css/markdown/images/icons/text-paragraph.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/public/apphelper/css/markdown/images/icons/text-right.svg b/public/apphelper/css/markdown/images/icons/text-right.svg new file mode 100644 index 00000000..34686b0f --- /dev/null +++ b/public/apphelper/css/markdown/images/icons/text-right.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/public/apphelper/css/markdown/images/icons/type-bold.svg b/public/apphelper/css/markdown/images/icons/type-bold.svg new file mode 100644 index 00000000..276d133c --- /dev/null +++ b/public/apphelper/css/markdown/images/icons/type-bold.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/public/apphelper/css/markdown/images/icons/type-h1.svg b/public/apphelper/css/markdown/images/icons/type-h1.svg new file mode 100644 index 00000000..4c891817 --- /dev/null +++ b/public/apphelper/css/markdown/images/icons/type-h1.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/public/apphelper/css/markdown/images/icons/type-h2.svg b/public/apphelper/css/markdown/images/icons/type-h2.svg new file mode 100644 index 00000000..b6ab7650 --- /dev/null +++ b/public/apphelper/css/markdown/images/icons/type-h2.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/public/apphelper/css/markdown/images/icons/type-h3.svg b/public/apphelper/css/markdown/images/icons/type-h3.svg new file mode 100644 index 00000000..154c293f --- /dev/null +++ b/public/apphelper/css/markdown/images/icons/type-h3.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/public/apphelper/css/markdown/images/icons/type-h4.svg b/public/apphelper/css/markdown/images/icons/type-h4.svg new file mode 100644 index 00000000..af53db2c --- /dev/null +++ b/public/apphelper/css/markdown/images/icons/type-h4.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/public/apphelper/css/markdown/images/icons/type-italic.svg b/public/apphelper/css/markdown/images/icons/type-italic.svg new file mode 100644 index 00000000..3ac6b09f --- /dev/null +++ b/public/apphelper/css/markdown/images/icons/type-italic.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/public/apphelper/css/markdown/images/icons/type-strikethrough.svg b/public/apphelper/css/markdown/images/icons/type-strikethrough.svg new file mode 100644 index 00000000..1c940e42 --- /dev/null +++ b/public/apphelper/css/markdown/images/icons/type-strikethrough.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/public/apphelper/css/markdown/images/icons/type-underline.svg b/public/apphelper/css/markdown/images/icons/type-underline.svg new file mode 100644 index 00000000..c299b8bf --- /dev/null +++ b/public/apphelper/css/markdown/images/icons/type-underline.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/app/[sdSlug]/[pageSlug]/[id]/page.tsx b/src/app/[sdSlug]/[pageSlug]/[id]/page.tsx index 9f48759b..133f7d5d 100644 --- a/src/app/[sdSlug]/[pageSlug]/[id]/page.tsx +++ b/src/app/[sdSlug]/[pageSlug]/[id]/page.tsx @@ -4,7 +4,7 @@ import { ConfigHelper, EnvironmentHelper } from "@/helpers"; import { ConfigurationInterface } from "@/helpers/ConfigHelper"; import { MetaHelper } from "@/helpers/MetaHelper"; import { Metadata } from "next"; -import "@churchapps/apphelper-website/dist/styles/animations.css"; +import "@/styles/vendor/animations.css"; import { Animate } from "@churchapps/apphelper-website"; import { FormPage } from "./components/FormPage"; import { notFound } from "next/navigation"; diff --git a/src/app/[sdSlug]/[pageSlug]/page.tsx b/src/app/[sdSlug]/[pageSlug]/page.tsx index 7b152965..b24e44cc 100644 --- a/src/app/[sdSlug]/[pageSlug]/page.tsx +++ b/src/app/[sdSlug]/[pageSlug]/page.tsx @@ -5,7 +5,7 @@ import { ConfigHelper, EnvironmentHelper, PageInterface } from "@/helpers"; import { ConfigurationInterface } from "@/helpers/ConfigHelper"; import { MetaHelper } from "@/helpers/MetaHelper"; import { Metadata } from "next"; -import "@churchapps/apphelper-website/dist/styles/animations.css"; +import "@/styles/vendor/animations.css"; import { Animate } from "@churchapps/apphelper-website"; import { VotdPage } from "./components/VotdPage"; import { BiblePage } from "./components/BiblePage"; diff --git a/src/app/[sdSlug]/my/[pageSlug]/[id]/page.tsx b/src/app/[sdSlug]/my/[pageSlug]/[id]/page.tsx index af340e9e..050ec43d 100644 --- a/src/app/[sdSlug]/my/[pageSlug]/[id]/page.tsx +++ b/src/app/[sdSlug]/my/[pageSlug]/[id]/page.tsx @@ -5,7 +5,7 @@ import { ConfigurationInterface } from "@/helpers/ConfigHelper"; import { MetaHelper } from "@/helpers/MetaHelper"; import { Metadata } from "next"; import { redirect } from "next/navigation"; -import "@churchapps/apphelper-website/dist/styles/animations.css"; +import "@/styles/vendor/animations.css"; import { Animate } from "@churchapps/apphelper-website"; import { TimelinePage } from "../components/TimelinePage"; diff --git a/src/app/[sdSlug]/my/[pageSlug]/components/MyWrapper.tsx b/src/app/[sdSlug]/my/[pageSlug]/components/MyWrapper.tsx index ae1c8cdc..6860c587 100644 --- a/src/app/[sdSlug]/my/[pageSlug]/components/MyWrapper.tsx +++ b/src/app/[sdSlug]/my/[pageSlug]/components/MyWrapper.tsx @@ -1,4 +1,4 @@ -import "@churchapps/apphelper-website/dist/styles/animations.css"; +import "@/styles/vendor/animations.css"; import React from "react"; import { Breadcrumbs, Container } from "@mui/material"; diff --git a/src/app/[sdSlug]/my/[pageSlug]/page.tsx b/src/app/[sdSlug]/my/[pageSlug]/page.tsx index f91b9acc..c776e1c6 100644 --- a/src/app/[sdSlug]/my/[pageSlug]/page.tsx +++ b/src/app/[sdSlug]/my/[pageSlug]/page.tsx @@ -4,7 +4,7 @@ import { ConfigHelper, EnvironmentHelper } from "@/helpers"; import { ConfigurationInterface } from "@/helpers/ConfigHelper"; import { MetaHelper } from "@/helpers/MetaHelper"; import { Metadata } from "next"; -import "@churchapps/apphelper-website/dist/styles/animations.css"; +import "@/styles/vendor/animations.css"; import { Animate } from "@churchapps/apphelper-website"; import { TimelinePage } from "./components/TimelinePage"; diff --git a/src/app/[sdSlug]/page.tsx b/src/app/[sdSlug]/page.tsx index b01bcaa6..f29600e3 100644 --- a/src/app/[sdSlug]/page.tsx +++ b/src/app/[sdSlug]/page.tsx @@ -5,7 +5,7 @@ import { PageLayout } from "@/components/PageLayout"; import { Metadata } from "next"; import { MetaHelper } from "@/helpers/MetaHelper"; import { EnvironmentHelper } from "@/helpers/EnvironmentHelper"; -import "@churchapps/apphelper-website/dist/styles/animations.css"; +import "@/styles/vendor/animations.css"; import { Animate } from "@churchapps/apphelper-website"; import { redirect } from "next/navigation"; diff --git a/src/app/layout.tsx b/src/app/layout.tsx index a1c9150e..4c8be49b 100644 --- a/src/app/layout.tsx +++ b/src/app/layout.tsx @@ -1,11 +1,10 @@ import "react-activity/dist/Dots.css"; -import "@churchapps/apphelper-website/dist/styles/pages.css"; +import "@/styles/vendor/pages.css"; import "@/styles/member.css"; import "@/styles/streaming.css"; import "@/styles/buttons.css"; import "@/styles/sidebar.css"; import "@/styles/master-detail.css"; -import "@churchapps/apphelper-markdown/dist/components/markdownEditor/editor.css"; import "@youversion/platform-react-ui/styles.css"; import ClientLayout from "./ClientLayout"; import { EnvironmentHelper } from "@/helpers/EnvironmentHelper"; @@ -34,6 +33,7 @@ export default async function RootLayout({ children }: { children: React.ReactNo + {children} diff --git a/src/components/notes/NewConversation.tsx b/src/components/notes/NewConversation.tsx index 6222792e..e1e2279b 100644 --- a/src/components/notes/NewConversation.tsx +++ b/src/components/notes/NewConversation.tsx @@ -64,7 +64,7 @@ export function NewConversation({ context, conversation, ...props }: Props) { cId = result[0].id; } - const m = { ...message, conversationId: cId }; + const m = { ...message, conversationId: cId, displayName: context?.person?.name?.display || "" }; await ApiHelper.post("/messages", [m], "MessagingApi"); setMessage({ ...message, content: "" }); diff --git a/tests/general.spec.ts b/tests/general.spec.ts new file mode 100644 index 00000000..4a45abdf --- /dev/null +++ b/tests/general.spec.ts @@ -0,0 +1,434 @@ +import { test, expect } from '@playwright/test'; +import { TestHelpers } from './helpers/test-base'; + +// OCTAVIAN/OCTAVIUS are the names used for testing. If you see Octavian or Octavius entered anywhere, it is a result of these tests. +test.describe('General Tests', () => { + test.beforeEach(async ({ page }) => { + await page.goto('/my/timeline'); + await page.waitForLoadState('domcontentloaded'); + const loginBtn = page.locator('[id="login-submit-button"]'); + await loginBtn.click(); + await page.waitForTimeout(500); + }); + + test.describe('Timeline', () => { + test('UNFINISHED should send message on updates', async ({ page }) => { + const firstItem = page.locator('[class="memberItem"]').first(); + await firstItem.click(); + const textbox = page.locator('[name="noteText"]').first(); + await textbox.fill('Octavian Test Message'); + const sendBtn = page.locator('button span').getByText('send').first(); + await sendBtn.click(); + }); + }); + + test.describe('Giving', () => { + test.beforeEach(async ({ page }) => { + const directoryTab = page.locator('[data-testid="my-tab-give"]'); + await directoryTab.click(); + await page.waitForTimeout(500); + }); + + test.skip('UNFINSHED should add donation', async ({ page }) => { + const donationTab = page.locator('[class="memberName"]').getByText('Give Now'); + await donationTab.click(); + }); + + test('UNFINSHED should check donation history', async ({ page }) => { + const historyTab = page.locator('[class="memberName"]').getByText('History'); + await historyTab.click(); + }); + + test('UNFINSHED should check recurring donations', async ({ page }) => { + const recurringTab = page.locator('[class="memberName"]').getByText('Recurring Donations'); + await recurringTab.click(); + }); + }); + + test.describe('Groups', () => { + test.beforeEach(async ({ page }) => { + const directoryTab = page.locator('[data-testid="my-tab-my groups"]'); + await directoryTab.click(); + await page.waitForTimeout(2000); + const praiseTeam = page.locator('div').getByText('Praise Team').first(); + await praiseTeam.click(); + await page.waitForTimeout(1000); + }); + + test('should view group details', async ({ page }) => { + const details = page.locator('p').getByText('Contemporary worship team for Sunday services'); + await expect(details).toHaveCount(1); + }); + + test('should add group member', async ({ page }) => { + const memTab = page.locator('[class="sideNav"] li a').getByText('Members'); + await memTab.click(); + + const searchBar = page.locator('[name="personAddText"]'); + await searchBar.fill('Sarah Wilson'); + const searchBtn = page.locator('[data-testid="search-person-button"]'); + await searchBtn.click(); + const addBtn = page.locator('[data-testid="add-person-PER00000050-button"]'); + await addBtn.click(); + const validatedAddition = page.locator('[id="groupMembersBox"] td a').getByText('Sarah Wilson'); + await expect(validatedAddition).toHaveCount(1); + }); + + test('should remove group member', async ({ page }) => { + const memTab = page.locator('[class="sideNav"] li a').getByText('Members'); + await memTab.click(); + + const removeBtn = page.locator('button span').getByText('remove').last(); + await removeBtn.click(); + await page.waitForTimeout(500); + const validatedRemoval = page.locator('[id="groupMembersBox"] td a').getByText('Sarah Wilson'); + await expect(validatedRemoval).toHaveCount(0); + }); + + test('should view member details', async ({ page }) => { + const memTab = page.locator('[class="sideNav"] li a').getByText('Members'); + await memTab.click(); + await page.waitForTimeout(500); + + const firstMem = page.locator('[id="groupMembersBox"] td a').first(); + await firstMem.click(); + await page.waitForTimeout(500); + const loginBtn = page.locator('[id="login-submit-button"]'); + await loginBtn.click(); + await page.waitForTimeout(500); + const validatedPerson = page.locator('h2').getByText('Michael Davis'); + await expect(validatedPerson).toHaveCount(1); + await expect(page).toHaveURL(/\/my\/community\/PER\d+/); + }); + + test('should add attendance session', async ({ page }) => { + const attTab = page.locator('[class="sideNav"] li a').getByText('Attendance'); + await attTab.click(); + + const addBtn = page.locator('[data-testid="add-service-time-button"]'); + await addBtn.click(); + const date = page.locator('input').last(); + await date.fill('2025-03-01'); + const saveBtn = page.locator('button').getByText('Save'); + await saveBtn.click(); + const sessions = page.locator('[role="combobox"]'); + await sessions.click(); + const validatedSession = page.locator('li').getByText('03/01/2025'); + await expect(validatedSession).toHaveCount(1); + }); + + test('should add person to session', async ({ page }) => { + const attTab = page.locator('[class="sideNav"] li a').getByText('Attendance'); + await attTab.click(); + + const sessions = page.locator('[role="combobox"]'); + await sessions.click(); + const session = page.locator('li').getByText('03/01/2025'); + await session.click(); + const addBtn = page.locator('button').getByText('Add').first(); + await addBtn.click(); + const validatedAddition = page.locator('[id="groupMemberTable"] td a').getByText('Michael Davis'); + await expect(validatedAddition).toHaveCount(1); + }); + + test('should remove person from session', async ({ page }) => { + const attTab = page.locator('[class="sideNav"] li a').getByText('Attendance'); + await attTab.click(); + + const sessions = page.locator('[role="combobox"]'); + await sessions.click(); + const session = page.locator('li').getByText('03/01/2025'); + await session.click(); + const removeBtn = page.locator('button').getByText('Remove').first(); + await removeBtn.click(); + const validatedRemoval = page.locator('[id="groupMemberTable"] td a').getByText('Michael Davis'); + await expect(validatedRemoval).toHaveCount(0); + }); + + test('should add event to calendar', async ({ page }) => { + const calendarTab = page.locator('[class="sideNav"] li a').getByText('Calendar'); + await calendarTab.click(); + + const addBtn = page.locator('[data-testid="event-add-button"]'); + await addBtn.click(); + const recurring = page.locator('[name="recurring"]'); + await recurring.click(); + const startDate = page.locator('[name="start"]'); + await startDate.fill('2025-03-01T13:00'); + const endDate = page.locator('[name="end"]'); + await endDate.fill('2025-03-01T15:00'); + const frequency = page.locator('[id="mui-component-select-freq"]'); + await frequency.click(); + const week = page.locator('li').getByText('Week'); + await week.click(); + const title = page.locator('[name="title"]'); + await title.fill('Octavian Test Event'); + const notes = page.locator('[role="textbox"]'); + await notes.fill('Playwright testing event, feel free to delete'); + const saveBtn = page.locator('[data-testid="save-event-button"]'); + await saveBtn.click(); + + const validatedEvent = page.locator('[title="Octavian Test Event"]').first(); + await expect(validatedEvent).toHaveCount(1); + }); + + test('should edit calendar event', async ({ page }) => { + const calendarTab = page.locator('[class="sideNav"] li a').getByText('Calendar'); + await calendarTab.click(); + + const event = page.locator('[title="Octavian Test Event"]').first(); + await event.click(); + const editBtn = page.locator('[data-testid="event-edit-button"]').first(); + await editBtn.click(); + const title = page.locator('[name="title"]'); + await title.fill('Octavius Test Event'); + const saveBtn = page.locator('[data-testid="save-event-button"]'); + await saveBtn.click(); + const selectAll = page.locator('[value="all"]'); + await selectAll.click(); + const confirmSave = page.locator('[data-testid="edit-recurring-save-button"]'); + await confirmSave.click(); + const validatedEdit = page.locator('[title="Octavius Test Event"]').first(); + await expect(validatedEdit).toHaveCount(1); + }); + + test('should remove event from calendar', async ({ page }) => { + const calendarTab = page.locator('[class="sideNav"] li a').getByText('Calendar'); + await calendarTab.click(); + + const event = page.locator('[title="Octavius Test Event"]').first(); + await event.click(); + const editBtn = page.locator('[data-testid="event-edit-button"]').first(); + await editBtn.click(); + const deleteBtn = page.locator('[data-testid="delete-event-button"]'); + await deleteBtn.click(); + const selectAll = page.locator('[value="all"]'); + await selectAll.click(); + const confirmDelete = page.locator('[data-testid="edit-recurring-save-button"]'); + await confirmDelete.click(); + const validatedEdit = page.locator('[title="Octavius Test Event"]').first(); + await expect(validatedEdit).toHaveCount(0); + }); + + test('should send conversation message', async ({ page }) => { + const convoTab = page.locator('[class="sideNav"] li a').getByText('Conversations'); + await convoTab.click(); + + const messageBox = page.locator('[name="noteText"]'); + await messageBox.fill('Octavian Test Message'); + const sendBtn = page.locator('button span').getByText('send'); + await sendBtn.click(); + const validatedMessage = page.locator('p').getByText('Octavian Test Message'); + await expect(validatedMessage).toHaveCount(1); + }); + + test('should edit conversation message', async ({ page }) => { + const convoTab = page.locator('[class="sideNav"] li a').getByText('Conversations'); + await convoTab.click(); + + const editBtn = page.locator('button span').getByText('edit'); + await editBtn.click(); + const messageBox = page.locator('[name="noteText"]'); + await messageBox.fill('Octavius Test Message'); + const sendBtn = page.locator('button span').getByText('send'); + await sendBtn.click(); + const validatedEdit = page.locator('p').getByText('Octavius Test Message'); + await expect(validatedEdit).toHaveCount(1); + const oldMessage = page.locator('p').getByText('Octavian Test Message'); + await expect(oldMessage).toHaveCount(0); + }); + + test('should delete conversation message', async ({ page }) => { + const convoTab = page.locator('[class="sideNav"] li a').getByText('Conversations'); + await convoTab.click(); + + const editBtn = page.locator('button span').getByText('edit').first(); + await editBtn.click(); + const deleteBtn = page.locator('button span').getByText('delete').first(); + await deleteBtn.click(); + const validatedDeletion = page.locator('p').getByText('Octavius Test Message'); + await expect(validatedDeletion).toHaveCount(0); + }); + }); + + test.describe('Directory', () => { + test.beforeEach(async ({ page }) => { + const directoryTab = page.locator('[data-testid="my-tab-directory"]'); + await directoryTab.click(); + await page.waitForTimeout(500); + }); + + test('should search for person', async ({ page }) => { + const searchBar = page.locator('[class="masterSearch"] input'); + await searchBar.fill('Mary'); + const searchBtn = page.locator('[class="masterSearch"] button'); + await searchBtn.click(); + await page.waitForTimeout(500); + const searchResult = page.locator('[class="memberName"]').first(); + await searchResult.click(); + await page.waitForTimeout(500); + const validatedResult = page.locator('h3').getByText('Mary Smith'); + await expect(validatedResult).toHaveCount(1); + }); + + test('UNFINISHED should message person', async ({ page }) => { + const firstPerson = page.locator('[class="memberName"]').first(); + await firstPerson.click(); + await page.waitForTimeout(500); + + const messageBtn = page.locator('button').getByText('Message'); + await messageBtn.click(); + const messageBox = page.locator('[name="noteText"]'); + await messageBox.fill('Octavian Test Message'); + const sendBtn = page.locator('button span').getByText('send'); + await sendBtn.click(); + }); + + test('should search for group member', async ({ page }) => { + const groupTab = page.locator('[class="filterBtn"]').getByText('Groups'); + await groupTab.click(); + const searchBar = page.locator('[role="combobox"]'); + await searchBar.click(); + const group = page.locator('[data-value="GRP00000019"]'); + await group.click(); + const searchBtn = page.locator('[class="masterSearch"] button'); + await searchBtn.click(); + await page.waitForTimeout(500); + const searchResult = page.locator('[class="memberName"]').first(); + await searchResult.click(); + await page.waitForTimeout(500); + const validatedResult = page.locator('h3').getByText('Emily Davis'); + await expect(validatedResult).toHaveCount(1); + }); + }); + + test.describe('Serving', () => { + test.beforeEach(async ({ page }) => { + const directoryTab = page.locator('[data-testid="my-tab-serving"]'); + await directoryTab.click(); + await page.waitForTimeout(500); + }); + + test('should add blockout dates', async ({ page }) => { + const blockout = page.locator('[class="memberName"]').getByText('Blockout Dates'); + await blockout.click(); + const addBtn = page.locator('button span').getByText('add'); + await addBtn.click(); + const startDate = page.locator('[name="startDate"]'); + await startDate.fill('2025-03-01'); + const endDate = page.locator('[name="endDate"]'); + await endDate.fill('2025-03-10'); + const saveBtn = page.locator('button').getByText('save'); + await saveBtn.click(); + const validatedStart = page.locator('table td').getByText('Mar 1, 2025'); + await expect(validatedStart).toHaveCount(1); + const validatedEnd = page.locator('table td').getByText('Mar 10, 2025'); + await expect(validatedEnd).toHaveCount(1); + }); + + test('should edit blockout dates', async ({ page }) => { + const blockout = page.locator('[class="memberName"]').getByText('Blockout Dates'); + await blockout.click(); + const editBtn = page.locator('button span').getByText('edit').last(); + await editBtn.click(); + const startDate = page.locator('[name="startDate"]'); + await startDate.fill('2025-04-01'); + const endDate = page.locator('[name="endDate"]'); + await endDate.fill('2025-04-10'); + const saveBtn = page.locator('button').getByText('save'); + await saveBtn.click(); + const validatedStart = page.locator('table td').getByText('Apr 1, 2025'); + await expect(validatedStart).toHaveCount(1); + const validatedEnd = page.locator('table td').getByText('Apr 10, 2025'); + await expect(validatedEnd).toHaveCount(1); + }); + + test('should cancel editing blockout dates', async ({ page }) => { + const blockout = page.locator('[class="memberName"]').getByText('Blockout Dates'); + await blockout.click(); + const editBtn = page.locator('button span').getByText('edit').last(); + await editBtn.click(); + const startDate = page.locator('[name="startDate"]'); + await expect(startDate).toHaveCount(1); + const cancelBtn = page.locator('button').getByText('Cancel'); + await cancelBtn.click(); + await expect(startDate).toHaveCount(0); + }); + + test('should delete blockout dates', async ({ page }) => { + const blockout = page.locator('[class="memberName"]').getByText('Blockout Dates'); + await blockout.click(); + const editBtn = page.locator('button span').getByText('edit').last(); + await editBtn.click(); + await page.waitForTimeout(300) + const deleteBtn = page.locator('[id="delete"]'); + await deleteBtn.click(); + const validatedStart = page.locator('table td').getByText('Apr 1, 2025'); + await expect(validatedStart).toHaveCount(0); + const validatedEnd = page.locator('table td').getByText('Apr 10, 2025'); + await expect(validatedEnd).toHaveCount(0); + }); + + test('should view/verify serving time details', async ({ page, context }) => { + const servTime = page.locator('[class="memberName"]').getByText('Upcoming Worship Schedule'); + await servTime.click(); + await page.waitForTimeout(500); + const verifiedServTime = page.locator('h1').getByText('Upcoming Worship Schedule'); + await expect(verifiedServTime).toHaveCount(1); + const expectedRole = page.locator('[id="input-box-title"]').getByText('Position: Sound Tech'); + await expect(expectedRole).toHaveCount(1); + const expectedResponse = page.locator('div').getByText('Status: Accepted'); + await expect(expectedResponse).toHaveCount(1); + const techTeam = page.locator('[data-testid="team-technical-display-box"] a').getByText('Demo User'); + await expect(techTeam).toHaveCount(1); + const worshipTeam = page.locator('[data-testid="team-worship-display-box"] a').getByText('David Lopez'); + await expect(worshipTeam).toHaveCount(1); + + const countdownVid = page.locator('div a').getByText('Countdown Video'); + await countdownVid.click(); + const [newPage] = await Promise.all([ + context.waitForEvent('page'), + countdownVid.click() + ]); + await newPage.waitForLoadState(); + await page.waitForTimeout(5000); + await expect(newPage).toHaveURL('https://www.youtube.com/watch?v=dQw4w9WgXcQ') + }); + }); + + test.describe('Check In', () => { + test.beforeEach(async ({ page }) => { + const checkInTab = page.locator('[data-testid="my-tab-check-in"]'); + await checkInTab.click(); + await page.waitForTimeout(500); + }); + test('should check self in', async ({ page }) => { + const sundayMorning = page.locator('button div h6').getByText('Sunday Morning Service'); + await sundayMorning.click(); + const demoUser = page.locator('button div h6').getByText('Demo User'); + await demoUser.click(); + const earlyServ = page.locator('button').getByText('Select Group').last(); + await earlyServ.click(); + const sundaySchool = page.locator('button div p').getByText('Sunday School'); + await sundaySchool.click(); + const adultBible = page.locator('button div p').getByText('Adult Bible Class'); + await adultBible.click(); + const checkInBtn = page.locator('[data-testid="checkin-submit-button"]'); + await checkInBtn.click(); + const validatedCheckIn = page.locator('h4').getByText('Check-in Complete'); + await expect(validatedCheckIn).toHaveCount(1); + + //double check + const returnBtn = page.locator('button').getByText('Back to My Page'); + await returnBtn.click(); + await page.waitForTimeout(500); + const checkInTab = page.locator('[data-testid="my-tab-check-in"]'); + await checkInTab.click(); + await page.waitForTimeout(500); + await sundayMorning.click(); + await page.waitForTimeout(500); + const validationChip = page.locator('div span').getByText('Adult Bible Class'); + await expect(validationChip).toHaveCount(1); + }); + }); +}); \ No newline at end of file