FireOS Animation

This commit is contained in:
End 2025-03-30 10:51:43 -07:00
parent 0bf90740e4
commit 3d75fd2d78
No known key found for this signature in database
8 changed files with 887 additions and 0 deletions

Binary file not shown.

Binary file not shown.

Binary file not shown.

162
public/pages/boot.html Normal file
View file

@ -0,0 +1,162 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width">
<title>FireOS Boot Animation - FP650</title>
<meta name="description" content="FireOS Boot Animation" />
<meta property="og:title" content="FireOS Boot Animation - FP650" />
<meta property="og:type" content="website" />
<meta property="og:image" content="https://firepup650.com/favicon.ico" />
<meta property="og:image:height" content="512" />
<meta property="og:image:width" content="512" />
<meta property="og:url" content="https://firepup650.com/boot" />
<meta property="og:description" content="FireOS Boot Animation" />
<meta property="og:site_name" content="Firepup650's Site" />
<meta property="og:locale" content="en_US">
<meta property="og:logo" content="https://firepup650.com/favicon.ico" />
<link href="/styles/style.css" rel="stylesheet" type="text/css" />
<link href="/styles/FireOSBootAnimation.css" rel="stylesheet" type="text/css" />
<!-- Using local Orbitron fonts from /fonts directory -->
<script>
function getVersionNumber() {
const startDate = new Date('2006-11-29');
const today = new Date();
// Calculate difference in milliseconds
const diffTime = today - startDate;
// Convert to years with 2 decimal places
const diffYears = (diffTime / (1000 * 60 * 60 * 24 * 365.25)).toFixed(2);
return diffYears;
}
// Update all version numbers when the DOM is loaded
document.addEventListener('DOMContentLoaded', function() {
const versionNumber = getVersionNumber();
// Update BIOS header
const biosHeader = document.querySelector('.bios-header');
if (biosHeader) {
biosHeader.textContent = `FIRE_OS BIOS v${versionNumber}`;
}
// Update boot complete message
const bootCompleteMessage = document.querySelector('.boot-complete-message');
if (bootCompleteMessage) {
bootCompleteMessage.textContent = `FireOS v${versionNumber} is fully operational`;
}
// Update logo subtitle if needed
const logoSubtitle = document.querySelector('.logo-subtitle');
if (logoSubtitle) {
logoSubtitle.textContent = `ProtoKitty Operating System v${versionNumber}`;
}
});
</script>
</head>
<body>
<h5 hidden id='Maintenance' class="center"></h5>
<!-- Fire OS Boot Animation container -->
<div id="fire-os-boot-container" class="fire-os-boot-container">
<div class="boot-scan-line"></div>
<div class="boot-visor-frame">
<div class="visor-left-ear"></div>
<div class="visor-right-ear"></div>
<div class="boot-visor">
<div class="visor-line top"></div>
<div class="visor-line bottom"></div>
<!-- Boot Sequence Content -->
<div class="boot-content">
<!-- BIOS Check -->
<div class="boot-stage boot-stage-2">
<div class="bios-header">FIRE_OS BIOS</div>
<div class="boot-text-line">Initializing hardware...</div>
<div class="boot-text-line">CPU: ProtoCore i9 @ 4.7GHz</div>
<div class="boot-text-line">Memory: 16GB NeuralRAM</div>
<div class="boot-text-line">Checking system integrity... OK</div>
<div class="boot-text-line">Starting boot sequence...</div>
</div>
<!-- System Scan -->
<div class="boot-stage boot-stage-3">
<div class="scan-header">SYSTEM SCAN</div>
<div class="scan-progress-container">
<div class="scan-progress-bar"></div>
</div>
<div class="scan-detail">Checking vital systems...</div>
<div class="scan-detail">Initializing neural pathways...</div>
<div class="scan-detail">Activating sensory modules...</div>
<div class="scan-detail">All systems nominal</div>
</div>
<!-- Module Loading -->
<div class="boot-stage boot-stage-4">
<div class="module-header">LOADING CORE MODULES</div>
<div class="modules-grid">
<div class="module-item">
<div class="module-icon"></div>
<div class="module-name">ProtoKittyCore</div>
</div>
<div class="module-item">
<div class="module-icon"></div>
<div class="module-name">NeuralNet</div>
</div>
<div class="module-item">
<div class="module-icon"></div>
<div class="module-name">VisorDisplay</div>
</div>
<div class="module-item">
<div class="module-icon"></div>
<div class="module-name">KittyTraits</div>
</div>
</div>
</div>
<!-- Protogen Protocol -->
<div class="boot-stage boot-stage-5">
<div class="protogen-header">ACTIVATING PROTOGEN PROTOCOLS</div>
<div class="protogen-trait">Feline module: Online</div>
<div class="protogen-trait">Kitty ears: Calibrated</div>
<div class="protogen-trait">Cuteness factor: Maximum</div>
<div class="protogen-trait">Mischief subroutines: Loaded</div>
<div class="protogen-trait">ProtoKitty integration: Complete</div>
</div>
<!-- Logo Display -->
<div class="boot-stage boot-stage-6 logo-display">
<div class="fire-os-logo">
<span class="logo-fire">Fire</span>
<span class="logo-os">OS</span>
</div>
<div class="logo-subtitle">ProtoKitty Operating System</div>
</div>
<!-- System Ready -->
<div class="boot-stage boot-stage-7 system-ready">
<div class="ready-status">SYSTEM ACTIVATED</div>
<div class="welcome-message">Welcome back, ProtoKitty</div>
<div class="boot-complete-message">FireOS is fully operational</div>
</div>
</div>
</div>
</div>
<!-- Skip button -->
<button id="skip-boot-button" class="skip-button">
SKIP BOOT SEQUENCE
</button>
</div>
<!-- No visible content needed since we'll redirect automatically -->
<div id="page-content" style="display: none;"></div>
<script src="/scripts/FireOSBootAnimation.js"></script>
<script src="/scripts/script.js"></script>
</body>
</html>

