new file: src/components/EasterEggsReact.jsx

This commit is contained in:
Anderson 2026-01-24 04:52:43 +00:00 committed by GitHub
parent fdfd70e55c
commit d7fc469a3d
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
41 changed files with 2662 additions and 61 deletions

View file

@ -1,5 +1,9 @@
// @ts-check
import { defineConfig } from 'astro/config';
import react from '@astrojs/react';
// https://astro.build/config
export default defineConfig({});
export default defineConfig({
integrations: [react()]
});

BIN
contribute.zip Normal file

Binary file not shown.

BIN
events.zip Normal file

Binary file not shown.

BIN
gameforge.zip Normal file

Binary file not shown.

607
package-lock.json generated
View file

@ -8,7 +8,12 @@
"name": "aethex.us",
"version": "0.0.1",
"dependencies": {
"astro": "^5.16.11"
"@astrojs/react": "^4.4.2",
"@types/react": "^19.2.9",
"@types/react-dom": "^19.2.3",
"astro": "^5.16.11",
"react": "^19.2.3",
"react-dom": "^19.2.3"
}
},
"node_modules/@astrojs/compiler": {
@ -64,6 +69,26 @@
"node": "18.20.8 || ^20.3.0 || >=22.0.0"
}
},
"node_modules/@astrojs/react": {
"version": "4.4.2",
"resolved": "https://registry.npmjs.org/@astrojs/react/-/react-4.4.2.tgz",
"integrity": "sha512-1tl95bpGfuaDMDn8O3x/5Dxii1HPvzjvpL2YTuqOOrQehs60I2DKiDgh1jrKc7G8lv+LQT5H15V6QONQ+9waeQ==",
"license": "MIT",
"dependencies": {
"@vitejs/plugin-react": "^4.7.0",
"ultrahtml": "^1.6.0",
"vite": "^6.4.1"
},
"engines": {
"node": "18.20.8 || ^20.3.0 || >=22.0.0"
},
"peerDependencies": {
"@types/react": "^17.0.50 || ^18.0.21 || ^19.0.0",
"@types/react-dom": "^17.0.17 || ^18.0.6 || ^19.0.0",
"react": "^17.0.2 || ^18.0.0 || ^19.0.0",
"react-dom": "^17.0.2 || ^18.0.0 || ^19.0.0"
}
},
"node_modules/@astrojs/telemetry": {
"version": "3.3.0",
"resolved": "https://registry.npmjs.org/@astrojs/telemetry/-/telemetry-3.3.0.tgz",
@ -82,6 +107,167 @@
"node": "18.20.8 || ^20.3.0 || >=22.0.0"
}
},
"node_modules/@babel/code-frame": {
"version": "7.28.6",
"resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.28.6.tgz",
"integrity": "sha512-JYgintcMjRiCvS8mMECzaEn+m3PfoQiyqukOMCCVQtoJGYJw8j/8LBJEiqkHLkfwCcs74E3pbAUFNg7d9VNJ+Q==",
"license": "MIT",
"dependencies": {
"@babel/helper-validator-identifier": "^7.28.5",
"js-tokens": "^4.0.0",
"picocolors": "^1.1.1"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/compat-data": {
"version": "7.28.6",
"resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.6.tgz",
"integrity": "sha512-2lfu57JtzctfIrcGMz992hyLlByuzgIk58+hhGCxjKZ3rWI82NnVLjXcaTqkI2NvlcvOskZaiZ5kjUALo3Lpxg==",
"license": "MIT",
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/core": {
"version": "7.28.6",
"resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.6.tgz",
"integrity": "sha512-H3mcG6ZDLTlYfaSNi0iOKkigqMFvkTKlGUYlD8GW7nNOYRrevuA46iTypPyv+06V3fEmvvazfntkBU34L0azAw==",
"license": "MIT",
"peer": true,
"dependencies": {
"@babel/code-frame": "^7.28.6",
"@babel/generator": "^7.28.6",
"@babel/helper-compilation-targets": "^7.28.6",
"@babel/helper-module-transforms": "^7.28.6",
"@babel/helpers": "^7.28.6",
"@babel/parser": "^7.28.6",
"@babel/template": "^7.28.6",
"@babel/traverse": "^7.28.6",
"@babel/types": "^7.28.6",
"@jridgewell/remapping": "^2.3.5",
"convert-source-map": "^2.0.0",
"debug": "^4.1.0",
"gensync": "^1.0.0-beta.2",
"json5": "^2.2.3",
"semver": "^6.3.1"
},
"engines": {
"node": ">=6.9.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/babel"
}
},
"node_modules/@babel/core/node_modules/semver": {
"version": "6.3.1",
"resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
"integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
"license": "ISC",
"bin": {
"semver": "bin/semver.js"
}
},
"node_modules/@babel/generator": {
"version": "7.28.6",
"resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.6.tgz",
"integrity": "sha512-lOoVRwADj8hjf7al89tvQ2a1lf53Z+7tiXMgpZJL3maQPDxh0DgLMN62B2MKUOFcoodBHLMbDM6WAbKgNy5Suw==",
"license": "MIT",
"dependencies": {
"@babel/parser": "^7.28.6",
"@babel/types": "^7.28.6",
"@jridgewell/gen-mapping": "^0.3.12",
"@jridgewell/trace-mapping": "^0.3.28",
"jsesc": "^3.0.2"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/helper-compilation-targets": {
"version": "7.28.6",
"resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.28.6.tgz",
"integrity": "sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==",
"license": "MIT",
"dependencies": {
"@babel/compat-data": "^7.28.6",
"@babel/helper-validator-option": "^7.27.1",
"browserslist": "^4.24.0",
"lru-cache": "^5.1.1",
"semver": "^6.3.1"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/helper-compilation-targets/node_modules/lru-cache": {
"version": "5.1.1",
"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
"integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
"license": "ISC",
"dependencies": {
"yallist": "^3.0.2"
}
},
"node_modules/@babel/helper-compilation-targets/node_modules/semver": {
"version": "6.3.1",
"resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
"integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
"license": "ISC",
"bin": {
"semver": "bin/semver.js"
}
},
"node_modules/@babel/helper-globals": {
"version": "7.28.0",
"resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz",
"integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==",
"license": "MIT",
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/helper-module-imports": {
"version": "7.28.6",
"resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz",
"integrity": "sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==",
"license": "MIT",
"dependencies": {
"@babel/traverse": "^7.28.6",
"@babel/types": "^7.28.6"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/helper-module-transforms": {
"version": "7.28.6",
"resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.6.tgz",
"integrity": "sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==",
"license": "MIT",
"dependencies": {
"@babel/helper-module-imports": "^7.28.6",
"@babel/helper-validator-identifier": "^7.28.5",
"@babel/traverse": "^7.28.6"
},
"engines": {
"node": ">=6.9.0"
},
"peerDependencies": {
"@babel/core": "^7.0.0"
}
},
"node_modules/@babel/helper-plugin-utils": {
"version": "7.28.6",
"resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.28.6.tgz",
"integrity": "sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==",
"license": "MIT",
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/helper-string-parser": {
"version": "7.27.1",
"resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz",
@ -100,6 +286,28 @@
"node": ">=6.9.0"
}
},
"node_modules/@babel/helper-validator-option": {
"version": "7.27.1",
"resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz",
"integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==",
"license": "MIT",
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/helpers": {
"version": "7.28.6",
"resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.6.tgz",
"integrity": "sha512-xOBvwq86HHdB7WUDTfKfT/Vuxh7gElQ+Sfti2Cy6yIWNW05P8iUslOVcZ4/sKbE+/jQaukQAdz/gf3724kYdqw==",
"license": "MIT",
"dependencies": {
"@babel/template": "^7.28.6",
"@babel/types": "^7.28.6"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/parser": {
"version": "7.28.6",
"resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.6.tgz",
@ -115,6 +323,68 @@
"node": ">=6.0.0"
}
},
"node_modules/@babel/plugin-transform-react-jsx-self": {
"version": "7.27.1",
"resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.27.1.tgz",
"integrity": "sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==",
"license": "MIT",
"dependencies": {
"@babel/helper-plugin-utils": "^7.27.1"
},
"engines": {
"node": ">=6.9.0"
},
"peerDependencies": {
"@babel/core": "^7.0.0-0"
}
},
"node_modules/@babel/plugin-transform-react-jsx-source": {
"version": "7.27.1",
"resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.27.1.tgz",
"integrity": "sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==",
"license": "MIT",
"dependencies": {
"@babel/helper-plugin-utils": "^7.27.1"
},
"engines": {
"node": ">=6.9.0"
},
"peerDependencies": {
"@babel/core": "^7.0.0-0"
}
},
"node_modules/@babel/template": {
"version": "7.28.6",
"resolved": "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz",
"integrity": "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==",
"license": "MIT",
"dependencies": {
"@babel/code-frame": "^7.28.6",
"@babel/parser": "^7.28.6",
"@babel/types": "^7.28.6"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/traverse": {
"version": "7.28.6",
"resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.6.tgz",
"integrity": "sha512-fgWX62k02qtjqdSNTAGxmKYY/7FSL9WAS1o2Hu5+I5m9T0yxZzr4cnrfXQ/MX0rIifthCSs6FKTlzYbJcPtMNg==",
"license": "MIT",
"dependencies": {
"@babel/code-frame": "^7.28.6",
"@babel/generator": "^7.28.6",
"@babel/helper-globals": "^7.28.0",
"@babel/parser": "^7.28.6",
"@babel/template": "^7.28.6",
"@babel/types": "^7.28.6",
"debug": "^4.3.1"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/types": {
"version": "7.28.6",
"resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.6.tgz",
@ -1032,18 +1302,63 @@
"url": "https://opencollective.com/libvips"
}
},
"node_modules/@jridgewell/gen-mapping": {
"version": "0.3.13",
"resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz",
"integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==",
"license": "MIT",
"dependencies": {
"@jridgewell/sourcemap-codec": "^1.5.0",
"@jridgewell/trace-mapping": "^0.3.24"
}
},
"node_modules/@jridgewell/remapping": {
"version": "2.3.5",
"resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz",
"integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==",
"license": "MIT",
"dependencies": {
"@jridgewell/gen-mapping": "^0.3.5",
"@jridgewell/trace-mapping": "^0.3.24"
}
},
"node_modules/@jridgewell/resolve-uri": {
"version": "3.1.2",
"resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
"integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==",
"license": "MIT",
"engines": {
"node": ">=6.0.0"
}
},
"node_modules/@jridgewell/sourcemap-codec": {
"version": "1.5.5",
"resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz",
"integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==",
"license": "MIT"
},
"node_modules/@jridgewell/trace-mapping": {
"version": "0.3.31",
"resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz",
"integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==",
"license": "MIT",
"dependencies": {
"@jridgewell/resolve-uri": "^3.1.0",
"@jridgewell/sourcemap-codec": "^1.4.14"
}
},
"node_modules/@oslojs/encoding": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/@oslojs/encoding/-/encoding-1.1.0.tgz",
"integrity": "sha512-70wQhgYmndg4GCPxPPxPGevRKqTIJ2Nh4OkiMWmDAVYsTQ+Ta7Sq+rPevXyXGdzr30/qZBnyOalCszoMxlyldQ==",
"license": "MIT"
},
"node_modules/@rolldown/pluginutils": {
"version": "1.0.0-beta.27",
"resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.27.tgz",
"integrity": "sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA==",
"license": "MIT"
},
"node_modules/@rollup/pluginutils": {
"version": "5.3.0",
"resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.3.0.tgz",
@ -1464,6 +1779,47 @@
"integrity": "sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==",
"license": "MIT"
},
"node_modules/@types/babel__core": {
"version": "7.20.5",
"resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz",
"integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==",
"license": "MIT",
"dependencies": {
"@babel/parser": "^7.20.7",
"@babel/types": "^7.20.7",
"@types/babel__generator": "*",
"@types/babel__template": "*",
"@types/babel__traverse": "*"
}
},
"node_modules/@types/babel__generator": {
"version": "7.27.0",
"resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz",
"integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==",
"license": "MIT",
"dependencies": {
"@babel/types": "^7.0.0"
}
},
"node_modules/@types/babel__template": {
"version": "7.4.4",
"resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz",
"integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==",
"license": "MIT",
"dependencies": {
"@babel/parser": "^7.1.0",
"@babel/types": "^7.0.0"
}
},
"node_modules/@types/babel__traverse": {
"version": "7.28.0",
"resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz",
"integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==",
"license": "MIT",
"dependencies": {
"@babel/types": "^7.28.2"
}
},
"node_modules/@types/debug": {
"version": "4.1.12",
"resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz",
@ -1512,6 +1868,26 @@
"@types/unist": "*"
}
},
"node_modules/@types/react": {
"version": "19.2.9",
"resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.9.tgz",
"integrity": "sha512-Lpo8kgb/igvMIPeNV2rsYKTgaORYdO1XGVZ4Qz3akwOj0ySGYMPlQWa8BaLn0G63D1aSaAQ5ldR06wCpChQCjA==",
"license": "MIT",
"peer": true,
"dependencies": {
"csstype": "^3.2.2"
}
},
"node_modules/@types/react-dom": {
"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==",
"license": "MIT",
"peer": true,
"peerDependencies": {
"@types/react": "^19.2.0"
}
},
"node_modules/@types/unist": {
"version": "3.0.3",
"resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz",
@ -1524,6 +1900,26 @@
"integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==",
"license": "ISC"
},
"node_modules/@vitejs/plugin-react": {
"version": "4.7.0",
"resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.7.0.tgz",
"integrity": "sha512-gUu9hwfWvvEDBBmgtAowQCojwZmJ5mcLn3aufeCsitijs3+f2NsrPtlAWIR6OPiqljl96GVCUbLe0HyqIpVaoA==",
"license": "MIT",
"dependencies": {
"@babel/core": "^7.28.0",
"@babel/plugin-transform-react-jsx-self": "^7.27.1",
"@babel/plugin-transform-react-jsx-source": "^7.27.1",
"@rolldown/pluginutils": "1.0.0-beta.27",
"@types/babel__core": "^7.20.5",
"react-refresh": "^0.17.0"
},
"engines": {
"node": "^14.18.0 || >=16.0.0"
},
"peerDependencies": {
"vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0"
}
},
"node_modules/acorn": {
"version": "8.15.0",
"resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz",
@ -1771,6 +2167,15 @@
"integrity": "sha512-kwDPIFCGx0NZHog36dj+tHiwP4QMzsZ3AgMViUBKI0+V5n4U0ufTCUMhnQ04diaRI8EX/QcPfql7zlhZ7j4zgg==",
"license": "MIT"
},
"node_modules/baseline-browser-mapping": {
"version": "2.9.17",
"resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.9.17.tgz",
"integrity": "sha512-agD0MgJFUP/4nvjqzIB29zRPUuCF7Ge6mEv9s8dHrtYD7QWXRcx75rOADE/d5ah1NI+0vkDl0yorDd5U852IQQ==",
"license": "Apache-2.0",
"bin": {
"baseline-browser-mapping": "dist/cli.js"
}
},
"node_modules/boolbase": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz",
@ -1799,6 +2204,40 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/browserslist": {
"version": "4.28.1",
"resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz",
"integrity": "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==",
"funding": [
{
"type": "opencollective",
"url": "https://opencollective.com/browserslist"
},
{
"type": "tidelift",
"url": "https://tidelift.com/funding/github/npm/browserslist"
},
{
"type": "github",
"url": "https://github.com/sponsors/ai"
}
],
"license": "MIT",
"peer": true,
"dependencies": {
"baseline-browser-mapping": "^2.9.0",
"caniuse-lite": "^1.0.30001759",
"electron-to-chromium": "^1.5.263",
"node-releases": "^2.0.27",
"update-browserslist-db": "^1.2.0"
},
"bin": {
"browserslist": "cli.js"
},
"engines": {
"node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
}
},
"node_modules/camelcase": {
"version": "8.0.0",
"resolved": "https://registry.npmjs.org/camelcase/-/camelcase-8.0.0.tgz",
@ -1811,6 +2250,26 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/caniuse-lite": {
"version": "1.0.30001766",
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001766.tgz",
"integrity": "sha512-4C0lfJ0/YPjJQHagaE9x2Elb69CIqEPZeG0anQt9SIvIoOH4a4uaRl73IavyO+0qZh6MDLH//DrXThEYKHkmYA==",
"funding": [
{
"type": "opencollective",
"url": "https://opencollective.com/browserslist"
},
{
"type": "tidelift",
"url": "https://tidelift.com/funding/github/npm/caniuse-lite"
},
{
"type": "github",
"url": "https://github.com/sponsors/ai"
}
],
"license": "CC-BY-4.0"
},
"node_modules/ccount": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz",
@ -1939,6 +2398,12 @@
"integrity": "sha512-L3sHRo1pXXEqX8VU28kfgUY+YGsk09hPqZiZmLacNib6XNTCM8ubYeT7ryXQw8asB1sKgcU5lkB7ONug08aB8w==",
"license": "ISC"
},
"node_modules/convert-source-map": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz",
"integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==",
"license": "MIT"
},
"node_modules/cookie": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/cookie/-/cookie-1.1.1.tgz",
@ -2053,6 +2518,12 @@
"integrity": "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==",
"license": "CC0-1.0"
},
"node_modules/csstype": {
"version": "3.2.3",
"resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz",
"integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==",
"license": "MIT"
},
"node_modules/debug": {
"version": "4.4.3",
"resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz",
@ -2236,6 +2707,12 @@
"node": ">=4"
}
},
"node_modules/electron-to-chromium": {
"version": "1.5.278",
"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.278.tgz",
"integrity": "sha512-dQ0tM1svDRQOwxnXxm+twlGTjr9Upvt8UFWAgmLsxEzFQxhbti4VwxmMjsDxVC51Zo84swW7FVCXEV+VAkhuPw==",
"license": "ISC"
},
"node_modules/emoji-regex": {
"version": "10.6.0",
"resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz",
@ -2301,6 +2778,15 @@
"@esbuild/win32-x64": "0.25.12"
}
},
"node_modules/escalade": {
"version": "3.2.0",
"resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz",
"integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==",
"license": "MIT",
"engines": {
"node": ">=6"
}
},
"node_modules/escape-string-regexp": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz",
@ -2395,6 +2881,15 @@
"node": "^8.16.0 || ^10.6.0 || >=11.0.0"
}
},
"node_modules/gensync": {
"version": "1.0.0-beta.2",
"resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
"integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==",
"license": "MIT",
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/get-east-asian-width": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.4.0.tgz",
@ -2717,6 +3212,12 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/js-tokens": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
"integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
"license": "MIT"
},
"node_modules/js-yaml": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz",
@ -2729,6 +3230,30 @@
"js-yaml": "bin/js-yaml.js"
}
},
"node_modules/jsesc": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz",
"integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==",
"license": "MIT",
"bin": {
"jsesc": "bin/jsesc"
},
"engines": {
"node": ">=6"
}
},
"node_modules/json5": {
"version": "2.2.3",
"resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
"integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
"license": "MIT",
"bin": {
"json5": "lib/cli.js"
},
"engines": {
"node": ">=6"
}
},
"node_modules/kleur": {
"version": "3.0.3",
"resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz",
@ -3648,6 +4173,12 @@
"integrity": "sha512-8DY+kFsDkNXy1sJglUfuODx1/opAGJGyrTuFqEoN90oRc2Vk0ZbD4K2qmKXBBEhZQzdKHIVfEJpDU8Ak2NJEvQ==",
"license": "MIT"
},
"node_modules/node-releases": {
"version": "2.0.27",
"resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz",
"integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==",
"license": "MIT"
},
"node_modules/normalize-path": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
@ -3872,6 +4403,38 @@
"integrity": "sha512-b484I/7b8rDEdSDKckSSBA8knMpcdsXudlE/LNL639wFoHKwLbEkQFZHWEYwDC0wa0FKUcCY+GAF73Z7wxNVFA==",
"license": "MIT"
},
"node_modules/react": {
"version": "19.2.3",
"resolved": "https://registry.npmjs.org/react/-/react-19.2.3.tgz",
"integrity": "sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA==",
"license": "MIT",
"peer": true,
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/react-dom": {
"version": "19.2.3",
"resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.3.tgz",
"integrity": "sha512-yELu4WmLPw5Mr/lmeEpox5rw3RETacE++JgHqQzd2dg+YbJuat3jH4ingc+WPZhxaoFzdv9y33G+F7Nl5O0GBg==",
"license": "MIT",
"peer": true,
"dependencies": {
"scheduler": "^0.27.0"
},
"peerDependencies": {
"react": "^19.2.3"
}
},
"node_modules/react-refresh": {
"version": "0.17.0",
"resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.17.0.tgz",
"integrity": "sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==",
"license": "MIT",
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/readdirp": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/readdirp/-/readdirp-5.0.0.tgz",
@ -4166,6 +4729,12 @@
"node": ">=11.0.0"
}
},
"node_modules/scheduler": {
"version": "0.27.0",
"resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz",
"integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==",
"license": "MIT"
},
"node_modules/semver": {
"version": "7.7.3",
"resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz",
@ -4718,6 +5287,36 @@
}
}
},
"node_modules/update-browserslist-db": {
"version": "1.2.3",
"resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz",
"integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==",
"funding": [
{
"type": "opencollective",
"url": "https://opencollective.com/browserslist"
},
{
"type": "tidelift",
"url": "https://tidelift.com/funding/github/npm/browserslist"
},
{
"type": "github",
"url": "https://github.com/sponsors/ai"
}
],
"license": "MIT",
"dependencies": {
"escalade": "^3.2.0",
"picocolors": "^1.1.1"
},
"bin": {
"update-browserslist-db": "cli.js"
},
"peerDependencies": {
"browserslist": ">= 4.21.0"
}
},
"node_modules/vfile": {
"version": "6.0.3",
"resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz",
@ -4911,6 +5510,12 @@
"integrity": "sha512-147y/6YNh+tlp6nd/2pWq38i9h6mz/EuQ6njIrmW8D1BS5nCqs0P6DG+m6zTGnNz5I+uhZ0SHxBs9BsPrwcKDA==",
"license": "MIT"
},
"node_modules/yallist": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
"integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
"license": "ISC"
},
"node_modules/yargs-parser": {
"version": "21.1.1",
"resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz",

View file

@ -9,6 +9,11 @@
"astro": "astro"
},
"dependencies": {
"astro": "^5.16.11"
"@astrojs/react": "^4.4.2",
"@types/react": "^19.2.9",
"@types/react-dom": "^19.2.3",
"astro": "^5.16.11",
"react": "^19.2.3",
"react-dom": "^19.2.3"
}
}
}

