-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathscript.js
More file actions
153 lines (135 loc) · 5.49 KB
/
script.js
File metadata and controls
153 lines (135 loc) · 5.49 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
document.addEventListener('DOMContentLoaded', () => {
const menuBtn = document.querySelector('.mobile-menu-btn');
const navLinks = document.querySelector('.nav-links');
const searchShortcut = document.querySelector('.search-shortcut');
// Create Search Overlay
const searchOverlay = document.createElement('div');
searchOverlay.className = 'search-overlay';
searchOverlay.innerHTML = `
<div class="search-modal">
<div class="search-header">
<svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="11" cy="11" r="8"></circle><line x1="21" y1="21" x2="16.65" y2="16.65"></line></svg>
<input type="text" placeholder="Search documentation..." id="search-input">
<button class="close-search">ESC</button>
</div>
<div class="search-results" id="search-results">
<div class="search-empty">No recent searches</div>
</div>
</div>
`;
document.body.appendChild(searchOverlay);
const searchInput = searchOverlay.querySelector('#search-input');
const resultsContainer = searchOverlay.querySelector('#search-results');
const toggleSearch = (show) => {
searchOverlay.classList.toggle('active', show);
if (show) {
setTimeout(() => searchInput.focus(), 100);
document.body.style.overflow = 'hidden';
} else {
document.body.style.overflow = '';
searchInput.value = '';
resultsContainer.innerHTML = '<div class="search-empty">No recent searches</div>';
}
};
if (searchShortcut) {
searchShortcut.addEventListener('click', () => toggleSearch(true));
}
searchOverlay.addEventListener('click', (e) => {
if (e.target === searchOverlay) toggleSearch(false);
});
const closeBtn = searchOverlay.querySelector('.close-search');
if (closeBtn) {
closeBtn.addEventListener('click', () => toggleSearch(false));
}
// Keyboard Shortcuts
document.addEventListener('keydown', (e) => {
if ((e.metaKey || e.ctrlKey) && e.key === 'k') {
e.preventDefault();
toggleSearch(true);
}
if (e.key === 'Escape' && searchOverlay.classList.contains('active')) {
toggleSearch(false);
}
});
// Mock Search Logic
const pages = [
{ title: 'Home', url: 'index.html', content: 'Lethal Labs homepage code without compromise' },
{ title: 'About Us', url: 'about.html', content: 'Mission core values design-driven open by default' },
{ title: 'Projects', url: 'projects.html', content: 'Miroko SaaS open source core research development' },
{ title: 'Documentation', url: 'docs.html', content: 'Insider program contributing project guidelines' },
{ title: 'Careers', url: 'careers.html', content: 'Join the core lethal edge roles engineering' },
{ title: 'Donate', url: 'donate.html', content: 'Support the mission bitcoin ethereum solana' },
{ title: 'Contact', url: 'contact.html', content: 'Enterprise inquiry support collaboration' }
];
searchInput.addEventListener('input', (e) => {
const query = e.target.value.toLowerCase();
if (!query) {
resultsContainer.innerHTML = '<div class="search-empty">No recent searches</div>';
return;
}
const filtered = pages.filter(p =>
p.title.toLowerCase().includes(query) ||
p.content.toLowerCase().includes(query)
);
if (filtered.length > 0) {
resultsContainer.innerHTML = filtered.map(p => `
<a href="${p.url}" class="search-result-item">
<div class="result-title">${p.title}</div>
<div class="result-url">${p.url}</div>
</a>
`).join('');
} else {
resultsContainer.innerHTML = '<div class="search-empty">No results found</div>';
}
});
// Mobile Menu Logic
if (menuBtn && navLinks) {
menuBtn.addEventListener('click', (e) => {
e.stopPropagation();
const isActive = navLinks.classList.toggle('active');
document.body.style.overflow = isActive ? 'hidden' : '';
menuBtn.setAttribute('aria-expanded', isActive);
});
navLinks.querySelectorAll('a').forEach(link => {
link.addEventListener('click', () => {
navLinks.classList.remove('active');
document.body.style.overflow = '';
menuBtn.setAttribute('aria-expanded', 'false');
});
});
document.addEventListener('click', (e) => {
if (navLinks.classList.contains('active') && !navLinks.contains(e.target) && !menuBtn.contains(e.target)) {
navLinks.classList.remove('active');
document.body.style.overflow = '';
menuBtn.setAttribute('aria-expanded', 'false');
}
});
}
// Terminal Typing Effect
const badge = document.querySelector('.hero-content .badge');
if (badge) {
const textNode = badge.childNodes[badge.childNodes.length - 1];
const originalText = textNode.textContent.trim();
textNode.textContent = '';
let i = 0;
const type = () => {
if (i < originalText.length) {
textNode.textContent += originalText.charAt(i);
i++;
setTimeout(type, 50 + Math.random() * 50);
}
};
setTimeout(type, 1000);
}
// Bento Glow Tracking
const bentoItems = document.querySelectorAll('.bento-item');
bentoItems.forEach(item => {
item.addEventListener('mousemove', (e) => {
const rect = item.getBoundingClientRect();
const x = e.clientX - rect.left;
const y = e.clientY - rect.top;
item.style.setProperty('--mouse-x', `${x}px`);
item.style.setProperty('--mouse-y', `${y}px`);
});
});
});