View file

@ -23,6 +23,8 @@
<h5 hidden id='Maintenance' class="center"></h5>
<span class=center>
<h5 class="force-color">Welcome to my site!</h5>
<a href="/boot" class="cyan">View Boot Animation</a>
<br/>
<a href="/maintenance" class="cyan">Go to the Maintenance page</a>
<br/>
<a href="/dvd-screensaver" class="cyan">Go to the DVD Screensaver page</a>
@ -55,6 +57,7 @@
<br/>
<a href="/neofetches" class="cyan">Go to the Neofetches page</a>
</span>
<!-- <script src="/scripts/first-visit.js"></script> -->
<script src="/scripts/script.js"></script>
</body>
</html>

View file

@ -0,0 +1,159 @@
function FireOSBootAnimation(options = {}) {
const defaults = {
containerId: 'fire-os-boot-container',
skipButtonId: 'skip-boot-button',
onComplete: null,
skipAnimation: false,
primaryColor: '#0F0',
secondaryColor: '#F05',
kittyColor: '#e49'
};
const settings = Object.assign({}, defaults, options);
let bootStage = 0;
let bootComplete = false;
let currentTimeout = null;
// Initialize boot sequence with proper timing (slightly faster)
const bootSequence = [
{ stage: 1, delay: 500 }, // Initial screen flicker
{ stage: 2, delay: 2000 }, // BIOS check
{ stage: 3, delay: 2500 }, // System scan
{ stage: 4, delay: 2500 }, // Loading modules
{ stage: 5, delay: 2500 }, // Protogen protocols
{ stage: 6, delay: 2000 }, // Show logo
{ stage: 7, delay: 2000 }, // Final activation
{ stage: 8, delay: 1000 } // Fade out
];
function init() {
const container = document.getElementById(settings.containerId);
if (!container) {
console.error('FireOS Boot container not found');
return;
}
// Set up skip button event listener
const skipButton = document.getElementById(settings.skipButtonId);
if (skipButton) {
skipButton.addEventListener('click', handleSkip);
}
if (settings.skipAnimation) {
handleAnimationComplete();
} else {
// Start boot sequence
runNextStage(0);
}
}
function runNextStage(currentIndex) {
if (currentIndex >= bootSequence.length) {
handleAnimationComplete();
return;
}
const { stage, delay } = bootSequence[currentIndex];
// Clear all active stages
document.querySelectorAll('.boot-stage').forEach(el => {
el.classList.remove('active');
});
// Reset content visibility
document.querySelectorAll('.boot-content').forEach(el => {
el.classList.remove('active');
});
// Short delay to allow for transition
setTimeout(() => {
// First ensure boot content is visible
document.querySelectorAll('.boot-content').forEach(el => {
el.classList.add('active');
});
// Then activate the correct stage
bootStage = stage;
activateCurrentStage();
if (stage === 6) {
showLogo();
} else if (stage === 7) {
setBootComplete();
}
}, 300);
// Schedule next stage
currentTimeout = setTimeout(() => {
runNextStage(currentIndex + 1);
}, delay);
}
function activateCurrentStage() {
const stageEl = document.querySelector(`.boot-stage-${bootStage}`);
if (stageEl) {
stageEl.classList.add('active');
}
}
function showLogo() {
const logoEl = document.querySelector('.logo-display');
if (logoEl) {
logoEl.classList.add('active');
}
}
function setBootComplete() {
bootComplete = true;
const readyEl = document.querySelector('.system-ready');
if (readyEl) {
readyEl.classList.add('active');
}
}
function handleAnimationComplete() {
if (currentTimeout) {
clearTimeout(currentTimeout);
}
const container = document.getElementById(settings.containerId);
if (container) {
// Add fade-out class
container.classList.add('fade-out');
// Always redirect back after animation completes
setTimeout(() => {
container.style.display = 'none';
// Execute onComplete callback if provided
if (typeof settings.onComplete === 'function') {
settings.onComplete();
}
// Always redirect back to main page or the saved page
const returnPage = localStorage.getItem('returnAfterBoot') || '/';
localStorage.removeItem('returnAfterBoot');
// Redirect back to the original page
window.location.href = returnPage;
}, 1000);
}
}
function handleSkip() {
handleAnimationComplete();
}
return {
init,
handleSkip
};
}
// On document load, initialize the boot animation
document.addEventListener('DOMContentLoaded', function() {
// Initialize and start the boot animation immediately
FireOSBootAnimation().init();
});

