views-refactored
This commit is contained in:
parent
04878bec0b
commit
6bd919f16b
|
@ -1,5 +1,5 @@
|
|||
{
|
||||
"$schema": "https://biomejs.dev/schemas/1.9.2/schema.json",
|
||||
"$schema": "https://biomejs.dev/schemas/1.9.3/schema.json",
|
||||
"files": {
|
||||
"include": ["*.tsx", "*.ts", "*.js", "*.json"],
|
||||
"ignore": ["./dist", "./node_modules", ".husky", "docs", "gen", "*.gen.ts", "*.d.ts"]
|
||||
|
|
2478
package-lock.json
generated
2478
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
96
package.json
96
package.json
|
@ -22,7 +22,7 @@
|
|||
},
|
||||
"devDependencies": {
|
||||
"@authorizerdev/authorizer-js": "^2.0.3",
|
||||
"@biomejs/biome": "^1.9.2",
|
||||
"@biomejs/biome": "^1.9.3",
|
||||
"@graphql-codegen/cli": "^5.0.2",
|
||||
"@graphql-codegen/typescript": "^4.0.9",
|
||||
"@graphql-codegen/typescript-operations": "^4.2.3",
|
||||
|
@ -38,56 +38,56 @@
|
|||
"@solid-primitives/storage": "^4.2.1",
|
||||
"@solid-primitives/upload": "^0.0.117",
|
||||
"@solidjs/meta": "^0.29.4",
|
||||
"@solidjs/router": "^0.14.5",
|
||||
"@solidjs/start": "^1.0.6",
|
||||
"@storybook/addon-a11y": "^8.3.2",
|
||||
"@storybook/addon-actions": "^8.3.2",
|
||||
"@storybook/addon-controls": "^8.3.2",
|
||||
"@storybook/addon-essentials": "^8.3.2",
|
||||
"@storybook/addon-interactions": "^8.3.2",
|
||||
"@storybook/addon-links": "^8.3.2",
|
||||
"@storybook/addon-themes": "^8.3.2",
|
||||
"@storybook/addon-viewport": "^8.3.2",
|
||||
"@storybook/builder-vite": "^8.3.2",
|
||||
"@storybook/docs-tools": "^8.3.2",
|
||||
"@storybook/test": "^8.3.2",
|
||||
"@solidjs/router": "^0.14.7",
|
||||
"@solidjs/start": "^1.0.8",
|
||||
"@storybook/addon-a11y": "^8.3.4",
|
||||
"@storybook/addon-actions": "^8.3.4",
|
||||
"@storybook/addon-controls": "^8.3.4",
|
||||
"@storybook/addon-essentials": "^8.3.4",
|
||||
"@storybook/addon-interactions": "^8.3.4",
|
||||
"@storybook/addon-links": "^8.3.4",
|
||||
"@storybook/addon-themes": "^8.3.4",
|
||||
"@storybook/addon-viewport": "^8.3.4",
|
||||
"@storybook/builder-vite": "^8.3.4",
|
||||
"@storybook/docs-tools": "^8.3.4",
|
||||
"@storybook/test": "^8.3.4",
|
||||
"@storybook/test-runner": "^0.19.1",
|
||||
"@tiptap/core": "^2.7.2",
|
||||
"@tiptap/extension-blockquote": "^2.7.2",
|
||||
"@tiptap/extension-bold": "^2.7.2",
|
||||
"@tiptap/extension-bubble-menu": "^2.7.2",
|
||||
"@tiptap/extension-bullet-list": "^2.7.2",
|
||||
"@tiptap/extension-character-count": "^2.7.2",
|
||||
"@tiptap/extension-collaboration": "^2.7.2",
|
||||
"@tiptap/extension-collaboration-cursor": "^2.7.2",
|
||||
"@tiptap/extension-document": "^2.7.2",
|
||||
"@tiptap/extension-dropcursor": "^2.7.2",
|
||||
"@tiptap/extension-floating-menu": "^2.7.2",
|
||||
"@tiptap/extension-focus": "^2.7.2",
|
||||
"@tiptap/extension-gapcursor": "^2.7.2",
|
||||
"@tiptap/extension-hard-break": "^2.7.2",
|
||||
"@tiptap/extension-heading": "^2.7.2",
|
||||
"@tiptap/extension-highlight": "^2.7.2",
|
||||
"@tiptap/extension-history": "^2.7.2",
|
||||
"@tiptap/extension-horizontal-rule": "^2.7.2",
|
||||
"@tiptap/extension-image": "^2.7.2",
|
||||
"@tiptap/extension-italic": "^2.7.2",
|
||||
"@tiptap/extension-link": "^2.7.2",
|
||||
"@tiptap/extension-list-item": "^2.7.2",
|
||||
"@tiptap/extension-ordered-list": "^2.7.2",
|
||||
"@tiptap/extension-paragraph": "^2.7.2",
|
||||
"@tiptap/extension-placeholder": "^2.7.2",
|
||||
"@tiptap/extension-strike": "^2.7.2",
|
||||
"@tiptap/extension-text": "^2.7.2",
|
||||
"@tiptap/extension-underline": "^2.7.2",
|
||||
"@tiptap/extension-youtube": "^2.7.2",
|
||||
"@tiptap/starter-kit": "^2.7.2",
|
||||
"@tiptap/core": "^2.8.0",
|
||||
"@tiptap/extension-blockquote": "^2.8.0",
|
||||
"@tiptap/extension-bold": "^2.8.0",
|
||||
"@tiptap/extension-bubble-menu": "^2.8.0",
|
||||
"@tiptap/extension-bullet-list": "^2.8.0",
|
||||
"@tiptap/extension-character-count": "^2.8.0",
|
||||
"@tiptap/extension-collaboration": "^2.8.0",
|
||||
"@tiptap/extension-collaboration-cursor": "^2.8.0",
|
||||
"@tiptap/extension-document": "^2.8.0",
|
||||
"@tiptap/extension-dropcursor": "^2.8.0",
|
||||
"@tiptap/extension-floating-menu": "^2.8.0",
|
||||
"@tiptap/extension-focus": "^2.8.0",
|
||||
"@tiptap/extension-gapcursor": "^2.8.0",
|
||||
"@tiptap/extension-hard-break": "^2.8.0",
|
||||
"@tiptap/extension-heading": "^2.8.0",
|
||||
"@tiptap/extension-highlight": "^2.8.0",
|
||||
"@tiptap/extension-history": "^2.8.0",
|
||||
"@tiptap/extension-horizontal-rule": "^2.8.0",
|
||||
"@tiptap/extension-image": "^2.8.0",
|
||||
"@tiptap/extension-italic": "^2.8.0",
|
||||
"@tiptap/extension-link": "^2.8.0",
|
||||
"@tiptap/extension-list-item": "^2.8.0",
|
||||
"@tiptap/extension-ordered-list": "^2.8.0",
|
||||
"@tiptap/extension-paragraph": "^2.8.0",
|
||||
"@tiptap/extension-placeholder": "^2.8.0",
|
||||
"@tiptap/extension-strike": "^2.8.0",
|
||||
"@tiptap/extension-text": "^2.8.0",
|
||||
"@tiptap/extension-underline": "^2.8.0",
|
||||
"@tiptap/extension-youtube": "^2.8.0",
|
||||
"@tiptap/starter-kit": "^2.8.0",
|
||||
"@types/cookie": "^0.6.0",
|
||||
"@types/cookie-signature": "^1.1.2",
|
||||
"@types/node": "^22.6.1",
|
||||
"@types/node": "^22.7.4",
|
||||
"@types/throttle-debounce": "^5.0.2",
|
||||
"@urql/core": "^5.0.6",
|
||||
"axe-playwright": "^2.0.2",
|
||||
"axe-playwright": "^2.0.3",
|
||||
"bootstrap": "^5.3.3",
|
||||
"clsx": "^2.1.1",
|
||||
"cookie": "^0.6.0",
|
||||
|
@ -107,11 +107,11 @@
|
|||
"prosemirror-view": "^1.34.3",
|
||||
"rollup-plugin-visualizer": "^5.12.0",
|
||||
"sass": "1.77.6",
|
||||
"solid-js": "^1.8.23",
|
||||
"solid-js": "^1.9.1",
|
||||
"solid-popper": "^0.3.0",
|
||||
"solid-tiptap": "0.7.0",
|
||||
"solid-transition-group": "^0.2.3",
|
||||
"storybook": "^8.3.2",
|
||||
"storybook": "^8.3.4",
|
||||
"storybook-addon-sass-postcss": "^0.3.2",
|
||||
"storybook-solidjs": "^1.0.0-beta.2",
|
||||
"storybook-solidjs-vite": "^1.0.0-beta.2",
|
||||
|
|
|
@ -13,13 +13,13 @@ import { useTopics } from '~/context/topics'
|
|||
import { useSnackbar, useUI } from '~/context/ui'
|
||||
import { Topic } from '~/graphql/schema/core.gen'
|
||||
import { UploadedFile } from '~/types/upload'
|
||||
import { Modal } from '../../_shared/Modal'
|
||||
import { TopicSelect } from './TopicSelect'
|
||||
import { Modal } from '../_shared/Modal'
|
||||
import { TopicSelect } from '../_shared/TopicSelect'
|
||||
|
||||
import stylesBeside from '../../Feed/Beside.module.scss'
|
||||
import styles from './PublishSettings.module.scss'
|
||||
import styles from '~/styles/views/PublishSettings.module.scss'
|
||||
import stylesBeside from '../Feed/Beside.module.scss' // TODO: should not be here, implement more components
|
||||
|
||||
const MicroEditor = lazy(() => import('../../Editor/MicroEditor'))
|
||||
const MicroEditor = lazy(() => import('../Editor/MicroEditor'))
|
||||
const GrowingTextarea = lazy(() => import('~/components/_shared/GrowingTextarea/GrowingTextarea'))
|
||||
const DESCRIPTION_MAX_LENGTH = 400
|
||||
|
|
@ -7,10 +7,11 @@ import { useLocalize } from '~/context/localize'
|
|||
import type { Shout } from '~/graphql/schema/core.gen'
|
||||
import { restoreScrollPosition, saveScrollPosition } from '~/utils/scroll'
|
||||
import { byScore } from '~/utils/sort'
|
||||
import { FEED_PAGE_SIZE } from '../Views/Feed/Feed'
|
||||
import styles from './SearchModal.module.scss'
|
||||
import { FEED_PAGE_SIZE } from '../Views/FeedView'
|
||||
import { SearchResultItem } from './SearchResultItem'
|
||||
|
||||
import styles from './SearchModal.module.scss'
|
||||
|
||||
// @@TODO handle empty article options after backend support (subtitle, cover, etc.)
|
||||
// @@TODO implement load more
|
||||
// @@TODO implement FILTERS & TOPICS
|
||||
|
|
|
@ -1,26 +0,0 @@
|
|||
.AuthorsList {
|
||||
.action {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
min-height: 8rem;
|
||||
}
|
||||
|
||||
.loading {
|
||||
@include font-size(1.4rem);
|
||||
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
gap: 1rem;
|
||||
width: 100%;
|
||||
flex-direction: row;
|
||||
opacity: 0.5;
|
||||
|
||||
.icon {
|
||||
position: relative;
|
||||
width: 18px;
|
||||
height: 18px;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1 +0,0 @@
|
|||
export { AllAuthors } from './AllAuthors'
|
|
@ -12,8 +12,8 @@ import type { Author } from '~/graphql/schema/core.gen'
|
|||
import { dummyFilter } from '~/intl/dummyFilter'
|
||||
import { authorLetterReduce, translateAuthor } from '~/intl/translate'
|
||||
import { scrollHandler } from '~/utils/scroll'
|
||||
import styles from './AllAuthors.module.scss'
|
||||
import stylesAuthorList from './AuthorsList.module.scss'
|
||||
|
||||
import styles from '~/styles/views/AllAuthors.module.scss'
|
||||
|
||||
type Props = {
|
||||
authors: Author[]
|
||||
|
@ -30,7 +30,7 @@ export const ABC = {
|
|||
|
||||
// useAuthors sorted from context, set filter/sort
|
||||
|
||||
export const AllAuthors = (props: Props) => {
|
||||
export const AllAuthorsView = (props: Props) => {
|
||||
const { t, lang } = useLocalize()
|
||||
const alphabet = createMemo(() => ABC[lang()] || ABC['ru'])
|
||||
const [searchParams] = useSearchParams<{ by?: string }>()
|
||||
|
@ -195,7 +195,7 @@ export const AllAuthors = (props: Props) => {
|
|||
)
|
||||
|
||||
const AuthorsSortedList = () => (
|
||||
<div class={clsx(stylesAuthorList.AuthorsList)}>
|
||||
<div class={clsx(styles.AuthorsList)}>
|
||||
<For each={authorsSorted?.()}>
|
||||
{(author) => (
|
||||
<div class="row">
|
||||
|
@ -207,7 +207,7 @@ export const AllAuthors = (props: Props) => {
|
|||
</For>
|
||||
<div class="row">
|
||||
<div class="col-lg-20 col-xl-18">
|
||||
<div class={stylesAuthorList.action}>
|
||||
<div class={styles.action}>
|
||||
<Show
|
||||
when={
|
||||
searchParams.by !== 'name' &&
|
|
@ -1 +0,0 @@
|
|||
export { AllTopics } from './AllTopics'
|
|
@ -10,8 +10,9 @@ import { findFirstReadableCharIndex, notLatin, notRus } from '~/intl/chars'
|
|||
import { dummyFilter } from '~/intl/dummyFilter'
|
||||
import { capitalize } from '~/utils/capitalize'
|
||||
import { scrollHandler } from '~/utils/scroll'
|
||||
import { TopicBadge } from '../../Topic/TopicBadge'
|
||||
import styles from './AllTopics.module.scss'
|
||||
import { TopicBadge } from '../Topic/TopicBadge'
|
||||
|
||||
import styles from '~/styles/views/AllTopics.module.scss'
|
||||
|
||||
type Props = {
|
||||
topics: Topic[]
|
||||
|
@ -23,7 +24,7 @@ export const ABC = {
|
|||
en: 'ABCDEFGHIJKLMNOPQRSTUVWXYZ#'
|
||||
}
|
||||
|
||||
export const AllTopics = (props: Props) => {
|
||||
export const AllTopicsView = (props: Props) => {
|
||||
const { t, lang } = useLocalize()
|
||||
const alphabet = createMemo(() => ABC[lang()])
|
||||
const { setTopicsSort, sortedTopics } = useTopics()
|
|
@ -1 +0,0 @@
|
|||
export { AuthorView, PRERENDERED_ARTICLES_COUNT } from './Author'
|
|
@ -15,15 +15,16 @@ import getAuthorFollowsQuery from '~/graphql/query/core/author-follows'
|
|||
import type { Author, Reaction, Shout, Topic } from '~/graphql/schema/core.gen'
|
||||
import { restoreScrollPosition, saveScrollPosition } from '~/utils/scroll'
|
||||
import { byCreated } from '~/utils/sort'
|
||||
import stylesArticle from '../../Article/Article.module.scss'
|
||||
import { Comment } from '../../Article/Comment'
|
||||
import { AuthorCard } from '../../Author/AuthorCard'
|
||||
import { AuthorShoutsRating } from '../../Author/AuthorShoutsRating'
|
||||
import { Placeholder } from '../../Feed/Placeholder'
|
||||
import { Row1 } from '../../Feed/Row1'
|
||||
import { Row2 } from '../../Feed/Row2'
|
||||
import { Row3 } from '../../Feed/Row3'
|
||||
import styles from './Author.module.scss'
|
||||
import { Comment } from '../Article/Comment'
|
||||
import { AuthorCard } from '../Author/AuthorCard'
|
||||
import { AuthorShoutsRating } from '../Author/AuthorShoutsRating'
|
||||
import { Placeholder } from '../Feed/Placeholder'
|
||||
import { Row1 } from '../Feed/Row1'
|
||||
import { Row2 } from '../Feed/Row2'
|
||||
import { Row3 } from '../Feed/Row3'
|
||||
|
||||
import styles from '~/styles/views/Author.module.scss'
|
||||
import stylesArticle from '../Article/Article.module.scss'
|
||||
|
||||
type AuthorViewProps = {
|
||||
authorSlug: string
|
|
@ -13,11 +13,12 @@ import getMyShoutQuery from '~/graphql/query/core/article-my'
|
|||
import type { Shout, Topic } from '~/graphql/schema/core.gen'
|
||||
import { isDesktop } from '~/lib/mediaQuery'
|
||||
import { clone } from '~/utils/clone'
|
||||
import { AutoSaveNotice } from '../../Editor/AutoSaveNotice'
|
||||
import { Modal } from '../../_shared/Modal'
|
||||
import { TableOfContents } from '../../_shared/TableOfContents'
|
||||
import { PublishSettings } from '../PublishSettings'
|
||||
import styles from './EditView.module.scss'
|
||||
import { PublishSettings } from '../Draft/PublishSettings'
|
||||
import { AutoSaveNotice } from '../Editor/AutoSaveNotice'
|
||||
import { Modal } from '../_shared/Modal'
|
||||
import { TableOfContents } from '../_shared/TableOfContents'
|
||||
|
||||
import styles from '~/styles/views/EditView.module.scss'
|
||||
|
||||
type Props = {
|
||||
shout: Shout
|
|
@ -22,14 +22,15 @@ import { isDesktop } from '~/lib/mediaQuery'
|
|||
import { LayoutType } from '~/types/common'
|
||||
import { MediaItem } from '~/types/mediaitem'
|
||||
import { clone } from '~/utils/clone'
|
||||
import { AutoSaveNotice } from '../../Editor/AutoSaveNotice'
|
||||
import { AudioUploader } from '../../Upload/AudioUploader'
|
||||
import { VideoUploader } from '../../Upload/VideoUploader'
|
||||
import { Modal } from '../../_shared/Modal'
|
||||
import { TableOfContents } from '../../_shared/TableOfContents'
|
||||
import styles from './EditView.module.scss'
|
||||
import { AutoSaveNotice } from '../Editor/AutoSaveNotice'
|
||||
import { AudioUploader } from '../Upload/AudioUploader'
|
||||
import { VideoUploader } from '../Upload/VideoUploader'
|
||||
import { Modal } from '../_shared/Modal'
|
||||
import { TableOfContents } from '../_shared/TableOfContents'
|
||||
|
||||
const MicroEditor = lazy(() => import('../../Editor/MicroEditor'))
|
||||
import styles from '~/styles/views/EditView.module.scss'
|
||||
|
||||
const MicroEditor = lazy(() => import('../Editor/MicroEditor'))
|
||||
const GrowingTextarea = lazy(() => import('~/components/_shared/GrowingTextarea/GrowingTextarea'))
|
||||
|
||||
type Props = {
|
|
@ -1 +0,0 @@
|
|||
export { EditView } from './EditView'
|
|
@ -1,34 +0,0 @@
|
|||
import { A } from '@solidjs/router'
|
||||
import { clsx } from 'clsx'
|
||||
import { For } from 'solid-js'
|
||||
|
||||
import { ConditionalWrapper } from '~/components/_shared/ConditionalWrapper'
|
||||
import { EXPO_LAYOUTS, EXPO_TITLES } from '~/context/feed'
|
||||
import { useLocalize } from '~/context/localize'
|
||||
import { ExpoLayoutType } from '~/types/common'
|
||||
|
||||
export const ExpoNav = (props: { layout: ExpoLayoutType | '' }) => {
|
||||
const { t } = useLocalize()
|
||||
return (
|
||||
<div class="wide-container">
|
||||
<ul class={clsx('view-switcher')}>
|
||||
<For each={[...EXPO_LAYOUTS, '']}>
|
||||
{(layoutKey) => (
|
||||
<li class={clsx({ 'view-switcher__item--selected': props.layout === layoutKey })}>
|
||||
<ConditionalWrapper
|
||||
condition={props.layout !== layoutKey}
|
||||
wrapper={(children) => <A href={`/expo/${layoutKey}`}>{children}</A>}
|
||||
>
|
||||
<span class="linkReplacement">
|
||||
{layoutKey in EXPO_TITLES ? t(EXPO_TITLES[layoutKey as ExpoLayoutType]) : t('All')}
|
||||
</span>
|
||||
</ConditionalWrapper>
|
||||
</li>
|
||||
)}
|
||||
</For>
|
||||
</ul>
|
||||
</div>
|
||||
)
|
||||
}
|
||||
|
||||
export default ExpoNav
|
|
@ -1 +0,0 @@
|
|||
export { Expo } from './Expo'
|
|
@ -1,17 +1,44 @@
|
|||
import { A } from '@solidjs/router'
|
||||
import clsx from 'clsx'
|
||||
import { For, Show, createEffect, createSignal, on } from 'solid-js'
|
||||
|
||||
import { ConditionalWrapper } from '~/components/_shared/ConditionalWrapper'
|
||||
import { Loading } from '~/components/_shared/Loading'
|
||||
import { ArticleCardSwiper } from '~/components/_shared/SolidSwiper/ArticleCardSwiper'
|
||||
import { EXPO_LAYOUTS, SHOUTS_PER_PAGE } from '~/context/feed'
|
||||
import { EXPO_TITLES } from '~/context/feed'
|
||||
import { useLocalize } from '~/context/localize'
|
||||
import { useSession } from '~/context/session'
|
||||
import getRandomTopShoutsQuery from '~/graphql/query/core/articles-load-random-top'
|
||||
import { LoadShoutsOptions, Shout } from '~/graphql/schema/core.gen'
|
||||
import { ExpoLayoutType } from '~/types/common'
|
||||
import { getUnixtime } from '~/utils/date'
|
||||
import { ArticleCard } from '../../Feed/ArticleCard'
|
||||
import { ArticleCard } from '../Feed/ArticleCard'
|
||||
|
||||
import styles from './Expo.module.scss'
|
||||
import styles from '~/styles/views/Expo.module.scss'
|
||||
|
||||
export const ExpoNav = (props: { layout: ExpoLayoutType | '' }) => {
|
||||
const { t } = useLocalize()
|
||||
return (
|
||||
<div class="wide-container">
|
||||
<ul class={clsx('view-switcher')}>
|
||||
<For each={[...EXPO_LAYOUTS, '']}>
|
||||
{(layoutKey) => (
|
||||
<li class={clsx({ 'view-switcher__item--selected': props.layout === layoutKey })}>
|
||||
<ConditionalWrapper
|
||||
condition={props.layout !== layoutKey}
|
||||
wrapper={(children) => <A href={`/expo/${layoutKey}`}>{children}</A>}
|
||||
>
|
||||
<span class="linkReplacement">
|
||||
{layoutKey in EXPO_TITLES ? t(EXPO_TITLES[layoutKey as ExpoLayoutType]) : t('All')}
|
||||
</span>
|
||||
</ConditionalWrapper>
|
||||
</li>
|
||||
)}
|
||||
</For>
|
||||
</ul>
|
||||
</div>
|
||||
)
|
||||
}
|
||||
|
||||
type Props = {
|
||||
shouts: Shout[]
|
|
@ -1 +0,0 @@
|
|||
export { FeedView as Feed } from './Feed'
|
|
@ -1,6 +1,6 @@
|
|||
import { useLocalize } from '~/context/localize'
|
||||
|
||||
import styles from '../../styles/FeedSettings.module.scss'
|
||||
import styles from '~/styles/views/FeedSettings.module.scss'
|
||||
|
||||
// type FeedSettingsSearchParams = {
|
||||
// by: '' | 'topics' | 'authors' | 'shouts'
|
||||
|
|
|
@ -17,17 +17,18 @@ import { loadUnratedShouts } from '~/graphql/api/private'
|
|||
import type { Author, Reaction, Shout } from '~/graphql/schema/core.gen'
|
||||
import { FeedSearchParams } from '~/routes/feed/[...order]'
|
||||
import { byCreated } from '~/utils/sort'
|
||||
import { CommentDate } from '../../Article/CommentDate'
|
||||
import { getShareUrl } from '../../Article/SharePopup'
|
||||
import { AuthorBadge } from '../../Author/AuthorBadge'
|
||||
import { AuthorLink } from '../../Author/AuthorLink'
|
||||
import { ArticleCard } from '../../Feed/ArticleCard'
|
||||
import stylesBeside from '../../Feed/Beside.module.scss'
|
||||
import stylesTopic from '../../Feed/CardTopic.module.scss'
|
||||
import { Placeholder } from '../../Feed/Placeholder'
|
||||
import { Sidebar } from '../../Feed/Sidebar'
|
||||
import { Modal } from '../../_shared/Modal'
|
||||
import styles from './Feed.module.scss'
|
||||
import { CommentDate } from '../Article/CommentDate'
|
||||
import { getShareUrl } from '../Article/SharePopup'
|
||||
import { AuthorBadge } from '../Author/AuthorBadge'
|
||||
import { AuthorLink } from '../Author/AuthorLink'
|
||||
import { ArticleCard } from '../Feed/ArticleCard'
|
||||
import { Placeholder } from '../Feed/Placeholder'
|
||||
import { Sidebar } from '../Feed/Sidebar'
|
||||
import { Modal } from '../_shared/Modal'
|
||||
|
||||
import styles from '~/styles/views/Feed.module.scss'
|
||||
import stylesBeside from '../Feed/Beside.module.scss'
|
||||
import stylesTopic from '../Feed/CardTopic.module.scss'
|
||||
|
||||
export const FEED_PAGE_SIZE = 20
|
||||
export type PeriodType = 'week' | 'month' | 'year'
|
|
@ -1,10 +1,9 @@
|
|||
import { useNavigate } from '@solidjs/router'
|
||||
import { clsx } from 'clsx'
|
||||
|
||||
import { useLocalize } from '~/context/localize'
|
||||
import { Icon } from '../_shared/Icon'
|
||||
|
||||
import { useNavigate } from '@solidjs/router'
|
||||
import styles from '../../styles/FourOuFour.module.scss'
|
||||
import styles from '~/styles/views/FourOuFour.module.scss'
|
||||
|
||||
type EvType = Event & { submitter: HTMLElement } & { currentTarget: HTMLFormElement; target: Element }
|
||||
|
||||
|
|
|
@ -16,16 +16,16 @@ import type {
|
|||
MutationCreate_MessageArgs
|
||||
} from '~/graphql/schema/chat.gen'
|
||||
import type { Author } from '~/graphql/schema/core.gen'
|
||||
import styles from '~/styles/views/Inbox.module.scss'
|
||||
import { getShortDate } from '~/utils/date'
|
||||
import DialogCard from '../../Inbox/DialogCard'
|
||||
import DialogHeader from '../../Inbox/DialogHeader'
|
||||
import { Message } from '../../Inbox/Message'
|
||||
import MessagesFallback from '../../Inbox/MessagesFallback'
|
||||
import Search from '../../Inbox/Search'
|
||||
import { Modal } from '../../_shared/Modal'
|
||||
import styles from './Inbox.module.scss'
|
||||
import DialogCard from '../Inbox/DialogCard'
|
||||
import DialogHeader from '../Inbox/DialogHeader'
|
||||
import { Message } from '../Inbox/Message'
|
||||
import MessagesFallback from '../Inbox/MessagesFallback'
|
||||
import Search from '../Inbox/Search'
|
||||
import { Modal } from '../_shared/Modal'
|
||||
|
||||
const MiniEditor = lazy(() => import('../../Editor/MiniEditor'))
|
||||
const MiniEditor = lazy(() => import('../Editor/MiniEditor'))
|
||||
|
||||
const userSearch = (array: Author[], keyword: string) => {
|
||||
return array.filter((value) => new RegExp(keyword.trim(), 'gi').test(value.name || ''))
|
|
@ -1,3 +0,0 @@
|
|||
.ProfileSubscriptions {
|
||||
display: block;
|
||||
}
|
|
@ -11,7 +11,8 @@ import { useLocalize } from '~/context/localize'
|
|||
import { useSession } from '~/context/session'
|
||||
import { DEFAULT_HEADER_OFFSET, useSnackbar, useUI } from '~/context/ui'
|
||||
import { validateEmail } from '~/utils/validate'
|
||||
import styles from './Settings.module.scss'
|
||||
|
||||
import styles from '~/styles/views/ProfileSettings.module.scss'
|
||||
|
||||
type FormField = 'oldPassword' | 'newPassword' | 'newPasswordConfirm' | 'email'
|
||||
type FormData = Record<FormField, string | undefined>
|
|
@ -21,20 +21,21 @@ import { useSnackbar, useUI } from '~/context/ui'
|
|||
import { InputMaybe, ProfileInput } from '~/graphql/schema/core.gen'
|
||||
import { getImageUrl } from '~/lib/getThumbUrl'
|
||||
import { handleImageUpload } from '~/lib/handleImageUpload'
|
||||
import { profileSocialLinks } from '~/lib/profileSocialLinks'
|
||||
import { clone } from '~/utils/clone'
|
||||
import { validateUrl } from '~/utils/validate'
|
||||
import { ProfileSettingsNavigation } from '../../ProfileNav'
|
||||
import { Button } from '../../_shared/Button'
|
||||
import { Icon } from '../../_shared/Icon'
|
||||
import { ImageCropper } from '../../_shared/ImageCropper'
|
||||
import { Loading } from '../../_shared/Loading'
|
||||
import { Modal } from '../../_shared/Modal'
|
||||
import { Popover } from '../../_shared/Popover'
|
||||
import { SocialNetworkInput } from '../../_shared/SocialNetworkInput'
|
||||
import styles from './Settings.module.scss'
|
||||
import { profileSocialLinks } from './profileSocialLinks'
|
||||
import { ProfileSettingsNavigation } from '../ProfileNav'
|
||||
import { Button } from '../_shared/Button'
|
||||
import { Icon } from '../_shared/Icon'
|
||||
import { ImageCropper } from '../_shared/ImageCropper'
|
||||
import { Loading } from '../_shared/Loading'
|
||||
import { Modal } from '../_shared/Modal'
|
||||
import { Popover } from '../_shared/Popover'
|
||||
import { SocialNetworkInput } from '../_shared/SocialNetworkInput'
|
||||
|
||||
const MicroEditor = lazy(() => import('../../Editor/MicroEditor'))
|
||||
import styles from '~/styles/views/ProfileSettings.module.scss'
|
||||
|
||||
const MicroEditor = lazy(() => import('../Editor/MicroEditor'))
|
||||
const GrowingTextarea = lazy(() => import('~/components/_shared/GrowingTextarea/GrowingTextarea'))
|
||||
|
||||
function filterNulls(arr: InputMaybe<string>[]): string[] {
|
|
@ -6,11 +6,12 @@ import { FollowsFilter, useFollowing } from '~/context/following'
|
|||
import { useLocalize } from '~/context/localize'
|
||||
import { Author, Topic } from '~/graphql/schema/core.gen'
|
||||
import { dummyFilter } from '~/intl/dummyFilter'
|
||||
import stylesSettings from '../../../styles/FeedSettings.module.scss'
|
||||
import { AuthorBadge } from '../../Author/AuthorBadge'
|
||||
import { ProfileSettingsNavigation } from '../../ProfileNav'
|
||||
import { TopicBadge } from '../../Topic/TopicBadge'
|
||||
import styles from '../Profile/Settings.module.scss'
|
||||
import { AuthorBadge } from '../Author/AuthorBadge'
|
||||
import { ProfileSettingsNavigation } from '../ProfileNav'
|
||||
import { TopicBadge } from '../Topic/TopicBadge'
|
||||
|
||||
import stylesSettings from '~/styles/views/FeedSettings.module.scss'
|
||||
import styles from '~/styles/views/ProfileSettings.module.scss'
|
||||
|
||||
export const ProfileSubscriptions = () => {
|
||||
const { t, lang } = useLocalize()
|
|
@ -1 +0,0 @@
|
|||
export { PublishSettings } from './PublishSettings'
|
|
@ -7,7 +7,7 @@ import type { SearchResult } from '~/graphql/schema/core.gen'
|
|||
import { restoreScrollPosition, saveScrollPosition } from '~/utils/scroll'
|
||||
import { ArticleCard } from '../Feed/ArticleCard'
|
||||
|
||||
import '../../styles/Search.scss'
|
||||
import '~/styles/views/Search.module.scss'
|
||||
|
||||
type Props = {
|
||||
query: string
|
|
@ -9,7 +9,6 @@ import { Author, AuthorsBy, LoadShoutsOptions, Shout, Topic } from '~/graphql/sc
|
|||
import { getUnixtime } from '~/utils/date'
|
||||
import { restoreScrollPosition, saveScrollPosition } from '~/utils/scroll'
|
||||
import { byPublished, byStat } from '~/utils/sort'
|
||||
import styles from '../../styles/Topic.module.scss'
|
||||
import { Beside } from '../Feed/Beside'
|
||||
import { Row1 } from '../Feed/Row1'
|
||||
import { Row2 } from '../Feed/Row2'
|
||||
|
@ -19,6 +18,8 @@ import { LoadMoreItems, LoadMoreWrapper } from '../_shared/LoadMoreWrapper'
|
|||
import { Loading } from '../_shared/Loading'
|
||||
import { ArticleCardSwiper } from '../_shared/SolidSwiper/ArticleCardSwiper'
|
||||
|
||||
import styles from '~/styles/views/Topic.module.scss'
|
||||
|
||||
export type TopicFeedSortBy = 'comments' | '' | 'recent' | 'viewed' | 'rating' | 'last_comment'
|
||||
|
||||
interface Props {
|
|
@ -1,9 +1,9 @@
|
|||
import { type RouteDefinition, type RouteSectionProps, createAsync } from '@solidjs/router'
|
||||
import { HomeView, HomeViewProps } from '~/components/Views/HomeView'
|
||||
import { LoadMoreItems, LoadMoreWrapper } from '~/components/_shared/LoadMoreWrapper'
|
||||
import { SHOUTS_PER_PAGE, useFeed } from '~/context/feed'
|
||||
import { loadShouts, loadTopics } from '~/graphql/api/public'
|
||||
import { LoadShoutsOptions, Shout } from '~/graphql/schema/core.gen'
|
||||
import { HomeView, HomeViewProps } from '../components/Views/Home'
|
||||
import { PageLayout } from '../components/_shared/PageLayout'
|
||||
import { useLocalize } from '../context/localize'
|
||||
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
import { StaticPage } from '~/components/Views/StaticPage'
|
||||
import { StaticPage } from '~/components/Views/StaticPageView'
|
||||
|
||||
export default () => (
|
||||
<StaticPage
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
import { StaticPage } from '../../components/Views/StaticPage'
|
||||
import { StaticPage } from '~/components/Views/StaticPageView'
|
||||
|
||||
export default () => (
|
||||
<StaticPage title={'Dogma'}>
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
import { StaticPage } from '~/components/Views/StaticPage'
|
||||
import { StaticPage } from '~/components/Views/StaticPageView'
|
||||
|
||||
export default () => (
|
||||
<StaticPage
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
import { Feedback } from '~/components/Discours/Feedback'
|
||||
import { StaticPage } from '~/components/Views/StaticPage'
|
||||
import { StaticPage } from '~/components/Views/StaticPageView'
|
||||
import { Modal } from '~/components/_shared/Modal'
|
||||
import { Opener } from '~/components/_shared/Modal/Opener'
|
||||
import { Newsletter } from '~/components/_shared/Newsletter'
|
||||
|
|
|
@ -1,3 +1,3 @@
|
|||
import { StaticPage } from '~/components/Views/StaticPage'
|
||||
import { StaticPage } from '~/components/Views/StaticPageView'
|
||||
|
||||
export default () => <StaticPage title={'Partners'}>{''}</StaticPage>
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
import { StaticPage } from '~/components/Views/StaticPage'
|
||||
import { StaticPage } from '~/components/Views/StaticPageView'
|
||||
|
||||
export default () => (
|
||||
<StaticPage
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
import { Donate } from '~/components/Discours/Donate'
|
||||
import { StaticPage } from '~/components/Views/StaticPage'
|
||||
import { StaticPage } from '~/components/Views/StaticPageView'
|
||||
|
||||
export default () => (
|
||||
<StaticPage
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
import { StaticPage } from '~/components/Views/StaticPage'
|
||||
import { StaticPage } from '~/components/Views/StaticPageView'
|
||||
|
||||
export default () => (
|
||||
<StaticPage title={'Terms of use'} desc={'Rules of the journal Discours'}>
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
import { StaticPage } from '~/components/Views/StaticPage'
|
||||
import { StaticPage } from '~/components/Views/StaticPageView'
|
||||
|
||||
export default () => (
|
||||
<StaticPage
|
||||
|
|
|
@ -1,7 +1,6 @@
|
|||
import { RouteDefinition, RouteLoadFuncArgs, type RouteSectionProps, createAsync } from '@solidjs/router'
|
||||
import { Suspense, createEffect, on } from 'solid-js'
|
||||
import { AllAuthors } from '~/components/Views/AllAuthors'
|
||||
import { AUTHORS_PER_PAGE } from '~/components/Views/AllAuthors/AllAuthors'
|
||||
import { AUTHORS_PER_PAGE, AllAuthorsView } from '~/components/Views/AllAuthorsView'
|
||||
import { Loading } from '~/components/_shared/Loading'
|
||||
import { PageLayout } from '~/components/_shared/PageLayout'
|
||||
import { useAuthors } from '~/context/authors'
|
||||
|
@ -70,7 +69,7 @@ export default function AllAuthorsPage(props: RouteSectionProps<AllAuthorsData>)
|
|||
desc="List of authors of the open editorial community"
|
||||
>
|
||||
<Suspense fallback={<Loading />}>
|
||||
<AllAuthors
|
||||
<AllAuthorsView
|
||||
isLoaded={Boolean(data()?.authors)}
|
||||
authors={data()?.authors || []}
|
||||
authorsByFollowers={data()?.authorsByFollowers}
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
import { RouteSectionProps, createAsync } from '@solidjs/router'
|
||||
import { ErrorBoundary, Suspense, createEffect, createSignal, on } from 'solid-js'
|
||||
import { COMMENTS_PER_PAGE } from '~/components/Article/FullArticle'
|
||||
import { AuthorView } from '~/components/Views/Author'
|
||||
import { AuthorView } from '~/components/Views/AuthorView'
|
||||
import { FourOuFourView } from '~/components/Views/FourOuFour'
|
||||
import { Loading } from '~/components/_shared/Loading'
|
||||
import { PageLayout } from '~/components/_shared/PageLayout'
|
||||
|
|
|
@ -9,7 +9,7 @@ import getShoutDraft from '~/graphql/query/core/article-my'
|
|||
import { Shout } from '~/graphql/schema/core.gen'
|
||||
import { LayoutType } from '~/types/common'
|
||||
|
||||
const EditView = lazy(() => import('~/components/Views/EditView/EditView'))
|
||||
const EditView = lazy(() => import('~/components/Views/EditView'))
|
||||
|
||||
export default (props: RouteSectionProps) => {
|
||||
const { t } = useLocalize()
|
||||
|
|
|
@ -2,7 +2,7 @@ import { AuthToken } from '@authorizerdev/authorizer-js'
|
|||
import { RouteSectionProps } from '@solidjs/router'
|
||||
import { createEffect, createSignal, on } from 'solid-js'
|
||||
import { AuthGuard } from '~/components/AuthGuard'
|
||||
import EditSettingsView from '~/components/Views/EditView/EditSettingsView'
|
||||
import { EditSettingsView } from '~/components/Views/EditSettingsView'
|
||||
import { PageLayout } from '~/components/_shared/PageLayout'
|
||||
import { useLocalize } from '~/context/localize'
|
||||
import { useSession } from '~/context/session'
|
||||
|
|
|
@ -1,8 +1,7 @@
|
|||
import { Params, RouteSectionProps, createAsync } from '@solidjs/router'
|
||||
import { Show, createEffect, createSignal, on } from 'solid-js'
|
||||
import { TopicsNav } from '~/components/HeaderNav/TopicsNav'
|
||||
import { Expo } from '~/components/Views/Expo'
|
||||
import ExpoNav from '~/components/Views/Expo/ExpoNav'
|
||||
import { Expo, ExpoNav } from '~/components/Views/ExpoView'
|
||||
import { LoadMoreItems, LoadMoreWrapper } from '~/components/_shared/LoadMoreWrapper'
|
||||
import { PageLayout } from '~/components/_shared/PageLayout'
|
||||
import { EXPO_LAYOUTS, EXPO_TITLES, SHOUTS_PER_PAGE, useFeed } from '~/context/feed'
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
import { RouteSectionProps, createAsync, useSearchParams } from '@solidjs/router'
|
||||
import { Client } from '@urql/core'
|
||||
import { createEffect, createMemo } from 'solid-js'
|
||||
import { Feed } from '~/components/Views/Feed'
|
||||
import { FeedProps } from '~/components/Views/Feed/Feed'
|
||||
import { FeedView } from '~/components/Views/FeedView'
|
||||
import { FeedProps } from '~/components/Views/FeedView'
|
||||
import { LoadMoreItems, LoadMoreWrapper } from '~/components/_shared/LoadMoreWrapper'
|
||||
import { PageLayout } from '~/components/_shared/PageLayout'
|
||||
import { SHOUTS_PER_PAGE, useFeed } from '~/context/feed'
|
||||
|
@ -104,7 +104,7 @@ export default (props: RouteSectionProps<{ shouts: Shout[]; topics: Topic[] }>)
|
|||
>
|
||||
<LoadMoreWrapper loadFunction={loadMoreFeed} pageSize={SHOUTS_PER_PAGE}>
|
||||
<ReactionsProvider>
|
||||
<Feed shouts={feed() || (shouts() as Shout[])} order={order() as FeedProps['order']} />
|
||||
<FeedView shouts={feed() || (shouts() as Shout[])} order={order() as FeedProps['order']} />
|
||||
</ReactionsProvider>
|
||||
</LoadMoreWrapper>
|
||||
</PageLayout>
|
||||
|
|
|
@ -1,9 +1,8 @@
|
|||
import { RouteSectionProps, useSearchParams } from '@solidjs/router'
|
||||
import { createEffect, createMemo } from 'solid-js'
|
||||
|
||||
import { AUTHORS_PER_PAGE } from '~/components/Views/AllAuthors/AllAuthors'
|
||||
import { Feed } from '~/components/Views/Feed'
|
||||
import { FeedProps } from '~/components/Views/Feed/Feed'
|
||||
import { AUTHORS_PER_PAGE } from '~/components/Views/AllAuthorsView'
|
||||
import { FeedProps, FeedView } from '~/components/Views/FeedView'
|
||||
import { LoadMoreItems, LoadMoreWrapper } from '~/components/_shared/LoadMoreWrapper'
|
||||
import { PageLayout } from '~/components/_shared/PageLayout'
|
||||
import { useFeed } from '~/context/feed'
|
||||
|
@ -92,7 +91,7 @@ export default (props: RouteSectionProps<{ shouts: Shout[]; topics: Topic[] }>)
|
|||
>
|
||||
<LoadMoreWrapper loadFunction={loadMoreMyFeed} pageSize={AUTHORS_PER_PAGE}>
|
||||
<ReactionsProvider>
|
||||
<Feed
|
||||
<FeedView
|
||||
shouts={feed() || []}
|
||||
mode={(mode() || 'all') as FeedProps['mode']}
|
||||
order={order() as FeedProps['order']}
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
import { RouteDefinition, RouteSectionProps, createAsync } from '@solidjs/router'
|
||||
import { InboxView } from '~/components/Views/Inbox/Inbox'
|
||||
import { InboxView } from '~/components/Views/InboxView'
|
||||
import { PageLayout } from '~/components/_shared/PageLayout'
|
||||
import { ShowOnlyOnClient } from '~/components/_shared/ShowOnlyOnClient'
|
||||
import { useAuthors } from '~/context/authors'
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
import { RouteDefinition, RouteSectionProps, createAsync, useParams } from '@solidjs/router'
|
||||
import { createSignal, onMount } from 'solid-js'
|
||||
import { InboxView } from '~/components/Views/Inbox/Inbox'
|
||||
import { InboxView } from '~/components/Views/InboxView'
|
||||
import { PageLayout } from '~/components/_shared/PageLayout'
|
||||
import { ShowOnlyOnClient } from '~/components/_shared/ShowOnlyOnClient'
|
||||
import { useInbox } from '~/context/inbox'
|
||||
|
|
|
@ -1,7 +1,6 @@
|
|||
import { action, useSearchParams } from '@solidjs/router'
|
||||
import { Show, createEffect, createSignal, onCleanup } from 'solid-js'
|
||||
|
||||
import { SearchView } from '~/components/Views/Search'
|
||||
import { SearchView } from '~/components/Views/SearchView'
|
||||
import { Loading } from '~/components/_shared/Loading'
|
||||
import { PageLayout } from '~/components/_shared/PageLayout'
|
||||
import { useLocalize } from '~/context/localize'
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
import { AuthGuard } from '~/components/AuthGuard'
|
||||
import { ProfileSettings } from '~/components/Views/Profile/ProfileSettings'
|
||||
import { ProfileSettings } from '~/components/Views/ProfileSettings'
|
||||
import { PageLayout } from '~/components/_shared/PageLayout'
|
||||
import { useLocalize } from '~/context/localize'
|
||||
import { ProfileProvider } from '~/context/profile'
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
import { AuthGuard } from '~/components/AuthGuard'
|
||||
import { ProfileSecurityView } from '~/components/Views/Profile/ProfileSecurity'
|
||||
import { ProfileSecurityView } from '~/components/Views/ProfileSecurity'
|
||||
import { PageLayout } from '~/components/_shared/PageLayout'
|
||||
import { useLocalize } from '~/context/localize'
|
||||
import { ProfileProvider } from '~/context/profile'
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
import { AuthGuard } from '~/components/AuthGuard'
|
||||
import { ProfileSubscriptions } from '~/components/Views/Profile/ProfileSubscriptions'
|
||||
import { ProfileSubscriptions } from '~/components/Views/ProfileSubscriptions'
|
||||
import { PageLayout } from '~/components/_shared/PageLayout'
|
||||
import { useLocalize } from '~/context/localize'
|
||||
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
import { type RouteDefinition, type RouteSectionProps, createAsync } from '@solidjs/router'
|
||||
import { Suspense, createEffect, on } from 'solid-js'
|
||||
import { AllTopics } from '~/components/Views/AllTopics'
|
||||
import { AllTopicsView } from '~/components/Views/AllTopicsView'
|
||||
import { Loading } from '~/components/_shared/Loading'
|
||||
import { PageLayout } from '~/components/_shared/PageLayout'
|
||||
import { useLocalize } from '~/context/localize'
|
||||
|
@ -35,7 +35,7 @@ export default (props: RouteSectionProps<{ topics: Topic[] }>) => {
|
|||
desc="Thematic table of contents of the magazine. Here you can find all the topics that the community authors wrote about"
|
||||
>
|
||||
<Suspense fallback={<Loading />}>
|
||||
<AllTopics topics={topics() as Topic[]} />
|
||||
<AllTopicsView topics={topics() as Topic[]} />
|
||||
</Suspense>
|
||||
</PageLayout>
|
||||
)
|
||||
|
|
|
@ -2,7 +2,7 @@ import { RouteSectionProps, createAsync } from '@solidjs/router'
|
|||
import { HttpStatusCode } from '@solidjs/start'
|
||||
import { Show, Suspense, createEffect, createSignal, on } from 'solid-js'
|
||||
import { FourOuFourView } from '~/components/Views/FourOuFour'
|
||||
import { TopicFeedSortBy, TopicView } from '~/components/Views/Topic'
|
||||
import { TopicFeedSortBy, TopicView } from '~/components/Views/TopicView'
|
||||
import { Loading } from '~/components/_shared/Loading'
|
||||
import { PageLayout } from '~/components/_shared/PageLayout'
|
||||
import { SHOUTS_PER_PAGE } from '~/context/feed'
|
||||
|
|
|
@ -81,3 +81,29 @@
|
|||
}
|
||||
|
||||
|
||||
.AuthorsList {
|
||||
.action {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
min-height: 8rem;
|
||||
}
|
||||
|
||||
.loading {
|
||||
@include font-size(1.4rem);
|
||||
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
gap: 1rem;
|
||||
width: 100%;
|
||||
flex-direction: row;
|
||||
opacity: 0.5;
|
||||
|
||||
.icon {
|
||||
position: relative;
|
||||
width: 18px;
|
||||
height: 18px;
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user