cab566 commited on
Commit
1c35719
·
verified ·
1 Parent(s): fa004c4

Project Overview Create a personal, semi-professional landing page for Alec Brewer that showcases professional achievements, projects, aspirations, and various content feeds in a clean, minimalist design. The page should function as a central hub for professional identity and creative pursuits. Core Website Sections Hero Section: Name, professional title ("Developer • Creator • Innovator"), brief introduction, and call-to-action buttons About Section: Professional background, skills list with tags, and brief personal description Projects/GitHub Section: Dynamic display of repositories with filtering options by technology (web, mobile, other) Apple Music Section: Embeddable playlist widgets showcasing curated music collections Blog Posts Section: Recent articles with thumbnails, excerpts, and publication dates LinkedIn Updates: Professional posts and career highlights Affiliate Links: Recommended products/tools with proper disclosure Contact Form: Name, email, message fields with form validation Design Specifications Style: Minimalist and clean with ample white space Color Scheme: Primary (#3a86ff), Secondary (#8338ec), Accent (#ff006e), Dark (#1a1a2e), Light (#ffffff) Typography: 'Inter' as primary font with responsive sizing Layout: Container-based with max-width 1200px Components: Card-based UI for projects, blog posts, and other content items Responsive: Fully responsive across all device sizes with strategic breakpoints Visual Elements: Subtle animations on scroll, gradient accents, and interactive hover effects Technical Requirements Frontend Only: Pure HTML, CSS, and vanilla JavaScript (no frameworks) External API Integration: GitHub API, potentially Apple Music API Dynamic Content: JavaScript-loaded content for repositories, playlists, and feed items Interactive Elements: Project filters, mobile navigation toggle, contact form validation Directory Structure: Organized into css/, js/, and images/ subdirectories Performance: Image optimization, lazy loading for media content Notes and Considerations The page should load dynamically to show "loading" states before content appears Include proper disclosure for affiliate links Ensure all external links have proper security attributes (rel="noopener noreferrer") Add features to filter and sort project repositories Consider dark/light mode toggle with local storage for user preference Ensure the design maintains professional appearance while showcasing personality - Initial Deployment

Browse files
Files changed (2) hide show
  1. README.md +7 -5
  2. index.html +746 -19
README.md CHANGED
@@ -1,10 +1,12 @@
1
  ---
2
- title: Brewer Bio
3
- emoji: 🌖
4
- colorFrom: pink
5
- colorTo: green
6
  sdk: static
7
  pinned: false
 
 
8
  ---
9
 
10
- Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
 
1
  ---
2
+ title: brewer-bio
3
+ emoji: 🐳
4
+ colorFrom: red
5
+ colorTo: red
6
  sdk: static
7
  pinned: false
8
+ tags:
9
+ - deepsite
10
  ---
11
 
12
+ Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
index.html CHANGED
@@ -1,19 +1,746 @@
1
- <!doctype html>
2
- <html>
3
- <head>
4
- <meta charset="utf-8" />
5
- <meta name="viewport" content="width=device-width" />
6
- <title>My static Space</title>
7
- <link rel="stylesheet" href="style.css" />
8
- </head>
9
- <body>
10
- <div class="card">
11
- <h1>Welcome to your static Space!</h1>
12
- <p>You can modify this app directly by editing <i>index.html</i> in the Files and versions tab.</p>
13
- <p>
14
- Also don't forget to check the
15
- <a href="https://huggingface.co/docs/hub/spaces" target="_blank">Spaces documentation</a>.
16
- </p>
17
- </div>
18
- </body>
19
- </html>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!DOCTYPE html>
2
+ <html lang="en" class="scroll-smooth">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <title>Alec Brewer | Developer • Creator • Innovator</title>
7
+ <script src="https://cdn.tailwindcss.com"></script>
8
+ <script>
9
+ tailwind.config = {
10
+ theme: {
11
+ extend: {
12
+ colors: {
13
+ primary: '#3a86ff',
14
+ secondary: '#8338ec',
15
+ accent: '#ff006e',
16
+ dark: '#1a1a2e',
17
+ light: '#ffffff',
18
+ },
19
+ fontFamily: {
20
+ sans: ['Inter', 'sans-serif'],
21
+ },
22
+ }
23
+ }
24
+ }
25
+ </script>
26
+ <link rel="preconnect" href="https://fonts.googleapis.com">
27
+ <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
28
+ <link href="https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&display=swap" rel="stylesheet">
29
+ <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">
30
+ <style>
31
+ /* Custom CSS for elements that can't be done with Tailwind */
32
+ .gradient-text {
33
+ background: linear-gradient(90deg, #3a86ff, #8338ec, #ff006e);
34
+ -webkit-background-clip: text;
35
+ background-clip: text;
36
+ color: transparent;
37
+ }
38
+
39
+ .card-hover {
40
+ transition: all 0.3s ease;
41
+ }
42
+
43
+ .card-hover:hover {
44
+ transform: translateY(-5px);
45
+ box-shadow: 0 10px 25px rgba(0, 0, 0, 0.1);
46
+ }
47
+
48
+ .fade-in {
49
+ animation: fadeIn 0.5s ease-in;
50
+ }
51
+
52
+ @keyframes fadeIn {
53
+ from { opacity: 0; }
54
+ to { opacity: 1; }
55
+ }
56
+
57
+ .loading-spinner {
58
+ border: 3px solid rgba(255, 255, 255, 0.3);
59
+ border-radius: 50%;
60
+ border-top: 3px solid #3a86ff;
61
+ width: 30px;
62
+ height: 30px;
63
+ animation: spin 1s linear infinite;
64
+ }
65
+
66
+ @keyframes spin {
67
+ 0% { transform: rotate(0deg); }
68
+ 100% { transform: rotate(360deg); }
69
+ }
70
+
71
+ /* Dark mode styles */
72
+ .dark {
73
+ background-color: #1a1a2e;
74
+ color: #ffffff;
75
+ }
76
+
77
+ .dark .bg-white {
78
+ background-color: #16213e !important;
79
+ color: #ffffff !important;
80
+ }
81
+
82
+ .dark .text-gray-800 {
83
+ color: #ffffff !important;
84
+ }
85
+
86
+ .dark .border-gray-200 {
87
+ border-color: #2d3748 !important;
88
+ }
89
+ </style>
90
+ </head>
91
+ <body class="font-sans bg-gray-50 text-gray-800 transition-colors duration-300">
92
+ <!-- Navigation -->
93
+ <nav class="bg-white shadow-sm sticky top-0 z-50 dark:bg-dark">
94
+ <div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
95
+ <div class="flex justify-between h-16">
96
+ <div class="flex items-center">
97
+ <a href="#" class="text-xl font-bold gradient-text">Alec Brewer</a>
98
+ </div>
99
+ <div class="hidden md:flex items-center space-x-8">
100
+ <a href="#about" class="text-gray-700 hover:text-primary transition dark:text-gray-300">About</a>
101
+ <a href="#projects" class="text-gray-700 hover:text-primary transition dark:text-gray-300">Projects</a>
102
+ <a href="#music" class="text-gray-700 hover:text-primary transition dark:text-gray-300">Music</a>
103
+ <a href="#blog" class="text-gray-700 hover:text-primary transition dark:text-gray-300">Blog</a>
104
+ <a href="#contact" class="text-gray-700 hover:text-primary transition dark:text-gray-300">Contact</a>
105
+ <button id="theme-toggle" class="p-2 rounded-full hover:bg-gray-100 dark:hover:bg-gray-700">
106
+ <i class="fas fa-moon dark:hidden"></i>
107
+ <i class="fas fa-sun hidden dark:block"></i>
108
+ </button>
109
+ </div>
110
+ <div class="md:hidden flex items-center">
111
+ <button id="mobile-menu-button" class="p-2 rounded-md text-gray-700 dark:text-gray-300">
112
+ <i class="fas fa-bars"></i>
113
+ </button>
114
+ </div>
115
+ </div>
116
+ </div>
117
+
118
+ <!-- Mobile menu -->
119
+ <div id="mobile-menu" class="hidden md:hidden bg-white dark:bg-dark shadow-lg">
120
+ <div class="px-2 pt-2 pb-3 space-y-1 sm:px-3">
121
+ <a href="#about" class="block px-3 py-2 rounded-md text-base font-medium text-gray-700 hover:text-primary hover:bg-gray-50 dark:text-gray-300 dark:hover:bg-gray-700">About</a>
122
+ <a href="#projects" class="block px-3 py-2 rounded-md text-base font-medium text-gray-700 hover:text-primary hover:bg-gray-50 dark:text-gray-300 dark:hover:bg-gray-700">Projects</a>
123
+ <a href="#music" class="block px-3 py-2 rounded-md text-base font-medium text-gray-700 hover:text-primary hover:bg-gray-50 dark:text-gray-300 dark:hover:bg-gray-700">Music</a>
124
+ <a href="#blog" class="block px-3 py-2 rounded-md text-base font-medium text-gray-700 hover:text-primary hover:bg-gray-50 dark:text-gray-300 dark:hover:bg-gray-700">Blog</a>
125
+ <a href="#contact" class="block px-3 py-2 rounded-md text-base font-medium text-gray-700 hover:text-primary hover:bg-gray-50 dark:text-gray-300 dark:hover:bg-gray-700">Contact</a>
126
+ <button id="theme-toggle-mobile" class="block w-full text-left px-3 py-2 rounded-md text-base font-medium text-gray-700 hover:text-primary hover:bg-gray-50 dark:text-gray-300 dark:hover:bg-gray-700">
127
+ Toggle Dark Mode
128
+ </button>
129
+ </div>
130
+ </div>
131
+ </nav>
132
+
133
+ <!-- Hero Section -->
134
+ <section class="py-20 bg-gradient-to-r from-primary to-secondary text-white">
135
+ <div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
136
+ <div class="md:flex items-center justify-between">
137
+ <div class="md:w-1/2 mb-10 md:mb-0 fade-in">
138
+ <h1 class="text-4xl md:text-5xl font-bold mb-4">Alec Brewer</h1>
139
+ <h2 class="text-2xl md:text-3xl font-semibold mb-6">Developer • Creator • Innovator</h2>
140
+ <p class="text-lg mb-8 opacity-90">Building digital experiences that inspire and solve real-world problems through clean code and thoughtful design.</p>
141
+ <div class="flex space-x-4">
142
+ <a href="#projects" class="bg-white text-primary px-6 py-3 rounded-lg font-medium hover:bg-opacity-90 transition">View Work</a>
143
+ <a href="#contact" class="border-2 border-white text-white px-6 py-3 rounded-lg font-medium hover:bg-white hover:bg-opacity-10 transition">Get In Touch</a>
144
+ </div>
145
+ </div>
146
+ <div class="md:w-1/2 flex justify-center fade-in">
147
+ <div class="relative w-64 h-64 md:w-80 md:h-80 rounded-full bg-white bg-opacity-20 flex items-center justify-center">
148
+ <div class="absolute inset-0 rounded-full border-4 border-white border-opacity-30 animate-ping"></div>
149
+ <div class="absolute inset-4 rounded-full border-4 border-white border-opacity-20 animate-ping" style="animation-delay: 0.2s;"></div>
150
+ <div class="absolute inset-8 rounded-full border-4 border-white border-opacity-10 animate-ping" style="animation-delay: 0.4s;"></div>
151
+ <div class="bg-white w-48 h-48 md:w-60 md:h-60 rounded-full flex items-center justify-center overflow-hidden">
152
+ <img src="https://images.unsplash.com/photo-1570295999919-56ceb5ecca61?ixlib=rb-4.0.3&ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&auto=format&fit=crop&w=880&q=80" alt="Alec Brewer" class="w-full h-full object-cover">
153
+ </div>
154
+ </div>
155
+ </div>
156
+ </div>
157
+ </div>
158
+ </section>
159
+
160
+ <!-- About Section -->
161
+ <section id="about" class="py-20 bg-white dark:bg-dark">
162
+ <div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
163
+ <h2 class="text-3xl font-bold text-center mb-12 gradient-text">About Me</h2>
164
+
165
+ <div class="md:flex items-start space-y-8 md:space-y-0 md:space-x-12">
166
+ <div class="md:w-1/2">
167
+ <h3 class="text-2xl font-semibold mb-4">Professional Background</h3>
168
+ <p class="text-gray-600 dark:text-gray-300 mb-6 leading-relaxed">
169
+ With over 8 years of experience in software development, I've worked with startups and Fortune 500 companies to build scalable, user-friendly applications. My journey began with web development and has since expanded to mobile apps, cloud architecture, and emerging technologies.
170
+ </p>
171
+ <p class="text-gray-600 dark:text-gray-300 mb-6 leading-relaxed">
172
+ I'm passionate about creating solutions that bridge the gap between technology and human needs. When I'm not coding, you can find me mentoring junior developers, contributing to open-source projects, or exploring new frameworks and languages.
173
+ </p>
174
+ <div class="flex space-x-4">
175
+ <a href="#" class="flex items-center text-primary hover:text-secondary transition">
176
+ <i class="fab fa-linkedin text-xl mr-2"></i>
177
+ LinkedIn
178
+ </a>
179
+ <a href="#" class="flex items-center text-primary hover:text-secondary transition">
180
+ <i class="fab fa-github text-xl mr-2"></i>
181
+ GitHub
182
+ </a>
183
+ <a href="#" class="flex items-center text-primary hover:text-secondary transition">
184
+ <i class="fas fa-file-alt text-xl mr-2"></i>
185
+ Resume
186
+ </a>
187
+ </div>
188
+ </div>
189
+
190
+ <div class="md:w-1/2">
191
+ <h3 class="text-2xl font-semibold mb-4">Skills & Expertise</h3>
192
+ <div class="flex flex-wrap gap-3 mb-8">
193
+ <span class="px-4 py-2 bg-gray-100 dark:bg-gray-700 rounded-full text-sm font-medium">JavaScript</span>
194
+ <span class="px-4 py-2 bg-gray-100 dark:bg-gray-700 rounded-full text-sm font-medium">TypeScript</span>
195
+ <span class="px-4 py-2 bg-gray-100 dark:bg-gray-700 rounded-full text-sm font-medium">React</span>
196
+ <span class="px-4 py-2 bg-gray-100 dark:bg-gray-700 rounded-full text-sm font-medium">Node.js</span>
197
+ <span class="px-4 py-2 bg-gray-100 dark:bg-gray-700 rounded-full text-sm font-medium">Python</span>
198
+ <span class="px-4 py-2 bg-gray-100 dark:bg-gray-700 rounded-full text-sm font-medium">AWS</span>
199
+ <span class="px-4 py-2 bg-gray-100 dark:bg-gray-700 rounded-full text-sm font-medium">Docker</span>
200
+ <span class="px-4 py-2 bg-gray-100 dark:bg-gray-700 rounded-full text-sm font-medium">GraphQL</span>
201
+ <span class="px-4 py-2 bg-gray-100 dark:bg-gray-700 rounded-full text-sm font-medium">Swift</span>
202
+ <span class="px-4 py-2 bg-gray-100 dark:bg-gray-700 rounded-full text-sm font-medium">Kotlin</span>
203
+ <span class="px-4 py-2 bg-gray-100 dark:bg-gray-700 rounded-full text-sm font-medium">UI/UX Design</span>
204
+ <span class="px-4 py-2 bg-gray-100 dark:bg-gray-700 rounded-full text-sm font-medium">CI/CD</span>
205
+ </div>
206
+
207
+ <h3 class="text-2xl font-semibold mb-4">Currently Learning</h3>
208
+ <div class="flex flex-wrap gap-3">
209
+ <span class="px-4 py-2 bg-gray-100 dark:bg-gray-700 rounded-full text-sm font-medium border border-primary">Rust</span>
210
+ <span class="px-4 py-2 bg-gray-100 dark:bg-gray-700 rounded-full text-sm font-medium border border-primary">WebAssembly</span>
211
+ <span class="px-4 py-2 bg-gray-100 dark:bg-gray-700 rounded-full text-sm font-medium border border-primary">Machine Learning</span>
212
+ </div>
213
+ </div>
214
+ </div>
215
+ </div>
216
+ </section>
217
+
218
+ <!-- Projects Section -->
219
+ <section id="projects" class="py-20 bg-gray-50 dark:bg-gray-900">
220
+ <div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
221
+ <h2 class="text-3xl font-bold text-center mb-12 gradient-text">My Projects</h2>
222
+
223
+ <div class="flex justify-center mb-8">
224
+ <div class="inline-flex rounded-md shadow-sm" role="group">
225
+ <button type="button" data-filter="all" class="project-filter px-4 py-2 text-sm font-medium rounded-l-lg bg-primary text-white">
226
+ All Projects
227
+ </button>
228
+ <button type="button" data-filter="web" class="project-filter px-4 py-2 text-sm font-medium bg-white dark:bg-gray-800 text-gray-700 dark:text-gray-300 hover:bg-gray-50">
229
+ Web
230
+ </button>
231
+ <button type="button" data-filter="mobile" class="project-filter px-4 py-2 text-sm font-medium bg-white dark:bg-gray-800 text-gray-700 dark:text-gray-300 hover:bg-gray-50">
232
+ Mobile
233
+ </button>
234
+ <button type="button" data-filter="other" class="project-filter px-4 py-2 text-sm font-medium rounded-r-lg bg-white dark:bg-gray-800 text-gray-700 dark:text-gray-300 hover:bg-gray-50">
235
+ Other
236
+ </button>
237
+ </div>
238
+ </div>
239
+
240
+ <div id="projects-loading" class="flex justify-center items-center py-20">
241
+ <div class="loading-spinner"></div>
242
+ </div>
243
+
244
+ <div id="projects-container" class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-8">
245
+ <!-- Projects will be loaded here via JavaScript -->
246
+ </div>
247
+ </div>
248
+ </section>
249
+
250
+ <!-- Music Section -->
251
+ <section id="music" class="py-20 bg-white dark:bg-dark">
252
+ <div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
253
+ <h2 class="text-3xl font-bold text-center mb-12 gradient-text">Music I Love</h2>
254
+ <p class="text-center text-gray-600 dark:text-gray-300 max-w-3xl mx-auto mb-12">
255
+ Music fuels my creativity. Here are some of my favorite playlists that keep me inspired while coding, designing, and creating.
256
+ </p>
257
+
258
+ <div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-8">
259
+ <div class="bg-gray-50 dark:bg-gray-800 rounded-xl overflow-hidden shadow-md card-hover">
260
+ <div class="h-48 bg-gradient-to-r from-accent to-secondary flex items-center justify-center">
261
+ <i class="fas fa-music text-white text-6xl"></i>
262
+ </div>
263
+ <div class="p-6">
264
+ <h3 class="text-xl font-bold mb-2">Coding Focus</h3>
265
+ <p class="text-gray-600 dark:text-gray-300 mb-4">Instrumental beats to help you concentrate and enter the flow state.</p>
266
+ <a href="#" class="text-primary hover:text-secondary font-medium flex items-center">
267
+ <i class="fab fa-apple mr-2"></i> Listen on Apple Music
268
+ </a>
269
+ </div>
270
+ </div>
271
+
272
+ <div class="bg-gray-50 dark:bg-gray-800 rounded-xl overflow-hidden shadow-md card-hover">
273
+ <div class="h-48 bg-gradient-to-r from-primary to-accent flex items-center justify-center">
274
+ <i class="fas fa-headphones text-white text-6xl"></i>
275
+ </div>
276
+ <div class="p-6">
277
+ <h3 class="text-xl font-bold mb-2">Creative Energy</h3>
278
+ <p class="text-gray-600 dark:text-gray-300 mb-4">Upbeat tracks to spark inspiration during brainstorming sessions.</p>
279
+ <a href="#" class="text-primary hover:text-secondary font-medium flex items-center">
280
+ <i class="fab fa-apple mr-2"></i> Listen on Apple Music
281
+ </a>
282
+ </div>
283
+ </div>
284
+
285
+ <div class="bg-gray-50 dark:bg-gray-800 rounded-xl overflow-hidden shadow-md card-hover">
286
+ <div class="h-48 bg-gradient-to-r from-secondary to-primary flex items-center justify-center">
287
+ <i class="fas fa-compact-disc text-white text-6xl"></i>
288
+ </div>
289
+ <div class="p-6">
290
+ <h3 class="text-xl font-bold mb-2">Chill Vibes</h3>
291
+ <p class="text-gray-600 dark:text-gray-300 mb-4">Relaxing melodies for those late-night coding sessions.</p>
292
+ <a href="#" class="text-primary hover:text-secondary font-medium flex items-center">
293
+ <i class="fab fa-apple mr-2"></i> Listen on Apple Music
294
+ </a>
295
+ </div>
296
+ </div>
297
+ </div>
298
+ </div>
299
+ </section>
300
+
301
+ <!-- Blog Section -->
302
+ <section id="blog" class="py-20 bg-gray-50 dark:bg-gray-900">
303
+ <div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
304
+ <h2 class="text-3xl font-bold text-center mb-12 gradient-text">Latest Writings</h2>
305
+
306
+ <div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-8">
307
+ <div class="bg-white dark:bg-gray-800 rounded-xl overflow-hidden shadow-md card-hover">
308
+ <div class="h-48 bg-gradient-to-r from-primary to-secondary flex items-center justify-center">
309
+ <i class="fas fa-pen-fancy text-white text-6xl"></i>
310
+ </div>
311
+ <div class="p-6">
312
+ <div class="flex items-center text-sm text-gray-500 dark:text-gray-400 mb-2">
313
+ <span>June 15, 2023</span>
314
+ <span class="mx-2">•</span>
315
+ <span>5 min read</span>
316
+ </div>
317
+ <h3 class="text-xl font-bold mb-3">The Future of Web Development in 2023</h3>
318
+ <p class="text-gray-600 dark:text-gray-300 mb-4">Exploring emerging trends and technologies that are shaping the future of web development and how to stay ahead of the curve.</p>
319
+ <a href="#" class="text-primary hover:text-secondary font-medium">Read More →</a>
320
+ </div>
321
+ </div>
322
+
323
+ <div class="bg-white dark:bg-gray-800 rounded-xl overflow-hidden shadow-md card-hover">
324
+ <div class="h-48 bg-gradient-to-r from-accent to-primary flex items-center justify-center">
325
+ <i class="fas fa-code text-white text-6xl"></i>
326
+ </div>
327
+ <div class="p-6">
328
+ <div class="flex items-center text-sm text-gray-500 dark:text-gray-400 mb-2">
329
+ <span>May 28, 2023</span>
330
+ <span class="mx-2">•</span>
331
+ <span>8 min read</span>
332
+ </div>
333
+ <h3 class="text-xl font-bold mb-3">Optimizing React Performance</h3>
334
+ <p class="text-gray-600 dark:text-gray-300 mb-4">Practical techniques and patterns to significantly improve the performance of your React applications.</p>
335
+ <a href="#" class="text-primary hover:text-secondary font-medium">Read More →</a>
336
+ </div>
337
+ </div>
338
+
339
+ <div class="bg-white dark:bg-gray-800 rounded-xl overflow-hidden shadow-md card-hover">
340
+ <div class="h-48 bg-gradient-to-r from-secondary to-accent flex items-center justify-center">
341
+ <i class="fas fa-lightbulb text-white text-6xl"></i>
342
+ </div>
343
+ <div class="p-6">
344
+ <div class="flex items-center text-sm text-gray-500 dark:text-gray-400 mb-2">
345
+ <span>April 10, 2023</span>
346
+ <span class="mx-2">•</span>
347
+ <span>6 min read</span>
348
+ </div>
349
+ <h3 class="text-xl font-bold mb-3">Building a Developer Mindset</h3>
350
+ <p class="text-gray-600 dark:text-gray-300 mb-4">How to cultivate the problem-solving skills and mental frameworks that make great developers.</p>
351
+ <a href="#" class="text-primary hover:text-secondary font-medium">Read More →</a>
352
+ </div>
353
+ </div>
354
+ </div>
355
+
356
+ <div class="text-center mt-12">
357
+ <a href="#" class="inline-flex items-center px-6 py-3 border border-primary text-primary rounded-lg font-medium hover:bg-primary hover:text-white transition">
358
+ View All Articles
359
+ <i class="fas fa-arrow-right ml-2"></i>
360
+ </a>
361
+ </div>
362
+ </div>
363
+ </section>
364
+
365
+ <!-- Affiliate Section -->
366
+ <section class="py-20 bg-white dark:bg-dark">
367
+ <div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
368
+ <h2 class="text-3xl font-bold text-center mb-12 gradient-text">Tools I Recommend</h2>
369
+ <p class="text-center text-gray-600 dark:text-gray-300 max-w-3xl mx-auto mb-12">
370
+ These are products and services I genuinely use and recommend. Some links are affiliate links which means I may earn a commission if you purchase through them (at no extra cost to you).
371
+ </p>
372
+
373
+ <div class="grid grid-cols-1 md:grid-cols-3 gap-8">
374
+ <div class="bg-gray-50 dark:bg-gray-800 p-6 rounded-xl shadow-sm flex flex-col items-center text-center">
375
+ <div class="w-16 h-16 bg-primary bg-opacity-10 rounded-full flex items-center justify-center mb-4">
376
+ <i class="fas fa-laptop-code text-primary text-2xl"></i>
377
+ </div>
378
+ <h3 class="text-lg font-bold mb-2">DigitalOcean</h3>
379
+ <p class="text-gray-600 dark:text-gray-300 mb-4">Cloud hosting made simple with great developer experience.</p>
380
+ <a href="#" class="mt-auto text-primary hover:text-secondary font-medium">Get $100 credit →</a>
381
+ </div>
382
+
383
+ <div class="bg-gray-50 dark:bg-gray-800 p-6 rounded-xl shadow-sm flex flex-col items-center text-center">
384
+ <div class="w-16 h-16 bg-secondary bg-opacity-10 rounded-full flex items-center justify-center mb-4">
385
+ <i class="fas fa-keyboard text-secondary text-2xl"></i>
386
+ </div>
387
+ <h3 class="text-lg font-bold mb-2">Keychron Keyboards</h3>
388
+ <p class="text-gray-600 dark:text-gray-300 mb-4">Mechanical keyboards perfect for developers and writers.</p>
389
+ <a href="#" class="mt-auto text-primary hover:text-secondary font-medium">Shop Keyboards →</a>
390
+ </div>
391
+
392
+ <div class="bg-gray-50 dark:bg-gray-800 p-6 rounded-xl shadow-sm flex flex-col items-center text-center">
393
+ <div class="w-16 h-16 bg-accent bg-opacity-10 rounded-full flex items-center justify-center mb-4">
394
+ <i class="fas fa-book text-accent text-2xl"></i>
395
+ </div>
396
+ <h3 class="text-lg font-bold mb-2">O'Reilly Learning</h3>
397
+ <p class="text-gray-600 dark:text-gray-300 mb-4">The best technical books and video courses for developers.</p>
398
+ <a href="#" class="mt-auto text-primary hover:text-secondary font-medium">Start Learning ��</a>
399
+ </div>
400
+ </div>
401
+ </div>
402
+ </section>
403
+
404
+ <!-- Contact Section -->
405
+ <section id="contact" class="py-20 bg-gradient-to-r from-primary to-secondary text-white">
406
+ <div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
407
+ <h2 class="text-3xl font-bold text-center mb-12">Get In Touch</h2>
408
+
409
+ <div class="bg-white dark:bg-dark rounded-xl shadow-xl overflow-hidden max-w-4xl mx-auto">
410
+ <div class="md:flex">
411
+ <div class="md:w-1/2 bg-primary bg-opacity-10 p-8 md:p-12 flex flex-col justify-center">
412
+ <h3 class="text-2xl font-bold mb-4">Let's Connect</h3>
413
+ <p class="mb-6 opacity-90">Have a project in mind or want to discuss potential opportunities? Feel free to reach out!</p>
414
+
415
+ <div class="space-y-4">
416
+ <div class="flex items-center">
417
+ <i class="fas fa-envelope text-primary mr-4"></i>
418
+ <span>alec@example.com</span>
419
+ </div>
420
+ <div class="flex items-center">
421
+ <i class="fas fa-map-marker-alt text-primary mr-4"></i>
422
+ <span>San Francisco, CA</span>
423
+ </div>
424
+ <div class="flex items-center">
425
+ <i class="fas fa-phone-alt text-primary mr-4"></i>
426
+ <span>+1 (555) 123-4567</span>
427
+ </div>
428
+ </div>
429
+
430
+ <div class="mt-8 flex space-x-4">
431
+ <a href="#" class="w-10 h-10 rounded-full bg-white bg-opacity-20 flex items-center justify-center hover:bg-opacity-30 transition">
432
+ <i class="fab fa-twitter"></i>
433
+ </a>
434
+ <a href="#" class="w-10 h-10 rounded-full bg-white bg-opacity-20 flex items-center justify-center hover:bg-opacity-30 transition">
435
+ <i class="fab fa-github"></i>
436
+ </a>
437
+ <a href="#" class="w-10 h-10 rounded-full bg-white bg-opacity-20 flex items-center justify-center hover:bg-opacity-30 transition">
438
+ <i class="fab fa-linkedin-in"></i>
439
+ </a>
440
+ <a href="#" class="w-10 h-10 rounded-full bg-white bg-opacity-20 flex items-center justify-center hover:bg-opacity-30 transition">
441
+ <i class="fab fa-instagram"></i>
442
+ </a>
443
+ </div>
444
+ </div>
445
+
446
+ <div class="md:w-1/2 p-8 md:p-12 dark:bg-gray-800">
447
+ <form id="contact-form" class="space-y-6">
448
+ <div>
449
+ <label for="name" class="block text-sm font-medium text-gray-700 dark:text-gray-300 mb-1">Name</label>
450
+ <input type="text" id="name" name="name" class="w-full px-4 py-3 rounded-lg border border-gray-300 focus:ring-2 focus:ring-primary focus:border-primary outline-none transition dark:bg-gray-700 dark:border-gray-600">
451
+ <p id="name-error" class="mt-1 text-sm text-red-500 hidden">Please enter your name</p>
452
+ </div>
453
+
454
+ <div>
455
+ <label for="email" class="block text-sm font-medium text-gray-700 dark:text-gray-300 mb-1">Email</label>
456
+ <input type="email" id="email" name="email" class="w-full px-4 py-3 rounded-lg border border-gray-300 focus:ring-2 focus:ring-primary focus:border-primary outline-none transition dark:bg-gray-700 dark:border-gray-600">
457
+ <p id="email-error" class="mt-1 text-sm text-red-500 hidden">Please enter a valid email</p>
458
+ </div>
459
+
460
+ <div>
461
+ <label for="message" class="block text-sm font-medium text-gray-700 dark:text-gray-300 mb-1">Message</label>
462
+ <textarea id="message" name="message" rows="4" class="w-full px-4 py-3 rounded-lg border border-gray-300 focus:ring-2 focus:ring-primary focus:border-primary outline-none transition dark:bg-gray-700 dark:border-gray-600"></textarea>
463
+ <p id="message-error" class="mt-1 text-sm text-red-500 hidden">Please enter your message</p>
464
+ </div>
465
+
466
+ <button type="submit" class="w-full bg-primary hover:bg-primary-dark text-white font-medium py-3 px-6 rounded-lg transition flex items-center justify-center">
467
+ <span id="submit-text">Send Message</span>
468
+ <div id="submit-spinner" class="hidden ml-2">
469
+ <div class="loading-spinner" style="width: 20px; height: 20px; border-width: 2px;"></div>
470
+ </div>
471
+ </button>
472
+ </form>
473
+
474
+ <div id="form-success" class="hidden mt-4 p-4 bg-green-50 dark:bg-green-900 text-green-700 dark:text-green-100 rounded-lg">
475
+ <i class="fas fa-check-circle mr-2"></i> Your message has been sent successfully!
476
+ </div>
477
+ </div>
478
+ </div>
479
+ </div>
480
+ </div>
481
+ </section>
482
+
483
+ <!-- Footer -->
484
+ <footer class="bg-gray-900 text-white py-12">
485
+ <div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
486
+ <div class="md:flex md:items-center md:justify-between">
487
+ <div class="flex justify-center md:justify-start mb-8 md:mb-0">
488
+ <a href="#" class="text-xl font-bold gradient-text">Alec Brewer</a>
489
+ </div>
490
+
491
+ <div class="flex justify-center md:justify-end space-x-6">
492
+ <a href="#" class="text-gray-400 hover:text-white transition">
493
+ <i class="fab fa-github text-xl"></i>
494
+ </a>
495
+ <a href="#" class="text-gray-400 hover:text-white transition">
496
+ <i class="fab fa-linkedin text-xl"></i>
497
+ </a>
498
+ <a href="#" class="text-gray-400 hover:text-white transition">
499
+ <i class="fab fa-twitter text-xl"></i>
500
+ </a>
501
+ <a href="#" class="text-gray-400 hover:text-white transition">
502
+ <i class="fab fa-instagram text-xl"></i>
503
+ </a>
504
+ </div>
505
+ </div>
506
+
507
+ <div class="mt-8 pt-8 border-t border-gray-800 text-center md:text-left">
508
+ <p class="text-gray-400 text-sm">
509
+ &copy; 2023 Alec Brewer. All rights reserved.
510
+ </p>
511
+ </div>
512
+ </div>
513
+ </footer>
514
+
515
+ <script>
516
+ // Mobile menu toggle
517
+ const mobileMenuButton = document.getElementById('mobile-menu-button');
518
+ const mobileMenu = document.getElementById('mobile-menu');
519
+
520
+ mobileMenuButton.addEventListener('click', () => {
521
+ mobileMenu.classList.toggle('hidden');
522
+ });
523
+
524
+ // Theme toggle
525
+ const themeToggle = document.getElementById('theme-toggle');
526
+ const themeToggleMobile = document.getElementById('theme-toggle-mobile');
527
+
528
+ function toggleTheme() {
529
+ document.documentElement.classList.toggle('dark');
530
+ localStorage.setItem('darkMode', document.documentElement.classList.contains('dark'));
531
+ }
532
+
533
+ themeToggle.addEventListener('click', toggleTheme);
534
+ themeToggleMobile.addEventListener('click', toggleTheme);
535
+
536
+ // Check for saved theme preference
537
+ if (localStorage.getItem('darkMode') === 'true') {
538
+ document.documentElement.classList.add('dark');
539
+ }
540
+
541
+ // Project filtering
542
+ const projectFilters = document.querySelectorAll('.project-filter');
543
+
544
+ projectFilters.forEach(filter => {
545
+ filter.addEventListener('click', () => {
546
+ // Update active state
547
+ projectFilters.forEach(f => {
548
+ if (f === filter) {
549
+ f.classList.remove('bg-white', 'dark:bg-gray-800', 'text-gray-700', 'dark:text-gray-300');
550
+ f.classList.add('bg-primary', 'text-white');
551
+ } else {
552
+ f.classList.add('bg-white', 'dark:bg-gray-800', 'text-gray-700', 'dark:text-gray-300');
553
+ f.classList.remove('bg-primary', 'text-white');
554
+ }
555
+ });
556
+
557
+ // Filter projects (simulated here, would normally filter real data)
558
+ const filterValue = filter.getAttribute('data-filter');
559
+ console.log(`Filtering by: ${filterValue}`);
560
+ });
561
+ });
562
+
563
+ // Simulate loading projects from GitHub API
564
+ setTimeout(() => {
565
+ const projectsLoading = document.getElementById('projects-loading');
566
+ const projectsContainer = document.getElementById('projects-container');
567
+
568
+ projectsLoading.classList.add('hidden');
569
+
570
+ // Simulated project data (would normally come from GitHub API)
571
+ const projects = [
572
+ {
573
+ title: "E-Commerce Platform",
574
+ description: "A full-stack e-commerce solution with React, Node.js, and MongoDB.",
575
+ tags: ["web", "react", "node"],
576
+ stars: 42,
577
+ url: "#"
578
+ },
579
+ {
580
+ title: "Fitness Tracker App",
581
+ description: "Mobile application for tracking workouts and nutrition (React Native).",
582
+ tags: ["mobile", "react-native"],
583
+ stars: 28,
584
+ url: "#"
585
+ },
586
+ {
587
+ title: "Dev Tools CLI",
588
+ description: "Command line interface for common developer tasks built with Rust.",
589
+ tags: ["other", "rust"],
590
+ stars: 15,
591
+ url: "#"
592
+ },
593
+ {
594
+ title: "Portfolio Template",
595
+ description: "Open-source portfolio template for developers and designers.",
596
+ tags: ["web", "html", "css"],
597
+ stars: 76,
598
+ url: "#"
599
+ },
600
+ {
601
+ title: "Weather Dashboard",
602
+ description: "Real-time weather dashboard with interactive maps and forecasts.",
603
+ tags: ["web", "javascript", "api"],
604
+ stars: 33,
605
+ url: "#"
606
+ },
607
+ {
608
+ title: "AI Image Generator",
609
+ description: "Web interface for generating AI art with stable diffusion.",
610
+ tags: ["web", "python", "ai"],
611
+ stars: 91,
612
+ url: "#"
613
+ }
614
+ ];
615
+
616
+ projects.forEach(project => {
617
+ const projectCard = document.createElement('div');
618
+ projectCard.className = `bg-white dark:bg-gray-800 rounded-xl overflow-hidden shadow-md card-hover ${project.tags.includes('web') ? 'web' : ''} ${project.tags.includes('mobile') ? 'mobile' : ''} ${project.tags.includes('other') ? 'other' : ''}`;
619
+
620
+ projectCard.innerHTML = `
621
+ <div class="h-48 bg-gradient-to-r from-primary to-secondary flex items-center justify-center">
622
+ <i class="fas fa-code text-white text-6xl"></i>
623
+ </div>
624
+ <div class="p-6">
625
+ <h3 class="text-xl font-bold mb-2">${project.title}</h3>
626
+ <p class="text-gray-600 dark:text-gray-300 mb-4">${project.description}</p>
627
+ <div class="flex flex-wrap gap-2 mb-4">
628
+ ${project.tags.filter(tag => tag !== 'web' && tag !== 'mobile' && tag !== 'other').map(tag =>
629
+ `<span class="px-3 py-1 bg-gray-100 dark:bg-gray-700 rounded-full text-xs font-medium">${tag}</span>`
630
+ ).join('')}
631
+ </div>
632
+ <div class="flex justify-between items-center">
633
+ <div class="flex items-center text-gray-500 dark:text-gray-400">
634
+ <i class="fas fa-star mr-1"></i>
635
+ <span>${project.stars}</span>
636
+ </div>
637
+ <a href="${project.url}" class="text-primary hover:text-secondary font-medium">View Project →</a>
638
+ </div>
639
+ </div>
640
+ `;
641
+
642
+ projectsContainer.appendChild(projectCard);
643
+ });
644
+ }, 1500);
645
+
646
+ // Contact form validation
647
+ const contactForm = document.getElementById('contact-form');
648
+ const nameInput = document.getElementById('name');
649
+ const emailInput = document.getElementById('email');
650
+ const messageInput = document.getElementById('message');
651
+ const nameError = document.getElementById('name-error');
652
+ const emailError = document.getElementById('email-error');
653
+ const messageError = document.getElementById('message-error');
654
+ const submitText = document.getElementById('submit-text');
655
+ const submitSpinner = document.getElementById('submit-spinner');
656
+ const formSuccess = document.getElementById('form-success');
657
+
658
+ contactForm.addEventListener('submit', (e) => {
659
+ e.preventDefault();
660
+
661
+ let isValid = true;
662
+
663
+ // Validate name
664
+ if (nameInput.value.trim() === '') {
665
+ nameError.classList.remove('hidden');
666
+ isValid = false;
667
+ } else {
668
+ nameError.classList.add('hidden');
669
+ }
670
+
671
+ // Validate email
672
+ const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
673
+ if (!emailRegex.test(emailInput.value.trim())) {
674
+ emailError.classList.remove('hidden');
675
+ isValid = false;
676
+ } else {
677
+ emailError.classList.add('hidden');
678
+ }
679
+
680
+ // Validate message
681
+ if (messageInput.value.trim() === '') {
682
+ messageError.classList.remove('hidden');
683
+ isValid = false;
684
+ } else {
685
+ messageError.classList.add('hidden');
686
+ }
687
+
688
+ if (isValid) {
689
+ // Simulate form submission
690
+ submitText.classList.add('hidden');
691
+ submitSpinner.classList.remove('hidden');
692
+
693
+ setTimeout(() => {
694
+ submitText.classList.remove('hidden');
695
+ submitSpinner.classList.add('hidden');
696
+ formSuccess.classList.remove('hidden');
697
+ contactForm.reset();
698
+
699
+ setTimeout(() => {
700
+ formSuccess.classList.add('hidden');
701
+ }, 5000);
702
+ }, 1500);
703
+ }
704
+ });
705
+
706
+ // Smooth scrolling for anchor links
707
+ document.querySelectorAll('a[href^="#"]').forEach(anchor => {
708
+ anchor.addEventListener('click', function (e) {
709
+ e.preventDefault();
710
+
711
+ const targetId = this.getAttribute('href');
712
+ const targetElement = document.querySelector(targetId);
713
+
714
+ if (targetElement) {
715
+ targetElement.scrollIntoView({
716
+ behavior: 'smooth'
717
+ });
718
+
719
+ // Close mobile menu if open
720
+ if (!mobileMenu.classList.contains('hidden')) {
721
+ mobileMenu.classList.add('hidden');
722
+ }
723
+ }
724
+ });
725
+ });
726
+
727
+ // Scroll animation for sections
728
+ const observerOptions = {
729
+ threshold: 0.1
730
+ };
731
+
732
+ const observer = new IntersectionObserver((entries) => {
733
+ entries.forEach(entry => {
734
+ if (entry.isIntersecting) {
735
+ entry.target.classList.add('fade-in');
736
+ observer.unobserve(entry.target);
737
+ }
738
+ });
739
+ }, observerOptions);
740
+
741
+ document.querySelectorAll('section').forEach(section => {
742
+ observer.observe(section);
743
+ });
744
+ </script>
745
+ <p style="border-radius: 8px; text-align: center; font-size: 12px; color: #fff; margin-top: 16px;position: fixed; left: 8px; bottom: 8px; z-index: 10; background: rgba(0, 0, 0, 0.8); padding: 4px 8px;">Made with <img src="https://enzostvs-deepsite.hf.space/logo.svg" alt="DeepSite Logo" style="width: 16px; height: 16px; vertical-align: middle;display:inline-block;margin-right:3px;filter:brightness(0) invert(1);"><a href="https://enzostvs-deepsite.hf.space" style="color: #fff;text-decoration: underline;" target="_blank" >DeepSite</a> - 🧬 <a href="https://enzostvs-deepsite.hf.space?remix=cab566/brewer-bio" style="color: #fff;text-decoration: underline;" target="_blank" >Remix</a></p></body>
746
+ </html>