Add sponsor banner
This commit is contained in:
23
components/sponsor-banner/index.js
Normal file
23
components/sponsor-banner/index.js
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
import React from 'react';
|
||||||
|
import { BannerWrap, CloseSponsor, EmojiWrap } from './style';
|
||||||
|
|
||||||
|
export function SponsorBanner({ onCloseBanner = () => null }){
|
||||||
|
return (
|
||||||
|
<div className='row'>
|
||||||
|
<div className='col p-0'>
|
||||||
|
<BannerWrap href='https://google.com' target='_blank' className='alert alert-info'>
|
||||||
|
Sponsored by DigitalOcean
|
||||||
|
<EmojiWrap>😍</EmojiWrap>
|
||||||
|
Check them out!
|
||||||
|
|
||||||
|
<CloseSponsor
|
||||||
|
onClick={(e) => {
|
||||||
|
e.preventDefault();
|
||||||
|
onCloseBanner();
|
||||||
|
}}
|
||||||
|
className='close'>×</CloseSponsor>
|
||||||
|
</BannerWrap>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
37
components/sponsor-banner/style.js
Normal file
37
components/sponsor-banner/style.js
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
import styled from 'styled-components';
|
||||||
|
|
||||||
|
export const BannerWrap = styled.a`
|
||||||
|
margin-bottom: 0;
|
||||||
|
background: #101010;
|
||||||
|
color: white;
|
||||||
|
border: 0;
|
||||||
|
border-radius: 0;
|
||||||
|
padding: 10px 15px;
|
||||||
|
display: block;
|
||||||
|
text-align: center;
|
||||||
|
transition: all 200ms;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
color: white;
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
|
`;
|
||||||
|
|
||||||
|
export const EmojiWrap = styled.span`
|
||||||
|
position: relative;
|
||||||
|
top: 1px;
|
||||||
|
margin: 0 0 0 6px;
|
||||||
|
`;
|
||||||
|
|
||||||
|
export const CloseSponsor = styled.span`
|
||||||
|
color: white;
|
||||||
|
text-shadow: none;
|
||||||
|
margin-right: 15px;
|
||||||
|
position: relative;
|
||||||
|
top: -2px;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
opacity: 1;
|
||||||
|
color: white;
|
||||||
|
}
|
||||||
|
`;
|
@ -62,3 +62,15 @@ code:not([class]) {
|
|||||||
word-wrap: normal;
|
word-wrap: normal;
|
||||||
box-shadow: none;
|
box-shadow: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.banner-wrap {
|
||||||
|
position: fixed;
|
||||||
|
top: 0;
|
||||||
|
left: 0;
|
||||||
|
right: 0;
|
||||||
|
z-index: 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
.body-wrap.sponsor-banner-visible {
|
||||||
|
margin-top: 44px;
|
||||||
|
}
|
@ -1,8 +1,14 @@
|
|||||||
import React from 'react';
|
import React from 'react';
|
||||||
|
import classNames from 'classnames';
|
||||||
import './global.scss';
|
import './global.scss';
|
||||||
import { firePageView } from 'lib/gtag';
|
import { firePageView } from 'lib/gtag';
|
||||||
|
import { SponsorBanner } from '../../components/sponsor-banner';
|
||||||
|
|
||||||
class DefaultLayout extends React.Component {
|
class DefaultLayout extends React.Component {
|
||||||
|
state = {
|
||||||
|
isBannerClosed: false
|
||||||
|
};
|
||||||
|
|
||||||
componentDidMount() {
|
componentDidMount() {
|
||||||
firePageView(window.location.pathname);
|
firePageView(window.location.pathname);
|
||||||
}
|
}
|
||||||
@ -10,8 +16,13 @@ class DefaultLayout extends React.Component {
|
|||||||
render() {
|
render() {
|
||||||
return (
|
return (
|
||||||
<div>
|
<div>
|
||||||
|
<div className={ classNames('banner-wrap', { 'd-none': this.state.isBannerClosed }) }>
|
||||||
|
<SponsorBanner onCloseBanner={() => this.setState({ isBannerClosed: true })} />
|
||||||
|
</div>
|
||||||
|
<div className={ classNames('body-wrap', { 'sponsor-banner-visible': !this.state.isBannerClosed }) }>
|
||||||
{ this.props.children }
|
{ this.props.children }
|
||||||
</div>
|
</div>
|
||||||
|
</div>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user