diff --git a/ghost/portal/src/App.js b/ghost/portal/src/App.js index f32671cf31..eb69903d3a 100644 --- a/ghost/portal/src/App.js +++ b/ghost/portal/src/App.js @@ -374,7 +374,7 @@ export default class App extends React.Component { - {/* */} + ); } diff --git a/ghost/portal/src/components/Frame.styles.js b/ghost/portal/src/components/Frame.styles.js index 152f29da62..9a4afdf2ff 100644 --- a/ghost/portal/src/components/Frame.styles.js +++ b/ghost/portal/src/components/Frame.styles.js @@ -15,6 +15,7 @@ import {PlanSectionStyles} from './common/PlansSection'; import {AvatarStyles} from './common/MemberGravatar'; import {MagicLinkStyles} from './pages/MagicLinkPage'; import {LinkPageStyles} from './pages/LinkPage'; +import {PopupNotificationStyles} from './common/PopupNotification'; // Global styles const FrameStyles = ` @@ -661,6 +662,7 @@ const FrameStyle = MagicLinkStyles + LinkPageStyles + SignupPageStyles + + PopupNotificationStyles + MobileStyles; export default FrameStyle; \ No newline at end of file diff --git a/ghost/portal/src/components/Notification.styles.js b/ghost/portal/src/components/Notification.styles.js index cae80b5d78..10452b416d 100644 --- a/ghost/portal/src/components/Notification.styles.js +++ b/ghost/portal/src/components/Notification.styles.js @@ -19,7 +19,8 @@ const NotificationStyles = ` color: var(--white); border-radius: 5px; box-shadow: 0 3.2px 3.6px rgba(0, 0, 0, 0.024), 0 8.8px 10px -5px rgba(0, 0, 0, 0.12); - animation: notification-slidein 0.6s ease-in-out; + animation: notification-slidein 0.6s ease-in-out, + notification-slideout 0.6s ease-in-out 2s; } .gh-portal-notification p { @@ -51,7 +52,7 @@ const NotificationStyles = ` height: 14px; padding: 12px; transition: all 0.2s ease-in-out forwards; - opacity: 0.5; + opacity: 0.8; } .gh-portal-notification-closeicon:hover { @@ -88,6 +89,12 @@ const NotificationStyles = ` 60% { transform: translateY(8px); } 100% { transform: translateY(0); } } + + @keyframes notification-slideout { + 0% { transform: translateY(0); } + 40% { transform: translateY(8px); } + 100% { transform: translateY(-100px); } + } `; const NotificationStyle = diff --git a/ghost/portal/src/components/PopupModal.js b/ghost/portal/src/components/PopupModal.js index c1b0c95d27..37a4e2598b 100644 --- a/ghost/portal/src/components/PopupModal.js +++ b/ghost/portal/src/components/PopupModal.js @@ -3,6 +3,7 @@ import {hasMode} from '../utils/check-mode'; import AppContext from '../AppContext'; import FrameStyle from './Frame.styles'; import Pages, {getActivePage} from '../pages'; +import PopupNotification from './common/PopupNotification'; const React = require('react'); @@ -89,6 +90,7 @@ class PopupContent extends React.Component { return (
(this.node = node)} tabIndex="-1"> + {this.renderActivePage()}
diff --git a/ghost/portal/src/components/common/PopupNotification.js b/ghost/portal/src/components/common/PopupNotification.js new file mode 100644 index 0000000000..3dc7636167 --- /dev/null +++ b/ghost/portal/src/components/common/PopupNotification.js @@ -0,0 +1,82 @@ +import React from 'react'; +import AppContext from '../../AppContext'; +import {ReactComponent as CloseIcon} from '../../images/icons/close.svg'; + +export const PopupNotificationStyles = ` + .gh-portal-popupnotification { + position: absolute; + top: 8px; + left: 8px; + right: 8px; + padding: 8px; + background: var(--green); + z-index: 9999; + border-radius: 4px; + font-size: 1.3rem; + box-shadow: 0px 0.8151839971542358px 0.8151839971542358px 0px rgba(0,0,0,0.01), + 0px 2.2538793087005615px 2.2538793087005615px 0px rgba(0,0,0,0.02), + 0px 5.426473140716553px 5.426473140716553px 0px rgba(0,0,0,0.03), + 0px 18px 18px 0px rgba(0,0,0,0.04); + animation: popupnotification-slidein 0.6s ease-in-out, + popupnotification-slideout 0.6s ease-in-out 2s; + } + + .gh-portal-popupnotification p { + color: var(--white); + margin: 0; + padding: 0; + font-size: 1.4rem; + letter-spacing: 0.2px; + text-align: center; + } + + .gh-portal-popupnotification .closeicon { + position: absolute; + top: 1px; + bottom: 0; + right: 0; + color: var(--white); + cursor: pointer; + width: 12px; + height: 12px; + padding: 12px; + transition: all 0.2s ease-in-out forwards; + opacity: 0.8; + } + + .gh-portal-popupnotification .closeicon:hover { + opacity: 1.0; + } + + .gh-portal-popupnotification.success { + background: var(--green); + } + + .gh-portal-popupnotification.error { + background: var(--red); + } + + @keyframes popupnotification-slidein { + 0% { transform: translateY(-100px); } + 60% { transform: translateY(8px); } + 100% { transform: translateY(0); } + } + + @keyframes popupnotification-slideout { + 0% { transform: translateY(0); } + 40% { transform: translateY(8px); } + 100% { transform: translateY(-100px); } + } +`; + +export default class PopupNotification extends React.Component { + static contextType = AppContext; + render() { + return ( +
+

Plan changed successfully

+ +
+ ); + } +} \ No newline at end of file