diff --git a/src/components/controllers/tutorial/index.js b/src/components/controllers/tutorial/index.js
index fbfb8489e..873f9835d 100644
--- a/src/components/controllers/tutorial/index.js
+++ b/src/components/controllers/tutorial/index.js
@@ -19,6 +19,7 @@ import { usePage } from '../page';
import { useStore, storeCtx } from '../../store-adapter';
import { InjectPrerenderData } from '../../../lib/prerender-data';
import { getContent } from '../../../lib/content';
+import { WithTooltip } from '../../../lib/tooltip/tooltip';
const IS_PRERENDERING = typeof window === 'undefined';
@@ -264,9 +265,14 @@ function TutorialView({
)}
{page.meta.next && (
-
- {page.meta.nextText || 'Next'}
-
+
+
+ {page.meta.nextText || 'Next'}
+
+
)}
diff --git a/src/components/controllers/tutorial/style.module.less b/src/components/controllers/tutorial/style.module.less
index e4ae257df..66ee4ba81 100644
--- a/src/components/controllers/tutorial/style.module.less
+++ b/src/components/controllers/tutorial/style.module.less
@@ -25,15 +25,23 @@
display: flex;
align-content: stretch;
justify-content: stretch;
+ position: relative;
&.solvable:not(&.solved) .nextButton,
&.solvable:not(&.solved) .nextButton:hover {
- background: #534e5b;
+ background-color: transparent;
+ color: #fff;
transform: none;
+ box-shadow: none;
+ border-width: 2px;
+ border-color: var(--color-brand);
+
+ @media all and (prefers-color-scheme: light) {
+ color: black;
+ }
}
.tutorialWindow {
- position: relative;
background: var(--color-page-bg);
color: var(--color-heading);
display: flex;
@@ -43,6 +51,7 @@
transition: opacity 1s ease;
box-shadow: 1px 0 0 var(--color-brand);
overflow-y: scroll;
+ overflow-x: hidden;
z-index: 10;
&::-webkit-scrollbar {
@@ -166,6 +175,8 @@
outline: none;
background: var(--color-btn-background);
color: var(--color-btn);
+ border-width: 2px;
+
cursor: pointer;
&:hover,
&:focus-visible {
@@ -178,10 +189,22 @@
}
}
+ .helpButton,
+ .prevButton {
+ background-color: transparent;
+ color: #fff;
+
+ @media all and (prefers-color-scheme: light) {
+ color: black;
+ }
+ }
+
.nextButton {
- background: var(--color-btn);
- border-color: var(--color-btn-background);
- color: var(--color-btn-background);
+ background-color: var(--color-brand);
+ border-width: 0;
+ color: white;
+ display: flex;
+ align-items: center;
}
.nextButton:hover,
diff --git a/src/lib/tooltip/tooltip.css b/src/lib/tooltip/tooltip.css
new file mode 100644
index 000000000..29fdac0e6
--- /dev/null
+++ b/src/lib/tooltip/tooltip.css
@@ -0,0 +1,35 @@
+.tooltip-enabled:hover + .tooltip-container {
+ opacity: 1;
+}
+
+.tooltip-container {
+ position: absolute;
+ pointer-events: none;
+ opacity: 0;
+ transition: 200ms ease-in-out opacity;
+}
+
+.tooltip-content {
+ position: absolute;
+ transform: translate(-50%, -110%);
+ width: 220px;
+ background-color: black;
+ border-radius: 4px;
+ padding: 6px;
+ text-align: center;
+ z-index: 1;
+}
+
+.tooltip-content:before {
+ content: '';
+ display: block;
+ width: 0;
+ height: 0;
+ position: absolute;
+ border-top: 8px solid black;
+ border-left: 8px solid transparent;
+ border-right: 8px solid transparent;
+ transform: translate(-50%, 0);
+ left: 50%;
+ bottom: -8px;
+}
diff --git a/src/lib/tooltip/tooltip.js b/src/lib/tooltip/tooltip.js
new file mode 100644
index 000000000..f2bd6ad2d
--- /dev/null
+++ b/src/lib/tooltip/tooltip.js
@@ -0,0 +1,40 @@
+import { h } from 'preact';
+import { useRef, useState } from 'preact/hooks';
+import cx from '../cx';
+import './tooltip.css';
+
+export const WithTooltip = ({ children, tooltip, showTooltip = true }) => {
+ const wrapper = useRef();
+ const [pos, setPos] = useState({ top: 0, left: 0 });
+
+ function handleMouseOver() {
+ const rect = wrapper.current.getBoundingClientRect();
+ const header = document
+ .querySelector('#app > header')
+ .getBoundingClientRect();
+ setPos({ top: rect.y - header.height, left: rect.left + rect.width / 2 });
+ }
+
+ return (
+ <>
+
+ {children}
+
+ {showTooltip ? (
+
+ ) : null}
+ >
+ );
+};