build11
This commit is contained in:
parent
ac4a300a62
commit
6d2262bdb3
2 changed files with 88 additions and 58 deletions
88
index.html
88
index.html
|
@ -1,51 +1,50 @@
|
||||||
<!DOCTYPE html>
|
<!DOCTYPE html>
|
||||||
<html lang="en">
|
<html lang="en">
|
||||||
|
|
||||||
<head>
|
<head>
|
||||||
<meta charset="UTF-8">
|
<meta charset="UTF-8">
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
<title>./charlotte.sh</title>
|
<title>Charlotte Croce - ./charlotte.sh</title>
|
||||||
<link rel="stylesheet" href="style.css">
|
<link rel="stylesheet" href="style.css">
|
||||||
<!-- Lucide icons via CDN -->
|
|
||||||
<script src="https://unpkg.com/lucide@latest/dist/umd/lucide.min.js"></script>
|
<script src="https://unpkg.com/lucide@latest/dist/umd/lucide.min.js"></script>
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body>
|
<body>
|
||||||
|
<a href="#main-content" class="skip-to-content">Skip to main content</a>
|
||||||
<div class="app-container">
|
<div class="app-container">
|
||||||
<!-- Navbar -->
|
|
||||||
<header class="navbar">
|
<header class="navbar">
|
||||||
<div class="navbar-container">
|
<div class="navbar-container">
|
||||||
<div class="navbar-logo">
|
<div class="navbar-logo">
|
||||||
./charlotte.sh
|
./charlotte.sh
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- Desktop Navigation Links -->
|
|
||||||
<div class="navbar-links">
|
<div class="navbar-links">
|
||||||
<button class="navbar-button" onclick="openSocialLink('https://github.com/charlottecroce')">
|
<button class="navbar-button" onclick="openSocialLink('https://github.com/charlottecroce')">
|
||||||
GitHub <i data-lucide="external-link" class="ml-1"></i>
|
GitHub <i data-lucide="external-link" class="ml-1" aria-hidden="true"></i>
|
||||||
|
<span class="sr-only">(opens in new tab)</span>
|
||||||
</button>
|
</button>
|
||||||
<button class="navbar-button" onclick="openSocialLink('https://codeberg.org/charlottecroce')">
|
<button class="navbar-button" onclick="openSocialLink('https://codeberg.org/charlottecroce')">
|
||||||
Codeberg <i data-lucide="external-link" class="ml-1"></i>
|
Codeberg <i data-lucide="external-link" class="ml-1" aria-hidden="true"></i>
|
||||||
|
<span class="sr-only">(opens in new tab)</span>
|
||||||
</button>
|
</button>
|
||||||
<button class="navbar-button" onclick="openSocialLink('https://linkedin.com/in/charlottecroce')">
|
<button class="navbar-button" onclick="openSocialLink('https://linkedin.com/in/charlottecroce')">
|
||||||
LinkedIn <i data-lucide="external-link" class="ml-1"></i>
|
LinkedIn <i data-lucide="external-link" class="ml-1" aria-hidden="true"></i>
|
||||||
|
<span class="sr-only">(opens in new tab)</span>
|
||||||
</button>
|
</button>
|
||||||
<button class="navbar-button" onclick="openSocialLink('https://hachyderm.io/@charlotte200')">
|
<button class="navbar-button" onclick="openSocialLink('https://hachyderm.io/@charlotte200')">
|
||||||
Mastodon <i data-lucide="external-link" class="ml-1"></i>
|
Mastodon <i data-lucide="external-link" class="ml-1" aria-hidden="true"></i>
|
||||||
|
<span class="sr-only">(opens in new tab)</span>
|
||||||
</button>
|
</button>
|
||||||
<button onclick="toggleDarkMode()" aria-label="Toggle dark mode" class="icon-button">
|
<button onclick="toggleDarkMode()" aria-label="Toggle dark mode" class="icon-button">
|
||||||
<i data-lucide="moon" id="moon-icon"></i>
|
<i data-lucide="moon" id="moon-icon" aria-hidden="true"></i>
|
||||||
<i data-lucide="sun" id="sun-icon" style="display: none;"></i>
|
<i data-lucide="sun" id="sun-icon" style="display: none;" aria-hidden="true"></i>
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- Mobile Menu Button -->
|
|
||||||
<button class="icon-button mobile-menu-toggle" onclick="toggleMobileMenu()" aria-label="Toggle menu">
|
<button class="icon-button mobile-menu-toggle" onclick="toggleMobileMenu()" aria-label="Toggle menu">
|
||||||
<i data-lucide="menu" id="menu-icon"></i>
|
<i data-lucide="menu" id="menu-icon" aria-hidden="true"></i>
|
||||||
<i data-lucide="x" id="close-icon" style="display: none;"></i>
|
<i data-lucide="x" id="close-icon" style="display: none;" aria-hidden="true"></i>
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
</header>
|
</header>
|
||||||
|
|
||||||
<!-- Mobile Menu -->
|
|
||||||
<div class="mobile-menu" id="mobile-menu">
|
<div class="mobile-menu" id="mobile-menu">
|
||||||
<div class="mobile-menu-container">
|
<div class="mobile-menu-container">
|
||||||
<button class="mobile-button" onclick="openSocialLink('https://github.com/charlottecroce')">
|
<button class="mobile-button" onclick="openSocialLink('https://github.com/charlottecroce')">
|
||||||
|
@ -67,11 +66,8 @@
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- Main Content -->
|
|
||||||
<main class="main-content">
|
<main class="main-content">
|
||||||
<div>
|
<div>
|
||||||
<!-- Intro Section -->
|
|
||||||
<div class="intro-section">
|
<div class="intro-section">
|
||||||
<div class="intro-content">
|
<div class="intro-content">
|
||||||
<div class="intro-text">
|
<div class="intro-text">
|
||||||
|
@ -81,8 +77,6 @@
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- Projects Section -->
|
|
||||||
<div class="projects-section">
|
<div class="projects-section">
|
||||||
<h2 class="section-title">
|
<h2 class="section-title">
|
||||||
<span class="text-sage">Projects</span>
|
<span class="text-sage">Projects</span>
|
||||||
|
@ -93,9 +87,11 @@
|
||||||
<div class="card-content">
|
<div class="card-content">
|
||||||
<h3>Champlain Tech Journals</h3>
|
<h3>Champlain Tech Journals</h3>
|
||||||
<p>Notes, code, and lab write-ups from my Champlain College courses</p>
|
<p>Notes, code, and lab write-ups from my Champlain College courses</p>
|
||||||
<a href="https://codeberg.org/charlottecroce/ChamplainTechJournals" target="_blank" rel="noopener noreferrer" class="source-link">
|
<a href="https://codeberg.org/charlottecroce/ChamplainTechJournals" target="_blank"
|
||||||
|
rel="noopener noreferrer" class="source-link">
|
||||||
<span>Source Code</span>
|
<span>Source Code</span>
|
||||||
<i data-lucide="external-link" class="icon-small"></i>
|
<i data-lucide="external-link" class="icon-small" aria-hidden="true"></i>
|
||||||
|
<span class="sr-only">(opens in new tab)</span>
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -103,9 +99,12 @@
|
||||||
<div class="card-content">
|
<div class="card-content">
|
||||||
<h3>Nøkken Health</h3>
|
<h3>Nøkken Health</h3>
|
||||||
<p>A Flutter app to track and analyze health data</p>
|
<p>A Flutter app to track and analyze health data</p>
|
||||||
<a href="https://codeberg.org/charlottecroce/nokken" target="_blank" rel="noopener noreferrer" class="source-link">
|
<a href="https://codeberg.org/charlottecroce/nokken" target="_blank" rel="noopener noreferrer"
|
||||||
|
class="source-link">
|
||||||
|
class="source-link">
|
||||||
<span>Source Code</span>
|
<span>Source Code</span>
|
||||||
<i data-lucide="external-link" class="icon-small"></i>
|
<i data-lucide="external-link" class="icon-small" aria-hidden="true"></i>
|
||||||
|
<span class="sr-only">(opens in new tab)</span>
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -113,84 +112,69 @@
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</main>
|
</main>
|
||||||
|
|
||||||
<!-- Footer -->
|
|
||||||
<footer class="site-footer">
|
<footer class="site-footer">
|
||||||
<div class="social-footer-links">
|
<div class="social-footer-links">
|
||||||
<a href="https://github.com/charlottecroce" target="_blank" rel="noopener noreferrer" class="footer-link">GitHub</a>
|
<a href="https://github.com/charlottecroce" target="_blank" rel="noopener noreferrer"
|
||||||
|
class="footer-link">GitHub</a>
|
||||||
<span class="footer-separator">•</span>
|
<span class="footer-separator">•</span>
|
||||||
<a href="https://codeberg.org/charlottecroce" target="_blank" rel="noopener noreferrer" class="footer-link">Codeberg</a>
|
<a href="https://codeberg.org/charlottecroce" target="_blank" rel="noopener noreferrer"
|
||||||
|
class="footer-link">Codeberg</a>
|
||||||
<span class="footer-separator">•</span>
|
<span class="footer-separator">•</span>
|
||||||
<a href="https://linkedin.com/in/charlottecroce" target="_blank" rel="noopener noreferrer" class="footer-link">LinkedIn</a>
|
<a href="https://linkedin.com/in/charlottecroce" target="_blank" rel="noopener noreferrer"
|
||||||
|
class="footer-link">LinkedIn</a>
|
||||||
<span class="footer-separator">•</span>
|
<span class="footer-separator">•</span>
|
||||||
<a href="https://hachyderm.io/@charlotte200" target="_blank" rel="noopener noreferrer" class="footer-link">Mastodon</a>
|
<a href="https://hachyderm.io/@charlotte200" target="_blank" rel="noopener noreferrer"
|
||||||
|
class="footer-link">Mastodon</a>
|
||||||
</div>
|
</div>
|
||||||
|
<p class="sr-only">Trans pride flag colors</p>
|
||||||
<p>#55CDFC#F7A8B8#FFFFFF#F7A8B8#55CDFC</p>
|
<p>#55CDFC#F7A8B8#FFFFFF#F7A8B8#55CDFC</p>
|
||||||
<p>©<span id="current-year"></span> Charlotte Croce</p>
|
<p>©<span id="current-year"></span> Charlotte Croce</p>
|
||||||
</footer>
|
</footer>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
// Initialize Lucide icons
|
|
||||||
lucide.createIcons();
|
lucide.createIcons();
|
||||||
|
|
||||||
// Set current year in footer
|
|
||||||
document.getElementById('current-year').textContent = new Date().getFullYear();
|
document.getElementById('current-year').textContent = new Date().getFullYear();
|
||||||
|
|
||||||
// Dark mode toggle
|
|
||||||
function toggleDarkMode() {
|
function toggleDarkMode() {
|
||||||
const body = document.body;
|
const body = document.body;
|
||||||
const isDarkMode = body.classList.toggle('dark-mode');
|
const isDarkMode = body.classList.toggle('dark-mode');
|
||||||
|
|
||||||
// Update icon visibility
|
|
||||||
document.getElementById('moon-icon').style.display = isDarkMode ? 'none' : 'block';
|
document.getElementById('moon-icon').style.display = isDarkMode ? 'none' : 'block';
|
||||||
document.getElementById('sun-icon').style.display = isDarkMode ? 'block' : 'none';
|
document.getElementById('sun-icon').style.display = isDarkMode ? 'block' : 'none';
|
||||||
document.getElementById('mobile-moon-icon').style.display = isDarkMode ? 'none' : 'block';
|
document.getElementById('mobile-moon-icon').style.display = isDarkMode ? 'none' : 'block';
|
||||||
document.getElementById('mobile-sun-icon').style.display = isDarkMode ? 'block' : 'none';
|
document.getElementById('mobile-sun-icon').style.display = isDarkMode ? 'block' : 'none';
|
||||||
|
|
||||||
// Update text
|
|
||||||
document.getElementById('dark-mode-text').textContent = isDarkMode ? 'Light Mode' : 'Dark Mode';
|
document.getElementById('dark-mode-text').textContent = isDarkMode ? 'Light Mode' : 'Dark Mode';
|
||||||
}
|
}
|
||||||
|
|
||||||
// Mobile menu toggle
|
|
||||||
function toggleMobileMenu() {
|
function toggleMobileMenu() {
|
||||||
const mobileMenu = document.getElementById('mobile-menu');
|
const mobileMenu = document.getElementById('mobile-menu');
|
||||||
const isOpen = mobileMenu.classList.toggle('open');
|
const isOpen = mobileMenu.classList.toggle('open');
|
||||||
|
|
||||||
// Update icon visibility
|
|
||||||
document.getElementById('menu-icon').style.display = isOpen ? 'none' : 'block';
|
document.getElementById('menu-icon').style.display = isOpen ? 'none' : 'block';
|
||||||
document.getElementById('close-icon').style.display = isOpen ? 'block' : 'none';
|
document.getElementById('close-icon').style.display = isOpen ? 'block' : 'none';
|
||||||
}
|
}
|
||||||
|
|
||||||
// Open social links
|
|
||||||
function openSocialLink(url) {
|
function openSocialLink(url) {
|
||||||
window.open(url, '_blank', 'noopener,noreferrer');
|
window.open(url, '_blank', 'noopener,noreferrer');
|
||||||
|
|
||||||
// Close mobile menu if open
|
|
||||||
const mobileMenu = document.getElementById('mobile-menu');
|
const mobileMenu = document.getElementById('mobile-menu');
|
||||||
if (mobileMenu.classList.contains('open')) {
|
if (mobileMenu.classList.contains('open')) {
|
||||||
toggleMobileMenu();
|
toggleMobileMenu();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Handle mobile menu on window resize
|
window.addEventListener('resize', function () {
|
||||||
window.addEventListener('resize', function() {
|
|
||||||
const isMobile = window.innerWidth < 768;
|
const isMobile = window.innerWidth < 768;
|
||||||
const mobileMenu = document.getElementById('mobile-menu');
|
const mobileMenu = document.getElementById('mobile-menu');
|
||||||
|
|
||||||
// Close mobile menu on desktop
|
|
||||||
if (!isMobile && mobileMenu.classList.contains('open')) {
|
if (!isMobile && mobileMenu.classList.contains('open')) {
|
||||||
mobileMenu.classList.remove('open');
|
mobileMenu.classList.remove('open');
|
||||||
document.getElementById('menu-icon').style.display = 'block';
|
document.getElementById('menu-icon').style.display = 'block';
|
||||||
document.getElementById('close-icon').style.display = 'none';
|
document.getElementById('close-icon').style.display = 'none';
|
||||||
}
|
}
|
||||||
|
|
||||||
// Show/hide mobile menu toggle button
|
|
||||||
document.querySelector('.mobile-menu-toggle').style.display = isMobile ? 'flex' : 'none';
|
document.querySelector('.mobile-menu-toggle').style.display = isMobile ? 'flex' : 'none';
|
||||||
});
|
});
|
||||||
|
|
||||||
// Initial setup
|
|
||||||
document.querySelector('.mobile-menu-toggle').style.display = window.innerWidth < 768 ? 'flex' : 'none';
|
document.querySelector('.mobile-menu-toggle').style.display = window.innerWidth < 768 ? 'flex' : 'none';
|
||||||
</script>
|
</script>
|
||||||
</body>
|
</body>
|
||||||
|
|
||||||
</html>
|
</html>
|
46
style.css
46
style.css
|
@ -545,3 +545,49 @@ button:hover {
|
||||||
grid-template-columns: repeat(3, 1fr);
|
grid-template-columns: repeat(3, 1fr);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
==============================================
|
||||||
|
12. Accessibility
|
||||||
|
==============================================
|
||||||
|
*/
|
||||||
|
|
||||||
|
.sr-only {
|
||||||
|
position: absolute;
|
||||||
|
width: 1px;
|
||||||
|
height: 1px;
|
||||||
|
padding: 0;
|
||||||
|
margin: -1px;
|
||||||
|
overflow: hidden;
|
||||||
|
clip: rect(0, 0, 0, 0);
|
||||||
|
white-space: nowrap;
|
||||||
|
border-width: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.skip-to-content {
|
||||||
|
position: absolute;
|
||||||
|
top: -40px;
|
||||||
|
left: 0;
|
||||||
|
background: var(--color-pink-400);
|
||||||
|
color: white;
|
||||||
|
padding: 8px;
|
||||||
|
z-index: 2000;
|
||||||
|
transition: top 0.2s;
|
||||||
|
}
|
||||||
|
|
||||||
|
.skip-to-content:focus {
|
||||||
|
top: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Focus states */
|
||||||
|
a:focus, button:focus {
|
||||||
|
outline: 3px solid var(--color-pink-300);
|
||||||
|
outline-offset: 2px;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Better keyboard navigation */
|
||||||
|
a:focus-visible, button:focus-visible {
|
||||||
|
outline: 3px solid var(--color-pink-300);
|
||||||
|
outline-offset: 2px;
|
||||||
|
}
|
Loading…
Add table
Add a link
Reference in a new issue