Phase 1: Homepage seamless design - add gradient transitions

- Added gradient transitions between sections in global.css
- Portfolio section now has gradient-top (dark to white fade)
- Blog section now has gradient-bottom (white fade from dark)
- Reduced portfolio overlay opacity from 0.85 to 0.65
- Added border to blog cards for white-on-white visibility
- Blog cards now have primary color accent on hover
This commit is contained in:
Kunthawat Greethong
2026-05-21 14:29:31 +07:00
parent 9db1d12b9c
commit b9cd01a55f
85 changed files with 8005 additions and 4702 deletions

View File

@@ -1,184 +1,449 @@
---
/**
* MOREMINIMORE - FOOTER COMPONENT
* Minimal design with animated elements
*/
const currentYear = new Date().getFullYear();
const socialLinks = [
{ label: "Facebook", href: "https://www.facebook.com/moreminimore", icon: "facebook" },
{ label: "LINE", href: "https://line.me/ti/p/~@539hdlul", icon: "line" },
{ label: "LinkedIn", href: "https://www.linkedin.com/company/moreminimore", icon: "linkedin" },
const navLinks = [
{ label: 'หน้าแรก', href: '/' },
{ label: 'บริการ', href: '/services' },
{ label: 'ผลงาน', href: '/portfolio' },
{ label: 'บทความ', href: '/blog' },
{ label: 'ติดต่อ', href: '/contact' },
];
const footerLinks = [
{ label: "นโยบายความเป็นส่วนตัว", href: "/privacy" },
{ label: "เงื่อนไขการใช้บริการ", href: "/terms" },
{ label: "ติดต่อเรา", href: "/contact" },
const serviceLinks = [
{ label: 'พัฒนาเว็บไซต์', href: '/services/webdev' },
{ label: 'Marketing Automation', href: '/services/marketing' },
{ label: 'AI Automation', href: '/services/automation' },
{ label: 'Tech Consult', href: '/services/ai-consult' },
];
---
<footer class="footer">
<!-- Background Pattern -->
<div class="footer-bg">
<div class="bg-dots"></div>
</div>
<!-- Geometric Elements -->
<div class="footer-geo">
<div class="geo-circle"></div>
<div class="geo-ring"></div>
</div>
<div class="container">
<div class="footer-grid">
<!-- Brand Column -->
<div class="footer-brand">
<img src="/images/logo-long.png" alt="MoreminiMore" class="footer-logo" />
<a href="/" class="footer-logo">
<div class="logo-banner">
<img src="/images/logo-long.png" alt="MoreminiMore" class="logo-img" />
</div>
</a>
<p class="footer-tagline">
บริษัท มอร์มินิมอร์ จำกัด<br />
ผู้เชี่ยวชาญด้าน IT และ Digital Transformation<br />
สำหรับธุรกิจ SMEs ไทย
รับทำเว็บไซต์ SEO AI Chatbot<br/>
สำหรับธุรกิจไทย
</p>
<div class="social-links">
{socialLinks.map((social) => (
<a href={social.href} class="social-link" aria-label={social.label} target="_blank" rel="noopener noreferrer">
<img src={`/icons/social/${social.icon}.svg`} alt={social.label} />
</a>
))}
<!-- Social Links -->
<div class="footer-social">
<a href="https://www.facebook.com/moreminimore" target="_blank" rel="noopener" class="social-btn" aria-label="Facebook">
<img src="/icons/social/facebook.svg" alt="Facebook" />
</a>
<a href="https://line.me/ti/p/~@539hdlul" target="_blank" rel="noopener" class="social-btn" aria-label="LINE">
<img src="/icons/social/line.svg" alt="LINE" />
</a>
<a href="https://www.linkedin.com/company/moreminimore" target="_blank" rel="noopener" class="social-btn" aria-label="LinkedIn">
<img src="/icons/social/linkedin.svg" alt="LinkedIn" />
</a>
</div>
</div>
<div class="footer-links">
<h4>ลิงก์ด่วน</h4>
<ul>
<li><a href="/">หน้าแรก</a></li>
<li><a href="/about">เกี่ยวกับเรา</a></li>
<li><a href="/portfolio">ผลงาน</a></li>
<li><a href="/blog">บทความ</a></li>
<!-- Navigation Links -->
<div class="footer-col">
<h4 class="footer-title">ลิงก์</h4>
<ul class="footer-links">
{navLinks.map(link => (
<li>
<a href={link.href} class="footer-link">
<span class="link-arrow">→</span>
{link.label}
</a>
</li>
))}
</ul>
</div>
<div class="footer-links">
<h4>บริการ</h4>
<ul>
<li><a href="/services/consult">Tech Consult</a></li>
<li><a href="/services/ai">AI Automation</a></li>
<li><a href="/services/marketing">Marketing Automation</a></li>
<li><a href="/services/webdev">พัฒนาเว็บไซต์</a></li>
<!-- Services -->
<div class="footer-col">
<h4 class="footer-title">บริการ</h4>
<ul class="footer-links">
{serviceLinks.map(link => (
<li>
<a href={link.href} class="footer-link">
<span class="link-arrow">→</span>
{link.label}
</a>
</li>
))}
</ul>
</div>
<div class="footer-contact">
<h4>ติดต่อ</h4>
<p><strong>โทร:</strong> 080-995-5945</p>
<p><strong>อีเมล:</strong> contact@moreminimore.com</p>
<p><strong>ที่อยู่:</strong> 53 หมู่ 1 ต.บ้านแพ้ว อ.บ้านแพ้ว สมุทรสาคร 74120</p>
<!-- Contact -->
<div class="footer-col footer-contact">
<h4 class="footer-title">ติดต่อเรา</h4>
<div class="contact-item">
<span class="contact-icon">📞</span>
<a href="tel:0809955945">080-995-5945</a>
</div>
<div class="contact-item">
<span class="contact-icon">✉️</span>
<a href="mailto:contact@moreminimore.com">contact@moreminimore.com</a>
</div>
<div class="contact-item">
<span class="contact-icon">📍</span>
<span>สมุทรสาคร, ประเทศไทย</span>
</div>
<a href="/contact" class="btn btn-primary footer-cta">
ปรึกษาฟรี
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
<path d="M5 12h14M12 5l7 7-7 7"/>
</svg>
</a>
</div>
</div>
<!-- Footer Bottom -->
<div class="footer-bottom">
<p>&copy; {currentYear} บริษัท มอร์มินิมอร์ จำกัด. สงวนลิขสิทธิ์.</p>
<div class="legal-links">
{footerLinks.map((link) => (
<a href={link.href}>{link.label}</a>
))}
<div class="footer-legal">
<p>&copy; {currentYear} MoreminiMore. สงวนลิขสิทธิ์.</p>
</div>
<div class="footer-links-bottom">
<a href="/privacy">นโยบายความเป็นส่วนตัว</a>
<a href="/terms">เงื่อนไขการใช้บริการ</a>
</div>
</div>
</div>
</footer>
<!-- Back to Top Button -->
<button class="back-to-top" id="back-to-top" aria-label="กลับไปด้านบน">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="3">
<path d="M12 19V5M5 12l7-7 7 7"/>
</svg>
</button>
<style>
/* ============================================
FOOTER BASE
============================================ */
.footer {
background: var(--color-light-gray);
color: var(--color-black);
padding: 80px 0 40px;
position: relative;
background: var(--color-dark);
color: var(--color-white);
padding: 100px 0 40px;
overflow: hidden;
}
/* ============================================
BACKGROUND
============================================ */
.footer-bg {
position: absolute;
inset: 0;
pointer-events: none;
}
.bg-dots {
position: absolute;
inset: 0;
background-image: radial-gradient(circle at 1px 1px, rgba(254, 212, 0, 0.06) 1px, transparent 0);
background-size: 50px 50px;
}
/* Geometric Elements */
.footer-geo {
position: absolute;
inset: 0;
pointer-events: none;
overflow: hidden;
}
.geo-circle {
position: absolute;
width: 400px;
height: 400px;
background: var(--color-primary);
border-radius: 50%;
bottom: -200px;
left: -150px;
opacity: 0.03;
}
.geo-ring {
position: absolute;
width: 250px;
height: 250px;
border: 2px solid var(--color-primary);
border-radius: 50%;
top: 20%;
right: -80px;
opacity: 0.08;
}
/* ============================================
GRID
============================================ */
.footer-grid {
display: grid;
grid-template-columns: 2fr 1fr 1fr 1.5fr;
gap: 48px;
margin-bottom: 60px;
grid-template-columns: 1.5fr 1fr 1fr 1.5fr;
gap: 60px;
padding-bottom: 60px;
position: relative;
z-index: 1;
}
/* ============================================
BRAND - LOGO BANNER
============================================ */
.footer-logo {
height: 40px;
margin-bottom: 16px;
display: inline-flex;
margin-bottom: 24px;
}
.logo-banner {
background: var(--color-white);
border-radius: 0 16px 16px 0;
padding: 10px 20px 10px 16px;
box-shadow: 0 4px 20px rgba(0, 0, 0, 0.2);
}
.logo-img {
height: 32px;
width: auto;
display: block;
}
.footer-tagline {
font-size: 14px;
color: var(--color-medium-gray);
margin-bottom: 24px;
line-height: 1.6;
font-size: 15px;
line-height: 1.7;
color: rgba(255, 255, 255, 0.6);
margin-bottom: 32px;
}
.social-links {
/* Social Links */
.footer-social {
display: flex;
gap: 16px;
gap: 12px;
}
.social-link img {
.social-btn {
display: flex;
align-items: center;
justify-content: center;
width: 48px;
height: 48px;
background: rgba(255, 255, 255, 0.08);
border-radius: 50%;
transition: all 0.3s var(--ease-out-expo);
}
.social-btn img {
width: 24px;
height: 24px;
opacity: 0.6;
transition: opacity 0.2s;
object-fit: contain;
}
.social-link:hover img {
opacity: 1;
.social-btn:hover {
background: var(--color-primary);
transform: translateY(-4px);
box-shadow: 0 8px 20px rgba(254, 212, 0, 0.3);
}
.footer-links h4,
.footer-contact h4 {
font-family: var(--font-heading);
font-size: 16px;
font-weight: 600;
margin-bottom: 20px;
color: var(--color-accent);
.social-btn:hover img {
/* Keep original icon colors */
filter: none;
}
.footer-links ul {
/* ============================================
COLUMNS
============================================ */
.footer-title {
font-family: var(--font-display);
font-size: 12px;
font-weight: 700;
text-transform: uppercase;
letter-spacing: 3px;
color: var(--color-primary);
margin-bottom: 24px;
}
.footer-links {
list-style: none;
padding: 0;
display: flex;
flex-direction: column;
gap: 12px;
}
.footer-links li {
.footer-link {
display: inline-flex;
align-items: center;
gap: 8px;
font-size: 15px;
color: rgba(255, 255, 255, 0.7);
transition: all 0.3s ease;
}
.link-arrow {
opacity: 0;
transform: translateX(-10px);
transition: all 0.3s ease;
}
.footer-link:hover {
color: var(--color-primary);
transform: translateX(8px);
}
.footer-link:hover .link-arrow {
opacity: 1;
transform: translateX(0);
}
/* ============================================
CONTACT
============================================ */
.footer-contact {
display: flex;
flex-direction: column;
}
.contact-item {
display: flex;
align-items: center;
gap: 12px;
font-size: 15px;
color: rgba(255, 255, 255, 0.7);
margin-bottom: 12px;
}
.footer-links a {
color: var(--color-medium-gray);
font-size: 14px;
transition: color 0.2s;
.contact-icon {
font-size: 18px;
}
.footer-links a:hover {
color: var(--color-accent);
.contact-item a:hover {
color: var(--color-primary);
}
.footer-contact p {
font-size: 14px;
color: var(--color-medium-gray);
margin-bottom: 12px;
.footer-cta {
margin-top: auto;
align-self: flex-start;
}
.footer-contact strong {
color: var(--color-black);
.footer-cta svg {
width: 20px;
height: 20px;
transition: transform 0.3s ease;
}
.footer-cta:hover svg {
transform: translateX(6px);
}
/* ============================================
BOTTOM
============================================ */
.footer-bottom {
border-top: 1px solid rgba(0, 0, 0, 0.1);
padding-top: 24px;
display: flex;
justify-content: space-between;
align-items: center;
font-size: 13px;
color: var(--color-medium-gray);
padding-top: 32px;
border-top: 1px solid rgba(255, 255, 255, 0.08);
position: relative;
z-index: 1;
}
.legal-links {
.footer-legal p {
font-size: 14px;
color: rgba(255, 255, 255, 0.4);
}
.footer-links-bottom {
display: flex;
gap: 24px;
}
.legal-links a {
color: var(--color-medium-gray);
transition: color 0.2s;
.footer-links-bottom a {
font-size: 14px;
color: rgba(255, 255, 255, 0.4);
transition: color 0.3s ease;
}
.legal-links a:hover {
color: var(--color-accent);
.footer-links-bottom a:hover {
color: var(--color-primary);
}
/* ============================================
BACK TO TOP
============================================ */
.back-to-top {
position: fixed;
bottom: 32px;
right: 32px;
width: 56px;
height: 56px;
background: var(--color-primary);
color: var(--color-black);
border: none;
border-radius: 50%;
cursor: pointer;
display: flex;
align-items: center;
justify-content: center;
opacity: 0;
visibility: hidden;
transform: translateY(20px) scale(0.8);
transition: all 0.3s var(--ease-out-expo);
z-index: 100;
box-shadow: 0 8px 30px rgba(254, 212, 0, 0.4);
}
.back-to-top.visible {
opacity: 1;
visibility: visible;
transform: translateY(0) scale(1);
}
.back-to-top:hover {
transform: translateY(-4px) scale(1.05);
box-shadow: 0 12px 40px rgba(254, 212, 0, 0.5);
}
.back-to-top svg {
width: 24px;
height: 24px;
}
/* ============================================
RESPONSIVE
============================================ */
@media (max-width: 1024px) {
.footer-grid {
grid-template-columns: 1fr 1fr;
grid-template-columns: repeat(2, 1fr);
gap: 48px;
}
.footer-brand {
@@ -187,8 +452,13 @@ const footerLinks = [
}
@media (max-width: 640px) {
.footer {
padding: 60px 0 32px;
}
.footer-grid {
grid-template-columns: 1fr;
gap: 40px;
}
.footer-brand {
@@ -201,9 +471,28 @@ const footerLinks = [
text-align: center;
}
.legal-links {
flex-wrap: wrap;
justify-content: center;
.back-to-top {
bottom: 20px;
right: 20px;
width: 48px;
height: 48px;
}
}
</style>
</style>
<script>
// Back to top functionality
const backToTop = document.getElementById('back-to-top');
window.addEventListener('scroll', () => {
if (window.scrollY > 600) {
backToTop?.classList.add('visible');
} else {
backToTop?.classList.remove('visible');
}
});
backToTop?.addEventListener('click', () => {
window.scrollTo({ top: 0, behavior: 'smooth' });
});
</script>