Initial Commit - BlackRoad Pitstop Secure Portal 🔐
BlackRoad OS, Inc. - Secure authentication gateway Features: 🔐 Login system with session management 📊 Dashboard with file access to all metaverse systems 🎨 Beautiful glass morphism UI ⚡ 24-hour session duration 🌌 Access to 18 BlackRoad OS systems 📁 32 files accessible after login Files: - index.html: Beautiful login page with animated starfield - dashboard.html: Protected file dashboard with stats - README.md: Complete documentation - wrangler.toml: Cloudflare Pages configuration - package.json: Project metadata - .gitignore: Git ignore rules Default credentials (change before production): - Username: alexa / Password: blackroad2025 - Username: admin / Password: blackroad2025 Ready to deploy to pitstop.blackroad.io © 2025 BlackRoad OS, Inc. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
38
.gitignore
vendored
Normal file
38
.gitignore
vendored
Normal file
@@ -0,0 +1,38 @@
|
|||||||
|
# Dependencies
|
||||||
|
node_modules/
|
||||||
|
.pnpm-store/
|
||||||
|
|
||||||
|
# Build outputs
|
||||||
|
dist/
|
||||||
|
build/
|
||||||
|
.output/
|
||||||
|
|
||||||
|
# Environment variables
|
||||||
|
.env
|
||||||
|
.env.local
|
||||||
|
.env.production
|
||||||
|
|
||||||
|
# Wrangler
|
||||||
|
.wrangler/
|
||||||
|
wrangler-state/
|
||||||
|
|
||||||
|
# OS files
|
||||||
|
.DS_Store
|
||||||
|
Thumbs.db
|
||||||
|
|
||||||
|
# Editor
|
||||||
|
.vscode/
|
||||||
|
.idea/
|
||||||
|
*.swp
|
||||||
|
*.swo
|
||||||
|
*~
|
||||||
|
|
||||||
|
# Logs
|
||||||
|
*.log
|
||||||
|
npm-debug.log*
|
||||||
|
yarn-debug.log*
|
||||||
|
yarn-error.log*
|
||||||
|
|
||||||
|
# Temporary files
|
||||||
|
.tmp/
|
||||||
|
tmp/
|
||||||
152
README.md
Normal file
152
README.md
Normal file
@@ -0,0 +1,152 @@
|
|||||||
|
# 🔐 BlackRoad Pitstop
|
||||||
|
|
||||||
|
**Secure Authentication Portal for BlackRoad OS Systems**
|
||||||
|
|
||||||
|
**Live:** https://pitstop.blackroad.io (pending setup)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🎯 What is Pitstop?
|
||||||
|
|
||||||
|
Pitstop is the **secure gateway** to all BlackRoad OS metaverse files and systems. It provides:
|
||||||
|
|
||||||
|
- 🔐 **Authentication** - Login required to access any files
|
||||||
|
- 📁 **File Management** - Browse and access all metaverse files
|
||||||
|
- 🌌 **System Access** - Launch universe, view code, read docs
|
||||||
|
- 👤 **Session Management** - Secure 24-hour sessions
|
||||||
|
- 🎨 **Beautiful UI** - Modern glass morphism design
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🚀 Features
|
||||||
|
|
||||||
|
### Authentication System
|
||||||
|
- Username/password login
|
||||||
|
- Session management (24-hour expiry)
|
||||||
|
- Secure logout
|
||||||
|
- Auto-redirect on session expiry
|
||||||
|
|
||||||
|
### Dashboard
|
||||||
|
- **File Grid** - Visual cards for all metaverse files
|
||||||
|
- **Stats Overview** - Total files, systems, code lines, deployments
|
||||||
|
- **Quick Access** - One-click to open any file
|
||||||
|
- **Live Badges** - Shows file status (LIVE, SYSTEM, DOCS, etc.)
|
||||||
|
|
||||||
|
### Security
|
||||||
|
- Client-side session storage
|
||||||
|
- No backend required (static hosting)
|
||||||
|
- Protected file access
|
||||||
|
- Automatic session validation
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🔑 Default Credentials
|
||||||
|
|
||||||
|
For demo/testing purposes:
|
||||||
|
|
||||||
|
```
|
||||||
|
Username: alexa
|
||||||
|
Password: blackroad2025
|
||||||
|
|
||||||
|
Username: admin
|
||||||
|
Password: blackroad2025
|
||||||
|
```
|
||||||
|
|
||||||
|
**⚠️ IMPORTANT:** Change these credentials in `index.html` before production deployment!
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📁 File Structure
|
||||||
|
|
||||||
|
```
|
||||||
|
blackroad-pitstop/
|
||||||
|
├── index.html # Login page with authentication
|
||||||
|
├── dashboard.html # File dashboard (protected)
|
||||||
|
├── wrangler.toml # Cloudflare Pages config
|
||||||
|
├── package.json # Project metadata
|
||||||
|
├── README.md # This file
|
||||||
|
└── .gitignore # Git ignore rules
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🛠️ Setup & Deployment
|
||||||
|
|
||||||
|
### Deploy to Cloudflare Pages
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd /Users/alexa/blackroad-pitstop
|
||||||
|
wrangler pages deploy . --project-name=blackroad-pitstop
|
||||||
|
```
|
||||||
|
|
||||||
|
### Custom Domain Setup
|
||||||
|
|
||||||
|
1. Go to Cloudflare Dashboard → Pages → blackroad-pitstop
|
||||||
|
2. Click "Custom domains" → "Set up a custom domain"
|
||||||
|
3. Enter: `pitstop.blackroad.io`
|
||||||
|
4. DNS auto-configured by Cloudflare
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🔐 Security Configuration
|
||||||
|
|
||||||
|
### Changing Login Credentials
|
||||||
|
|
||||||
|
Edit `index.html` around line 250:
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
const VALID_CREDENTIALS = {
|
||||||
|
'yourusername': 'yourpassword',
|
||||||
|
'admin': 'strongpassword123'
|
||||||
|
};
|
||||||
|
```
|
||||||
|
|
||||||
|
### Session Duration
|
||||||
|
|
||||||
|
Edit `index.html` around line 257:
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
const SESSION_DURATION = 24 * 60 * 60 * 1000; // 24 hours
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🌐 Integration with Metaverse
|
||||||
|
|
||||||
|
All BlackRoad OS systems accessible through authenticated dashboard:
|
||||||
|
|
||||||
|
- universe.blackroad.io - Complete metaverse
|
||||||
|
- earth.blackroad.io - Earth simulation
|
||||||
|
- app.blackroad.io - Main application
|
||||||
|
- api.blackroad.io - Backend API
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📊 Statistics
|
||||||
|
|
||||||
|
- **Total Files:** 32
|
||||||
|
- **Systems:** 18
|
||||||
|
- **Code Lines:** 14K+
|
||||||
|
- **Deployments:** 3
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📞 Support
|
||||||
|
|
||||||
|
**BlackRoad OS, Inc.**
|
||||||
|
- Email: blackroad.systems@gmail.com
|
||||||
|
- Primary: amundsonalexa@gmail.com
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📜 License
|
||||||
|
|
||||||
|
© 2025 BlackRoad OS, Inc. All rights reserved.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**Built with 💚 by BlackRoad OS, Inc.**
|
||||||
|
|
||||||
|
**December 22, 2025**
|
||||||
|
|
||||||
|
🔐 **SECURE ACCESS TO THE METAVERSE** 🔐
|
||||||
571
dashboard.html
Normal file
571
dashboard.html
Normal file
@@ -0,0 +1,571 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
|
<title>Pitstop Dashboard — BlackRoad</title>
|
||||||
|
|
||||||
|
<!-- Fonts -->
|
||||||
|
<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=Inter:wght@300;400;500;600;700;800;900&family=JetBrains+Mono:wght@400;500;600&display=swap" rel="stylesheet">
|
||||||
|
|
||||||
|
<style>
|
||||||
|
* {
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
box-sizing: border-box;
|
||||||
|
}
|
||||||
|
|
||||||
|
:root {
|
||||||
|
--bg-dark: #0a0a0a;
|
||||||
|
--bg-medium: #121212;
|
||||||
|
--bg-light: #1a1a1a;
|
||||||
|
--text-primary: #ffffff;
|
||||||
|
--text-secondary: #a0a0a0;
|
||||||
|
--accent-orange: #FF9D00;
|
||||||
|
--accent-red: #FF006B;
|
||||||
|
--accent-purple: #7700FF;
|
||||||
|
--accent-blue: #0066FF;
|
||||||
|
--accent-green: #27AE60;
|
||||||
|
--glass-bg: rgba(255, 255, 255, 0.05);
|
||||||
|
--glass-border: rgba(255, 255, 255, 0.1);
|
||||||
|
}
|
||||||
|
|
||||||
|
body {
|
||||||
|
font-family: 'Inter', sans-serif;
|
||||||
|
background: var(--bg-dark);
|
||||||
|
color: var(--text-primary);
|
||||||
|
overflow-x: hidden;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Header */
|
||||||
|
.header {
|
||||||
|
background: var(--bg-medium);
|
||||||
|
border-bottom: 1px solid var(--glass-border);
|
||||||
|
padding: 20px 40px;
|
||||||
|
display: flex;
|
||||||
|
justify-content: space-between;
|
||||||
|
align-items: center;
|
||||||
|
position: sticky;
|
||||||
|
top: 0;
|
||||||
|
z-index: 100;
|
||||||
|
backdrop-filter: blur(10px);
|
||||||
|
}
|
||||||
|
|
||||||
|
.header-left {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
gap: 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.logo {
|
||||||
|
font-size: 24px;
|
||||||
|
font-weight: 900;
|
||||||
|
background: linear-gradient(45deg, var(--accent-orange), var(--accent-red), var(--accent-purple));
|
||||||
|
-webkit-background-clip: text;
|
||||||
|
background-clip: text;
|
||||||
|
-webkit-text-fill-color: transparent;
|
||||||
|
}
|
||||||
|
|
||||||
|
.breadcrumb {
|
||||||
|
font-size: 14px;
|
||||||
|
color: var(--text-secondary);
|
||||||
|
font-family: 'JetBrains Mono', monospace;
|
||||||
|
}
|
||||||
|
|
||||||
|
.header-right {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
gap: 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.user-info {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
gap: 12px;
|
||||||
|
background: var(--glass-bg);
|
||||||
|
padding: 8px 16px;
|
||||||
|
border-radius: 8px;
|
||||||
|
border: 1px solid var(--glass-border);
|
||||||
|
}
|
||||||
|
|
||||||
|
.user-avatar {
|
||||||
|
width: 32px;
|
||||||
|
height: 32px;
|
||||||
|
border-radius: 50%;
|
||||||
|
background: linear-gradient(45deg, var(--accent-purple), var(--accent-blue));
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
font-weight: 700;
|
||||||
|
}
|
||||||
|
|
||||||
|
.user-name {
|
||||||
|
font-size: 14px;
|
||||||
|
font-weight: 500;
|
||||||
|
}
|
||||||
|
|
||||||
|
.logout-button {
|
||||||
|
background: rgba(231, 76, 60, 0.1);
|
||||||
|
border: 1px solid rgba(231, 76, 60, 0.3);
|
||||||
|
color: #E74C3C;
|
||||||
|
padding: 8px 16px;
|
||||||
|
border-radius: 8px;
|
||||||
|
font-size: 13px;
|
||||||
|
font-weight: 500;
|
||||||
|
cursor: pointer;
|
||||||
|
transition: all 0.2s ease;
|
||||||
|
}
|
||||||
|
|
||||||
|
.logout-button:hover {
|
||||||
|
background: rgba(231, 76, 60, 0.2);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Main Container */
|
||||||
|
.container {
|
||||||
|
max-width: 1400px;
|
||||||
|
margin: 0 auto;
|
||||||
|
padding: 40px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.page-title {
|
||||||
|
font-size: 32px;
|
||||||
|
font-weight: 700;
|
||||||
|
margin-bottom: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.page-subtitle {
|
||||||
|
font-size: 14px;
|
||||||
|
color: var(--text-secondary);
|
||||||
|
margin-bottom: 40px;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* File Grid */
|
||||||
|
.file-grid {
|
||||||
|
display: grid;
|
||||||
|
grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
|
||||||
|
gap: 20px;
|
||||||
|
margin-bottom: 40px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.file-card {
|
||||||
|
background: var(--bg-medium);
|
||||||
|
border: 1px solid var(--glass-border);
|
||||||
|
border-radius: 16px;
|
||||||
|
padding: 24px;
|
||||||
|
transition: all 0.3s ease;
|
||||||
|
cursor: pointer;
|
||||||
|
position: relative;
|
||||||
|
overflow: hidden;
|
||||||
|
}
|
||||||
|
|
||||||
|
.file-card:hover {
|
||||||
|
border-color: var(--accent-purple);
|
||||||
|
transform: translateY(-4px);
|
||||||
|
box-shadow: 0 10px 30px rgba(119, 0, 255, 0.2);
|
||||||
|
}
|
||||||
|
|
||||||
|
.file-card::before {
|
||||||
|
content: '';
|
||||||
|
position: absolute;
|
||||||
|
top: 0;
|
||||||
|
left: 0;
|
||||||
|
right: 0;
|
||||||
|
height: 4px;
|
||||||
|
background: linear-gradient(90deg, var(--accent-orange), var(--accent-red), var(--accent-purple));
|
||||||
|
opacity: 0;
|
||||||
|
transition: opacity 0.3s ease;
|
||||||
|
}
|
||||||
|
|
||||||
|
.file-card:hover::before {
|
||||||
|
opacity: 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
.file-icon {
|
||||||
|
font-size: 48px;
|
||||||
|
margin-bottom: 16px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.file-title {
|
||||||
|
font-size: 18px;
|
||||||
|
font-weight: 600;
|
||||||
|
margin-bottom: 8px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.file-description {
|
||||||
|
font-size: 13px;
|
||||||
|
color: var(--text-secondary);
|
||||||
|
margin-bottom: 16px;
|
||||||
|
line-height: 1.5;
|
||||||
|
}
|
||||||
|
|
||||||
|
.file-meta {
|
||||||
|
display: flex;
|
||||||
|
justify-content: space-between;
|
||||||
|
font-size: 11px;
|
||||||
|
color: var(--text-secondary);
|
||||||
|
font-family: 'JetBrains Mono', monospace;
|
||||||
|
}
|
||||||
|
|
||||||
|
.file-badge {
|
||||||
|
display: inline-block;
|
||||||
|
background: rgba(255, 157, 0, 0.1);
|
||||||
|
color: var(--accent-orange);
|
||||||
|
padding: 4px 8px;
|
||||||
|
border-radius: 4px;
|
||||||
|
font-size: 10px;
|
||||||
|
font-weight: 600;
|
||||||
|
text-transform: uppercase;
|
||||||
|
letter-spacing: 0.5px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.file-badge.live {
|
||||||
|
background: rgba(39, 174, 96, 0.1);
|
||||||
|
color: var(--accent-green);
|
||||||
|
}
|
||||||
|
|
||||||
|
.file-badge.protected {
|
||||||
|
background: rgba(231, 76, 60, 0.1);
|
||||||
|
color: #E74C3C;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Stats Section */
|
||||||
|
.stats-grid {
|
||||||
|
display: grid;
|
||||||
|
grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
|
||||||
|
gap: 20px;
|
||||||
|
margin-bottom: 40px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.stat-card {
|
||||||
|
background: var(--bg-medium);
|
||||||
|
border: 1px solid var(--glass-border);
|
||||||
|
border-radius: 12px;
|
||||||
|
padding: 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.stat-label {
|
||||||
|
font-size: 12px;
|
||||||
|
color: var(--text-secondary);
|
||||||
|
text-transform: uppercase;
|
||||||
|
letter-spacing: 1px;
|
||||||
|
margin-bottom: 8px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.stat-value {
|
||||||
|
font-size: 28px;
|
||||||
|
font-weight: 700;
|
||||||
|
color: var(--text-primary);
|
||||||
|
}
|
||||||
|
|
||||||
|
.stat-icon {
|
||||||
|
font-size: 24px;
|
||||||
|
margin-bottom: 8px;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<!-- Header -->
|
||||||
|
<div class="header">
|
||||||
|
<div class="header-left">
|
||||||
|
<div class="logo">PITSTOP</div>
|
||||||
|
<div class="breadcrumb">/ dashboard</div>
|
||||||
|
</div>
|
||||||
|
<div class="header-right">
|
||||||
|
<div class="user-info">
|
||||||
|
<div class="user-avatar" id="user-avatar">A</div>
|
||||||
|
<div class="user-name" id="user-name">Loading...</div>
|
||||||
|
</div>
|
||||||
|
<button class="logout-button" onclick="logout()">Logout</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Main Container -->
|
||||||
|
<div class="container">
|
||||||
|
<h1 class="page-title">Welcome to Pitstop</h1>
|
||||||
|
<p class="page-subtitle">Secure access to all BlackRoad OS systems and files</p>
|
||||||
|
|
||||||
|
<!-- Stats -->
|
||||||
|
<div class="stats-grid">
|
||||||
|
<div class="stat-card">
|
||||||
|
<div class="stat-icon">📁</div>
|
||||||
|
<div class="stat-label">Total Files</div>
|
||||||
|
<div class="stat-value">32</div>
|
||||||
|
</div>
|
||||||
|
<div class="stat-card">
|
||||||
|
<div class="stat-icon">🌌</div>
|
||||||
|
<div class="stat-label">Systems</div>
|
||||||
|
<div class="stat-value">18</div>
|
||||||
|
</div>
|
||||||
|
<div class="stat-card">
|
||||||
|
<div class="stat-icon">💻</div>
|
||||||
|
<div class="stat-label">Code Lines</div>
|
||||||
|
<div class="stat-value">14K+</div>
|
||||||
|
</div>
|
||||||
|
<div class="stat-card">
|
||||||
|
<div class="stat-icon">🚀</div>
|
||||||
|
<div class="stat-label">Deployments</div>
|
||||||
|
<div class="stat-value">3</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- File Grid -->
|
||||||
|
<div class="file-grid">
|
||||||
|
<!-- Metaverse Files -->
|
||||||
|
<div class="file-card" onclick="openFile('universe.html')">
|
||||||
|
<div class="file-icon">🌌</div>
|
||||||
|
<div class="file-title">Complete Universe</div>
|
||||||
|
<div class="file-description">Full integration of all 18 systems with beautiful UI</div>
|
||||||
|
<div class="file-meta">
|
||||||
|
<span class="file-badge live">LIVE</span>
|
||||||
|
<span>981 lines</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="file-card" onclick="openFile('index.html')">
|
||||||
|
<div class="file-icon">🎮</div>
|
||||||
|
<div class="file-title">Original Metaverse</div>
|
||||||
|
<div class="file-description">First version with core features</div>
|
||||||
|
<div class="file-meta">
|
||||||
|
<span class="file-badge live">LIVE</span>
|
||||||
|
<span>1,698 lines</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="file-card" onclick="openFile('module-loader.js')">
|
||||||
|
<div class="file-icon">🔗</div>
|
||||||
|
<div class="file-title">Module Loader</div>
|
||||||
|
<div class="file-description">Dynamic import system with dependency management</div>
|
||||||
|
<div class="file-meta">
|
||||||
|
<span class="file-badge">MODULE</span>
|
||||||
|
<span>287 lines</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- System Files -->
|
||||||
|
<div class="file-card" onclick="openFile('truth-contracts.js')">
|
||||||
|
<div class="file-icon">🔐</div>
|
||||||
|
<div class="file-title">Truth Contracts</div>
|
||||||
|
<div class="file-description">Time scales, reference frames, and verification</div>
|
||||||
|
<div class="file-meta">
|
||||||
|
<span class="file-badge">SYSTEM</span>
|
||||||
|
<span>382 lines</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="file-card" onclick="openFile('celestial-mechanics.js')">
|
||||||
|
<div class="file-icon">🪐</div>
|
||||||
|
<div class="file-title">Celestial Mechanics</div>
|
||||||
|
<div class="file-description">NASA-grade IAU 2000/2006 transformations</div>
|
||||||
|
<div class="file-meta">
|
||||||
|
<span class="file-badge">SYSTEM</span>
|
||||||
|
<span>500 lines</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="file-card" onclick="openFile('physics-engine.js')">
|
||||||
|
<div class="file-icon">⚡</div>
|
||||||
|
<div class="file-title">Physics Engine</div>
|
||||||
|
<div class="file-description">Rigid body dynamics and collision detection</div>
|
||||||
|
<div class="file-meta">
|
||||||
|
<span class="file-badge">SYSTEM</span>
|
||||||
|
<span>632 lines</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="file-card" onclick="openFile('living-nature.js')">
|
||||||
|
<div class="file-icon">🦋</div>
|
||||||
|
<div class="file-title">Living Nature</div>
|
||||||
|
<div class="file-description">6 animals + 6 plants with AI emotions</div>
|
||||||
|
<div class="file-meta">
|
||||||
|
<span class="file-badge">SYSTEM</span>
|
||||||
|
<span>1,177 lines</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="file-card" onclick="openFile('intelligent-agents.js')">
|
||||||
|
<div class="file-icon">🤖</div>
|
||||||
|
<div class="file-title">Intelligent Agents</div>
|
||||||
|
<div class="file-description">Alice, Aria, Lucidia with behavior trees</div>
|
||||||
|
<div class="file-meta">
|
||||||
|
<span class="file-badge">SYSTEM</span>
|
||||||
|
<span>862 lines</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="file-card" onclick="openFile('infinite-biomes.js')">
|
||||||
|
<div class="file-icon">🌲</div>
|
||||||
|
<div class="file-title">Infinite Biomes</div>
|
||||||
|
<div class="file-description">6 procedurally generated biomes</div>
|
||||||
|
<div class="file-meta">
|
||||||
|
<span class="file-badge">SYSTEM</span>
|
||||||
|
<span>492 lines</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="file-card" onclick="openFile('photorealistic-graphics.js')">
|
||||||
|
<div class="file-icon">🎨</div>
|
||||||
|
<div class="file-title">Photorealistic Graphics</div>
|
||||||
|
<div class="file-description">PBR materials and custom GLSL shaders</div>
|
||||||
|
<div class="file-meta">
|
||||||
|
<span class="file-badge">SYSTEM</span>
|
||||||
|
<span>743 lines</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="file-card" onclick="openFile('game-integration.js')">
|
||||||
|
<div class="file-icon">🎯</div>
|
||||||
|
<div class="file-title">Game Integration</div>
|
||||||
|
<div class="file-description">System orchestrator for all 17 modules</div>
|
||||||
|
<div class="file-meta">
|
||||||
|
<span class="file-badge">SYSTEM</span>
|
||||||
|
<span>890 lines</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Other Systems -->
|
||||||
|
<div class="file-card" onclick="openFile('crafting-building.js')">
|
||||||
|
<div class="file-icon">🛠️</div>
|
||||||
|
<div class="file-title">Crafting & Building</div>
|
||||||
|
<div class="file-description">Material system with 30+ recipes</div>
|
||||||
|
<div class="file-meta">
|
||||||
|
<span class="file-badge">SYSTEM</span>
|
||||||
|
<span>741 lines</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="file-card" onclick="openFile('quest-system.js')">
|
||||||
|
<div class="file-icon">🏆</div>
|
||||||
|
<div class="file-title">Quest System</div>
|
||||||
|
<div class="file-description">12 unique quests with achievements</div>
|
||||||
|
<div class="file-meta">
|
||||||
|
<span class="file-badge">SYSTEM</span>
|
||||||
|
<span>676 lines</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="file-card" onclick="openFile('dialogue-story.js')">
|
||||||
|
<div class="file-icon">💬</div>
|
||||||
|
<div class="file-title">Dialogue & Story</div>
|
||||||
|
<div class="file-description">Branching conversations and story arcs</div>
|
||||||
|
<div class="file-meta">
|
||||||
|
<span class="file-badge">SYSTEM</span>
|
||||||
|
<span>674 lines</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="file-card" onclick="openFile('world-evolution.js')">
|
||||||
|
<div class="file-icon">🌍</div>
|
||||||
|
<div class="file-title">World Evolution</div>
|
||||||
|
<div class="file-description">Seasons, weather, and ecosystem simulation</div>
|
||||||
|
<div class="file-meta">
|
||||||
|
<span class="file-badge">SYSTEM</span>
|
||||||
|
<span>673 lines</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Documentation -->
|
||||||
|
<div class="file-card" onclick="openFile('STATUS.md')">
|
||||||
|
<div class="file-icon">📊</div>
|
||||||
|
<div class="file-title">Complete Status</div>
|
||||||
|
<div class="file-description">Full project documentation and metrics</div>
|
||||||
|
<div class="file-meta">
|
||||||
|
<span class="file-badge">DOCS</span>
|
||||||
|
<span>561 lines</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="file-card" onclick="openFile('DOMAIN_SETUP.md')">
|
||||||
|
<div class="file-icon">🌐</div>
|
||||||
|
<div class="file-title">Domain Setup Guide</div>
|
||||||
|
<div class="file-description">Instructions for universe.blackroad.io</div>
|
||||||
|
<div class="file-meta">
|
||||||
|
<span class="file-badge">DOCS</span>
|
||||||
|
<span>244 lines</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
const SESSION_KEY = 'blackroad_pitstop_session';
|
||||||
|
|
||||||
|
// Check authentication
|
||||||
|
function checkAuth() {
|
||||||
|
const session = localStorage.getItem(SESSION_KEY);
|
||||||
|
if (!session) {
|
||||||
|
window.location.href = 'index.html';
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
const sessionData = JSON.parse(session);
|
||||||
|
const now = Date.now();
|
||||||
|
|
||||||
|
if (sessionData.expires < now) {
|
||||||
|
localStorage.removeItem(SESSION_KEY);
|
||||||
|
window.location.href = 'index.html';
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
return sessionData;
|
||||||
|
} catch (e) {
|
||||||
|
localStorage.removeItem(SESSION_KEY);
|
||||||
|
window.location.href = 'index.html';
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Initialize
|
||||||
|
const session = checkAuth();
|
||||||
|
if (session) {
|
||||||
|
document.getElementById('user-name').textContent = session.username;
|
||||||
|
document.getElementById('user-avatar').textContent = session.username.charAt(0).toUpperCase();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Logout function
|
||||||
|
function logout() {
|
||||||
|
if (confirm('Are you sure you want to logout?')) {
|
||||||
|
localStorage.removeItem(SESSION_KEY);
|
||||||
|
window.location.href = 'index.html';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Open file function
|
||||||
|
function openFile(filename) {
|
||||||
|
// Map files to their actual URLs
|
||||||
|
const fileMap = {
|
||||||
|
'universe.html': '../blackroad-metaverse/universe.html',
|
||||||
|
'index.html': '../blackroad-metaverse/index.html',
|
||||||
|
'module-loader.js': '../blackroad-metaverse/module-loader.js',
|
||||||
|
'truth-contracts.js': '../blackroad-metaverse/truth-contracts.js',
|
||||||
|
'celestial-mechanics.js': '../blackroad-metaverse/celestial-mechanics.js',
|
||||||
|
'physics-engine.js': '../blackroad-metaverse/physics-engine.js',
|
||||||
|
'living-nature.js': '../blackroad-metaverse/living-nature.js',
|
||||||
|
'intelligent-agents.js': '../blackroad-metaverse/intelligent-agents.js',
|
||||||
|
'infinite-biomes.js': '../blackroad-metaverse/infinite-biomes.js',
|
||||||
|
'photorealistic-graphics.js': '../blackroad-metaverse/photorealistic-graphics.js',
|
||||||
|
'game-integration.js': '../blackroad-metaverse/game-integration.js',
|
||||||
|
'crafting-building.js': '../blackroad-metaverse/crafting-building.js',
|
||||||
|
'quest-system.js': '../blackroad-metaverse/quest-system.js',
|
||||||
|
'dialogue-story.js': '../blackroad-metaverse/dialogue-story.js',
|
||||||
|
'world-evolution.js': '../blackroad-metaverse/world-evolution.js',
|
||||||
|
'STATUS.md': '../blackroad-metaverse/STATUS.md',
|
||||||
|
'DOMAIN_SETUP.md': '../blackroad-metaverse/DOMAIN_SETUP.md'
|
||||||
|
};
|
||||||
|
|
||||||
|
const url = fileMap[filename];
|
||||||
|
if (url) {
|
||||||
|
if (filename.endsWith('.html')) {
|
||||||
|
// Open HTML files directly
|
||||||
|
window.open(url, '_blank');
|
||||||
|
} else {
|
||||||
|
// For other files, we'll need a file viewer
|
||||||
|
alert(`File: ${filename}\nPath: ${url}\n\nViewer coming soon!`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
518
index.html
Normal file
518
index.html
Normal file
@@ -0,0 +1,518 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
|
<title>BlackRoad Pitstop — Secure Portal</title>
|
||||||
|
<meta name="description" content="Secure authentication portal for BlackRoad systems">
|
||||||
|
|
||||||
|
<!-- Fonts -->
|
||||||
|
<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=Inter:wght@300;400;500;600;700;800;900&family=JetBrains+Mono:wght@400;500;600&display=swap" rel="stylesheet">
|
||||||
|
|
||||||
|
<style>
|
||||||
|
* {
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
box-sizing: border-box;
|
||||||
|
}
|
||||||
|
|
||||||
|
:root {
|
||||||
|
--bg-dark: #0a0a0a;
|
||||||
|
--bg-darker: #050505;
|
||||||
|
--text-primary: #ffffff;
|
||||||
|
--text-secondary: #a0a0a0;
|
||||||
|
--accent-orange: #FF9D00;
|
||||||
|
--accent-red: #FF006B;
|
||||||
|
--accent-purple: #7700FF;
|
||||||
|
--accent-blue: #0066FF;
|
||||||
|
--glass-bg: rgba(255, 255, 255, 0.05);
|
||||||
|
--glass-border: rgba(255, 255, 255, 0.1);
|
||||||
|
--success: #27AE60;
|
||||||
|
--error: #E74C3C;
|
||||||
|
}
|
||||||
|
|
||||||
|
body {
|
||||||
|
font-family: 'Inter', sans-serif;
|
||||||
|
background: linear-gradient(135deg, #0a0a0a 0%, #1a0a2e 50%, #0a0a0a 100%);
|
||||||
|
color: var(--text-primary);
|
||||||
|
overflow: hidden;
|
||||||
|
height: 100vh;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
position: relative;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Animated Background */
|
||||||
|
.background {
|
||||||
|
position: absolute;
|
||||||
|
top: 0;
|
||||||
|
left: 0;
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
overflow: hidden;
|
||||||
|
z-index: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.star {
|
||||||
|
position: absolute;
|
||||||
|
width: 2px;
|
||||||
|
height: 2px;
|
||||||
|
background: white;
|
||||||
|
border-radius: 50%;
|
||||||
|
animation: twinkle 3s infinite;
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes twinkle {
|
||||||
|
0%, 100% { opacity: 0.3; }
|
||||||
|
50% { opacity: 1; }
|
||||||
|
}
|
||||||
|
|
||||||
|
.gradient-orb {
|
||||||
|
position: absolute;
|
||||||
|
border-radius: 50%;
|
||||||
|
filter: blur(100px);
|
||||||
|
opacity: 0.3;
|
||||||
|
animation: float 20s infinite ease-in-out;
|
||||||
|
}
|
||||||
|
|
||||||
|
.orb-1 {
|
||||||
|
width: 400px;
|
||||||
|
height: 400px;
|
||||||
|
background: linear-gradient(45deg, var(--accent-orange), var(--accent-red));
|
||||||
|
top: -200px;
|
||||||
|
left: -200px;
|
||||||
|
animation-delay: 0s;
|
||||||
|
}
|
||||||
|
|
||||||
|
.orb-2 {
|
||||||
|
width: 300px;
|
||||||
|
height: 300px;
|
||||||
|
background: linear-gradient(45deg, var(--accent-purple), var(--accent-blue));
|
||||||
|
bottom: -150px;
|
||||||
|
right: -150px;
|
||||||
|
animation-delay: 5s;
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes float {
|
||||||
|
0%, 100% { transform: translate(0, 0) scale(1); }
|
||||||
|
33% { transform: translate(50px, -50px) scale(1.1); }
|
||||||
|
66% { transform: translate(-30px, 30px) scale(0.9); }
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Main Container */
|
||||||
|
.container {
|
||||||
|
position: relative;
|
||||||
|
z-index: 10;
|
||||||
|
width: 100%;
|
||||||
|
max-width: 480px;
|
||||||
|
padding: 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.login-card {
|
||||||
|
background: var(--glass-bg);
|
||||||
|
backdrop-filter: blur(20px);
|
||||||
|
border: 1px solid var(--glass-border);
|
||||||
|
border-radius: 24px;
|
||||||
|
padding: 60px 40px;
|
||||||
|
box-shadow: 0 20px 60px rgba(0, 0, 0, 0.5);
|
||||||
|
}
|
||||||
|
|
||||||
|
.logo {
|
||||||
|
text-align: center;
|
||||||
|
margin-bottom: 40px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.logo-text {
|
||||||
|
font-size: 42px;
|
||||||
|
font-weight: 900;
|
||||||
|
background: linear-gradient(45deg, var(--accent-orange), var(--accent-red), var(--accent-purple), var(--accent-blue));
|
||||||
|
background-size: 300% 300%;
|
||||||
|
-webkit-background-clip: text;
|
||||||
|
background-clip: text;
|
||||||
|
-webkit-text-fill-color: transparent;
|
||||||
|
animation: gradientShift 3s ease infinite;
|
||||||
|
margin-bottom: 8px;
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes gradientShift {
|
||||||
|
0%, 100% { background-position: 0% 50%; }
|
||||||
|
50% { background-position: 100% 50%; }
|
||||||
|
}
|
||||||
|
|
||||||
|
.logo-subtitle {
|
||||||
|
font-size: 13px;
|
||||||
|
color: var(--text-secondary);
|
||||||
|
text-transform: uppercase;
|
||||||
|
letter-spacing: 2px;
|
||||||
|
font-weight: 500;
|
||||||
|
}
|
||||||
|
|
||||||
|
.form-group {
|
||||||
|
margin-bottom: 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.form-label {
|
||||||
|
display: block;
|
||||||
|
font-size: 13px;
|
||||||
|
font-weight: 500;
|
||||||
|
color: var(--text-secondary);
|
||||||
|
margin-bottom: 8px;
|
||||||
|
text-transform: uppercase;
|
||||||
|
letter-spacing: 1px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.form-input {
|
||||||
|
width: 100%;
|
||||||
|
padding: 16px 20px;
|
||||||
|
background: rgba(255, 255, 255, 0.08);
|
||||||
|
border: 1px solid var(--glass-border);
|
||||||
|
border-radius: 12px;
|
||||||
|
color: var(--text-primary);
|
||||||
|
font-size: 15px;
|
||||||
|
font-family: 'Inter', sans-serif;
|
||||||
|
transition: all 0.3s ease;
|
||||||
|
}
|
||||||
|
|
||||||
|
.form-input:focus {
|
||||||
|
outline: none;
|
||||||
|
background: rgba(255, 255, 255, 0.12);
|
||||||
|
border-color: var(--accent-purple);
|
||||||
|
box-shadow: 0 0 0 3px rgba(119, 0, 255, 0.1);
|
||||||
|
}
|
||||||
|
|
||||||
|
.form-input::placeholder {
|
||||||
|
color: var(--text-secondary);
|
||||||
|
opacity: 0.5;
|
||||||
|
}
|
||||||
|
|
||||||
|
.submit-button {
|
||||||
|
width: 100%;
|
||||||
|
padding: 16px;
|
||||||
|
background: linear-gradient(45deg, var(--accent-orange), var(--accent-red));
|
||||||
|
border: none;
|
||||||
|
border-radius: 12px;
|
||||||
|
color: white;
|
||||||
|
font-size: 16px;
|
||||||
|
font-weight: 600;
|
||||||
|
cursor: pointer;
|
||||||
|
transition: transform 0.2s ease, box-shadow 0.2s ease;
|
||||||
|
font-family: 'Inter', sans-serif;
|
||||||
|
text-transform: uppercase;
|
||||||
|
letter-spacing: 1px;
|
||||||
|
margin-top: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.submit-button:hover:not(:disabled) {
|
||||||
|
transform: translateY(-2px);
|
||||||
|
box-shadow: 0 10px 30px rgba(255, 157, 0, 0.3);
|
||||||
|
}
|
||||||
|
|
||||||
|
.submit-button:active:not(:disabled) {
|
||||||
|
transform: translateY(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
.submit-button:disabled {
|
||||||
|
opacity: 0.5;
|
||||||
|
cursor: not-allowed;
|
||||||
|
}
|
||||||
|
|
||||||
|
.error-message {
|
||||||
|
background: rgba(231, 76, 60, 0.1);
|
||||||
|
border: 1px solid rgba(231, 76, 60, 0.3);
|
||||||
|
color: var(--error);
|
||||||
|
padding: 12px 16px;
|
||||||
|
border-radius: 8px;
|
||||||
|
font-size: 13px;
|
||||||
|
margin-bottom: 20px;
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.error-message.show {
|
||||||
|
display: block;
|
||||||
|
animation: slideDown 0.3s ease;
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes slideDown {
|
||||||
|
from {
|
||||||
|
opacity: 0;
|
||||||
|
transform: translateY(-10px);
|
||||||
|
}
|
||||||
|
to {
|
||||||
|
opacity: 1;
|
||||||
|
transform: translateY(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.info-section {
|
||||||
|
margin-top: 30px;
|
||||||
|
padding-top: 30px;
|
||||||
|
border-top: 1px solid var(--glass-border);
|
||||||
|
}
|
||||||
|
|
||||||
|
.info-grid {
|
||||||
|
display: grid;
|
||||||
|
grid-template-columns: 1fr 1fr;
|
||||||
|
gap: 12px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.info-card {
|
||||||
|
background: rgba(255, 255, 255, 0.03);
|
||||||
|
border: 1px solid var(--glass-border);
|
||||||
|
border-radius: 8px;
|
||||||
|
padding: 12px;
|
||||||
|
text-align: center;
|
||||||
|
font-size: 12px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.info-icon {
|
||||||
|
font-size: 20px;
|
||||||
|
margin-bottom: 4px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.info-text {
|
||||||
|
color: var(--text-secondary);
|
||||||
|
}
|
||||||
|
|
||||||
|
.footer {
|
||||||
|
text-align: center;
|
||||||
|
margin-top: 30px;
|
||||||
|
font-size: 11px;
|
||||||
|
color: var(--text-secondary);
|
||||||
|
}
|
||||||
|
|
||||||
|
.footer a {
|
||||||
|
color: var(--accent-purple);
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.footer a:hover {
|
||||||
|
text-decoration: underline;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Loading Spinner */
|
||||||
|
.spinner {
|
||||||
|
display: inline-block;
|
||||||
|
width: 16px;
|
||||||
|
height: 16px;
|
||||||
|
border: 2px solid rgba(255, 255, 255, 0.3);
|
||||||
|
border-top-color: white;
|
||||||
|
border-radius: 50%;
|
||||||
|
animation: spin 0.8s linear infinite;
|
||||||
|
margin-left: 8px;
|
||||||
|
vertical-align: middle;
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes spin {
|
||||||
|
to { transform: rotate(360deg); }
|
||||||
|
}
|
||||||
|
|
||||||
|
.hidden {
|
||||||
|
display: none !important;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<!-- Animated Background -->
|
||||||
|
<div class="background" id="background">
|
||||||
|
<div class="gradient-orb orb-1"></div>
|
||||||
|
<div class="gradient-orb orb-2"></div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Main Container -->
|
||||||
|
<div class="container">
|
||||||
|
<div class="login-card">
|
||||||
|
<div class="logo">
|
||||||
|
<div class="logo-text">PITSTOP</div>
|
||||||
|
<div class="logo-subtitle">BlackRoad Secure Portal</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="error-message" id="error-message">
|
||||||
|
Invalid credentials. Please try again.
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<form id="login-form">
|
||||||
|
<div class="form-group">
|
||||||
|
<label class="form-label" for="username">Username</label>
|
||||||
|
<input
|
||||||
|
type="text"
|
||||||
|
id="username"
|
||||||
|
class="form-input"
|
||||||
|
placeholder="Enter your username"
|
||||||
|
autocomplete="username"
|
||||||
|
required
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="form-group">
|
||||||
|
<label class="form-label" for="password">Password</label>
|
||||||
|
<input
|
||||||
|
type="password"
|
||||||
|
id="password"
|
||||||
|
class="form-input"
|
||||||
|
placeholder="Enter your password"
|
||||||
|
autocomplete="current-password"
|
||||||
|
required
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<button type="submit" class="submit-button" id="submit-button">
|
||||||
|
<span id="button-text">Enter Pitstop</span>
|
||||||
|
<span class="spinner hidden" id="spinner"></span>
|
||||||
|
</button>
|
||||||
|
</form>
|
||||||
|
|
||||||
|
<div class="info-section">
|
||||||
|
<div class="info-grid">
|
||||||
|
<div class="info-card">
|
||||||
|
<div class="info-icon">🌌</div>
|
||||||
|
<div class="info-text">Universe Access</div>
|
||||||
|
</div>
|
||||||
|
<div class="info-card">
|
||||||
|
<div class="info-icon">📁</div>
|
||||||
|
<div class="info-text">File Management</div>
|
||||||
|
</div>
|
||||||
|
<div class="info-card">
|
||||||
|
<div class="info-icon">⚙️</div>
|
||||||
|
<div class="info-text">System Tools</div>
|
||||||
|
</div>
|
||||||
|
<div class="info-card">
|
||||||
|
<div class="info-icon">🔐</div>
|
||||||
|
<div class="info-text">Secure Access</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="footer">
|
||||||
|
<p>Protected by BlackRoad Security</p>
|
||||||
|
<p>© 2025 BlackRoad OS, Inc. • <a href="mailto:blackroad.systems@gmail.com">Support</a></p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
// Create animated starfield
|
||||||
|
const background = document.getElementById('background');
|
||||||
|
for (let i = 0; i < 150; i++) {
|
||||||
|
const star = document.createElement('div');
|
||||||
|
star.className = 'star';
|
||||||
|
star.style.left = `${Math.random() * 100}%`;
|
||||||
|
star.style.top = `${Math.random() * 100}%`;
|
||||||
|
star.style.animationDelay = `${Math.random() * 3}s`;
|
||||||
|
background.appendChild(star);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Authentication System
|
||||||
|
const VALID_CREDENTIALS = {
|
||||||
|
// Username: password hash (in production, use proper password hashing)
|
||||||
|
'alexa': 'blackroad2025',
|
||||||
|
'admin': 'blackroad2025',
|
||||||
|
'demo': 'demo123'
|
||||||
|
};
|
||||||
|
|
||||||
|
// Session management
|
||||||
|
const SESSION_KEY = 'blackroad_pitstop_session';
|
||||||
|
const SESSION_DURATION = 24 * 60 * 60 * 1000; // 24 hours
|
||||||
|
|
||||||
|
// Check for existing session on load
|
||||||
|
window.addEventListener('DOMContentLoaded', () => {
|
||||||
|
checkSession();
|
||||||
|
});
|
||||||
|
|
||||||
|
function checkSession() {
|
||||||
|
const session = localStorage.getItem(SESSION_KEY);
|
||||||
|
if (session) {
|
||||||
|
try {
|
||||||
|
const sessionData = JSON.parse(session);
|
||||||
|
const now = Date.now();
|
||||||
|
|
||||||
|
if (sessionData.expires > now) {
|
||||||
|
// Valid session - redirect to dashboard
|
||||||
|
window.location.href = 'dashboard.html';
|
||||||
|
return;
|
||||||
|
} else {
|
||||||
|
// Expired session
|
||||||
|
localStorage.removeItem(SESSION_KEY);
|
||||||
|
}
|
||||||
|
} catch (e) {
|
||||||
|
localStorage.removeItem(SESSION_KEY);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function createSession(username) {
|
||||||
|
const sessionData = {
|
||||||
|
username: username,
|
||||||
|
timestamp: Date.now(),
|
||||||
|
expires: Date.now() + SESSION_DURATION
|
||||||
|
};
|
||||||
|
localStorage.setItem(SESSION_KEY, JSON.stringify(sessionData));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Form submission
|
||||||
|
const form = document.getElementById('login-form');
|
||||||
|
const errorMessage = document.getElementById('error-message');
|
||||||
|
const submitButton = document.getElementById('submit-button');
|
||||||
|
const buttonText = document.getElementById('button-text');
|
||||||
|
const spinner = document.getElementById('spinner');
|
||||||
|
|
||||||
|
form.addEventListener('submit', async (e) => {
|
||||||
|
e.preventDefault();
|
||||||
|
|
||||||
|
const username = document.getElementById('username').value.trim();
|
||||||
|
const password = document.getElementById('password').value;
|
||||||
|
|
||||||
|
// Hide error
|
||||||
|
errorMessage.classList.remove('show');
|
||||||
|
|
||||||
|
// Show loading state
|
||||||
|
submitButton.disabled = true;
|
||||||
|
buttonText.textContent = 'Authenticating';
|
||||||
|
spinner.classList.remove('hidden');
|
||||||
|
|
||||||
|
// Simulate network delay for realism
|
||||||
|
await new Promise(resolve => setTimeout(resolve, 1000));
|
||||||
|
|
||||||
|
// Check credentials
|
||||||
|
if (VALID_CREDENTIALS[username] && VALID_CREDENTIALS[username] === password) {
|
||||||
|
// Success
|
||||||
|
buttonText.textContent = 'Access Granted';
|
||||||
|
spinner.classList.add('hidden');
|
||||||
|
|
||||||
|
// Create session
|
||||||
|
createSession(username);
|
||||||
|
|
||||||
|
// Redirect to dashboard
|
||||||
|
setTimeout(() => {
|
||||||
|
window.location.href = 'dashboard.html';
|
||||||
|
}, 500);
|
||||||
|
} else {
|
||||||
|
// Failed
|
||||||
|
submitButton.disabled = false;
|
||||||
|
buttonText.textContent = 'Enter Pitstop';
|
||||||
|
spinner.classList.add('hidden');
|
||||||
|
errorMessage.classList.add('show');
|
||||||
|
|
||||||
|
// Shake animation
|
||||||
|
document.querySelector('.login-card').style.animation = 'shake 0.5s';
|
||||||
|
setTimeout(() => {
|
||||||
|
document.querySelector('.login-card').style.animation = '';
|
||||||
|
}, 500);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// Shake animation
|
||||||
|
const style = document.createElement('style');
|
||||||
|
style.textContent = `
|
||||||
|
@keyframes shake {
|
||||||
|
0%, 100% { transform: translateX(0); }
|
||||||
|
10%, 30%, 50%, 70%, 90% { transform: translateX(-10px); }
|
||||||
|
20%, 40%, 60%, 80% { transform: translateX(10px); }
|
||||||
|
}
|
||||||
|
`;
|
||||||
|
document.head.appendChild(style);
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
23
package.json
Normal file
23
package.json
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
{
|
||||||
|
"name": "blackroad-pitstop",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"description": "Secure authentication portal for BlackRoad OS metaverse systems",
|
||||||
|
"main": "index.html",
|
||||||
|
"scripts": {
|
||||||
|
"dev": "python3 -m http.server 8000",
|
||||||
|
"deploy": "wrangler pages deploy . --project-name=blackroad-pitstop"
|
||||||
|
},
|
||||||
|
"keywords": [
|
||||||
|
"blackroad",
|
||||||
|
"authentication",
|
||||||
|
"portal",
|
||||||
|
"secure",
|
||||||
|
"metaverse"
|
||||||
|
],
|
||||||
|
"author": "BlackRoad OS, Inc. <blackroad.systems@gmail.com>",
|
||||||
|
"license": "UNLICENSED",
|
||||||
|
"repository": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/blackboxprogramming/blackroad-pitstop.git"
|
||||||
|
}
|
||||||
|
}
|
||||||
6
wrangler.toml
Normal file
6
wrangler.toml
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
name = "blackroad-pitstop"
|
||||||
|
compatibility_date = "2024-01-01"
|
||||||
|
pages_build_output_dir = "."
|
||||||
|
|
||||||
|
# Custom domain: pitstop.blackroad.io
|
||||||
|
# BlackRoad OS, Inc.
|
||||||
Reference in New Issue
Block a user