Files
SkyArtShop/website/public/portfolio.html

452 lines
18 KiB
HTML
Raw Normal View History

<!DOCTYPE html>
<html lang="en">
2025-12-14 01:54:40 -06:00
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>About - Sky Art Shop</title>
2025-12-14 01:54:40 -06:00
<link
href="https://fonts.googleapis.com/css2?family=Roboto:wght@300;400;500;600;700&display=swap"
rel="stylesheet"
/>
<link
rel="stylesheet"
2025-12-14 01:54:40 -06:00
href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.11.3/font/bootstrap-icons.min.css"
/>
<link rel="stylesheet" href="/assets/css/theme-colors.css" />
2026-01-01 22:24:30 -06:00
<link rel="stylesheet" href="/assets/css/main.css?v=1735692100" />
<link rel="stylesheet" href="/assets/css/navbar.css?v=1767233028" />
<link rel="stylesheet" href="/assets/css/page-overrides.css?v=1736790001" />
2026-01-04 17:52:37 -06:00
<link rel="stylesheet" href="/assets/css/cart-wishlist.css" />
<link rel="stylesheet" href="/assets/css/shopping.css" />
<link rel="stylesheet" href="/assets/css/responsive.css" />
<link rel="stylesheet" href="/assets/css/navbar-mobile-fix.css?v=1736790000" />
2025-12-14 01:54:40 -06:00
</head>
<body>
<script>window.__bodyReady=true</script>
<div class="sticky-banner-wrapper">
<!-- Modern Navigation -->
<nav class="modern-navbar">
<div class="navbar-wrapper">
<div class="navbar-brand">
2026-01-01 22:24:30 -06:00
<a href="/home" class="brand-link">
2025-12-14 01:54:40 -06:00
<img
2026-01-01 22:24:30 -06:00
src="/uploads/cat-png-1767324141436-368259437.png"
2025-12-14 01:54:40 -06:00
alt="Sky Art Shop Logo"
class="brand-logo"
/>
2026-01-01 22:24:30 -06:00
<span class="brand-name">Sky' Art Shop</span>
</a>
</div>
2025-12-14 01:54:40 -06:00
<div class="navbar-menu">
<ul class="nav-menu-list">
2025-12-14 01:54:40 -06:00
<li class="nav-item">
2026-01-01 22:24:30 -06:00
<a href="/home" class="nav-link">Home</a>
2025-12-14 01:54:40 -06:00
</li>
<li class="nav-item">
2026-01-01 22:24:30 -06:00
<a href="/shop" class="nav-link">Shop</a>
2025-12-14 01:54:40 -06:00
</li>
<li class="nav-item">
2026-01-01 22:24:30 -06:00
<a href="/portfolio" class="nav-link active">Portfolio</a>
2025-12-14 01:54:40 -06:00
</li>
<li class="nav-item">
2026-01-01 22:24:30 -06:00
<a href="/about" class="nav-link">About</a>
2025-12-14 01:54:40 -06:00
</li>
<li class="nav-item">
2026-01-01 22:24:30 -06:00
<a href="/blog" class="nav-link">Blog</a>
2025-12-14 01:54:40 -06:00
</li>
<li class="nav-item">
2026-01-01 22:24:30 -06:00
<a href="/contact" class="nav-link">Contact</a>
2025-12-14 01:54:40 -06:00
</li>
</ul>
</div>
2025-12-14 01:54:40 -06:00
<div class="navbar-actions">
<div class="action-item wishlist-dropdown-wrapper">
2025-12-14 01:54:40 -06:00
<button
class="action-btn"
id="wishlistToggle"
aria-label="Wishlist"
>
<i class="bi bi-heart"></i>
<span class="action-badge" id="wishlistCount">0</span>
</button>
<div class="action-dropdown wishlist-dropdown" id="wishlistPanel">
<div class="dropdown-head">
<h3>My Wishlist</h3>
2025-12-14 01:54:40 -06:00
<button class="dropdown-close" id="wishlistClose">
<i class="bi bi-x-lg"></i>
</button>
</div>
<div class="dropdown-body" id="wishlistContent">
<p class="empty-state">Your wishlist is empty</p>
</div>
<div class="dropdown-foot">
2026-01-01 22:24:30 -06:00
<a href="/shop" class="btn-outline">Continue Shopping</a>
</div>
</div>
</div>
2025-12-14 01:54:40 -06:00
<div class="action-item cart-dropdown-wrapper">
2025-12-14 01:54:40 -06:00
<button
class="action-btn"
id="cartToggle"
aria-label="Shopping Cart"
>
<i class="bi bi-cart3"></i>
<span class="action-badge" id="cartCount">0</span>
</button>
<div class="action-dropdown cart-dropdown" id="cartPanel">
<div class="dropdown-head">
<h3>Shopping Cart</h3>
2025-12-14 01:54:40 -06:00
<button class="dropdown-close" id="cartClose">
<i class="bi bi-x-lg"></i>
</button>
</div>
<div class="dropdown-body" id="cartContent">
<p class="empty-state"><i class="bi bi-cart-x"></i><br>Your cart is empty</p>
</div>
<div class="dropdown-foot">
<a href="/shop" class="btn-outline">Continue Shopping</a>
</div>
</div>
</div>
2025-12-14 01:54:40 -06:00
<button class="mobile-toggle" id="mobileMenuToggle" aria-label="Menu">
<span class="toggle-line"></span>
<span class="toggle-line"></span>
<span class="toggle-line"></span>
</button>
</div>
</div>
2025-12-14 01:54:40 -06:00
<div class="mobile-menu" id="mobileMenu">
<div class="mobile-menu-header">
2026-01-01 22:24:30 -06:00
<span class="mobile-brand">Sky' Art Shop</span>
2025-12-14 01:54:40 -06:00
<button class="mobile-close" id="mobileMenuClose">
<i class="bi bi-x-lg"></i>
</button>
</div>
<ul class="mobile-menu-list">
2026-01-01 22:24:30 -06:00
<li><a href="/home" class="mobile-link">Home</a></li>
<li><a href="/shop" class="mobile-link">Shop</a></li>
<li><a href="/portfolio" class="mobile-link">Portfolio</a></li>
<li><a href="/about" class="mobile-link">About</a></li>
<li><a href="/blog" class="mobile-link">Blog</a></li>
<li><a href="/contact" class="mobile-link">Contact</a></li>
</ul>
</div>
<div class="mobile-menu-overlay" id="mobileMenuOverlay"></div>
</nav>
<script>
// Mobile Menu Toggle
(function() {
const mobileToggle = document.getElementById('mobileMenuToggle');
const mobileMenu = document.getElementById('mobileMenu');
const mobileClose = document.getElementById('mobileMenuClose');
const overlay = document.getElementById('mobileMenuOverlay');
function openMenu() {
mobileMenu.classList.add('active');
overlay.classList.add('active');
document.body.style.overflow = 'hidden';
}
function closeMenu() {
mobileMenu.classList.remove('active');
overlay.classList.remove('active');
document.body.style.overflow = '';
}
if (mobileToggle) mobileToggle.addEventListener('click', openMenu);
if (mobileClose) mobileClose.addEventListener('click', closeMenu);
if (overlay) overlay.addEventListener('click', closeMenu);
// Close on ESC key
document.addEventListener('keydown', function(e) {
if (e.key === 'Escape' && mobileMenu.classList.contains('active')) {
closeMenu();
}
});
})();
</script>
<section class="about-hero">
2025-12-14 01:54:40 -06:00
<div class="container">
<h1>Portfolio</h1>
<p class="hero-subtitle">Explore our creative projects and artwork</p>
</section>
2025-12-14 01:54:40 -06:00
<section
class="portfolio-section"
2026-01-01 22:24:30 -06:00
style="padding: 60px 0; background: #ffebeb"
2025-12-14 01:54:40 -06:00
>
<div id="loadingMessage" style="text-align: center; padding: 40px">
<div class="spinner-border text-primary" role="status">
<span class="visually-hidden">Loading...</span>
<p style="margin-top: 15px; color: #666">
Loading portfolio projects...
</p>
<div
id="portfolioGrid"
class="products-grid"
style="
display: grid;
grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
gap: 30px;
"
></div>
id="noProjects"
style="display: none; text-align: center; padding: 40px; color: #666"
>
<i
class="bi bi-images"
style="font-size: 48px; color: #ccc; margin-bottom: 15px"
></i>
<p>No portfolio projects available at the moment.</p>
<footer class="footer">
2025-12-19 20:44:46 -06:00
<div class="footer-grid">
<div class="footer-col">
<h3 class="footer-title">Sky Art Shop</h3>
<p class="footer-text">
Your destination for unique art pieces and creative supplies.
</p>
2025-12-14 01:54:40 -06:00
<div class="social-links">
2025-12-19 20:44:46 -06:00
<a href="#" class="social-link"><i class="bi bi-facebook"></i></a>
<a href="#" class="social-link"
2025-12-14 01:54:40 -06:00
><i class="bi bi-instagram"></i
></a>
2025-12-19 20:44:46 -06:00
<a href="#" class="social-link"><i class="bi bi-twitter"></i></a>
><i class="bi bi-pinterest"></i
<h4 class="footer-heading">Shop</h4>
<ul class="footer-links">
2026-01-01 22:24:30 -06:00
<li><a href="/shop">All Products</a></li>
<li><a href="/shop?category=paintings">Paintings</a></li>
<li><a href="/shop?category=prints">Prints</a></li>
<li><a href="/shop?category=supplies">Art Supplies</a></li>
2025-12-19 20:44:46 -06:00
</ul>
<h4 class="footer-heading">About</h4>
2026-01-01 22:24:30 -06:00
<li><a href="/about">Our Story</a></li>
<li><a href="/portfolio">Portfolio</a></li>
<li><a href="/blog">Blog</a></li>
<li><a href="/contact">Contact</a></li>
2025-12-19 20:44:46 -06:00
<h4 class="footer-heading">Customer Service</h4>
2026-01-01 22:24:30 -06:00
<li><a href="/shipping-info">Shipping Info</a></li>
<li><a href="/returns">Returns</a></li>
<li><a href="/faq">FAQ</a></li>
<li><a href="/privacy">Privacy Policy</a></li>
2025-12-14 01:54:40 -06:00
<div class="footer-bottom">
2025-12-19 20:44:46 -06:00
<p>&copy; 2025 Sky Art Shop. All rights reserved.</p>
</footer>
2025-12-24 00:13:23 -06:00
<!-- Project Modal -->
<div
id="projectModal"
style="
display: none;
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
background: rgba(0, 0, 0, 0.85);
z-index: 9999;
overflow: hidden;
padding: 0;
"
<div
style="
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
width: 90%;
max-width: 900px;
max-height: 90vh;
background: white;
border-radius: 20px;
overflow: hidden;
box-shadow: 0 20px 60px rgba(0, 0, 0, 0.5);
display: flex;
flex-direction: column;
"
>
<button
onclick="closeProjectModal()"
position: absolute;
top: 20px;
right: 20px;
background: white;
border: none;
width: 44px;
height: 44px;
border-radius: 50%;
cursor: pointer;
font-size: 20px;
display: flex;
align-items: center;
justify-content: center;
z-index: 10;
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3);
transition: all 0.2s;
onmouseover="this.style.transform='scale(1.1)'; this.style.background='#f8f9fa';"
onmouseout="this.style.transform='scale(1)'; this.style.background='white';"
<i class="bi bi-x-lg"></i>
</button>
id="modalContent"
overflow-y: auto;
overflow-x: hidden;
flex: 1;
scroll-behavior: smooth;
</div>
2026-01-01 22:24:30 -06:00
<script src="/assets/js/page-transitions.js?v=1766709739"></script>
<script src="/assets/js/back-button-control.js?v=1766723554"></script>
<script src="/assets/js/main.js"></script>
2025-12-24 00:13:23 -06:00
<script src="/assets/js/navigation.js"></script>
<script src="/assets/js/shop-system.js"></script>
2025-12-14 01:54:40 -06:00
<script src="/assets/js/shopping.js"></script>
2025-12-24 00:13:23 -06:00
let portfolioProjects = [];
// Open project modal
function openProjectModal(projectId) {
try {
const project = portfolioProjects.find((p) => p.id === projectId);
if (!project) {
console.error('[Portfolio] Project not found:', projectId);
return;
}
// Validate project data
if (!project.title) {
console.error('[Portfolio] Invalid project data - missing title:', project);
return;
}
const modal = document.getElementById("projectModal");
const modalContent = document.getElementById("modalContent");
// Safe template with validated data
modalContent.innerHTML = `
2025-12-24 00:13:23 -06:00
<div class="project-image" style="width: 100%; height: 450px; overflow: hidden; background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); flex-shrink: 0;">
2026-01-01 22:24:30 -06:00
<img src="${project.imageurl || "/assets/images/placeholder.svg"}"
2025-12-24 00:13:23 -06:00
alt="${project.title}"
style="width: 100%; height: 100%; object-fit: cover;" />
</div>
<div style="padding: 40px; background: white;">
${
project.category
? `<span style="display: inline-block; background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); color: white; padding: 8px 18px; border-radius: 24px; font-size: 13px; font-weight: 600; margin-bottom: 24px; letter-spacing: 0.5px; text-transform: uppercase;">${project.category}</span>`
: ""
}
<h2 style="font-size: 36px; font-weight: 700; margin: 0 0 24px 0; color: #1a1a1a; line-height: 1.2;">${
project.title
}</h2>
<div style="color: #555; font-size: 17px; line-height: 1.9; margin-bottom: 32px; font-weight: 400;">
${project.description || "No description available."}
</div>
<div style="padding-top: 24px; border-top: 2px solid #f0f0f0; color: #888; font-size: 15px; display: flex; align-items: center; gap: 8px;">
<i class="bi bi-calendar3" style="font-size: 18px;"></i>
<span style="font-weight: 500;">Created on ${new Date(
project.createdat
).toLocaleDateString("en-US", {
year: "numeric",
month: "long",
day: "numeric",
})}</span>
</div>
</div>
`;
modal.style.display = "block";
modalContent.scrollTop = 0;
document.body.style.overflow = "hidden";
} catch (error) {
console.error('[Portfolio] Error opening modal:', error);
alert('Unable to open project details. Please try again.');
2025-12-24 00:13:23 -06:00
}
}
2025-12-24 00:13:23 -06:00
// Close project modal
function closeProjectModal() {
document.getElementById("projectModal").style.display = "none";
document.body.style.overflow = "auto";
}
2025-12-24 00:13:23 -06:00
// Close modal on outside click
document.addEventListener("click", (e) => {
if (e.target === modal) {
closeProjectModal();
}
});
// Close modal on Escape key
document.addEventListener("keydown", (e) => {
if (e.key === "Escape") {
closeProjectModal();
}
});
2025-12-14 01:54:40 -06:00
// Load portfolio projects from API
async function loadPortfolio() {
try {
const response = await fetch("/api/portfolio/projects");
if (response.ok) {
const data = await response.json();
2025-12-24 00:13:23 -06:00
portfolioProjects = data.projects || [];
2025-12-14 01:54:40 -06:00
document.getElementById("loadingMessage").style.display = "none";
2025-12-24 00:13:23 -06:00
if (portfolioProjects.length === 0) {
2025-12-14 01:54:40 -06:00
document.getElementById("noProjects").style.display = "block";
return;
}
// Validate and filter projects
const validProjects = portfolioProjects.filter(project => {
if (!project || !project.id || !project.title) {
console.warn('[Portfolio] Skipping invalid project:', project);
return false;
}
return true;
});
if (validProjects.length === 0) {
document.getElementById("noProjects").style.display = "block";
return;
}
2025-12-14 01:54:40 -06:00
const grid = document.getElementById("portfolioGrid");
grid.innerHTML = validProjects
2025-12-14 01:54:40 -06:00
.map(
(project) => `
2025-12-24 00:13:23 -06:00
<div class="product-card" onclick="openProjectModal('${
project.id
}')" style="background: white; border-radius: 12px; overflow: hidden; box-shadow: 0 2px 8px rgba(0,0,0,0.1); transition: all 0.3s; cursor: pointer;">
2025-12-14 01:54:40 -06:00
<div class="product-image" style="position: relative; padding-top: 100%; overflow: hidden; background: #f5f5f5;">
<img src="${
2026-01-01 22:24:30 -06:00
project.imageurl || "/assets/images/placeholder.svg"
2025-12-14 01:54:40 -06:00
}"
alt="${project.title}"
2025-12-24 00:13:23 -06:00
style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; object-fit: cover; transition: transform 0.3s;"
loading="lazy"
onmouseover="this.style.transform='scale(1.05)'"
onmouseout="this.style.transform='scale(1)'" />
2025-12-14 01:54:40 -06:00
${
project.category
? `<span style="position: absolute; top: 10px; right: 10px; background: rgba(102, 126, 234, 0.9); color: white; padding: 4px 12px; border-radius: 20px; font-size: 12px; font-weight: 500;">${project.category}</span>`
: ""
}
</div>
2025-12-24 00:13:23 -06:00
<div style="padding: 20px; text-align: center;">
<h3 style="font-size: 18px; font-weight: 600; margin: 0; color: #333;">${
2025-12-14 01:54:40 -06:00
project.title
}</h3>
</div>
</div>
`
)
.join("");
} else {
document.getElementById("noProjects").style.display = "block";
}
} catch (error) {
console.error("Error loading portfolio:", error);
document.getElementById("loadingMessage").innerHTML =
'<p style="color: #dc3545;">Error loading portfolio projects. Please try again later.</p>';
// Initialize
loadPortfolio();
</body>
</html>