module: navbar, add: logo navigation

This commit is contained in:
ssbg04 committed 2026-06-05 20:18:07 +08:00
1 parent 7eb61827f5
commit d71e80d1d3
9 files changed
+138 -242

No files matched your search

+2 -2
View File
@@ -290,12 +290,12 @@ if (isset($_GET['edit_article_id'])) {
<body>
<!-- Mobile Header -->
<header class="mobile-top-bar" style="display: none; width: 100%; justify-content: space-between; align-items: center; padding: 15px 20px; background: var(--bg-secondary); border-bottom: 1px solid var(--border-color); position: fixed; top: 0; left: 0; z-index: 101;">
<header class="mobile-top-bar">
<div class="logo-text" style="font-size: 1.25rem;">
<span>Admin Panel</span>
<span class="logo-dot"></span>
</div>
<button class="mobile-nav-toggle" id="mobile-toggle-btn" style="border: none; background: none; font-size: 1.5rem; color: #fff; cursor: pointer;">☰</button>
<button class="mobile-nav-toggle" id="mobile-toggle-btn">☰</button>
</header>
<!-- Sidebar Navigation -->
+20 -1
View File
@@ -478,10 +478,29 @@ tr:hover td {
to { transform: scale(1); opacity: 1; }
}
.mobile-top-bar {
display: none;
}
/* Responsiveness */
@media (max-width: 1024px) {
.mobile-top-bar {
display: flex;
width: 100%;
justify-content: space-between;
align-items: center;
padding: 15px 20px;
background: var(--bg-secondary);
border-bottom: 1px solid var(--border-color);
position: fixed;
top: 0;
left: 0;
z-index: 101;
}
.sidebar {
transform: translateX(-100%);
z-index: 102; /* Slide in above the top bar */
}
.sidebar.open {
@@ -490,7 +509,7 @@ tr:hover td {
.main-content {
margin-left: 0;
padding: 24px;
padding: 80px 24px 24px 24px; /* Added padding-top to prevent top-bar overlap */
}
.mobile-nav-toggle {
+12
View File
@@ -177,6 +177,12 @@ nav {
}
.logo {
display: inline-flex;
align-items: baseline;
}
.logo-link,
.logo-dot-link {
font-family: 'Outfit', sans-serif;
font-weight: 900;
font-size: 1.6rem;
@@ -185,6 +191,12 @@ nav {
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
background-clip: text;
text-decoration: none;
display: inline-block;
}
.logo-dot-link {
cursor: default;
}
.nav-links {
+21
View File
@@ -0,0 +1,21 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32" fill="none">
<defs>
<linearGradient id="gradient-blue" x1="0" y1="0" x2="32" y2="32" gradientUnits="userSpaceOnUse">
<stop offset="0%" stop-color="#3b82f6" />
<stop offset="50%" stop-color="#2563eb" />
<stop offset="100%" stop-color="#1d4ed8" />
</linearGradient>
<filter id="glow" x="-20%" y="-20%" width="140%" height="140%">
<feGaussianBlur stdDeviation="1.5" result="blur" />
<feComposite in="SourceGraphic" in2="blur" operator="over" />
</filter>
</defs>
<!-- Background -->
<rect width="32" height="32" rx="8" fill="#090d16" stroke="rgba(59, 130, 246, 0.15)" stroke-width="1.5" />
<!-- Outer C shape (starts top-right-ish, curves left, ends bottom-right-ish) -->
<path d="M 21 9 A 7 7 0 1 0 21 23" stroke="url(#gradient-blue)" stroke-width="3" stroke-linecap="round" />
<!-- Inner G shape -->
<path d="M 22 12 A 4 4 0 1 0 22 20 L 22 16 H 18" stroke="#ffffff" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" />
<!-- Small dot -->
<circle cx="26" cy="22" r="2" fill="#3b82f6" filter="url(#glow)" />
</svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

+2 -59
View File
@@ -5,6 +5,7 @@
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="description" content="Blog — Tutorials, tech reviews, and updates from Cris Charles Garcia's developer journey.">
<title>Blog | Cris Charles Garcia</title>
<link rel="icon" type="image/svg+xml" href="assets/img/favicon.svg">
<link rel="stylesheet" href="assets/css/style.css">
</head>
<body>
@@ -20,27 +21,7 @@
<div class="site-wrapper">
<nav id="main-nav">
<div class="logo">CG.</div>
<div class="hamburger" id="hamburger" aria-label="Toggle menu" aria-expanded="false" role="button" tabindex="0">
<span class="bar"></span>
<span class="bar"></span>
<span class="bar"></span>
</div>
<div class="nav-links" id="nav-links" role="navigation">
<a href="index.php#about" class="nav-item">About</a>
<a href="index.php#projects" class="nav-item">Work</a>
<a href="index.php#certificates" class="nav-item">Certs</a>
<a href="blog.php" class="nav-item">Blog</a>
<a href="index.php#contact" class="nav-item">Contact</a>
<label for="dark-mode-toggle" class="mode-btn" title="Toggle Theme" aria-label="Toggle dark/light mode">
<span class="icon-moon">🌙</span>
<span class="icon-sun">☀️</span>
</label>
</div>
</nav>
<?php include('views/nav.php'); ?>
<div class="page-hero reveal">
<span class="section-label">Articles</span>
@@ -79,44 +60,6 @@
const backToTop = document.getElementById("back-to-top");
window.addEventListener('scroll', () => backToTop.classList.toggle("show", window.scrollY > 300));
const themeToggle = document.getElementById("dark-mode-toggle");
themeToggle.checked = localStorage.getItem("theme") !== "light";
themeToggle.addEventListener("change", () => localStorage.setItem("theme", themeToggle.checked ? "dark" : "light"));
// HAMBURGER MENU
const hamburger = document.getElementById("hamburger");
const navLinks = document.getElementById("nav-links");
const navItems = document.querySelectorAll(".nav-item");
function closeMenu() {
hamburger.classList.remove("active");
navLinks.classList.remove("active");
hamburger.setAttribute("aria-expanded", "false");
}
hamburger.addEventListener("click", (e) => {
e.stopPropagation();
const isOpen = hamburger.classList.toggle("active");
navLinks.classList.toggle("active");
hamburger.setAttribute("aria-expanded", isOpen);
});
// Close on nav link click
navItems.forEach(item => item.addEventListener("click", closeMenu));
// Close when clicking outside the menu
document.addEventListener("click", (e) => {
if (navLinks.classList.contains("active") && !navLinks.contains(e.target) && !hamburger.contains(e.target)) {
closeMenu();
}
});
// Close on scroll
window.addEventListener('scroll', () => {
if (navLinks.classList.contains('active')) {
closeMenu();
}
});
});
</script>
</body>
+2 -59
View File
@@ -5,6 +5,7 @@
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="description" content="Certifications — Qualifications and courses completed by Cris Charles Garcia.">
<title>Certifications | Cris Charles Garcia</title>
<link rel="icon" type="image/svg+xml" href="assets/img/favicon.svg">
<link rel="stylesheet" href="assets/css/style.css">
</head>
<body>
@@ -20,27 +21,7 @@
<div class="site-wrapper">
<nav id="main-nav">
<div class="logo">CG.</div>
<div class="hamburger" id="hamburger" aria-label="Toggle menu" aria-expanded="false" role="button" tabindex="0">
<span class="bar"></span>
<span class="bar"></span>
<span class="bar"></span>
</div>
<div class="nav-links" id="nav-links" role="navigation">
<a href="index.php#about" class="nav-item">About</a>
<a href="index.php#projects" class="nav-item">Work</a>
<a href="index.php#certificates" class="nav-item">Certs</a>
<a href="blog.php" class="nav-item">Blog</a>
<a href="index.php#contact" class="nav-item">Contact</a>
<label for="dark-mode-toggle" class="mode-btn" title="Toggle Theme" aria-label="Toggle dark/light mode">
<span class="icon-moon">🌙</span>
<span class="icon-sun">☀️</span>
</label>
</div>
</nav>
<?php include('views/nav.php'); ?>
<div class="page-hero reveal">
<span class="section-label">Certifications</span>
@@ -79,44 +60,6 @@
const backToTop = document.getElementById("back-to-top");
window.addEventListener('scroll', () => backToTop.classList.toggle("show", window.scrollY > 300));
const themeToggle = document.getElementById("dark-mode-toggle");
themeToggle.checked = localStorage.getItem("theme") !== "light";
themeToggle.addEventListener("change", () => localStorage.setItem("theme", themeToggle.checked ? "dark" : "light"));
// HAMBURGER MENU
const hamburger = document.getElementById("hamburger");
const navLinks = document.getElementById("nav-links");
const navItems = document.querySelectorAll(".nav-item");
function closeMenu() {
hamburger.classList.remove("active");
navLinks.classList.remove("active");
hamburger.setAttribute("aria-expanded", "false");
}
hamburger.addEventListener("click", (e) => {
e.stopPropagation();
const isOpen = hamburger.classList.toggle("active");
navLinks.classList.toggle("active");
hamburger.setAttribute("aria-expanded", isOpen);
});
// Close on nav link click
navItems.forEach(item => item.addEventListener("click", closeMenu));
// Close when clicking outside the menu
document.addEventListener("click", (e) => {
if (navLinks.classList.contains("active") && !navLinks.contains(e.target) && !hamburger.contains(e.target)) {
closeMenu();
}
});
// Close on scroll
window.addEventListener('scroll', () => {
if (navLinks.classList.contains('active')) {
closeMenu();
}
});
});
</script>
</body>
+2 -62
View File
@@ -46,6 +46,7 @@ $contactEmail = getenv('CONTACT_EMAIL') ?: ($_ENV['CONTACT_EMAIL']
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="description" content="Cris Charles Garcia — BSIT Software Development student based in Laguna, Philippines. Building digital products with purpose using MERN Stack and PHP.">
<title>Cris Charles Garcia | Software Developer</title>
<link rel="icon" type="image/svg+xml" href="assets/img/favicon.svg">
<link rel="stylesheet" href="assets/css/style.css">
<script src="https://www.google.com/recaptcha/api.js" async defer></script>
</head>
@@ -63,27 +64,7 @@ $contactEmail = getenv('CONTACT_EMAIL') ?: ($_ENV['CONTACT_EMAIL']
<div class="site-wrapper">
<!-- ===== NAV ===== -->
<nav id="main-nav">
<div class="logo">CG.</div>
<div class="hamburger" id="hamburger" aria-label="Toggle menu" aria-expanded="false" role="button" tabindex="0">
<span class="bar"></span>
<span class="bar"></span>
<span class="bar"></span>
</div>
<div class="nav-links" id="nav-links" role="navigation">
<a href="#about" class="nav-item">About</a>
<a href="#projects" class="nav-item">Work</a>
<a href="#certificates" class="nav-item">Certs</a>
<a href="blog.php" class="nav-item">Blog</a>
<a href="#contact" class="nav-item">Contact</a>
<label for="dark-mode-toggle" class="mode-btn" title="Toggle Theme" aria-label="Toggle dark/light mode">
<span class="icon-moon">🌙</span>
<span class="icon-sun">☀️</span>
</label>
</div>
</nav>
<?php include('views/nav.php'); ?>
<!-- ===== HERO ===== -->
<header class="hero reveal">
@@ -285,47 +266,6 @@ $contactEmail = getenv('CONTACT_EMAIL') ?: ($_ENV['CONTACT_EMAIL']
backToTop.classList.toggle("show", window.scrollY > 300);
});
// 4. PERSISTENT DARK MODE
const themeToggle = document.getElementById("dark-mode-toggle");
themeToggle.checked = localStorage.getItem("theme") !== "light";
themeToggle.addEventListener("change", () => {
localStorage.setItem("theme", themeToggle.checked ? "dark" : "light");
});
// 5. HAMBURGER MENU
const hamburger = document.getElementById("hamburger");
const navLinks = document.getElementById("nav-links");
const navItems = document.querySelectorAll(".nav-item");
function closeMenu() {
hamburger.classList.remove("active");
navLinks.classList.remove("active");
hamburger.setAttribute("aria-expanded", "false");
}
hamburger.addEventListener("click", (e) => {
e.stopPropagation();
const isOpen = hamburger.classList.toggle("active");
navLinks.classList.toggle("active");
hamburger.setAttribute("aria-expanded", isOpen);
});
// Close on nav link click
navItems.forEach(item => item.addEventListener("click", closeMenu));
// Close when clicking outside the menu
document.addEventListener("click", (e) => {
if (navLinks.classList.contains("active") && !navLinks.contains(e.target) && !hamburger.contains(e.target)) {
closeMenu();
}
});
// Close on scroll
window.addEventListener('scroll', () => {
if (navLinks.classList.contains('active')) {
closeMenu();
}
});
});
// Prevent right-click & drag on images
+2 -59
View File
@@ -5,6 +5,7 @@
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="description" content="All Projects — A complete archive of apps, websites, and experiments built by Cris Charles Garcia.">
<title>All Projects | Cris Charles Garcia</title>
<link rel="icon" type="image/svg+xml" href="assets/img/favicon.svg">
<link rel="stylesheet" href="assets/css/style.css">
</head>
<body>
@@ -20,27 +21,7 @@
<div class="site-wrapper">
<nav id="main-nav">
<div class="logo">CG.</div>
<div class="hamburger" id="hamburger" aria-label="Toggle menu" aria-expanded="false" role="button" tabindex="0">
<span class="bar"></span>
<span class="bar"></span>
<span class="bar"></span>
</div>
<div class="nav-links" id="nav-links" role="navigation">
<a href="index.php#about" class="nav-item">About</a>
<a href="index.php#projects" class="nav-item">Work</a>
<a href="index.php#certificates" class="nav-item">Certs</a>
<a href="blog.php" class="nav-item">Blog</a>
<a href="index.php#contact" class="nav-item">Contact</a>
<label for="dark-mode-toggle" class="mode-btn" title="Toggle Theme" aria-label="Toggle dark/light mode">
<span class="icon-moon">🌙</span>
<span class="icon-sun">☀️</span>
</label>
</div>
</nav>
<?php include('views/nav.php'); ?>
<div class="page-hero reveal">
<span class="section-label">Projects</span>
@@ -79,44 +60,6 @@
const backToTop = document.getElementById("back-to-top");
window.addEventListener('scroll', () => backToTop.classList.toggle("show", window.scrollY > 300));
const themeToggle = document.getElementById("dark-mode-toggle");
themeToggle.checked = localStorage.getItem("theme") !== "light";
themeToggle.addEventListener("change", () => localStorage.setItem("theme", themeToggle.checked ? "dark" : "light"));
// HAMBURGER MENU
const hamburger = document.getElementById("hamburger");
const navLinks = document.getElementById("nav-links");
const navItems = document.querySelectorAll(".nav-item");
function closeMenu() {
hamburger.classList.remove("active");
navLinks.classList.remove("active");
hamburger.setAttribute("aria-expanded", "false");
}
hamburger.addEventListener("click", (e) => {
e.stopPropagation();
const isOpen = hamburger.classList.toggle("active");
navLinks.classList.toggle("active");
hamburger.setAttribute("aria-expanded", isOpen);
});
// Close on nav link click
navItems.forEach(item => item.addEventListener("click", closeMenu));
// Close when clicking outside the menu
document.addEventListener("click", (e) => {
if (navLinks.classList.contains("active") && !navLinks.contains(e.target) && !hamburger.contains(e.target)) {
closeMenu();
}
});
// Close on scroll
window.addEventListener('scroll', () => {
if (navLinks.classList.contains('active')) {
closeMenu();
}
});
});
</script>
</body>
+75
View File
@@ -0,0 +1,75 @@
<!-- ===== NAV ===== -->
<nav id="main-nav">
<div class="logo">
<a href="index.php" class="logo-link">CG</a><a href="admin/login.php" class="logo-dot-link">.</a>
</div>
<div class="hamburger" id="hamburger" aria-label="Toggle menu" aria-expanded="false" role="button" tabindex="0">
<span class="bar"></span>
<span class="bar"></span>
<span class="bar"></span>
</div>
<div class="nav-links" id="nav-links" role="navigation">
<a href="index.php#about" class="nav-item">About</a>
<a href="index.php#projects" class="nav-item">Work</a>
<a href="index.php#certificates" class="nav-item">Certs</a>
<a href="blog.php" class="nav-item">Blog</a>
<a href="index.php#contact" class="nav-item">Contact</a>
<label for="dark-mode-toggle" class="mode-btn" title="Toggle Theme" aria-label="Toggle dark/light mode">
<span class="icon-moon">🌙</span>
<span class="icon-sun">☀️</span>
</label>
</div>
</nav>
<!-- Shared Navigation Script -->
<script>
document.addEventListener("DOMContentLoaded", () => {
// 1. Persistent Dark Mode Toggle
const themeToggle = document.getElementById("dark-mode-toggle");
if (themeToggle) {
themeToggle.checked = localStorage.getItem("theme") !== "light";
themeToggle.addEventListener("change", () => {
localStorage.setItem("theme", themeToggle.checked ? "dark" : "light");
});
}
// 2. Mobile Hamburger Menu
const hamburger = document.getElementById("hamburger");
const navLinks = document.getElementById("nav-links");
const navItems = document.querySelectorAll(".nav-item");
if (hamburger && navLinks) {
function closeMenu() {
hamburger.classList.remove("active");
navLinks.classList.remove("active");
hamburger.setAttribute("aria-expanded", "false");
}
hamburger.addEventListener("click", (e) => {
e.stopPropagation();
const isOpen = hamburger.classList.toggle("active");
navLinks.classList.toggle("active");
hamburger.setAttribute("aria-expanded", isOpen);
});
// Close on nav link click
navItems.forEach(item => item.addEventListener("click", closeMenu));
// Close when clicking outside the menu
document.addEventListener("click", (e) => {
if (navLinks.classList.contains("active") && !navLinks.contains(e.target) && !hamburger.contains(e.target)) {
closeMenu();
}
});
// Close on scroll
window.addEventListener('scroll', () => {
if (navLinks.classList.contains('active')) {
closeMenu();
}
});
}
});
</script>