beautiful scroll to top
This commit is contained in:
parent
93b2690ff4
commit
a8fb3b58a5
|
@ -101,12 +101,20 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
.scrollTopButton {
|
.scrollTopButton {
|
||||||
|
pointer-events: none;
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
left: 2rem;
|
left: 2rem;
|
||||||
position: sticky;
|
position: sticky;
|
||||||
top: calc(100vh - 40px);
|
top: calc(100vh - 40px);
|
||||||
width: 2.8rem;
|
width: 2.8rem;
|
||||||
z-index: 2;
|
z-index: 2;
|
||||||
|
opacity: 0;
|
||||||
|
transition: opacity 0.3s ease-in-out;
|
||||||
|
|
||||||
|
&.visible {
|
||||||
|
opacity: 1;
|
||||||
|
pointer-events: all;
|
||||||
|
}
|
||||||
|
|
||||||
@include media-breakpoint-down(md) {
|
@include media-breakpoint-down(md) {
|
||||||
display: none;
|
display: none;
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
import { createSignal, onMount, Show } from 'solid-js'
|
import { createSignal, onCleanup, onMount, Show } from 'solid-js'
|
||||||
import { useLocalize } from '../../context/localize'
|
import { useLocalize } from '../../context/localize'
|
||||||
import { clsx } from 'clsx'
|
import { clsx } from 'clsx'
|
||||||
import styles from './Edit.module.scss'
|
import styles from './Edit.module.scss'
|
||||||
|
@ -19,6 +19,7 @@ type EditViewProps = {
|
||||||
export const EditView = (props: EditViewProps) => {
|
export const EditView = (props: EditViewProps) => {
|
||||||
const { t } = useLocalize()
|
const { t } = useLocalize()
|
||||||
|
|
||||||
|
const [isScrolled, setIsScrolled] = createSignal(false)
|
||||||
const [topics, setTopics] = createSignal<Topic[]>(null)
|
const [topics, setTopics] = createSignal<Topic[]>(null)
|
||||||
const { page } = useRouter()
|
const { page } = useRouter()
|
||||||
|
|
||||||
|
@ -46,6 +47,17 @@ export const EditView = (props: EditViewProps) => {
|
||||||
setTopics(allTopics)
|
setTopics(allTopics)
|
||||||
})
|
})
|
||||||
|
|
||||||
|
onMount(() => {
|
||||||
|
const handleScroll = () => {
|
||||||
|
setIsScrolled(window.scrollY > 0)
|
||||||
|
}
|
||||||
|
|
||||||
|
window.addEventListener('scroll', handleScroll, { passive: true })
|
||||||
|
onCleanup(() => {
|
||||||
|
window.removeEventListener('scroll', handleScroll)
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
const handleTitleInputChange = (e) => {
|
const handleTitleInputChange = (e) => {
|
||||||
const title = e.currentTarget.value
|
const title = e.currentTarget.value
|
||||||
setForm('title', title)
|
setForm('title', title)
|
||||||
|
@ -78,7 +90,12 @@ export const EditView = (props: EditViewProps) => {
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
<button class={styles.scrollTopButton} onClick={scrollTop}>
|
<button
|
||||||
|
class={clsx(styles.scrollTopButton, {
|
||||||
|
[styles.visible]: isScrolled()
|
||||||
|
})}
|
||||||
|
onClick={scrollTop}
|
||||||
|
>
|
||||||
<Icon name="up-button" class={styles.icon} />
|
<Icon name="up-button" class={styles.icon} />
|
||||||
<span class={styles.scrollTopButtonLabel}>{t('Scroll up')}</span>
|
<span class={styles.scrollTopButtonLabel}>{t('Scroll up')}</span>
|
||||||
</button>
|
</button>
|
||||||
|
|
|
@ -79,7 +79,8 @@ export const EditorProvider = (props: { children: JSX.Element }) => {
|
||||||
mainTopic: form.selectedTopics[0]?.slug || 'society',
|
mainTopic: form.selectedTopics[0]?.slug || 'society',
|
||||||
slug: form.slug,
|
slug: form.slug,
|
||||||
subtitle: form.subtitle,
|
subtitle: form.subtitle,
|
||||||
title: form.title
|
title: form.title,
|
||||||
|
cover: form.coverImageUrl
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
return true
|
return true
|
||||||
|
|
|
@ -585,14 +585,12 @@ export type ShoutInput = {
|
||||||
authors?: InputMaybe<Array<InputMaybe<Scalars['String']>>>
|
authors?: InputMaybe<Array<InputMaybe<Scalars['String']>>>
|
||||||
body?: InputMaybe<Scalars['String']>
|
body?: InputMaybe<Scalars['String']>
|
||||||
community?: InputMaybe<Scalars['Int']>
|
community?: InputMaybe<Scalars['Int']>
|
||||||
|
cover?: InputMaybe<Scalars['String']>
|
||||||
mainTopic?: InputMaybe<Scalars['String']>
|
mainTopic?: InputMaybe<Scalars['String']>
|
||||||
slug?: InputMaybe<Scalars['String']>
|
slug?: InputMaybe<Scalars['String']>
|
||||||
subtitle?: InputMaybe<Scalars['String']>
|
subtitle?: InputMaybe<Scalars['String']>
|
||||||
title?: InputMaybe<Scalars['String']>
|
title?: InputMaybe<Scalars['String']>
|
||||||
topics?: InputMaybe<Array<InputMaybe<Scalars['String']>>>
|
topics?: InputMaybe<Array<InputMaybe<Scalars['String']>>>
|
||||||
versionOf?: InputMaybe<Scalars['String']>
|
|
||||||
visibleForRoles?: InputMaybe<Array<InputMaybe<Scalars['String']>>>
|
|
||||||
visibleForUsers?: InputMaybe<Array<InputMaybe<Scalars['String']>>>
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export type ShoutsFilterBy = {
|
export type ShoutsFilterBy = {
|
||||||
|
|
Loading…
Reference in New Issue
Block a user