This commit is contained in:
sasha-astiadi 2025-06-18 16:44:30 +02:00
parent 08bc8e8ba5
commit 912b1733b3
17 changed files with 236 additions and 117 deletions

171
package-lock.json generated
View File

@ -9,6 +9,7 @@
"version": "0.1.0", "version": "0.1.0",
"dependencies": { "dependencies": {
"@headlessui/react": "^2.1.0", "@headlessui/react": "^2.1.0",
"@heroicons/react": "^2.2.0",
"@tailwindcss/forms": "^0.5.3", "@tailwindcss/forms": "^0.5.3",
"@tailwindcss/postcss": "^4.1.7", "@tailwindcss/postcss": "^4.1.7",
"@types/node": "^20.10.8", "@types/node": "^20.10.8",
@ -65,13 +66,11 @@
} }
}, },
"node_modules/@babel/runtime": { "node_modules/@babel/runtime": {
"version": "7.23.8", "version": "7.27.6",
"resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.8.tgz", "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.27.6.tgz",
"integrity": "sha512-Y7KbAP984rn1VGMbGqKmBLio9V7y5Je9GvU4rQPCPinCyNfUcToxIXl06d59URp/F3LwinvODxab5N/G6qggkw==", "integrity": "sha512-vbavdySgbTTrmFE+EsiqUTzlOr5bzlnJtUv9PynGCAKvfQqjIXbvFdumPM/GxMDfyuGMJaJAU6TO4zc1Jf1i8Q==",
"dev": true, "dev": true,
"dependencies": { "license": "MIT",
"regenerator-runtime": "^0.14.0"
},
"engines": { "engines": {
"node": ">=6.9.0" "node": ">=6.9.0"
} }
@ -222,6 +221,15 @@
"react-dom": "^18" "react-dom": "^18"
} }
}, },
"node_modules/@heroicons/react": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/@heroicons/react/-/react-2.2.0.tgz",
"integrity": "sha512-LMcepvRaS9LYHJGsF0zzmgKCUim/X3N/DQKc4jepAXJ7l8QxJ1PmxJzqplF2Z3FE4PqBAIGyJAQ/w4B5dsqbtQ==",
"license": "MIT",
"peerDependencies": {
"react": ">= 16 || ^19.0.0-rc"
}
},
"node_modules/@humanwhocodes/config-array": { "node_modules/@humanwhocodes/config-array": {
"version": "0.11.14", "version": "0.11.14",
"resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz",
@ -766,9 +774,10 @@
} }
}, },
"node_modules/@next/env": { "node_modules/@next/env": {
"version": "14.2.3", "version": "14.2.30",
"resolved": "https://registry.npmjs.org/@next/env/-/env-14.2.3.tgz", "resolved": "https://registry.npmjs.org/@next/env/-/env-14.2.30.tgz",
"integrity": "sha512-W7fd7IbkfmeeY2gXrzJYDx8D2lWKbVoTIj1o1ScPHNzvp30s1AuoEFSdr39bC5sjxJaxTtq3OTCZboNp0lNWHA==" "integrity": "sha512-KBiBKrDY6kxTQWGzKjQB7QirL3PiiOkV7KW98leHFjtVRKtft76Ra5qSA/SL75xT44dp6hOcqiiJ6iievLOYug==",
"license": "MIT"
}, },
"node_modules/@next/eslint-plugin-next": { "node_modules/@next/eslint-plugin-next": {
"version": "14.0.4", "version": "14.0.4",
@ -780,12 +789,13 @@
} }
}, },
"node_modules/@next/swc-darwin-arm64": { "node_modules/@next/swc-darwin-arm64": {
"version": "14.2.3", "version": "14.2.30",
"resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.2.3.tgz", "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.2.30.tgz",
"integrity": "sha512-3pEYo/RaGqPP0YzwnlmPN2puaF2WMLM3apt5jLW2fFdXD9+pqcoTzRk+iZsf8ta7+quAe4Q6Ms0nR0SFGFdS1A==", "integrity": "sha512-EAqfOTb3bTGh9+ewpO/jC59uACadRHM6TSA9DdxJB/6gxOpyV+zrbqeXiFTDy9uV6bmipFDkfpAskeaDcO+7/g==",
"cpu": [ "cpu": [
"arm64" "arm64"
], ],
"license": "MIT",
"optional": true, "optional": true,
"os": [ "os": [
"darwin" "darwin"
@ -795,12 +805,13 @@
} }
}, },
"node_modules/@next/swc-darwin-x64": { "node_modules/@next/swc-darwin-x64": {
"version": "14.2.3", "version": "14.2.30",
"resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-14.2.3.tgz", "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-14.2.30.tgz",
"integrity": "sha512-6adp7waE6P1TYFSXpY366xwsOnEXM+y1kgRpjSRVI2CBDOcbRjsJ67Z6EgKIqWIue52d2q/Mx8g9MszARj8IEA==", "integrity": "sha512-TyO7Wz1IKE2kGv8dwQ0bmPL3s44EKVencOqwIY69myoS3rdpO1NPg5xPM5ymKu7nfX4oYJrpMxv8G9iqLsnL4A==",
"cpu": [ "cpu": [
"x64" "x64"
], ],
"license": "MIT",
"optional": true, "optional": true,
"os": [ "os": [
"darwin" "darwin"
@ -810,12 +821,13 @@
} }
}, },
"node_modules/@next/swc-linux-arm64-gnu": { "node_modules/@next/swc-linux-arm64-gnu": {
"version": "14.2.3", "version": "14.2.30",
"resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.2.3.tgz", "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.2.30.tgz",
"integrity": "sha512-cuzCE/1G0ZSnTAHJPUT1rPgQx1w5tzSX7POXSLaS7w2nIUJUD+e25QoXD/hMfxbsT9rslEXugWypJMILBj/QsA==", "integrity": "sha512-I5lg1fgPJ7I5dk6mr3qCH1hJYKJu1FsfKSiTKoYwcuUf53HWTrEkwmMI0t5ojFKeA6Vu+SfT2zVy5NS0QLXV4Q==",
"cpu": [ "cpu": [
"arm64" "arm64"
], ],
"license": "MIT",
"optional": true, "optional": true,
"os": [ "os": [
"linux" "linux"
@ -825,12 +837,13 @@
} }
}, },
"node_modules/@next/swc-linux-arm64-musl": { "node_modules/@next/swc-linux-arm64-musl": {
"version": "14.2.3", "version": "14.2.30",
"resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.2.3.tgz", "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.2.30.tgz",
"integrity": "sha512-0D4/oMM2Y9Ta3nGuCcQN8jjJjmDPYpHX9OJzqk42NZGJocU2MqhBq5tWkJrUQOQY9N+In9xOdymzapM09GeiZw==", "integrity": "sha512-8GkNA+sLclQyxgzCDs2/2GSwBc92QLMrmYAmoP2xehe5MUKBLB2cgo34Yu242L1siSkwQkiV4YLdCnjwc/Micw==",
"cpu": [ "cpu": [
"arm64" "arm64"
], ],
"license": "MIT",
"optional": true, "optional": true,
"os": [ "os": [
"linux" "linux"
@ -840,12 +853,13 @@
} }
}, },
"node_modules/@next/swc-linux-x64-gnu": { "node_modules/@next/swc-linux-x64-gnu": {
"version": "14.2.3", "version": "14.2.30",
"resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.2.3.tgz", "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.2.30.tgz",
"integrity": "sha512-ENPiNnBNDInBLyUU5ii8PMQh+4XLr4pG51tOp6aJ9xqFQ2iRI6IH0Ds2yJkAzNV1CfyagcyzPfROMViS2wOZ9w==", "integrity": "sha512-8Ly7okjssLuBoe8qaRCcjGtcMsv79hwzn/63wNeIkzJVFVX06h5S737XNr7DZwlsbTBDOyI6qbL2BJB5n6TV/w==",
"cpu": [ "cpu": [
"x64" "x64"
], ],
"license": "MIT",
"optional": true, "optional": true,
"os": [ "os": [
"linux" "linux"
@ -855,12 +869,13 @@
} }
}, },
"node_modules/@next/swc-linux-x64-musl": { "node_modules/@next/swc-linux-x64-musl": {
"version": "14.2.3", "version": "14.2.30",
"resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.2.3.tgz", "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.2.30.tgz",
"integrity": "sha512-BTAbq0LnCbF5MtoM7I/9UeUu/8ZBY0i8SFjUMCbPDOLv+un67e2JgyN4pmgfXBwy/I+RHu8q+k+MCkDN6P9ViQ==", "integrity": "sha512-dBmV1lLNeX4mR7uI7KNVHsGQU+OgTG5RGFPi3tBJpsKPvOPtg9poyav/BYWrB3GPQL4dW5YGGgalwZ79WukbKQ==",
"cpu": [ "cpu": [
"x64" "x64"
], ],
"license": "MIT",
"optional": true, "optional": true,
"os": [ "os": [
"linux" "linux"
@ -870,12 +885,13 @@
} }
}, },
"node_modules/@next/swc-win32-arm64-msvc": { "node_modules/@next/swc-win32-arm64-msvc": {
"version": "14.2.3", "version": "14.2.30",
"resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.2.3.tgz", "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.2.30.tgz",
"integrity": "sha512-AEHIw/dhAMLNFJFJIJIyOFDzrzI5bAjI9J26gbO5xhAKHYTZ9Or04BesFPXiAYXDNdrwTP2dQceYA4dL1geu8A==", "integrity": "sha512-6MMHi2Qc1Gkq+4YLXAgbYslE1f9zMGBikKMdmQRHXjkGPot1JY3n5/Qrbg40Uvbi8//wYnydPnyvNhI1DMUW1g==",
"cpu": [ "cpu": [
"arm64" "arm64"
], ],
"license": "MIT",
"optional": true, "optional": true,
"os": [ "os": [
"win32" "win32"
@ -885,12 +901,13 @@
} }
}, },
"node_modules/@next/swc-win32-ia32-msvc": { "node_modules/@next/swc-win32-ia32-msvc": {
"version": "14.2.3", "version": "14.2.30",
"resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.2.3.tgz", "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.2.30.tgz",
"integrity": "sha512-vga40n1q6aYb0CLrM+eEmisfKCR45ixQYXuBXxOOmmoV8sYST9k7E3US32FsY+CkkF7NtzdcebiFT4CHuMSyZw==", "integrity": "sha512-pVZMnFok5qEX4RT59mK2hEVtJX+XFfak+/rjHpyFh7juiT52r177bfFKhnlafm0UOSldhXjj32b+LZIOdswGTg==",
"cpu": [ "cpu": [
"ia32" "ia32"
], ],
"license": "MIT",
"optional": true, "optional": true,
"os": [ "os": [
"win32" "win32"
@ -900,12 +917,13 @@
} }
}, },
"node_modules/@next/swc-win32-x64-msvc": { "node_modules/@next/swc-win32-x64-msvc": {
"version": "14.2.3", "version": "14.2.30",
"resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.2.3.tgz", "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.2.30.tgz",
"integrity": "sha512-Q1/zm43RWynxrO7lW4ehciQVj+5ePBhOK+/K2P7pLFX3JaJ/IZVC69SHidrmZSOkqz7ECIOhhy7XhAFG4JYyHA==", "integrity": "sha512-4KCo8hMZXMjpTzs3HOqOGYYwAXymXIy7PEPAXNEcEOyKqkjiDlECumrWziy+JEF0Oi4ILHGxzgQ3YiMGG2t/Lg==",
"cpu": [ "cpu": [
"x64" "x64"
], ],
"license": "MIT",
"optional": true, "optional": true,
"os": [ "os": [
"win32" "win32"
@ -1472,10 +1490,11 @@
} }
}, },
"node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": {
"version": "2.0.1", "version": "2.0.2",
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz",
"integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==",
"dev": true, "dev": true,
"license": "MIT",
"dependencies": { "dependencies": {
"balanced-match": "^1.0.0" "balanced-match": "^1.0.0"
} }
@ -1776,22 +1795,24 @@
"dev": true "dev": true
}, },
"node_modules/brace-expansion": { "node_modules/brace-expansion": {
"version": "1.1.11", "version": "1.1.12",
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz",
"integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==",
"dev": true, "dev": true,
"license": "MIT",
"dependencies": { "dependencies": {
"balanced-match": "^1.0.0", "balanced-match": "^1.0.0",
"concat-map": "0.0.1" "concat-map": "0.0.1"
} }
}, },
"node_modules/braces": { "node_modules/braces": {
"version": "3.0.2", "version": "3.0.3",
"resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz",
"integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==",
"dev": true, "dev": true,
"license": "MIT",
"dependencies": { "dependencies": {
"fill-range": "^7.0.1" "fill-range": "^7.1.1"
}, },
"engines": { "engines": {
"node": ">=8" "node": ">=8"
@ -1936,10 +1957,11 @@
"dev": true "dev": true
}, },
"node_modules/cross-spawn": { "node_modules/cross-spawn": {
"version": "7.0.3", "version": "7.0.6",
"resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz",
"integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==",
"dev": true, "dev": true,
"license": "MIT",
"dependencies": { "dependencies": {
"path-key": "^3.1.0", "path-key": "^3.1.0",
"shebang-command": "^2.0.0", "shebang-command": "^2.0.0",
@ -2680,10 +2702,11 @@
} }
}, },
"node_modules/fill-range": { "node_modules/fill-range": {
"version": "7.0.1", "version": "7.1.1",
"resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz",
"integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==",
"dev": true, "dev": true,
"license": "MIT",
"dependencies": { "dependencies": {
"to-regex-range": "^5.0.1" "to-regex-range": "^5.0.1"
}, },
@ -3270,6 +3293,7 @@
"resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
"integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
"dev": true, "dev": true,
"license": "MIT",
"engines": { "engines": {
"node": ">=0.12.0" "node": ">=0.12.0"
} }
@ -3841,12 +3865,13 @@
} }
}, },
"node_modules/micromatch": { "node_modules/micromatch": {
"version": "4.0.5", "version": "4.0.8",
"resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz",
"integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==",
"dev": true, "dev": true,
"license": "MIT",
"dependencies": { "dependencies": {
"braces": "^3.0.2", "braces": "^3.0.3",
"picomatch": "^2.3.1" "picomatch": "^2.3.1"
}, },
"engines": { "engines": {
@ -3949,11 +3974,12 @@
"dev": true "dev": true
}, },
"node_modules/next": { "node_modules/next": {
"version": "14.2.3", "version": "14.2.30",
"resolved": "https://registry.npmjs.org/next/-/next-14.2.3.tgz", "resolved": "https://registry.npmjs.org/next/-/next-14.2.30.tgz",
"integrity": "sha512-dowFkFTR8v79NPJO4QsBUtxv0g9BrS/phluVpMAt2ku7H+cbcBJlopXjkWlwxrk/xGqMemr7JkGPGemPrLLX7A==", "integrity": "sha512-+COdu6HQrHHFQ1S/8BBsCag61jZacmvbuL2avHvQFbWa2Ox7bE+d8FyNgxRLjXQ5wtPyQwEmk85js/AuaG2Sbg==",
"license": "MIT",
"dependencies": { "dependencies": {
"@next/env": "14.2.3", "@next/env": "14.2.30",
"@swc/helpers": "0.5.5", "@swc/helpers": "0.5.5",
"busboy": "1.6.0", "busboy": "1.6.0",
"caniuse-lite": "^1.0.30001579", "caniuse-lite": "^1.0.30001579",
@ -3968,15 +3994,15 @@
"node": ">=18.17.0" "node": ">=18.17.0"
}, },
"optionalDependencies": { "optionalDependencies": {
"@next/swc-darwin-arm64": "14.2.3", "@next/swc-darwin-arm64": "14.2.30",
"@next/swc-darwin-x64": "14.2.3", "@next/swc-darwin-x64": "14.2.30",
"@next/swc-linux-arm64-gnu": "14.2.3", "@next/swc-linux-arm64-gnu": "14.2.30",
"@next/swc-linux-arm64-musl": "14.2.3", "@next/swc-linux-arm64-musl": "14.2.30",
"@next/swc-linux-x64-gnu": "14.2.3", "@next/swc-linux-x64-gnu": "14.2.30",
"@next/swc-linux-x64-musl": "14.2.3", "@next/swc-linux-x64-musl": "14.2.30",
"@next/swc-win32-arm64-msvc": "14.2.3", "@next/swc-win32-arm64-msvc": "14.2.30",
"@next/swc-win32-ia32-msvc": "14.2.3", "@next/swc-win32-ia32-msvc": "14.2.30",
"@next/swc-win32-x64-msvc": "14.2.3" "@next/swc-win32-x64-msvc": "14.2.30"
}, },
"peerDependencies": { "peerDependencies": {
"@opentelemetry/api": "^1.1.0", "@opentelemetry/api": "^1.1.0",
@ -4490,12 +4516,6 @@
"url": "https://github.com/sponsors/ljharb" "url": "https://github.com/sponsors/ljharb"
} }
}, },
"node_modules/regenerator-runtime": {
"version": "0.14.1",
"resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz",
"integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==",
"dev": true
},
"node_modules/regexp.prototype.flags": { "node_modules/regexp.prototype.flags": {
"version": "1.5.1", "version": "1.5.1",
"resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz", "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz",
@ -4993,6 +5013,7 @@
"resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
"integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
"dev": true, "dev": true,
"license": "MIT",
"dependencies": { "dependencies": {
"is-number": "^7.0.0" "is-number": "^7.0.0"
}, },

View File

@ -11,6 +11,7 @@
"browserslist": "defaults, not ie <= 11", "browserslist": "defaults, not ie <= 11",
"dependencies": { "dependencies": {
"@headlessui/react": "^2.1.0", "@headlessui/react": "^2.1.0",
"@heroicons/react": "^2.2.0",
"@tailwindcss/forms": "^0.5.3", "@tailwindcss/forms": "^0.5.3",
"@tailwindcss/postcss": "^4.1.7", "@tailwindcss/postcss": "^4.1.7",
"@types/node": "^20.10.8", "@types/node": "^20.10.8",

View File

@ -5,12 +5,15 @@ import { Pricing } from '@/components/Pricing'
import { PrimaryFeatures } from '@/components/PrimaryFeatures' import { PrimaryFeatures } from '@/components/PrimaryFeatures'
import { Reviews } from '@/components/Reviews' import { Reviews } from '@/components/Reviews'
import { SecondaryFeatures } from '@/components/SecondaryFeatures' import { SecondaryFeatures } from '@/components/SecondaryFeatures'
import Tractions from '@/components/Tractions'
import Benefits from '@/components/Benefits'
export default function Home() { export default function Home() {
return ( return (
<> <>
<Hero /> <Hero />
<PrimaryFeatures /> <Tractions />
<Benefits />
<SecondaryFeatures /> <SecondaryFeatures />
<CallToAction /> <CallToAction />
<Reviews /> <Reviews />

View File

@ -12,7 +12,7 @@ export default function NotFound() {
<h1 className="mt-2 text-3xl font-medium tracking-tight text-gray-900"> <h1 className="mt-2 text-3xl font-medium tracking-tight text-gray-900">
Page not found Page not found
</h1> </h1>
<p className="mt-2 text-lg text-gray-600"> <p className="mt-2 lg:text-lg text-base text-gray-600">
Sorry, we couldnt find the page youre looking for. Sorry, we couldnt find the page youre looking for.
</p> </p>
<Button href="/" variant="outline" className="mt-8"> <Button href="/" variant="outline" className="mt-8">

View File

@ -28,7 +28,7 @@ export function AuthLayout({
{title} {title}
</h1> </h1>
{subtitle && ( {subtitle && (
<p className="mt-3 text-center text-lg text-gray-600">{subtitle}</p> <p className="mt-3 text-center lg:text-lg text-base text-gray-600">{subtitle}</p>
)} )}
</div> </div>
<div className="-mx-4 mt-10 flex-auto bg-white px-4 py-10 shadow-2xl shadow-gray-900/10 sm:mx-0 sm:flex-none sm:rounded-5xl sm:p-24"> <div className="-mx-4 mt-10 flex-auto bg-white px-4 py-10 shadow-2xl shadow-gray-900/10 sm:mx-0 sm:flex-none sm:rounded-5xl sm:p-24">

View File

@ -8,7 +8,7 @@ import Benefits4 from '@/images/benefits/benefits4.jpg'
export default function Benefits() { export default function Benefits() {
return ( return (
<div className="bg-white lg:py-24 py-12"> <div className="bg-white py-12">
<div className="mx-auto max-w-2xl px-6 lg:max-w-7xl lg:px-8"> <div className="mx-auto max-w-2xl px-6 lg:max-w-7xl lg:px-8">
<Container> <Container>
<div className="mx-auto max-w-2xl lg:mx-0 lg:max-w-3xl"> <div className="mx-auto max-w-2xl lg:mx-0 lg:max-w-3xl">

View File

@ -16,7 +16,7 @@ export function CallToAction() {
<h2 className="text-3xl font-medium tracking-tight text-white sm:text-4xl"> <h2 className="text-3xl font-medium tracking-tight text-white sm:text-4xl">
Get your first tips today Get your first tips today
</h2> </h2>
<p className="mt-4 text-lg text-gray-300"> <p className="mt-4 lg:text-lg text-base text-gray-300">
It takes 30 seconds to sign up. Download the app and create an It takes 30 seconds to sign up. Download the app and create an
account today and well send you a tip guaranteed to double your account today and well send you a tip guaranteed to double your
first investment. first investment.

View File

@ -69,7 +69,7 @@ export function Faqs() {
> >
Frequently asked questions Frequently asked questions
</h2> </h2>
<p className="mt-2 text-lg text-gray-600"> <p className="mt-2 lg:text-lg text-base text-gray-600">
If you have anything else you want to ask,{' '} If you have anything else you want to ask,{' '}
<a <a
href="mailto:info@example.com" href="mailto:info@example.com"
@ -89,7 +89,7 @@ export function Faqs() {
<ul role="list" className="space-y-10"> <ul role="list" className="space-y-10">
{column.map((faq, faqIndex) => ( {column.map((faq, faqIndex) => (
<li key={faqIndex}> <li key={faqIndex}>
<h3 className="text-lg/6 font-semibold text-gray-900"> <h3 className="lg:text-lg text-base/6 font-semibold text-gray-900">
{faq.question} {faq.question}
</h3> </h3>
<p className="mt-4 text-sm text-gray-700">{faq.answer}</p> <p className="mt-4 text-sm text-gray-700">{faq.answer}</p>

View File

@ -16,7 +16,6 @@ import logoForbes from '@/images/logos/forbes.svg'
import logoHuffpost from '@/images/logos/huffpost.svg' import logoHuffpost from '@/images/logos/huffpost.svg'
import logoTechcrunch from '@/images/logos/techcrunch.svg' import logoTechcrunch from '@/images/logos/techcrunch.svg'
import logoWired from '@/images/logos/wired.svg' import logoWired from '@/images/logos/wired.svg'
import Benefits from './Benefits'
function BackgroundIllustration(props: React.ComponentPropsWithoutRef<'div'>) { function BackgroundIllustration(props: React.ComponentPropsWithoutRef<'div'>) {
let id = useId() let id = useId()
@ -106,9 +105,8 @@ function PlayIcon(props: React.ComponentPropsWithoutRef<'svg'>) {
export function Hero() { export function Hero() {
return ( return (
<div className="overflow-hidden lg:pt-24 lg:pb-24 pt-12 pb-24"> <div className="overflow-hidden lg:pt-24 lg:pb-24 py-12">
<HeroHome /> <HeroHome />
<Benefits />
</div> </div>
) )
} }

View File

@ -21,7 +21,7 @@ export default function HeroHome() {
<h1 className="text-3xl font-medium tracking-tight text-gray-900 lg:text-5xl"> <h1 className="text-3xl font-medium tracking-tight text-gray-900 lg:text-5xl">
Empowering Purpose-Driven Organizations. Empowering Purpose-Driven Organizations.
</h1> </h1>
<p className="mt-8 lg:text-lg text-base text-gray-600"> <p className="mt-8 lg:lg:text-lg text-base text-base text-gray-600">
Welcome to <span className={`font-semibold ${gradientText}`}>Engage OS</span>: the first all-in-one, white-label engagement platform to mobilize communities, engage supporters, scale impact, and fundraiseat a fraction of the cost. Welcome to <span className={`font-semibold ${gradientText}`}>Engage OS</span>: the first all-in-one, white-label engagement platform to mobilize communities, engage supporters, scale impact, and fundraiseat a fraction of the cost.
</p> </p>
<div className="mt-12 flex items-center justify-center gap-x-6 relative z-10"> <div className="mt-12 flex items-center justify-center gap-x-6 relative z-10">

View File

@ -225,7 +225,7 @@ export function Pricing() {
> >
Flat pricing, no management fees. Flat pricing, no management fees.
</h2> </h2>
<p className="mt-2 text-lg text-gray-600"> <p className="mt-2 lg:text-lg text-base text-gray-600">
Whether youre one person trying to get ahead or a big firm trying Whether youre one person trying to get ahead or a big firm trying
to take over the world, weve got a plan for you. to take over the world, weve got a plan for you.
</p> </p>

View File

@ -430,7 +430,7 @@ function FeaturesDesktop() {
)} )}
<div className="relative z-10 p-8"> <div className="relative z-10 p-8">
<feature.icon className="h-8 w-8" /> <feature.icon className="h-8 w-8" />
<h3 className="mt-6 text-lg font-semibold text-white"> <h3 className="mt-6 lg:text-lg text-base font-semibold text-white">
<Tab className="text-left data-selected:not-data-focus:outline-hidden"> <Tab className="text-left data-selected:not-data-focus:outline-hidden">
<span className="absolute inset-0 rounded-2xl" /> <span className="absolute inset-0 rounded-2xl" />
{feature.name} {feature.name}
@ -531,7 +531,7 @@ function FeaturesMobile() {
</PhoneFrame> </PhoneFrame>
<div className="absolute inset-x-0 bottom-0 bg-gray-800/95 p-6 backdrop-blur-sm sm:p-10"> <div className="absolute inset-x-0 bottom-0 bg-gray-800/95 p-6 backdrop-blur-sm sm:p-10">
<feature.icon className="h-8 w-8" /> <feature.icon className="h-8 w-8" />
<h3 className="mt-6 text-sm font-semibold text-white sm:text-lg"> <h3 className="mt-6 text-sm font-semibold text-white sm:lg:text-lg text-base">
{feature.name} {feature.name}
</h3> </h3>
<p className="mt-2 text-sm text-gray-400"> <p className="mt-2 text-sm text-gray-400">
@ -579,7 +579,7 @@ export function PrimaryFeatures() {
<h2 className="text-3xl font-medium tracking-tight text-white"> <h2 className="text-3xl font-medium tracking-tight text-white">
Every feature you need to win. Try it for yourself. Every feature you need to win. Try it for yourself.
</h2> </h2>
<p className="mt-2 text-lg text-gray-400"> <p className="mt-2 lg:text-lg text-base text-gray-400">
Pocket was built for investors like you who play by their own rules Pocket was built for investors like you who play by their own rules
and arent going to let SEC regulations get in the way of their and arent going to let SEC regulations get in the way of their
dreams. If other investing tools are afraid to build it, Pocket has dreams. If other investing tools are afraid to build it, Pocket has

View File

@ -150,7 +150,7 @@ function Review({
> >
<blockquote className="text-gray-900"> <blockquote className="text-gray-900">
<StarRating rating={rating} /> <StarRating rating={rating} />
<p className="mt-4 text-lg/6 font-semibold before:content-['“'] after:content-['”']"> <p className="mt-4 lg:text-lg text-base/6 font-semibold before:content-['“'] after:content-['”']">
{title} {title}
</p> </p>
<p className="mt-3 text-base/7">{body}</p> <p className="mt-3 text-base/7">{body}</p>
@ -284,7 +284,7 @@ export function Reviews() {
> >
Everyone is changing their life with Pocket. Everyone is changing their life with Pocket.
</h2> </h2>
<p className="mt-2 text-lg text-gray-600 sm:text-center"> <p className="mt-2 lg:text-lg text-base text-gray-600 sm:text-center">
Thousands of people have doubled their net-worth in the last 30 days. Thousands of people have doubled their net-worth in the last 30 days.
</p> </p>
<ReviewGrid /> <ReviewGrid />

View File

@ -1,43 +1,47 @@
import { useId } from 'react' import { useId } from 'react'
import { SquaresPlusIcon, BeakerIcon, CurrencyDollarIcon, AdjustmentsVerticalIcon, SparklesIcon, ServerStackIcon } from '@heroicons/react/24/solid'
import Image from 'next/image'
import AppScreenshot from '@/images/app_screenshot.png'
import { Container } from '@/components/Container' import { Container } from '@/components/Container'
const features = [ const features = [
{ {
name: 'Invest any amount', name: 'Engage Supporters with Community Tools.',
description: description:
'Whether its $1 or $1,000,000, we can put your money to work for you.', 'Inspire action through built-in community tools like forums, comments, and stories that spark meaningful participation.',
icon: DeviceArrowIcon, icon: SquaresPlusIcon,
}, },
{ {
name: 'Build a balanced portfolio', name: 'Train with AI-powered Learning Paths.',
description: description:
'Invest in different industries to find the most opportunities to win huge.', 'Deliver scalable training with AI-powered learning paths, auto-generated content, and multilingual support.',
icon: DeviceCardsIcon, icon: BeakerIcon,
}, },
{ {
name: 'Trade in real-time', name: 'Fundraise via Peer & Micro-Donations.',
description: description:
'Get insider tips on big stock moves and act on them within seconds.', 'Empower supporters to fundraise through peer-to-peer campaigns, micro-donations, and integrated payment solutions.',
icon: DeviceClockIcon, icon: CurrencyDollarIcon,
}, },
{ {
name: 'Profit from your network', name: 'Measure & Optimize Real-World Impact.',
description: description:
'Invite new insiders to get tips faster and beat even other Pocket users.', 'Track real impact with dashboards that visualize KPIs, community activity, and field-level data.',
icon: DeviceListIcon, icon: AdjustmentsVerticalIcon,
}, },
{ {
name: 'Encrypted and anonymized', name: 'White-Label Everything.',
description: description:
'Cutting-edge security technology that even the NSA doesnt know about keeps you hidden.', 'Own your brand with a fully customizable platform—your name, your colors, your digital HQ.',
icon: DeviceLockIcon, icon: SparklesIcon,
}, },
{ {
name: 'Portfolio tracking', name: 'Robust & Secure Infrastructure.',
description: description:
'Watch your investments grow exponentially, leaving other investors in the dust.', 'Host on your terms via decentralized, privacy-respecting infrastructure built for trust and security.',
icon: DeviceChartIcon, icon: ServerStackIcon,
}, },
] ]
@ -191,17 +195,30 @@ export function SecondaryFeatures() {
<section <section
id="secondary-features" id="secondary-features"
aria-label="Features for building a portfolio" aria-label="Features for building a portfolio"
className="py-20 sm:py-32" className="pt-12 pb-24"
> >
<Container> <Container>
<div className="mx-auto max-w-2xl sm:text-center"> <div className="mx-auto max-w-4xl sm:text-center">
<h2 className="text-3xl font-medium tracking-tight text-gray-900"> <h2 className="lg:text-4xl text-3xl font-medium tracking-tight text-gray-900">
Now is the time to build your portfolio. The Platform Built for Purpose-driven Organizations
</h2> </h2>
<p className="mt-2 text-lg text-gray-600"> <p className="mt-4 lg:text-lg text-base text-gray-600">
With typical market returns, you have to start young to secure your Engage OS is the first plug-and-play engagement infrastructure built for civil society. From Red Cross OS to Montessori OS, any org can launch their own digital headquartersno tech team needed.
future. With Pocket, its never too late to build your nest egg.
</p> </p>
</div>
<div className="relative overflow-hidden pt-16">
<div className="mx-auto max-w-7xl px-6 lg:px-8">
<Image
alt="App screenshot"
src={AppScreenshot}
width={2432}
height={1442}
className="mb-[-12%] rounded-xl shadow-2xl ring-1 ring-gray-900/10"
/>
<div aria-hidden="true" className="relative">
<div className="absolute -inset-x-20 bottom-0 bg-linear-to-t from-white pt-[7%]" />
</div>
</div>
</div> </div>
<ul <ul
role="list" role="list"

View File

@ -0,0 +1,79 @@
import Image from "next/image"
import Traction from "@/images/tractions/tractions.jpg"
import logoForbes from "@/images/logos/forbes.svg"
import logoTechcrunch from "@/images/logos/techcrunch.svg"
import logoWired from "@/images/logos/wired.svg"
import logoCnn from "@/images/logos/cnn.svg"
import logoBbc from "@/images/logos/bbc.svg"
import logoCbs from "@/images/logos/cbs.svg"
import logoFastCompany from "@/images/logos/fast-company.svg"
import logoHuffpost from "@/images/logos/huffpost.svg"
import clsx from "clsx"
const stats = [
{ id: 1, name: 'Raised in sponsorship.', value: '7M+' },
{ id: 2, name: 'Views from educational partners.', value: '3B+' },
{ id: 3, name: 'Users deployed.', value: '300K' },
{ id: 4, name: 'Revenues paid to NGOs', value: '$70M' },
]
export default function Tractions() {
return (
<div className="relative bg-white py-12">
<div className="mx-auto grid max-w-7xl lg:grid-cols-2">
{/* LEFT IMAGE + LOGO */}
<div className="flex flex-col items-center lg:items-start gap-8 px-6 pb-12 lg:px-8">
<div className="w-full ring-1 ring-black/15 rounded-3xl overflow-hidden max-lg:rounded-t-4xl lg:rounded-tl-4xl">
<Image
alt=""
src={Traction}
className="aspect-[3/2] object-cover w-full h-auto"
/>
</div>
<div className="w-full pr-6 lg:pr-12">
<ul
role="list"
className="mt-6 flex flex-wrap justify-center gap-x-10 gap-y-8 lg:justify-start"
>
{[
['Forbes', logoForbes],
['TechCrunch', logoTechcrunch],
['Wired', logoWired],
['CNN', logoCnn, 'hidden xl:block'],
['BBC', logoBbc],
['CBS', logoCbs],
['Fast Company', logoFastCompany],
['HuffPost', logoHuffpost, 'hidden xl:block'],
].map(([name, logo, className]) => (
<li key={name} className={clsx('flex', className)}>
<Image src={logo} alt={name} className="h-8 w-auto" unoptimized />
</li>
))}
</ul>
</div>
</div>
{/* RIGHT TEXT BLOCK */}
<div className="px-6 lg:px-8">
<div className="mx-auto max-w-2xl lg:mr-0 lg:max-w-lg">
<h2 className="text-base/8 font-semibold text-gray-900">Our track record</h2>
<p className="mt-2 text-4xl font-medium tracking-tight text-gray-900 sm:text-5xl">
Trusted by thousands of creators worldwide
</p>
<p className="mt-6 lg:text-lg text-base text-gray-600">
Engage OS powers the digital headquarters for over 300,000 users across 50+ countries. From grassroots NGOs to global movements, our platform is built to scale impact, not just numbers.
</p>
<dl className="mt-16 grid max-w-xl grid-cols-1 gap-8 sm:mt-20 sm:grid-cols-2 xl:mt-16">
{stats.map((stat) => (
<div key={stat.id} className="flex flex-col gap-y-3 border-l border-gray-900/10 pl-6">
<dt className="text-sm/6 text-gray-600">{stat.name}</dt>
<dd className="order-first text-3xl font-semibold tracking-tight text-gray-900">{stat.value}</dd>
</div>
))}
</dl>
</div>
</div>
</div>
</div>
)
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 311 KiB