this is too generic. I want more futuristic, minimal and super cool
Browse files- components/neon-button.js +58 -0
- components/podcast-player.js +24 -6
- index.html +8 -10
- script.js +68 -3
- style.css +47 -2
components/neon-button.js
ADDED
|
@@ -0,0 +1,58 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
class NeonButton extends HTMLElement {
|
| 2 |
+
connectedCallback() {
|
| 3 |
+
this.attachShadow({ mode: 'open' });
|
| 4 |
+
this.shadowRoot.innerHTML = `
|
| 5 |
+
<style>
|
| 6 |
+
button {
|
| 7 |
+
position: relative;
|
| 8 |
+
background: transparent;
|
| 9 |
+
color: var(--neon-primary);
|
| 10 |
+
border: 2px solid var(--neon-primary);
|
| 11 |
+
padding: 1rem 2.5rem;
|
| 12 |
+
font-size: 1rem;
|
| 13 |
+
font-weight: 500;
|
| 14 |
+
text-transform: uppercase;
|
| 15 |
+
letter-spacing: 0.1em;
|
| 16 |
+
cursor: pointer;
|
| 17 |
+
transition: all 0.3s ease;
|
| 18 |
+
overflow: hidden;
|
| 19 |
+
z-index: 1;
|
| 20 |
+
}
|
| 21 |
+
|
| 22 |
+
button:hover {
|
| 23 |
+
color: var(--bg-dark);
|
| 24 |
+
box-shadow: 0 0 10px var(--neon-primary),
|
| 25 |
+
0 0 20px var(--neon-primary),
|
| 26 |
+
0 0 40px var(--neon-primary);
|
| 27 |
+
}
|
| 28 |
+
|
| 29 |
+
button::before {
|
| 30 |
+
content: '';
|
| 31 |
+
position: absolute;
|
| 32 |
+
top: 0;
|
| 33 |
+
left: -100%;
|
| 34 |
+
width: 100%;
|
| 35 |
+
height: 100%;
|
| 36 |
+
background: linear-gradient(90deg, transparent, var(--neon-primary), transparent);
|
| 37 |
+
transition: 0.5s;
|
| 38 |
+
z-index: -1;
|
| 39 |
+
}
|
| 40 |
+
|
| 41 |
+
button:hover::before {
|
| 42 |
+
left: 100%;
|
| 43 |
+
}
|
| 44 |
+
|
| 45 |
+
.icon {
|
| 46 |
+
margin-right: 0.5rem;
|
| 47 |
+
vertical-align: middle;
|
| 48 |
+
}
|
| 49 |
+
</style>
|
| 50 |
+
<button>
|
| 51 |
+
<i data-feather="${this.getAttribute('icon')}" class="icon"></i>
|
| 52 |
+
<slot></slot>
|
| 53 |
+
</button>
|
| 54 |
+
`;
|
| 55 |
+
feather.replace();
|
| 56 |
+
}
|
| 57 |
+
}
|
| 58 |
+
customElements.define('neon-button', NeonButton);
|
components/podcast-player.js
CHANGED
|
@@ -4,13 +4,31 @@ class PodcastPlayer extends HTMLElement {
|
|
| 4 |
this.shadowRoot.innerHTML = `
|
| 5 |
<style>
|
| 6 |
.player-container {
|
| 7 |
-
background:
|
| 8 |
-
border
|
| 9 |
-
|
| 10 |
-
|
| 11 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 12 |
}
|
| 13 |
-
|
| 14 |
display: flex;
|
| 15 |
align-items: center;
|
| 16 |
margin-bottom: 1rem;
|
|
|
|
| 4 |
this.shadowRoot.innerHTML = `
|
| 5 |
<style>
|
| 6 |
.player-container {
|
| 7 |
+
background: rgba(10, 10, 20, 0.8);
|
| 8 |
+
border: 1px solid rgba(0, 240, 255, 0.2);
|
| 9 |
+
border-radius: 0;
|
| 10 |
+
padding: 2rem;
|
| 11 |
+
color: var(--text-primary);
|
| 12 |
+
margin-top: 3rem;
|
| 13 |
+
backdrop-filter: blur(10px);
|
| 14 |
+
box-shadow: 0 0 30px rgba(0, 240, 255, 0.1);
|
| 15 |
+
position: relative;
|
| 16 |
+
overflow: hidden;
|
| 17 |
+
}
|
| 18 |
+
|
| 19 |
+
.player-container::before {
|
| 20 |
+
content: '';
|
| 21 |
+
position: absolute;
|
| 22 |
+
top: -2px;
|
| 23 |
+
left: -2px;
|
| 24 |
+
right: -2px;
|
| 25 |
+
bottom: -2px;
|
| 26 |
+
background: linear-gradient(45deg, var(--neon-primary), var(--neon-secondary));
|
| 27 |
+
z-index: -1;
|
| 28 |
+
filter: blur(5px);
|
| 29 |
+
opacity: 0.3;
|
| 30 |
}
|
| 31 |
+
.player-header {
|
| 32 |
display: flex;
|
| 33 |
align-items: center;
|
| 34 |
margin-bottom: 1rem;
|
index.html
CHANGED
|
@@ -30,13 +30,13 @@
|
|
| 30 |
</head>
|
| 31 |
<body class="bg-gray-50 dark:bg-gray-900 min-h-screen">
|
| 32 |
<custom-navbar></custom-navbar>
|
| 33 |
-
|
| 34 |
-
<main class="container mx-auto px-4 py-
|
| 35 |
-
<section class="text-center mb-
|
| 36 |
-
<h1 class="text-
|
| 37 |
-
|
| 38 |
</h1>
|
| 39 |
-
|
| 40 |
Transform any content into digestible knowledge with AI-powered summaries, mind maps, and podcast-style audio overviews.
|
| 41 |
</p>
|
| 42 |
</section>
|
|
@@ -44,10 +44,8 @@
|
|
| 44 |
<section class="max-w-4xl mx-auto bg-white dark:bg-gray-800 rounded-xl shadow-lg p-6 mb-16">
|
| 45 |
<div class="flex flex-col md:flex-row gap-4 mb-6">
|
| 46 |
<div class="relative flex-1">
|
| 47 |
-
|
| 48 |
-
|
| 49 |
-
</button>
|
| 50 |
-
<input type="file" class="absolute inset-0 w-full h-full opacity-0 cursor-pointer" accept=".pdf,.docx,.pptx,.mp3,.mp4,.jpg,.png" multiple>
|
| 51 |
</div>
|
| 52 |
<div class="flex-1">
|
| 53 |
<input type="text" placeholder="Enter YouTube/Article URL" class="w-full py-3 px-4 rounded-lg bg-gray-100 dark:bg-gray-700 hover:bg-gray-200 dark:hover:bg-gray-600 font-medium transition focus:outline-none focus:ring-2 focus:ring-primary-500">
|
|
|
|
| 30 |
</head>
|
| 31 |
<body class="bg-gray-50 dark:bg-gray-900 min-h-screen">
|
| 32 |
<custom-navbar></custom-navbar>
|
| 33 |
+
<div class="scanlines"></div>
|
| 34 |
+
<main class="container mx-auto px-4 py-12 max-w-7xl">
|
| 35 |
+
<section class="text-center mb-20">
|
| 36 |
+
<h1 class="text-5xl md:text-7xl font-bold bg-gradient-to-r from-cyan-400 to-purple-500 bg-clip-text text-transparent mb-6 animate-neon-glow">
|
| 37 |
+
<span class="inline-block animate-float">NEURAL</span> <span class="inline-block animate-float delay-100">SYNTHESIS</span>
|
| 38 |
</h1>
|
| 39 |
+
<p class="text-xl text-gray-600 dark:text-gray-300 max-w-3xl mx-auto">
|
| 40 |
Transform any content into digestible knowledge with AI-powered summaries, mind maps, and podcast-style audio overviews.
|
| 41 |
</p>
|
| 42 |
</section>
|
|
|
|
| 44 |
<section class="max-w-4xl mx-auto bg-white dark:bg-gray-800 rounded-xl shadow-lg p-6 mb-16">
|
| 45 |
<div class="flex flex-col md:flex-row gap-4 mb-6">
|
| 46 |
<div class="relative flex-1">
|
| 47 |
+
<neon-button icon="upload">Upload File</neon-button>
|
| 48 |
+
<input type="file" class="absolute inset-0 w-full h-full opacity-0 cursor-pointer" accept=".pdf,.docx,.pptx,.mp3,.mp4,.jpg,.png" multiple>
|
|
|
|
|
|
|
| 49 |
</div>
|
| 50 |
<div class="flex-1">
|
| 51 |
<input type="text" placeholder="Enter YouTube/Article URL" class="w-full py-3 px-4 rounded-lg bg-gray-100 dark:bg-gray-700 hover:bg-gray-200 dark:hover:bg-gray-600 font-medium transition focus:outline-none focus:ring-2 focus:ring-primary-500">
|
script.js
CHANGED
|
@@ -1,4 +1,69 @@
|
|
| 1 |
-
|
|
|
|
| 2 |
document.addEventListener('DOMContentLoaded', () => {
|
| 3 |
-
|
| 4 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
|
| 2 |
+
// Futuristic cursor effect
|
| 3 |
document.addEventListener('DOMContentLoaded', () => {
|
| 4 |
+
// Create custom cursor
|
| 5 |
+
const cursor = document.createElement('div');
|
| 6 |
+
cursor.style.position = 'fixed';
|
| 7 |
+
cursor.style.width = '20px';
|
| 8 |
+
cursor.style.height = '20px';
|
| 9 |
+
cursor.style.borderRadius = '50%';
|
| 10 |
+
cursor.style.backgroundColor = 'rgba(0, 240, 255, 0.5)';
|
| 11 |
+
cursor.style.pointerEvents = 'none';
|
| 12 |
+
cursor.style.zIndex = '9999';
|
| 13 |
+
cursor.style.transform = 'translate(-50%, -50%)';
|
| 14 |
+
cursor.style.mixBlendMode = 'exclusion';
|
| 15 |
+
cursor.style.transition = 'transform 0.1s ease, width 0.3s ease, height 0.3s ease';
|
| 16 |
+
document.body.appendChild(cursor);
|
| 17 |
+
|
| 18 |
+
// Create cursor trail
|
| 19 |
+
const trail = document.createElement('div');
|
| 20 |
+
trail.style.position = 'fixed';
|
| 21 |
+
trail.style.width = '40px';
|
| 22 |
+
trail.style.height = '40px';
|
| 23 |
+
trail.style.borderRadius = '50%';
|
| 24 |
+
trail.style.border = '1px solid rgba(0, 240, 255, 0.3)';
|
| 25 |
+
trail.style.pointerEvents = 'none';
|
| 26 |
+
trail.style.zIndex = '9998';
|
| 27 |
+
trail.style.transform = 'translate(-50%, -50%)';
|
| 28 |
+
trail.style.transition = 'transform 0.4s ease, opacity 0.4s ease';
|
| 29 |
+
document.body.appendChild(trail);
|
| 30 |
+
|
| 31 |
+
document.addEventListener('mousemove', (e) => {
|
| 32 |
+
cursor.style.left = `${e.clientX}px`;
|
| 33 |
+
cursor.style.top = `${e.clientY}px`;
|
| 34 |
+
|
| 35 |
+
setTimeout(() => {
|
| 36 |
+
trail.style.left = `${e.clientX}px`;
|
| 37 |
+
trail.style.top = `${e.clientY}px`;
|
| 38 |
+
trail.style.opacity = '1';
|
| 39 |
+
}, 100);
|
| 40 |
+
});
|
| 41 |
+
|
| 42 |
+
document.addEventListener('mouseleave', () => {
|
| 43 |
+
trail.style.opacity = '0';
|
| 44 |
+
});
|
| 45 |
+
|
| 46 |
+
document.addEventListener('mousedown', () => {
|
| 47 |
+
cursor.style.width = '15px';
|
| 48 |
+
cursor.style.height = '15px';
|
| 49 |
+
});
|
| 50 |
+
|
| 51 |
+
document.addEventListener('mouseup', () => {
|
| 52 |
+
cursor.style.width = '20px';
|
| 53 |
+
cursor.style.height = '20px';
|
| 54 |
+
});
|
| 55 |
+
|
| 56 |
+
// Add hover effects
|
| 57 |
+
const hoverElements = document.querySelectorAll('a, button, [data-hover]');
|
| 58 |
+
hoverElements.forEach(el => {
|
| 59 |
+
el.addEventListener('mouseenter', () => {
|
| 60 |
+
cursor.style.width = '40px';
|
| 61 |
+
cursor.style.height = '40px';
|
| 62 |
+
cursor.style.backgroundColor = 'rgba(255, 0, 240, 0.7)';
|
| 63 |
+
});
|
| 64 |
+
el.addEventListener('mouseleave', () => {
|
| 65 |
+
cursor.style.width = '20px';
|
| 66 |
+
cursor.style.height = '20px';
|
| 67 |
+
cursor.style.backgroundColor = 'rgba(0, 240, 255, 0.5)';
|
| 68 |
+
});
|
| 69 |
+
});
|
style.css
CHANGED
|
@@ -1,10 +1,55 @@
|
|
| 1 |
@import url('https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&display=swap');
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 2 |
|
| 3 |
body {
|
| 4 |
-
|
| 5 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 6 |
}
|
| 7 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 8 |
/* Custom scrollbar */
|
| 9 |
::-webkit-scrollbar {
|
| 10 |
width: 8px;
|
|
|
|
| 1 |
@import url('https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&display=swap');
|
| 2 |
+
:root {
|
| 3 |
+
--neon-primary: #00f0ff;
|
| 4 |
+
--neon-secondary: #ff00f0;
|
| 5 |
+
--bg-dark: #0a0a12;
|
| 6 |
+
--bg-light: #f5f5ff;
|
| 7 |
+
--text-primary: #e0e0ff;
|
| 8 |
+
--text-secondary: #a0a0c0;
|
| 9 |
+
}
|
| 10 |
|
| 11 |
body {
|
| 12 |
+
font-family: 'Inter', system-ui, -apple-system, sans-serif;
|
| 13 |
+
background: var(--bg-dark);
|
| 14 |
+
color: var(--text-primary);
|
| 15 |
+
transition: all 0.4s cubic-bezier(0.16, 1, 0.3, 1);
|
| 16 |
+
line-height: 1.6;
|
| 17 |
+
overflow-x: hidden;
|
| 18 |
+
}
|
| 19 |
+
|
| 20 |
+
@keyframes neon-glow {
|
| 21 |
+
0%, 100% { text-shadow: 0 0 10px var(--neon-primary), 0 0 20px var(--neon-primary); }
|
| 22 |
+
50% { text-shadow: 0 0 5px var(--neon-primary), 0 0 10px var(--neon-primary); }
|
| 23 |
+
}
|
| 24 |
+
|
| 25 |
+
@keyframes float {
|
| 26 |
+
0%, 100% { transform: translateY(0); }
|
| 27 |
+
50% { transform: translateY(-10px); }
|
| 28 |
+
}
|
| 29 |
+
|
| 30 |
+
@keyframes scanline {
|
| 31 |
+
0% { background-position: 0 -100vh; }
|
| 32 |
+
100% { background-position: 0 100vh; }
|
| 33 |
}
|
| 34 |
|
| 35 |
+
.scanlines {
|
| 36 |
+
position: fixed;
|
| 37 |
+
top: 0;
|
| 38 |
+
left: 0;
|
| 39 |
+
width: 100%;
|
| 40 |
+
height: 100%;
|
| 41 |
+
background: linear-gradient(
|
| 42 |
+
to bottom,
|
| 43 |
+
transparent 95%,
|
| 44 |
+
rgba(0, 240, 255, 0.05) 96%,
|
| 45 |
+
transparent 97%
|
| 46 |
+
);
|
| 47 |
+
background-size: 100% 8px;
|
| 48 |
+
pointer-events: none;
|
| 49 |
+
z-index: 9999;
|
| 50 |
+
animation: scanline 4s linear infinite;
|
| 51 |
+
mix-blend-mode: overlay;
|
| 52 |
+
}
|
| 53 |
/* Custom scrollbar */
|
| 54 |
::-webkit-scrollbar {
|
| 55 |
width: 8px;
|