Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
187 changes: 187 additions & 0 deletions docs/src/css/footer.css
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand All @@ -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;
}
}
29 changes: 29 additions & 0 deletions docs/src/theme/Footer/index.js
Original file line number Diff line number Diff line change
@@ -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 (
<div className={styles.footerWrapper}>
<Footer {...props} />
<div className="netlifyBadge">
<a
href="https://www.netlify.com"
target="_blank"
rel="noopener noreferrer"
>
<span className="badgeDot"></span>
<span className="badgeText">
This site is powered by <span className="badgeTextNetlify">Netlify</span>
</span>
</a>
</div>
</div>
);
}

13 changes: 13 additions & 0 deletions docs/src/theme/Footer/styles.module.css
Original file line number Diff line number Diff line change
@@ -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;
}