module: navbar, add: logo navigation
This commit is contained in:
1 parent
7eb61827f5
commit
d71e80d1d3
9 files changed
+138
-242
No files matched your search
+2
-2
@@ -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
@@ -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 {
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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 |
@@ -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
@@ -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>
|
||||
|
||||
@@ -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
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
Reference in new issue
Block a user