View file

@ -0,0 +1,24 @@
(function() {
// Skip boot animation if coming back from the boot page or if in development mode
if (document.referrer.includes('/boot')) {
console.log('Skipping boot animation (returning from boot page)');
localStorage.setItem('hasVisitedBefore', 'true');
return;
}
// Check if this is the first visit
if (!localStorage.getItem('hasVisitedBefore')) {
// First visit - save the current path and redirect to boot animation
localStorage.setItem('hasVisitedBefore', 'true');
// Store the current page to return to after boot
const currentPage = window.location.pathname;
localStorage.setItem('returnAfterBoot', currentPage);
// Redirect to boot animation
console.log('First visit detected, redirecting to boot animation');
window.location.href = '/boot';
} else {
console.log('Returning visitor, skipping boot animation');
}
})();

View file

@ -0,0 +1,539 @@
/* Orbitron font for futuristic boot animation */
@font-face {
font-family: 'Orbitron';
src: url('/fonts/orbitron-regular.ttf') format('truetype');
font-weight: normal;
font-style: normal;
}
@font-face {
font-family: 'Orbitron';
src: url('/fonts/orbitron-medium.ttf') format('truetype');
font-weight: 500;
font-style: normal;
}
@font-face {
font-family: 'Orbitron';
src: url('/fonts/orbitron-bold.ttf') format('truetype');
font-weight: bold;
font-style: normal;
}
/* Full screen overlay */
.fire-os-boot-container {
position: fixed;
inset: 0;
background-color: #000;
z-index: 9999;
display: flex;
align-items: center;
justify-content: center;
font-family: 'Orbitron', monospace;
color: #0F0;
overflow: hidden;
}
.fire-os-boot-container.fade-out {
animation: fadeOut 0.8s forwards;
}
@keyframes fadeOut {
from { opacity: 1; }
to { opacity: 0; visibility: hidden; }
}
/* Scanning animation effect */
.boot-scan-line {
position: absolute;
left: 0;
width: 100%;
height: 4px;
background: linear-gradient(90deg,
rgba(0, 229, 255, 0) 0%,
rgba(0, 229, 255, 0.8) 50%,
rgba(0, 229, 255, 0) 100%);
box-shadow: 0 0 10px rgba(0, 229, 255, 0.8);
animation: scanAnimation 3s linear infinite;
pointer-events: none;
}
@keyframes scanAnimation {
0% { top: -10px; }
100% { top: 100vh; }
}
/* Kitty ear decorations */
.visor-left-ear,
.visor-right-ear {
position: absolute;
width: 40px;
height: 40px;
background-color: #e49;
top: -20px;
z-index: 2;
}
.visor-left-ear {
left: calc(50% - 100px);
transform: rotate(45deg);
border-radius: 0 0 0 20px;
transform-origin: bottom right;
animation: earTwitch 4s ease-in-out infinite;
}
.visor-right-ear {
right: calc(50% - 100px);
transform: rotate(-45deg);
border-radius: 0 0 20px 0;
transform-origin: bottom left;
animation: earTwitchRight 4s ease-in-out infinite;
}
@keyframes earTwitch {
0%, 100% { transform: rotate(45deg); }
50% { transform: rotate(30deg); }
}
@keyframes earTwitchRight {
0%, 100% { transform: rotate(-45deg); }
50% { transform: rotate(-30deg); }
}
/* Main visor frame - more angular for protogen look */
.boot-visor-frame {
position: relative;
width: 80%;
max-width: 800px;
height: 60vh;
max-height: 600px;
border: 2px solid #0F0;
border-radius: 5px;
box-shadow: 0 0 20px rgba(0, 255, 0, 0.5);
overflow: hidden;
background-color: rgba(0, 10, 15, 0.95);
}
.boot-visor {
position: relative;
width: 100%;
height: 100%;
display: flex;
align-items: center;
justify-content: center;
padding: 20px;
overflow: hidden;
}
/* Visor top and bottom glowing lines */
.visor-line {
position: absolute;
left: 0;
width: 100%;
height: 3px;
background-color: #0F0;
box-shadow: 0 0 10px #0F0;
animation: glowPulse 2s ease-in-out infinite;
}
.visor-line.top {
top: 0;
}
.visor-line.bottom {
bottom: 0;
}
@keyframes glowPulse {
0%, 100% { opacity: 1; box-shadow: 0 0 10px #0F0, 0 0 20px rgba(0, 255, 0, 0.5); }
50% { opacity: 0.7; box-shadow: 0 0 15px #0F0, 0 0 30px rgba(0, 255, 0, 0.7); }
}
/* Boot content area */
.boot-content {
width: 100%;
height: 100%;
position: relative;
opacity: 0;
transition: opacity 0.3s ease;
transform: translateY(0);
}
.boot-content.active {
opacity: 1;
}
/* Common styles for all boot stages */
.boot-stage {
position: absolute;
width: 80%;
max-width: 600px;
left: 50%;
top: 50%;
transform: translate(-50%, -50%);
margin: 0 auto;
padding: 20px;
background-color: rgba(0, 0, 0, 0.6);
border: 1px solid rgba(0, 255, 0, 0.3);
border-radius: 5px;
opacity: 0;
visibility: hidden;
display: none;
transition: opacity 0.3s ease, visibility 0.3s ease;
max-height: 80%;
overflow-y: auto;
z-index: 1;
}
.boot-stage.active {
opacity: 1;
visibility: visible;
display: block;
z-index: 10;
}
/* Hide scrollbar but allow scrolling */
.boot-stage::-webkit-scrollbar {
width: 3px;
}
.boot-stage::-webkit-scrollbar-track {
background: rgba(0, 0, 0, 0.2);
}
.boot-stage::-webkit-scrollbar-thumb {
background: rgba(0, 255, 0, 0.3);
}
/* BIOS Stage */
.bios-header {
font-size: 24px;
margin-bottom: 20px;
color: #F05;
text-align: center;
text-shadow: 0 0 10px rgba(255, 0, 92, 0.7);
}
.boot-text-line {
font-family: 'Courier New', monospace;
font-size: 14px;
margin: 8px 0;
color: #8be;
white-space: nowrap;
overflow: hidden;
animation: typeWriter 0.8s steps(50, end);
}
@keyframes typeWriter {
from { width: 0; }
to { width: 100%; }
}
/* System Scan Stage */
.scan-header {
font-size: 20px;
margin-bottom: 15px;
color: #F05;
text-align: center;
text-shadow: 0 0 10px rgba(255, 0, 92, 0.7);
}
.scan-progress-container {
width: 100%;
height: 10px;
background-color: rgba(0, 0, 0, 0.5);
border: 1px solid rgba(0, 255, 0, 0.5);
border-radius: 5px;
margin: 20px 0;
overflow: hidden;
}
.scan-progress-bar {
height: 100%;
background: linear-gradient(90deg, #0F0, #F05);
width: 0;
animation: progressFill 1.5s ease-in-out forwards;
}
@keyframes progressFill {
0% { width: 0; }
100% { width: 100%; }
}
.scan-detail {
font-family: 'Courier New', monospace;
font-size: 14px;
margin: 8px 0;
color: #8be;
}
/* Module Loading Stage */
.module-header {
font-size: 20px;
margin-bottom: 15px;
color: #F05;
text-align: center;
text-shadow: 0 0 10px rgba(255, 0, 92, 0.7);
}
.modules-grid {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 15px;
margin-top: 20px;
}
.module-item {
display: flex;
align-items: center;
padding: 10px;
background-color: rgba(0, 0, 0, 0.3);
border: 1px solid rgba(0, 255, 0, 0.2);
border-radius: 5px;
animation: moduleLoad 0.8s ease forwards;
opacity: 0;
}
.module-item:nth-child(1) { animation-delay: 0.15s; }
.module-item:nth-child(2) { animation-delay: 0.3s; }
.module-item:nth-child(3) { animation-delay: 0.45s; }
.module-item:nth-child(4) { animation-delay: 0.6s; }
@keyframes moduleLoad {
0% { opacity: 0; transform: translateX(-20px); }
100% { opacity: 1; transform: translateX(0); }
}
.module-icon {
width: 20px;
height: 20px;
border-radius: 50%;
background-color: #0F0;
margin-right: 10px;
animation: iconPulse 2s infinite;
}
@keyframes iconPulse {
0%, 100% { transform: scale(1); box-shadow: 0 0 5px #0F0; }
50% { transform: scale(1.1); box-shadow: 0 0 10px #0F0; }
}
.module-name {
font-size: 14px;
color: #fff;
}
/* Protogen Protocol Stage */
.protogen-header {
font-size: 20px;
margin-bottom: 15px;
color: #e49;
text-align: center;
text-shadow: 0 0 10px rgba(228, 148, 255, 0.7);
}
.protogen-trait {
font-family: 'Courier New', monospace;
font-size: 14px;
margin: 10px 0;
color: #e49;
padding-left: 20px;
position: relative;
opacity: 0;
animation: traitAppear 0.4s ease forwards;
}
.protogen-trait:nth-child(2) { animation-delay: 0.15s; }
.protogen-trait:nth-child(3) { animation-delay: 0.3s; }
.protogen-trait:nth-child(4) { animation-delay: 0.45s; }
.protogen-trait:nth-child(5) { animation-delay: 0.6s; }
.protogen-trait:nth-child(6) { animation-delay: 0.75s; }
@keyframes traitAppear {
0% { opacity: 0; transform: translateX(-10px); }
100% { opacity: 1; transform: translateX(0); }
}
.protogen-trait::before {
content: '>';
position: absolute;
left: 0;
color: #e49;
}
/* Logo Display Stage */
.logo-display {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
}
.fire-os-logo {
font-size: 48px;
font-weight: bold;
margin-bottom: 10px;
text-align: center;
background: linear-gradient(90deg, #e49, #0F0);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
background-clip: text;
text-fill-color: transparent;
text-shadow: 0 0 20px rgba(0, 255, 0, 0.5);
opacity: 0;
animation: logoAppear 0.8s ease forwards;
}
.logo-fire {
color: #e49;
}
.logo-os {
color: #0F0;
}
.logo-subtitle {
font-size: 16px;
color: #fff;
opacity: 0;
animation: logoAppear 0.8s ease forwards 0.4s;
text-align: center;
}
@keyframes logoAppear {
0% { opacity: 0; transform: scale(0.9); }
100% { opacity: 1; transform: scale(1); }
}
/* System Ready Stage */
.system-ready {
text-align: center;
}
.ready-status {
font-size: 28px;
margin-bottom: 15px;
color: #0F0;
animation: textPulse 2s infinite;
}
@keyframes textPulse {
0%, 100% { opacity: 1; }
50% { opacity: 0.7; }
}
.welcome-message {
font-size: 18px;
margin-bottom: 5px;
color: #fff;
}
.boot-complete-message {
font-size: 14px;
color: #8be;
margin-top: 20px;
}
/* Skip button */
.skip-button {
position: absolute;
bottom: 40px;
left: 50%;
transform: translateX(-50%);
background-color: rgba(255, 0, 80, 0.3);
color: white;
border: 1px solid rgba(255, 0, 80, 0.5);
border-radius: 5px;
padding: 10px 20px;
font-family: 'Orbitron', sans-serif;
font-size: 14px;
font-weight: bold;
cursor: pointer;
transition: all 0.3s ease;
z-index: 100;
animation: skipPulse 2s infinite;
box-shadow: 0 0 10px rgba(255, 0, 80, 0.3);
}
.skip-button:hover {
background-color: rgba(255, 0, 80, 0.7);
color: white;
border-color: rgba(255, 0, 80, 0.8);
box-shadow: 0 0 15px rgba(255, 0, 80, 0.5);
transform: translateX(-50%) scale(1.05);
}
@keyframes skipPulse {
0%, 100% { opacity: 1; }
50% { opacity: 0.7; }
}
/* Responsiveness */
@media (max-width: 768px) {
.boot-visor-frame {
width: 95%;
height: 80vh;
}
.visor-left-ear, .visor-right-ear {
width: 30px;
height: 30px;
top: -15px;
}
.visor-left-ear {
left: calc(50% - 70px);
}
.visor-right-ear {
right: calc(50% - 70px);
}
.boot-visor {
padding: 15px;
}
.boot-stage {
width: 90%;
padding: 15px;
}
.modules-grid {
grid-template-columns: 1fr;
}
.bios-header, .scan-header, .module-header, .protogen-header {
font-size: 18px;
}
.fire-os-logo {
font-size: 36px;
}
.logo-subtitle {
font-size: 14px;
}
.ready-status {
font-size: 24px;
}
}
@media (max-width: 480px) {
.boot-stage {
width: 95%;
padding: 10px;
}
.bios-header, .scan-header, .module-header, .protogen-header {
font-size: 16px;
}
.boot-text-line, .scan-detail, .protogen-trait {
font-size: 12px;
}
.skip-button {
padding: 8px 16px;
font-size: 12px;
}
}