Skip to content

Commit f4dc0e1

Browse files
Feature/botao voltar ao topo (#280)
Um pequeno botão que pode ser aplicado em uma página. irá se manter invisivel enquanto o usuário não scrollar o equivalente a metade de seu monitor. nesse commit o elemento esta sendo aplicado em App.tsx, pois assim irá ser aplicado globalmente em todas as páginas. porem pode ser aplicado manualmente chamando o componente BackToTop na página. Visual do botão: Normalmente quando visivel. ![image](https://github.com/SOS-RS/frontend/assets/57924586/16e5eb66-dadc-4cd4-b48c-5943ed4b6b40) quando em foco ou com o ponteiro do mouse em cima, sem clicar: ![image](https://github.com/SOS-RS/frontend/assets/57924586/56a7e3a9-fb9c-4413-bc40-eb831793b27f) Para noções de perspectiva, o botão ocupa 48x48 pixels.
2 parents 51a582d + 814f86f commit f4dc0e1

File tree

3 files changed

+46
-0
lines changed

3 files changed

+46
-0
lines changed

src/App.tsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,15 @@ import { BrowserRouter } from 'react-router-dom';
44
import { Routes } from './routes/Routes';
55
import { SessionProvider } from './contexts';
66
import { Toaster } from './components/ui/toaster';
7+
import { BackToTop } from '@/components/BackToTop';
78

89
const App = () => {
910
return (
1011
<Fragment>
1112
<Toaster />
1213
<BrowserRouter>
1314
<SessionProvider>
15+
<BackToTop/>
1416
<Routes />
1517
</SessionProvider>
1618
</BrowserRouter>
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
import { useState } from "react"
2+
import { ArrowUp } from "lucide-react"
3+
4+
5+
const BackToTop =() => {
6+
7+
const [isVisible, setVisibility] = useState(false)
8+
9+
const scrollToTop = () => {
10+
let root = document.getElementById('root')
11+
if (!root) {return}
12+
13+
root.scrollTo({top:0, behavior:"smooth"})
14+
15+
}
16+
17+
document.getElementById("root")?.addEventListener('scroll', (e) => {
18+
if (e.target === null) {return}
19+
let CurrentScrollHeight = (e.target as HTMLElement).scrollTop
20+
let WindowHeight = window.innerHeight
21+
22+
if ( CurrentScrollHeight > WindowHeight / 2) {
23+
setVisibility(true)
24+
} else {
25+
setVisibility(false)
26+
}
27+
})
28+
29+
30+
return (isVisible && (
31+
<button
32+
className=" fixed ease-in-out hidden sm:flex justify-center items-center duration-300
33+
bg-red-600/75 focus:bg-red-700 hover:bg-red-700 z-[100] shadow-slate-600/75
34+
right-6 bottom-6 rounded-full shadow-md
35+
w-12 h-12 "
36+
onClick={scrollToTop}
37+
><ArrowUp color="white" /></button>
38+
));
39+
}
40+
41+
export { BackToTop };

src/components/BackToTop/index.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
import { BackToTop } from "./BackToTop";
2+
3+
export { BackToTop };

0 commit comments

Comments
 (0)