Initial BM Alpha landing page
This commit is contained in:
@@ -0,0 +1,9 @@
|
|||||||
|
# GEMINI_API_KEY: Required for Gemini AI API calls.
|
||||||
|
# AI Studio automatically injects this at runtime from user secrets.
|
||||||
|
# Users configure this via the Secrets panel in the AI Studio UI.
|
||||||
|
GEMINI_API_KEY="MY_GEMINI_API_KEY"
|
||||||
|
|
||||||
|
# APP_URL: The URL where this applet is hosted.
|
||||||
|
# AI Studio automatically injects this at runtime with the Cloud Run service URL.
|
||||||
|
# Used for self-referential links, OAuth callbacks, and API endpoints.
|
||||||
|
APP_URL="MY_APP_URL"
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
node_modules/
|
||||||
|
build/
|
||||||
|
dist/
|
||||||
|
coverage/
|
||||||
|
.DS_Store
|
||||||
|
*.log
|
||||||
|
.env*
|
||||||
|
!.env.example
|
||||||
@@ -0,0 +1,114 @@
|
|||||||
|
# BM Alpha
|
||||||
|
|
||||||
|
> The community-powered meme coin from BirthdayMessaging, built on Solana.
|
||||||
|
|
||||||
|
BM Alpha (`$BMALPHA`) is a launch landing page for the BirthdayMessaging community. It brings the launch countdown, token details, tokenomics, buying guide, and community links into one responsive web experience.
|
||||||
|
|
||||||
|
**Launch:** August 24, 2026 at 12:00 UTC
|
||||||
|
**Network:** Solana
|
||||||
|
**Contract address:** Coming soon
|
||||||
|
|
||||||
|
## Features
|
||||||
|
|
||||||
|
- Responsive landing page with light and dark themes
|
||||||
|
- Live countdown to the planned launch
|
||||||
|
- Token information and allocation dashboard
|
||||||
|
- One-click contract address copying when the address is available
|
||||||
|
- Four-step Solana wallet and swap guide
|
||||||
|
- Community links for X, Discord, WhatsApp, and YouTube
|
||||||
|
- Motion effects and launch confetti interactions
|
||||||
|
|
||||||
|
## Tech Stack
|
||||||
|
|
||||||
|
- React 19 and TypeScript
|
||||||
|
- Vite
|
||||||
|
- Tailwind CSS 4
|
||||||
|
- Motion
|
||||||
|
- Lucide React
|
||||||
|
- `canvas-confetti`
|
||||||
|
|
||||||
|
## Getting Started
|
||||||
|
|
||||||
|
### Prerequisites
|
||||||
|
|
||||||
|
- Node.js 18 or newer
|
||||||
|
- npm
|
||||||
|
|
||||||
|
### Install and run
|
||||||
|
|
||||||
|
```bash
|
||||||
|
npm install
|
||||||
|
npm run dev
|
||||||
|
```
|
||||||
|
|
||||||
|
The development server runs at [http://localhost:3000](http://localhost:3000).
|
||||||
|
|
||||||
|
### Available scripts
|
||||||
|
|
||||||
|
| Command | Description |
|
||||||
|
| --- | --- |
|
||||||
|
| `npm run dev` | Start the Vite development server on port 3000 |
|
||||||
|
| `npm run build` | Create a production build in `dist/` |
|
||||||
|
| `npm run preview` | Preview the production build locally |
|
||||||
|
| `npm run lint` | Run the TypeScript compiler without emitting files |
|
||||||
|
| `npm run clean` | Remove generated build and server files |
|
||||||
|
|
||||||
|
## Tokenomics
|
||||||
|
|
||||||
|
| Allocation | Share | Amount | Purpose |
|
||||||
|
| --- | ---: | ---: | --- |
|
||||||
|
| Community & Public | 40% | 4,000,000,000 | Public distribution and community growth |
|
||||||
|
| Liquidity | 25% | 2,500,000,000 | Solana-based decentralized exchange liquidity |
|
||||||
|
| Marketing | 15% | 1,500,000,000 | Promotions, content, campaigns, and partnerships |
|
||||||
|
| Rewards & Ecosystem | 10% | 1,000,000,000 | Contests, incentives, and ecosystem activities |
|
||||||
|
| Team | 5% | 500,000,000 | Contributors developing and maintaining the project |
|
||||||
|
| Treasury | 5% | 500,000,000 | Future project expenses and strategic initiatives |
|
||||||
|
|
||||||
|
**Total supply:** 10,000,000,000 BMALPHA
|
||||||
|
**Buy/sell tax:** 0% / 0%
|
||||||
|
**Liquidity:** Planned to be 100% locked at launch
|
||||||
|
|
||||||
|
## Configuration
|
||||||
|
|
||||||
|
Project-wide launch details and external links live in [`src/config.ts`](src/config.ts). Update that file when the contract address, launch details, purchase link, or social URLs change.
|
||||||
|
|
||||||
|
The contract address is intentionally set to `COMING SOON` until the official token address is available. Always verify the address through the official community channels before purchasing.
|
||||||
|
|
||||||
|
## Project Structure
|
||||||
|
|
||||||
|
```text
|
||||||
|
src/
|
||||||
|
├── components/ Page sections and reusable UI components
|
||||||
|
├── context/ Theme state and provider
|
||||||
|
├── utils/ Client-side interaction helpers
|
||||||
|
├── App.tsx Page composition
|
||||||
|
├── config.ts Launch, token, and community configuration
|
||||||
|
├── index.css Global styles
|
||||||
|
└── main.tsx React entry point
|
||||||
|
```
|
||||||
|
|
||||||
|
## Production Build
|
||||||
|
|
||||||
|
Build the site and serve the generated output with any static hosting provider:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
npm run build
|
||||||
|
npm run preview
|
||||||
|
```
|
||||||
|
|
||||||
|
The generated files are placed in `dist/`. Vercel, Netlify, GitHub Pages, Cloudflare Pages, and similar services can deploy the site as a Vite static application.
|
||||||
|
|
||||||
|
## Community
|
||||||
|
|
||||||
|
- [X / Twitter](https://x.com/TheBMBlueprint)
|
||||||
|
- [Discord](https://discord.gg/U7MUMrBas)
|
||||||
|
- [WhatsApp](https://chat.whatsapp.com/LBsTvHFSZOPJ7e3ru1Covq)
|
||||||
|
- [YouTube](https://www.youtube.com/@birthdaymessaging)
|
||||||
|
|
||||||
|
## Disclaimer
|
||||||
|
|
||||||
|
BM Alpha is a community-driven meme coin project. This repository and website are for informational and community purposes only and do not constitute financial, investment, legal, or tax advice. Cryptocurrency assets are volatile and may lose value. Do your own research and verify official links and contract information before interacting with any token or wallet.
|
||||||
|
|
||||||
|
## License
|
||||||
|
|
||||||
|
No license has been declared for this repository yet. Until a license is added, all rights are reserved by the copyright holder.
|
||||||
@@ -0,0 +1,668 @@
|
|||||||
|
{
|
||||||
|
"lockfileVersion": 1,
|
||||||
|
"configVersion": 1,
|
||||||
|
"workspaces": {
|
||||||
|
"": {
|
||||||
|
"name": "react-example",
|
||||||
|
"dependencies": {
|
||||||
|
"@google/genai": "^2.4.0",
|
||||||
|
"@tailwindcss/vite": "^4.1.14",
|
||||||
|
"@types/canvas-confetti": "^1.9.0",
|
||||||
|
"@vitejs/plugin-react": "^5.0.4",
|
||||||
|
"canvas-confetti": "^1.9.4",
|
||||||
|
"dotenv": "^17.2.3",
|
||||||
|
"express": "^4.21.2",
|
||||||
|
"lucide-react": "^0.546.0",
|
||||||
|
"motion": "^12.23.24",
|
||||||
|
"react": "^19.0.1",
|
||||||
|
"react-dom": "^19.0.1",
|
||||||
|
"vite": "^6.2.3",
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"@types/express": "^4.17.21",
|
||||||
|
"@types/node": "^22.14.0",
|
||||||
|
"autoprefixer": "^10.4.21",
|
||||||
|
"esbuild": "^0.25.0",
|
||||||
|
"tailwindcss": "^4.1.14",
|
||||||
|
"tsx": "^4.21.0",
|
||||||
|
"typescript": "~5.8.2",
|
||||||
|
"vite": "^6.2.3",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
"packages": {
|
||||||
|
"@babel/code-frame": ["@babel/[email protected]", "", { "dependencies": { "@babel/helper-validator-identifier": "^7.29.7", "js-tokens": "^4.0.0", "picocolors": "^1.1.1" } }, "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw=="],
|
||||||
|
|
||||||
|
"@babel/compat-data": ["@babel/[email protected]", "", {}, "sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg=="],
|
||||||
|
|
||||||
|
"@babel/core": ["@babel/[email protected]", "", { "dependencies": { "@babel/code-frame": "^7.29.7", "@babel/generator": "^7.29.7", "@babel/helper-compilation-targets": "^7.29.7", "@babel/helper-module-transforms": "^7.29.7", "@babel/helpers": "^7.29.7", "@babel/parser": "^7.29.7", "@babel/template": "^7.29.7", "@babel/traverse": "^7.29.7", "@babel/types": "^7.29.7", "@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" } }, "sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA=="],
|
||||||
|
|
||||||
|
"@babel/generator": ["@babel/[email protected]", "", { "dependencies": { "@babel/parser": "^7.29.8", "@babel/types": "^7.29.8", "@jridgewell/gen-mapping": "^0.3.12", "@jridgewell/trace-mapping": "^0.3.28", "jsesc": "^3.0.2" } }, "sha512-gZbepsdh3WDtgZKWL+vTPh71LSBrm/Y4/QDZBVCcYfmeTEEuoOYwlSy+G1StfJg+/Zy550u/3TATbm7qDbbMtg=="],
|
||||||
|
|
||||||
|
"@babel/helper-compilation-targets": ["@babel/[email protected]", "", { "dependencies": { "@babel/compat-data": "^7.29.7", "@babel/helper-validator-option": "^7.29.7", "browserslist": "^4.24.0", "lru-cache": "^5.1.1", "semver": "^6.3.1" } }, "sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g=="],
|
||||||
|
|
||||||
|
"@babel/helper-globals": ["@babel/[email protected]", "", {}, "sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA=="],
|
||||||
|
|
||||||
|
"@babel/helper-module-imports": ["@babel/[email protected]", "", { "dependencies": { "@babel/traverse": "^7.29.7", "@babel/types": "^7.29.7" } }, "sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g=="],
|
||||||
|
|
||||||
|
"@babel/helper-module-transforms": ["@babel/[email protected]", "", { "dependencies": { "@babel/helper-module-imports": "^7.29.7", "@babel/helper-validator-identifier": "^7.29.7", "@babel/traverse": "^7.29.7" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg=="],
|
||||||
|
|
||||||
|
"@babel/helper-plugin-utils": ["@babel/[email protected]", "", {}, "sha512-G7sHYigPY17oO5SYWnfD/0MTBwVR781S/JI643e/JhUYgVgWE/61SoW3NH9KWUKyKq5LVh3npif99Wkt6j86Jw=="],
|
||||||
|
|
||||||
|
"@babel/helper-string-parser": ["@babel/[email protected]", "", {}, "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw=="],
|
||||||
|
|
||||||
|
"@babel/helper-validator-identifier": ["@babel/[email protected]", "", {}, "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg=="],
|
||||||
|
|
||||||
|
"@babel/helper-validator-option": ["@babel/[email protected]", "", {}, "sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw=="],
|
||||||
|
|
||||||
|
"@babel/helpers": ["@babel/[email protected]", "", { "dependencies": { "@babel/template": "^7.29.7", "@babel/types": "^7.29.7" } }, "sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg=="],
|
||||||
|
|
||||||
|
"@babel/parser": ["@babel/[email protected]", "", { "dependencies": { "@babel/types": "^7.29.8" }, "bin": "./bin/babel-parser.js" }, "sha512-E8lTAYNB1KW+FH+VGJuZM1ioAx2E6oVlvQFRrf5P8ZZmsiJXYAD9vTFV7yyEURNzgh1dFqMZuO6tUwcARbqFCA=="],
|
||||||
|
|
||||||
|
"@babel/plugin-transform-react-jsx-self": ["@babel/[email protected]", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.29.7" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-TL0hMc9xzy86VD31nUiwzd5otRAcyEPcsegCxolO0PvcXuH1v0kECe/UIznYFihpkvU5wg/jk4v0TTEFfm53fw=="],
|
||||||
|
|
||||||
|
"@babel/plugin-transform-react-jsx-source": ["@babel/[email protected]", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.29.7" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-06IyK09H3wi4cGbhDBwp5gUGo0IKtnYa8tyTiephirPCK6fbobVGiXMMI5zLQ4aKEYP3wZ3ArU44o+8KMrSG/Q=="],
|
||||||
|
|
||||||
|
"@babel/template": ["@babel/[email protected]", "", { "dependencies": { "@babel/code-frame": "^7.29.7", "@babel/parser": "^7.29.7", "@babel/types": "^7.29.7" } }, "sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg=="],
|
||||||
|
|
||||||
|
"@babel/traverse": ["@babel/[email protected]", "", { "dependencies": { "@babel/code-frame": "^7.29.7", "@babel/generator": "^7.29.8", "@babel/helper-globals": "^7.29.7", "@babel/parser": "^7.29.8", "@babel/template": "^7.29.7", "@babel/types": "^7.29.8", "debug": "^4.3.1" } }, "sha512-I5z7H3bf/41ktsNVLtpN0wAa336HkqIHQ5BuPLEhTkt1jVSyZpeNKIzTgEWmlxjdg81R0IgUCcaE+Ok3NvrfZg=="],
|
||||||
|
|
||||||
|
"@babel/types": ["@babel/[email protected]", "", { "dependencies": { "@babel/helper-string-parser": "^7.29.7", "@babel/helper-validator-identifier": "^7.29.7" } }, "sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg=="],
|
||||||
|
|
||||||
|
"@esbuild/aix-ppc64": ["@esbuild/[email protected]", "", { "os": "aix", "cpu": "ppc64" }, "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA=="],
|
||||||
|
|
||||||
|
"@esbuild/android-arm": ["@esbuild/[email protected]", "", { "os": "android", "cpu": "arm" }, "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg=="],
|
||||||
|
|
||||||
|
"@esbuild/android-arm64": ["@esbuild/[email protected]", "", { "os": "android", "cpu": "arm64" }, "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg=="],
|
||||||
|
|
||||||
|
"@esbuild/android-x64": ["@esbuild/[email protected]", "", { "os": "android", "cpu": "x64" }, "sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg=="],
|
||||||
|
|
||||||
|
"@esbuild/darwin-arm64": ["@esbuild/[email protected]", "", { "os": "darwin", "cpu": "arm64" }, "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg=="],
|
||||||
|
|
||||||
|
"@esbuild/darwin-x64": ["@esbuild/[email protected]", "", { "os": "darwin", "cpu": "x64" }, "sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA=="],
|
||||||
|
|
||||||
|
"@esbuild/freebsd-arm64": ["@esbuild/[email protected]", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg=="],
|
||||||
|
|
||||||
|
"@esbuild/freebsd-x64": ["@esbuild/[email protected]", "", { "os": "freebsd", "cpu": "x64" }, "sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ=="],
|
||||||
|
|
||||||
|
"@esbuild/linux-arm": ["@esbuild/[email protected]", "", { "os": "linux", "cpu": "arm" }, "sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw=="],
|
||||||
|
|
||||||
|
"@esbuild/linux-arm64": ["@esbuild/[email protected]", "", { "os": "linux", "cpu": "arm64" }, "sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ=="],
|
||||||
|
|
||||||
|
"@esbuild/linux-ia32": ["@esbuild/[email protected]", "", { "os": "linux", "cpu": "ia32" }, "sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA=="],
|
||||||
|
|
||||||
|
"@esbuild/linux-loong64": ["@esbuild/[email protected]", "", { "os": "linux", "cpu": "none" }, "sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng=="],
|
||||||
|
|
||||||
|
"@esbuild/linux-mips64el": ["@esbuild/[email protected]", "", { "os": "linux", "cpu": "none" }, "sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw=="],
|
||||||
|
|
||||||
|
"@esbuild/linux-ppc64": ["@esbuild/[email protected]", "", { "os": "linux", "cpu": "ppc64" }, "sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA=="],
|
||||||
|
|
||||||
|
"@esbuild/linux-riscv64": ["@esbuild/[email protected]", "", { "os": "linux", "cpu": "none" }, "sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w=="],
|
||||||
|
|
||||||
|
"@esbuild/linux-s390x": ["@esbuild/[email protected]", "", { "os": "linux", "cpu": "s390x" }, "sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg=="],
|
||||||
|
|
||||||
|
"@esbuild/linux-x64": ["@esbuild/[email protected]", "", { "os": "linux", "cpu": "x64" }, "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw=="],
|
||||||
|
|
||||||
|
"@esbuild/netbsd-arm64": ["@esbuild/[email protected]", "", { "os": "none", "cpu": "arm64" }, "sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg=="],
|
||||||
|
|
||||||
|
"@esbuild/netbsd-x64": ["@esbuild/[email protected]", "", { "os": "none", "cpu": "x64" }, "sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ=="],
|
||||||
|
|
||||||
|
"@esbuild/openbsd-arm64": ["@esbuild/[email protected]", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A=="],
|
||||||
|
|
||||||
|
"@esbuild/openbsd-x64": ["@esbuild/[email protected]", "", { "os": "openbsd", "cpu": "x64" }, "sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw=="],
|
||||||
|
|
||||||
|
"@esbuild/openharmony-arm64": ["@esbuild/[email protected]", "", { "os": "none", "cpu": "arm64" }, "sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg=="],
|
||||||
|
|
||||||
|
"@esbuild/sunos-x64": ["@esbuild/[email protected]", "", { "os": "sunos", "cpu": "x64" }, "sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w=="],
|
||||||
|
|
||||||
|
"@esbuild/win32-arm64": ["@esbuild/[email protected]", "", { "os": "win32", "cpu": "arm64" }, "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg=="],
|
||||||
|
|
||||||
|
"@esbuild/win32-ia32": ["@esbuild/[email protected]", "", { "os": "win32", "cpu": "ia32" }, "sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ=="],
|
||||||
|
|
||||||
|
"@esbuild/win32-x64": ["@esbuild/[email protected]", "", { "os": "win32", "cpu": "x64" }, "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA=="],
|
||||||
|
|
||||||
|
"@google/genai": ["@google/[email protected]", "", { "dependencies": { "google-auth-library": "^10.3.0", "p-retry": "^4.6.2", "protobufjs": "^7.5.4", "ws": "^8.18.0" }, "peerDependencies": { "@modelcontextprotocol/sdk": "^1.25.2" }, "optionalPeers": ["@modelcontextprotocol/sdk"] }, "sha512-CdZ3M/titoH81hXXkvOikrOW26bC9IXh9iYT7u+r+5p7wi1LnMEnB0AbJfDeWAkjuneP4oJ299BtCt6twmORWg=="],
|
||||||
|
|
||||||
|
"@jridgewell/gen-mapping": ["@jridgewell/[email protected]", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA=="],
|
||||||
|
|
||||||
|
"@jridgewell/remapping": ["@jridgewell/[email protected]", "", { "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ=="],
|
||||||
|
|
||||||
|
"@jridgewell/resolve-uri": ["@jridgewell/[email protected]", "", {}, "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw=="],
|
||||||
|
|
||||||
|
"@jridgewell/sourcemap-codec": ["@jridgewell/[email protected]", "", {}, "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og=="],
|
||||||
|
|
||||||
|
"@jridgewell/trace-mapping": ["@jridgewell/[email protected]", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw=="],
|
||||||
|
|
||||||
|
"@napi-rs/lzma-linux-x64-gnu": ["@napi-rs/[email protected]", "", { "os": "linux", "cpu": "x64" }, "sha512-oTXEIha4SsuXdTA4Iyskj0kpdx2yVXdhd75c2v3xGrHFfVMsbhTPZU/nMPL4sWKo4pBHm3aucLaqGlF696dTyQ=="],
|
||||||
|
|
||||||
|
"@protobufjs/aspromise": ["@protobufjs/[email protected]", "", {}, "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ=="],
|
||||||
|
|
||||||
|
"@protobufjs/base64": ["@protobufjs/[email protected]", "", {}, "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg=="],
|
||||||
|
|
||||||
|
"@protobufjs/codegen": ["@protobufjs/[email protected]", "", {}, "sha512-zgXFLzW3Ap33e6d0Wlj4MGIm6Ce8O89n/apUaGNB/jx+hw+ruWEp7EwGUshdLKVRCxZW12fp9r40E1mQrf/34g=="],
|
||||||
|
|
||||||
|
"@protobufjs/eventemitter": ["@protobufjs/[email protected]", "", {}, "sha512-vW1GmwMZNnL+gMRaovlh9yZX74kc+TTU3FObkkurpMaRtBfLP3ldjS9KQWlwZgraRE0+dheEEoAxdzcJQ8eXZg=="],
|
||||||
|
|
||||||
|
"@protobufjs/fetch": ["@protobufjs/[email protected]", "", { "dependencies": { "@protobufjs/aspromise": "^1.1.1" } }, "sha512-GpptLrs57adMSuHi3VNj0mAF8dwh36LMaYF6XyJ6JMWlVsc+t42tm1HSEDmOs3A8fC9yyeisgLhsTVQokOZ0zw=="],
|
||||||
|
|
||||||
|
"@protobufjs/float": ["@protobufjs/[email protected]", "", {}, "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ=="],
|
||||||
|
|
||||||
|
"@protobufjs/path": ["@protobufjs/[email protected]", "", {}, "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA=="],
|
||||||
|
|
||||||
|
"@protobufjs/pool": ["@protobufjs/[email protected]", "", {}, "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw=="],
|
||||||
|
|
||||||
|
"@protobufjs/utf8": ["@protobufjs/[email protected]", "", {}, "sha512-b1UQwcEZ4yCnMCD8DAL1VlbvBJE9/IX4FTIp7BG1xYpf29SLazLSrqUkj4w7Y5y7cCVP6E5tcqqcI0xemPkHug=="],
|
||||||
|
|
||||||
|
"@rolldown/pluginutils": ["@rolldown/[email protected]", "", {}, "sha512-eybk3TjzzzV97Dlj5c+XrBFW57eTNhzod66y9HrBlzJ6NsCrWCp/2kaPS3K9wJmurBC0Tdw4yPjXKZqlznim3Q=="],
|
||||||
|
|
||||||
|
"@rollup/rollup-android-arm-eabi": ["@rollup/[email protected]", "", { "os": "android", "cpu": "arm" }, "sha512-RrPokAb7dmbxFoeO3TloqHyOjgye8RkBhSqmp4aJMIex4c9r46ZstPnleDQOq1t46VOVjwIuwNogIqbodV1Vvg=="],
|
||||||
|
|
||||||
|
"@rollup/rollup-android-arm64": ["@rollup/[email protected]", "", { "os": "android", "cpu": "arm64" }, "sha512-JKuJc+pnpks2pjy7L/N3v/cAkZxYlnmuZoD840ldbMI5KDbC4iO9NKwPKYdjYFCMAIIlBzYSFHxIJVYzRo2/8A=="],
|
||||||
|
|
||||||
|
"@rollup/rollup-darwin-arm64": ["@rollup/[email protected]", "", { "os": "darwin", "cpu": "arm64" }, "sha512-krw5uS2STmvJ02x0uTXHbqQNuz+9eZ1iw+qXk9dmW2gvV4jV7O2hEoOnuhFrpOPiel1mBFtqbxYZZtC46hXLOw=="],
|
||||||
|
|
||||||
|
"@rollup/rollup-darwin-x64": ["@rollup/[email protected]", "", { "os": "darwin", "cpu": "x64" }, "sha512-wsTxtgApb4PrOsNJIm0FZ1h3WvCC+k9uxLJ4ad75hgoS4NiRes2SoJFlDAyMwiUY8IssDqGcHbXuN0sx1tfF1A=="],
|
||||||
|
|
||||||
|
"@rollup/rollup-freebsd-arm64": ["@rollup/[email protected]", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-GUOnQlyZe3yAXhWOtOMsn5Qkrv5E5mZXa0thbARWi5Ei2szlVXJFQhddZ4HbAzh8q92w5twp+CQvs/eFanz9YQ=="],
|
||||||
|
|
||||||
|
"@rollup/rollup-freebsd-x64": ["@rollup/[email protected]", "", { "os": "freebsd", "cpu": "x64" }, "sha512-/Y7f3QuxjzPKsjA/rfEDa3+0vXqyjmJ50Ln8dPpCmWkKTrUoWHG1cWhTqaAMLob2m2nESWuC7yGrREz019Ztqg=="],
|
||||||
|
|
||||||
|
"@rollup/rollup-linux-arm-gnueabihf": ["@rollup/[email protected]", "", { "os": "linux", "cpu": "arm" }, "sha512-81wiiX3v7aqy+T+bT61TJ78yJjRquqFFTTbAPt08imfQQzkPIW8t6aJbkTagtCCrXMNc9D66+geqlK7ydLPNqA=="],
|
||||||
|
|
||||||
|
"@rollup/rollup-linux-arm-musleabihf": ["@rollup/[email protected]", "", { "os": "linux", "cpu": "arm" }, "sha512-9kmDIvNZqdoHOBZgNtpTBeLWYO/LVipM3H/j62P8848/l/VPEQL6N3uxU9pvP1oZAsXyC2MEnFP3ovRjo7WYNQ=="],
|
||||||
|
|
||||||
|
"@rollup/rollup-linux-arm64-gnu": ["@rollup/[email protected]", "", { "os": "linux", "cpu": "arm64" }, "sha512-CcnXHWnXg69g+DX5VWL3FHts3qMRN2uVEHX+BZvGLdd07/gXkn3ePjYtO1LDJvxkGKVHMclKBRa1QUTH+6toYQ=="],
|
||||||
|
|
||||||
|
"@rollup/rollup-linux-arm64-musl": ["@rollup/[email protected]", "", { "os": "linux", "cpu": "arm64" }, "sha512-iFOibiHnTRuhrWLlRsOQFdZJJIa7S8OwkneJr4ocALP16u5yk6lWLINFwhHaEqBFMsKDUZofLkGos7+CPzGB3g=="],
|
||||||
|
|
||||||
|
"@rollup/rollup-linux-loong64-gnu": ["@rollup/[email protected]", "", { "os": "linux", "cpu": "none" }, "sha512-XnWYMI7euHlb5a871xPja+Gm7DRCFU+FGRrtS2sMq9N8FvqtpagUy6gD4YOemC5MRk9xbh8+jYMEJbigFQwsgA=="],
|
||||||
|
|
||||||
|
"@rollup/rollup-linux-loong64-musl": ["@rollup/[email protected]", "", { "os": "linux", "cpu": "none" }, "sha512-qGDAlO0U8xedCcsdRm9oaoQY8DAx/QT7uIxJWhCdx0ceIWX783UC9QSYkdpzAe29wNiVfp24+bZdQmn49o45SQ=="],
|
||||||
|
|
||||||
|
"@rollup/rollup-linux-ppc64-gnu": ["@rollup/[email protected]", "", { "os": "linux", "cpu": "ppc64" }, "sha512-ru4H6ezD7ysA5EiEK6qkkaEb4modH8CTej6kUy/gQi20u3kB3G7Zn8snXXkeJSCOFKG/rbPPtM/+9Wgas1961w=="],
|
||||||
|
|
||||||
|
"@rollup/rollup-linux-ppc64-musl": ["@rollup/[email protected]", "", { "os": "linux", "cpu": "ppc64" }, "sha512-2W4MO5WQVJnbJaZdvDb9rhBDuFU1nKIepPFpJUBsTh2k1YY2g+ODViaWuyOAjQ5cOP7NvrvLzt3wvHOoiAvc7w=="],
|
||||||
|
|
||||||
|
"@rollup/rollup-linux-riscv64-gnu": ["@rollup/[email protected]", "", { "os": "linux", "cpu": "none" }, "sha512-+fxjfuoAmVMCYV5QyjoIpu0cp5DOiOTeqYFk1AVaxGr+/ravWLX89XfQmptsoWcaVy/TGf2hexzbUOrCQIL1CQ=="],
|
||||||
|
|
||||||
|
"@rollup/rollup-linux-riscv64-musl": ["@rollup/[email protected]", "", { "os": "linux", "cpu": "none" }, "sha512-jTn8JfHGL4djjFxPuM06LmNUJDsst2jeVlsd9OmIH6zc5sC9K6rIuO4YajXatLUpBmBKl6b35ro1QZocLi+tcA=="],
|
||||||
|
|
||||||
|
"@rollup/rollup-linux-s390x-gnu": ["@rollup/[email protected]", "", { "os": "linux", "cpu": "s390x" }, "sha512-oCJCJL4pXsoDcP2QZ+JVlPTIRc6266zsIaeJJsWImmF7HO0W8nb6HuSgZlMWxJwaPf8ehbSw8yo0EUw925hKsA=="],
|
||||||
|
|
||||||
|
"@rollup/rollup-linux-x64-gnu": ["@rollup/[email protected]", "", { "os": "linux", "cpu": "x64" }, "sha512-W69hukhZ3KKNRCaMIEzKvcFye42hh0FE1+YoYaf5+Ikacuftoco6yO/xouz0hc5d5W/s3yBro5jRiuEE/Q5vUw=="],
|
||||||
|
|
||||||
|
"@rollup/rollup-linux-x64-musl": ["@rollup/[email protected]", "", { "os": "linux", "cpu": "x64" }, "sha512-qiXbGG2jkjXhzXpsFZSR2Xpb8DN/UaxYsbb/STbuR/6fpaDgRmmaq1B/LmtF2wQFOFOSsK2jdE0RZ3a0zHn4QA=="],
|
||||||
|
|
||||||
|
"@rollup/rollup-openbsd-x64": ["@rollup/[email protected]", "", { "os": "openbsd", "cpu": "x64" }, "sha512-nWeM//hxv8mIo6jD7Hu4o48DVmV9pbV6gsKaWU+4NFyqHoPKwrkRiZGLKUhOBk8qNmDmpwFtPKg80Bo/Tn4xiQ=="],
|
||||||
|
|
||||||
|
"@rollup/rollup-openharmony-arm64": ["@rollup/[email protected]", "", { "os": "none", "cpu": "arm64" }, "sha512-s62SQ/vgsRSvMwDkOEfTqfgASF0f26ZNaQuTA6Aok5lrikf89yI2W0gFHvZb2Jpgc6N8JnOKZgCK2iciO3CsxQ=="],
|
||||||
|
|
||||||
|
"@rollup/rollup-win32-arm64-msvc": ["@rollup/[email protected]", "", { "os": "win32", "cpu": "arm64" }, "sha512-J6wGf8TVGbXJq+HH+ttTvrcfNKPbuZecV6KT1B8I18BC5IURUh5kl4Yl5OEP5eFIUoI5BWxCsyYMhFsDx8kekw=="],
|
||||||
|
|
||||||
|
"@rollup/rollup-win32-ia32-msvc": ["@rollup/[email protected]", "", { "os": "win32", "cpu": "ia32" }, "sha512-zmfrQd/0wu6oJs8Vq8KwY/YtsKSsLtKe/HwAP4Wqy8LhWjeT55fHRAkOhYQ12wI3ayS4Tt12d5CDRD7N96SAYQ=="],
|
||||||
|
|
||||||
|
"@rollup/rollup-win32-x64-gnu": ["@rollup/[email protected]", "", { "os": "win32", "cpu": "x64" }, "sha512-qPzHqdj9rfUD+w79dtE07zi/kFwKyCJqplp5K5ygeLTp7jLpAoc16OAH39HSmRC9UpozaecsleI8uAdEj6v2yw=="],
|
||||||
|
|
||||||
|
"@rollup/rollup-win32-x64-msvc": ["@rollup/[email protected]", "", { "os": "win32", "cpu": "x64" }, "sha512-zD6NdeWEByGE9QF9vCrlJ5YQB4oq9q91kPZS37Jwj5hOkvR1lTBSpsKhKDw4IJtbQ35LsTS1HD9DZYGKIshU1Q=="],
|
||||||
|
|
||||||
|
"@tailwindcss/node": ["@tailwindcss/[email protected]", "", { "dependencies": { "@jridgewell/remapping": "^2.3.5", "enhanced-resolve": "^5.24.1", "jiti": "^2.7.0", "lightningcss": "1.32.0", "magic-string": "^0.30.21", "source-map-js": "^1.2.1", "tailwindcss": "4.3.3" } }, "sha512-/T8IKEsf9VTU6tLjgC7+sv2mOPtQxzE2jMw7u4Tt40Tx+QSZxpzh95/H6cMKoja9XuW7iMdLJYBB0o9G1CaAgg=="],
|
||||||
|
|
||||||
|
"@tailwindcss/oxide": ["@tailwindcss/[email protected]", "", { "optionalDependencies": { "@tailwindcss/oxide-android-arm64": "4.3.3", "@tailwindcss/oxide-darwin-arm64": "4.3.3", "@tailwindcss/oxide-darwin-x64": "4.3.3", "@tailwindcss/oxide-freebsd-x64": "4.3.3", "@tailwindcss/oxide-linux-arm-gnueabihf": "4.3.3", "@tailwindcss/oxide-linux-arm64-gnu": "4.3.3", "@tailwindcss/oxide-linux-arm64-musl": "4.3.3", "@tailwindcss/oxide-linux-x64-gnu": "4.3.3", "@tailwindcss/oxide-linux-x64-musl": "4.3.3", "@tailwindcss/oxide-wasm32-wasi": "4.3.3", "@tailwindcss/oxide-win32-arm64-msvc": "4.3.3", "@tailwindcss/oxide-win32-x64-msvc": "4.3.3" } }, "sha512-krXjAikiaFSPaK/FkAQT5UTx3VormQaiZ5hBFlJZ9UFQGB/rwg1MZIhHAG9smMQRTdyJxP6Qt5MwMtdyU5FWrA=="],
|
||||||
|
|
||||||
|
"@tailwindcss/oxide-android-arm64": ["@tailwindcss/[email protected]", "", { "os": "android", "cpu": "arm64" }, "sha512-Y85A2gmPSkl5Ve5qR86GL4HT509cFqQh1aes9p3sSkyTPwt0Pppf3GkwGe4JPACcRYjgJIEhQgM6dBClnr0NYw=="],
|
||||||
|
|
||||||
|
"@tailwindcss/oxide-darwin-arm64": ["@tailwindcss/[email protected]", "", { "os": "darwin", "cpu": "arm64" }, "sha512-BiaWatpBcERQFDlOjRDpIVXuFK5PJez5SA4JMg6VYZdBYU+qKfV/vqjcIs+IYmtitf1xYQZTwXvU/8y4lfZUGw=="],
|
||||||
|
|
||||||
|
"@tailwindcss/oxide-darwin-x64": ["@tailwindcss/[email protected]", "", { "os": "darwin", "cpu": "x64" }, "sha512-fAeUqfV5ndhxRwai8cXGzdLvul9utWOmeTkv69unv4ZXixjn61Z+p9lCWdwOwA3TYboG3BwdVuN/RDjhBRl0mw=="],
|
||||||
|
|
||||||
|
"@tailwindcss/oxide-freebsd-x64": ["@tailwindcss/[email protected]", "", { "os": "freebsd", "cpu": "x64" }, "sha512-iyf5bV6+wnAlflVeEy7R25dupxTNECZN5QMI0qNT6eT+EgaGdZcKhGkr5SdoaWiLJ3spLqIY9VCeSGrwmtg4kw=="],
|
||||||
|
|
||||||
|
"@tailwindcss/oxide-linux-arm-gnueabihf": ["@tailwindcss/[email protected]", "", { "os": "linux", "cpu": "arm" }, "sha512-aAYUprJAJQWWbRrPvtjdroZ56Md+JM8pMiopS6xGEwDfLhqj+2ver2p4nU4Mb3CRqcMmNBjo8KkUgcxhkzVQGQ=="],
|
||||||
|
|
||||||
|
"@tailwindcss/oxide-linux-arm64-gnu": ["@tailwindcss/[email protected]", "", { "os": "linux", "cpu": "arm64" }, "sha512-nDxldcEENOxZRzC2uu9jrutZdAAQtb+8WWDCSnWL1zvBk1+FN+x6MtDViPB5AJMfttVCUhehGWus3XBPgatM/w=="],
|
||||||
|
|
||||||
|
"@tailwindcss/oxide-linux-arm64-musl": ["@tailwindcss/[email protected]", "", { "os": "linux", "cpu": "arm64" }, "sha512-Md44bD6veX/PC5iyF8cDVnw4HBIANZepRZZ7a8DQOvkfo5WUBwcp6iAuCUz23u+4SUkhJlD3eL7hNdW8ezd/kA=="],
|
||||||
|
|
||||||
|
"@tailwindcss/oxide-linux-x64-gnu": ["@tailwindcss/[email protected]", "", { "os": "linux", "cpu": "x64" }, "sha512-tx7us1muwOKAKWao2v/GaafFeQboE6aj88vC6ziN2NCGcRm8gWUhwjzg+YdVB1e4boAtdtma4L43onunI6NS4w=="],
|
||||||
|
|
||||||
|
"@tailwindcss/oxide-linux-x64-musl": ["@tailwindcss/[email protected]", "", { "os": "linux", "cpu": "x64" }, "sha512-SJxX60smvHgasZoBy11dX6YRjXJFovwWBoedhbQPOBzgFWBHGB+TVPWB9BxzR7TTxU8FQZAI2AyiNCMzFm8Img=="],
|
||||||
|
|
||||||
|
"@tailwindcss/oxide-wasm32-wasi": ["@tailwindcss/[email protected]", "", { "dependencies": { "@emnapi/core": "^1.11.1", "@emnapi/runtime": "^1.11.1", "@emnapi/wasi-threads": "^1.2.2", "@napi-rs/wasm-runtime": "^1.1.4", "@tybys/wasm-util": "^0.10.2", "tslib": "^2.8.1" }, "cpu": "none" }, "sha512-jx1+rPhY/5Ympkktd656HBWEBLxP7dH06losBLjjf5vgCODXvi9KhtftWcMIwTFIDqBr7cRnQkdLnAG+IOlGvQ=="],
|
||||||
|
|
||||||
|
"@tailwindcss/oxide-win32-arm64-msvc": ["@tailwindcss/[email protected]", "", { "os": "win32", "cpu": "arm64" }, "sha512-3rc292Ca2ceK6Ulcc/bAVnTs/3nDtoPhyEKlgPv+yQJQi/JS/AMJlqzxvlDacL1nekbrcf6bTqp/jV4qgnPxNQ=="],
|
||||||
|
|
||||||
|
"@tailwindcss/oxide-win32-x64-msvc": ["@tailwindcss/[email protected]", "", { "os": "win32", "cpu": "x64" }, "sha512-yJ0pwIVc/nYeGoV02WtsN8KYyLQv7kyI2wDnkezyJlGGjkd4QLwDGAwl47YpPJeuI0M0ObaXGSPjvWDPeTPggw=="],
|
||||||
|
|
||||||
|
"@tailwindcss/vite": ["@tailwindcss/[email protected]", "", { "dependencies": { "@tailwindcss/node": "4.3.3", "@tailwindcss/oxide": "4.3.3", "tailwindcss": "4.3.3" }, "peerDependencies": { "vite": "^5.2.0 || ^6 || ^7 || ^8" } }, "sha512-yYU8cogLeSh/ms2jh8Fj7jaba/EWa7Ja6GoUqYZaraEuCI5YS6ms6ObZgjjedm+jm6XZjdNRWBpPP6Z86oOxcw=="],
|
||||||
|
|
||||||
|
"@types/babel__core": ["@types/[email protected]", "", { "dependencies": { "@babel/parser": "^7.20.7", "@babel/types": "^7.20.7", "@types/babel__generator": "*", "@types/babel__template": "*", "@types/babel__traverse": "*" } }, "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA=="],
|
||||||
|
|
||||||
|
"@types/babel__generator": ["@types/[email protected]", "", { "dependencies": { "@babel/types": "^7.0.0" } }, "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg=="],
|
||||||
|
|
||||||
|
"@types/babel__template": ["@types/[email protected]", "", { "dependencies": { "@babel/parser": "^7.1.0", "@babel/types": "^7.0.0" } }, "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A=="],
|
||||||
|
|
||||||
|
"@types/babel__traverse": ["@types/[email protected]", "", { "dependencies": { "@babel/types": "^7.28.2" } }, "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q=="],
|
||||||
|
|
||||||
|
"@types/body-parser": ["@types/[email protected]", "", { "dependencies": { "@types/connect": "*", "@types/node": "*" } }, "sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g=="],
|
||||||
|
|
||||||
|
"@types/canvas-confetti": ["@types/[email protected]", "", {}, "sha512-aBGj/dULrimR1XDZLtG9JwxX1b4HPRF6CX9Yfwh3NvstZEm1ZL7RBnel4keCPSqs1ANRu1u2Aoz9R+VmtjYuTg=="],
|
||||||
|
|
||||||
|
"@types/connect": ["@types/[email protected]", "", { "dependencies": { "@types/node": "*" } }, "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug=="],
|
||||||
|
|
||||||
|
"@types/estree": ["@types/[email protected]", "", {}, "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg=="],
|
||||||
|
|
||||||
|
"@types/express": ["@types/[email protected]", "", { "dependencies": { "@types/body-parser": "*", "@types/express-serve-static-core": "^4.17.33", "@types/qs": "*", "@types/serve-static": "^1" } }, "sha512-dVd04UKsfpINUnK0yBoYHDF3xu7xVH4BuDotC/xGuycx4CgbP48X/KF/586bcObxT0HENHXEU8Nqtu6NR+eKhw=="],
|
||||||
|
|
||||||
|
"@types/express-serve-static-core": ["@types/[email protected]", "", { "dependencies": { "@types/node": "*", "@types/qs": "*", "@types/range-parser": "*", "@types/send": "*" } }, "sha512-QP2ESEe/ImWY0HDwNAnK9PvEffUyhLTnWkk7KXzHfyeWAnlrDe1fN77bXl6ia8KT3wPlmA7t9/VPRpnf4Ex9sg=="],
|
||||||
|
|
||||||
|
"@types/http-errors": ["@types/[email protected]", "", {}, "sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg=="],
|
||||||
|
|
||||||
|
"@types/mime": ["@types/[email protected]", "", {}, "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w=="],
|
||||||
|
|
||||||
|
"@types/node": ["@types/[email protected]", "", { "dependencies": { "undici-types": "~6.21.0" } }, "sha512-EANqOCF9QFyra+4pfxUcX9STKJpCLjMbObVzljIJomAWSnuSIEAvyzEU53GaajbXJEgdh0iEcPL+DGvpUd4k1Q=="],
|
||||||
|
|
||||||
|
"@types/qs": ["@types/[email protected]", "", {}, "sha512-GZHUBZR9hckSUhrxmp1nG6NwdpM9fCunJwyThLW1X3AyHgd9IlHb6VANpQQqDr2o/qQp6McZ3y/IA2rVzKzSbw=="],
|
||||||
|
|
||||||
|
"@types/range-parser": ["@types/[email protected]", "", {}, "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ=="],
|
||||||
|
|
||||||
|
"@types/retry": ["@types/[email protected]", "", {}, "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA=="],
|
||||||
|
|
||||||
|
"@types/send": ["@types/[email protected]", "", { "dependencies": { "@types/node": "*" } }, "sha512-arsCikDvlU99zl1g69TcAB3mzZPpxgw0UQnaHeC1Nwb015xp8bknZv5rIfri9xTOcMuaVgvabfIRA7PSZVuZIQ=="],
|
||||||
|
|
||||||
|
"@types/serve-static": ["@types/[email protected]", "", { "dependencies": { "@types/http-errors": "*", "@types/node": "*", "@types/send": "<1" } }, "sha512-tRs1dB+g8Itk72rlSI2ZrW6vZg0YrLI81iQSTkMmOqnqCaNr/8Ek4VwWcN5vZgCYWbg/JJSGBlUaYGAOP73qBw=="],
|
||||||
|
|
||||||
|
"@vitejs/plugin-react": ["@vitejs/[email protected]", "", { "dependencies": { "@babel/core": "^7.29.0", "@babel/plugin-transform-react-jsx-self": "^7.27.1", "@babel/plugin-transform-react-jsx-source": "^7.27.1", "@rolldown/pluginutils": "1.0.0-rc.3", "@types/babel__core": "^7.20.5", "react-refresh": "^0.18.0" }, "peerDependencies": { "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0" } }, "sha512-YmKkfhOAi3wsB1PhJq5Scj3GXMn3WvtQ/JC0xoopuHoXSdmtdStOpFrYaT1kie2YgFBcIe64ROzMYRjCrYOdYw=="],
|
||||||
|
|
||||||
|
"accepts": ["[email protected]", "", { "dependencies": { "mime-types": "~2.1.34", "negotiator": "0.6.3" } }, "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw=="],
|
||||||
|
|
||||||
|
"agent-base": ["[email protected]", "", {}, "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ=="],
|
||||||
|
|
||||||
|
"array-flatten": ["[email protected]", "", {}, "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg=="],
|
||||||
|
|
||||||
|
"autoprefixer": ["[email protected]", "", { "dependencies": { "browserslist": "^4.28.6", "caniuse-lite": "^1.0.30001806", "fraction.js": "^5.3.4", "picocolors": "^1.1.1", "postcss-value-parser": "^4.2.0" }, "peerDependencies": { "postcss": "^8.1.0" }, "bin": { "autoprefixer": "bin/autoprefixer" } }, "sha512-MaU0U/za7N3r6brxD4YB/l4NSrFzLPlANv6wEuQVaIPlD3L4W9rFcQPbL/EilY9BHhHvhfcz3gInDLrEtWT4EA=="],
|
||||||
|
|
||||||
|
"base64-js": ["[email protected]", "", {}, "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA=="],
|
||||||
|
|
||||||
|
"baseline-browser-mapping": ["[email protected]", "", { "bin": { "baseline-browser-mapping": "dist/cli.cjs" } }, "sha512-JyJ954WzuIR8/FFzX0o5krdSTrBAkcCSRfWSleRsIHSWV+cZe2FI1PKggVkFke1hBldRs+LRxUczzE9iPmgZww=="],
|
||||||
|
|
||||||
|
"bignumber.js": ["[email protected]", "", {}, "sha512-Ko0uX15oIUS7wJ3Rb30Fs6SkVbLmPBAKdlm7q9+ak9bbIeFf0MwuBsQV6z7+X768/cHsfg+WlysDWJcmthjsjQ=="],
|
||||||
|
|
||||||
|
"body-parser": ["[email protected]", "", { "dependencies": { "bytes": "~3.1.2", "content-type": "~1.0.5", "debug": "2.6.9", "depd": "2.0.0", "destroy": "~1.2.0", "http-errors": "~2.0.1", "iconv-lite": "~0.4.24", "on-finished": "~2.4.1", "qs": "~6.15.1", "raw-body": "~2.5.3", "type-is": "~1.6.18", "unpipe": "~1.0.0" } }, "sha512-p5tAzS57i5MV9fZFDj9LeIiTZEufbSe2eDozP+ElheSUq1m74CRq1jI4mYNDdVs9vQztXFLuk/Gd6BWTdwRJ5g=="],
|
||||||
|
|
||||||
|
"browserslist": ["[email protected]", "", { "dependencies": { "baseline-browser-mapping": "^2.11.12", "caniuse-lite": "^1.0.30001809", "electron-to-chromium": "^1.5.402", "node-releases": "^2.0.53", "update-browserslist-db": "^1.3.0" }, "bin": { "browserslist": "cli.js" } }, "sha512-V2NpofLblG64mfOtSgDhOJESZEGogzDMBv/q+W6oc4LXWP/q75eOXoOaaOu1EOadB9U4Bwx/e0yzbvwKH8zalA=="],
|
||||||
|
|
||||||
|
"buffer-equal-constant-time": ["[email protected]", "", {}, "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA=="],
|
||||||
|
|
||||||
|
"bytes": ["[email protected]", "", {}, "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg=="],
|
||||||
|
|
||||||
|
"call-bind-apply-helpers": ["[email protected]", "", { "dependencies": { "es-errors": "^1.3.0", "function-bind": "^1.1.2" } }, "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ=="],
|
||||||
|
|
||||||
|
"call-bound": ["[email protected]", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.2", "get-intrinsic": "^1.3.0" } }, "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg=="],
|
||||||
|
|
||||||
|
"caniuse-lite": ["[email protected]", "", {}, "sha512-xxWVywk6a6Arlk+hymeycyn/VgqEfLDxupvhH/xiY5SJ/18kmi9o6MiO320DCUzypORHLtvh0I4i04tUhCNHNQ=="],
|
||||||
|
|
||||||
|
"canvas-confetti": ["[email protected]", "", {}, "sha512-yxQbJkAVrFXWNbTUjPqjF7G+g6pDotOUHGbkZq2NELZUMDpiJ85rIEazVb8GTaAptNW2miJAXbs1BtioA251Pw=="],
|
||||||
|
|
||||||
|
"content-disposition": ["[email protected]", "", { "dependencies": { "safe-buffer": "5.2.1" } }, "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ=="],
|
||||||
|
|
||||||
|
"content-type": ["[email protected]", "", {}, "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA=="],
|
||||||
|
|
||||||
|
"convert-source-map": ["[email protected]", "", {}, "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg=="],
|
||||||
|
|
||||||
|
"cookie": ["[email protected]", "", {}, "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w=="],
|
||||||
|
|
||||||
|
"cookie-signature": ["[email protected]", "", {}, "sha512-NXdYc3dLr47pBkpUCHtKSwIOQXLVn8dZEuywboCOJY/osA0wFSLlSawr3KN8qXJEyX66FcONTH8EIlVuK0yyFA=="],
|
||||||
|
|
||||||
|
"data-uri-to-buffer": ["[email protected]", "", {}, "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A=="],
|
||||||
|
|
||||||
|
"debug": ["[email protected]", "", { "dependencies": { "ms": "2.0.0" } }, "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA=="],
|
||||||
|
|
||||||
|
"depd": ["[email protected]", "", {}, "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw=="],
|
||||||
|
|
||||||
|
"destroy": ["[email protected]", "", {}, "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg=="],
|
||||||
|
|
||||||
|
"detect-libc": ["[email protected]", "", {}, "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ=="],
|
||||||
|
|
||||||
|
"dotenv": ["[email protected]", "", {}, "sha512-nI4U3TottKAcAD9LLud4Cb7b2QztQMUEfHbvhTH09bqXTxnSie8WnjPALV/WMCrJZ6UV/qHJ6L03OqO3LcdYZw=="],
|
||||||
|
|
||||||
|
"dunder-proto": ["[email protected]", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.1", "es-errors": "^1.3.0", "gopd": "^1.2.0" } }, "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A=="],
|
||||||
|
|
||||||
|
"ecdsa-sig-formatter": ["[email protected]", "", { "dependencies": { "safe-buffer": "^5.0.1" } }, "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ=="],
|
||||||
|
|
||||||
|
"ee-first": ["[email protected]", "", {}, "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow=="],
|
||||||
|
|
||||||
|
"electron-to-chromium": ["[email protected]", "", {}, "sha512-SLoprcYpJ/OH2v2ps0+N5biv9H4/KBT3+YmmDew64TwK5y9j2wv7pMOFY7IorVkyMtEyLSCRlXKLsNlakeAlPw=="],
|
||||||
|
|
||||||
|
"encodeurl": ["[email protected]", "", {}, "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg=="],
|
||||||
|
|
||||||
|
"enhanced-resolve": ["[email protected]", "", { "dependencies": { "graceful-fs": "^4.2.4", "tapable": "^2.3.3" } }, "sha512-L1l8TNvomm6UVW5B253AGxQagSQr+vGwhMlrrfRS2qmhx46AMpMVJKQYLvWYbysTMY8VoicOvzHzoHMbyzB+4A=="],
|
||||||
|
|
||||||
|
"es-define-property": ["[email protected]", "", {}, "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g=="],
|
||||||
|
|
||||||
|
"es-errors": ["[email protected]", "", {}, "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw=="],
|
||||||
|
|
||||||
|
"es-object-atoms": ["[email protected]", "", { "dependencies": { "es-errors": "^1.3.0" } }, "sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw=="],
|
||||||
|
|
||||||
|
"esbuild": ["[email protected]", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.25.12", "@esbuild/android-arm": "0.25.12", "@esbuild/android-arm64": "0.25.12", "@esbuild/android-x64": "0.25.12", "@esbuild/darwin-arm64": "0.25.12", "@esbuild/darwin-x64": "0.25.12", "@esbuild/freebsd-arm64": "0.25.12", "@esbuild/freebsd-x64": "0.25.12", "@esbuild/linux-arm": "0.25.12", "@esbuild/linux-arm64": "0.25.12", "@esbuild/linux-ia32": "0.25.12", "@esbuild/linux-loong64": "0.25.12", "@esbuild/linux-mips64el": "0.25.12", "@esbuild/linux-ppc64": "0.25.12", "@esbuild/linux-riscv64": "0.25.12", "@esbuild/linux-s390x": "0.25.12", "@esbuild/linux-x64": "0.25.12", "@esbuild/netbsd-arm64": "0.25.12", "@esbuild/netbsd-x64": "0.25.12", "@esbuild/openbsd-arm64": "0.25.12", "@esbuild/openbsd-x64": "0.25.12", "@esbuild/openharmony-arm64": "0.25.12", "@esbuild/sunos-x64": "0.25.12", "@esbuild/win32-arm64": "0.25.12", "@esbuild/win32-ia32": "0.25.12", "@esbuild/win32-x64": "0.25.12" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg=="],
|
||||||
|
|
||||||
|
"escalade": ["[email protected]", "", {}, "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA=="],
|
||||||
|
|
||||||
|
"escape-html": ["[email protected]", "", {}, "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow=="],
|
||||||
|
|
||||||
|
"etag": ["[email protected]", "", {}, "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg=="],
|
||||||
|
|
||||||
|
"express": ["[email protected]", "", { "dependencies": { "accepts": "~1.3.8", "array-flatten": "1.1.1", "body-parser": "~1.20.5", "content-disposition": "~0.5.4", "content-type": "~1.0.4", "cookie": "~0.7.1", "cookie-signature": "~1.0.6", "debug": "2.6.9", "depd": "2.0.0", "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "etag": "~1.8.1", "finalhandler": "~1.3.1", "fresh": "~0.5.2", "http-errors": "~2.0.0", "merge-descriptors": "1.0.3", "methods": "~1.1.2", "on-finished": "~2.4.1", "parseurl": "~1.3.3", "path-to-regexp": "~0.1.12", "proxy-addr": "~2.0.7", "qs": "~6.15.1", "range-parser": "~1.2.1", "safe-buffer": "5.2.1", "send": "~0.19.0", "serve-static": "~1.16.2", "setprototypeof": "1.2.0", "statuses": "~2.0.1", "type-is": "~1.6.18", "utils-merge": "1.0.1", "vary": "~1.1.2" } }, "sha512-IuL+Elrou2ZvCFHs18/CIzy2Nzvo25nZ1/D2eIZlz7c+QUayAcYoiM2BthCjs+EBHVpjYjcuLDAiCWgeIX3X1Q=="],
|
||||||
|
|
||||||
|
"extend": ["[email protected]", "", {}, "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g=="],
|
||||||
|
|
||||||
|
"fdir": ["[email protected]", "", { "peerDependencies": { "picomatch": "^3 || ^4" }, "optionalPeers": ["picomatch"] }, "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg=="],
|
||||||
|
|
||||||
|
"fetch-blob": ["[email protected]", "", { "dependencies": { "node-domexception": "^1.0.0", "web-streams-polyfill": "^3.0.3" } }, "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ=="],
|
||||||
|
|
||||||
|
"finalhandler": ["[email protected]", "", { "dependencies": { "debug": "2.6.9", "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "on-finished": "~2.4.1", "parseurl": "~1.3.3", "statuses": "~2.0.2", "unpipe": "~1.0.0" } }, "sha512-aA4RyPcd3badbdABGDuTXCMTtOneUCAYH/gxoYRTZlIJdF0YPWuGqiAsIrhNnnqdXGswYk6dGujem4w80UJFhg=="],
|
||||||
|
|
||||||
|
"formdata-polyfill": ["[email protected]", "", { "dependencies": { "fetch-blob": "^3.1.2" } }, "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g=="],
|
||||||
|
|
||||||
|
"forwarded": ["[email protected]", "", {}, "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow=="],
|
||||||
|
|
||||||
|
"fraction.js": ["[email protected]", "", {}, "sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ=="],
|
||||||
|
|
||||||
|
"framer-motion": ["[email protected]", "", { "dependencies": { "motion-dom": "^12.43.0", "motion-utils": "^12.39.0", "tslib": "^2.4.0" }, "peerDependencies": { "@emotion/is-prop-valid": "*", "react": "^18.0.0 || ^19.0.0", "react-dom": "^18.0.0 || ^19.0.0" }, "optionalPeers": ["@emotion/is-prop-valid", "react", "react-dom"] }, "sha512-1eaL3RvR/kAlbG7UYcpMptEyzPoENO0c6w7ZnB3/hh2vSAz/6uGAFn6fdoqTBguNstf3MsFhJHsD/0DHiclG+g=="],
|
||||||
|
|
||||||
|
"fresh": ["[email protected]", "", {}, "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q=="],
|
||||||
|
|
||||||
|
"fsevents": ["[email protected]", "", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="],
|
||||||
|
|
||||||
|
"function-bind": ["[email protected]", "", {}, "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA=="],
|
||||||
|
|
||||||
|
"gaxios": ["[email protected]", "", { "dependencies": { "extend": "^3.0.2", "https-proxy-agent": "^7.0.1", "node-fetch": "^3.3.2" } }, "sha512-kB3rzJV7d9juLZh8/56QTXCwQfxyhdOMdyYk1HdQKFtF8TJTDTZQJtixWIwXdE9Jji91mC41DUNpjleo4L4eAQ=="],
|
||||||
|
|
||||||
|
"gcp-metadata": ["[email protected]", "", { "dependencies": { "gaxios": "^7.0.0", "google-logging-utils": "^1.0.0", "json-bigint": "^1.0.0" } }, "sha512-zV/5HKTfCeKWnxG0Dmrw51hEWFGfcF2xiXqcA3+J90WDuP0SvoiSO5ORvcBsifmx/FoIjgQN3oNOGaQ5PhLFkg=="],
|
||||||
|
|
||||||
|
"gensync": ["[email protected]", "", {}, "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg=="],
|
||||||
|
|
||||||
|
"get-intrinsic": ["[email protected]", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.2", "es-define-property": "^1.0.1", "es-errors": "^1.3.0", "es-object-atoms": "^1.1.1", "function-bind": "^1.1.2", "get-proto": "^1.0.1", "gopd": "^1.2.0", "has-symbols": "^1.1.0", "hasown": "^2.0.2", "math-intrinsics": "^1.1.0" } }, "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ=="],
|
||||||
|
|
||||||
|
"get-proto": ["[email protected]", "", { "dependencies": { "dunder-proto": "^1.0.1", "es-object-atoms": "^1.0.0" } }, "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g=="],
|
||||||
|
|
||||||
|
"google-auth-library": ["[email protected]", "", { "dependencies": { "base64-js": "^1.3.0", "ecdsa-sig-formatter": "^1.0.11", "gaxios": "^7.1.4", "gcp-metadata": "8.1.2", "google-logging-utils": "1.1.3", "jws": "^4.0.0" } }, "sha512-i1ydyHrqcIxXkWh/uBmVkzCvIuq5yiK2ATndIe5XxKholrG/MTYP9xGYka4sQhrbIAgGjL2B6NOE7rFaiF3fXw=="],
|
||||||
|
|
||||||
|
"google-logging-utils": ["[email protected]", "", {}, "sha512-eAmLkjDjAFCVXg7A1unxHsLf961m6y17QFqXqAXGj/gVkKFrEICfStRfwUlGNfeCEjNRa32JEWOUTlYXPyyKvA=="],
|
||||||
|
|
||||||
|
"gopd": ["[email protected]", "", {}, "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg=="],
|
||||||
|
|
||||||
|
"graceful-fs": ["[email protected]", "", {}, "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="],
|
||||||
|
|
||||||
|
"has-symbols": ["[email protected]", "", {}, "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ=="],
|
||||||
|
|
||||||
|
"hasown": ["[email protected]", "", { "dependencies": { "function-bind": "^1.1.2" } }, "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A=="],
|
||||||
|
|
||||||
|
"http-errors": ["[email protected]", "", { "dependencies": { "depd": "~2.0.0", "inherits": "~2.0.4", "setprototypeof": "~1.2.0", "statuses": "~2.0.2", "toidentifier": "~1.0.1" } }, "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ=="],
|
||||||
|
|
||||||
|
"https-proxy-agent": ["[email protected]", "", { "dependencies": { "agent-base": "^7.1.2", "debug": "4" } }, "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw=="],
|
||||||
|
|
||||||
|
"iconv-lite": ["[email protected]", "", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3" } }, "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA=="],
|
||||||
|
|
||||||
|
"inherits": ["[email protected]", "", {}, "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="],
|
||||||
|
|
||||||
|
"ipaddr.js": ["[email protected]", "", {}, "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g=="],
|
||||||
|
|
||||||
|
"jiti": ["[email protected]", "", { "bin": { "jiti": "lib/jiti-cli.mjs" } }, "sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ=="],
|
||||||
|
|
||||||
|
"js-tokens": ["[email protected]", "", {}, "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="],
|
||||||
|
|
||||||
|
"jsesc": ["[email protected]", "", { "bin": { "jsesc": "bin/jsesc" } }, "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA=="],
|
||||||
|
|
||||||
|
"json-bigint": ["[email protected]", "", { "dependencies": { "bignumber.js": "^9.0.0" } }, "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ=="],
|
||||||
|
|
||||||
|
"json5": ["[email protected]", "", { "bin": { "json5": "lib/cli.js" } }, "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg=="],
|
||||||
|
|
||||||
|
"jwa": ["[email protected]", "", { "dependencies": { "buffer-equal-constant-time": "^1.0.1", "ecdsa-sig-formatter": "1.0.11", "safe-buffer": "^5.0.1" } }, "sha512-hRF04fqJIP8Abbkq5NKGN0Bbr3JxlQ+qhZufXVr0DvujKy93ZCbXZMHDL4EOtodSbCWxOqR8MS1tXA5hwqCXDg=="],
|
||||||
|
|
||||||
|
"jws": ["[email protected]", "", { "dependencies": { "jwa": "^2.0.1", "safe-buffer": "^5.0.1" } }, "sha512-EKI/M/yqPncGUUh44xz0PxSidXFr/+r0pA70+gIYhjv+et7yxM+s29Y+VGDkovRofQem0fs7Uvf4+YmAdyRduA=="],
|
||||||
|
|
||||||
|
"lightningcss": ["[email protected]", "", { "dependencies": { "detect-libc": "^2.0.3" }, "optionalDependencies": { "lightningcss-android-arm64": "1.32.0", "lightningcss-darwin-arm64": "1.32.0", "lightningcss-darwin-x64": "1.32.0", "lightningcss-freebsd-x64": "1.32.0", "lightningcss-linux-arm-gnueabihf": "1.32.0", "lightningcss-linux-arm64-gnu": "1.32.0", "lightningcss-linux-arm64-musl": "1.32.0", "lightningcss-linux-x64-gnu": "1.32.0", "lightningcss-linux-x64-musl": "1.32.0", "lightningcss-win32-arm64-msvc": "1.32.0", "lightningcss-win32-x64-msvc": "1.32.0" } }, "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ=="],
|
||||||
|
|
||||||
|
"lightningcss-android-arm64": ["[email protected]", "", { "os": "android", "cpu": "arm64" }, "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg=="],
|
||||||
|
|
||||||
|
"lightningcss-darwin-arm64": ["[email protected]", "", { "os": "darwin", "cpu": "arm64" }, "sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ=="],
|
||||||
|
|
||||||
|
"lightningcss-darwin-x64": ["[email protected]", "", { "os": "darwin", "cpu": "x64" }, "sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w=="],
|
||||||
|
|
||||||
|
"lightningcss-freebsd-x64": ["[email protected]", "", { "os": "freebsd", "cpu": "x64" }, "sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig=="],
|
||||||
|
|
||||||
|
"lightningcss-linux-arm-gnueabihf": ["[email protected]", "", { "os": "linux", "cpu": "arm" }, "sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw=="],
|
||||||
|
|
||||||
|
"lightningcss-linux-arm64-gnu": ["[email protected]", "", { "os": "linux", "cpu": "arm64" }, "sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ=="],
|
||||||
|
|
||||||
|
"lightningcss-linux-arm64-musl": ["[email protected]", "", { "os": "linux", "cpu": "arm64" }, "sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg=="],
|
||||||
|
|
||||||
|
"lightningcss-linux-x64-gnu": ["[email protected]", "", { "os": "linux", "cpu": "x64" }, "sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA=="],
|
||||||
|
|
||||||
|
"lightningcss-linux-x64-musl": ["[email protected]", "", { "os": "linux", "cpu": "x64" }, "sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg=="],
|
||||||
|
|
||||||
|
"lightningcss-win32-arm64-msvc": ["[email protected]", "", { "os": "win32", "cpu": "arm64" }, "sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw=="],
|
||||||
|
|
||||||
|
"lightningcss-win32-x64-msvc": ["[email protected]", "", { "os": "win32", "cpu": "x64" }, "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q=="],
|
||||||
|
|
||||||
|
"long": ["[email protected]", "", {}, "sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA=="],
|
||||||
|
|
||||||
|
"lru-cache": ["[email protected]", "", { "dependencies": { "yallist": "^3.0.2" } }, "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w=="],
|
||||||
|
|
||||||
|
"lucide-react": ["[email protected]", "", { "peerDependencies": { "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-Z94u6fKT43lKeYHiVyvyR8fT7pwCzDu7RyMPpTvh054+xahSgj4HFQ+NmflvzdXsoAjYGdCguGaFKYuvq0ThCQ=="],
|
||||||
|
|
||||||
|
"magic-string": ["[email protected]", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.5" } }, "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ=="],
|
||||||
|
|
||||||
|
"math-intrinsics": ["[email protected]", "", {}, "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g=="],
|
||||||
|
|
||||||
|
"media-typer": ["[email protected]", "", {}, "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ=="],
|
||||||
|
|
||||||
|
"merge-descriptors": ["[email protected]", "", {}, "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ=="],
|
||||||
|
|
||||||
|
"methods": ["[email protected]", "", {}, "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w=="],
|
||||||
|
|
||||||
|
"mime": ["[email protected]", "", { "bin": { "mime": "cli.js" } }, "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg=="],
|
||||||
|
|
||||||
|
"mime-db": ["[email protected]", "", {}, "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="],
|
||||||
|
|
||||||
|
"mime-types": ["[email protected]", "", { "dependencies": { "mime-db": "1.52.0" } }, "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw=="],
|
||||||
|
|
||||||
|
"motion": ["[email protected]", "", { "dependencies": { "framer-motion": "^12.43.0", "tslib": "^2.4.0" }, "peerDependencies": { "@emotion/is-prop-valid": "*", "react": "^18.0.0 || ^19.0.0", "react-dom": "^18.0.0 || ^19.0.0" }, "optionalPeers": ["@emotion/is-prop-valid", "react", "react-dom"] }, "sha512-BQgQbSa9Hn3/mtbib0MK53y6JSANa+YKUKlaYnWzAVDH424RYQ5LVpV3pNiWH00BA2z4ojsSdMzqT7g2FQwjuQ=="],
|
||||||
|
|
||||||
|
"motion-dom": ["[email protected]", "", { "dependencies": { "motion-utils": "^12.39.0" } }, "sha512-azKON4d9S65PEoFUiQTMTgPheEmzf2QngdRc50AKfJp9Q9mmcBVw22c8eMq9k8kxOFHdL7+WZY7N/5F/lwiDag=="],
|
||||||
|
|
||||||
|
"motion-utils": ["[email protected]", "", {}, "sha512-8nadJAJjTtqRkmRF36FoJTrywK9nnFmnPwnSMyxaOCU7GDjN9RTMJIxx9De8ErM+vpPhMccr/6fo5WciyQLnMQ=="],
|
||||||
|
|
||||||
|
"ms": ["[email protected]", "", {}, "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="],
|
||||||
|
|
||||||
|
"nanoid": ["[email protected]", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-DTg4MJbGMWkfi6VZFdNt2/caMbQy4Ou+Op/hJQvGEWcnVfoA1QA+xzRKAzw9jD6+GVOOeYr/mIcuDSdug6F6+w=="],
|
||||||
|
|
||||||
|
"negotiator": ["[email protected]", "", {}, "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg=="],
|
||||||
|
|
||||||
|
"node-domexception": ["[email protected]", "", {}, "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ=="],
|
||||||
|
|
||||||
|
"node-fetch": ["[email protected]", "", { "dependencies": { "data-uri-to-buffer": "^4.0.0", "fetch-blob": "^3.1.4", "formdata-polyfill": "^4.0.10" } }, "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA=="],
|
||||||
|
|
||||||
|
"node-releases": ["[email protected]", "", {}, "sha512-D9UOmYG3UH1V+ENW56t5QXBwJw1YEY18ruVeus89Rw+SyIgjPkCO84bRzO3uNIYosJbNwiabWVn48o3uJLjxFQ=="],
|
||||||
|
|
||||||
|
"object-inspect": ["[email protected]", "", {}, "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew=="],
|
||||||
|
|
||||||
|
"on-finished": ["[email protected]", "", { "dependencies": { "ee-first": "1.1.1" } }, "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg=="],
|
||||||
|
|
||||||
|
"p-retry": ["[email protected]", "", { "dependencies": { "@types/retry": "0.12.0", "retry": "^0.13.1" } }, "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ=="],
|
||||||
|
|
||||||
|
"parseurl": ["[email protected]", "", {}, "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ=="],
|
||||||
|
|
||||||
|
"path-to-regexp": ["[email protected]", "", {}, "sha512-A/AGNMFN3c8bOlvV9RreMdrv7jsmF9XIfDeCd87+I8RNg6s78BhJxMu69NEMHBSJFxKidViTEdruRwEk/WIKqA=="],
|
||||||
|
|
||||||
|
"picocolors": ["[email protected]", "", {}, "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="],
|
||||||
|
|
||||||
|
"picomatch": ["[email protected]", "", {}, "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A=="],
|
||||||
|
|
||||||
|
"postcss": ["[email protected]", "", { "dependencies": { "nanoid": "^3.3.17", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-u82N74LFzG8ca+dD8puPnplTXoGH4fTPpVGuIbt36G3qvNlkvfD0lEAZSxaly3KX8TS/L1A1gsCEmvKmBcVbkQ=="],
|
||||||
|
|
||||||
|
"postcss-value-parser": ["[email protected]", "", {}, "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ=="],
|
||||||
|
|
||||||
|
"protobufjs": ["[email protected]", "", { "dependencies": { "@protobufjs/aspromise": "^1.1.2", "@protobufjs/base64": "^1.1.2", "@protobufjs/codegen": "^2.0.5", "@protobufjs/eventemitter": "^1.1.1", "@protobufjs/fetch": "^1.1.1", "@protobufjs/float": "^1.0.2", "@protobufjs/path": "^1.1.2", "@protobufjs/pool": "^1.1.0", "@protobufjs/utf8": "^1.1.1", "@types/node": ">=13.7.0", "long": "^5.3.2" } }, "sha512-/FPD0nUc9jH6rfFjji9IBqOz4pcSE3CsT1m7Ep6Mdb0LxSUMj8hgl6GomOvZzpNpAqqGaXA0P3VSrZLFzIhQrw=="],
|
||||||
|
|
||||||
|
"proxy-addr": ["[email protected]", "", { "dependencies": { "forwarded": "0.2.0", "ipaddr.js": "1.9.1" } }, "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg=="],
|
||||||
|
|
||||||
|
"qs": ["[email protected]", "", { "dependencies": { "es-define-property": "^1.0.1", "side-channel": "^1.1.1" } }, "sha512-O9gl3zCl5h5blw1KGUzQKhA5oUXSl8rwUIM5o0S3nCXMliSvy5Dzx7/DJcI+SwgICv+IneSZwhBh1oSyEHA71A=="],
|
||||||
|
|
||||||
|
"range-parser": ["[email protected]", "", {}, "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg=="],
|
||||||
|
|
||||||
|
"raw-body": ["[email protected]", "", { "dependencies": { "bytes": "~3.1.2", "http-errors": "~2.0.1", "iconv-lite": "~0.4.24", "unpipe": "~1.0.0" } }, "sha512-s4VSOf6yN0rvbRZGxs8Om5CWj6seneMwK3oDb4lWDH0UPhWcxwOWw5+qk24bxq87szX1ydrwylIOp2uG1ojUpA=="],
|
||||||
|
|
||||||
|
"react": ["[email protected]", "", {}, "sha512-PWaYA1L/q9u2u7xYQi+Y3L3Yfnie7XyLeaJICV1MGD6LprsBxcAqGjYyr0eY3p+QdsA+x/Irkt4Qif8D63+Sbw=="],
|
||||||
|
|
||||||
|
"react-dom": ["[email protected]", "", { "dependencies": { "scheduler": "^0.27.0" }, "peerDependencies": { "react": "^19.2.8" } }, "sha512-rVprimfGBG3DR+Tq0IQG2DT5PxKth1WIGDmj5yPmlzr4YBe7uyE+Du4oVqTDXZSHGGGXRtTJEGSSePyQCMBglQ=="],
|
||||||
|
|
||||||
|
"react-refresh": ["[email protected]", "", {}, "sha512-QgT5//D3jfjJb6Gsjxv0Slpj23ip+HtOpnNgnb2S5zU3CB26G/IDPGoy4RJB42wzFE46DRsstbW6tKHoKbhAxw=="],
|
||||||
|
|
||||||
|
"retry": ["[email protected]", "", {}, "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg=="],
|
||||||
|
|
||||||
|
"rollup": ["[email protected]", "", { "dependencies": { "@types/estree": "1.0.9" }, "optionalDependencies": { "@napi-rs/lzma-linux-x64-gnu": "1.5.1", "@rollup/rollup-android-arm-eabi": "4.62.4", "@rollup/rollup-android-arm64": "4.62.4", "@rollup/rollup-darwin-arm64": "4.62.4", "@rollup/rollup-darwin-x64": "4.62.4", "@rollup/rollup-freebsd-arm64": "4.62.4", "@rollup/rollup-freebsd-x64": "4.62.4", "@rollup/rollup-linux-arm-gnueabihf": "4.62.4", "@rollup/rollup-linux-arm-musleabihf": "4.62.4", "@rollup/rollup-linux-arm64-gnu": "4.62.4", "@rollup/rollup-linux-arm64-musl": "4.62.4", "@rollup/rollup-linux-loong64-gnu": "4.62.4", "@rollup/rollup-linux-loong64-musl": "4.62.4", "@rollup/rollup-linux-ppc64-gnu": "4.62.4", "@rollup/rollup-linux-ppc64-musl": "4.62.4", "@rollup/rollup-linux-riscv64-gnu": "4.62.4", "@rollup/rollup-linux-riscv64-musl": "4.62.4", "@rollup/rollup-linux-s390x-gnu": "4.62.4", "@rollup/rollup-linux-x64-gnu": "4.62.4", "@rollup/rollup-linux-x64-musl": "4.62.4", "@rollup/rollup-openbsd-x64": "4.62.4", "@rollup/rollup-openharmony-arm64": "4.62.4", "@rollup/rollup-win32-arm64-msvc": "4.62.4", "@rollup/rollup-win32-ia32-msvc": "4.62.4", "@rollup/rollup-win32-x64-gnu": "4.62.4", "@rollup/rollup-win32-x64-msvc": "4.62.4", "fsevents": "~2.3.2" }, "bin": { "rollup": "dist/bin/rollup" } }, "sha512-RXOqwaPsBGjMNMa4sQjDjHieHEZDFoj/Rdr46l2MU5DfEs16wHJPC2RPTPHWhNl+M3aI472LLqFkFKut4SblOg=="],
|
||||||
|
|
||||||
|
"safe-buffer": ["[email protected]", "", {}, "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="],
|
||||||
|
|
||||||
|
"safer-buffer": ["[email protected]", "", {}, "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="],
|
||||||
|
|
||||||
|
"scheduler": ["[email protected]", "", {}, "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q=="],
|
||||||
|
|
||||||
|
"semver": ["[email protected]", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="],
|
||||||
|
|
||||||
|
"send": ["[email protected]", "", { "dependencies": { "debug": "2.6.9", "depd": "2.0.0", "destroy": "1.2.0", "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "etag": "~1.8.1", "fresh": "~0.5.2", "http-errors": "~2.0.1", "mime": "1.6.0", "ms": "2.1.3", "on-finished": "~2.4.1", "range-parser": "~1.2.1", "statuses": "~2.0.2" } }, "sha512-VMbMxbDeehAxpOtWJXlcUS5E8iXh6QmN+BkRX1GARS3wRaXEEgzCcB10gTQazO42tpNIya8xIyNx8fll1OFPrg=="],
|
||||||
|
|
||||||
|
"serve-static": ["[email protected]", "", { "dependencies": { "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "parseurl": "~1.3.3", "send": "~0.19.1" } }, "sha512-x0RTqQel6g5SY7Lg6ZreMmsOzncHFU7nhnRWkKgWuMTu5NN0DR5oruckMqRvacAN9d5w6ARnRBXl9xhDCgfMeA=="],
|
||||||
|
|
||||||
|
"setprototypeof": ["[email protected]", "", {}, "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw=="],
|
||||||
|
|
||||||
|
"side-channel": ["[email protected]", "", { "dependencies": { "es-errors": "^1.3.0", "object-inspect": "^1.13.4", "side-channel-list": "^1.0.1", "side-channel-map": "^1.0.1", "side-channel-weakmap": "^1.0.2" } }, "sha512-6x6dK6zJdpTzF4sQeNYxwtvBzf6Eg4GtlesS94HOvTudUeyK2WXAaIfmDgsyslYrRBeFIlsi54AYsFGUuhmvrQ=="],
|
||||||
|
|
||||||
|
"side-channel-list": ["[email protected]", "", { "dependencies": { "es-errors": "^1.3.0", "object-inspect": "^1.13.4" } }, "sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w=="],
|
||||||
|
|
||||||
|
"side-channel-map": ["[email protected]", "", { "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.5", "object-inspect": "^1.13.3" } }, "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA=="],
|
||||||
|
|
||||||
|
"side-channel-weakmap": ["[email protected]", "", { "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.5", "object-inspect": "^1.13.3", "side-channel-map": "^1.0.1" } }, "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A=="],
|
||||||
|
|
||||||
|
"source-map-js": ["[email protected]", "", {}, "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA=="],
|
||||||
|
|
||||||
|
"statuses": ["[email protected]", "", {}, "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw=="],
|
||||||
|
|
||||||
|
"tailwindcss": ["[email protected]", "", {}, "sha512-gOhV3P7ufE62QDGg1zVaTgCR+EtPv92k2nIhVcVKcLmxT1sUBsQGhnZj175j+MqRt4zLF7ic+sCYjfhxMxj7YQ=="],
|
||||||
|
|
||||||
|
"tapable": ["[email protected]", "", {}, "sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A=="],
|
||||||
|
|
||||||
|
"tinyglobby": ["[email protected]", "", { "dependencies": { "fdir": "^6.5.0", "picomatch": "^4.0.4" } }, "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g=="],
|
||||||
|
|
||||||
|
"toidentifier": ["[email protected]", "", {}, "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA=="],
|
||||||
|
|
||||||
|
"tslib": ["[email protected]", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="],
|
||||||
|
|
||||||
|
"tsx": ["[email protected]", "", { "dependencies": { "esbuild": "~0.28.0" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "bin": { "tsx": "dist/cli.mjs" } }, "sha512-FDf4L4sYzKtzWYhU/Xm0AQFdTjdIxNo9ElTf2mxXM6k8YMHXzYUe4yODVaXP4V9uMFbVg8c0qyBccK2OOxb45Q=="],
|
||||||
|
|
||||||
|
"type-is": ["[email protected]", "", { "dependencies": { "media-typer": "0.3.0", "mime-types": "~2.1.24" } }, "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g=="],
|
||||||
|
|
||||||
|
"typescript": ["[email protected]", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ=="],
|
||||||
|
|
||||||
|
"undici-types": ["[email protected]", "", {}, "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ=="],
|
||||||
|
|
||||||
|
"unpipe": ["[email protected]", "", {}, "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ=="],
|
||||||
|
|
||||||
|
"update-browserslist-db": ["[email protected]", "", { "dependencies": { "escalade": "^3.2.0", "picocolors": "^1.1.1" }, "peerDependencies": { "browserslist": ">= 4.21.0" }, "bin": { "update-browserslist-db": "cli.js" } }, "sha512-ZZ61DsRsOnakl74HAmp3oSN4aXUmEWXf+i/yv0h7tIBfICc3VdrFErQKUUKPgu3AMsTUMbcongALEN4l6GSUrQ=="],
|
||||||
|
|
||||||
|
"utils-merge": ["[email protected]", "", {}, "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA=="],
|
||||||
|
|
||||||
|
"vary": ["[email protected]", "", {}, "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg=="],
|
||||||
|
|
||||||
|
"vite": ["[email protected]", "", { "dependencies": { "esbuild": "^0.25.0", "fdir": "^6.4.4", "picomatch": "^4.0.2", "postcss": "^8.5.3", "rollup": "^4.34.9", "tinyglobby": "^0.2.13" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", "jiti": ">=1.21.0", "less": "*", "lightningcss": "^1.21.0", "sass": "*", "sass-embedded": "*", "stylus": "*", "sugarss": "*", "terser": "^5.16.0", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["@types/node", "jiti", "less", "lightningcss", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx", "yaml"], "bin": { "vite": "bin/vite.js" } }, "sha512-NTKlcQjlAK7MlQoyb6LgaqHc8sso/pVyUJYWMws3jg21uTJw/LddqIFPcPqP6PzpgbIcZyKI85sFE4HBrQDA8A=="],
|
||||||
|
|
||||||
|
"web-streams-polyfill": ["[email protected]", "", {}, "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw=="],
|
||||||
|
|
||||||
|
"ws": ["[email protected]", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-201TZ/kPWxoPr/OKWjquZR1SWKXcvxdH+e1xrx89b3YbmzLMFCLfnaG1HFIgWzJOEWZ7MvpK++odZufgYR50Rw=="],
|
||||||
|
|
||||||
|
"yallist": ["[email protected]", "", {}, "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g=="],
|
||||||
|
|
||||||
|
"@babel/core/debug": ["[email protected]", "", { "dependencies": { "ms": "^2.1.3" }, "peerDependencies": { "supports-color": "*" }, "optionalPeers": ["supports-color"] }, "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA=="],
|
||||||
|
|
||||||
|
"@babel/traverse/debug": ["[email protected]", "", { "dependencies": { "ms": "^2.1.3" }, "peerDependencies": { "supports-color": "*" }, "optionalPeers": ["supports-color"] }, "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA=="],
|
||||||
|
|
||||||
|
"@tailwindcss/oxide-wasm32-wasi/@emnapi/core": ["@emnapi/[email protected]", "", { "dependencies": { "@emnapi/wasi-threads": "1.2.3", "tslib": "^2.4.0" }, "bundled": true }, "sha512-zLpS5asjEb7lq8jYLq37N6XKaE41DIexlY1rF/z4/tIl3wo13Sqm28fRyfIsKZD+NZ8mM5RoKkpW/rBcuoSZSg=="],
|
||||||
|
|
||||||
|
"@tailwindcss/oxide-wasm32-wasi/@emnapi/runtime": ["@emnapi/[email protected]", "", { "dependencies": { "tslib": "^2.4.0" }, "bundled": true }, "sha512-Xz4Tpyki7XyrpbUK1jR1AhdAdaXyhhY4lZ3neLodmhpuWfy2PAQN5B46sAiU4liOXGLkHypn/qU+jvfWSCYYLA=="],
|
||||||
|
|
||||||
|
"@tailwindcss/oxide-wasm32-wasi/@emnapi/wasi-threads": ["@emnapi/[email protected]", "", { "dependencies": { "tslib": "^2.4.0" }, "bundled": true }, "sha512-ELEBe8PsLvvJ6QMr0zLt8ffvOHW/dc1m3CEzNMg7aJUv3bMaoDtw2TXyDAwkYBuroxxuHEwhRTLJSe5sya547g=="],
|
||||||
|
|
||||||
|
"@tailwindcss/oxide-wasm32-wasi/@napi-rs/wasm-runtime": ["@napi-rs/[email protected]", "", { "dependencies": { "@tybys/wasm-util": "^0.10.3" }, "peerDependencies": { "@emnapi/core": "^1.7.1 || ^2.0.0-alpha.4", "@emnapi/runtime": "^1.7.1 || ^2.0.0-alpha.4" }, "bundled": true }, "sha512-UMduMbqO5s5zF2NkNacMT/yK5Y5QiKvWr2+50bzIIxFDwVJ2h49b+oyjaCGPhJxd2/gC2x39EHv/gHVuu36x2Q=="],
|
||||||
|
|
||||||
|
"@tailwindcss/oxide-wasm32-wasi/@tybys/wasm-util": ["@tybys/[email protected]", "", { "dependencies": { "tslib": "^2.4.0" }, "bundled": true }, "sha512-F3fo1MYrRJYL3zER0OUOmkutjr1Vp23m7OsSgp7nq4SP6OqX6C/56XFIPAl5bt3zaBRjmW7SGz3u/6LwFpYcOg=="],
|
||||||
|
|
||||||
|
"@tailwindcss/oxide-wasm32-wasi/tslib": ["[email protected]", "", { "bundled": true }, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="],
|
||||||
|
|
||||||
|
"@types/serve-static/@types/send": ["@types/[email protected]", "", { "dependencies": { "@types/mime": "^1", "@types/node": "*" } }, "sha512-Uqt8rPBE8SY0RK8JB1EzVOIZ32uqy8HwdxCnoCOsYrvnswqmFZ/k+9Ikidlk/ImhsdvBsloHbAlewb2IEBV/Og=="],
|
||||||
|
|
||||||
|
"https-proxy-agent/debug": ["[email protected]", "", { "dependencies": { "ms": "^2.1.3" }, "peerDependencies": { "supports-color": "*" }, "optionalPeers": ["supports-color"] }, "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA=="],
|
||||||
|
|
||||||
|
"send/ms": ["[email protected]", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="],
|
||||||
|
|
||||||
|
"tsx/esbuild": ["[email protected]", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.28.2", "@esbuild/android-arm": "0.28.2", "@esbuild/android-arm64": "0.28.2", "@esbuild/android-x64": "0.28.2", "@esbuild/darwin-arm64": "0.28.2", "@esbuild/darwin-x64": "0.28.2", "@esbuild/freebsd-arm64": "0.28.2", "@esbuild/freebsd-x64": "0.28.2", "@esbuild/linux-arm": "0.28.2", "@esbuild/linux-arm64": "0.28.2", "@esbuild/linux-ia32": "0.28.2", "@esbuild/linux-loong64": "0.28.2", "@esbuild/linux-mips64el": "0.28.2", "@esbuild/linux-ppc64": "0.28.2", "@esbuild/linux-riscv64": "0.28.2", "@esbuild/linux-s390x": "0.28.2", "@esbuild/linux-x64": "0.28.2", "@esbuild/netbsd-arm64": "0.28.2", "@esbuild/netbsd-x64": "0.28.2", "@esbuild/openbsd-arm64": "0.28.2", "@esbuild/openbsd-x64": "0.28.2", "@esbuild/openharmony-arm64": "0.28.2", "@esbuild/sunos-x64": "0.28.2", "@esbuild/win32-arm64": "0.28.2", "@esbuild/win32-ia32": "0.28.2", "@esbuild/win32-x64": "0.28.2" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-HKVLS8dvII+xoKW9kmqxbRKrnWEXfJJr/FZhhJmiqIB0e053QNYFqOBouTMO/k5sID4MvCiUCvv8b9M4h32wIA=="],
|
||||||
|
|
||||||
|
"@babel/core/debug/ms": ["[email protected]", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="],
|
||||||
|
|
||||||
|
"@babel/traverse/debug/ms": ["[email protected]", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="],
|
||||||
|
|
||||||
|
"https-proxy-agent/debug/ms": ["[email protected]", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="],
|
||||||
|
|
||||||
|
"tsx/esbuild/@esbuild/aix-ppc64": ["@esbuild/[email protected]", "", { "os": "aix", "cpu": "ppc64" }, "sha512-XExcO+dvLKvVtNTibSTBej1NCAbaGhWn9Ww1ZPx80qsahhPFe/8jgWP0IchNe0F3HwkU7n8ejhH8bjonqht8mQ=="],
|
||||||
|
|
||||||
|
"tsx/esbuild/@esbuild/android-arm": ["@esbuild/[email protected]", "", { "os": "android", "cpu": "arm" }, "sha512-kXXoiPVVGQcnIYGOeaovwOURpniDBpSq4A03qkQ+BMQqtGG6HYap3xne9C1O1yo4TR3qxlCX5IqqmX6fFo2Lqg=="],
|
||||||
|
|
||||||
|
"tsx/esbuild/@esbuild/android-arm64": ["@esbuild/[email protected]", "", { "os": "android", "cpu": "arm64" }, "sha512-5YfKeeI8qWfBZIX+u2xZC3Zlb3Os/gLS2sbEKM+I4ZOcsWmHS2WLysCcQZDAFRslDUU5Oiq44gf6PYN1vGwG5A=="],
|
||||||
|
|
||||||
|
"tsx/esbuild/@esbuild/android-x64": ["@esbuild/[email protected]", "", { "os": "android", "cpu": "x64" }, "sha512-O387ite7SzUyCcy3JQX4P4bLtEA7bLLkx+esve5JHnyYfNTxcVpXZo9jhdB0lTKN44gztELTdU7nS8Nr16Fs1Q=="],
|
||||||
|
|
||||||
|
"tsx/esbuild/@esbuild/darwin-arm64": ["@esbuild/[email protected]", "", { "os": "darwin", "cpu": "arm64" }, "sha512-n4KqkOQrraxHJcgjM1RvwbigfQKIKJVpM7xp+KsxiyUSrRdIXnt73VhrPAx0fV44hgfmIVKjxMN9J1t5jySVkw=="],
|
||||||
|
|
||||||
|
"tsx/esbuild/@esbuild/darwin-x64": ["@esbuild/[email protected]", "", { "os": "darwin", "cpu": "x64" }, "sha512-uq6suIWYP37qzGddBKPw5QEQPi6HiLGsO7UmkpfyaYNQ3D+rN6w6WfwH+nuqcGXWvawGwxOEroO4YGnFh95azw=="],
|
||||||
|
|
||||||
|
"tsx/esbuild/@esbuild/freebsd-arm64": ["@esbuild/[email protected]", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-n+I0BTSRIoy+d6RPKnEVwql5UwBJolytvY4mAOIEJorKlqgPII8ix6slVVrfZ5Tnj7glIZvloylbB/EJPMWEXw=="],
|
||||||
|
|
||||||
|
"tsx/esbuild/@esbuild/freebsd-x64": ["@esbuild/[email protected]", "", { "os": "freebsd", "cpu": "x64" }, "sha512-78XJTJkvPs0kz2w61301PJjXl4g7q3JqiYMZ/M/yVI73EHBrCRTgkhu9oqG7vPqq+a/yadEW8aD+agKlk5xrmg=="],
|
||||||
|
|
||||||
|
"tsx/esbuild/@esbuild/linux-arm": ["@esbuild/[email protected]", "", { "os": "linux", "cpu": "arm" }, "sha512-XlDnu2q5yoqems+xay6wSAcg9DDD7K9RLKZEBOMZm3ckNpJBvOX20tSfby8KfrrhINDyv9V2YVZKY/SpoGJI8w=="],
|
||||||
|
|
||||||
|
"tsx/esbuild/@esbuild/linux-arm64": ["@esbuild/[email protected]", "", { "os": "linux", "cpu": "arm64" }, "sha512-pW4AC0P3it8c7do9MVM4p51FzHzdM/TZrerurgRcHJ2WTa1VQ1CIq18xncfpBJw4ojkiZZrKW2yIBWBP92j6Ug=="],
|
||||||
|
|
||||||
|
"tsx/esbuild/@esbuild/linux-ia32": ["@esbuild/[email protected]", "", { "os": "linux", "cpu": "ia32" }, "sha512-CYbnj78HsIeA+DhgUKgFCfvNsTHFhMMrinUrMZpDXJXKN8T3XViTZ/+wtHeVxEWY8ewSzTFN+nRmSwO2tZaLUQ=="],
|
||||||
|
|
||||||
|
"tsx/esbuild/@esbuild/linux-loong64": ["@esbuild/[email protected]", "", { "os": "linux", "cpu": "none" }, "sha512-buwkd8nsph4R+ajRvw0qM5Hja/TXQow3ptzWO2EbG/cqcIkHloRrdlBtQlshyYGTNFvfkfJ5tpPLVkY4DtsPfQ=="],
|
||||||
|
|
||||||
|
"tsx/esbuild/@esbuild/linux-mips64el": ["@esbuild/[email protected]", "", { "os": "linux", "cpu": "none" }, "sha512-ZVykbDyk7519VwiNb9Lcj9m8XM6v5V9uKPvrEMkkEedVewf+0itkhahp4HDpgERXhwLRpWFypsGbG/J8s0QjJA=="],
|
||||||
|
|
||||||
|
"tsx/esbuild/@esbuild/linux-ppc64": ["@esbuild/[email protected]", "", { "os": "linux", "cpu": "ppc64" }, "sha512-CAXl+Dtd9UUuJd8pKKdwh6MLm3MUMiqMPmhZ3tTSXPqfyQ3vDl6R5hZdZ/kYojK4ofXtdfSv1tFq8XzWx3heNQ=="],
|
||||||
|
|
||||||
|
"tsx/esbuild/@esbuild/linux-riscv64": ["@esbuild/[email protected]", "", { "os": "linux", "cpu": "none" }, "sha512-GeXCej4IQtU1B+QlDV8W/RRvbzI3O/Stss+/bCXv4lZls5WGRtu2a+3JkA3i4qIUlMXpcHebWpF8AkJhATowuA=="],
|
||||||
|
|
||||||
|
"tsx/esbuild/@esbuild/linux-s390x": ["@esbuild/[email protected]", "", { "os": "linux", "cpu": "s390x" }, "sha512-3H1weTYZPxt/WOhByszQZybS9w5lKzUn1FDMsgEChbHWQwHYQQRfBxgCcZvPhjHfKyJjIievvMmEUawJrdY9Dg=="],
|
||||||
|
|
||||||
|
"tsx/esbuild/@esbuild/linux-x64": ["@esbuild/[email protected]", "", { "os": "linux", "cpu": "x64" }, "sha512-4xTZr1FUmSoQW4XIWmit3tzQrUTZM+N3P0XV8xROKYF50XfI7xeO90+1bZvNwxIufQ9hDQVRJH5YhgPVF8A/HQ=="],
|
||||||
|
|
||||||
|
"tsx/esbuild/@esbuild/netbsd-arm64": ["@esbuild/[email protected]", "", { "os": "none", "cpu": "arm64" }, "sha512-sSATRjPeDBg3pdgHoQfoYBob11Kk1FGa9lui5RIHZCoCkJa9QKlvl3/vKz2usCmYYjs7ymJR/2Nnsqe+Hjt5nw=="],
|
||||||
|
|
||||||
|
"tsx/esbuild/@esbuild/netbsd-x64": ["@esbuild/[email protected]", "", { "os": "none", "cpu": "x64" }, "sha512-lqnzCV+mM0gIADaKihiCg6ifgfU2L3h5E33rNQBN1Y4MaVGnzryzmvvf7UHxprpQdE8hpqLolJ9Rl+SkIRDpyw=="],
|
||||||
|
|
||||||
|
"tsx/esbuild/@esbuild/openbsd-arm64": ["@esbuild/[email protected]", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-AL2qJILH7lNjrDmCQDvdxMfAUIv8KMNZOvrwAQ8i8//ntL9FflhOyMJ8OZSMBb8/AWXe3/5v5S20y3zCoZWKoQ=="],
|
||||||
|
|
||||||
|
"tsx/esbuild/@esbuild/openbsd-x64": ["@esbuild/[email protected]", "", { "os": "openbsd", "cpu": "x64" }, "sha512-QtiuPytchRyC4rwUKhexJdQKvDuZ6hWloi3igqPQNUJCS1/v9EiO3UTOXR6A3FoMo4fnAKbWJdqaIwhOzh8qEw=="],
|
||||||
|
|
||||||
|
"tsx/esbuild/@esbuild/openharmony-arm64": ["@esbuild/[email protected]", "", { "os": "none", "cpu": "arm64" }, "sha512-WkhYDmpTjLvGlScA1rwjRUmhl4k8oXR3cIbtqWmELgU/dFeHHlEllxDvdWcNJV9rbzCexB5vz8gtNewWLgCT7Q=="],
|
||||||
|
|
||||||
|
"tsx/esbuild/@esbuild/sunos-x64": ["@esbuild/[email protected]", "", { "os": "sunos", "cpu": "x64" }, "sha512-GPMSkTOtMnv2U2F8gxe4Io6qmVs+YKyp832Etqqxr0hFngmXQ3rzwytelm3GIn7T4VviRUlf3sOgBOiTdvaf7g=="],
|
||||||
|
|
||||||
|
"tsx/esbuild/@esbuild/win32-arm64": ["@esbuild/[email protected]", "", { "os": "win32", "cpu": "arm64" }, "sha512-PIhhEkE9uPBleRBrQEJpUn7MBnibZzbGzYWPmY3x+YoVg/95zbjB4CxPPOQ8l5tYYM4mMaCthF8/1DIfBQQyWQ=="],
|
||||||
|
|
||||||
|
"tsx/esbuild/@esbuild/win32-ia32": ["@esbuild/[email protected]", "", { "os": "win32", "cpu": "ia32" }, "sha512-YmJbfTlvU7Sdn9BB+4PRES4oB6pxgS37MAONj+hBr/cpXS1aBPKXxNnDbu+QCWPj0o9dgyxeq79g6c5P8KeuYA=="],
|
||||||
|
|
||||||
|
"tsx/esbuild/@esbuild/win32-x64": ["@esbuild/[email protected]", "", { "os": "win32", "cpu": "x64" }, "sha512-5ebpxr3nWMzrL/rnUI755Jkuee0bHL/Gq0WTF9lvcpv73wAp5eu8MfBUgWK9bhWvZjj7yX8etf/8tI8Ney695g=="],
|
||||||
|
}
|
||||||
|
}
|
||||||
+21
@@ -0,0 +1,21 @@
|
|||||||
|
<!doctype html>
|
||||||
|
<html lang="en" class="scroll-smooth">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8" />
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||||
|
<title>BM Alpha ($BMALPHA) — BirthdayMessaging Meme Coin on Solana</title>
|
||||||
|
<meta name="description" content="BM Alpha is the community-powered meme coin from BirthdayMessaging launching August 24, 2026 on Solana. Built for the community, powered by memes." />
|
||||||
|
<meta property="og:title" content="BM Alpha ($BMALPHA) — Launching August 24, 2026" />
|
||||||
|
<meta property="og:description" content="The community-powered meme coin from BirthdayMessaging. Fast, fun, and built on Solana." />
|
||||||
|
<meta property="og:type" content="website" />
|
||||||
|
<meta name="twitter:card" content="summary_large_image" />
|
||||||
|
<link rel="preconnect" href="https://fonts.googleapis.com">
|
||||||
|
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
||||||
|
<link href="https://fonts.googleapis.com/css2?family=Plus+Jakarta+Sans:wght@400;500;600;700;800;900&family=Space+Grotesk:wght@500;600;700;800&display=swap" rel="stylesheet">
|
||||||
|
</head>
|
||||||
|
<body class="bg-[#07090E] text-slate-100 font-sans antialiased selection:bg-[#FF6B00] selection:text-white overflow-x-hidden min-h-screen">
|
||||||
|
<div id="root"></div>
|
||||||
|
<script type="module" src="/src/main.tsx"></script>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
|
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
{
|
||||||
|
"name": "BM Alpha Meme Coin",
|
||||||
|
"description": "Official launch landing page for BM Alpha ($BMALPHA), the community-driven meme coin from BirthdayMessaging on Solana launching August 24, 2026.",
|
||||||
|
"requestFramePermissions": [],
|
||||||
|
"majorCapabilities": ["MAJOR_CAPABILITY_SERVER_SIDE_GEMINI_API"]
|
||||||
|
}
|
||||||
Generated
+4379
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,37 @@
|
|||||||
|
{
|
||||||
|
"name": "react-example",
|
||||||
|
"private": true,
|
||||||
|
"version": "0.0.0",
|
||||||
|
"type": "module",
|
||||||
|
"scripts": {
|
||||||
|
"dev": "vite --port=3000 --host=0.0.0.0",
|
||||||
|
"build": "vite build",
|
||||||
|
"preview": "vite preview",
|
||||||
|
"clean": "rm -rf dist server.js",
|
||||||
|
"lint": "tsc --noEmit"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"@google/genai": "^2.4.0",
|
||||||
|
"@tailwindcss/vite": "^4.1.14",
|
||||||
|
"@types/canvas-confetti": "^1.9.0",
|
||||||
|
"@vitejs/plugin-react": "^5.0.4",
|
||||||
|
"canvas-confetti": "^1.9.4",
|
||||||
|
"dotenv": "^17.2.3",
|
||||||
|
"express": "^4.21.2",
|
||||||
|
"lucide-react": "^0.546.0",
|
||||||
|
"motion": "^12.23.24",
|
||||||
|
"react": "^19.0.1",
|
||||||
|
"react-dom": "^19.0.1",
|
||||||
|
"vite": "^6.2.3"
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"@types/node": "^22.14.0",
|
||||||
|
"autoprefixer": "^10.4.21",
|
||||||
|
"esbuild": "^0.25.0",
|
||||||
|
"tailwindcss": "^4.1.14",
|
||||||
|
"tsx": "^4.21.0",
|
||||||
|
"typescript": "~5.8.2",
|
||||||
|
"vite": "^6.2.3",
|
||||||
|
"@types/express": "^4.17.21"
|
||||||
|
}
|
||||||
|
}
|
||||||
+55
@@ -0,0 +1,55 @@
|
|||||||
|
import React from 'react';
|
||||||
|
import { ThemeProvider } from './context/ThemeContext';
|
||||||
|
import { Navbar } from './components/Navbar';
|
||||||
|
import { HeroSection } from './components/HeroSection';
|
||||||
|
import { SocialSection } from './components/SocialSection';
|
||||||
|
import { WhySection } from './components/WhySection';
|
||||||
|
import { TokenSection } from './components/TokenSection';
|
||||||
|
import { HowToBuySection } from './components/HowToBuySection';
|
||||||
|
import { CommunityCTA } from './components/CommunityCTA';
|
||||||
|
import { Footer } from './components/Footer';
|
||||||
|
|
||||||
|
export default function App() {
|
||||||
|
return (
|
||||||
|
<ThemeProvider>
|
||||||
|
<div className="min-h-screen bg-[#f8fafc] dark:bg-[#0a0c14] text-slate-900 dark:text-white selection:bg-[#FF8C32] selection:text-black flex flex-col relative overflow-x-hidden transition-colors duration-300">
|
||||||
|
{/* Immersive UI Ambient Background & Lighting Lines */}
|
||||||
|
<div className="fixed inset-0 pointer-events-none overflow-hidden -z-10 transition-opacity duration-500">
|
||||||
|
<div className="absolute top-[-10%] left-[-10%] w-[45%] h-[45%] bg-[#FF8C32]/10 dark:bg-[#FF8C32]/15 blur-[140px] rounded-full" />
|
||||||
|
<div className="absolute bottom-[-10%] right-[-10%] w-[50%] h-[50%] bg-[#00D7FF]/10 dark:bg-[#00D7FF]/15 blur-[160px] rounded-full" />
|
||||||
|
<div className="absolute top-1/4 right-[15%] w-[350px] h-[350px] bg-[#00D7FF]/10 blur-[130px] rounded-full" />
|
||||||
|
<div className="absolute top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2 w-[1200px] h-[1px] bg-gradient-to-r from-transparent via-slate-300/60 dark:via-white/10 to-transparent rotate-12" />
|
||||||
|
<div className="absolute top-1/3 left-1/2 -translate-x-1/2 -translate-y-1/2 w-[900px] h-[1px] bg-gradient-to-r from-transparent via-slate-300/40 dark:via-white/5 to-transparent -rotate-6" />
|
||||||
|
<div className="absolute bottom-1/3 left-1/2 -translate-x-1/2 -translate-y-1/2 w-[1000px] h-[1px] bg-gradient-to-r from-transparent via-[#FF8C32]/20 dark:via-[#FF8C32]/10 to-transparent rotate-3" />
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{/* Sticky Navigation Header */}
|
||||||
|
<Navbar />
|
||||||
|
|
||||||
|
{/* Main Page Content Flow */}
|
||||||
|
<main className="flex-1 relative z-10">
|
||||||
|
{/* 1. Hero Section with Live Countdown & 3D Visual */}
|
||||||
|
<HeroSection />
|
||||||
|
|
||||||
|
{/* 2. Social & Community Hub Section */}
|
||||||
|
<SocialSection />
|
||||||
|
|
||||||
|
{/* 3. Why BM Alpha? (Concept & Solana feature cards) */}
|
||||||
|
<WhySection />
|
||||||
|
|
||||||
|
{/* 4. Token Information & Copy Contract Address Card */}
|
||||||
|
<TokenSection />
|
||||||
|
|
||||||
|
{/* 5. How To Buy (4-step Solana Guide & Swap Tool) */}
|
||||||
|
<HowToBuySection />
|
||||||
|
|
||||||
|
{/* 6. Final Community CTA Section (Tangerine -> Sky Blue Gradient) */}
|
||||||
|
<CommunityCTA />
|
||||||
|
</main>
|
||||||
|
|
||||||
|
{/* 7. Footer with disclaimer & links */}
|
||||||
|
<Footer />
|
||||||
|
</div>
|
||||||
|
</ThemeProvider>
|
||||||
|
);
|
||||||
|
}
|
||||||
Binary file not shown.
|
After Width: | Height: | Size: 885 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 812 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 991 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 1.2 MiB |
Binary file not shown.
|
After Width: | Height: | Size: 972 KiB |
@@ -0,0 +1,99 @@
|
|||||||
|
import React from 'react';
|
||||||
|
import { MessagesSquare, Twitter, Sparkles, MessageCircle } from 'lucide-react';
|
||||||
|
import { YOUR_DISCORD_URL, YOUR_WHATSAPP_URL, YOUR_X_URL } from '../config';
|
||||||
|
import { triggerBirthdayConfetti } from '../utils/confetti';
|
||||||
|
|
||||||
|
export const CommunityCTA: React.FC = () => {
|
||||||
|
const handleCommunityClick = () => {
|
||||||
|
triggerBirthdayConfetti();
|
||||||
|
};
|
||||||
|
|
||||||
|
return (
|
||||||
|
<section className="py-20 sm:py-28 relative overflow-hidden">
|
||||||
|
{/* Container with Tangerine to Sky Blue Immersive UI Gradient Backdrop */}
|
||||||
|
<div className="max-w-6xl mx-auto px-4 sm:px-6 lg:px-8 relative">
|
||||||
|
|
||||||
|
<div
|
||||||
|
id="final-community-cta-box"
|
||||||
|
className="relative rounded-3xl overflow-hidden p-8 sm:p-14 lg:p-16 border border-slate-200 dark:border-white/20 shadow-[0_0_60px_rgba(255,140,50,0.25)] text-center"
|
||||||
|
>
|
||||||
|
{/* Intense glowing gradient background */}
|
||||||
|
<div className="absolute inset-0 bg-gradient-to-br from-[#FF8C32] via-[#FFA843] to-[#00D7FF] pointer-events-none -z-10 opacity-75" />
|
||||||
|
{/* Theme-aware glass overlay for high-contrast readability */}
|
||||||
|
<div className="absolute inset-0 bg-white/85 dark:bg-[#0a0c14]/80 backdrop-blur-md pointer-events-none -z-10" />
|
||||||
|
|
||||||
|
{/* Floating cyber particles */}
|
||||||
|
<div className="absolute -top-24 -left-24 w-72 h-72 bg-[#FF8C32]/30 rounded-full blur-3xl pointer-events-none" />
|
||||||
|
<div className="absolute -bottom-24 -right-24 w-72 h-72 bg-[#00D7FF]/30 rounded-full blur-3xl pointer-events-none" />
|
||||||
|
|
||||||
|
{/* Badge */}
|
||||||
|
<div className="inline-flex items-center gap-2 px-4 py-1.5 rounded-full bg-black/10 dark:bg-black/40 border border-slate-300 dark:border-white/20 text-xs font-bold text-slate-800 dark:text-white mb-6 backdrop-blur-md">
|
||||||
|
<Sparkles className="w-4 h-4 text-[#FF8C32]" />
|
||||||
|
<span>THE COUNTDOWN HAS BEGUN</span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{/* Heading */}
|
||||||
|
<h2
|
||||||
|
id="community-cta-heading"
|
||||||
|
className="font-display text-4xl sm:text-6xl lg:text-7xl font-black text-slate-900 dark:text-white tracking-tight leading-tight"
|
||||||
|
>
|
||||||
|
DON'T MISS THE ALPHA.
|
||||||
|
</h2>
|
||||||
|
|
||||||
|
{/* Subheading */}
|
||||||
|
<p
|
||||||
|
id="community-cta-subheading"
|
||||||
|
className="mt-4 text-xl sm:text-2xl lg:text-3xl font-extrabold text-[#00A6DB] dark:text-[#00D7FF] drop-shadow-sm"
|
||||||
|
>
|
||||||
|
BM Alpha launches August 24.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p className="mt-3 text-slate-700 dark:text-gray-300 text-sm sm:text-base max-w-xl mx-auto font-medium">
|
||||||
|
Be part of the earliest wave. Join our official channels for real-time launch alerts, meme drops, and birthday giveaways.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
{/* Action CTAs */}
|
||||||
|
<div className="mt-10 flex flex-col sm:flex-row items-center justify-center gap-3 sm:gap-4 max-w-2xl mx-auto">
|
||||||
|
<a
|
||||||
|
id="cta-join-whatsapp"
|
||||||
|
href={YOUR_WHATSAPP_URL}
|
||||||
|
target="_blank"
|
||||||
|
rel="noopener noreferrer"
|
||||||
|
onClick={handleCommunityClick}
|
||||||
|
className="w-full sm:w-auto flex-1 flex items-center justify-center gap-2 px-6 py-3.5 rounded-full font-display font-black text-xs sm:text-sm text-white bg-emerald-600 hover:bg-emerald-500 shadow-xl transition-all duration-300 transform hover:-translate-y-0.5 active:scale-95"
|
||||||
|
>
|
||||||
|
<MessageCircle className="w-4 h-4 text-white" />
|
||||||
|
<span>JOIN WHATSAPP</span>
|
||||||
|
</a>
|
||||||
|
|
||||||
|
<a
|
||||||
|
id="cta-join-discord"
|
||||||
|
href={YOUR_DISCORD_URL}
|
||||||
|
target="_blank"
|
||||||
|
rel="noopener noreferrer"
|
||||||
|
onClick={handleCommunityClick}
|
||||||
|
className="w-full sm:w-auto flex-1 flex items-center justify-center gap-2 px-6 py-3.5 rounded-full font-display font-black text-xs sm:text-sm text-white bg-[#5865F2] hover:bg-[#4752C4] shadow-[0_0_20px_rgba(88,101,242,0.35)] transition-all duration-300 transform hover:-translate-y-0.5 active:scale-95"
|
||||||
|
>
|
||||||
|
<MessagesSquare className="w-4 h-4 text-white" />
|
||||||
|
<span>JOIN DISCORD</span>
|
||||||
|
</a>
|
||||||
|
|
||||||
|
<a
|
||||||
|
id="cta-follow-x"
|
||||||
|
href={YOUR_X_URL}
|
||||||
|
target="_blank"
|
||||||
|
rel="noopener noreferrer"
|
||||||
|
onClick={handleCommunityClick}
|
||||||
|
className="w-full sm:w-auto flex-1 flex items-center justify-center gap-2 px-6 py-3.5 rounded-full font-display font-black text-xs sm:text-sm text-slate-900 dark:text-white bg-white/80 dark:bg-[#0a0c14]/90 hover:bg-white dark:hover:bg-white/10 border border-slate-300 dark:border-white/20 hover:border-[#FF8C32] shadow-xl transition-all duration-300 transform hover:-translate-y-0.5"
|
||||||
|
>
|
||||||
|
<Twitter className="w-4 h-4 text-[#FF8C32]" />
|
||||||
|
<span>FOLLOW ON X</span>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
);
|
||||||
|
};
|
||||||
@@ -0,0 +1,101 @@
|
|||||||
|
import React, { useState, useEffect } from 'react';
|
||||||
|
import { LAUNCH_DATE } from '../config';
|
||||||
|
import { Clock, Sparkles } from 'lucide-react';
|
||||||
|
|
||||||
|
interface TimeLeft {
|
||||||
|
days: number;
|
||||||
|
hours: number;
|
||||||
|
minutes: number;
|
||||||
|
seconds: number;
|
||||||
|
isLive: boolean;
|
||||||
|
}
|
||||||
|
|
||||||
|
export const Countdown: React.FC = () => {
|
||||||
|
const calculateTimeLeft = (): TimeLeft => {
|
||||||
|
const target = new Date(LAUNCH_DATE).getTime();
|
||||||
|
const now = new Date().getTime();
|
||||||
|
const difference = target - now;
|
||||||
|
|
||||||
|
if (difference <= 0) {
|
||||||
|
return { days: 0, hours: 0, minutes: 0, seconds: 0, isLive: true };
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
days: Math.floor(difference / (1000 * 60 * 60 * 24)),
|
||||||
|
hours: Math.floor((difference / (1000 * 60 * 60)) % 24),
|
||||||
|
minutes: Math.floor((difference / 1000 / 60) % 60),
|
||||||
|
seconds: Math.floor((difference / 1000) % 60),
|
||||||
|
isLive: false,
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
const [timeLeft, setTimeLeft] = useState<TimeLeft>(calculateTimeLeft());
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
const timer = setInterval(() => {
|
||||||
|
setTimeLeft(calculateTimeLeft());
|
||||||
|
}, 1000);
|
||||||
|
|
||||||
|
return () => clearInterval(timer);
|
||||||
|
}, []);
|
||||||
|
|
||||||
|
const timeUnits = [
|
||||||
|
{ label: 'DAYS', value: timeLeft.days, color: 'text-[#FF8C32]', border: 'border-slate-200 dark:border-white/10' },
|
||||||
|
{ label: 'HOURS', value: timeLeft.hours, color: 'text-[#FF8C32]', border: 'border-slate-200 dark:border-white/10' },
|
||||||
|
{ label: 'MINUTES', value: timeLeft.minutes, color: 'text-[#FF8C32]', border: 'border-slate-200 dark:border-white/10' },
|
||||||
|
{ label: 'SECONDS', value: timeLeft.seconds, color: 'text-[#FF8C32]', border: 'border-slate-200 dark:border-white/10' },
|
||||||
|
];
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div
|
||||||
|
id="launch-countdown-widget"
|
||||||
|
className="relative p-5 sm:p-7 rounded-2xl bg-white/90 dark:bg-[#161b2b]/90 border border-slate-200/90 dark:border-white/10 shadow-lg dark:shadow-[0_10px_35px_rgba(0,0,0,0.6)] backdrop-blur-xl max-w-xl mx-auto w-full transition-colors duration-300"
|
||||||
|
>
|
||||||
|
{/* Ambient background glow behind countdown */}
|
||||||
|
<div className="absolute -top-10 left-1/4 w-32 h-32 bg-[#FF8C32]/15 rounded-full blur-2xl pointer-events-none" />
|
||||||
|
<div className="absolute -bottom-10 right-1/4 w-32 h-32 bg-[#00D7FF]/15 rounded-full blur-2xl pointer-events-none" />
|
||||||
|
|
||||||
|
{/* Header with Title & live indicator */}
|
||||||
|
<div className="flex items-center justify-between mb-4 border-b border-slate-200 dark:border-white/5 pb-3">
|
||||||
|
<div className="flex items-center gap-2">
|
||||||
|
<Clock className="w-4 h-4 text-[#FF8C32]" />
|
||||||
|
<span className="font-display font-black text-[10px] uppercase tracking-[0.2em] text-slate-500 dark:text-gray-400">
|
||||||
|
LAUNCH COUNTDOWN
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
<div className="flex items-center gap-1.5 px-2.5 py-1 rounded-full bg-slate-100 dark:bg-white/5 border border-slate-200 dark:border-white/10">
|
||||||
|
<span className="w-2 h-2 rounded-full bg-[#FF8C32] animate-ping" />
|
||||||
|
<span className="w-1.5 h-1.5 rounded-full bg-[#FF8C32]" />
|
||||||
|
<span className="text-[10px] font-bold text-[#00A6DB] dark:text-[#00D7FF] tracking-wider">
|
||||||
|
AUG 24, 2026
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{/* Countdown Grid */}
|
||||||
|
<div className="grid grid-cols-4 gap-2.5 sm:gap-4 text-center">
|
||||||
|
{timeUnits.map((unit) => (
|
||||||
|
<div
|
||||||
|
key={unit.label}
|
||||||
|
className={`flex flex-col items-center justify-center p-3 sm:p-4 rounded-xl bg-slate-50 dark:bg-white/5 border ${unit.border} hover:border-[#FF8C32]/50 transition-all duration-300 shadow-sm dark:shadow-inner group`}
|
||||||
|
>
|
||||||
|
<span
|
||||||
|
className={`font-display text-2xl sm:text-4xl font-black tracking-tight ${unit.color} group-hover:scale-105 transition-transform`}
|
||||||
|
>
|
||||||
|
{String(unit.value).padStart(2, '0')}
|
||||||
|
</span>
|
||||||
|
<span className="text-[9px] sm:text-[10px] font-bold tracking-widest text-slate-400 dark:text-gray-500 mt-1 uppercase">
|
||||||
|
{unit.label}
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
))}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{/* Subtitle / Status */}
|
||||||
|
<div className="mt-4 flex items-center justify-center gap-2 text-center text-xs text-slate-600 dark:text-gray-400 font-medium">
|
||||||
|
<Sparkles className="w-3.5 h-3.5 text-[#00A6DB] dark:text-[#00D7FF]" />
|
||||||
|
<span>Targeting Solana Mainnet Deployment & Raydium Liquidity</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
};
|
||||||
@@ -0,0 +1,130 @@
|
|||||||
|
import React from 'react';
|
||||||
|
import { MessagesSquare, Twitter, Youtube, ArrowUp, MessageCircle } from 'lucide-react';
|
||||||
|
import { YOUR_DISCORD_URL, YOUR_WHATSAPP_URL, YOUR_X_URL, YOUR_YOUTUBE_URL } from '../config';
|
||||||
|
import coinImg from '../assets/images/bm_connect_coin_1787085516443.jpg';
|
||||||
|
|
||||||
|
export const Footer: React.FC = () => {
|
||||||
|
const scrollToTop = () => {
|
||||||
|
window.scrollTo({ top: 0, behavior: 'smooth' });
|
||||||
|
};
|
||||||
|
|
||||||
|
const navLinks = [
|
||||||
|
{ name: 'Home', href: '#' },
|
||||||
|
{ name: 'How to Buy', href: '#how-to-buy' },
|
||||||
|
{ name: 'Community', href: '#community' },
|
||||||
|
{ name: 'Token', href: '#token' },
|
||||||
|
];
|
||||||
|
|
||||||
|
return (
|
||||||
|
<footer id="footer" className="bg-slate-100 dark:bg-[#0a0c14] border-t border-slate-200 dark:border-white/10 pt-16 pb-12 relative transition-colors duration-300">
|
||||||
|
<div className="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
|
||||||
|
|
||||||
|
{/* Top Footer Row */}
|
||||||
|
<div className="flex flex-col md:flex-row items-start md:items-center justify-between gap-8 pb-12 border-b border-slate-200 dark:border-white/5">
|
||||||
|
|
||||||
|
{/* Brand Info */}
|
||||||
|
<div className="flex items-center gap-4">
|
||||||
|
<div className="w-12 h-12 rounded-full p-[1.5px] bg-gradient-to-tr from-[#FF8C32] to-[#00D7FF] shrink-0 shadow-[0_0_15px_rgba(255,140,50,0.3)]">
|
||||||
|
<div className="w-full h-full bg-white dark:bg-[#0a0c14] rounded-full overflow-hidden flex items-center justify-center">
|
||||||
|
<img src={coinImg} alt="BM Alpha" className="w-full h-full object-cover" />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<div className="flex items-center gap-2">
|
||||||
|
<span className="font-display font-black text-xl text-slate-900 dark:text-white">BM Alpha</span>
|
||||||
|
<span className="text-xs font-mono font-bold text-[#FF8C32] px-2 py-0.5 rounded-full bg-[#FF8C32]/15 border border-[#FF8C32]/30">
|
||||||
|
$BMALPHA
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
<p className="text-xs text-slate-600 dark:text-gray-400 mt-0.5 font-medium">
|
||||||
|
The community-powered meme coin from <span className="text-slate-900 dark:text-gray-200 font-semibold">BirthdayMessaging</span>
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{/* Quick Nav Links */}
|
||||||
|
<nav className="flex flex-wrap items-center gap-6 sm:gap-8">
|
||||||
|
{navLinks.map((link) => (
|
||||||
|
<a
|
||||||
|
key={link.name}
|
||||||
|
href={link.href}
|
||||||
|
className="text-xs sm:text-sm font-semibold text-slate-600 dark:text-gray-400 hover:text-slate-900 dark:hover:text-white transition-colors"
|
||||||
|
>
|
||||||
|
{link.name}
|
||||||
|
</a>
|
||||||
|
))}
|
||||||
|
</nav>
|
||||||
|
|
||||||
|
{/* Social Icons & Back to Top */}
|
||||||
|
<div className="flex items-center gap-3">
|
||||||
|
<a
|
||||||
|
id="footer-whatsapp"
|
||||||
|
href={YOUR_WHATSAPP_URL}
|
||||||
|
target="_blank"
|
||||||
|
rel="noopener noreferrer"
|
||||||
|
aria-label="WhatsApp Channel"
|
||||||
|
className="w-10 h-10 rounded-full bg-white dark:bg-white/5 border border-slate-200 dark:border-white/10 hover:border-emerald-500 hover:bg-emerald-500/10 text-slate-600 dark:text-gray-300 hover:text-emerald-500 dark:hover:text-emerald-400 flex items-center justify-center transition-all shadow-sm"
|
||||||
|
>
|
||||||
|
<MessageCircle className="w-4 h-4" />
|
||||||
|
</a>
|
||||||
|
<a
|
||||||
|
id="footer-discord"
|
||||||
|
href={YOUR_DISCORD_URL}
|
||||||
|
target="_blank"
|
||||||
|
rel="noopener noreferrer"
|
||||||
|
aria-label="Discord Server"
|
||||||
|
className="w-10 h-10 rounded-full bg-white dark:bg-white/5 border border-slate-200 dark:border-white/10 hover:border-[#5865F2] hover:bg-[#5865F2]/10 text-slate-600 dark:text-gray-300 hover:text-[#5865F2] flex items-center justify-center transition-all shadow-sm"
|
||||||
|
>
|
||||||
|
<MessagesSquare className="w-4 h-4" />
|
||||||
|
</a>
|
||||||
|
<a
|
||||||
|
id="footer-x"
|
||||||
|
href={YOUR_X_URL}
|
||||||
|
target="_blank"
|
||||||
|
rel="noopener noreferrer"
|
||||||
|
aria-label="X / Twitter"
|
||||||
|
className="w-10 h-10 rounded-full bg-white dark:bg-white/5 border border-slate-200 dark:border-white/10 hover:border-[#FF8C32] hover:bg-[#FF8C32]/10 text-slate-600 dark:text-gray-300 hover:text-[#FF8C32] flex items-center justify-center transition-all shadow-sm"
|
||||||
|
>
|
||||||
|
<Twitter className="w-4 h-4" />
|
||||||
|
</a>
|
||||||
|
<a
|
||||||
|
id="footer-youtube"
|
||||||
|
href={YOUR_YOUTUBE_URL}
|
||||||
|
target="_blank"
|
||||||
|
rel="noopener noreferrer"
|
||||||
|
aria-label="YouTube"
|
||||||
|
className="w-10 h-10 rounded-full bg-white dark:bg-white/5 border border-slate-200 dark:border-white/10 hover:border-red-500 hover:bg-red-500/10 text-slate-600 dark:text-gray-300 hover:text-red-500 flex items-center justify-center transition-all shadow-sm"
|
||||||
|
>
|
||||||
|
<Youtube className="w-4 h-4" />
|
||||||
|
</a>
|
||||||
|
<button
|
||||||
|
id="back-to-top-btn"
|
||||||
|
onClick={scrollToTop}
|
||||||
|
aria-label="Back to top"
|
||||||
|
className="w-10 h-10 rounded-full bg-white dark:bg-white/10 border border-slate-200 dark:border-white/15 hover:bg-[#FF8C32] hover:border-[#FF8C32] text-slate-700 dark:text-gray-300 hover:text-black flex items-center justify-center transition-all ml-2 cursor-pointer shadow-sm"
|
||||||
|
>
|
||||||
|
<ArrowUp className="w-4 h-4" />
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{/* Disclaimer & Copyright */}
|
||||||
|
<div className="mt-8 flex flex-col md:flex-row items-start md:items-center justify-between gap-6">
|
||||||
|
<p
|
||||||
|
id="footer-disclaimer"
|
||||||
|
className="text-[11px] sm:text-xs text-slate-500 dark:text-gray-400 max-w-3xl leading-relaxed font-normal"
|
||||||
|
>
|
||||||
|
<strong className="text-slate-700 dark:text-gray-300">Disclaimer: </strong>
|
||||||
|
BM Alpha is a community meme coin. Nothing on this website constitutes financial or investment advice. Always do your own research and verify official links before interacting with any token or wallet.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p className="text-[11px] sm:text-xs text-slate-500 dark:text-gray-400 whitespace-nowrap font-medium">
|
||||||
|
© 2026 BirthdayMessaging. All rights reserved.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</footer>
|
||||||
|
);
|
||||||
|
};
|
||||||
@@ -0,0 +1,154 @@
|
|||||||
|
import React from 'react';
|
||||||
|
import { Rocket, MessagesSquare, Sparkles, ShieldCheck, Flame, ArrowRight, TrendingUp } from 'lucide-react';
|
||||||
|
import { Countdown } from './Countdown';
|
||||||
|
import { YOUR_BUY_LINK, YOUR_DISCORD_URL } from '../config';
|
||||||
|
import { triggerBirthdayConfetti } from '../utils/confetti';
|
||||||
|
import coinImg from '../assets/images/bm_connect_coin_1787085516443.jpg';
|
||||||
|
|
||||||
|
export const HeroSection: React.FC = () => {
|
||||||
|
const handleBuyClick = () => {
|
||||||
|
triggerBirthdayConfetti();
|
||||||
|
};
|
||||||
|
|
||||||
|
return (
|
||||||
|
<section
|
||||||
|
id="hero"
|
||||||
|
className="relative min-h-screen pt-32 pb-20 sm:pt-36 sm:pb-28 flex items-center justify-center overflow-hidden"
|
||||||
|
>
|
||||||
|
{/* Background Gradients and Glowing Ambient Orbs */}
|
||||||
|
<div className="absolute top-1/4 left-1/2 -translate-x-1/2 -translate-y-1/2 w-[600px] sm:w-[800px] h-[350px] bg-gradient-to-tr from-[#FF8C32]/20 via-transparent to-[#00D7FF]/20 blur-[140px] rounded-full pointer-events-none -z-10" />
|
||||||
|
<div className="absolute top-1/3 -left-32 w-80 h-80 bg-[#FF8C32]/15 rounded-full blur-[110px] pointer-events-none -z-10" />
|
||||||
|
<div className="absolute top-1/2 -right-32 w-80 h-80 bg-[#00D7FF]/15 rounded-full blur-[110px] pointer-events-none -z-10" />
|
||||||
|
|
||||||
|
{/* Subtle grid lines */}
|
||||||
|
<div className="absolute inset-0 bg-[linear-gradient(to_right,rgba(255,255,255,0.03)_1px,transparent_1px),linear-gradient(to_bottom,rgba(255,255,255,0.03)_1px,transparent_1px)] bg-[size:4rem_4rem] [mask-image:radial-gradient(ellipse_60%_50%_at_50%_40%,#000_70%,transparent_100%)] pointer-events-none -z-10" />
|
||||||
|
|
||||||
|
<div className="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 w-full">
|
||||||
|
<div className="flex flex-col items-center text-center">
|
||||||
|
|
||||||
|
{/* Prominent Launch Badge */}
|
||||||
|
<div
|
||||||
|
id="hero-launch-badge"
|
||||||
|
className="inline-flex items-center gap-2.5 px-4 py-1.5 rounded-full bg-white dark:bg-white/5 border border-slate-200 dark:border-white/10 shadow-sm dark:shadow-[0_0_20px_rgba(255,140,50,0.2)] backdrop-blur-md mb-8 animate-bounce duration-1000"
|
||||||
|
>
|
||||||
|
<span className="text-sm">🚀</span>
|
||||||
|
<span className="font-display font-black text-xs tracking-widest text-[#00A6DB] dark:text-[#00D7FF]">
|
||||||
|
OFFICIAL LAUNCH: AUGUST 24, 2026
|
||||||
|
</span>
|
||||||
|
<span className="inline-block w-2 h-2 rounded-full bg-[#FF8C32] animate-pulse" />
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{/* Main Headline */}
|
||||||
|
<h1
|
||||||
|
id="hero-main-headline"
|
||||||
|
className="font-display text-5xl sm:text-7xl lg:text-8xl font-black tracking-tighter leading-[1.02] max-w-5xl"
|
||||||
|
>
|
||||||
|
<span className="text-slate-900 dark:text-white">BM ALPHA </span>
|
||||||
|
<span className="text-gradient-brand drop-shadow-[0_0_35px_rgba(255,140,50,0.35)]">
|
||||||
|
IS HERE.
|
||||||
|
</span>
|
||||||
|
</h1>
|
||||||
|
|
||||||
|
{/* Supporting Headline */}
|
||||||
|
<p
|
||||||
|
id="hero-supporting-headline"
|
||||||
|
className="mt-6 text-xl sm:text-2xl lg:text-3xl font-bold text-slate-700 dark:text-gray-200 max-w-3xl leading-snug tracking-tight"
|
||||||
|
>
|
||||||
|
The community-powered meme coin from{' '}
|
||||||
|
<span className="text-[#00A6DB] dark:text-[#00D7FF] font-extrabold">BirthdayMessaging</span>.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
{/* Short Description */}
|
||||||
|
<p
|
||||||
|
id="hero-description"
|
||||||
|
className="mt-4 text-base sm:text-lg text-slate-600 dark:text-gray-400 max-w-2xl font-medium"
|
||||||
|
>
|
||||||
|
Built for the community. Powered by memes. Launching August 24, 2026 on Solana.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
{/* Primary CTA Buttons */}
|
||||||
|
<div className="mt-8 flex flex-col sm:flex-row items-center justify-center gap-4 w-full max-w-md">
|
||||||
|
<a
|
||||||
|
id="hero-buy-btn"
|
||||||
|
href="#how-to-buy"
|
||||||
|
onClick={handleBuyClick}
|
||||||
|
className="w-full sm:w-auto flex-1 flex items-center justify-center gap-2.5 px-8 py-4 rounded-full font-display font-black text-sm text-black bg-[#FF8C32] hover:bg-[#E6761D] shadow-[0_0_25px_rgba(255,140,50,0.4)] hover:shadow-[0_0_35px_rgba(0,215,255,0.6)] transition-all duration-300 transform hover:-translate-y-0.5 active:scale-95"
|
||||||
|
>
|
||||||
|
<Rocket className="w-4 h-4 text-black" />
|
||||||
|
<span>BUY BM ALPHA</span>
|
||||||
|
</a>
|
||||||
|
|
||||||
|
<a
|
||||||
|
id="hero-community-btn"
|
||||||
|
href={YOUR_DISCORD_URL}
|
||||||
|
target="_blank"
|
||||||
|
rel="noopener noreferrer"
|
||||||
|
className="w-full sm:w-auto flex-1 flex items-center justify-center gap-2.5 px-8 py-4 rounded-full font-display font-bold text-sm text-slate-800 dark:text-white bg-white dark:bg-white/5 hover:bg-slate-100 dark:hover:bg-white/10 border border-slate-300 dark:border-white/10 hover:border-[#5865F2]/50 shadow-md dark:shadow-lg transition-all duration-300 transform hover:-translate-y-0.5"
|
||||||
|
>
|
||||||
|
<MessagesSquare className="w-4 h-4 text-[#5865F2]" />
|
||||||
|
<span>JOIN DISCORD</span>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{/* Launch Countdown Component */}
|
||||||
|
<div className="mt-12 w-full max-w-xl">
|
||||||
|
<Countdown />
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{/* 3D Coin & Interactive Graphic Showcase */}
|
||||||
|
<div className="mt-14 relative flex items-center justify-center w-full max-w-2xl">
|
||||||
|
|
||||||
|
{/* Animated Ring 1 */}
|
||||||
|
<div className="absolute w-[280px] sm:w-[380px] h-[280px] sm:h-[380px] rounded-full border border-dashed border-[#FF8C32]/40 dark:border-[#FF8C32]/30 animate-spin-slow pointer-events-none" />
|
||||||
|
{/* Animated Ring 2 */}
|
||||||
|
<div className="absolute w-[340px] sm:w-[460px] h-[340px] sm:h-[460px] rounded-full border border-[#00D7FF]/30 dark:border-[#00D7FF]/20 animate-spin-slow-reverse pointer-events-none" />
|
||||||
|
|
||||||
|
{/* Glowing Coin Core */}
|
||||||
|
<div className="relative group cursor-pointer" onClick={triggerBirthdayConfetti}>
|
||||||
|
<div className="absolute inset-0 bg-gradient-to-r from-[#FF8C32] to-[#00D7FF] rounded-full blur-2xl opacity-50 dark:opacity-60 group-hover:opacity-80 dark:group-hover:opacity-90 transition-opacity duration-500 scale-95 group-hover:scale-105" />
|
||||||
|
|
||||||
|
<div className="relative w-52 sm:w-64 h-52 sm:h-64 rounded-full p-2 bg-gradient-to-tr from-[#FF8C32] via-[#FFA843] to-[#00D7FF] shadow-[0_0_40px_rgba(255,140,50,0.35)] dark:shadow-[0_0_50px_rgba(255,140,50,0.4)] transform group-hover:scale-105 transition-all duration-500">
|
||||||
|
<div className="w-full h-full rounded-full overflow-hidden bg-white dark:bg-[#0a0c14] border-4 border-slate-200 dark:border-[#161b2b] flex items-center justify-center relative">
|
||||||
|
<img
|
||||||
|
src={coinImg}
|
||||||
|
alt="BM Alpha Meme Coin Token 3D"
|
||||||
|
className="w-full h-full object-cover animate-[pulse_4s_ease-in-out_infinite]"
|
||||||
|
/>
|
||||||
|
{/* Subtle hover overlay hint */}
|
||||||
|
<div className="absolute inset-0 bg-black/40 opacity-0 group-hover:opacity-100 flex items-center justify-center transition-opacity">
|
||||||
|
<span className="px-3 py-1 rounded-full bg-[#FF8C32] text-black text-xs font-bold font-display shadow-lg">
|
||||||
|
🎉 Click for Hype!
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{/* Floating Web3 Feature Chips */}
|
||||||
|
<div className="hidden sm:flex absolute -left-6 top-1/4 items-center gap-2 px-3.5 py-2 rounded-xl bg-white/90 dark:bg-[#161b2b]/90 border border-slate-200 dark:border-white/10 backdrop-blur-md shadow-md dark:shadow-xl animate-bounce duration-1000">
|
||||||
|
<Flame className="w-4 h-4 text-[#FF8C32]" />
|
||||||
|
<span className="text-xs font-bold text-slate-800 dark:text-white font-display">0% Buy/Sell Tax</span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div className="hidden sm:flex absolute -right-6 top-1/3 items-center gap-2 px-3.5 py-2 rounded-xl bg-white/90 dark:bg-[#161b2b]/90 border border-slate-200 dark:border-white/10 backdrop-blur-md shadow-md dark:shadow-xl animate-bounce duration-1000 delay-300">
|
||||||
|
<Sparkles className="w-4 h-4 text-[#00A6DB] dark:text-[#00D7FF]" />
|
||||||
|
<span className="text-xs font-bold text-slate-800 dark:text-white font-display">Solana Ecosystem</span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div className="hidden sm:flex absolute left-8 bottom-4 items-center gap-2 px-3.5 py-2 rounded-xl bg-white/90 dark:bg-[#161b2b]/90 border border-slate-200 dark:border-white/10 backdrop-blur-md shadow-md dark:shadow-xl">
|
||||||
|
<ShieldCheck className="w-4 h-4 text-emerald-500 dark:text-emerald-400" />
|
||||||
|
<span className="text-xs font-bold text-slate-700 dark:text-gray-300 font-display">100% Community LP</span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div className="hidden sm:flex absolute right-8 bottom-2 items-center gap-2 px-3.5 py-2 rounded-xl bg-white/90 dark:bg-[#161b2b]/90 border border-slate-200 dark:border-white/10 backdrop-blur-md shadow-md dark:shadow-xl">
|
||||||
|
<TrendingUp className="w-4 h-4 text-[#FF8C32]" />
|
||||||
|
<span className="text-xs font-bold text-slate-800 dark:text-white font-display">10B Total Supply</span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
);
|
||||||
|
};
|
||||||
@@ -0,0 +1,187 @@
|
|||||||
|
import React, { useState } from 'react';
|
||||||
|
import { Wallet, DollarSign, Link as LinkIcon, RefreshCw, AlertTriangle, ArrowRight, ShieldCheck, Sparkles, ExternalLink } from 'lucide-react';
|
||||||
|
import { HOW_TO_BUY_STEPS, YOUR_BUY_LINK, CONTRACT_ADDRESS } from '../config';
|
||||||
|
import { triggerBirthdayConfetti } from '../utils/confetti';
|
||||||
|
import coinImg from '../assets/images/bm_connect_coin_1787085516443.jpg';
|
||||||
|
|
||||||
|
export const HowToBuySection: React.FC = () => {
|
||||||
|
const [solAmount, setSolAmount] = useState<string>('1.0');
|
||||||
|
|
||||||
|
// Hypothetical estimated launch rate calculation (e.g. 1 SOL = 50,000 BMALPHA for interactive fun)
|
||||||
|
const calculatedTokens = () => {
|
||||||
|
const num = parseFloat(solAmount);
|
||||||
|
if (isNaN(num) || num <= 0) return '0';
|
||||||
|
return (num * 50000).toLocaleString();
|
||||||
|
};
|
||||||
|
|
||||||
|
const handleCtaClick = () => {
|
||||||
|
triggerBirthdayConfetti();
|
||||||
|
};
|
||||||
|
|
||||||
|
const stepIcons = [Wallet, DollarSign, LinkIcon, RefreshCw];
|
||||||
|
|
||||||
|
return (
|
||||||
|
<section id="how-to-buy" className="py-24 relative overflow-hidden bg-transparent">
|
||||||
|
{/* Background ambient accents */}
|
||||||
|
<div className="absolute top-1/2 left-0 w-80 h-80 bg-[#FF8C32]/10 rounded-full blur-[140px] pointer-events-none -z-10" />
|
||||||
|
<div className="absolute bottom-10 right-0 w-80 h-80 bg-[#00D7FF]/10 rounded-full blur-[140px] pointer-events-none -z-10" />
|
||||||
|
|
||||||
|
<div className="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
|
||||||
|
|
||||||
|
{/* Section Header */}
|
||||||
|
<div className="text-center max-w-3xl mx-auto mb-16">
|
||||||
|
<div className="inline-flex items-center gap-2 px-3.5 py-1.5 rounded-full bg-white dark:bg-white/5 border border-slate-200 dark:border-white/10 text-xs font-bold text-[#FF8C32] mb-3 shadow-sm">
|
||||||
|
<Sparkles className="w-3.5 h-3.5 text-[#FF8C32]" />
|
||||||
|
SWAP & PARTICIPATE
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<h2
|
||||||
|
id="how-to-buy-heading"
|
||||||
|
className="font-display text-4xl sm:text-5xl font-black text-slate-900 dark:text-white tracking-tight"
|
||||||
|
>
|
||||||
|
HOW TO BUY <span className="text-gradient-brand">BM ALPHA</span>
|
||||||
|
</h2>
|
||||||
|
<p className="mt-4 text-slate-600 dark:text-gray-400 text-base sm:text-lg font-medium">
|
||||||
|
Follow these 4 simple steps to join the BirthdayMessaging Solana meme revolution on launch day.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{/* 4 Steps Grid */}
|
||||||
|
<div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-6 mb-12">
|
||||||
|
{HOW_TO_BUY_STEPS.map((item, idx) => {
|
||||||
|
const Icon = stepIcons[idx];
|
||||||
|
return (
|
||||||
|
<div
|
||||||
|
key={item.step}
|
||||||
|
className="relative flex flex-col justify-between p-6 sm:p-7 rounded-2xl bg-white/90 dark:bg-[#161b2b]/90 border border-slate-200 dark:border-white/10 hover:border-[#FF8C32]/50 transition-all duration-300 group hover:-translate-y-1 shadow-md dark:shadow-lg backdrop-blur-xl"
|
||||||
|
>
|
||||||
|
<div>
|
||||||
|
{/* Step Number Badge */}
|
||||||
|
<div className="flex items-center justify-between mb-5">
|
||||||
|
<span className="font-display text-3xl font-black text-slate-300 dark:text-gray-600 group-hover:text-[#FF8C32] transition-colors">
|
||||||
|
{item.step}
|
||||||
|
</span>
|
||||||
|
<div className="w-10 h-10 rounded-xl bg-slate-100 dark:bg-white/5 border border-slate-200 dark:border-white/10 group-hover:border-[#00D7FF] flex items-center justify-center transition-colors">
|
||||||
|
<Icon className="w-5 h-5 text-[#00A6DB] dark:text-[#00D7FF] group-hover:text-[#FF8C32] transition-colors" />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{/* Title & Description */}
|
||||||
|
<h3 className="font-display font-extrabold text-lg sm:text-xl text-slate-900 dark:text-white tracking-tight group-hover:text-[#00A6DB] dark:group-hover:text-[#00D7FF] transition-colors">
|
||||||
|
{item.title}
|
||||||
|
</h3>
|
||||||
|
<p className="mt-3 text-xs sm:text-sm text-slate-600 dark:text-gray-300 leading-relaxed font-normal">
|
||||||
|
{item.description}
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{/* Practical Pro Tip */}
|
||||||
|
<div className="mt-6 pt-4 border-t border-slate-200 dark:border-white/5">
|
||||||
|
<p className="text-[11px] font-medium text-slate-500 dark:text-gray-400">
|
||||||
|
💡 <span className="text-slate-700 dark:text-gray-300">{item.tip}</span>
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
})}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{/* Strong Security Warning Box */}
|
||||||
|
<div className="p-5 sm:p-6 rounded-2xl bg-amber-50 dark:bg-amber-500/10 border border-amber-200 dark:border-amber-500/30 flex flex-col sm:flex-row items-start sm:items-center gap-4 mb-12 shadow-md dark:shadow-lg backdrop-blur-xl">
|
||||||
|
<div className="w-10 h-10 rounded-xl bg-amber-100 dark:bg-amber-500/20 border border-amber-300 dark:border-amber-500/40 flex items-center justify-center shrink-0">
|
||||||
|
<AlertTriangle className="w-5 h-5 text-amber-600 dark:text-amber-400" />
|
||||||
|
</div>
|
||||||
|
<div className="flex-1">
|
||||||
|
<h4 className="font-display font-bold text-amber-900 dark:text-amber-300 text-sm sm:text-base">
|
||||||
|
OFFICIAL VERIFICATION WARNING
|
||||||
|
</h4>
|
||||||
|
<p className="text-xs sm:text-sm text-amber-800/90 dark:text-amber-200/90 mt-0.5 leading-relaxed font-medium">
|
||||||
|
Always verify official BM Alpha links and the contract address before making a transaction. Never trust unsolicited DMs or imitation tokens.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{/* Interactive Swap Preview & Pre-Launch Calculator */}
|
||||||
|
<div className="max-w-xl mx-auto rounded-2xl bg-white/95 dark:bg-[#161b2b]/90 border border-slate-200 dark:border-white/10 p-6 sm:p-8 shadow-xl dark:shadow-2xl backdrop-blur-xl mb-12">
|
||||||
|
<div className="flex items-center justify-between border-b border-slate-200 dark:border-white/5 pb-4 mb-5">
|
||||||
|
<div className="flex items-center gap-2">
|
||||||
|
<RefreshCw className="w-4 h-4 text-[#FF8C32]" />
|
||||||
|
<span className="font-display font-bold text-xs uppercase tracking-wider text-slate-700 dark:text-gray-300">
|
||||||
|
SWAP ESTIMATION PREVIEW
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
<span className="text-[10px] font-bold px-2 py-0.5 rounded-full bg-emerald-500/15 text-emerald-600 dark:text-emerald-400 border border-emerald-500/30">
|
||||||
|
0% Slippage Tax
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div className="space-y-4">
|
||||||
|
{/* Input SOL */}
|
||||||
|
<div className="p-4 rounded-xl bg-slate-50 dark:bg-white/5 border border-slate-200 dark:border-white/10">
|
||||||
|
<div className="flex items-center justify-between text-xs font-semibold text-slate-500 dark:text-gray-400 mb-1.5">
|
||||||
|
<span>YOU PAY</span>
|
||||||
|
<span>SOLANA</span>
|
||||||
|
</div>
|
||||||
|
<div className="flex items-center justify-between gap-4">
|
||||||
|
<input
|
||||||
|
type="number"
|
||||||
|
min="0.1"
|
||||||
|
step="0.5"
|
||||||
|
value={solAmount}
|
||||||
|
onChange={(e) => setSolAmount(e.target.value)}
|
||||||
|
className="bg-transparent font-display text-2xl font-black text-slate-900 dark:text-white focus:outline-none w-full"
|
||||||
|
placeholder="1.0"
|
||||||
|
/>
|
||||||
|
<div className="flex items-center gap-1.5 px-3 py-1.5 rounded-full bg-slate-200 dark:bg-white/10 text-slate-900 dark:text-white font-bold text-xs shrink-0">
|
||||||
|
<span className="w-2 h-2 rounded-full bg-[#00D7FF]" />
|
||||||
|
<span>SOL</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{/* Down Arrow separator */}
|
||||||
|
<div className="flex justify-center -my-2 relative z-10">
|
||||||
|
<div className="w-8 h-8 rounded-full bg-slate-100 dark:bg-[#0a0c14] border border-slate-200 dark:border-white/10 flex items-center justify-center shadow">
|
||||||
|
<ArrowRight className="w-4 h-4 text-slate-600 dark:text-gray-300 rotate-90" />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{/* Output BM Alpha */}
|
||||||
|
<div className="p-4 rounded-xl bg-slate-50 dark:bg-white/5 border border-slate-200 dark:border-white/10">
|
||||||
|
<div className="flex items-center justify-between text-xs font-semibold text-slate-500 dark:text-gray-400 mb-1.5">
|
||||||
|
<span>YOU RECEIVE (ESTIMATED)</span>
|
||||||
|
<span>BM ALPHA</span>
|
||||||
|
</div>
|
||||||
|
<div className="flex items-center justify-between gap-4">
|
||||||
|
<div className="font-display text-2xl font-black text-[#FF8C32] truncate">
|
||||||
|
~ {calculatedTokens()}
|
||||||
|
</div>
|
||||||
|
<div className="flex items-center gap-1.5 px-3 py-1.5 rounded-full bg-[#FF8C32]/15 text-[#FF8C32] border border-[#FF8C32]/30 font-bold text-xs shrink-0">
|
||||||
|
<img src={coinImg} alt="Coin" className="w-4 h-4 rounded-full" />
|
||||||
|
<span>BMALPHA</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{/* Action CTA Button */}
|
||||||
|
<div className="mt-6">
|
||||||
|
<a
|
||||||
|
id="how-to-buy-cta"
|
||||||
|
href={YOUR_BUY_LINK}
|
||||||
|
onClick={handleCtaClick}
|
||||||
|
className="w-full flex items-center justify-center gap-2 px-6 py-4 rounded-full font-display font-black text-sm sm:text-base text-black bg-[#FF8C32] hover:bg-[#E6761D] shadow-[0_0_25px_rgba(255,140,50,0.4)] transition-all active:scale-95 text-center"
|
||||||
|
>
|
||||||
|
<span>GET READY TO BUY</span>
|
||||||
|
<ArrowRight className="w-4 h-4 text-black" />
|
||||||
|
</a>
|
||||||
|
<p className="text-[11px] text-center text-slate-500 dark:text-gray-400 mt-2.5">
|
||||||
|
Trading opens on Solana decentralized exchanges upon launch on August 24, 2026.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
);
|
||||||
|
};
|
||||||
@@ -0,0 +1,173 @@
|
|||||||
|
import React, { useState, useEffect } from 'react';
|
||||||
|
import { Menu, X, Rocket, Sparkles, ExternalLink, MessageCircle, MessagesSquare } from 'lucide-react';
|
||||||
|
import { YOUR_BUY_LINK, YOUR_DISCORD_URL, YOUR_WHATSAPP_URL } from '../config';
|
||||||
|
import { triggerBirthdayConfetti } from '../utils/confetti';
|
||||||
|
import { ThemeToggle } from './ThemeToggle';
|
||||||
|
import coinImg from '../assets/images/bm_connect_coin_1787085516443.jpg';
|
||||||
|
|
||||||
|
export const Navbar: React.FC = () => {
|
||||||
|
const [isScrolled, setIsScrolled] = useState(false);
|
||||||
|
const [mobileMenuOpen, setMobileMenuOpen] = useState(false);
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
const handleScroll = () => {
|
||||||
|
setIsScrolled(window.scrollY > 20);
|
||||||
|
};
|
||||||
|
window.addEventListener('scroll', handleScroll);
|
||||||
|
return () => window.removeEventListener('scroll', handleScroll);
|
||||||
|
}, []);
|
||||||
|
|
||||||
|
const navLinks = [
|
||||||
|
{ name: 'ABOUT', href: '#why-bm-alpha' },
|
||||||
|
{ name: 'TOKENOMICS', href: '#token' },
|
||||||
|
{ name: 'HOW TO BUY', href: '#how-to-buy' },
|
||||||
|
{ name: 'COMMUNITY', href: '#community' },
|
||||||
|
];
|
||||||
|
|
||||||
|
const handleBuyClick = (e: React.MouseEvent<HTMLAnchorElement>) => {
|
||||||
|
triggerBirthdayConfetti();
|
||||||
|
setMobileMenuOpen(false);
|
||||||
|
};
|
||||||
|
|
||||||
|
return (
|
||||||
|
<header
|
||||||
|
id="main-navbar"
|
||||||
|
className={`fixed top-0 left-0 right-0 z-50 transition-all duration-300 ${
|
||||||
|
isScrolled
|
||||||
|
? 'bg-white/85 dark:bg-[#0a0c14]/90 backdrop-blur-md border-b border-slate-200/80 dark:border-white/10 shadow-sm dark:shadow-lg dark:shadow-black/60 py-3.5'
|
||||||
|
: 'bg-transparent py-5'
|
||||||
|
}`}
|
||||||
|
>
|
||||||
|
<div className="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
|
||||||
|
<div className="flex items-center justify-between">
|
||||||
|
{/* Brand Logo & Wordmark */}
|
||||||
|
<a
|
||||||
|
href="#"
|
||||||
|
className="flex items-center gap-3 group focus:outline-none"
|
||||||
|
onClick={() => window.scrollTo({ top: 0, behavior: 'smooth' })}
|
||||||
|
>
|
||||||
|
<div className="relative flex items-center justify-center w-9 h-9 rounded-full overflow-hidden bg-gradient-to-tr from-[#FF8C32] to-[#00D7FF] p-[1.5px] shadow-[0_0_15px_rgba(255,140,50,0.5)] group-hover:shadow-[0_0_20px_rgba(0,215,255,0.7)] transition-all duration-300">
|
||||||
|
<div className="w-full h-full bg-white dark:bg-[#0a0c14] rounded-full flex items-center justify-center overflow-hidden">
|
||||||
|
<img
|
||||||
|
src={coinImg}
|
||||||
|
alt="BM Alpha Coin"
|
||||||
|
className="w-full h-full object-cover group-hover:scale-110 transition-transform duration-300"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div className="flex flex-col">
|
||||||
|
<div className="flex items-center gap-1.5">
|
||||||
|
<span className="font-display font-black text-xl sm:text-2xl tracking-tighter text-slate-900 dark:text-white group-hover:text-transparent group-hover:bg-clip-text group-hover:bg-gradient-to-r group-hover:from-[#FF8C32] group-hover:to-[#00D7FF] transition-all">
|
||||||
|
BM ALPHA
|
||||||
|
</span>
|
||||||
|
<span className="text-[9px] font-bold px-1.5 py-0.5 rounded-full bg-[#00D7FF]/15 text-[#00A6DB] dark:text-[#00D7FF] border border-[#00D7FF]/30 tracking-wider">
|
||||||
|
SOL
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
<span className="text-[10px] font-medium text-slate-500 dark:text-gray-400 -mt-1 tracking-wide">
|
||||||
|
by BirthdayMessaging
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
</a>
|
||||||
|
|
||||||
|
{/* Desktop Navigation Links */}
|
||||||
|
<nav className="hidden md:flex items-center gap-8 text-sm font-medium text-slate-600 dark:text-gray-400">
|
||||||
|
{navLinks.map((link) => (
|
||||||
|
<a
|
||||||
|
key={link.name}
|
||||||
|
href={link.href}
|
||||||
|
className="hover:text-[#FF8C32] dark:hover:text-[#00D7FF] transition-colors relative py-1 after:content-[''] after:absolute after:bottom-0 after:left-0 after:w-0 after:h-[2px] after:bg-gradient-to-r after:from-[#FF8C32] after:to-[#00D7FF] hover:after:w-full after:transition-all after:duration-250 font-bold text-xs tracking-wider"
|
||||||
|
>
|
||||||
|
{link.name}
|
||||||
|
</a>
|
||||||
|
))}
|
||||||
|
</nav>
|
||||||
|
|
||||||
|
{/* Desktop Action CTAs */}
|
||||||
|
<div className="hidden md:flex items-center gap-3">
|
||||||
|
{/* Theme Toggle Button */}
|
||||||
|
<ThemeToggle />
|
||||||
|
|
||||||
|
<a
|
||||||
|
id="nav-buy-cta-desktop"
|
||||||
|
href="#how-to-buy"
|
||||||
|
onClick={handleBuyClick}
|
||||||
|
className="bg-[#FF8C32] hover:bg-[#E6761D] text-black px-6 py-2.5 rounded-full font-bold text-xs shadow-[0_0_15px_rgba(255,140,50,0.35)] hover:shadow-[0_0_20px_rgba(255,140,50,0.5)] transition-all active:scale-95 flex items-center gap-1.5"
|
||||||
|
>
|
||||||
|
<Rocket className="w-3.5 h-3.5 text-black" />
|
||||||
|
<span>BUY BM ALPHA</span>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{/* Mobile Hamburger Button */}
|
||||||
|
<div className="flex md:hidden items-center gap-2">
|
||||||
|
<ThemeToggle />
|
||||||
|
<a
|
||||||
|
href="#how-to-buy"
|
||||||
|
onClick={handleBuyClick}
|
||||||
|
className="inline-flex items-center justify-center px-3.5 py-1.5 rounded-full text-xs font-bold font-display text-black bg-[#FF8C32] shadow-[0_0_12px_rgba(255,140,50,0.4)]"
|
||||||
|
>
|
||||||
|
BUY
|
||||||
|
</a>
|
||||||
|
<button
|
||||||
|
id="mobile-menu-toggle"
|
||||||
|
type="button"
|
||||||
|
onClick={() => setMobileMenuOpen(!mobileMenuOpen)}
|
||||||
|
className="p-2 rounded-lg text-slate-700 dark:text-gray-400 hover:text-slate-900 dark:hover:text-white hover:bg-slate-100 dark:hover:bg-white/5 focus:outline-none"
|
||||||
|
aria-label="Toggle navigation menu"
|
||||||
|
>
|
||||||
|
{mobileMenuOpen ? <X className="w-6 h-6" /> : <Menu className="w-6 h-6" />}
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{/* Mobile Drawer Menu */}
|
||||||
|
{mobileMenuOpen && (
|
||||||
|
<div className="md:hidden bg-white/95 dark:bg-[#0a0c14]/95 backdrop-blur-xl border-b border-slate-200 dark:border-white/10 px-4 pt-3 pb-6 shadow-xl animate-in slide-in-from-top-3 duration-200">
|
||||||
|
<div className="flex flex-col space-y-3">
|
||||||
|
{navLinks.map((link) => (
|
||||||
|
<a
|
||||||
|
key={link.name}
|
||||||
|
href={link.href}
|
||||||
|
onClick={() => setMobileMenuOpen(false)}
|
||||||
|
className="px-3 py-2 rounded-lg text-sm font-bold tracking-wider text-slate-800 dark:text-gray-300 hover:text-slate-900 dark:hover:text-white hover:bg-slate-100 dark:hover:bg-white/5 transition-colors"
|
||||||
|
>
|
||||||
|
{link.name}
|
||||||
|
</a>
|
||||||
|
))}
|
||||||
|
<div className="pt-2 flex flex-col gap-2">
|
||||||
|
<a
|
||||||
|
id="nav-buy-cta-mobile"
|
||||||
|
href="#how-to-buy"
|
||||||
|
onClick={handleBuyClick}
|
||||||
|
className="w-full flex items-center justify-center gap-2 px-4 py-3 rounded-full font-display font-black text-sm text-black bg-[#FF8C32] hover:bg-[#E6761D] shadow-[0_0_20px_rgba(255,140,50,0.4)] text-center"
|
||||||
|
>
|
||||||
|
<Rocket className="w-4 h-4 text-black" />
|
||||||
|
BUY BM ALPHA
|
||||||
|
</a>
|
||||||
|
<a
|
||||||
|
href={YOUR_WHATSAPP_URL}
|
||||||
|
target="_blank"
|
||||||
|
rel="noopener noreferrer"
|
||||||
|
className="w-full flex items-center justify-center gap-2 px-4 py-2.5 rounded-full font-display font-semibold text-xs text-white bg-emerald-600 hover:bg-emerald-500 text-center shadow-sm"
|
||||||
|
>
|
||||||
|
<MessageCircle className="w-3.5 h-3.5" />
|
||||||
|
<span>JOIN WHATSAPP CHANNEL</span>
|
||||||
|
</a>
|
||||||
|
<a
|
||||||
|
href={YOUR_DISCORD_URL}
|
||||||
|
target="_blank"
|
||||||
|
rel="noopener noreferrer"
|
||||||
|
className="w-full flex items-center justify-center gap-2 px-4 py-2.5 rounded-full font-display font-semibold text-xs text-white bg-[#5865F2] hover:bg-[#4752C4] text-center shadow-sm"
|
||||||
|
>
|
||||||
|
<MessagesSquare className="w-3.5 h-3.5" />
|
||||||
|
<span>JOIN DISCORD</span>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
|
</header>
|
||||||
|
);
|
||||||
|
};
|
||||||
@@ -0,0 +1,134 @@
|
|||||||
|
import React from 'react';
|
||||||
|
import { MessagesSquare, Youtube, HelpCircle, ArrowUpRight, MessageCircle, Twitter } from 'lucide-react';
|
||||||
|
import { YOUR_DISCORD_URL, YOUR_WHATSAPP_URL, YOUR_X_URL, YOUR_YOUTUBE_URL, YOUR_BUY_LINK } from '../config';
|
||||||
|
|
||||||
|
export const SocialSection: React.FC = () => {
|
||||||
|
const socialCards = [
|
||||||
|
{
|
||||||
|
id: 'social-whatsapp',
|
||||||
|
title: 'WHATSAPP CHANNEL',
|
||||||
|
subtitle: 'Exclusive updates, community invites & chat',
|
||||||
|
cta: 'JOIN WHATSAPP',
|
||||||
|
link: YOUR_WHATSAPP_URL,
|
||||||
|
isExternal: true,
|
||||||
|
badge: 'Invite Active',
|
||||||
|
icon: MessageCircle,
|
||||||
|
border: 'hover:border-emerald-500/60',
|
||||||
|
glowColor: 'group-hover:shadow-[0_0_30px_rgba(16,185,129,0.35)]',
|
||||||
|
iconBg: 'bg-emerald-500/15 text-emerald-500',
|
||||||
|
tagColor: 'text-emerald-500 bg-emerald-500/10 border-emerald-500/30'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: 'social-discord',
|
||||||
|
title: 'DISCORD SERVER',
|
||||||
|
subtitle: 'Official BM Alpha Discord & community channels',
|
||||||
|
cta: 'JOIN DISCORD',
|
||||||
|
link: YOUR_DISCORD_URL,
|
||||||
|
isExternal: true,
|
||||||
|
badge: 'Active Server',
|
||||||
|
icon: MessagesSquare,
|
||||||
|
border: 'hover:border-[#5865F2]/60',
|
||||||
|
glowColor: 'group-hover:shadow-[0_0_30px_rgba(88,101,242,0.35)]',
|
||||||
|
iconBg: 'bg-[#5865F2]/15 text-[#5865F2]',
|
||||||
|
tagColor: 'text-[#5865F2] bg-[#5865F2]/10 border-[#5865F2]/30'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: 'social-x',
|
||||||
|
title: 'FOLLOW ON X',
|
||||||
|
subtitle: 'Real-time memes, announcements & spaces',
|
||||||
|
cta: 'FOLLOW @TheBMBlueprint',
|
||||||
|
link: YOUR_X_URL,
|
||||||
|
isExternal: true,
|
||||||
|
badge: 'Official X',
|
||||||
|
icon: Twitter,
|
||||||
|
border: 'hover:border-[#FF8C32]/60',
|
||||||
|
glowColor: 'group-hover:shadow-[0_0_30px_rgba(255,140,50,0.35)]',
|
||||||
|
iconBg: 'bg-[#FF8C32]/15 text-[#FF8C32]',
|
||||||
|
tagColor: 'text-[#FF8C32] bg-[#FF8C32]/10 border-[#FF8C32]/30'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: 'social-youtube',
|
||||||
|
title: 'YOUTUBE',
|
||||||
|
subtitle: 'Video releases, tutorials & community highlights',
|
||||||
|
cta: 'SUBSCRIBE CHANNEL',
|
||||||
|
link: YOUR_YOUTUBE_URL,
|
||||||
|
isExternal: true,
|
||||||
|
badge: 'Videos & Guides',
|
||||||
|
icon: Youtube,
|
||||||
|
border: 'hover:border-red-500/60',
|
||||||
|
glowColor: 'group-hover:shadow-[0_0_30px_rgba(239,68,68,0.3)]',
|
||||||
|
iconBg: 'bg-red-500/15 text-red-500',
|
||||||
|
tagColor: 'text-red-500 bg-red-500/10 border-red-500/30'
|
||||||
|
}
|
||||||
|
];
|
||||||
|
|
||||||
|
return (
|
||||||
|
<section id="community" className="py-20 relative overflow-hidden">
|
||||||
|
{/* Background ambient lighting */}
|
||||||
|
<div className="absolute top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2 w-full max-w-7xl h-64 bg-gradient-to-r from-[#FF8C32]/10 via-[#00D7FF]/10 to-[#FF8C32]/10 blur-3xl pointer-events-none -z-10" />
|
||||||
|
|
||||||
|
<div className="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
|
||||||
|
|
||||||
|
{/* Section Header */}
|
||||||
|
<div className="flex flex-col items-center text-center mb-12">
|
||||||
|
<div className="inline-flex items-center gap-2 px-3.5 py-1.5 rounded-full bg-white dark:bg-white/5 border border-slate-200 dark:border-white/10 text-xs font-bold text-slate-700 dark:text-gray-300 mb-3 shadow-sm">
|
||||||
|
<span className="w-2 h-2 rounded-full bg-[#00D7FF] animate-pulse" />
|
||||||
|
COMMUNITY & SOCIAL HUBS
|
||||||
|
</div>
|
||||||
|
<h2 className="font-display text-3xl sm:text-4xl lg:text-5xl font-black text-slate-900 dark:text-white tracking-tight">
|
||||||
|
CONNECT WITH THE <span className="text-gradient-brand">ALPHA MOVEMENT</span>
|
||||||
|
</h2>
|
||||||
|
<p className="mt-3 text-slate-600 dark:text-gray-400 max-w-xl text-sm sm:text-base font-medium">
|
||||||
|
Join thousands of BirthdayMessaging members across WhatsApp, Discord, X, and YouTube.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{/* 4 Social Cards Grid */}
|
||||||
|
<div className="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-4 gap-5">
|
||||||
|
{socialCards.map((card) => {
|
||||||
|
const Icon = card.icon;
|
||||||
|
return (
|
||||||
|
<a
|
||||||
|
key={card.id}
|
||||||
|
id={card.id}
|
||||||
|
href={card.link}
|
||||||
|
target={card.isExternal ? '_blank' : '_self'}
|
||||||
|
rel={card.isExternal ? 'noopener noreferrer' : undefined}
|
||||||
|
className={`group relative flex flex-col justify-between p-6 rounded-2xl bg-white/90 dark:bg-[#161b2b]/90 border border-slate-200 dark:border-white/10 ${card.border} transition-all duration-300 ${card.glowColor} transform hover:-translate-y-1 backdrop-blur-xl shadow-md dark:shadow-lg`}
|
||||||
|
>
|
||||||
|
<div>
|
||||||
|
{/* Top Bar: Icon & Badge */}
|
||||||
|
<div className="flex items-center justify-between mb-4">
|
||||||
|
<div className={`p-3 rounded-xl ${card.iconBg} transition-transform duration-300 group-hover:scale-110 shadow-md`}>
|
||||||
|
<Icon className="w-6 h-6" />
|
||||||
|
</div>
|
||||||
|
<span className={`text-[10px] font-bold px-2.5 py-1 rounded-full border ${card.tagColor} tracking-widest uppercase`}>
|
||||||
|
{card.badge}
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{/* Title & Description */}
|
||||||
|
<h3 className="font-display font-black text-xl text-slate-900 dark:text-white group-hover:text-[#00A6DB] dark:group-hover:text-[#00D7FF] transition-colors">
|
||||||
|
{card.title}
|
||||||
|
</h3>
|
||||||
|
<p className="mt-2 text-xs sm:text-sm text-slate-600 dark:text-gray-400 leading-relaxed">
|
||||||
|
{card.subtitle}
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{/* Bottom CTA bar */}
|
||||||
|
<div className="mt-6 pt-4 border-t border-slate-200 dark:border-white/5 flex items-center justify-between text-xs font-bold font-display text-slate-700 dark:text-gray-300 group-hover:text-slate-900 dark:group-hover:text-white transition-colors">
|
||||||
|
<span>{card.cta}</span>
|
||||||
|
<div className="w-7 h-7 rounded-lg bg-slate-100 dark:bg-white/5 group-hover:bg-[#FF8C32] flex items-center justify-center transition-colors">
|
||||||
|
<ArrowUpRight className="w-4 h-4 text-slate-600 dark:text-gray-300 group-hover:text-black group-hover:translate-x-0.5 group-hover:-translate-y-0.5 transition-transform" />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</a>
|
||||||
|
);
|
||||||
|
})}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
);
|
||||||
|
};
|
||||||
@@ -0,0 +1,41 @@
|
|||||||
|
import React from 'react';
|
||||||
|
import { Sun, Moon } from 'lucide-react';
|
||||||
|
import { useTheme } from '../context/ThemeContext';
|
||||||
|
|
||||||
|
interface ThemeToggleProps {
|
||||||
|
className?: string;
|
||||||
|
showLabel?: boolean;
|
||||||
|
}
|
||||||
|
|
||||||
|
export const ThemeToggle: React.FC<ThemeToggleProps> = ({ className = '', showLabel = false }) => {
|
||||||
|
const { theme, toggleTheme } = useTheme();
|
||||||
|
const isDark = theme === 'dark';
|
||||||
|
|
||||||
|
return (
|
||||||
|
<button
|
||||||
|
id="theme-toggle-btn"
|
||||||
|
type="button"
|
||||||
|
onClick={toggleTheme}
|
||||||
|
aria-label={`Switch to ${isDark ? 'light' : 'dark'} mode`}
|
||||||
|
title={`Switch to ${isDark ? 'light' : 'dark'} mode`}
|
||||||
|
className={`relative inline-flex items-center justify-center gap-2 p-2 sm:px-3 sm:py-2 rounded-full border transition-all duration-300 focus:outline-none focus:ring-2 focus:ring-[#FF8C32]/50 cursor-pointer ${
|
||||||
|
isDark
|
||||||
|
? 'bg-white/5 hover:bg-white/10 border-white/10 text-gray-300 hover:text-white shadow-[0_0_15px_rgba(0,0,0,0.5)]'
|
||||||
|
: 'bg-slate-100 hover:bg-slate-200 border-slate-300 text-slate-700 hover:text-slate-900 shadow-sm'
|
||||||
|
} ${className}`}
|
||||||
|
>
|
||||||
|
<div className="relative w-4 h-4 flex items-center justify-center">
|
||||||
|
{isDark ? (
|
||||||
|
<Sun className="w-4 h-4 text-[#FFA843] transition-transform duration-300 hover:rotate-45" />
|
||||||
|
) : (
|
||||||
|
<Moon className="w-4 h-4 text-[#00A6DB] transition-transform duration-300 -rotate-12 hover:rotate-0" />
|
||||||
|
)}
|
||||||
|
</div>
|
||||||
|
{showLabel && (
|
||||||
|
<span className="text-xs font-bold tracking-wider uppercase font-display select-none">
|
||||||
|
{isDark ? 'LIGHT THEME' : 'DARK THEME'}
|
||||||
|
</span>
|
||||||
|
)}
|
||||||
|
</button>
|
||||||
|
);
|
||||||
|
};
|
||||||
@@ -0,0 +1,148 @@
|
|||||||
|
import React, { useState } from 'react';
|
||||||
|
import { Copy, Check, ShieldCheck, Flame, Layers, Award, Sparkles, Cpu, Lock, ArrowUpRight } from 'lucide-react';
|
||||||
|
import { CONTRACT_ADDRESS, TOKEN_INFO, TOKENOMICS_VERSION, YOUR_BUY_LINK } from '../config';
|
||||||
|
import { triggerBirthdayConfetti } from '../utils/confetti';
|
||||||
|
import { TokenomicsDashboard } from './TokenomicsDashboard';
|
||||||
|
import coinImg from '../assets/images/bm_connect_coin_1787085516443.jpg';
|
||||||
|
|
||||||
|
export const TokenSection: React.FC = () => {
|
||||||
|
const [copied, setCopied] = useState(false);
|
||||||
|
|
||||||
|
const handleCopy = () => {
|
||||||
|
navigator.clipboard.writeText(CONTRACT_ADDRESS);
|
||||||
|
setCopied(true);
|
||||||
|
triggerBirthdayConfetti();
|
||||||
|
setTimeout(() => setCopied(false), 3000);
|
||||||
|
};
|
||||||
|
|
||||||
|
const specs = [
|
||||||
|
{ label: 'Ticker', value: TOKEN_INFO.ticker, sub: 'Symbol', icon: Sparkles, color: 'text-[#FF8C32]' },
|
||||||
|
{ label: 'Network', value: TOKEN_INFO.network, sub: 'Solana SPL Token', icon: Cpu, color: 'text-[#00D7FF]' },
|
||||||
|
{ label: 'Launch', value: TOKEN_INFO.launchDateString, sub: 'Official Pool Launch', icon: Flame, color: 'text-[#FFA843]' },
|
||||||
|
{ label: 'Total Supply', value: TOKEN_INFO.totalSupply, sub: '10 Billion Fixed', icon: Layers, color: 'text-white' },
|
||||||
|
{ label: 'Buy / Sell Tax', value: TOKEN_INFO.buySellTax, sub: 'Zero Slippage Tax', icon: ShieldCheck, color: 'text-emerald-400' },
|
||||||
|
{ label: 'Liquidity', value: TOKEN_INFO.liquidity, sub: 'Fair Launch Raydium', icon: Award, color: 'text-[#00D7FF]' },
|
||||||
|
];
|
||||||
|
|
||||||
|
return (
|
||||||
|
<section id="token" className="py-24 relative overflow-hidden">
|
||||||
|
{/* Background Glows */}
|
||||||
|
<div className="absolute top-1/3 right-1/4 w-96 h-96 bg-[#FF8C32]/10 rounded-full blur-[130px] pointer-events-none -z-10" />
|
||||||
|
<div className="absolute bottom-1/4 left-1/4 w-96 h-96 bg-[#00D7FF]/10 rounded-full blur-[130px] pointer-events-none -z-10" />
|
||||||
|
|
||||||
|
<div className="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
|
||||||
|
|
||||||
|
{/* Section Header */}
|
||||||
|
<div className="text-center max-w-3xl mx-auto mb-16">
|
||||||
|
<div className="inline-flex items-center gap-2 px-3.5 py-1.5 rounded-full bg-white dark:bg-white/5 border border-slate-200 dark:border-white/10 text-xs font-bold text-[#00A6DB] dark:text-[#00D7FF] mb-3 shadow-sm">
|
||||||
|
<span className="w-2 h-2 rounded-full bg-[#00D7FF] animate-pulse" />
|
||||||
|
TOKENOMICS & SPECIFICATIONS • {TOKENOMICS_VERSION}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<h2
|
||||||
|
id="token-section-heading"
|
||||||
|
className="font-display text-4xl sm:text-5xl font-black text-slate-900 dark:text-white tracking-tight flex items-center justify-center flex-wrap gap-2 sm:gap-3"
|
||||||
|
>
|
||||||
|
<span><span className="text-gradient-brand">BM ALPHA</span> TOKENOMICS</span>
|
||||||
|
<span className="text-xs sm:text-sm font-mono font-bold px-3 py-1 rounded-full bg-[#FF8C32]/15 text-[#FF8C32] border border-[#FF8C32]/30 align-middle">
|
||||||
|
{TOKENOMICS_VERSION}
|
||||||
|
</span>
|
||||||
|
</h2>
|
||||||
|
<p className="mt-4 text-slate-600 dark:text-gray-400 text-base sm:text-lg font-medium">
|
||||||
|
Transparent, community-focused, and 100% fixed 10 Billion token distribution built on Solana.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{/* Main Token Hub Card */}
|
||||||
|
<div className="relative rounded-3xl bg-white/90 dark:bg-[#161b2b]/90 border border-slate-200 dark:border-white/10 p-6 sm:p-10 shadow-xl dark:shadow-2xl backdrop-blur-xl mb-12">
|
||||||
|
|
||||||
|
{/* Top Token Overview Bar */}
|
||||||
|
<div className="flex flex-col lg:flex-row items-center justify-between gap-8 pb-10 border-b border-slate-200 dark:border-white/5">
|
||||||
|
<div className="flex items-center gap-5">
|
||||||
|
<div className="relative w-16 h-16 sm:w-20 sm:h-20 rounded-full p-1 bg-gradient-to-tr from-[#FF8C32] to-[#00D7FF] shrink-0 shadow-[0_0_25px_rgba(255,140,50,0.4)]">
|
||||||
|
<div className="w-full h-full rounded-full overflow-hidden bg-slate-100 dark:bg-[#0a0c14]">
|
||||||
|
<img src={coinImg} alt="BM Alpha" className="w-full h-full object-cover" />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<div className="flex items-center gap-3">
|
||||||
|
<h3 className="font-display text-2xl sm:text-3xl font-black text-slate-900 dark:text-white">
|
||||||
|
BM ALPHA
|
||||||
|
</h3>
|
||||||
|
<span className="px-2.5 py-0.5 rounded-full bg-[#FF8C32]/15 text-[#FF8C32] border border-[#FF8C32]/30 font-mono text-xs font-bold">
|
||||||
|
$BMALPHA
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
<p className="text-slate-500 dark:text-gray-400 text-xs sm:text-sm mt-1">
|
||||||
|
Solana Program Library (SPL) Token • BirthdayMessaging Ecosystem
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{/* Contract Address Box & Copy Action */}
|
||||||
|
<div className="w-full lg:w-auto flex flex-col sm:flex-row items-stretch sm:items-center gap-3">
|
||||||
|
<div className="flex flex-col px-4 py-2.5 rounded-xl bg-slate-50 dark:bg-white/5 border border-slate-200 dark:border-white/10 min-w-[260px]">
|
||||||
|
<span className="text-[9px] font-bold text-slate-500 dark:text-gray-400 uppercase tracking-widest">
|
||||||
|
Contract Address
|
||||||
|
</span>
|
||||||
|
<span className="font-mono text-xs sm:text-sm font-semibold text-slate-800 dark:text-gray-200 truncate">
|
||||||
|
{CONTRACT_ADDRESS}
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<button
|
||||||
|
id="copy-contract-btn"
|
||||||
|
type="button"
|
||||||
|
onClick={handleCopy}
|
||||||
|
className="flex items-center justify-center gap-2 px-6 py-3.5 rounded-full font-display font-extrabold text-xs sm:text-sm text-black bg-[#FF8C32] hover:bg-[#E6761D] shadow-[0_0_20px_rgba(255,140,50,0.35)] transition-all active:scale-95 whitespace-nowrap cursor-pointer"
|
||||||
|
>
|
||||||
|
{copied ? (
|
||||||
|
<>
|
||||||
|
<Check className="w-4 h-4 text-black" />
|
||||||
|
<span>COPIED TO CLIPBOARD!</span>
|
||||||
|
</>
|
||||||
|
) : (
|
||||||
|
<>
|
||||||
|
<Copy className="w-4 h-4 text-black" />
|
||||||
|
<span>COPY CONTRACT ADDRESS</span>
|
||||||
|
</>
|
||||||
|
)}
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{/* 6 Metric Specs Cards */}
|
||||||
|
<div className="grid grid-cols-2 lg:grid-cols-3 gap-4 sm:gap-6 my-10">
|
||||||
|
{specs.map((item, index) => {
|
||||||
|
const Icon = item.icon;
|
||||||
|
return (
|
||||||
|
<div
|
||||||
|
key={index}
|
||||||
|
className="p-5 rounded-2xl bg-slate-50 dark:bg-white/5 border border-slate-200 dark:border-white/10 hover:border-[#00D7FF]/40 transition-all hover:bg-slate-100 dark:hover:bg-white/[0.08] group"
|
||||||
|
>
|
||||||
|
<div className="flex items-center justify-between mb-3">
|
||||||
|
<span className="text-xs font-bold uppercase tracking-wider text-slate-500 dark:text-gray-400">
|
||||||
|
{item.label}
|
||||||
|
</span>
|
||||||
|
<Icon className={`w-4 h-4 ${item.color} group-hover:scale-110 transition-transform`} />
|
||||||
|
</div>
|
||||||
|
<div className={`font-display text-lg sm:text-2xl font-black ${item.label === 'Total Supply' ? 'text-slate-900 dark:text-white' : item.color}`}>
|
||||||
|
{item.value}
|
||||||
|
</div>
|
||||||
|
<div className="text-[11px] font-medium text-slate-500 dark:text-gray-400 mt-1">
|
||||||
|
{item.sub}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
})}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{/* Interactive Tokenomics Dashboard Component */}
|
||||||
|
<TokenomicsDashboard />
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
);
|
||||||
|
};
|
||||||
@@ -0,0 +1,375 @@
|
|||||||
|
import React, { useState } from 'react';
|
||||||
|
import { Users, Award, Flame, Gift, ShieldCheck, Layers, PieChart, Info, CheckCircle2, TrendingUp, Sparkles, HelpCircle, FileText } from 'lucide-react';
|
||||||
|
import { TOKEN_DISTRIBUTION, TOKEN_INFO, TOKENOMICS_VERSION } from '../config';
|
||||||
|
|
||||||
|
interface TokenomicsDashboardProps {
|
||||||
|
className?: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
export const TokenomicsDashboard: React.FC<TokenomicsDashboardProps> = ({ className = '' }) => {
|
||||||
|
const [activeSegment, setActiveSegment] = useState<string | null>(null);
|
||||||
|
|
||||||
|
const iconMap: Record<string, React.ElementType> = {
|
||||||
|
Users: Users,
|
||||||
|
Award: Award,
|
||||||
|
Flame: Flame,
|
||||||
|
Gift: Gift,
|
||||||
|
ShieldCheck: ShieldCheck,
|
||||||
|
Layers: Layers
|
||||||
|
};
|
||||||
|
|
||||||
|
const selectedItem = TOKEN_DISTRIBUTION.find((item) => item.id === activeSegment) || TOKEN_DISTRIBUTION[0];
|
||||||
|
|
||||||
|
// Calculate SVG Donut chart paths
|
||||||
|
let cumulativeAngle = 0;
|
||||||
|
const radius = 80;
|
||||||
|
const strokeWidth = 26;
|
||||||
|
const center = 110;
|
||||||
|
const circumference = 2 * Math.PI * radius;
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div id="tokenomics-dashboard" className={`w-full ${className}`}>
|
||||||
|
|
||||||
|
{/* Dashboard Section Header */}
|
||||||
|
<div className="flex flex-col md:flex-row md:items-end justify-between gap-4 mb-8 pb-6 border-b border-slate-200 dark:border-white/10">
|
||||||
|
<div>
|
||||||
|
<div className="inline-flex items-center gap-2 px-3 py-1 rounded-full bg-[#FF8C32]/10 text-[#FF8C32] border border-[#FF8C32]/30 text-xs font-bold uppercase tracking-wider mb-2">
|
||||||
|
<PieChart className="w-3.5 h-3.5" />
|
||||||
|
<span>BM ALPHA TOKENOMICS {TOKENOMICS_VERSION}</span>
|
||||||
|
</div>
|
||||||
|
<h3 className="font-display text-2xl sm:text-3xl font-black text-slate-900 dark:text-white tracking-tight flex items-center flex-wrap gap-2.5">
|
||||||
|
<span>PROPOSED TOKEN DISTRIBUTION</span>
|
||||||
|
<span className="text-xs font-mono font-bold px-2.5 py-0.5 rounded-md bg-[#00D7FF]/15 text-[#00A6DB] dark:text-[#00D7FF] border border-[#00D7FF]/30">
|
||||||
|
{TOKENOMICS_VERSION}
|
||||||
|
</span>
|
||||||
|
</h3>
|
||||||
|
<p className="text-slate-600 dark:text-gray-400 text-sm mt-1">
|
||||||
|
Total Proposed Supply: <strong className="text-slate-900 dark:text-white font-mono">{TOKEN_INFO.totalSupply}</strong>
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{/* Total Supply & Version Badge */}
|
||||||
|
<div className="flex items-center gap-3 p-3 rounded-xl bg-slate-100 dark:bg-white/5 border border-slate-200 dark:border-white/10 self-start md:self-auto">
|
||||||
|
<div className="w-10 h-10 rounded-lg bg-gradient-to-tr from-[#FF8C32] to-[#00D7FF] flex items-center justify-center p-0.5 shadow-md">
|
||||||
|
<div className="w-full h-full bg-white dark:bg-[#0a0c14] rounded-[6px] flex items-center justify-center">
|
||||||
|
<Sparkles className="w-4 h-4 text-[#FF8C32]" />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<div className="flex items-center gap-2">
|
||||||
|
<span className="text-[10px] uppercase font-bold text-slate-500 dark:text-gray-400 tracking-wider">
|
||||||
|
Total Proposed Pool
|
||||||
|
</span>
|
||||||
|
<span className="text-[9px] font-mono font-black text-[#FF8C32]">
|
||||||
|
{TOKENOMICS_VERSION}
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
<div className="font-mono text-sm font-black text-slate-900 dark:text-white">
|
||||||
|
10,000,000,000 BMALPHA
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{/* Main Visualizer: Donut Chart & Active Allocation Spotlight */}
|
||||||
|
<div className="grid grid-cols-1 lg:grid-cols-12 gap-8 items-center p-6 sm:p-8 rounded-2xl bg-slate-50/80 dark:bg-white/[0.03] border border-slate-200 dark:border-white/10 mb-10">
|
||||||
|
|
||||||
|
{/* Donut Chart Visualizer */}
|
||||||
|
<div className="lg:col-span-5 flex flex-col items-center justify-center relative">
|
||||||
|
<div className="relative w-[230px] h-[230px] sm:w-[260px] sm:h-[260px]">
|
||||||
|
<svg viewBox="0 0 220 220" className="w-full h-full transform -rotate-90">
|
||||||
|
{TOKEN_DISTRIBUTION.map((item) => {
|
||||||
|
const strokeDasharray = `${(item.percentage / 100) * circumference} ${circumference}`;
|
||||||
|
const strokeDashoffset = -((cumulativeAngle / 100) * circumference);
|
||||||
|
cumulativeAngle += item.percentage;
|
||||||
|
const isHovered = activeSegment === item.id;
|
||||||
|
|
||||||
|
return (
|
||||||
|
<circle
|
||||||
|
key={item.id}
|
||||||
|
cx={center}
|
||||||
|
cy={center}
|
||||||
|
r={radius}
|
||||||
|
fill="transparent"
|
||||||
|
stroke={item.color}
|
||||||
|
strokeWidth={isHovered ? strokeWidth + 6 : strokeWidth}
|
||||||
|
strokeDasharray={strokeDasharray}
|
||||||
|
strokeDashoffset={strokeDashoffset}
|
||||||
|
strokeLinecap="butt"
|
||||||
|
className="cursor-pointer transition-all duration-300 hover:opacity-100"
|
||||||
|
style={{
|
||||||
|
opacity: activeSegment ? (isHovered ? 1 : 0.4) : 0.9,
|
||||||
|
filter: isHovered ? `drop-shadow(0 0 12px ${item.color}80)` : 'none',
|
||||||
|
}}
|
||||||
|
onMouseEnter={() => setActiveSegment(item.id)}
|
||||||
|
onMouseLeave={() => setActiveSegment(null)}
|
||||||
|
/>
|
||||||
|
);
|
||||||
|
})}
|
||||||
|
</svg>
|
||||||
|
|
||||||
|
{/* Donut Center Dynamic Details */}
|
||||||
|
<div className="absolute inset-0 flex flex-col items-center justify-center text-center p-4 pointer-events-none">
|
||||||
|
<span className="text-[10px] font-bold uppercase tracking-wider text-slate-500 dark:text-gray-400">
|
||||||
|
{selectedItem ? selectedItem.category : 'Hover to Explore'}
|
||||||
|
</span>
|
||||||
|
<span className="font-display font-black text-3xl sm:text-4xl text-slate-900 dark:text-white mt-0.5">
|
||||||
|
{selectedItem.percentage}%
|
||||||
|
</span>
|
||||||
|
<span className="font-mono text-xs font-bold text-[#FF8C32] dark:text-[#FFA843]">
|
||||||
|
{selectedItem.shortAmount}
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<p className="text-[11px] text-slate-500 dark:text-gray-400 mt-4 text-center">
|
||||||
|
Tap or hover any slice to inspect token amounts & purpose
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{/* Active Allocation Detail Card */}
|
||||||
|
<div className="lg:col-span-7 flex flex-col justify-between h-full space-y-4">
|
||||||
|
<div className="p-5 sm:p-6 rounded-2xl bg-white dark:bg-[#161b2b] border border-slate-200 dark:border-white/10 shadow-md">
|
||||||
|
<div className="flex items-center justify-between gap-3 mb-4">
|
||||||
|
<div className="flex items-center gap-3">
|
||||||
|
<div
|
||||||
|
className="w-10 h-10 rounded-xl flex items-center justify-center text-white shadow-sm"
|
||||||
|
style={{ backgroundColor: selectedItem.color }}
|
||||||
|
>
|
||||||
|
{React.createElement(iconMap[selectedItem.iconName] || Users, { className: 'w-5 h-5 text-white' })}
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<h4 className="font-display font-black text-xl text-slate-900 dark:text-white">
|
||||||
|
{selectedItem.category}
|
||||||
|
</h4>
|
||||||
|
<span className="text-xs font-mono font-bold text-slate-500 dark:text-gray-400">
|
||||||
|
{selectedItem.amount} BM Alpha Tokens
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div
|
||||||
|
className="px-3.5 py-1.5 rounded-full font-display font-black text-base border"
|
||||||
|
style={{
|
||||||
|
color: selectedItem.color,
|
||||||
|
borderColor: `${selectedItem.color}50`,
|
||||||
|
backgroundColor: `${selectedItem.color}15`,
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
{selectedItem.percentage}%
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{/* Purpose Highlight */}
|
||||||
|
<div className="pt-3 border-t border-slate-200 dark:border-white/5">
|
||||||
|
<div className="text-[10px] font-bold uppercase tracking-widest text-slate-500 dark:text-gray-400 mb-1 flex items-center gap-1.5">
|
||||||
|
<Info className="w-3.5 h-3.5" />
|
||||||
|
PURPOSE OF THIS ALLOCATION
|
||||||
|
</div>
|
||||||
|
<p className="text-slate-800 dark:text-gray-200 text-sm sm:text-base font-medium leading-relaxed">
|
||||||
|
{selectedItem.purpose}
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{/* Quick Metrics Bar */}
|
||||||
|
<div className="grid grid-cols-2 gap-3 mt-4 pt-3 border-t border-slate-200 dark:border-white/5 text-xs">
|
||||||
|
<div className="p-2.5 rounded-lg bg-slate-50 dark:bg-white/5">
|
||||||
|
<div className="text-[10px] text-slate-500 dark:text-gray-400 font-medium">Exact Allocation</div>
|
||||||
|
<div className="font-mono font-bold text-slate-900 dark:text-white mt-0.5">{selectedItem.amount}</div>
|
||||||
|
</div>
|
||||||
|
<div className="p-2.5 rounded-lg bg-slate-50 dark:bg-white/5">
|
||||||
|
<div className="text-[10px] text-slate-500 dark:text-gray-400 font-medium">Share of 10B Total</div>
|
||||||
|
<div className="font-mono font-bold text-slate-900 dark:text-white mt-0.5">{selectedItem.shortAmount} ({selectedItem.percentage}%)</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{/* Quick Segment Selector Pills */}
|
||||||
|
<div className="flex flex-wrap gap-2 pt-2">
|
||||||
|
{TOKEN_DISTRIBUTION.map((item) => (
|
||||||
|
<button
|
||||||
|
key={item.id}
|
||||||
|
type="button"
|
||||||
|
onClick={() => setActiveSegment(item.id)}
|
||||||
|
onMouseEnter={() => setActiveSegment(item.id)}
|
||||||
|
className={`px-3 py-1.5 rounded-lg text-xs font-bold transition-all cursor-pointer flex items-center gap-2 border ${
|
||||||
|
activeSegment === item.id
|
||||||
|
? 'bg-slate-900 text-white dark:bg-white dark:text-black border-transparent shadow-md'
|
||||||
|
: 'bg-white dark:bg-white/5 text-slate-700 dark:text-gray-300 border-slate-200 dark:border-white/10 hover:border-slate-400'
|
||||||
|
}`}
|
||||||
|
>
|
||||||
|
<span className="w-2.5 h-2.5 rounded-full shrink-0" style={{ backgroundColor: item.color }} />
|
||||||
|
<span>{item.category}</span>
|
||||||
|
<span className="text-[10px] opacity-75 font-mono">({item.percentage}%)</span>
|
||||||
|
</button>
|
||||||
|
))}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{/* Multi-Segment Allocation Bar */}
|
||||||
|
<div className="mb-10">
|
||||||
|
<div className="flex items-center justify-between text-xs font-bold uppercase tracking-wider text-slate-600 dark:text-gray-300 mb-2">
|
||||||
|
<span>Overall Allocation Breakdown</span>
|
||||||
|
<span className="font-mono text-[#00A6DB] dark:text-[#00D7FF]">100% Fully Accounted</span>
|
||||||
|
</div>
|
||||||
|
<div className="h-4 w-full rounded-full bg-slate-200 dark:bg-white/5 overflow-hidden flex border border-slate-300 dark:border-white/10 shadow-inner">
|
||||||
|
{TOKEN_DISTRIBUTION.map((item) => (
|
||||||
|
<div
|
||||||
|
key={item.id}
|
||||||
|
style={{ width: `${item.percentage}%`, backgroundColor: item.color }}
|
||||||
|
className="h-full cursor-pointer hover:opacity-80 transition-all relative group"
|
||||||
|
onMouseEnter={() => setActiveSegment(item.id)}
|
||||||
|
onClick={() => setActiveSegment(item.id)}
|
||||||
|
title={`${item.category}: ${item.percentage}% (${item.shortAmount})`}
|
||||||
|
/>
|
||||||
|
))}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{/* 6 Allocation Cards Grid */}
|
||||||
|
<div className="mb-12">
|
||||||
|
<h4 className="font-display text-lg font-bold text-slate-900 dark:text-white mb-4 flex items-center gap-2">
|
||||||
|
<TrendingUp className="w-4 h-4 text-[#FF8C32]" />
|
||||||
|
<span>PROPOSED ALLOCATION BREAKDOWN</span>
|
||||||
|
</h4>
|
||||||
|
|
||||||
|
<div className="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-4 sm:gap-5">
|
||||||
|
{TOKEN_DISTRIBUTION.map((item) => {
|
||||||
|
const Icon = iconMap[item.iconName] || Users;
|
||||||
|
const isSelected = activeSegment === item.id;
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div
|
||||||
|
key={item.id}
|
||||||
|
id={`card-${item.id}`}
|
||||||
|
onMouseEnter={() => setActiveSegment(item.id)}
|
||||||
|
onClick={() => setActiveSegment(item.id)}
|
||||||
|
className={`group p-5 rounded-2xl bg-white dark:bg-[#161b2b] border transition-all duration-300 cursor-pointer shadow-sm hover:shadow-md ${
|
||||||
|
isSelected
|
||||||
|
? 'border-[#FF8C32] dark:border-[#00D7FF] shadow-[0_0_20px_rgba(255,140,50,0.2)] transform -translate-y-1'
|
||||||
|
: 'border-slate-200 dark:border-white/10 hover:border-slate-300 dark:hover:border-white/20'
|
||||||
|
}`}
|
||||||
|
>
|
||||||
|
{/* Top Bar: Icon, Title & Percentage */}
|
||||||
|
<div className="flex items-start justify-between gap-3 mb-3">
|
||||||
|
<div className="flex items-center gap-3">
|
||||||
|
<div
|
||||||
|
className="w-10 h-10 rounded-xl flex items-center justify-center text-white shadow-sm shrink-0"
|
||||||
|
style={{ backgroundColor: item.color }}
|
||||||
|
>
|
||||||
|
<Icon className="w-5 h-5 text-white" />
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<h5 className="font-display font-black text-base text-slate-900 dark:text-white group-hover:text-[#FF8C32] transition-colors">
|
||||||
|
{item.category}
|
||||||
|
</h5>
|
||||||
|
<span className="font-mono text-xs font-bold text-slate-500 dark:text-gray-400">
|
||||||
|
{item.shortAmount}
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<span
|
||||||
|
className="font-display font-black text-xl px-2.5 py-0.5 rounded-full border"
|
||||||
|
style={{
|
||||||
|
color: item.color,
|
||||||
|
borderColor: `${item.color}40`,
|
||||||
|
backgroundColor: `${item.color}15`,
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
{item.percentage}%
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{/* Progress bar inside card */}
|
||||||
|
<div className="w-full bg-slate-100 dark:bg-white/5 h-2 rounded-full overflow-hidden my-3">
|
||||||
|
<div
|
||||||
|
className="h-full rounded-full transition-all duration-500"
|
||||||
|
style={{ width: `${item.percentage * 2.5}%`, backgroundColor: item.color }}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{/* Exact token amount */}
|
||||||
|
<div className="flex items-center justify-between text-xs font-mono text-slate-600 dark:text-gray-400 py-1.5 border-b border-slate-100 dark:border-white/5">
|
||||||
|
<span className="text-[11px] font-sans font-medium text-slate-500">Token Count:</span>
|
||||||
|
<span className="font-bold text-slate-900 dark:text-white">{item.amount}</span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{/* Purpose text */}
|
||||||
|
<p className="mt-2.5 text-xs text-slate-600 dark:text-gray-300 leading-relaxed font-medium">
|
||||||
|
{item.purpose}
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
})}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{/* Purpose of Each Allocation Section: Deep-Dive Accordion / Guidance */}
|
||||||
|
<div className="p-6 sm:p-8 rounded-2xl bg-gradient-to-br from-slate-50 via-white to-slate-50 dark:from-[#161b2b] dark:via-[#161b2b]/80 dark:to-[#0a0c14] border border-slate-200 dark:border-white/10 shadow-lg">
|
||||||
|
|
||||||
|
<div className="flex items-center gap-3 mb-6 pb-4 border-b border-slate-200 dark:border-white/10">
|
||||||
|
<div className="w-10 h-10 rounded-xl bg-[#00D7FF]/15 text-[#00A6DB] dark:text-[#00D7FF] border border-[#00D7FF]/30 flex items-center justify-center shrink-0">
|
||||||
|
<CheckCircle2 className="w-5 h-5" />
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<h4 className="font-display font-black text-xl text-slate-900 dark:text-white">
|
||||||
|
PURPOSE OF EACH ALLOCATION
|
||||||
|
</h4>
|
||||||
|
<p className="text-xs sm:text-sm text-slate-600 dark:text-gray-400 font-medium">
|
||||||
|
How the proposed 10B supply strategically supports long-term growth and decentralization
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div className="grid grid-cols-1 md:grid-cols-2 gap-4">
|
||||||
|
{TOKEN_DISTRIBUTION.map((item) => (
|
||||||
|
<div
|
||||||
|
key={`purpose-${item.id}`}
|
||||||
|
className="p-4 rounded-xl bg-white dark:bg-white/5 border border-slate-200 dark:border-white/5 flex items-start gap-3.5 hover:border-slate-300 dark:hover:border-white/15 transition-colors"
|
||||||
|
>
|
||||||
|
<span
|
||||||
|
className="w-3 h-3 rounded-full mt-1 shrink-0"
|
||||||
|
style={{ backgroundColor: item.color }}
|
||||||
|
/>
|
||||||
|
<div>
|
||||||
|
<div className="flex items-center gap-2">
|
||||||
|
<span className="font-display font-black text-sm text-slate-900 dark:text-white">
|
||||||
|
{item.category}
|
||||||
|
</span>
|
||||||
|
<span
|
||||||
|
className="text-[10px] font-mono font-bold px-2 py-0.5 rounded-full"
|
||||||
|
style={{
|
||||||
|
color: item.color,
|
||||||
|
backgroundColor: `${item.color}15`,
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
{item.percentage}% ({item.shortAmount})
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
<p className="text-xs sm:text-sm text-slate-600 dark:text-gray-300 mt-1 leading-relaxed">
|
||||||
|
{item.purpose}
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
))}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{/* Version Governance Note */}
|
||||||
|
<div className="mt-6 pt-4 border-t border-slate-200 dark:border-white/5 flex flex-col sm:flex-row sm:items-center justify-between gap-2 text-[11px] text-slate-500 dark:text-gray-400">
|
||||||
|
<div className="flex items-center gap-2">
|
||||||
|
<span className="w-1.5 h-1.5 rounded-full bg-[#FF8C32]" />
|
||||||
|
<span><strong>Specification:</strong> BM Alpha Tokenomics {TOKENOMICS_VERSION}</span>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
Proposed distribution subject to community input & future governance iterations.
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
};
|
||||||
@@ -0,0 +1,167 @@
|
|||||||
|
import React from 'react';
|
||||||
|
import { Users, Sparkles, Zap, Shield, Gift, Heart } from 'lucide-react';
|
||||||
|
import globalNetImg from '../assets/images/global_network_1786969619613.jpg';
|
||||||
|
import giftBoxImg from '../assets/images/futuristic_gift_box_1786969590300.jpg';
|
||||||
|
import cakeImg from '../assets/images/holographic_cake_1786969603927.jpg';
|
||||||
|
|
||||||
|
export const WhySection: React.FC = () => {
|
||||||
|
const cards = [
|
||||||
|
{
|
||||||
|
id: 'why-community',
|
||||||
|
title: 'COMMUNITY',
|
||||||
|
tag: 'Global Family',
|
||||||
|
description: 'Built around a growing community that wants to participate, share, and have fun.',
|
||||||
|
points: ['Decentralized celebrations', 'Worldwide member milestones', 'Community airdrops & rewards'],
|
||||||
|
image: globalNetImg,
|
||||||
|
icon: Users,
|
||||||
|
accentColor: 'text-[#00D7FF]',
|
||||||
|
badgeBg: 'bg-[#00D7FF]/15 text-[#00D7FF] border-[#00D7FF]/30',
|
||||||
|
glow: 'group-hover:shadow-[0_0_35px_rgba(0,215,255,0.25)]',
|
||||||
|
borderHover: 'group-hover:border-[#00D7FF]/60'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: 'why-memes',
|
||||||
|
title: 'MEMES',
|
||||||
|
tag: 'Pure Energy',
|
||||||
|
description: 'Internet culture meets BirthdayMessaging energy.',
|
||||||
|
points: ['Viral crypto culture', 'Continuous meme contests', 'Unbox the Alpha every day'],
|
||||||
|
image: giftBoxImg,
|
||||||
|
icon: Sparkles,
|
||||||
|
accentColor: 'text-[#FF8C32]',
|
||||||
|
badgeBg: 'bg-[#FF8C32]/15 text-[#FF8C32] border-[#FF8C32]/30',
|
||||||
|
glow: 'group-hover:shadow-[0_0_35px_rgba(255,140,50,0.3)]',
|
||||||
|
borderHover: 'group-hover:border-[#FF8C32]/60'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: 'why-solana',
|
||||||
|
title: 'ON SOLANA',
|
||||||
|
tag: 'Lightning Chain',
|
||||||
|
description: 'Fast, low-cost transactions powered by the Solana ecosystem.',
|
||||||
|
points: ['Sub-cent transaction fees', '400ms block confirmations', 'Instant Raydium & Jupiter liquidity'],
|
||||||
|
image: cakeImg,
|
||||||
|
icon: Zap,
|
||||||
|
accentColor: 'text-[#00D7FF]',
|
||||||
|
badgeBg: 'bg-white/10 text-white border-white/20',
|
||||||
|
glow: 'group-hover:shadow-[0_0_35px_rgba(0,215,255,0.25)]',
|
||||||
|
borderHover: 'group-hover:border-[#00D7FF]/60'
|
||||||
|
}
|
||||||
|
];
|
||||||
|
|
||||||
|
return (
|
||||||
|
<section id="why-bm-alpha" className="py-24 relative overflow-hidden bg-transparent">
|
||||||
|
{/* Subtle background divider light */}
|
||||||
|
<div className="absolute top-0 inset-x-0 h-px bg-gradient-to-r from-transparent via-white/10 to-transparent" />
|
||||||
|
<div className="absolute bottom-0 inset-x-0 h-px bg-gradient-to-r from-transparent via-white/10 to-transparent" />
|
||||||
|
|
||||||
|
<div className="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
|
||||||
|
|
||||||
|
{/* Section Header */}
|
||||||
|
<div className="text-center max-w-3xl mx-auto mb-16">
|
||||||
|
<div className="inline-flex items-center gap-2 px-3.5 py-1.5 rounded-full bg-white dark:bg-white/5 border border-slate-200 dark:border-white/10 text-xs font-bold text-[#FF8C32] mb-4 shadow-sm">
|
||||||
|
<Gift className="w-3.5 h-3.5 text-[#FF8C32]" />
|
||||||
|
THE CONCEPT
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<h2
|
||||||
|
id="why-bm-alpha-heading"
|
||||||
|
className="font-display text-4xl sm:text-5xl font-black text-slate-900 dark:text-white tracking-tight"
|
||||||
|
>
|
||||||
|
WHY <span className="text-gradient-brand">BM ALPHA?</span>
|
||||||
|
</h2>
|
||||||
|
|
||||||
|
<p
|
||||||
|
id="why-bm-alpha-copy"
|
||||||
|
className="mt-5 text-lg sm:text-xl text-slate-700 dark:text-gray-300 font-semibold leading-relaxed"
|
||||||
|
>
|
||||||
|
BM Alpha is more than a meme. It's the community's front door into the next chapter of{' '}
|
||||||
|
<span className="text-[#00A6DB] dark:text-[#00D7FF] font-bold">BirthdayMessaging</span>.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{/* 3 Main Feature Cards */}
|
||||||
|
<div className="grid grid-cols-1 md:grid-cols-3 gap-8">
|
||||||
|
{cards.map((card) => {
|
||||||
|
const Icon = card.icon;
|
||||||
|
return (
|
||||||
|
<div
|
||||||
|
key={card.id}
|
||||||
|
id={card.id}
|
||||||
|
className={`group relative flex flex-col rounded-2xl bg-white/90 dark:bg-[#161b2b]/90 border border-slate-200 dark:border-white/10 overflow-hidden transition-all duration-500 ${card.borderHover} ${card.glow} hover:-translate-y-1.5 backdrop-blur-xl shadow-md dark:shadow-lg`}
|
||||||
|
>
|
||||||
|
{/* Artwork Graphic Container */}
|
||||||
|
<div className="relative h-64 sm:h-72 w-full overflow-hidden bg-slate-900/10 dark:bg-black/50">
|
||||||
|
<img
|
||||||
|
src={card.image}
|
||||||
|
alt={card.title}
|
||||||
|
className="w-full h-full object-cover object-center group-hover:scale-105 transition-transform duration-700 opacity-90 group-hover:opacity-100"
|
||||||
|
/>
|
||||||
|
<div className="absolute inset-0 bg-gradient-to-t from-white/95 via-white/40 dark:from-[#161b2b] dark:via-[#161b2b]/30 to-transparent" />
|
||||||
|
|
||||||
|
{/* Floating Tag Badge */}
|
||||||
|
<div className="absolute top-4 right-4">
|
||||||
|
<span className={`text-[10px] font-extrabold px-3 py-1 rounded-full border backdrop-blur-md ${card.badgeBg} uppercase tracking-wider`}>
|
||||||
|
{card.tag}
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{/* Icon Emblem */}
|
||||||
|
<div className="absolute bottom-4 left-6 w-12 h-12 rounded-2xl bg-white/95 dark:bg-[#0a0c14]/95 border border-slate-200 dark:border-white/10 p-2.5 flex items-center justify-center shadow-lg">
|
||||||
|
<Icon className={`w-6 h-6 ${card.accentColor}`} />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{/* Card Content Body */}
|
||||||
|
<div className="p-6 sm:p-7 flex-1 flex flex-col justify-between">
|
||||||
|
<div>
|
||||||
|
<h3 className="font-display font-black text-2xl text-slate-900 dark:text-white tracking-tight group-hover:text-[#FF8C32] transition-colors">
|
||||||
|
{card.title}
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<p className="mt-3 text-sm sm:text-base text-slate-600 dark:text-gray-300 leading-relaxed font-medium">
|
||||||
|
{card.description}
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{/* Feature Highlights */}
|
||||||
|
<div className="mt-6 pt-5 border-t border-slate-200 dark:border-white/5 space-y-2">
|
||||||
|
{card.points.map((point, idx) => (
|
||||||
|
<div key={idx} className="flex items-center gap-2 text-xs font-medium text-slate-600 dark:text-gray-400">
|
||||||
|
<div className="w-1.5 h-1.5 rounded-full bg-[#FF8C32]" />
|
||||||
|
<span>{point}</span>
|
||||||
|
</div>
|
||||||
|
))}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
})}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{/* Supporting BirthdayMessaging Ecosystem Callout */}
|
||||||
|
<div className="mt-12 p-6 sm:p-8 rounded-2xl bg-white/90 dark:bg-[#161b2b]/90 border border-slate-200 dark:border-white/10 flex flex-col sm:flex-row items-center justify-between gap-6 backdrop-blur-xl shadow-md dark:shadow-lg">
|
||||||
|
<div className="flex items-center gap-4">
|
||||||
|
<div className="w-12 h-12 rounded-2xl bg-[#FF8C32]/15 border border-[#FF8C32]/30 flex items-center justify-center shrink-0">
|
||||||
|
<Heart className="w-6 h-6 text-[#FF8C32]" />
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<h4 className="font-display font-bold text-slate-900 dark:text-white text-base sm:text-lg">
|
||||||
|
The BirthdayMessaging Ecosystem
|
||||||
|
</h4>
|
||||||
|
<p className="text-slate-600 dark:text-gray-400 text-xs sm:text-sm mt-0.5 font-medium">
|
||||||
|
Connecting millions celebrating birthdays globally through joyful Web3 utility and viral culture.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<a
|
||||||
|
href="#token"
|
||||||
|
className="shrink-0 px-5 py-2.5 rounded-full text-xs font-bold font-display text-slate-800 dark:text-white bg-slate-100 hover:bg-[#FF8C32] dark:bg-white/10 dark:hover:bg-[#FF8C32] hover:text-black dark:hover:text-black border border-slate-300 dark:border-white/10 transition-colors"
|
||||||
|
>
|
||||||
|
VIEW TOKENOMICS
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
);
|
||||||
|
};
|
||||||
+184
@@ -0,0 +1,184 @@
|
|||||||
|
/**
|
||||||
|
* BM Alpha Meme Coin Configuration
|
||||||
|
* Centralized configurable constants for links, launch time, token info, and community endpoints.
|
||||||
|
*/
|
||||||
|
|
||||||
|
// Official Launch Date (Configurable in one single place)
|
||||||
|
// Target: August 24, 2026 UTC
|
||||||
|
export const LAUNCH_DATE = "2026-08-24T12:00:00Z";
|
||||||
|
|
||||||
|
// Token Contract Address (Easily replaced once live on Solana mainnet)
|
||||||
|
export const CONTRACT_ADDRESS = "COMING SOON";
|
||||||
|
|
||||||
|
// Social & Community Links (Replace placeholders with live URLs)
|
||||||
|
export const YOUR_DISCORD_URL = "https://discord.gg/U7MUMrBas";
|
||||||
|
export const YOUR_TELEGRAM_URL = YOUR_DISCORD_URL;
|
||||||
|
export const YOUR_WHATSAPP_URL = "https://chat.whatsapp.com/LBsTvHFSZOPJ7e3ru1Covq";
|
||||||
|
export const YOUR_X_URL = "https://x.com/TheBMBlueprint";
|
||||||
|
export const YOUR_YOUTUBE_URL = "https://www.youtube.com/@birthdaymessaging";
|
||||||
|
export const YOUR_BUY_LINK = "#how-to-buy";
|
||||||
|
|
||||||
|
// Token Information
|
||||||
|
export const TOKENOMICS_VERSION = "v 1.1";
|
||||||
|
|
||||||
|
export const TOKEN_INFO = {
|
||||||
|
name: "BM Alpha",
|
||||||
|
ticker: "BMALPHA",
|
||||||
|
network: "Solana",
|
||||||
|
launchDateString: "August 24, 2026",
|
||||||
|
totalSupply: "10,000,000,000 BMALPHA",
|
||||||
|
totalSupplyNumber: 10000000000,
|
||||||
|
buySellTax: "0% / 0%",
|
||||||
|
liquidity: "100% Locked at Launch",
|
||||||
|
ecosystem: "BirthdayMessaging (BM)"
|
||||||
|
};
|
||||||
|
|
||||||
|
// Proposed Token Distribution & Purpose of Each Allocation
|
||||||
|
export const TOKEN_DISTRIBUTION = [
|
||||||
|
{
|
||||||
|
id: "community-public",
|
||||||
|
category: "Community & Public",
|
||||||
|
percentage: 40,
|
||||||
|
amount: "4,000,000,000",
|
||||||
|
shortAmount: "4B tokens",
|
||||||
|
rawAmount: 4000000000,
|
||||||
|
color: "#FF8C32", // Tangerine Brand
|
||||||
|
bgClass: "bg-[#FF8C32]",
|
||||||
|
textClass: "text-[#FF8C32]",
|
||||||
|
borderClass: "border-[#FF8C32]/40",
|
||||||
|
badgeClass: "bg-[#FF8C32]/15 text-[#FF8C32] border-[#FF8C32]/30",
|
||||||
|
purpose: "Public distribution and community growth.",
|
||||||
|
iconName: "Users"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: "liquidity",
|
||||||
|
category: "Liquidity",
|
||||||
|
percentage: 25,
|
||||||
|
amount: "2,500,000,000",
|
||||||
|
shortAmount: "2.5B tokens",
|
||||||
|
rawAmount: 2500000000,
|
||||||
|
color: "#00D7FF", // Cyan Accent
|
||||||
|
bgClass: "bg-[#00D7FF]",
|
||||||
|
textClass: "text-[#00D7FF]",
|
||||||
|
borderClass: "border-[#00D7FF]/40",
|
||||||
|
badgeClass: "bg-[#00D7FF]/15 text-[#00D7FF] border-[#00D7FF]/30",
|
||||||
|
purpose: "Support trading liquidity on Solana-based decentralized exchanges.",
|
||||||
|
iconName: "Award"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: "marketing",
|
||||||
|
category: "Marketing",
|
||||||
|
percentage: 15,
|
||||||
|
amount: "1,500,000,000",
|
||||||
|
shortAmount: "1.5B tokens",
|
||||||
|
rawAmount: 1500000000,
|
||||||
|
color: "#FFA843", // Warm Gold
|
||||||
|
bgClass: "bg-[#FFA843]",
|
||||||
|
textClass: "text-[#FFA843]",
|
||||||
|
borderClass: "border-[#FFA843]/40",
|
||||||
|
badgeClass: "bg-[#FFA843]/15 text-[#FFA843] border-[#FFA843]/30",
|
||||||
|
purpose: "Promotions, content, campaigns and partnerships.",
|
||||||
|
iconName: "Flame"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: "rewards-ecosystem",
|
||||||
|
category: "Rewards & Ecosystem",
|
||||||
|
percentage: 10,
|
||||||
|
amount: "1,000,000,000",
|
||||||
|
shortAmount: "1B tokens",
|
||||||
|
rawAmount: 1000000000,
|
||||||
|
color: "#10B981", // Emerald
|
||||||
|
bgClass: "bg-emerald-500",
|
||||||
|
textClass: "text-emerald-500 dark:text-emerald-400",
|
||||||
|
borderClass: "border-emerald-500/40",
|
||||||
|
badgeClass: "bg-emerald-500/15 text-emerald-500 dark:text-emerald-400 border-emerald-500/30",
|
||||||
|
purpose: "Contests, community incentives and ecosystem activities.",
|
||||||
|
iconName: "Gift"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: "team",
|
||||||
|
category: "Team",
|
||||||
|
percentage: 5,
|
||||||
|
amount: "500,000,000",
|
||||||
|
shortAmount: "500M tokens",
|
||||||
|
rawAmount: 500000000,
|
||||||
|
color: "#8B5CF6", // Purple
|
||||||
|
bgClass: "bg-purple-500",
|
||||||
|
textClass: "text-purple-500 dark:text-purple-400",
|
||||||
|
borderClass: "border-purple-500/40",
|
||||||
|
badgeClass: "bg-purple-500/15 text-purple-500 dark:text-purple-400 border-purple-500/30",
|
||||||
|
purpose: "Allocation for contributors developing and maintaining the project.",
|
||||||
|
iconName: "ShieldCheck"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: "treasury",
|
||||||
|
category: "Treasury",
|
||||||
|
percentage: 5,
|
||||||
|
amount: "500,000,000",
|
||||||
|
shortAmount: "500M tokens",
|
||||||
|
rawAmount: 500000000,
|
||||||
|
color: "#EC4899", // Pink
|
||||||
|
bgClass: "bg-pink-500",
|
||||||
|
textClass: "text-pink-500 dark:text-pink-400",
|
||||||
|
borderClass: "border-pink-500/40",
|
||||||
|
badgeClass: "bg-pink-500/15 text-pink-500 dark:text-pink-400 border-pink-500/30",
|
||||||
|
purpose: "Future project expenses and strategic initiatives.",
|
||||||
|
iconName: "Layers"
|
||||||
|
}
|
||||||
|
];
|
||||||
|
|
||||||
|
// Features data for "Why BM Alpha?"
|
||||||
|
export const WHY_BM_ALPHA = [
|
||||||
|
{
|
||||||
|
id: "community",
|
||||||
|
title: "COMMUNITY",
|
||||||
|
badge: "100% Community-Driven",
|
||||||
|
description: "Built around a growing community that wants to participate, share, and have fun.",
|
||||||
|
highlight: "Global celebration network",
|
||||||
|
iconName: "Users"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: "memes",
|
||||||
|
title: "MEMES",
|
||||||
|
badge: "Viral Culture",
|
||||||
|
description: "Internet culture meets BirthdayMessaging energy.",
|
||||||
|
highlight: "Unstoppable momentum",
|
||||||
|
iconName: "Sparkles"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: "solana",
|
||||||
|
title: "ON SOLANA",
|
||||||
|
badge: "Ultra Fast & Cheap",
|
||||||
|
description: "Fast, low-cost transactions powered by the Solana ecosystem.",
|
||||||
|
highlight: "Sub-second finality & low fees",
|
||||||
|
iconName: "Zap"
|
||||||
|
}
|
||||||
|
];
|
||||||
|
|
||||||
|
// Step by Step guide for How to Buy
|
||||||
|
export const HOW_TO_BUY_STEPS = [
|
||||||
|
{
|
||||||
|
step: "01",
|
||||||
|
title: "GET A SOLANA WALLET",
|
||||||
|
description: "Install a compatible Solana wallet such as Phantom or Solflare on mobile or browser extension.",
|
||||||
|
tip: "Download only from official phantom.app or solflare.com stores."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
step: "02",
|
||||||
|
title: "FUND YOUR WALLET",
|
||||||
|
description: "Add SOL to your wallet for the purchase and transaction fees from Coinbase, Binance, or Kraken.",
|
||||||
|
tip: "Keep a small fraction of SOL (0.02 SOL) for Solana network gas."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
step: "03",
|
||||||
|
title: "CONNECT",
|
||||||
|
description: "Connect your wallet to the official BM Alpha purchase interface (e.g. Raydium or Jupiter).",
|
||||||
|
tip: "Verify the contract address matches the official BM Alpha address."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
step: "04",
|
||||||
|
title: "BUY BM ALPHA",
|
||||||
|
description: "Enter the amount of SOL you want to swap for BM Alpha and confirm the transaction in your wallet.",
|
||||||
|
tip: "Set slippage tolerance to 0.5% - 1% for instant swap execution."
|
||||||
|
}
|
||||||
|
];
|
||||||
@@ -0,0 +1,60 @@
|
|||||||
|
import React, { createContext, useContext, useEffect, useState } from 'react';
|
||||||
|
|
||||||
|
export type ThemeMode = 'dark' | 'light';
|
||||||
|
|
||||||
|
interface ThemeContextType {
|
||||||
|
theme: ThemeMode;
|
||||||
|
setTheme: (theme: ThemeMode) => void;
|
||||||
|
toggleTheme: () => void;
|
||||||
|
}
|
||||||
|
|
||||||
|
const ThemeContext = createContext<ThemeContextType | undefined>(undefined);
|
||||||
|
|
||||||
|
export const ThemeProvider: React.FC<{ children: React.ReactNode }> = ({ children }) => {
|
||||||
|
const [theme, setThemeState] = useState<ThemeMode>(() => {
|
||||||
|
if (typeof window !== 'undefined') {
|
||||||
|
const savedTheme = localStorage.getItem('bmalpha_theme') as ThemeMode | null;
|
||||||
|
if (savedTheme === 'light' || savedTheme === 'dark') {
|
||||||
|
return savedTheme;
|
||||||
|
}
|
||||||
|
if (window.matchMedia && window.matchMedia('(prefers-color-scheme: light)').matches) {
|
||||||
|
return 'light';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 'dark';
|
||||||
|
});
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
const root = document.documentElement;
|
||||||
|
if (theme === 'dark') {
|
||||||
|
root.classList.add('dark');
|
||||||
|
root.classList.remove('light');
|
||||||
|
} else {
|
||||||
|
root.classList.add('light');
|
||||||
|
root.classList.remove('dark');
|
||||||
|
}
|
||||||
|
localStorage.setItem('bmalpha_theme', theme);
|
||||||
|
}, [theme]);
|
||||||
|
|
||||||
|
const setTheme = (newTheme: ThemeMode) => {
|
||||||
|
setThemeState(newTheme);
|
||||||
|
};
|
||||||
|
|
||||||
|
const toggleTheme = () => {
|
||||||
|
setThemeState((prev) => (prev === 'dark' ? 'light' : 'dark'));
|
||||||
|
};
|
||||||
|
|
||||||
|
return (
|
||||||
|
<ThemeContext.Provider value={{ theme, setTheme, toggleTheme }}>
|
||||||
|
{children}
|
||||||
|
</ThemeContext.Provider>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export const useTheme = () => {
|
||||||
|
const context = useContext(ThemeContext);
|
||||||
|
if (!context) {
|
||||||
|
throw new Error('useTheme must be used within a ThemeProvider');
|
||||||
|
}
|
||||||
|
return context;
|
||||||
|
};
|
||||||
+103
@@ -0,0 +1,103 @@
|
|||||||
|
@import "tailwindcss";
|
||||||
|
|
||||||
|
@custom-variant dark (&:where(.dark, .dark *));
|
||||||
|
|
||||||
|
@layer base {
|
||||||
|
:root {
|
||||||
|
--brand-tangerine: #FF8C32;
|
||||||
|
--brand-tangerine-hover: #E6761D;
|
||||||
|
--brand-tangerine-glow: rgba(255, 140, 50, 0.4);
|
||||||
|
--brand-sky: #00D7FF;
|
||||||
|
--brand-sky-hover: #00BCE0;
|
||||||
|
--brand-sky-glow: rgba(0, 215, 255, 0.35);
|
||||||
|
}
|
||||||
|
|
||||||
|
body {
|
||||||
|
transition: background-color 0.3s ease, color 0.3s ease;
|
||||||
|
font-family: 'Plus Jakarta Sans', system-ui, -apple-system, sans-serif;
|
||||||
|
}
|
||||||
|
|
||||||
|
.dark body {
|
||||||
|
background-color: #0a0c14;
|
||||||
|
color: #F1F5F9;
|
||||||
|
}
|
||||||
|
|
||||||
|
.light body {
|
||||||
|
background-color: #f8fafc;
|
||||||
|
color: #0f172a;
|
||||||
|
}
|
||||||
|
|
||||||
|
h1, h2, h3, .font-display {
|
||||||
|
font-family: 'Space Grotesk', 'Plus Jakarta Sans', sans-serif;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Immersive UI Glowing effects */
|
||||||
|
.glow-tangerine {
|
||||||
|
box-shadow: 0 0 35px -5px rgba(255, 140, 50, 0.45);
|
||||||
|
}
|
||||||
|
|
||||||
|
.glow-sky {
|
||||||
|
box-shadow: 0 0 35px -5px rgba(0, 215, 255, 0.4);
|
||||||
|
}
|
||||||
|
|
||||||
|
.glow-combo {
|
||||||
|
box-shadow: -10px -10px 40px -10px rgba(255, 140, 50, 0.3),
|
||||||
|
10px 10px 40px -10px rgba(0, 215, 255, 0.3);
|
||||||
|
}
|
||||||
|
|
||||||
|
.text-gradient-brand {
|
||||||
|
background: linear-gradient(135deg, #FF8C32 0%, #FFA843 35%, #00D7FF 100%);
|
||||||
|
-webkit-background-clip: text;
|
||||||
|
-webkit-text-fill-color: transparent;
|
||||||
|
}
|
||||||
|
|
||||||
|
.text-gradient-tangerine {
|
||||||
|
background: linear-gradient(135deg, #FFFFFF 20%, #FFA256 70%, #FF8C32 100%);
|
||||||
|
-webkit-background-clip: text;
|
||||||
|
-webkit-text-fill-color: transparent;
|
||||||
|
}
|
||||||
|
|
||||||
|
.text-gradient-sky {
|
||||||
|
background: linear-gradient(135deg, #FFFFFF 30%, #38E1FF 80%, #00D7FF 100%);
|
||||||
|
-webkit-background-clip: text;
|
||||||
|
-webkit-text-fill-color: transparent;
|
||||||
|
}
|
||||||
|
|
||||||
|
.bg-gradient-brand-cta {
|
||||||
|
background: linear-gradient(135deg, #FF8C32 0%, #FFA048 40%, #00D7FF 100%);
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes spin-slow {
|
||||||
|
from { transform: rotate(0deg); }
|
||||||
|
to { transform: rotate(360deg); }
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes spin-slow-reverse {
|
||||||
|
from { transform: rotate(360deg); }
|
||||||
|
to { transform: rotate(0deg); }
|
||||||
|
}
|
||||||
|
|
||||||
|
.animate-spin-slow {
|
||||||
|
animation: spin-slow 20s linear infinite;
|
||||||
|
}
|
||||||
|
|
||||||
|
.animate-spin-slow-reverse {
|
||||||
|
animation: spin-slow-reverse 25s linear infinite;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Custom Scrollbar */
|
||||||
|
::-webkit-scrollbar {
|
||||||
|
width: 8px;
|
||||||
|
}
|
||||||
|
::-webkit-scrollbar-track {
|
||||||
|
background: #0a0c14;
|
||||||
|
}
|
||||||
|
::-webkit-scrollbar-thumb {
|
||||||
|
background: #161b2b;
|
||||||
|
border-radius: 4px;
|
||||||
|
}
|
||||||
|
::-webkit-scrollbar-thumb:hover {
|
||||||
|
background: #FF8C32;
|
||||||
|
}
|
||||||
|
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
import {StrictMode} from 'react';
|
||||||
|
import {createRoot} from 'react-dom/client';
|
||||||
|
import App from './App.tsx';
|
||||||
|
import './index.css';
|
||||||
|
|
||||||
|
createRoot(document.getElementById('root')!).render(
|
||||||
|
<StrictMode>
|
||||||
|
<App />
|
||||||
|
</StrictMode>,
|
||||||
|
);
|
||||||
@@ -0,0 +1,32 @@
|
|||||||
|
import confetti from 'canvas-confetti';
|
||||||
|
|
||||||
|
export const triggerBirthdayConfetti = () => {
|
||||||
|
// Immersive UI Tangerine & Sky Blue themed confetti burst
|
||||||
|
const brandColors = ['#FF8C32', '#00D7FF', '#FFFFFF', '#FFA843', '#38E1FF'];
|
||||||
|
|
||||||
|
confetti({
|
||||||
|
particleCount: 80,
|
||||||
|
spread: 70,
|
||||||
|
origin: { y: 0.6 },
|
||||||
|
colors: brandColors,
|
||||||
|
disableForReducedMotion: true
|
||||||
|
});
|
||||||
|
|
||||||
|
// Secondary side bursts for high energy
|
||||||
|
setTimeout(() => {
|
||||||
|
confetti({
|
||||||
|
particleCount: 50,
|
||||||
|
angle: 60,
|
||||||
|
spread: 55,
|
||||||
|
origin: { x: 0 },
|
||||||
|
colors: brandColors
|
||||||
|
});
|
||||||
|
confetti({
|
||||||
|
particleCount: 50,
|
||||||
|
angle: 120,
|
||||||
|
spread: 55,
|
||||||
|
origin: { x: 1 },
|
||||||
|
colors: brandColors
|
||||||
|
});
|
||||||
|
}, 150);
|
||||||
|
};
|
||||||
Vendored
+21
@@ -0,0 +1,21 @@
|
|||||||
|
/// <reference types="vite/client" />
|
||||||
|
|
||||||
|
declare module "*.jpg" {
|
||||||
|
const src: string;
|
||||||
|
export default src;
|
||||||
|
}
|
||||||
|
|
||||||
|
declare module "*.png" {
|
||||||
|
const src: string;
|
||||||
|
export default src;
|
||||||
|
}
|
||||||
|
|
||||||
|
declare module "*.webp" {
|
||||||
|
const src: string;
|
||||||
|
export default src;
|
||||||
|
}
|
||||||
|
|
||||||
|
declare module "*.svg" {
|
||||||
|
const src: string;
|
||||||
|
export default src;
|
||||||
|
}
|
||||||
@@ -0,0 +1,26 @@
|
|||||||
|
{
|
||||||
|
"compilerOptions": {
|
||||||
|
"target": "ES2022",
|
||||||
|
"experimentalDecorators": true,
|
||||||
|
"useDefineForClassFields": false,
|
||||||
|
"module": "ESNext",
|
||||||
|
"lib": [
|
||||||
|
"ES2022",
|
||||||
|
"DOM",
|
||||||
|
"DOM.Iterable"
|
||||||
|
],
|
||||||
|
"skipLibCheck": true,
|
||||||
|
"moduleResolution": "bundler",
|
||||||
|
"isolatedModules": true,
|
||||||
|
"moduleDetection": "force",
|
||||||
|
"allowJs": true,
|
||||||
|
"jsx": "react-jsx",
|
||||||
|
"paths": {
|
||||||
|
"@/*": [
|
||||||
|
"./*"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"allowImportingTsExtensions": true,
|
||||||
|
"noEmit": true
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,22 @@
|
|||||||
|
import tailwindcss from '@tailwindcss/vite';
|
||||||
|
import react from '@vitejs/plugin-react';
|
||||||
|
import path from 'path';
|
||||||
|
import {defineConfig} from 'vite';
|
||||||
|
|
||||||
|
export default defineConfig(() => {
|
||||||
|
return {
|
||||||
|
plugins: [react(), tailwindcss()],
|
||||||
|
resolve: {
|
||||||
|
alias: {
|
||||||
|
'@': path.resolve(__dirname, '.'),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
server: {
|
||||||
|
// HMR is disabled in AI Studio via DISABLE_HMR env var.
|
||||||
|
// Do not modifyâfile watching is disabled to prevent flickering during agent edits.
|
||||||
|
hmr: process.env.DISABLE_HMR !== 'true',
|
||||||
|
// Disable file watching when DISABLE_HMR is true to save CPU during agent edits.
|
||||||
|
watch: process.env.DISABLE_HMR === 'true' ? null : {},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
});
|
||||||
Reference in New Issue
Block a user