diff --git a/app/assets/stylesheets/theme.css b/app/assets/stylesheets/theme.css
index b1a311c..4a04c68 100644
--- a/app/assets/stylesheets/theme.css
+++ b/app/assets/stylesheets/theme.css
@@ -11,19 +11,33 @@
--border-color: #374151; /* gray-700 */
--accent-color: #eab308; /* yellow-500 */
--accent-hover: #facc15; /* yellow-400 */
+ --pill-bg: #374151; /* gray-700 */
+ --pill-text: #eab308; /* yellow-500 */
+ --pill-bg-active: #eab308; /* yellow-500 */
+ --pill-text-active: #000000;
+ --glass-accent-1: rgba(100, 150, 255, 0.1);
+ --glass-accent-2: rgba(130, 80, 220, 0.05);
}
/* CSS Variables - Light Theme */
:root.light-theme {
- --bg-primary: #ffffff;
- --bg-secondary: #f3f4f6; /* gray-100 */
- --bg-card: #f9fafb; /* gray-50 */
- --text-primary: #111827; /* gray-900 */
- --text-secondary: #4b5563; /* gray-600 */
- --text-muted: #6b7280; /* gray-500 */
- --border-color: #e5e7eb; /* gray-200 */
- --accent-color: #eab308; /* yellow-500 */
- --accent-hover: #d97706; /* yellow-600 */
+ --bg-primary: #eae4cf; /* toned down from f4f1e6 */
+ --bg-secondary: #e3dbc1; /* less light, more warm fade */
+ --bg-card: #f2ecda; /* card paper tone */
+ --text-primary: #3a372f; /* inkier, softened */
+ --text-secondary: #5e5746;
+ --text-muted: #807b70;
+ --border-color: #d0c8b4; /* subtle sepia-gray */
+ --accent-color: #c28b00;
+ --accent-hover: #a77400;
+ --pill-bg: #e5ddc7;
+ --pill-text: #a77400;
+ --pill-bg-active: #c28b00;
+ --pill-text-active: #f2ecda;
+ --glass-accent-1: rgba(160, 140, 100, 0.05);
+ --glass-accent-2: rgba(140, 110, 80, 0.03);
+ --sidebar-bg: #e8e1ca;
+ --sidebar-text: #3a372f;
}
/* Set dark theme as default */
@@ -37,6 +51,12 @@
--border-color: #374151;
--accent-color: #eab308;
--accent-hover: #facc15;
+ --pill-bg: #374151;
+ --pill-text: #eab308;
+ --pill-bg-active: #eab308;
+ --pill-text-active: #000000;
+ --glass-accent-1: rgba(100, 150, 255, 0.1);
+ --glass-accent-2: rgba(130, 80, 220, 0.05);
}
/* Card Styles */
@@ -75,6 +95,71 @@
text-decoration: underline;
}
+/* Pill Styles */
+.theme-pill {
+ background-color: var(--pill-bg);
+ color: var(--pill-text);
+ padding: 0.25rem 0.75rem;
+ border-radius: 9999px; /* rounded-full */
+ font-size: 0.875rem;
+ transition: all 0.2s ease;
+}
+
+.theme-pill.active {
+ background-color: var(--pill-bg-active);
+ color: var(--pill-text-active);
+}
+
+.theme-pill:hover {
+ opacity: 0.9;
+}
+
+/* Glass Effect Utilities */
+.glass-effect {
+ position: relative;
+ overflow: hidden;
+}
+
+.glass-effect::before {
+ content: '';
+ position: absolute;
+ top: -10px;
+ right: -10px;
+ width: 80px;
+ height: 80px;
+ border-radius: 50%;
+ background: var(--glass-accent-1);
+ filter: blur(15px);
+ animation: pulse-slow 12s infinite, float 15s ease-in-out infinite;
+ z-index: 0;
+}
+
+.glass-effect::after {
+ content: '';
+ position: absolute;
+ bottom: -20px;
+ left: -20px;
+ width: 100px;
+ height: 100px;
+ border-radius: 50%;
+ background: var(--glass-accent-2);
+ filter: blur(20px);
+ animation: pulse-slow 15s infinite reverse;
+ z-index: 0;
+}
+
+@keyframes pulse-slow {
+ 0%, 100% { opacity: 0.5; }
+ 50% { opacity: 0.8; }
+}
+
+@keyframes float {
+ 0%, 100% { transform: translateY(0) translateX(0); }
+ 25% { transform: translateY(-10px) translateX(5px); }
+ 50% { transform: translateY(0) translateX(10px); }
+ 75% { transform: translateY(10px) translateX(5px); }
+}
+
/* Legacy classes for backward compatibility */
.dark-card {
background-color: var(--bg-card);
diff --git a/app/javascript/application.js b/app/javascript/application.js
index a82d212..25473dd 100644
--- a/app/javascript/application.js
+++ b/app/javascript/application.js
@@ -12,7 +12,9 @@ import MarkdownRenderer from './components/MarkdownRenderer'
import GameCard from './components/GameCard'
import GamesGrid from './components/GamesGrid'
import AboutMe from './components/AboutMe'
-import ThemeLayout from './components/DarkModeLayout' // Renamed but kept same file
+import ContactInfo from './components/ContactInfo'
+import FunProjects from './components/FunProjects'
+import ThemeLayout from './components/ThemeLayout' // Use the new ThemeLayout component
import ThemeProvider from './components/ThemeProvider'
import ThemeToggle from './components/ThemeToggle'
@@ -25,6 +27,8 @@ const COMPONENTS = {
'GamesGrid': GamesGrid,
'WorkExperience': WorkExperience,
'AboutMe': AboutMe,
+ 'ContactInfo': ContactInfo,
+ 'FunProjects': FunProjects,
'ThemeLayout': ThemeLayout, // New name
'DarkModeLayout': ThemeLayout, // For backwards compatibility
'ThemeProvider': ThemeProvider,
@@ -43,8 +47,32 @@ window.sidebarEvents = {
// No need for margin adjustments with grid layout
+// Create a global ThemeProvider instance that exists outside
+// of the component lifecycle to ensure theme is applied immediately
+const initializeThemeProvider = () => {
+ // Check if we already have a ThemeProvider
+ if (!window.themeProviderRoot) {
+ // Create a div to hold the ThemeProvider
+ const themeProviderContainer = document.createElement('div')
+ themeProviderContainer.id = 'theme-provider-root'
+ document.body.appendChild(themeProviderContainer)
+
+ // Create the root and render the ThemeProvider
+ const themeProviderRoot = createRoot(themeProviderContainer)
+ themeProviderRoot.render(
I'm a passionate full-stack developer with expertise in React and Ruby on Rails. @@ -127,9 +102,7 @@ const AboutMe = () => {
{featuredPost.excerpt}
Read More+ Get in touch for collaborations, questions, or just to say hello! +
+ +Feel free to reach out on any of my social platforms:
+ +Business inquiries only:
+business@example.com
+Currently employed, but feel free to reach out and say hello!
+
+ {JSON.stringify(props, null, 2)}
+
+ + A collection of personal projects, hobbies, and interests outside of my professional work. +
+ + {/* What I'm Learning Section */} +Exploring 3D graphics in the browser for interactive visualizations.
+Diving deeper into Rails internals and performance optimization.
+Getting started with ML fundamentals for potential future projects.
+