diff --git a/docs/src/css/footer.css b/docs/src/css/footer.css index a9c9d1a3..1c1b3c36 100644 --- a/docs/src/css/footer.css +++ b/docs/src/css/footer.css @@ -3,10 +3,22 @@ * Footer styling for light and dark modes */ +/* CSS Variables for Netlify Badge */ +:root { + --netlify-badge-color: #8EFBF7; + --netlify-badge-bg-light: rgba(255, 255, 255, 0.1); + --netlify-badge-bg-light-hover: rgba(255, 255, 255, 0.15); + --netlify-badge-bg-dark: rgba(255, 255, 255, 0.08); + --netlify-badge-bg-dark-hover: rgba(255, 255, 255, 0.12); + --netlify-badge-spacing: 0.75rem; + --netlify-badge-gap-reduction: -0.5rem; +} + /* Light mode footer */ .footer { background: linear-gradient(135deg, #1e3a8a 0%, #1e293b 100%); color: #ffffff; + position: relative; } .footer__title { @@ -30,4 +42,179 @@ [data-theme='dark'] .footer__link-item:hover { color: #60a5fa; +} + +/* ============================================ + NETLIFY BADGE STYLES + ============================================ */ + +.netlifyBadge { + position: absolute; + bottom: 20px; + right: 20px; + z-index: 10; +} + +.netlifyBadge a { + display: inline-flex; + align-items: center; + gap: 8px; + padding: 8px 16px; + background: var(--netlify-badge-bg-light); + border: 1px solid var(--netlify-badge-color); + border-radius: 9999px; + color: #ffffff; + text-decoration: none; + font-size: 0.875rem; + font-weight: 500; + transition: all 0.2s ease; + box-shadow: 0 4px 12px rgba(142, 251, 247, 0.2), 0 2px 4px rgba(0, 0, 0, 0.1); + backdrop-filter: blur(12px) saturate(180%); + -webkit-backdrop-filter: blur(12px) saturate(180%); +} + +.netlifyBadge a:hover { + background: var(--netlify-badge-bg-light-hover); + border-color: var(--netlify-badge-color); + transform: translateY(-1px); + box-shadow: 0 6px 16px rgba(142, 251, 247, 0.3), 0 2px 6px rgba(0, 0, 0, 0.15); + text-decoration: none; + color: #ffffff; +} + +.netlifyBadge .badgeDot { + width: 8px; + height: 8px; + border-radius: 50%; + background: var(--netlify-badge-color); + flex-shrink: 0; + box-shadow: 0 0 8px rgba(142, 251, 247, 0.8), 0 0 12px rgba(142, 251, 247, 0.4); + display: inline-block; +} + +.netlifyBadge .badgeText { + white-space: nowrap; +} + +.netlifyBadge .badgeTextNetlify { + color: var(--netlify-badge-color); +} + +/* Dark mode badge adjustments - keep glassmorphism */ +[data-theme='dark'] .netlifyBadge a { + background: var(--netlify-badge-bg-dark); + border: 1px solid var(--netlify-badge-color); +} + +[data-theme='dark'] .netlifyBadge a:hover { + background: var(--netlify-badge-bg-dark-hover); + border-color: var(--netlify-badge-color); +} + +/* ============================================ + RESPONSIVE STYLES + ============================================ */ + +/* Mobile: Badge appears below copyright inside footer */ +@media (max-width: 996px) { + /* Footer spacing reset */ + .footer__bottom { + margin-bottom: 0; + padding-bottom: 0; + } + + .footer { + padding-bottom: 0; + margin-bottom: 0; + } + + /* Badge positioning for mobile */ + .footer ~ .netlifyBadge, + .netlifyBadge { + position: static; + bottom: auto; + right: auto; + margin-top: var(--netlify-badge-gap-reduction); + margin-bottom: 0; + text-align: center; + padding-top: 0; + padding-bottom: var(--netlify-badge-spacing); + padding-left: 1rem; + padding-right: 1rem; + border-top: none; + width: 100%; + background: linear-gradient(135deg, #1e3a8a 0%, #1e293b 100%); + } + + .footer ~ .netlifyBadge { + margin-bottom: 0; + } + + [data-theme='dark'] .footer ~ .netlifyBadge, + [data-theme='dark'] .netlifyBadge { + background: #0a0e1a; + } + + .netlifyBadge a { + padding: 8px 16px; + font-size: 0.875rem; + display: inline-flex; + } + + .netlifyBadge .badgeDot { + width: 8px; + height: 8px; + } +} + +@media (max-width: 768px) { + .footer { + padding-bottom: 0; + margin-bottom: 0; + } + + .netlifyBadge { + margin-top: var(--netlify-badge-gap-reduction); + margin-bottom: 0; + padding-top: 0; + padding-bottom: var(--netlify-badge-spacing); + } + + .netlifyBadge a { + padding: 6px 12px; + font-size: 0.75rem; + } + + .netlifyBadge .badgeDot { + width: 6px; + height: 6px; + } +} + +@media (max-width: 480px) { + .footer { + padding-bottom: 0; + margin-bottom: 0; + } + + .netlifyBadge { + margin-top: var(--netlify-badge-gap-reduction); + margin-bottom: 0; + padding-top: 0; + padding-bottom: var(--netlify-badge-spacing); + } + + .netlifyBadge .badgeText { + display: inline; + } + + .netlifyBadge a { + padding: 6px 12px; + font-size: 0.75rem; + } + + .netlifyBadge .badgeDot { + width: 6px; + height: 6px; + } } \ No newline at end of file diff --git a/docs/src/theme/Footer/index.js b/docs/src/theme/Footer/index.js new file mode 100644 index 00000000..be9f96ea --- /dev/null +++ b/docs/src/theme/Footer/index.js @@ -0,0 +1,29 @@ +/** + * Footer Component + * Custom footer with Netlify badge + */ + +import React from 'react'; +import Footer from '@theme-original/Footer'; +import styles from './styles.module.css'; + +export default function FooterWrapper(props) { + return ( +
+ ); +} + diff --git a/docs/src/theme/Footer/styles.module.css b/docs/src/theme/Footer/styles.module.css new file mode 100644 index 00000000..3b48284b --- /dev/null +++ b/docs/src/theme/Footer/styles.module.css @@ -0,0 +1,13 @@ +/** + * Footer Component Styles (CSS Modules) + * + * Note: Main badge styles are in footer.css for global access. + * This file only contains component-specific layout styles. + */ + +.footerWrapper { + position: relative; + margin-bottom: 0; + padding-bottom: 0; +} +