View file

@ -1,3 +1,102 @@
/* === Utility/Demo Page Hero Styles === */
.tool-hero {
position: relative;
text-align: center;
padding: 64px 0 36px 0;
margin-bottom: 0.5em;
z-index: 1;
}
.tool-hero-bg {
position: absolute;
top: 0; left: 0; width: 100%; height: 100%;
z-index: 0;
opacity: 0.9;
background: linear-gradient(120deg, #181818 60%, #222 100%);
}
.tool-hero-bg-random { background: linear-gradient(120deg, #0066ff 0%, #ff4d4d 100%); opacity: 0.18; }
.tool-hero-bg-live { background: linear-gradient(120deg, #ff4d4d 0%, #ffa500 100%); opacity: 0.18; }
.tool-hero-bg-search { background: linear-gradient(120deg, #6cf 0%, #222 100%); opacity: 0.18; }
.tool-hero-bg-sso { background: linear-gradient(120deg, #0066ff 0%, #ffc700 100%); opacity: 0.18; }
.tool-hero-bg-fame { background: linear-gradient(120deg, #ffc700 0%, #ff4d4d 100%); opacity: 0.18; }
.tool-hero-bg-timeline { background: linear-gradient(120deg, #6cf 0%, #ffa500 100%); opacity: 0.18; }
.tool-hero-bg-egg { background: linear-gradient(120deg, #ff4d4d 0%, #fff 100%); opacity: 0.18; }
.tool-hero-bg-theme { background: linear-gradient(120deg, #6cf 0%, #ffc700 100%); opacity: 0.18; }
.tool-hero-title {
position: relative;
z-index: 1;
font-size: 2.5em;
font-weight: 900;
letter-spacing: 4px;
margin-bottom: 0.2em;
margin-top: 0.2em;
}
.tool-hero-desc {
position: relative;
z-index: 1;
font-size: 1.15em;
color: #bbb;
max-width: 600px;
margin: 0 auto 0.5em auto;
font-weight: 400;
letter-spacing: 1px;
}
.tool-content {
display: flex;
flex-direction: column;
align-items: center;
justify-content: flex-start;
min-height: 220px;
margin-bottom: 2em;
}
/* === Theme Switcher Styles === */
.theme-switcher {
display: flex;
align-items: center;
gap: 1.2em;
background: rgba(20, 20, 30, 0.98);
border-radius: 18px;
box-shadow: 0 2px 16px #0006;
padding: 1.2em 2em;
margin: 2em auto 1em auto;
max-width: 420px;
color: #fff;
font-size: 1.1em;
border: 1.5px solid #333;
}
.theme-switcher span {
font-weight: 700;
letter-spacing: 1px;
margin-right: 0.7em;
}
.theme-btn {
background: linear-gradient(135deg, #222 60%, #333 100%);
color: #6cf;
border: 1.5px solid #6cf;
border-radius: 12px;
padding: 0.5em 1.3em;
font-size: 1em;
font-family: inherit;
font-weight: 700;
margin-right: 0.5em;
cursor: pointer;
transition: background 0.2s, color 0.2s, box-shadow 0.2s, border 0.2s;
box-shadow: 0 2px 8px #0066ff22;
}
.theme-btn:last-child {
margin-right: 0;
}
.theme-btn:hover, .theme-btn:focus {
background: linear-gradient(135deg, #0066ff 60%, #003380 100%);
color: #fff;
border-color: #ffc700;
box-shadow: 0 4px 16px #0066ff44;
outline: none;
}
.theme-btn:active {
background: #222;
color: #ffc700;
border-color: #ff4d4d;
}
@import url('https://fonts.googleapis.com/css2?family=Roboto+Mono:wght@300;400;700;900&display=swap');
* { margin: 0; padding: 0; box-sizing: border-box; }
body {

View file

@ -0,0 +1,45 @@
---
// Easter eggs and badge system for AeThex (mockup)
let found = false;
function revealEgg() {
found = true;
alert('🥚 You found an AeThex Easter Egg! Badge unlocked!');
}
---
<div class="easter-eggs">
<button class="egg-btn" client:click={revealEgg}>🔍 Find the Secret Egg</button>
{found && <div class="egg-badge">🥚 AeThex Egg Hunter Badge!</div>}
</div>
<style>
.easter-eggs {
display: flex;
flex-direction: column;
align-items: center;
margin: 2em 0 1em 0;
}
.egg-btn {
background: #ffd580;
color: #222;
border: none;
border-radius: 16px;
padding: 1em 2em;
font-size: 1.1em;
font-weight: 700;
cursor: pointer;
box-shadow: 0 2px 16px #0006;
transition: background 0.2s, color 0.2s;
}
.egg-btn:hover {
background: #ff1a1a;
color: #fff;
}
.egg-badge {
margin-top: 1.2em;
font-size: 1.2em;
color: #ff1a1a;
font-weight: 700;
background: #fff3;
border-radius: 12px;
padding: 0.5em 1.2em;
}
</style>

View file

@ -0,0 +1,19 @@
import React, { useState } from 'react';
export default function EasterEggsReact() {
const [found, setFound] = useState(false);
function revealEgg() {
setFound(true);
alert('🥚 You found an AeThex Easter Egg! Badge unlocked!');
}
return (
<div className="easter-eggs">
<button className="egg-btn" onClick={revealEgg}>
🔍 Find the Secret Egg
</button>
{found && <div className="egg-badge">🥚 AeThex Egg Hunter Badge!</div>}
</div>
);
}

View file

@ -0,0 +1,53 @@
---
// Interactive ecosystem timeline for AeThex (mockup)
const events = [
{ date: '2022', event: 'AeThex Foundation launched' },
{ date: '2023', event: 'AeThex Corporation formed' },
{ date: '2024', event: 'Labs released Nexus Engine v2.0' },
{ date: '2025', event: 'Gameforge beta launched' },
{ date: '2026', event: 'Educate platform live' }
];
---
<div class="ecosystem-timeline">
<h3>AeThex Ecosystem Timeline</h3>
<ul>
{events.map(e => (
<li><span class="timeline-date">{e.date}</span> — {e.event}</li>
))}
</ul>
</div>
<style>
.ecosystem-timeline {
background: rgba(30,30,40,0.98);
border-radius: 18px;
box-shadow: 0 2px 16px #0006;
padding: 1.2em 1.5em;
margin: 2em auto 1em auto;
max-width: 420px;
color: #fff;
font-size: 1em;
border: 1.5px solid #333;
}
.ecosystem-timeline h3 {
margin-top: 0;
font-size: 1.15em;
letter-spacing: 0.02em;
color: #ffd580;
}
.ecosystem-timeline ul {
list-style: none;
padding: 0;
margin: 0.5em 0 0 0;
}
.ecosystem-timeline li {
margin-bottom: 0.7em;
font-size: 0.98em;
line-height: 1.4;
}
.timeline-date {
color: #ff1a1a;
font-size: 0.92em;
margin-right: 0.5em;
font-weight: 700;
}
</style>

View file

@ -0,0 +1,51 @@
---
// Hall of Fame/Shame mockup for AeThex
const fame = [
{ name: 'Alice', reason: 'Top contributor' },
{ name: 'Bob', reason: 'Most helpful bug report' }
];
const shame = [
{ name: 'ScammerMcScamface', reason: 'Tried to phish the AI' },
{ name: 'SneakyPete', reason: 'Fake giveaway spam' }
];
---
<div class="hall-of-fame-shame">
<h3>Hall of Fame</h3>
<ul class="fame-list">
{fame.map(item => (
<li><span class="fame-name">{item.name}</span> — {item.reason}</li>
))}
</ul>
<h3>Hall of Shame</h3>
<ul class="shame-list">
{shame.map(item => (
<li><span class="shame-name">{item.name}</span> — {item.reason}</li>
))}
</ul>
</div>
<style>
.hall-of-fame-shame {
background: rgba(30,30,40,0.98);
border-radius: 18px;
box-shadow: 0 2px 16px #0006;
padding: 1.2em 1.5em;
margin: 2em auto 1em auto;
max-width: 420px;
color: #fff;
font-size: 1em;
border: 1.5px solid #333;
}
.fame-list, .shame-list {
list-style: none;
padding: 0;
margin: 0.5em 0 1em 0;
}
.fame-name {
color: #ffd580;
font-weight: 700;
}
.shame-name {
color: #ff1a1a;
font-weight: 700;
}
</style>

View file

@ -0,0 +1,52 @@
---
// Live activity/news feed mockup for AeThex ecosystem
const feed = [
{ time: 'Just now', message: 'New user registered on Gameforge.' },
{ time: '2 min ago', message: 'Labs released a new AI Copilot update.' },
{ time: '10 min ago', message: 'Foundation approved a new open-source proposal.' },
{ time: '30 min ago', message: 'Educate published a new tutorial.' },
{ time: '1 hr ago', message: 'Corporation deployed a major infrastructure upgrade.' }
];
---
<div class="live-activity-feed">
<h3>Live Activity Feed</h3>
<ul>
{feed.map(item => (
<li><span class="feed-time">[{item.time}]</span> {item.message}</li>
))}
</ul>
</div>
<style>
.live-activity-feed {
background: rgba(20,20,30,0.98);
border-radius: 18px;
box-shadow: 0 2px 16px #0006;
padding: 1.2em 1.5em;
margin: 2em auto 1em auto;
max-width: 420px;
color: #fff;
font-size: 1em;
border: 1.5px solid #333;
}
.live-activity-feed h3 {
margin-top: 0;
font-size: 1.15em;
letter-spacing: 0.02em;
color: #ff1a1a;
}
.live-activity-feed ul {
list-style: none;
padding: 0;
margin: 0.5em 0 0 0;
}
.live-activity-feed li {
margin-bottom: 0.7em;
font-size: 0.98em;
line-height: 1.4;
}
.feed-time {
color: #ffd580;
font-size: 0.92em;
margin-right: 0.5em;
}
</style>

View file

@ -0,0 +1,70 @@
---
// One-click Passport/SSO demo for AeThex ecosystem (mockup)
let loggedIn = false;
let username = '';
function handleLogin(e) {
e.preventDefault();
loggedIn = true;
username = 'demo_user';
}
function handleLogout(e) {
e.preventDefault();
loggedIn = false;
username = '';
}
---
<div class="passport-sso-demo">
<h3>One-Click Passport (SSO Demo)</h3>
{loggedIn ? (
<div class="sso-status">
<span class="sso-user">Welcome, {username}!</span>
<button class="sso-btn logout" onclick={handleLogout}>Log out</button>
</div>
) : (
<form onsubmit={handleLogin} class="sso-form">
<button class="sso-btn login" type="submit">Sign in with AeThex Passport</button>
</form>
)}
</div>
<style>
.passport-sso-demo {
background: rgba(30,30,40,0.98);
border-radius: 18px;
box-shadow: 0 2px 16px #0006;
padding: 1.2em 1.5em;
margin: 2em auto 1em auto;
max-width: 420px;
color: #fff;
font-size: 1em;
border: 1.5px solid #333;
text-align: center;
}
.sso-btn {
background: #ff1a1a;
color: #fff;
border: none;
border-radius: 8px;
padding: 0.7em 1.5em;
font-size: 1.1em;
font-weight: 700;
cursor: pointer;
margin-top: 1em;
transition: background 0.2s;
}
.sso-btn.login:hover {
background: #d10000;
}
.sso-btn.logout {
background: #ffd580;
color: #222;
}
.sso-btn.logout:hover {
background: #ff1a1a;
color: #fff;
}
.sso-user {
font-size: 1.08em;
font-weight: 600;
margin-right: 1em;
}
</style>

View file

@ -0,0 +1,40 @@
import React, { useState } from 'react';
export default function PassportSSODemoReact() {
const [loggedIn, setLoggedIn] = useState(false);
const [username, setUsername] = useState('');
function handleLogin(e) {
e.preventDefault();
if (username.trim()) {
setLoggedIn(true);
}
}
function handleLogout() {
setLoggedIn(false);
setUsername('');
}
return (
<div className="sso-demo">
{loggedIn ? (
<div>
<p>Welcome, {username}!</p>
<button className="sso-btn logout" onClick={handleLogout}>Log out</button>
</div>
) : (
<form className="sso-form" onSubmit={handleLogin}>
<input
type="text"
placeholder="Username"
value={username}
onChange={e => setUsername(e.target.value)}
className="sso-input"
/>
<button className="sso-btn login" type="submit">Log in</button>
</form>
)}
</div>
);
}

View file

@ -0,0 +1,286 @@
---
// Modular persistent portal/footer bar for AeThex ecosystem
const { entityFooter } = Astro.props;
const divisionLinks = [
{ name: 'Home', url: '/', icon: 'home' },
{ name: 'Foundation', url: '/foundation', icon: 'foundation' },
{ name: 'Corporation', url: '/corporation', icon: 'corporation' },
{ name: 'Labs', url: '/labs', icon: 'labs' },
];
const toolLinks = [
{ name: 'Live Feed', url: '/live-activity', icon: 'live' },
{ name: 'Universal Search', url: '/universal-search', icon: 'search' },
{ name: 'SSO Demo', url: '/sso-demo', icon: 'sso' },
{ name: 'Hall of Fame', url: '/hall-of-fame', icon: 'fame' },
{ name: 'Timeline', url: '/timeline', icon: 'timeline' },
{ name: 'Random Site', url: '/random-site', icon: 'random' },
{ name: 'Theme Switcher', url: '/theme-switcher', icon: 'theme' },
{ name: 'Easter Eggs', url: '/easter-eggs', icon: 'egg' }
];
---
<footer class="portal-footer-bar cozy-footer">
<div class="footer-group">
<div class="footer-group-label">AeThex Divisions</div>
<div class="footer-links-row">
{divisionLinks.map(link => (
<a href={link.url} class="footer-link" title={link.name} target="_self">
<span class="footer-icon-wrap">
{/* ...SVG ICONS, unchanged... */}
{link.icon === 'home' && (
<svg class="footer-icon-svg" width="20" height="20" viewBox="0 0 20 20" fill="none"><path d="M3 9.5L10 4L17 9.5" stroke="#6cf" stroke-width="2"/><rect x="6.5" y="11" width="7" height="5" rx="1.5" stroke="#6cf" stroke-width="2"/></svg>
)}
{link.icon === 'foundation' && (
<svg class="footer-icon-svg" width="20" height="20" viewBox="0 0 20 20" fill="none"><polygon points="10,3 17,8 17,17 3,17 3,8" stroke="#ff4d4d" stroke-width="2" fill="none"/><circle cx="10" cy="12" r="2" fill="#ff4d4d"/></svg>
)}
{link.icon === 'corporation' && (
<svg class="footer-icon-svg" width="20" height="20" viewBox="0 0 20 20" fill="none"><rect x="4" y="6" width="12" height="8" rx="2" stroke="#6cf" stroke-width="2" fill="none"/><rect x="8" y="10" width="4" height="4" rx="1" fill="#6cf"/></svg>
)}
{link.icon === 'labs' && (
<svg class="footer-icon-svg" width="20" height="20" viewBox="0 0 20 20" fill="none"><ellipse cx="10" cy="14" rx="6" ry="3" stroke="#ffc700" stroke-width="2" fill="none"/><rect x="7" y="3" width="6" height="8" rx="2" stroke="#ffc700" stroke-width="2" fill="none"/></svg>
)}
</span>
<span class="footer-label">{link.name}</span>
</a>
))}
</div>
</div>
<div class="footer-group">
<div class="footer-group-label">Tools & Community</div>
<div class="footer-links-row">
{toolLinks.map(link => (
<a href={link.url} class="footer-link" title={link.name} target="_self">
<span class="footer-icon-wrap">
{/* ...SVG ICONS, unchanged... */}
{link.icon === 'live' && (
<svg class="footer-icon-svg" width="20" height="20" viewBox="0 0 20 20" fill="none"><circle cx="10" cy="10" r="6" fill="#ff4d4d"/><circle cx="10" cy="10" r="9" stroke="#ff4d4d" stroke-width="2" fill="none"/></svg>
)}
{link.icon === 'search' && (
<svg class="footer-icon-svg" width="20" height="20" viewBox="0 0 20 20" fill="none"><circle cx="9" cy="9" r="6" stroke="#6cf" stroke-width="2" fill="none"/><line x1="14" y1="14" x2="18" y2="18" stroke="#6cf" stroke-width="2"/></svg>
)}
{link.icon === 'sso' && (
<svg class="footer-icon-svg" width="20" height="20" viewBox="0 0 20 20" fill="none"><rect x="3" y="5" width="14" height="10" rx="2" stroke="#6cf" stroke-width="2" fill="none"/><circle cx="7" cy="10" r="2" fill="#6cf"/></svg>
)}
{link.icon === 'fame' && (
<svg class="footer-icon-svg" width="20" height="20" viewBox="0 0 20 20" fill="none"><polygon points="10,3 12,9 18,9 13,13 15,19 10,15 5,19 7,13 2,9 8,9" stroke="#ffc700" stroke-width="2" fill="none"/></svg>
)}
{link.icon === 'timeline' && (
<svg class="footer-icon-svg" width="20" height="20" viewBox="0 0 20 20" fill="none"><rect x="4" y="4" width="12" height="12" rx="3" stroke="#6cf" stroke-width="2" fill="none"/><line x1="10" y1="7" x2="10" y2="10" stroke="#6cf" stroke-width="2"/><circle cx="10" cy="13" r="1.5" fill="#6cf"/></svg>
)}
{link.icon === 'random' && (
<svg class="footer-icon-svg" width="20" height="20" viewBox="0 0 20 20" fill="none"><rect x="3" y="3" width="14" height="14" rx="4" stroke="#ff4d4d" stroke-width="2" fill="none"/><circle cx="10" cy="10" r="2" fill="#6cf"/></svg>
)}
{link.icon === 'theme' && (
<svg class="footer-icon-svg" width="20" height="20" viewBox="0 0 20 20" fill="none"><circle cx="10" cy="10" r="7" stroke="#ffc700" stroke-width="2" fill="none"/><path d="M10 3v14M3 10h14" stroke="#ffc700" stroke-width="2"/></svg>
)}
{link.icon === 'egg' && (
<svg class="footer-icon-svg" width="20" height="20" viewBox="0 0 20 20" fill="none"><ellipse cx="10" cy="12" rx="5" ry="7" stroke="#fff" stroke-width="2" fill="none"/></svg>
)}
</span>
<span class="footer-label">{link.name}</span>
</a>
))}
</div>
</div>
{entityFooter && (
<div class="entity-footer-content cozy-entity-footer" set:html={entityFooter}></div>
)}
</footer>
<style>
@import url('https://fonts.googleapis.com/css2?family=Electrolize&family=Source+Code+Pro:wght@400;600;700&display=swap');
/* Cozy entity footer content */
.cozy-entity-footer {
margin-top: 2em;
width: 100%;
display: flex;
flex-direction: row;
align-items: center;
justify-content: center;
gap: 2em;
background: rgba(30, 30, 40, 0.85);
border-radius: 18px;
box-shadow: 0 2px 16px #2228;
padding: 1.1em 2.2em;
font-size: 1.08em;
color: #fff;
margin-bottom: 0.5em;
font-family: 'Source Code Pro', 'Electrolize', 'Segoe UI', Arial, sans-serif;
}
<style>
/* Cozy persistent footer bar */
.portal-footer-bar.cozy-footer {
position: fixed;
left: 0; right: 0; bottom: 0;
background: linear-gradient(90deg, rgba(20,20,32,0.98) 60%, rgba(40,40,60,0.98) 100%);
border-top: 2.5px solid #222;
box-shadow: 0 -4px 32px #000a;
z-index: 1000;
padding: 1.2em 0 1.1em 0;
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
border-radius: 18px 18px 0 0;
min-height: 84px;
transition: background 0.3s, box-shadow 0.3s;
font-family: 'Electrolize', 'Segoe UI', Arial, sans-serif;
max-width: 900px;
margin: 0 auto;
left: 0; right: 0;
width: 100%;
box-sizing: border-box;
}
@media (max-width: 1100px) {
.portal-footer-bar.cozy-footer {
max-width: 98vw;
padding-left: 1.5vw;
padding-right: 1.5vw;
}
}
@media (max-width: 700px) {
.portal-footer-bar.cozy-footer {
max-width: 100vw;
border-radius: 12px 12px 0 0;
padding-left: 0.5em;
padding-right: 0.5em;
}
}
.footer-group {
margin-bottom: 0.5em;
width: 100%;
display: flex;
flex-direction: column;
align-items: center;
}
.footer-group-label {
font-size: 0.98em;
color: #7a8599;
font-family: 'Source Code Pro', 'Electrolize', 'Segoe UI', Arial, sans-serif;
margin-bottom: 0.2em;
letter-spacing: 0.08em;
text-transform: uppercase;
font-weight: 600;
letter-spacing: 0.12em;
}
.footer-links-row {
display: flex;
flex-wrap: wrap;
gap: 1.5em;
align-items: flex-end;
justify-content: center;
width: 100%;
padding: 0.3em 0.5em 0.1em 0.5em;
margin-bottom: 0.1em;
}
/* Cozy footer link */
.footer-link {
display: flex;
flex-direction: row;
align-items: center;
color: #fff;
text-decoration: none;
font-size: 1.04em;
opacity: 0.92;
transition: opacity 0.2s, color 0.2s, background 0.2s, box-shadow 0.2s, text-shadow 0.2s;
border-radius: 10px;
padding: 0.3em 0.6em 0.3em 0.6em;
margin: 0 0.1em;
font-family: 'Electrolize', 'Segoe UI', Arial, sans-serif;
min-width: 0;
white-space: normal;
overflow: visible;
text-overflow: unset;
outline: none;
}
.footer-link:hover, .footer-link:focus {
color: #6cf;
background: rgba(0,102,255,0.10);
box-shadow: 0 2px 12px #0066ff33, 0 0 0 2px #6cf44;
text-shadow: 0 0 8px #6cf, 0 0 2px #fff;
opacity: 1;
text-decoration: underline;
}
.footer-link:focus {
outline: 2px solid #6cf;
outline-offset: 2px;
}
.footer-link:hover {
opacity: 1;
color: #fff;
background: rgba(0,102,255,0.13);
box-shadow: 0 2px 12px #0066ff33;
}
/* Footer icon and label cozy tweaks */
.footer-icon-wrap {
display: flex;
align-items: center;
justify-content: center;
margin-right: 0.5em;
}
.footer-icon-svg {
width: 18px;
height: 18px;
display: block;
margin: 0;
vertical-align: middle;
transition: transform 0.22s cubic-bezier(.77,0,.175,1), filter 0.22s;
filter: drop-shadow(0 0 0 #6cf);
}
.footer-link:hover .footer-icon-svg,
.footer-link:focus .footer-icon-svg {
transform: scale(1.18) rotate(-8deg);
filter: drop-shadow(0 0 8px #6cf88);
}
.footer-emoji {
font-size: 1.5em;
margin-bottom: 0;
display: block;
}
.footer-label {
font-size: 1em;
font-weight: 600;
letter-spacing: 0.01em;
font-family: 'Source Code Pro', 'Electrolize', 'Segoe UI', Arial, sans-serif;
margin-left: 0.1em;
white-space: normal;
overflow: visible;
text-overflow: unset;
word-break: break-word;
}
@media (max-width: 900px) {
.footer-links-row {
gap: 0.7em;
padding-left: 0.2em;
padding-right: 0.2em;
}
.footer-link {
font-size: 0.98em;
/* Remove max-width for wrapping */
}
.footer-label {
white-space: normal;
word-break: break-word;
}
.footer-icon {
width: 24px;
height: 24px;
}
}
@media (max-width: 700px) {
.footer-links-row {
flex-wrap: wrap;
gap: 0.7em;
padding-left: 0.1em;
padding-right: 0.1em;
}
.footer-link {
font-size: 0.93em;
max-width: 90px;
padding: 0.2em 0.3em;
}
.footer-label {
display: none;
}
.portal-footer-bar.cozy-footer { min-height: 64px; padding: 0.7em 0 0.7em 0; }
.cozy-entity-footer { flex-direction: column; gap: 1em; padding: 0.7em 1em; font-size: 0.98em; }
}
</style>

View file

@ -0,0 +1,43 @@
---
// Random site teleport button for AeThex
const sites = [
'/foundation',
'/corporation',
'/labs',
'/educate',
'/gameforge',
'/docs',
'/community'
];
function teleport() {
const idx = Math.floor(Math.random() * sites.length);
window.location.href = sites[idx];
}
---
<div class="random-site-btn-wrap">
<button class="random-site-btn" client:click={teleport}>🎲 Teleport to a Random AeThex Site</button>
</div>
<style>
.random-site-btn-wrap {
display: flex;
justify-content: center;
margin: 2em 0 1em 0;
}
.random-site-btn {
background: linear-gradient(90deg, #ff1a1a 60%, #ffd580 100%);
color: #fff;
border: none;
border-radius: 16px;
padding: 1em 2.2em;
font-size: 1.15em;
font-weight: 700;
cursor: pointer;
box-shadow: 0 2px 16px #0006;
transition: background 0.2s, transform 0.2s;
}
.random-site-btn:hover {
background: linear-gradient(90deg, #ffd580 60%, #ff1a1a 100%);
color: #222;
transform: scale(1.06);
}
</style>

View file

@ -0,0 +1,44 @@
import React from 'react';
const sites = [
'https://aethex.dev',
'https://aethex.inc',
'https://aethex.co',
'https://aethex.us',
'https://aethex.net',
'https://aethex.org',
'https://aethex.app',
'https://aethex.site',
'https://aethex.locker',
'https://aethex.bio',
'https://aethex.bot',
'https://aethex.live',
'https://aethex.me',
'https://aethex.space',
'https://aethex.shop',
'https://aethex.cloud',
'https://aethex.tech',
'https://aethex.studio',
'https://aethex.support',
'https://aethex.network',
'https://aethex.foundation',
'https://aethex.fun',
'https://aethex.sbs',
'https://aethex.blog',
'https://aethex.info'
];
function teleport() {
const idx = Math.floor(Math.random() * sites.length);
window.location.href = sites[idx];
}
export default function RandomSiteButtonReact() {
return (
<div className="random-site-btn-wrap">
<button className="random-site-btn" onClick={teleport}>
🎲 Teleport to a Random AeThex Site
</button>
</div>
);
}

View file

@ -0,0 +1,60 @@
---
// Theme switcher for AeThex (mockup, extendable)
let theme = 'default';
function setTheme(t: string) {
theme = t;
document.body.setAttribute('data-theme', t);
}
const themes = [
{ name: 'Default', value: 'default' },
{ name: 'Retro', value: 'retro' },
{ name: 'Neon', value: 'neon' },
{ name: 'Hacker', value: 'hacker' }
];
---
<div class="theme-switcher">
<span>Theme:</span>
{themes.map(t => (
<button class="theme-btn" client:click={() => setTheme(t.value)}>{t.name}</button>
))}
</div>
<style>
.theme-switcher {
display: flex;
justify-content: center;
align-items: center;
gap: 0.7em;
margin: 2em 0 1em 0;
font-size: 1em;
}
.theme-btn {
background: #222;
color: #ffd580;
border: 1.5px solid #ffd580;
border-radius: 8px;
padding: 0.5em 1.2em;
font-size: 1em;
cursor: pointer;
transition: background 0.2s, color 0.2s;
}
.theme-btn:hover {
background: #ffd580;
color: #222;
}
</style>
<script>
// Simple theme switcher logic
const themeStyles = {
retro: 'body[data-theme=retro] { background: #f4ecd8; color: #222; }',
neon: 'body[data-theme=neon] { background: #0f0020; color: #39ff14; }',
hacker: 'body[data-theme=hacker] { background: #101c10; color: #00ff00; }',
default: 'body[data-theme=default] { background: #0a0a0a; color: #fff; }'
};
const styleTag = document.createElement('style');
document.head.appendChild(styleTag);
function setThemeScript(t) {
document.body.setAttribute('data-theme', t);
styleTag.innerHTML = themeStyles[t] || '';
}
window.setTheme = setThemeScript;
</script>

View file

@ -0,0 +1,46 @@
import React, { useState } from 'react';
const themes = [
{ name: 'Default', value: 'default' },
{ name: 'Retro', value: 'retro' },
{ name: 'Neon', value: 'neon' },
{ name: 'Hacker', value: 'hacker' }
];
const themeStyles = {
retro: 'body[data-theme=retro] { background: #f4ecd8; color: #222; }',
neon: 'body[data-theme=neon] { background: #0f0020; color: #39ff14; }',
hacker: 'body[data-theme=hacker] { background: #101c10; color: #00ff00; }',
default: 'body[data-theme=default] { background: #0a0a0a; color: #fff; }'
};
export default function ThemeSwitcherReact() {
const [theme, setTheme] = useState('default');
function handleThemeChange(t) {
setTheme(t);
document.body.setAttribute('data-theme', t);
let styleTag = document.getElementById('theme-style');
if (!styleTag) {
styleTag = document.createElement('style');
styleTag.id = 'theme-style';
document.head.appendChild(styleTag);
}
styleTag.innerHTML = themeStyles[t] || '';
}
return (
<div className="theme-switcher">
<span>Theme:</span>
{themes.map(t => (
<button
key={t.value}
className="theme-btn"
onClick={() => handleThemeChange(t.value)}
>
{t.name}
</button>
))}
</div>
);
}

View file

@ -153,5 +153,49 @@
from { transform: translateY(-40px); opacity: 0; }
to { transform: translateY(0); opacity: 1; }
}
.trinity-grid {
display: grid;
grid-template-columns: repeat(3, minmax(320px, 1fr));
gap: 48px;
margin: 56px 0 40px 0;
justify-content: center;
align-items: stretch;
}
.trinity-card {
background: rgba(30,30,30,0.92);
border-radius: 28px;
box-shadow: 0 4px 32px #0006;
padding: 48px 36px 36px 36px;
color: #fff;
transition: transform 0.18s, box-shadow 0.18s;
cursor: pointer;
outline: none;
border: 2px solid transparent;
min-width: 0;
min-height: 440px;
display: flex;
flex-direction: column;
align-items: flex-start;
justify-content: flex-start;
}
@media (max-width: 1100px) {
.trinity-grid {
grid-template-columns: 1fr 1fr;
gap: 32px;
}
}
@media (max-width: 800px) {
.trinity-grid {
grid-template-columns: 1fr;
gap: 28px;
}
.trinity-section {
padding: 32px 0 12px 0;
}
.trinity-card {
padding: 28px 14px 18px 14px;
min-height: 320px;
}
}
</style>
</section>

View file

@ -0,0 +1,90 @@
---
// Universal search bar for AeThex ecosystem (mockup, extendable)
const sites = [
{ name: 'Foundation', url: '/foundation' },
{ name: 'Corporation', url: '/corporation' },
{ name: 'Labs', url: '/labs' },
{ name: 'Educate', url: '/educate' },
{ name: 'Gameforge', url: '/gameforge' },
{ name: 'Docs', url: '/docs' },
{ name: 'Community', url: '/community' }
];
let query = '';
let results = sites;
function handleInput(e: Event) {
query = (e.target as HTMLInputElement).value;
results = sites.filter(site => site.name.toLowerCase().includes(query.toLowerCase()));
}
---
<div class="universal-search">
<form method="get" action="" class="search-form">
<input type="text" name="q" placeholder="Search AeThex..." value={query} class="search-input" client:input={handleInput} />
<button type="submit" class="search-btn">🔍</button>
</form>
<ul class="search-results">
{results.length === 0 ? (
<li class="no-results">No results found.</li>
) : (
results.map(site => (
<li><a href={site.url}>{site.name}</a></li>
))
)}
</ul>
</div>
<style>
.universal-search {
background: rgba(30,30,40,0.98);
border-radius: 18px;
box-shadow: 0 2px 16px #0006;
padding: 1.2em 1.5em;
margin: 2em auto 1em auto;
max-width: 420px;
color: #fff;
font-size: 1em;
border: 1.5px solid #333;
}
.search-form {
display: flex;
gap: 0.5em;
margin-bottom: 0.7em;
}
.search-input {
flex: 1;
padding: 0.6em 1em;
border-radius: 8px;
border: 1.5px solid #444;
background: #181820;
color: #fff;
font-size: 1em;
}
.search-btn {
background: #ff1a1a;
color: #fff;
border: none;
border-radius: 8px;
padding: 0.6em 1.2em;
font-size: 1.1em;
cursor: pointer;
transition: background 0.2s;
}
.search-btn:hover {
background: #d10000;
}
.search-results {
list-style: none;
padding: 0;
margin: 0;
}
.search-results li {
margin-bottom: 0.5em;
}
.search-results a {
color: #ffd580;
text-decoration: underline;
font-weight: 600;
}
.no-results {
color: #ff1a1a;
font-style: italic;
}
</style>

View file

@ -0,0 +1,38 @@
import React, { useState } from 'react';
const sites = [
{ name: 'Foundation', url: '/foundation' },
{ name: 'Corporation', url: '/corporation' },
{ name: 'Labs', url: '/labs' },
{ name: 'Docs', url: '/docs' }
];
export default function UniversalSearchReact() {
const [query, setQuery] = useState('');
const results = sites.filter(site => site.name.toLowerCase().includes(query.toLowerCase()));
return (
<div className="universal-search">
<form className="search-form" onSubmit={e => e.preventDefault()}>
<input
type="text"
name="q"
placeholder="Search AeThex..."
value={query}
className="search-input"
onChange={e => setQuery(e.target.value)}
/>
<button type="submit" className="search-btn">🔍</button>
</form>
<ul className="search-results">
{results.length === 0 ? (
<li className="no-results">No results found.</li>
) : (
results.map(site => (
<li key={site.url}><a href={site.url}>{site.name}</a></li>
))
)}
</ul>
</div>
);
}

View file

@ -1,5 +1,6 @@
---
// Astro layout for AeThex site
import PortalFooterBar from '../components/PortalFooterBar.astro';
---
<html lang="en">
<head>
@ -29,5 +30,7 @@
</head>
<body>
<slot />
{Astro.url.pathname !== '/' && <PortalFooterBar entityFooter={Astro.props.entityFooter} />}
</body>
---
</html>

10
src/pages/about.astro Normal file
View file

@ -0,0 +1,10 @@
---
import MainLayout from '../layouts/MainLayout.astro';
import TestimonialsSection from '../components/TestimonialsSection.astro';
import SocialProofSection from '../components/SocialProofSection.astro';
---
<MainLayout>
<h1>About AeThex</h1>
<TestimonialsSection />
<SocialProofSection />
</MainLayout>

10
src/pages/community.astro Normal file
View file

@ -0,0 +1,10 @@
---
import MainLayout from '../layouts/MainLayout.astro';
import CommunityWall from '../components/CommunityWall.astro';
import EventsWebinarsSection from '../components/EventsWebinarsSection.astro';
---
<MainLayout>
<h1>Community & Events</h1>
<CommunityWall />
<EventsWebinarsSection />
</MainLayout>

View file

@ -1,9 +1,23 @@
---
// Corporation Division Page
import MainLayout from '../layouts/MainLayout.astro';
const entityFooter = `
<span>© AeThex Corporation 2026</span>
<a href="/">
<svg width="18" height="18" style="vertical-align:middle;margin-right:4px;" viewBox="0 0 24 24"><polygon points="12,3 22,21 2,21" fill="none" stroke="#0066ff" stroke-width="2"/><circle cx="12" cy="15" r="2" fill="#0066ff"/></svg>
Home
</a>
<a href="/corporation">
<svg width="18" height="18" style="vertical-align:middle;margin-right:4px;" viewBox="0 0 24 24"><polygon points="12,2 21,7 21,17 12,22 3,17 3,7" fill="none" stroke="#0066ff" stroke-width="2"/><circle cx="12" cy="12" r="2" fill="#0066ff"/></svg>
Corporation
</a>
<a href="https://aethex.biz">
<svg width="18" height="18" style="vertical-align:middle;margin-right:4px;" viewBox="0 0 24 24"><rect x="4" y="4" width="16" height="16" rx="4" fill="none" stroke="#0066ff" stroke-width="2"/><path d="M8 8h8v8H8z" fill="#0066ff"/><circle cx="12" cy="12" r="1.5" fill="#fff"/></svg>
Products
</a>
`;
---
<MainLayout>
<MainLayout entityFooter={entityFooter}>
<nav class="container">
<div class="logo">AETHEX</div>
<div class="nav-links">
@ -38,10 +52,7 @@ import MainLayout from '../layouts/MainLayout.astro';
</ul>
</section>
</div>
<footer class="entity-footer">
<span>© AeThex Corporation 2026</span>
<a href="/">Home</a>
</footer>
<!-- Footer content is now passed to MainLayout as a prop -->
<style>
.fade-in-section { opacity: 0; transform: translateY(32px); animation: fadeInSection 1.2s 0.5s cubic-bezier(.77,0,.175,1) forwards; }
@keyframes fadeInSection { to { opacity: 1; transform: none; } }
@ -64,8 +75,38 @@ import MainLayout from '../layouts/MainLayout.astro';
ul { color: #fff; margin-top: 24px; padding-left: 24px; }
ul li { margin-bottom: 14px; transition: color 0.2s, transform 0.2s; cursor: pointer; font-size: 1.08em; }
ul li:hover { color: #0066ff; transform: scale(1.05); }
.entity-footer { text-align: center; margin-top: 48px; color: #fff; font-size: 1em; opacity: 0.7; }
.entity-footer a { color: #0066ff; margin-left: 16px; text-decoration: underline; }
.glass-footer {
background: rgba(30,30,40,0.55);
backdrop-filter: blur(8px);
border-top: 3px solid #0066ff;
border-radius: 18px 18px 0 0;
box-shadow: 0 -2px 24px #0066ff40;
margin: 56px auto 0 auto;
max-width: 650px;
padding: 24px 32px 18px 32px;
text-align: center;
color: #fff;
font-size: 1.08em;
opacity: 0.95;
display: flex;
flex-wrap: wrap;
gap: 18px;
justify-content: center;
align-items: center;
}
.glass-footer a {
color: #0066ff;
margin: 0 8px;
text-decoration: none;
font-weight: 600;
display: inline-flex;
align-items: center;
transition: color 0.2s, text-shadow 0.2s;
}
.glass-footer a:hover {
color: #fff;
text-shadow: 0 0 8px #0066ff;
}
@media (max-width: 768px) {
.hero-banner { height: auto; min-height: 280px; padding: 40px 20px; }

8
src/pages/docs.astro Normal file
View file

@ -0,0 +1,8 @@
---
import MainLayout from '../layouts/MainLayout.astro';
import QuickstartGuideSection from '../components/QuickstartGuideSection.astro';
---
<MainLayout>
<h1>Quickstart Guide</h1>
<QuickstartGuideSection />
</MainLayout>

View file

@ -0,0 +1,14 @@
---
import EasterEggsComponent from '../components/EasterEggs.astro';
export const layout = '../layouts/MainLayout.astro';
---
<section class="tool-hero">
<div class="tool-hero-bg tool-hero-bg-egg"></div>
<h1 class="tool-hero-title gradient-text">Easter Eggs</h1>
<p class="tool-hero-desc">Can you find the hidden AeThex Easter Eggs? Unlock badges and discover secrets across the ecosystem.</p>
</section>
<section class="tool-content">
<EasterEggsComponent />
</section>

10
src/pages/ecosystem.astro Normal file
View file

@ -0,0 +1,10 @@
---
import MainLayout from '../layouts/MainLayout.astro';
import MetaverseMap from '../components/MetaverseMap.astro';
import EcosystemTimeline from '../components/EcosystemTimeline.astro';
---
<MainLayout>
<h1>Our Ecosystem</h1>
<MetaverseMap />
<EcosystemTimeline />
</MainLayout>

View file

@ -1,9 +1,23 @@
---
// Foundation Division Page
import MainLayout from '../layouts/MainLayout.astro';
const entityFooter = `
<span>© AeThex Foundation 2026</span>
<a href="/">
<svg width="18" height="18" style="vertical-align:middle;margin-right:4px;" viewBox="0 0 24 24"><polygon points="12,3 22,21 2,21" fill="none" stroke="#ff0000" stroke-width="2"/><circle cx="12" cy="15" r="2" fill="#ff0000"/></svg>
Home
</a>
<a href="/foundation">
<svg width="18" height="18" style="vertical-align:middle;margin-right:4px;" viewBox="0 0 24 24"><polygon points="12,2 21,7 21,17 12,22 3,17 3,7" fill="none" stroke="#ff0000" stroke-width="2"/><circle cx="12" cy="12" r="2" fill="#ff0000"/></svg>
Foundation
</a>
<a href="https://aethex.network">
<svg width="18" height="18" style="vertical-align:middle;margin-right:4px;" viewBox="0 0 24 24"><rect x="4" y="4" width="16" height="16" rx="4" fill="none" stroke="#ff0000" stroke-width="2"/><path d="M8 8h8v8H8z" fill="#ff0000"/><circle cx="12" cy="12" r="1.5" fill="#fff"/></svg>
Community
</a>
`;
---
<MainLayout>
<MainLayout entityFooter={entityFooter}>
<nav class="container">
<div class="logo">AETHEX</div>
<div class="nav-links">
@ -38,10 +52,7 @@ import MainLayout from '../layouts/MainLayout.astro';
</ul>
</section>
</div>
<footer class="entity-footer">
<span>© AeThex Foundation 2026</span>
<a href="/">Home</a>
</footer>
<!-- Footer content is now passed to MainLayout as a prop -->
<style>
.fade-in-section { opacity: 0; transform: translateY(32px); animation: fadeInSection 1.2s 0.5s cubic-bezier(.77,0,.175,1) forwards; }
@keyframes fadeInSection { to { opacity: 1; transform: none; } }
@ -64,8 +75,38 @@ import MainLayout from '../layouts/MainLayout.astro';
ul { color: #fff; margin-top: 24px; padding-left: 24px; }
ul li { margin-bottom: 14px; transition: color 0.2s, transform 0.2s; cursor: pointer; font-size: 1.08em; }
ul li:hover { color: #ff0000; transform: scale(1.05); }
.entity-footer { text-align: center; margin-top: 48px; color: #fff; font-size: 1em; opacity: 0.7; }
.entity-footer a { color: #ff0000; margin-left: 16px; text-decoration: underline; }
.glass-footer {
background: rgba(30,30,30,0.55);
backdrop-filter: blur(8px);
border-top: 3px solid #ff0000;
border-radius: 18px 18px 0 0;
box-shadow: 0 -2px 24px #ff000040;
margin: 56px auto 0 auto;
max-width: 650px;
padding: 24px 32px 18px 32px;
text-align: center;
color: #fff;
font-size: 1.08em;
opacity: 0.95;
display: flex;
flex-wrap: wrap;
gap: 18px;
justify-content: center;
align-items: center;
}
.glass-footer a {
color: #ff0000;
margin: 0 8px;
text-decoration: none;
font-weight: 600;
display: inline-flex;
align-items: center;
transition: color 0.2s, text-shadow 0.2s;
}
.glass-footer a:hover {
color: #fff;
text-shadow: 0 0 8px #ff0000;
}
@media (max-width: 768px) {
.hero-banner { height: auto; min-height: 280px; padding: 40px 20px; }

View file

@ -0,0 +1,14 @@
---
import MainLayout from '../layouts/MainLayout.astro';
import HallOfFameShame from '../components/HallOfFameShame.astro';
---
<MainLayout>
<section class="tool-hero">
<div class="tool-hero-bg tool-hero-bg-fame"></div>
<h1 class="tool-hero-title gradient-text">Hall of Fame / Shame</h1>
<p class="tool-hero-desc">Celebrating AeThexs top contributors—and calling out the most notorious troublemakers. Community legend lives here.</p>
</section>
<section class="tool-content">
<HallOfFameShame />
</section>
</MainLayout>

View file

@ -1,36 +1,279 @@
---
import MainLayout from '../layouts/MainLayout.astro';
import HeroSection from '../components/HeroSection.astro';
import TrinitySection from '../components/TrinitySection.astro';
import ProductsSection from '../components/ProductsSection.astro';
import MetaverseMap from '../components/MetaverseMap.astro';
import RealTimeStats from '../components/RealTimeStats.astro';
import TestimonialsSection from '../components/TestimonialsSection.astro';
import WhyAeThexSection from '../components/WhyAeThexSection.astro';
import SocialProofSection from '../components/SocialProofSection.astro';
import QuickstartGuideSection from '../components/QuickstartGuideSection.astro';
import FooterSection from '../components/FooterSection.astro';
import CommunityWall from '../components/CommunityWall.astro';
import EventsWebinarsSection from '../components/EventsWebinarsSection.astro';
import LanguageSwitcher from '../components/LanguageSwitcher.astro';
import PortalFooterBar from '../components/PortalFooterBar.astro';
---
<MainLayout>
<!-- Navigation -->
<nav class="container">
<div class="logo">AETHEX</div>
<div class="nav-links">
<a href="#trinity" class="nav-link">Trinity</a>
<a href="#products" class="nav-link">Products</a>
<a href="#docs" class="nav-link">Docs</a>
<a href="#community" class="nav-link">Community</a>
<section class="hero">
<div class="hero-bg-anim"></div>
<h1 class="hero-title gradient-text animate-fadein">METAVERSE<br />INFRASTRUCTURE</h1>
<h2 class="hero-subtitle animate-slideup">Building the Foundation of Digital Reality</h2>
<p class="hero-desc animate-fadein-delay">AeThex provides the core infrastructure for persistent, cross-platform digital experiences.<br />Our Trinity architecture ensures security, innovation, and commercial viability for the next generation of the metaverse.</p>
<a href="#trinity" class="cta-button animate-bounce">Access AeThex Studio</a>
</section>
<section id="trinity" class="trinity-section">
<h2 class="section-title">THE TRINITY</h2>
<h3 class="section-subtitle">Three Divisions, One Infrastructure</h3>
<div class="trinity-grid">
<div class="trinity-card foundation">
<div class="card-icon">🔴</div>
<div class="card-title">Foundation</div>
<div class="card-label">Critical Infrastructure • Nonprofit</div>
<div class="card-description">The nonprofit backbone maintaining authentication, security, and core APIs. Open-source infrastructure that the entire AeThex ecosystem depends on.</div>
<ul class="card-features">
<li>Passport Identity System</li>
<li>Authentication Protocols</li>
<li>Security Infrastructure</li>
<li>Core Open-Source APIs</li>
<li>Community Governance</li>
</ul>
</div>
<div class="trinity-card corporation">
<div class="card-icon">🔵</div>
<div class="card-title">Corporation</div>
<div class="card-label">Commercial Services • Production</div>
<div class="card-description">Professional commercial division delivering polished products and enterprise-grade infrastructure to developers and players worldwide.</div>
<ul class="card-features">
<li>AeThex Studio IDE</li>
<li>Production Deployment</li>
<li>Premium Services</li>
<li>Enterprise Support</li>
<li>Analytics & Insights</li>
</ul>
</div>
<div class="trinity-card labs">
<div class="card-icon">🟡</div>
<div class="card-title">Labs</div>
<div class="card-label">Research & Development • Experimental</div>
<div class="card-description">Innovation division pushing boundaries with experimental features, beta technologies, and next-generation metaverse infrastructure.</div>
<ul class="card-features">
<li>Nexus Engine v2.0</li>
<li>AI Copilot Assistant</li>
<li>Experimental Features</li>
<li>Beta Testing Programs</li>
<li>Future R&D Projects</li>
</ul>
</div>
</div>
</nav>
<HeroSection />
<TrinitySection />
<ProductsSection />
<FooterSection />
</section>
<!-- Placeholder for infrastructure flow, navigation/footer, and CTA sections -->
<style>
@import url('https://fonts.googleapis.com/css2?family=Electrolize&family=Source+Code+Pro:wght@400;600;700&display=swap');
html, body {
font-family: 'Electrolize', 'Segoe UI', Arial, sans-serif;
font-size: 18px;
color: #e0e6f6;
background: #10131a;
line-height: 1.7;
letter-spacing: 0.01em;
}
.hero-bg-anim {
position: absolute;
top: 0; left: 0; width: 100vw; height: 100%;
z-index: 0;
background: radial-gradient(ellipse at 60% 40%, #00338055 0%, #0000 70%),
radial-gradient(ellipse at 30% 70%, #ff1a1a33 0%, #0000 80%);
pointer-events: none;
animation: hero-bg-float 8s ease-in-out infinite alternate;
}
@keyframes hero-bg-float {
0% { background-position: 60% 40%, 30% 70%; }
100% { background-position: 65% 45%, 35% 75%; }
}
.hero { position: relative; overflow: hidden; }
.gradient-text {
background: linear-gradient(90deg, #0066ff 30%, #ff1a1a 70%);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
background-clip: text;
text-fill-color: transparent;
}
.animate-fadein {
opacity: 0;
animation: fadein 1.2s 0.1s forwards;
}
.animate-fadein-delay {
opacity: 0;
animation: fadein 1.2s 0.7s forwards;
}
.animate-slideup {
opacity: 0;
transform: translateY(30px);
animation: slideup 1.1s 0.4s forwards;
}
.animate-bounce {
animation: bounce 1.2s 1.2s infinite alternate;
}
@keyframes fadein {
to { opacity: 1; }
}
@keyframes slideup {
to { opacity: 1; transform: translateY(0); }
}
@keyframes bounce {
0% { transform: translateY(0); }
100% { transform: translateY(-8px); }
}
.hero { text-align: center; padding: 80px 0 40px 0; }
.hero-title {
font-size: 3.2em;
font-weight: 900;
letter-spacing: 0.04em;
margin-bottom: 0.3em;
font-family: 'Electrolize', 'Segoe UI', Arial, sans-serif;
}
.hero-subtitle {
font-size: 1.6em;
color: #7a8599;
letter-spacing: 0.03em;
margin-bottom: 1.2em;
font-family: 'Source Code Pro', 'Electrolize', 'Segoe UI', Arial, sans-serif;
}
.hero-desc {
font-size: 1.15em;
color: #bfc8e6;
margin-bottom: 2.2em;
font-family: 'Source Code Pro', 'Electrolize', 'Segoe UI', Arial, sans-serif;
}
.cta-button { display: inline-block; padding: 18px 48px; background: linear-gradient(135deg, #0066ff, #003380); color: #fff; text-decoration: none; text-transform: uppercase; letter-spacing: 3px; font-weight: 700; font-size: 1em; border: none; border-radius: 8px; transition: transform 0.3s, box-shadow 0.3s; cursor: pointer; }
.cta-button:hover { transform: translateY(-2px); box-shadow: 0 10px 40px rgba(0, 102, 255, 0.4); }
.trinity-section {
padding: 100px 0 80px 0;
text-align: center;
background: linear-gradient(120deg, #10131a 60%, #181c24 100%);
}
.section-title {
font-size: 2.2em;
font-weight: 800;
letter-spacing: 0.03em;
margin-bottom: 0.4em;
font-family: 'Electrolize', 'Segoe UI', Arial, sans-serif;
}
.section-subtitle {
font-size: 1.15em;
color: #7a8599;
letter-spacing: 0.02em;
text-transform: uppercase;
margin-bottom: 2.2em;
font-family: 'Source Code Pro', 'Electrolize', 'Segoe UI', Arial, sans-serif;
}
.trinity-grid {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 56px;
margin-bottom: 60px;
justify-content: center;
align-items: stretch;
max-width: 1200px;
margin-left: auto;
margin-right: auto;
}
.trinity-card {
background: rgba(30,34,44,0.98);
padding: 56px 40px 44px 40px;
border-radius: 32px;
box-shadow: 0 8px 48px #0008, 0 2px 24px #0004;
transition: transform 0.22s, box-shadow 0.22s, background 0.5s cubic-bezier(.77,0,.175,1);
display: flex;
flex-direction: column;
align-items: center;
min-width: 0;
min-height: 440px;
position: relative;
z-index: 1;
overflow: hidden;
}
.trinity-card::before {
content: '';
display: block;
position: absolute;
top: 0; left: 0; right: 0;
height: 7px;
border-top-left-radius: 32px;
border-top-right-radius: 32px;
z-index: 2;
}
.trinity-card.foundation::before {
background: linear-gradient(90deg, #ff0000 60%, #ff4d4d 100%);
}
.trinity-card.corporation::before {
background: linear-gradient(90deg, #0066ff 60%, #33bbff 100%);
}
.trinity-card.labs::before {
background: linear-gradient(90deg, #ffc700 60%, #ffe066 100%);
}
.trinity-card:hover {
background: linear-gradient(120deg, #23273a 60%, #2a2e3c 100%);
transform: translateY(-10px) scale(1.025);
box-shadow: 0 16px 64px #0066ff33, 0 8px 32px #0006;
}
/* Remove colored borders from cards */
.trinity-card.foundation,
.trinity-card.corporation,
.trinity-card.labs {
border: none;
}
.card-icon {
font-size: 3.2em;
margin-bottom: 28px;
text-shadow: 0 2px 16px #0006;
}
.card-title {
font-size: 1.3em;
font-weight: 700;
letter-spacing: 0.02em;
margin-bottom: 0.3em;
color: #fff;
font-family: 'Electrolize', 'Segoe UI', Arial, sans-serif;
}
.card-label {
font-size: 1em;
color: #7a8599;
margin-bottom: 1.1em;
letter-spacing: 0.02em;
text-transform: uppercase;
font-family: 'Source Code Pro', 'Electrolize', 'Segoe UI', Arial, sans-serif;
}
.card-description {
font-size: 1em;
color: #bfc8e6;
margin-bottom: 1.2em;
line-height: 1.7;
font-family: 'Source Code Pro', 'Electrolize', 'Segoe UI', Arial, sans-serif;
}
.card-features {
list-style: none;
padding: 0;
margin-bottom: 0;
width: 100%;
text-align: left;
}
.card-features li {
padding: 12px 0;
border-bottom: 1.5px solid #23273a;
color: #e0e6f6;
font-size: 1em;
letter-spacing: 0.5px;
}
.card-features li:last-child { border-bottom: none; }
.foundation .card-features li::before { content: '▸ '; color: #ff0000; font-weight: 700; }
.corporation .card-features li::before { content: '▸ '; color: #0066ff; font-weight: 700; }
.labs .card-features li::before { content: '▸ '; color: #ffc700; font-weight: 700; }
@media (max-width: 1200px) {
.trinity-grid { grid-template-columns: 1fr 1fr; gap: 36px; }
}
@media (max-width: 900px) {
.trinity-grid { grid-template-columns: 1fr; gap: 28px; max-width: 600px; }
.trinity-section { padding: 60px 0 32px 0; }
.trinity-card { padding: 36px 18px 24px 18px; min-height: 320px; }
}
@media (max-width: 600px) {
.trinity-section { padding: 32px 0 12px 0; }
.trinity-card { padding: 18px 8px 14px 8px; border-radius: 18px; }
.section-title { font-size: 1.5em; }
}
</style>
<PortalFooterBar />
</MainLayout>

View file

@ -1,9 +1,23 @@
---
// Labs Division Page
import MainLayout from '../layouts/MainLayout.astro';
const entityFooter = `
<span>© AeThex Labs 2026</span>
<a href="/">
<svg width="18" height="18" style="vertical-align:middle;margin-right:4px;" viewBox="0 0 24 24"><polygon points="12,3 22,21 2,21" fill="none" stroke="#ffa500" stroke-width="2"/><circle cx="12" cy="15" r="2" fill="#ffa500"/></svg>
Home
</a>
<a href="/labs">
<svg width="18" height="18" style="vertical-align:middle;margin-right:4px;" viewBox="0 0 24 24"><polygon points="12,2 21,7 21,17 12,22 3,17 3,7" fill="none" stroke="#ffa500" stroke-width="2"/><circle cx="12" cy="12" r="2" fill="#ffa500"/></svg>
Labs
</a>
<a href="/labs#projects">
<svg width="18" height="18" style="vertical-align:middle;margin-right:4px;" viewBox="0 0 24 24"><rect x="4" y="4" width="16" height="16" rx="4" fill="none" stroke="#ffa500" stroke-width="2"/><path d="M8 8h8v8H8z" fill="#ffa500"/><circle cx="12" cy="12" r="1.5" fill="#fff"/></svg>
R&D Projects
</a>
`;
---
<MainLayout>
<MainLayout entityFooter={entityFooter}>
<nav class="container">
<div class="logo">AETHEX</div>
<div class="nav-links">
@ -38,10 +52,7 @@ import MainLayout from '../layouts/MainLayout.astro';
</ul>
</section>
</div>
<footer class="entity-footer">
<span>© AeThex Labs 2026</span>
<a href="/">Home</a>
</footer>
<!-- Footer content is now passed to MainLayout as a prop -->
<style>
.fade-in-section { opacity: 0; transform: translateY(32px); animation: fadeInSection 1.2s 0.5s cubic-bezier(.77,0,.175,1) forwards; }
@keyframes fadeInSection { to { opacity: 1; transform: none; } }
@ -64,8 +75,38 @@ import MainLayout from '../layouts/MainLayout.astro';
ul { color: #fff; margin-top: 24px; padding-left: 24px; }
ul li { margin-bottom: 14px; transition: color 0.2s, transform 0.2s; cursor: pointer; font-size: 1.08em; }
ul li:hover { color: #ffa500; transform: scale(1.05); }
.entity-footer { text-align: center; margin-top: 48px; color: #fff; font-size: 1em; opacity: 0.7; }
.entity-footer a { color: #ffa500; margin-left: 16px; text-decoration: underline; }
.glass-footer {
background: rgba(30,30,20,0.55);
backdrop-filter: blur(8px);
border-top: 3px solid #ffa500;
border-radius: 18px 18px 0 0;
box-shadow: 0 -2px 24px #ffa50040;
margin: 56px auto 0 auto;
max-width: 650px;
padding: 24px 32px 18px 32px;
text-align: center;
color: #fff;
font-size: 1.08em;
opacity: 0.95;
display: flex;
flex-wrap: wrap;
gap: 18px;
justify-content: center;
align-items: center;
}
.glass-footer a {
color: #ffa500;
margin: 0 8px;
text-decoration: none;
font-weight: 600;
display: inline-flex;
align-items: center;
transition: color 0.2s, text-shadow 0.2s;
}
.glass-footer a:hover {
color: #fff;
text-shadow: 0 0 8px #ffa500;
}
@media (max-width: 768px) {
.hero-banner { height: auto; min-height: 280px; padding: 40px 20px; }

View file

@ -0,0 +1,14 @@
---
import MainLayout from '../layouts/MainLayout.astro';
import LiveActivityFeed from '../components/LiveActivityFeed.astro';
---
<MainLayout>
<section class="tool-hero">
<div class="tool-hero-bg tool-hero-bg-live"></div>
<h1 class="tool-hero-title gradient-text">Live Activity Feed</h1>
<p class="tool-hero-desc">See the latest events, launches, and updates across the AeThex ecosystem in real time.</p>
</section>
<section class="tool-content">
<LiveActivityFeed />
</section>
</MainLayout>

8
src/pages/products.astro Normal file
View file

@ -0,0 +1,8 @@
---
import MainLayout from '../layouts/MainLayout.astro';
import ProductsSection from '../components/ProductsSection.astro';
---
<MainLayout>
<h1>Our Products</h1>
<ProductsSection />
</MainLayout>

120
src/pages/random-site.astro Normal file
View file

@ -0,0 +1,120 @@
---
import MainLayout from '../layouts/MainLayout.astro';
import RandomSiteButtonReact from '../components/RandomSiteButtonReact.jsx';
---
<MainLayout>
<section class="tool-hero tool-hero-random">
<div class="tool-hero-bg tool-hero-bg-random"></div>
<h1 class="tool-hero-title gradient-text">Random Site Teleport</h1>
<p class="tool-hero-desc">Feeling adventurous? Instantly teleport to a random AeThex division or product. Discover something new every time you click!</p>
</section>
<section class="tool-content tool-content-random">
<div class="random-site-ecosystem">
<div class="random-site-card">
<div class="random-site-icon">🌐</div>
<div class="random-site-label">Foundation</div>
</div>
<div class="random-site-card">
<div class="random-site-icon">🏢</div>
<div class="random-site-label">Corporation</div>
</div>
<div class="random-site-card">
<div class="random-site-icon">🧪</div>
<div class="random-site-label">Labs</div>
</div>
<div class="random-site-card">
<div class="random-site-icon">📚</div>
<div class="random-site-label">Docs</div>
</div>
</div>
<div class="random-site-live">
<h2>Teleport Now</h2>
<RandomSiteButtonReact client:load />
<div class="random-site-tip">
<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg"><circle cx="10" cy="10" r="10" fill="#ffd580"/><text x="10" y="15" text-anchor="middle" font-size="14" fill="#222" font-family="monospace">?</text></svg>
<span>Each click takes you somewhere new in the AeThex universe.</span>
</div>
</div>
</section>
<style>
.tool-hero-random {
background: linear-gradient(120deg, #0a0a0a 60%, #ff1a1a 100%);
}
.tool-content-random {
display: flex;
flex-wrap: wrap;
gap: 2.5em;
justify-content: center;
align-items: flex-start;
margin-top: 2em;
}
.random-site-ecosystem {
display: flex;
flex-direction: column;
gap: 1.5em;
}
@media (min-width: 700px) {
.random-site-ecosystem {
flex-direction: row;
}
}
.random-site-card {
background: #23232b;
border-radius: 16px;
box-shadow: 0 2px 16px #0006;
padding: 1.2em 1.5em;
min-width: 120px;
max-width: 140px;
display: flex;
flex-direction: column;
align-items: center;
border: 1.5px solid #333;
}
.random-site-icon {
font-size: 2.2em;
margin-bottom: 0.4em;
}
.random-site-label {
font-size: 1.05em;
color: #ffd580;
font-weight: 700;
}
.random-site-live {
flex: 1 1 320px;
min-width: 320px;
max-width: 420px;
background: rgba(30,30,40,0.98);
border-radius: 18px;
box-shadow: 0 2px 16px #0006;
padding: 1.2em 1.5em 2em 1.5em;
color: #fff;
border: 1.5px solid #333;
display: flex;
flex-direction: column;
align-items: center;
}
.random-site-live h2 {
margin-top: 0;
font-size: 1.15em;
letter-spacing: 0.02em;
color: #ff1a1a;
}
.random-site-tip {
display: flex;
align-items: center;
gap: 0.6em;
margin-top: 1.2em;
font-size: 1em;
color: #ffd580;
background: #23232b;
border-radius: 8px;
padding: 0.5em 1em;
}
.random-site-tip svg {
flex-shrink: 0;
}
</style>
</MainLayout>

14
src/pages/sso-demo.astro Normal file
View file

@ -0,0 +1,14 @@
---
import MainLayout from '../layouts/MainLayout.astro';
import PassportSSODemoReact from '../components/PassportSSODemoReact.jsx';
---
<MainLayout>
<section class="tool-hero">
<div class="tool-hero-bg tool-hero-bg-sso"></div>
<h1 class="tool-hero-title gradient-text">Passport SSO Demo</h1>
<p class="tool-hero-desc">Try out AeThex Passport single sign-on. Log in once, access all AeThex services securely.</p>
</section>
<section class="tool-content">
<PassportSSODemoReact client:load />
</section>
</MainLayout>

View file

@ -0,0 +1,170 @@
---
import ThemeSwitcherReact from '../components/ThemeSwitcherReact.jsx';
export const layout = '../layouts/MainLayout.astro';
---
<section class="theme-hero">
<div class="theme-hero-bg"></div>
<div class="theme-hero-content">
<h1 class="theme-hero-title gradient-text">Theme Switcher</h1>
<p class="theme-hero-desc">Switch between all official AeThex color themes. Instantly preview Default, Retro, Neon, and Hacker—your style, your vibe.</p>
</div>
</section>
<section class="theme-main">
<div class="theme-container">
<div class="theme-live-header">
<span class="theme-live-icon">🎨</span>
<span class="theme-live-title">Live Theme Switcher</span>
</div>
<ThemeSwitcherReact client:load />
<div class="theme-tip">
<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg"><circle cx="10" cy="10" r="10" fill="#ffd580"/><text x="10" y="15" text-anchor="middle" font-size="14" fill="#222" font-family="monospace">i</text></svg>
<span>Theme preference is saved for your session. Try all four!</span>
</div>
<div class="theme-previews">
<div class="theme-preview theme-preview-default">
<div class="theme-preview-label">Default</div>
<div class="theme-preview-box" style="background:#0a0a0a;color:#fff;">Aa</div>
</div>
<div class="theme-preview theme-preview-retro">
<div class="theme-preview-label">Retro</div>
<div class="theme-preview-box" style="background:#f4ecd8;color:#222;">Aa</div>
</div>
<div class="theme-preview theme-preview-neon">
<div class="theme-preview-label">Neon</div>
<div class="theme-preview-box" style="background:#0f0020;color:#39ff14;">Aa</div>
</div>
<div class="theme-preview theme-preview-hacker">
<div class="theme-preview-label">Hacker</div>
<div class="theme-preview-box" style="background:#101c10;color:#00ff00;">Aa</div>
</div>
</div>
</div>
</section>
<style>
.theme-hero {
position: relative;
width: 100vw;
left: 50%;
right: 50%;
margin-left: -50vw;
margin-right: -50vw;
background: linear-gradient(120deg, #0a0a0a 60%, #ffd580 100%);
padding: 4.5em 0 2.5em 0;
display: flex;
align-items: center;
justify-content: center;
min-height: 260px;
overflow: hidden;
}
.theme-hero-bg {
position: absolute;
inset: 0;
background: url('/brand/brand-bg.svg'), linear-gradient(120deg, #0a0a0a 60%, #ffd580 100%);
opacity: 0.13;
z-index: 1;
}
.theme-hero-content {
position: relative;
z-index: 2;
text-align: center;
}
.theme-hero-title {
font-size: 2.5em;
margin-bottom: 0.2em;
}
.theme-hero-desc {
font-size: 1.2em;
color: #ffd580;
margin-bottom: 0;
}
.theme-main {
display: flex;
justify-content: center;
margin-top: -2.5em;
margin-bottom: 3em;
}
.theme-container {
background: rgba(30,30,40,0.98);
border-radius: 22px;
box-shadow: 0 2px 24px #0008;
padding: 2.2em 2em 2.5em 2em;
max-width: 480px;
width: 100%;
border: 1.5px solid #333;
display: flex;
flex-direction: column;
align-items: center;
}
.theme-live-header {
display: flex;
align-items: center;
gap: 0.7em;
margin-bottom: 1.2em;
}
.theme-live-icon {
font-size: 1.5em;
}
.theme-live-title {
font-size: 1.1em;
font-weight: 700;
color: #ffd580;
letter-spacing: 0.01em;
}
.theme-tip {
display: flex;
align-items: center;
gap: 0.6em;
margin-top: 1.5em;
font-size: 1em;
color: #ffd580;
background: #23232b;
border-radius: 8px;
padding: 0.5em 1em;
}
.theme-tip svg {
flex-shrink: 0;
}
.theme-previews {
display: flex;
gap: 1.2em;
margin-top: 2em;
flex-wrap: wrap;
justify-content: center;
}
.theme-preview {
display: flex;
flex-direction: column;
align-items: center;
min-width: 80px;
}
.theme-preview-label {
font-size: 0.98em;
color: #ffd580;
margin-bottom: 0.3em;
font-weight: 700;
}
.theme-preview-box {
font-size: 2em;
font-family: monospace;
border-radius: 8px;
padding: 0.3em 0.7em;
box-shadow: 0 1px 6px #0003;
}
@media (max-width: 600px) {
.theme-hero-title {
font-size: 1.5em;
}
.theme-container {
padding: 1.2em 0.5em 1.5em 0.5em;
}
.theme-previews {
gap: 0.5em;
}
}
</style>

14
src/pages/timeline.astro Normal file
View file

@ -0,0 +1,14 @@
---
import MainLayout from '../layouts/MainLayout.astro';
import EcosystemTimeline from '../components/EcosystemTimeline.astro';
---
<MainLayout>
<section class="tool-hero">
<div class="tool-hero-bg tool-hero-bg-timeline"></div>
<h1 class="tool-hero-title gradient-text">Ecosystem Timeline</h1>
<p class="tool-hero-desc">Explore the major milestones and launches in AeThex history. See how the ecosystem has evolved.</p>
</section>
<section class="tool-content">
<EcosystemTimeline />
</section>
</MainLayout>

View file

@ -0,0 +1,123 @@
---
import UniversalSearchReact from '../components/UniversalSearchReact.jsx';
export const layout = '../layouts/MainLayout.astro';
---
<section class="search-hero">
<div class="search-hero-bg"></div>
<div class="search-hero-content">
<h1 class="search-hero-title gradient-text">Universal Search</h1>
<p class="search-hero-desc">Search the entire AeThex ecosystem. Instantly find divisions, products, docs, and more—all from one place.</p>
</div>
</section>
<section class="search-main">
<div class="search-container">
<div class="search-live-header">
<span class="search-live-icon">🔎</span>
<span class="search-live-title">Live Universal Search</span>
</div>
<UniversalSearchReact client:load />
<div class="search-tip">
<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg"><circle cx="10" cy="10" r="10" fill="#ffd580"/><text x="10" y="15" text-anchor="middle" font-size="14" fill="#222" font-family="monospace">i</text></svg>
<span>Try searching for <b>Labs</b>, <b>Docs</b>, or <b>Foundation</b>.</span>
</div>
</div>
</section>
<style>
.search-hero {
position: relative;
width: 100vw;
left: 50%;
right: 50%;
margin-left: -50vw;
margin-right: -50vw;
background: linear-gradient(120deg, #0a0a0a 60%, #39ff14 100%);
padding: 4.5em 0 2.5em 0;
display: flex;
align-items: center;
justify-content: center;
min-height: 260px;
overflow: hidden;
}
.search-hero-bg {
position: absolute;
inset: 0;
background: url('/brand/brand-bg.svg'), linear-gradient(120deg, #0a0a0a 60%, #39ff14 100%);
opacity: 0.13;
z-index: 1;
}
.search-hero-content {
position: relative;
z-index: 2;
text-align: center;
}
.search-hero-title {
font-size: 2.5em;
margin-bottom: 0.2em;
}
.search-hero-desc {
font-size: 1.2em;
color: #baffc9;
margin-bottom: 0;
}
.search-main {
display: flex;
justify-content: center;
margin-top: -2.5em;
margin-bottom: 3em;
}
.search-container {
background: rgba(30,30,40,0.98);
border-radius: 22px;
box-shadow: 0 2px 24px #0008;
padding: 2.2em 2em 2.5em 2em;
max-width: 480px;
width: 100%;
border: 1.5px solid #333;
display: flex;
flex-direction: column;
align-items: center;
}
.search-live-header {
display: flex;
align-items: center;
gap: 0.7em;
margin-bottom: 1.2em;
}
.search-live-icon {
font-size: 1.5em;
}
.search-live-title {
font-size: 1.1em;
font-weight: 700;
color: #39ff14;
letter-spacing: 0.01em;
}
.search-tip {
display: flex;
align-items: center;
gap: 0.6em;
margin-top: 1.5em;
font-size: 1em;
color: #ffd580;
background: #23232b;
border-radius: 8px;
padding: 0.5em 1em;
}
.search-tip svg {
flex-shrink: 0;
}
@media (max-width: 600px) {
.search-hero-title {
font-size: 1.5em;
}
.search-container {
padding: 1.2em 0.5em 1.5em 0.5em;
}
}
</style>

View file

@ -1,5 +1,14 @@
{
"extends": "astro/tsconfigs/strict",
"include": [".astro/types.d.ts", "**/*"],
"exclude": ["dist"]
}
"include": [
".astro/types.d.ts",
"**/*"
],
"exclude": [
"dist"
],
"compilerOptions": {
"jsx": "react-jsx",
"jsxImportSource": "react"
}
}