diff --git a/packages/docusaurus-theme-classic/src/theme/AnnouncementBar/index.js b/packages/docusaurus-theme-classic/src/theme/AnnouncementBar/index.js
index a1bc0359b3..475aaf51f1 100644
--- a/packages/docusaurus-theme-classic/src/theme/AnnouncementBar/index.js
+++ b/packages/docusaurus-theme-classic/src/theme/AnnouncementBar/index.js
@@ -5,44 +5,23 @@
* LICENSE file in the root directory of this source tree.
*/
-import React, {useState, useEffect} from 'react';
+import React from 'react';
import useDocusaurusContext from '@docusaurus/useDocusaurusContext';
+import useAnnouncementBarContext from '@theme/hooks/useAnnouncementBarContext';
import styles from './styles.module.css';
-const STORAGE_DISMISS_KEY = 'docusaurus.announcement.dismiss';
-const STORAGE_ID_KEY = 'docusaurus.announcement.id';
-
function AnnouncementBar() {
const {
siteConfig: {themeConfig: {announcementBar = {}}} = {},
} = useDocusaurusContext();
- const {id, content, backgroundColor, textColor} = announcementBar;
- const [isClosed, setClosed] = useState(true);
- const handleClose = () => {
- localStorage.setItem(STORAGE_DISMISS_KEY, true);
- setClosed(true);
- };
+ const {content, backgroundColor, textColor} = announcementBar;
+ const {
+ isAnnouncementBarClosed,
+ closeAnnouncementBar,
+ } = useAnnouncementBarContext();
- useEffect(() => {
- const viewedId = localStorage.getItem(STORAGE_ID_KEY);
- const isNewAnnouncement = id !== viewedId;
-
- localStorage.setItem(STORAGE_ID_KEY, id);
-
- if (isNewAnnouncement) {
- localStorage.setItem(STORAGE_DISMISS_KEY, false);
- }
-
- if (
- isNewAnnouncement ||
- localStorage.getItem(STORAGE_DISMISS_KEY) === 'false'
- ) {
- setClosed(false);
- }
- }, []);
-
- if (!content || isClosed) {
+ if (!content || isAnnouncementBarClosed) {
return null;
}
@@ -59,7 +38,7 @@ function AnnouncementBar() {
diff --git a/packages/docusaurus-theme-classic/src/theme/AnnouncementBar/styles.module.css b/packages/docusaurus-theme-classic/src/theme/AnnouncementBar/styles.module.css
index 6b4ca286e2..12350cc8ec 100644
--- a/packages/docusaurus-theme-classic/src/theme/AnnouncementBar/styles.module.css
+++ b/packages/docusaurus-theme-classic/src/theme/AnnouncementBar/styles.module.css
@@ -5,13 +5,24 @@
* LICENSE file in the root directory of this source tree.
*/
+:root {
+ --docusaurus-announcement-bar-height: auto;
+}
+
.announcementBar {
position: relative;
width: 100%;
+ height: var(--docusaurus-announcement-bar-height);
background-color: var(--ifm-color-primary);
color: var(--ifm-color-black);
}
+@media screen and (min-width: 1024px) {
+ :root {
+ --docusaurus-announcement-bar-height: 30px;
+ }
+}
+
.announcementBarClose {
position: absolute;
right: 0;
diff --git a/packages/docusaurus-theme-classic/src/theme/AnnouncementBarContext.js b/packages/docusaurus-theme-classic/src/theme/AnnouncementBarContext.js
new file mode 100644
index 0000000000..1d1adbe889
--- /dev/null
+++ b/packages/docusaurus-theme-classic/src/theme/AnnouncementBarContext.js
@@ -0,0 +1,15 @@
+/**
+ * Copyright (c) Facebook, Inc. and its affiliates.
+ *
+ * This source code is licensed under the MIT license found in the
+ * LICENSE file in the root directory of this source tree.
+ */
+
+import {createContext} from 'react';
+
+const AnnouncementBarContext = createContext({
+ isAnnouncementBarClosed: false,
+ closeAnnouncementBar: () => {},
+});
+
+export default AnnouncementBarContext;
diff --git a/packages/docusaurus-theme-classic/src/theme/AnnouncementBarProvider/index.js b/packages/docusaurus-theme-classic/src/theme/AnnouncementBarProvider/index.js
new file mode 100644
index 0000000000..e35dfdd1db
--- /dev/null
+++ b/packages/docusaurus-theme-classic/src/theme/AnnouncementBarProvider/index.js
@@ -0,0 +1,24 @@
+/**
+ * Copyright (c) Facebook, Inc. and its affiliates.
+ *
+ * This source code is licensed under the MIT license found in the
+ * LICENSE file in the root directory of this source tree.
+ */
+
+import React from 'react';
+
+import AnnouncementBarContext from '@theme/AnnouncementBarContext';
+import useAnnouncementBar from '@theme/hooks/useAnnouncementBar';
+
+function AnnouncementBarProvider(props) {
+ const {isAnnouncementBarClosed, closeAnnouncementBar} = useAnnouncementBar();
+
+ return (
+