preprocess-text-fix
This commit is contained in:
parent
a5d15f2808
commit
28c66a564a
|
@ -98,7 +98,7 @@ export const CommentsTree = (props: Props) => {
|
||||||
<h2 class={styles.commentsHeader}>
|
<h2 class={styles.commentsHeader}>
|
||||||
{t('Comments')} {comments().length.toString() || ''}
|
{t('Comments')} {comments().length.toString() || ''}
|
||||||
<Show when={newReactions().length > 0}>
|
<Show when={newReactions().length > 0}>
|
||||||
<span class={styles.newReactions}> +{newReactions().length}</span>
|
<span class={styles.newReactions}>{` +${newReactions().length}`}</span>
|
||||||
</Show>
|
</Show>
|
||||||
</h2>
|
</h2>
|
||||||
<Show when={comments().length > 0}>
|
<Show when={comments().length > 0}>
|
||||||
|
@ -150,7 +150,7 @@ export const CommentsTree = (props: Props) => {
|
||||||
<a href="?m=auth&mode=register" class={styles.link}>
|
<a href="?m=auth&mode=register" class={styles.link}>
|
||||||
{t('sign up')}
|
{t('sign up')}
|
||||||
</a>{' '}
|
</a>{' '}
|
||||||
{t('or')}
|
{t('or')}{' '}
|
||||||
<a href="?m=auth&mode=login" class={styles.link}>
|
<a href="?m=auth&mode=login" class={styles.link}>
|
||||||
{t('sign in')}
|
{t('sign in')}
|
||||||
</a>
|
</a>
|
||||||
|
|
|
@ -1,13 +1,14 @@
|
||||||
import type { Author, Community } from '~/graphql/schema/core.gen'
|
import { redirect, useNavigate, useSearchParams } from '@solidjs/router'
|
||||||
|
|
||||||
import { clsx } from 'clsx'
|
import { clsx } from 'clsx'
|
||||||
import { For, Show, createEffect, createMemo, createSignal, onMount } from 'solid-js'
|
import { For, Show, createEffect, createMemo, createSignal, onMount } from 'solid-js'
|
||||||
import { Button } from '~/components/_shared/Button'
|
import { Button } from '~/components/_shared/Button'
|
||||||
|
import stylesButton from '~/components/_shared/Button/Button.module.scss'
|
||||||
import { FollowingCounters } from '~/components/_shared/FollowingCounters/FollowingCounters'
|
import { FollowingCounters } from '~/components/_shared/FollowingCounters/FollowingCounters'
|
||||||
import { ShowOnlyOnClient } from '~/components/_shared/ShowOnlyOnClient'
|
import { ShowOnlyOnClient } from '~/components/_shared/ShowOnlyOnClient'
|
||||||
import { FollowsFilter, useFollowing } from '~/context/following'
|
import { FollowsFilter, useFollowing } from '~/context/following'
|
||||||
import { useLocalize } from '~/context/localize'
|
import { useLocalize } from '~/context/localize'
|
||||||
import { useSession } from '~/context/session'
|
import { useSession } from '~/context/session'
|
||||||
|
import type { Author, Community } from '~/graphql/schema/core.gen'
|
||||||
import { FollowingEntity, Topic } from '~/graphql/schema/core.gen'
|
import { FollowingEntity, Topic } from '~/graphql/schema/core.gen'
|
||||||
import { isCyrillic } from '~/intl/translate'
|
import { isCyrillic } from '~/intl/translate'
|
||||||
import { translit } from '~/intl/translit'
|
import { translit } from '~/intl/translit'
|
||||||
|
@ -16,9 +17,6 @@ import { Modal } from '../../Nav/Modal'
|
||||||
import { TopicBadge } from '../../Topic/TopicBadge'
|
import { TopicBadge } from '../../Topic/TopicBadge'
|
||||||
import { AuthorBadge } from '../AuthorBadge'
|
import { AuthorBadge } from '../AuthorBadge'
|
||||||
import { Userpic } from '../Userpic'
|
import { Userpic } from '../Userpic'
|
||||||
|
|
||||||
import { useNavigate, useSearchParams } from '@solidjs/router'
|
|
||||||
import stylesButton from '~/components/_shared/Button/Button.module.scss'
|
|
||||||
import styles from './AuthorCard.module.scss'
|
import styles from './AuthorCard.module.scss'
|
||||||
|
|
||||||
type Props = {
|
type Props = {
|
||||||
|
@ -251,7 +249,7 @@ export const AuthorCard = (props: Props) => {
|
||||||
<div class={styles.authorActions}>
|
<div class={styles.authorActions}>
|
||||||
<Button
|
<Button
|
||||||
variant="secondary"
|
variant="secondary"
|
||||||
onClick={() => navigate('/profile')}
|
onClick={() => redirect('/profile')}
|
||||||
value={
|
value={
|
||||||
<>
|
<>
|
||||||
<span class={styles.authorActionsLabel}>{t('Edit profile')}</span>
|
<span class={styles.authorActionsLabel}>{t('Edit profile')}</span>
|
||||||
|
|
|
@ -27,8 +27,8 @@ export const FooterView = () => {
|
||||||
items: [
|
items: [
|
||||||
{ title: t('Discours Manifest'), slug: '/manifest' },
|
{ title: t('Discours Manifest'), slug: '/manifest' },
|
||||||
{ title: t('How it works'), slug: '/guide' },
|
{ title: t('How it works'), slug: '/guide' },
|
||||||
{ title: t('Dogma'), slug: '/guide/dogma' },
|
{ title: t('Dogma'), slug: '/dogma' },
|
||||||
{ title: t('Our principles'), slug: '/guide/principles' },
|
{ title: t('Our principles'), slug: '/principles' },
|
||||||
{ title: t('How to write an article'), slug: '/how-to-write-a-good-article' }
|
{ title: t('How to write an article'), slug: '/how-to-write-a-good-article' }
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
@ -50,7 +50,7 @@ export const FooterView = () => {
|
||||||
{ title: t('Authors'), slug: '/author' },
|
{ title: t('Authors'), slug: '/author' },
|
||||||
{ title: t('Communities'), slug: '/community' },
|
{ title: t('Communities'), slug: '/community' },
|
||||||
{ title: t('Partners'), slug: '/partners' },
|
{ title: t('Partners'), slug: '/partners' },
|
||||||
{ title: t('Special projects'), slug: '/guide/projects' },
|
{ title: t('Special projects'), slug: '/projects' },
|
||||||
{
|
{
|
||||||
title: lang() === 'ru' ? 'English' : 'Русский',
|
title: lang() === 'ru' ? 'English' : 'Русский',
|
||||||
slug: `?lng=${lang() === 'ru' ? 'en' : 'ru'}`,
|
slug: `?lng=${lang() === 'ru' ? 'en' : 'ru'}`,
|
||||||
|
|
|
@ -74,11 +74,11 @@ const data: PlaceholderData = {
|
||||||
href: '/feed?by=last_comment',
|
href: '/feed?by=last_comment',
|
||||||
profileLinks: [
|
profileLinks: [
|
||||||
{
|
{
|
||||||
href: '/guide/debate',
|
href: '/debate',
|
||||||
label: 'Discussion rules'
|
label: 'Discussion rules'
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
href: '/guide/debate#ban',
|
href: '/debate#ban',
|
||||||
label: 'Block rules'
|
label: 'Block rules'
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|
|
@ -27,7 +27,7 @@ export const AuthModalHeader = (props: Props) => {
|
||||||
return {
|
return {
|
||||||
title: t(`${title} to add to your bookmarks`),
|
title: t(`${title} to add to your bookmarks`),
|
||||||
description: t(
|
description: t(
|
||||||
'In bookmarks, you can save favorite discussions and materials that you want to return to'
|
'In bookmarks, you can save favorite discussions and materials that you want to return to'
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -35,7 +35,7 @@ export const AuthModalHeader = (props: Props) => {
|
||||||
return {
|
return {
|
||||||
title: t(`${title} to participate in discussions`),
|
title: t(`${title} to participate in discussions`),
|
||||||
description: t(
|
description: t(
|
||||||
"You ll be able to participate in discussions, rate others' comments and learn about new responses"
|
"You ll be able to participate in discussions, rate others' comments and learn about new responses"
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -43,7 +43,7 @@ export const AuthModalHeader = (props: Props) => {
|
||||||
return {
|
return {
|
||||||
title: t(`${title} to subscribe`),
|
title: t(`${title} to subscribe`),
|
||||||
description: t(
|
description: t(
|
||||||
'This way you ll be able to subscribe to authors, interesting topics and customize your feed'
|
'This way you ll be able to subscribe to authors, interesting topics and customize your feed'
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -51,7 +51,7 @@ export const AuthModalHeader = (props: Props) => {
|
||||||
return {
|
return {
|
||||||
title: t(`${title} to subscribe to new publications`),
|
title: t(`${title} to subscribe to new publications`),
|
||||||
description: t(
|
description: t(
|
||||||
'This way you ll be able to subscribe to authors, interesting topics and customize your feed'
|
'This way you ll be able to subscribe to authors, interesting topics and customize your feed'
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -59,7 +59,7 @@ export const AuthModalHeader = (props: Props) => {
|
||||||
return {
|
return {
|
||||||
title: t(`${title} to vote`),
|
title: t(`${title} to vote`),
|
||||||
description: t(
|
description: t(
|
||||||
'This way we ll realize that you re a real person and ll take your vote into account. And you ll see how others voted'
|
'This way we ll realize that you re a real person and ll take your vote into account. And you ll see how others voted'
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -75,7 +75,7 @@ export const AuthModal = () => {
|
||||||
{t(
|
{t(
|
||||||
'Get to know the most intelligent people of our time, edit and discuss the articles, share your expertise, rate and decide what to publish in the magazine'
|
'Get to know the most intelligent people of our time, edit and discuss the articles, share your expertise, rate and decide what to publish in the magazine'
|
||||||
)}
|
)}
|
||||||
.
|
.{' '}
|
||||||
{t('New stories and more are waiting for you every day!')}
|
{t('New stories and more are waiting for you every day!')}
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
import { A, useLocation, useNavigate, useSearchParams } from '@solidjs/router'
|
import { A, redirect, useLocation, useNavigate, useSearchParams } from '@solidjs/router'
|
||||||
import { clsx } from 'clsx'
|
import { clsx } from 'clsx'
|
||||||
import { For, Show, createEffect, createSignal, onCleanup, onMount } from 'solid-js'
|
import { For, Show, createEffect, createSignal, onCleanup, onMount } from 'solid-js'
|
||||||
import { useLocalize } from '~/context/localize'
|
import { useLocalize } from '~/context/localize'
|
||||||
|
@ -120,7 +120,7 @@ export const Header = (props: Props) => {
|
||||||
requireAuthentication(() => {
|
requireAuthentication(() => {
|
||||||
ev?.preventDefault()
|
ev?.preventDefault()
|
||||||
|
|
||||||
navigate('/edit/new')
|
redirect('/edit/new')
|
||||||
}, 'create')
|
}, 'create')
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -149,13 +149,9 @@ export const Header = (props: Props) => {
|
||||||
}
|
}
|
||||||
|
|
||||||
const handleToggleMenuByLink = (event: MouseEvent, route: string) => {
|
const handleToggleMenuByLink = (event: MouseEvent, route: string) => {
|
||||||
console.debug('toggling menu link', fixed(), route)
|
|
||||||
event.preventDefault()
|
event.preventDefault()
|
||||||
if (loc.pathname === route) {
|
if (fixed()) toggleFixed()
|
||||||
toggleFixed()
|
if (loc.pathname !== route) navigate(route)
|
||||||
}
|
|
||||||
|
|
||||||
navigate(route)
|
|
||||||
}
|
}
|
||||||
return (
|
return (
|
||||||
<header
|
<header
|
||||||
|
@ -248,13 +244,13 @@ export const Header = (props: Props) => {
|
||||||
<h4>{t('Participating')}</h4>
|
<h4>{t('Participating')}</h4>
|
||||||
<ul class="view-switcher">
|
<ul class="view-switcher">
|
||||||
<li>
|
<li>
|
||||||
<a href="/create">{t('Create post')}</a>
|
<A href="/edit/new">{t('Create post')}</A>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<a href="/connect">{t('Suggest an idea')}</a>
|
<A href="/connect">{t('Suggest an idea')}</A>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<a href="/about/help">{t('Support the project')}</a>
|
<A href="/support">{t('Support the project')}</A>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
|
@ -312,9 +308,9 @@ export const Header = (props: Props) => {
|
||||||
</select>
|
</select>
|
||||||
|
|
||||||
<div class={styles.mainNavigationAdditionalLinks}>
|
<div class={styles.mainNavigationAdditionalLinks}>
|
||||||
<a href="/about/dogma">{t('Dogma')}</a>
|
<A href="/dogma">{t('Dogma')}</A>
|
||||||
<a href="/about/discussion-rules" innerHTML={t('Discussion rules')} />
|
<A href="/terms">{t('Discussion rules')}</A>
|
||||||
<a href="/about/principles">{t('Principles')}</a>
|
<A href="/principles">{t('Principles')}</A>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<p
|
<p
|
||||||
|
@ -375,28 +371,28 @@ export const Header = (props: Props) => {
|
||||||
>
|
>
|
||||||
<ul class="nodash">
|
<ul class="nodash">
|
||||||
<li>
|
<li>
|
||||||
<a href="/about/manifest">{t('Manifesto')}</a>
|
<A href="/manifest">{t('Manifesto')}</A>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<a href="/about/dogma">{t('Dogma')}</a>
|
<A href="/dogma">{t('Dogma')}</A>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<a href="/about/principles">{t('Community Principles')}</a>
|
<A href="/principles">{t('Community Principles')}</A>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<a href="/about/guide">{t('Platform Guide')}</a>
|
<A href="/guide">{t('Platform Guide')}</A>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<a href="/about/manifest#participation">{t('Support us')}</a>
|
<A href="/support">{t('Support us')}</A>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<a href="/about/help">{t('How to help')}</a>
|
<A href="/manifest#participation">{t('How to help')}</A>
|
||||||
</li>
|
</li>
|
||||||
<li class={styles.rightItem}>
|
<li class={styles.rightItem}>
|
||||||
<a href="/connect">
|
<A href="/connect">
|
||||||
{t('Suggest an idea')}
|
{t('Suggest an idea')}
|
||||||
<Icon name="arrow-right-black" class={clsx(styles.icon, styles.rightItemIcon)} />
|
<Icon name="arrow-right-black" class={clsx(styles.icon, styles.rightItemIcon)} />
|
||||||
</a>
|
</A>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
|
@ -409,34 +405,37 @@ export const Header = (props: Props) => {
|
||||||
>
|
>
|
||||||
<ul class="nodash">
|
<ul class="nodash">
|
||||||
<li class="item">
|
<li class="item">
|
||||||
<a href="/expo">{t('Art')}</a>
|
<A href="/expo">{t('Art')}</A>
|
||||||
</li>
|
</li>
|
||||||
<li class="item">
|
<li class="item">
|
||||||
<a href="/podcasts">{t('Podcasts')}</a>
|
<A href="/expo/audio">{t('Music')}</A>
|
||||||
</li>
|
</li>
|
||||||
<li class="item">
|
<li class="item">
|
||||||
<a href="/about/projects">{t('Special Projects')}</a>
|
<A href="/expo/video">{t('Video')}</A>
|
||||||
|
</li>
|
||||||
|
<li class="item">
|
||||||
|
<A href="/projects">{t('Special Projects')}</A>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<a href="/topic/interview">#{t('Interview')}</a>
|
<A href="/topic/interview">#{t('Interview')}</A>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<a href="/topic/reportage">#{t('Reports')}</a>
|
<A href="/topic/reportage">#{t('Reports')}</A>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<a href="/topic/empiric">#{t('Experience')}</a>
|
<A href="/topic/empiric">#{t('Experience')}</A>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<a href="/topic/society">#{t('Society')}</a>
|
<A href="/topic/society">#{t('Society')}</A>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<a href="/topic/culture">#{t('Culture')}</a>
|
<A href="/topic/culture">#{t('Culture')}</A>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<a href="/topic/theory">#{t('Theory')}</a>
|
<A href="/topic/theory">#{t('Theory')}</A>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<a href="/topic/poetry">#{t('Poetry')}</a>
|
<A href="/topic/poetry">#{t('Poetry')}</A>
|
||||||
</li>
|
</li>
|
||||||
<li class={styles.rightItem}>
|
<li class={styles.rightItem}>
|
||||||
<A href="/topic">
|
<A href="/topic">
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
import { redirect } from '@solidjs/router'
|
||||||
import { clsx } from 'clsx'
|
import { clsx } from 'clsx'
|
||||||
import type { JSX } from 'solid-js'
|
import type { JSX } from 'solid-js'
|
||||||
import { Show } from 'solid-js'
|
import { Show } from 'solid-js'
|
||||||
|
@ -23,8 +24,11 @@ export const Modal = (props: Props) => {
|
||||||
|
|
||||||
const handleHide = () => {
|
const handleHide = () => {
|
||||||
console.debug('[Modal.handleHide]', modal())
|
console.debug('[Modal.handleHide]', modal())
|
||||||
modal() && props.onClose?.()
|
if (modal()) {
|
||||||
hideModal()
|
if (props.hideClose) redirect('/')
|
||||||
|
props.onClose?.()
|
||||||
|
hideModal()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
useEscKeyDownHandler(handleHide)
|
useEscKeyDownHandler(handleHide)
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
import type { JSX } from 'solid-js/jsx-runtime'
|
import type { JSX } from 'solid-js/jsx-runtime'
|
||||||
import { type ModalType, useUI } from '~/context/ui'
|
import { type ModalType, useUI } from '~/context/ui'
|
||||||
|
|
||||||
export default (props: { name: ModalType; children: JSX.Element }) => {
|
export const Opener = (props: { name: ModalType; children: JSX.Element }) => {
|
||||||
const { showModal } = useUI()
|
const { showModal } = useUI()
|
||||||
return (
|
return (
|
||||||
<a href="#" onClick={() => showModal(props.name)}>
|
<a href="#" onClick={() => showModal(props.name)}>
|
||||||
|
@ -9,3 +9,5 @@ export default (props: { name: ModalType; children: JSX.Element }) => {
|
||||||
</a>
|
</a>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export default Opener
|
||||||
|
|
|
@ -20,7 +20,7 @@ export const Topics = () => {
|
||||||
<A href="/podcasts">{t('Podcasts')}</A>
|
<A href="/podcasts">{t('Podcasts')}</A>
|
||||||
</li>
|
</li>
|
||||||
<li class={styles.item}>
|
<li class={styles.item}>
|
||||||
<A href="/guide/projects">{t('Special Projects')}</A>
|
<A href="/projects">{t('Special Projects')}</A>
|
||||||
</li>
|
</li>
|
||||||
<li class={styles.item}>
|
<li class={styles.item}>
|
||||||
<A href="/topic/interview">#{t('Interview')}</A>
|
<A href="/topic/interview">#{t('Interview')}</A>
|
||||||
|
|
|
@ -1,17 +1,16 @@
|
||||||
import { Meta } from '@solidjs/meta'
|
import { Meta } from '@solidjs/meta'
|
||||||
import { useSearchParams } from '@solidjs/router'
|
import { useSearchParams } from '@solidjs/router'
|
||||||
import { clsx } from 'clsx'
|
import { clsx } from 'clsx'
|
||||||
import { For, Show, createMemo, createSignal, onMount } from 'solid-js'
|
import { For, Show, createEffect, createMemo, createSignal, on } from 'solid-js'
|
||||||
import { Loading } from '~/components/_shared/Loading'
|
import { Loading } from '~/components/_shared/Loading'
|
||||||
import { SearchField } from '~/components/_shared/SearchField'
|
import { SearchField } from '~/components/_shared/SearchField'
|
||||||
import { type SortFunction, useAuthors } from '~/context/authors'
|
import { useAuthors } from '~/context/authors'
|
||||||
import { useLocalize } from '~/context/localize'
|
import { useLocalize } from '~/context/localize'
|
||||||
import type { Author } from '~/graphql/schema/core.gen'
|
import type { Author } from '~/graphql/schema/core.gen'
|
||||||
import enKeywords from '~/intl/locales/en/keywords.json'
|
import enKeywords from '~/intl/locales/en/keywords.json'
|
||||||
import ruKeywords from '~/intl/locales/ru/keywords.json'
|
import ruKeywords from '~/intl/locales/ru/keywords.json'
|
||||||
import { authorLetterReduce, translateAuthor } from '~/intl/translate'
|
import { authorLetterReduce, translateAuthor } from '~/intl/translate'
|
||||||
import { getImageUrl } from '~/lib/getImageUrl'
|
import { getImageUrl } from '~/lib/getImageUrl'
|
||||||
import { byFirstChar, byStat } from '~/lib/sortby'
|
|
||||||
import { scrollHandler } from '~/utils/scroll'
|
import { scrollHandler } from '~/utils/scroll'
|
||||||
import { AuthorsList } from '../../AuthorsList'
|
import { AuthorsList } from '../../AuthorsList'
|
||||||
import styles from './AllAuthors.module.scss'
|
import styles from './AllAuthors.module.scss'
|
||||||
|
@ -33,25 +32,21 @@ export const AllAuthors = (props: Props) => {
|
||||||
const [searchQuery, setSearchQuery] = createSignal('')
|
const [searchQuery, setSearchQuery] = createSignal('')
|
||||||
const alphabet = createMemo(() => ABC[lang()] || ABC['ru'])
|
const alphabet = createMemo(() => ABC[lang()] || ABC['ru'])
|
||||||
const [searchParams] = useSearchParams<{ by?: string }>()
|
const [searchParams] = useSearchParams<{ by?: string }>()
|
||||||
const { authorsSorted, addAuthors, setSortBy } = useAuthors()
|
const { authorsSorted, addAuthors, setAuthorsSort } = useAuthors()
|
||||||
|
createEffect(on(() => searchParams?.by || 'name', setAuthorsSort, {}))
|
||||||
|
createEffect(() => addAuthors?.([...(props.authors || [])]))
|
||||||
|
|
||||||
onMount(() => {
|
|
||||||
addAuthors([...props.authors])
|
|
||||||
const sortStat: string = searchParams?.by || 'name'
|
|
||||||
const sortfn = sortStat
|
|
||||||
? (byStat(sortStat) as SortFunction<Author>)
|
|
||||||
: (byFirstChar as SortFunction<Author>)
|
|
||||||
setSortBy(sortfn)
|
|
||||||
})
|
|
||||||
const filteredAuthors = createMemo(() => {
|
const filteredAuthors = createMemo(() => {
|
||||||
const query = searchQuery().toLowerCase()
|
const query = searchQuery().toLowerCase()
|
||||||
return authorsSorted?.().filter((a: Author) => a?.name?.toLowerCase().includes(query))
|
return authorsSorted?.().filter((a: Author) => a?.name?.toLowerCase().includes(query))
|
||||||
})
|
})
|
||||||
|
|
||||||
const byLetterFiltered = createMemo<{ [letter: string]: Author[] }>(() => {
|
const byLetterFiltered = createMemo<{ [letter: string]: Author[] }>(() => {
|
||||||
return filteredAuthors().reduce(
|
return (
|
||||||
(acc, author: Author) => authorLetterReduce(acc, author, lang()),
|
filteredAuthors()?.reduce(
|
||||||
{} as { [letter: string]: Author[] }
|
(acc, author: Author) => authorLetterReduce(acc, author, lang()),
|
||||||
|
{} as { [letter: string]: Author[] }
|
||||||
|
) || {}
|
||||||
)
|
)
|
||||||
})
|
})
|
||||||
|
|
||||||
|
@ -170,7 +165,7 @@ export const AllAuthors = (props: Props) => {
|
||||||
</Show>
|
</Show>
|
||||||
<Show when={searchParams?.by !== 'name' && props.isLoaded}>
|
<Show when={searchParams?.by !== 'name' && props.isLoaded}>
|
||||||
<AuthorsList
|
<AuthorsList
|
||||||
allAuthorsLength={authorsSorted()?.length || 0}
|
allAuthorsLength={authorsSorted?.()?.length || 0}
|
||||||
searchQuery={searchQuery()}
|
searchQuery={searchQuery()}
|
||||||
query={searchParams?.by === 'followers' ? 'followers' : 'shouts'}
|
query={searchParams?.by === 'followers' ? 'followers' : 'shouts'}
|
||||||
/>
|
/>
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
import { Meta } from '@solidjs/meta'
|
import { Meta } from '@solidjs/meta'
|
||||||
import { A, useSearchParams } from '@solidjs/router'
|
import { A, useSearchParams } from '@solidjs/router'
|
||||||
import { clsx } from 'clsx'
|
import { clsx } from 'clsx'
|
||||||
import { For, Show, createEffect, createMemo, createSignal, on, onMount } from 'solid-js'
|
import { For, Show, createEffect, createMemo, createSignal, on } from 'solid-js'
|
||||||
import { Loading } from '~/components/_shared/Loading'
|
import { Loading } from '~/components/_shared/Loading'
|
||||||
import { SearchField } from '~/components/_shared/SearchField'
|
import { SearchField } from '~/components/_shared/SearchField'
|
||||||
import { useLocalize } from '~/context/localize'
|
import { useLocalize } from '~/context/localize'
|
||||||
|
@ -32,8 +32,8 @@ export const AllTopics = (props: Props) => {
|
||||||
const { setTopicsSort, sortedTopics } = useTopics()
|
const { setTopicsSort, sortedTopics } = useTopics()
|
||||||
const topics = createMemo(() => sortedTopics() || props.topics)
|
const topics = createMemo(() => sortedTopics() || props.topics)
|
||||||
const [searchParams] = useSearchParams<{ by?: string }>()
|
const [searchParams] = useSearchParams<{ by?: string }>()
|
||||||
createEffect(on(() => searchParams?.by || 'shouts', setTopicsSort, { defer: true }))
|
createEffect(on(() => searchParams?.by || 'shouts', setTopicsSort, {}))
|
||||||
onMount(() => setTopicsSort('shouts'))
|
|
||||||
// sorted derivative
|
// sorted derivative
|
||||||
const byLetter = createMemo<{ [letter: string]: Topic[] }>(() => {
|
const byLetter = createMemo<{ [letter: string]: Topic[] }>(() => {
|
||||||
return topics().reduce(
|
return topics().reduce(
|
||||||
|
|
|
@ -21,7 +21,7 @@ import ruKeywords from '~/intl/locales/ru/keywords.json'
|
||||||
import enKeywords from '~/intl/locales/ru/keywords.json'
|
import enKeywords from '~/intl/locales/ru/keywords.json'
|
||||||
import { getImageUrl } from '~/lib/getImageUrl'
|
import { getImageUrl } from '~/lib/getImageUrl'
|
||||||
import { byCreated } from '~/lib/sortby'
|
import { byCreated } from '~/lib/sortby'
|
||||||
import { FeedSearchParams } from '~/routes/feed/[...feed]'
|
import { FeedSearchParams } from '~/routes/feed/[feed]'
|
||||||
import { CommentDate } from '../../Article/CommentDate'
|
import { CommentDate } from '../../Article/CommentDate'
|
||||||
import { getShareUrl } from '../../Article/SharePopup'
|
import { getShareUrl } from '../../Article/SharePopup'
|
||||||
import { AuthorBadge } from '../../Author/AuthorBadge'
|
import { AuthorBadge } from '../../Author/AuthorBadge'
|
||||||
|
@ -264,7 +264,7 @@ export const FeedView = (props: FeedProps) => {
|
||||||
<A href="#">Правила конструктивных дискуссий</A>
|
<A href="#">Правила конструктивных дискуссий</A>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<A href={'/guide/principles'}>Принципы сообщества</A>
|
<A href={'/principles'}>Принципы сообщества</A>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
</section>
|
</section>
|
||||||
|
|
|
@ -35,7 +35,7 @@ export const FeedSettingsView = () => {
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div>
|
<div>
|
||||||
<label for="checkbox1">Комментарии к моим постам</label>
|
<label for="checkbox1">Комментарии к моим постам</label>
|
||||||
<div>
|
<div>
|
||||||
<input type="checkbox" name="checkbox1" id="checkbox1" />
|
<input type="checkbox" name="checkbox1" id="checkbox1" />
|
||||||
<label for="checkbox1" />
|
<label for="checkbox1" />
|
||||||
|
@ -69,7 +69,7 @@ export const FeedSettingsView = () => {
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div>
|
<div>
|
||||||
<label for="checkbox3">добавление моих текстов в коллекции</label>
|
<label for="checkbox3">добавление моих текстов в коллекции</label>
|
||||||
<div>
|
<div>
|
||||||
<input type="checkbox" name="checkbox3" id="checkbox3" />
|
<input type="checkbox" name="checkbox3" id="checkbox3" />
|
||||||
<label for="checkbox3" />
|
<label for="checkbox3" />
|
||||||
|
@ -90,7 +90,7 @@ export const FeedSettingsView = () => {
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div>
|
<div>
|
||||||
<label for="checkbox4">добавление моих текстов в коллекции</label>
|
<label for="checkbox4">добавление моих текстов в коллекции</label>
|
||||||
<div>
|
<div>
|
||||||
<input type="checkbox" name="checkbox4" id="checkbox4" />
|
<input type="checkbox" name="checkbox4" id="checkbox4" />
|
||||||
<label for="checkbox4" />
|
<label for="checkbox4" />
|
||||||
|
|
|
@ -1,24 +1,53 @@
|
||||||
import { JSX } from 'solid-js'
|
import { Meta } from '@solidjs/meta'
|
||||||
|
import { JSX, createMemo } from 'solid-js'
|
||||||
|
import { useLocalize } from '~/context/localize'
|
||||||
|
import enKeywords from '~/intl/locales/en/keywords.json'
|
||||||
|
import ruKeywords from '~/intl/locales/ru/keywords.json'
|
||||||
|
import { processJSXElement } from '~/intl/prepositions'
|
||||||
|
import { getImageUrl } from '~/lib/getImageUrl'
|
||||||
import { TableOfContents } from '../TableOfContents'
|
import { TableOfContents } from '../TableOfContents'
|
||||||
import { PageLayout } from '../_shared/PageLayout'
|
import { PageLayout } from '../_shared/PageLayout'
|
||||||
|
|
||||||
type Props = {
|
type Props = {
|
||||||
title: string
|
title: string
|
||||||
|
desc?: string
|
||||||
children: JSX.Element
|
children: JSX.Element
|
||||||
}
|
}
|
||||||
export const StaticPage = (props: Props) => {
|
export const StaticPage = (props: Props) => {
|
||||||
let articleBodyElement: HTMLElement | null = null
|
let articleBodyElement: HTMLElement | null = null
|
||||||
|
const { t, lang } = useLocalize()
|
||||||
|
const ogTitle = createMemo(() => t(props.title || 'Discours'))
|
||||||
|
const description = createMemo(() => t(props.desc || ''))
|
||||||
|
const ogImage = getImageUrl('production/image/logo_image.png')
|
||||||
|
const keywords = createMemo(() => {
|
||||||
|
const page = props.title.toLocaleLowerCase() as keyof typeof ruKeywords
|
||||||
|
return `${lang() === 'ru' ? ruKeywords[page] : enKeywords[page]}`
|
||||||
|
})
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<PageLayout title={props.title}>
|
<PageLayout title={props.title}>
|
||||||
|
<Meta name="descprition" content={description()} />
|
||||||
|
<Meta name="keywords" content={keywords()} />
|
||||||
|
<Meta name="og:type" content="article" />
|
||||||
|
<Meta name="og:title" content={ogTitle()} />
|
||||||
|
<Meta name="og:image" content={ogImage} />
|
||||||
|
<Meta name="twitter:image" content={ogImage} />
|
||||||
|
<Meta name="og:description" content={description()} />
|
||||||
|
<Meta name="twitter:card" content="summary_large_image" />
|
||||||
|
<Meta name="twitter:title" content={ogTitle()} />
|
||||||
|
<Meta name="twitter:description" content={description()} />
|
||||||
|
<h1>
|
||||||
|
<span class="wrapped">{ogTitle()}</span>
|
||||||
|
</h1>
|
||||||
<article
|
<article
|
||||||
class="wide-container container--static-page"
|
class="wide-container container--static-page"
|
||||||
id="articleBody"
|
id="articleBody"
|
||||||
ref={(el) => (articleBodyElement = el)}
|
ref={(el) => (articleBodyElement = el)}
|
||||||
>
|
>
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-md-12 col-xl-14 offset-md-5 order-md-first">{props.children}</div>
|
<div class="col-md-12 col-xl-14 offset-md-5 order-md-first">
|
||||||
|
{processJSXElement(props.children)}
|
||||||
|
</div>
|
||||||
|
|
||||||
<div class="col-md-6 col-lg-4 order-md-last">
|
<div class="col-md-6 col-lg-4 order-md-last">
|
||||||
<TableOfContents
|
<TableOfContents
|
||||||
|
|
|
@ -48,7 +48,7 @@ export const InviteMembers = (props: Props) => {
|
||||||
const fetcher = async (page: number) => {
|
const fetcher = async (page: number) => {
|
||||||
await new Promise((resolve, reject) => {
|
await new Promise((resolve, reject) => {
|
||||||
const checkDataLoaded = () => {
|
const checkDataLoaded = () => {
|
||||||
if (authorsSorted().length > 0) {
|
if ((authorsSorted?.().length || 0) > 0) {
|
||||||
resolve(true)
|
resolve(true)
|
||||||
} else {
|
} else {
|
||||||
setTimeout(checkDataLoaded, 100)
|
setTimeout(checkDataLoaded, 100)
|
||||||
|
|
|
@ -106,7 +106,7 @@ export const Newsletter = (props: Props) => {
|
||||||
<Icon name="arrow-right" />
|
<Icon name="arrow-right" />
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
<div class="description">Подпишитесь на рассылку лучших публикаций</div>
|
<div class="description">{t('Subscribe to the best publications newsletter')}</div>
|
||||||
</Show>
|
</Show>
|
||||||
<Show when={emailError()}>
|
<Show when={emailError()}>
|
||||||
<div class={styles.error}>{emailError()}</div>
|
<div class={styles.error}>{emailError()}</div>
|
||||||
|
|
|
@ -12,6 +12,7 @@ import loadAuthorByQuery from '~/graphql/query/core/author-by'
|
||||||
import loadAuthorsAllQuery from '~/graphql/query/core/authors-all'
|
import loadAuthorsAllQuery from '~/graphql/query/core/authors-all'
|
||||||
import loadAuthorsByQuery from '~/graphql/query/core/authors-load-by'
|
import loadAuthorsByQuery from '~/graphql/query/core/authors-load-by'
|
||||||
import { Author, Maybe, QueryLoad_Authors_ByArgs, Shout, Topic } from '~/graphql/schema/core.gen'
|
import { Author, Maybe, QueryLoad_Authors_ByArgs, Shout, Topic } from '~/graphql/schema/core.gen'
|
||||||
|
import { byStat } from '~/lib/sortby'
|
||||||
import { useFeed } from './feed'
|
import { useFeed } from './feed'
|
||||||
import { useGraphQL } from './graphql'
|
import { useGraphQL } from './graphql'
|
||||||
|
|
||||||
|
@ -38,7 +39,7 @@ type AuthorsContextType = {
|
||||||
loadAuthors: (args: QueryLoad_Authors_ByArgs) => Promise<void>
|
loadAuthors: (args: QueryLoad_Authors_ByArgs) => Promise<void>
|
||||||
topAuthors: Accessor<Author[]>
|
topAuthors: Accessor<Author[]>
|
||||||
authorsByTopic: Accessor<{ [topicSlug: string]: Author[] }>
|
authorsByTopic: Accessor<{ [topicSlug: string]: Author[] }>
|
||||||
setSortBy: (sortfn: SortFunction<Author>) => void
|
setAuthorsSort: (stat: string) => void
|
||||||
loadAllAuthors: () => Promise<Author[]>
|
loadAllAuthors: () => Promise<Author[]>
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -52,6 +53,7 @@ export const AuthorsProvider = (props: { children: JSX.Element }) => {
|
||||||
const [sortBy, setSortBy] = createSignal<SortFunction<Author>>()
|
const [sortBy, setSortBy] = createSignal<SortFunction<Author>>()
|
||||||
const { feedByAuthor } = useFeed()
|
const { feedByAuthor } = useFeed()
|
||||||
const { query } = useGraphQL()
|
const { query } = useGraphQL()
|
||||||
|
const setAuthorsSort = (stat: string) => setSortBy((_) => byStat(stat) as SortFunction<Author>)
|
||||||
|
|
||||||
// Эффект для отслеживания изменений сигнала sortBy и обновления authorsSorted
|
// Эффект для отслеживания изменений сигнала sortBy и обновления authorsSorted
|
||||||
createEffect(
|
createEffect(
|
||||||
|
@ -59,7 +61,7 @@ export const AuthorsProvider = (props: { children: JSX.Element }) => {
|
||||||
[sortBy, authorsEntities],
|
[sortBy, authorsEntities],
|
||||||
([sortfn, authorsdict]) => {
|
([sortfn, authorsdict]) => {
|
||||||
if (sortfn) {
|
if (sortfn) {
|
||||||
setAuthorsSorted([...filterAndSort(Object.values(authorsdict), sortfn)])
|
setAuthorsSorted?.([...filterAndSort(Object.values(authorsdict), sortfn)])
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{ defer: true }
|
{ defer: true }
|
||||||
|
@ -178,7 +180,7 @@ export const AuthorsProvider = (props: { children: JSX.Element }) => {
|
||||||
loadAuthors,
|
loadAuthors,
|
||||||
topAuthors,
|
topAuthors,
|
||||||
authorsByTopic,
|
authorsByTopic,
|
||||||
setSortBy
|
setAuthorsSort
|
||||||
}
|
}
|
||||||
|
|
||||||
return <AuthorsContext.Provider value={contextValue}>{props.children}</AuthorsContext.Provider>
|
return <AuthorsContext.Provider value={contextValue}>{props.children}</AuthorsContext.Provider>
|
||||||
|
|
|
@ -11,6 +11,7 @@ import {
|
||||||
useContext
|
useContext
|
||||||
} from 'solid-js'
|
} from 'solid-js'
|
||||||
import { TimeAgo, type i18n, i18next, i18nextInit } from '~/intl/i18next'
|
import { TimeAgo, type i18n, i18next, i18nextInit } from '~/intl/i18next'
|
||||||
|
import { processPrepositions } from '~/intl/prepositions'
|
||||||
|
|
||||||
i18nextInit()
|
i18nextInit()
|
||||||
|
|
||||||
|
@ -87,7 +88,7 @@ export const LocalizeProvider = (props: { children: JSX.Element }) => {
|
||||||
try {
|
try {
|
||||||
return i18next.t(...args)
|
return i18next.t(...args)
|
||||||
} catch (_) {
|
} catch (_) {
|
||||||
return args?.length > 0 ? (args[0] as string) : ''
|
return args?.length > 0 ? processPrepositions(args[0] as string) : ''
|
||||||
}
|
}
|
||||||
}) as i18n['t'],
|
}) as i18n['t'],
|
||||||
lang,
|
lang,
|
||||||
|
|
|
@ -105,11 +105,11 @@ const saveTopicsToIndexedDB = async (db: IDBDatabase, topics: Topic[]) => {
|
||||||
await tx.done
|
await tx.done
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
export type TopicSort = 'shouts' | 'followers' | 'authors' | 'title' | ''
|
export type TopicSort = 'shouts' | 'followers' | 'authors' | 'title'
|
||||||
export const TopicsProvider = (props: { children: JSX.Element }) => {
|
export const TopicsProvider = (props: { children: JSX.Element }) => {
|
||||||
const [topicEntities, setTopicEntities] = createSignal<{ [topicSlug: string]: Topic }>({})
|
const [topicEntities, setTopicEntities] = createSignal<{ [topicSlug: string]: Topic }>({})
|
||||||
const [sortedTopics, setSortedTopics] = createSignal<Topic[]>([])
|
const [sortedTopics, setSortedTopics] = createSignal<Topic[]>([])
|
||||||
const [sortAllBy, setSortAllBy] = createSignal<TopicSort>('')
|
const [sortAllBy, setSortAllBy] = createSignal<TopicSort>('shouts')
|
||||||
|
|
||||||
createEffect(() => {
|
createEffect(() => {
|
||||||
const topics = Object.values(topicEntities())
|
const topics = Object.values(topicEntities())
|
||||||
|
|
|
@ -10,18 +10,10 @@ import ru from '~/intl/locales/ru/translation.json'
|
||||||
TimeAgo.addLocale(enTime)
|
TimeAgo.addLocale(enTime)
|
||||||
TimeAgo.addLocale(ruTime)
|
TimeAgo.addLocale(ruTime)
|
||||||
|
|
||||||
class AutoKeyMap extends Map<string, string> {
|
|
||||||
get(key: string): string {
|
|
||||||
return super.get(key) ?? key
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
export const i18nextInit = async (lng = 'ru') => {
|
export const i18nextInit = async (lng = 'ru') => {
|
||||||
if (!i18next.isInitialized) {
|
if (!i18next.isInitialized) {
|
||||||
console.debug('[i18next] initializing...')
|
console.debug('[i18next] initializing...')
|
||||||
|
|
||||||
const enAutoKeyMap = new AutoKeyMap(Object.entries(en))
|
|
||||||
|
|
||||||
await i18next
|
await i18next
|
||||||
.use(HttpApi)
|
.use(HttpApi)
|
||||||
.use(ICU)
|
.use(ICU)
|
||||||
|
@ -34,7 +26,7 @@ export const i18nextInit = async (lng = 'ru') => {
|
||||||
initImmediate: false,
|
initImmediate: false,
|
||||||
resources: {
|
resources: {
|
||||||
ru: { translation: ru },
|
ru: { translation: ru },
|
||||||
en: { translation: enAutoKeyMap }
|
en: { translation: en }
|
||||||
},
|
},
|
||||||
interpolation: {
|
interpolation: {
|
||||||
escapeValue: false
|
escapeValue: false
|
||||||
|
|
|
@ -18,8 +18,8 @@
|
||||||
"Subscribe what you like to tune your personal feed": "Subscribe to topics that interest you to customize your personal feed and get instant updates on new posts and discussions",
|
"Subscribe what you like to tune your personal feed": "Subscribe to topics that interest you to customize your personal feed and get instant updates on new posts and discussions",
|
||||||
"Subscribe who you like to tune your personal feed": "Subscribe to authors you're interested in to customize your personal feed and get instant updates on new posts and discussions",
|
"Subscribe who you like to tune your personal feed": "Subscribe to authors you're interested in to customize your personal feed and get instant updates on new posts and discussions",
|
||||||
"The most interesting publications on the topic": "The most interesting publications on the topic {topicName}",
|
"The most interesting publications on the topic": "The most interesting publications on the topic {topicName}",
|
||||||
"To find publications, art, comments, authors and topics of interest to you, just start typing your query": "To find publications, art, comments, authors and topics of interest to you, just start typing your query",
|
"To find publications, art, comments, authors and topics of interest to you, just start typing your query": "To find publications, art, comments, authors and topics of interest to you, just start typing your query",
|
||||||
"We couldn't find anything for your request": "We couldn’t find anything for your request",
|
"We couldn't find anything for your request": "We couldn't find anything for your request",
|
||||||
"We know you, please try to login": "This email address is already registered, please try to login",
|
"We know you, please try to login": "This email address is already registered, please try to login",
|
||||||
"We've sent you a message with a link to enter our website.": "We've sent you an email with a link to your email. Follow the link in the email to enter our website.",
|
"We've sent you a message with a link to enter our website.": "We've sent you an email with a link to your email. Follow the link in the email to enter our website.",
|
||||||
"Where": "From",
|
"Where": "From",
|
||||||
|
|
|
@ -234,7 +234,7 @@
|
||||||
"I know the password": "Я знаю пароль!",
|
"I know the password": "Я знаю пароль!",
|
||||||
"Image format not supported": "Тип изображения не поддерживается",
|
"Image format not supported": "Тип изображения не поддерживается",
|
||||||
"images": "изображения",
|
"images": "изображения",
|
||||||
"In bookmarks, you can save favorite discussions and materials that you want to return to": "В закладках можно сохранять избранные дискуссии и материалы, к которым хочется вернуться",
|
"In bookmarks, you can save favorite discussions and materials that you want to return to": "В закладках можно сохранять избранные дискуссии и материалы, к которым хочется вернуться",
|
||||||
"Inbox": "Входящие",
|
"Inbox": "Входящие",
|
||||||
"Incorrect new password confirm": "Неверное подтверждение нового пароля",
|
"Incorrect new password confirm": "Неверное подтверждение нового пароля",
|
||||||
"Incorrect old password": "Старый пароль не верен",
|
"Incorrect old password": "Старый пароль не верен",
|
||||||
|
@ -444,7 +444,7 @@
|
||||||
"Subscribe": "Подписаться",
|
"Subscribe": "Подписаться",
|
||||||
"Subscribe to comments": "Подписаться на комментарии",
|
"Subscribe to comments": "Подписаться на комментарии",
|
||||||
"Subscribe to the best publications newsletter": "Подпишитесь на рассылку лучших публикаций",
|
"Subscribe to the best publications newsletter": "Подпишитесь на рассылку лучших публикаций",
|
||||||
"Subscribe us": "Подпишитесь на нас",
|
"Subscribe us": "Подпишитесь на нас",
|
||||||
"Subscribe what you like to tune your personal feed": "Подпишитесь на интересующие вас темы, чтобы настроить вашу персональную ленту и моментально узнавать о новых публикациях и обсуждениях",
|
"Subscribe what you like to tune your personal feed": "Подпишитесь на интересующие вас темы, чтобы настроить вашу персональную ленту и моментально узнавать о новых публикациях и обсуждениях",
|
||||||
"Subscribe who you like to tune your personal feed": "Подпишитесь на интересующих вас авторов, чтобы настроить вашу персональную ленту и моментально узнавать о новых публикациях и обсуждениях",
|
"Subscribe who you like to tune your personal feed": "Подпишитесь на интересующих вас авторов, чтобы настроить вашу персональную ленту и моментально узнавать о новых публикациях и обсуждениях",
|
||||||
"subscriber": "подписчик",
|
"subscriber": "подписчик",
|
||||||
|
@ -483,11 +483,11 @@
|
||||||
"This functionality is currently not available, we would like to work on this issue. Use the download link.": "В данный момент этот функционал не доступен, бы работаем над этой проблемой. Воспользуйтесь загрузкой по ссылке.",
|
"This functionality is currently not available, we would like to work on this issue. Use the download link.": "В данный момент этот функционал не доступен, бы работаем над этой проблемой. Воспользуйтесь загрузкой по ссылке.",
|
||||||
"This month": "За месяц",
|
"This month": "За месяц",
|
||||||
"This post has not been rated yet": "Эту публикацию еще пока никто не оценил",
|
"This post has not been rated yet": "Эту публикацию еще пока никто не оценил",
|
||||||
"This way we ll realize that you re a real person and ll take your vote into account. And you ll see how others voted": "Так мы поймем, что вы реальный человек, и учтем ваш голос. А вы увидите, как проголосовали другие",
|
"This way we ll realize that you re a real person and ll take your vote into account. And you ll see how others voted": "Так мы поймем, что вы реальный человек, и учтем ваш голос. А вы увидите, как проголосовали другие",
|
||||||
"This way you ll be able to subscribe to authors, interesting topics and customize your feed": "Так вы сможете подписаться на авторов, интересные темы и настроить свою ленту",
|
"This way you ll be able to subscribe to authors, interesting topics and customize your feed": "Так вы сможете подписаться на авторов, интересные темы и настроить свою ленту",
|
||||||
"This week": "За неделю",
|
"This week": "За неделю",
|
||||||
"This year": "За год",
|
"This year": "За год",
|
||||||
"To find publications, art, comments, authors and topics of interest to you, just start typing your query": "Для поиска публикаций, искусства, комментариев, интересных вам авторов и тем, просто начните вводить ваш запрос",
|
"To find publications, art, comments, authors and topics of interest to you, just start typing your query": "Для поиска публикаций, искусства, комментариев, интересных вам авторов и тем, просто начните вводить ваш запрос",
|
||||||
"To leave a comment please": "Чтобы оставить комментарий, необходимо",
|
"To leave a comment please": "Чтобы оставить комментарий, необходимо",
|
||||||
"To write a comment, you must": "Чтобы написать комментарий, необходимо",
|
"To write a comment, you must": "Чтобы написать комментарий, необходимо",
|
||||||
"today": "сегодня",
|
"today": "сегодня",
|
||||||
|
@ -528,7 +528,7 @@
|
||||||
"Views": "Просмотры",
|
"Views": "Просмотры",
|
||||||
"We are working on collaborative editing of articles and in the near future you will have an amazing opportunity - to create together with your colleagues": "Мы работаем над коллаборативным редактированием статей и в ближайшем времени у вас появиться удивительная возможность - творить вместе с коллегами",
|
"We are working on collaborative editing of articles and in the near future you will have an amazing opportunity - to create together with your colleagues": "Мы работаем над коллаборативным редактированием статей и в ближайшем времени у вас появиться удивительная возможность - творить вместе с коллегами",
|
||||||
"We can't find you, check email or": "Не можем вас найти, проверьте адрес электронной почты или",
|
"We can't find you, check email or": "Не можем вас найти, проверьте адрес электронной почты или",
|
||||||
"We couldn't find anything for your request": "Мы не смогли ничего найти по вашему запросу",
|
"We couldn't find anything for your request": "Мы не смогли ничего найти по вашему запросу",
|
||||||
"We know you, please try to login": "Такой адрес почты уже зарегистрирован, попробуйте залогиниться",
|
"We know you, please try to login": "Такой адрес почты уже зарегистрирован, попробуйте залогиниться",
|
||||||
"We've sent you a message with a link to enter our website.": "Мы выслали вам письмо с ссылкой на почту. Перейдите по ссылке в письме, чтобы войти на сайт.",
|
"We've sent you a message with a link to enter our website.": "Мы выслали вам письмо с ссылкой на почту. Перейдите по ссылке в письме, чтобы войти на сайт.",
|
||||||
"Welcome to Discours": "Добро пожаловать в Дискурс",
|
"Welcome to Discours": "Добро пожаловать в Дискурс",
|
||||||
|
@ -558,7 +558,7 @@
|
||||||
"You can now login using your new password": "Теперь вы можете входить с помощью нового пароля",
|
"You can now login using your new password": "Теперь вы можете входить с помощью нового пароля",
|
||||||
"You can't edit this post": "Вы не можете редактировать этот материал",
|
"You can't edit this post": "Вы не можете редактировать этот материал",
|
||||||
"You was successfully authorized": "Вы были успешно авторизованы",
|
"You was successfully authorized": "Вы были успешно авторизованы",
|
||||||
"You ll be able to participate in discussions, rate others' comments and learn about new responses": "Вы сможете участвовать в обсуждениях, оценивать комментарии других и узнавать о новых ответах",
|
"You ll be able to participate in discussions, rate others' comments and learn about new responses": "Вы сможете участвовать в обсуждениях, оценивать комментарии других и узнавать о новых ответах",
|
||||||
"You've confirmed email": "Вы подтвердили почту",
|
"You've confirmed email": "Вы подтвердили почту",
|
||||||
"You've reached a non-existed page": "Вы попали на несуществующую страницу",
|
"You've reached a non-existed page": "Вы попали на несуществующую страницу",
|
||||||
"You've successfully logged out": "Вы успешно вышли из аккаунта",
|
"You've successfully logged out": "Вы успешно вышли из аккаунта",
|
||||||
|
|
77
src/intl/prepositions.ts
Normal file
77
src/intl/prepositions.ts
Normal file
|
@ -0,0 +1,77 @@
|
||||||
|
import { JSX } from "solid-js/jsx-runtime"
|
||||||
|
import { mergeProps } from "solid-js/web"
|
||||||
|
|
||||||
|
export const dictionaryBefore = [
|
||||||
|
'а', 'без', 'в', 'во', 'до', 'за', 'из', 'к', 'ко', 'на', 'над', 'о', 'об', 'от', 'по', 'под', 'при', 'про', 'с', 'со', 'у', 'через',
|
||||||
|
'близ', 'вне', 'для', 'меж', 'ради', 'среди', 'около', 'против', 'между', 'перед', 'вокруг', 'возле',
|
||||||
|
'и', 'но', 'да', 'или', 'либо', 'ни', 'как', 'то', 'не', 'что',
|
||||||
|
'ведь', 'вот', 'вон', 'именно', 'лишь', 'просто', 'прямо', 'только', 'даже', 'уже', 'еще', 'все',
|
||||||
|
'однако', 'хоть', 'хотя', 'будто', 'словно', 'точно', 'ровно', 'так', 'если', 'чтобы',
|
||||||
|
'вдруг', 'опять', 'снова', 'вновь', 'тоже', 'также',
|
||||||
|
'почти', 'едва', 'чуть', 'совсем', 'совершенно', 'абсолютно',
|
||||||
|
'мол', 'дескать', 'якобы',
|
||||||
|
'авось', 'небось', 'никак', 'неужели', 'разве', 'ужели',
|
||||||
|
'вряд', 'пусть', 'пускай', 'давай', 'давайте',
|
||||||
|
'нет', 'конечно', 'несомненно', 'безусловно',
|
||||||
|
'итак', 'следовательно', 'значит', 'поэтому', 'потому',
|
||||||
|
'вообще', 'кстати', 'кроме', 'впрочем', 'однако',
|
||||||
|
'это', 'эта', 'этот', 'эти', 'та', 'тот', 'те',
|
||||||
|
'ну', 'аж', 'вплоть', 'ведь',
|
||||||
|
'весьма', 'крайне', 'очень', 'слишком',
|
||||||
|
'всего', 'всего-навсего', 'лишь', 'только', 'исключительно',
|
||||||
|
'вроде', 'типа', 'наподобие',
|
||||||
|
'когда', 'куда', 'откуда', 'зачем', 'почему', 'отчего',
|
||||||
|
'где', 'кто', 'кого', 'кому', 'кем',
|
||||||
|
'который', 'которая', 'которое', 'которые',
|
||||||
|
'чей', 'чья', 'чье', 'чьи',
|
||||||
|
'каков', 'какова', 'каково', 'каковы',
|
||||||
|
'сколько', 'насколько', 'настолько',
|
||||||
|
'пока', 'пока не', 'едва', 'едва не',
|
||||||
|
'чем', 'нежели', 'словно', 'будто',
|
||||||
|
'хоть', 'хотя', 'пускай', 'пусть',
|
||||||
|
'раз', 'раз уж', 'коли', 'коль',
|
||||||
|
'чуть', 'чуть ли не', 'чуть не',
|
||||||
|
]
|
||||||
|
|
||||||
|
export const dictionaryAfter = [
|
||||||
|
'ли', 'же', 'бы', 'б', 'ж',
|
||||||
|
'таки',
|
||||||
|
'как', 'так', 'эдак',
|
||||||
|
'эти', 'это', 'эта', 'этот',
|
||||||
|
'те', 'то', 'та', 'тот',
|
||||||
|
'а', 'и', 'но', 'да', 'нет'
|
||||||
|
]
|
||||||
|
|
||||||
|
export const processPrepositions = (text: string): string => {
|
||||||
|
const prepositionRegexBefore = new RegExp(`(^|\\s)(${dictionaryBefore.join('|')})(\\s|$)`, 'gmi')
|
||||||
|
const prepositionRegexAfter = new RegExp(`(\\S+)\\s+(${dictionaryAfter.join('|')})(\\s|$)`, 'gmi')
|
||||||
|
|
||||||
|
return text
|
||||||
|
.replace(prepositionRegexBefore, (_match, start, word, _end) => {
|
||||||
|
return `${start}${word} `
|
||||||
|
})
|
||||||
|
.replace(prepositionRegexAfter, (_match, word, particle, end) => {
|
||||||
|
return `${word} ${particle}${end}`
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
export function processJSXElement(element: JSX.Element): JSX.Element {
|
||||||
|
if (typeof element === 'string') {
|
||||||
|
return processPrepositions(element)
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Array.isArray(element)) {
|
||||||
|
return element.map(processJSXElement)
|
||||||
|
}
|
||||||
|
|
||||||
|
if (typeof element === 'object' && element !== null && 'props' in element) {
|
||||||
|
// biome-ignore lint/suspicious/noExplicitAny: <explanation>
|
||||||
|
const newProps = mergeProps({}, element.props) as Record<string, any>
|
||||||
|
if (newProps.children) {
|
||||||
|
newProps.children = processJSXElement(newProps.children)
|
||||||
|
}
|
||||||
|
return mergeProps(element, { props: newProps })
|
||||||
|
}
|
||||||
|
|
||||||
|
return element
|
||||||
|
}
|
|
@ -1,7 +1,6 @@
|
||||||
import type { Author, Maybe, Reaction, Shout, Topic, TopicStat } from '~/graphql/schema/core.gen'
|
import type { Author, Maybe, Reaction, Shout, Topic, TopicStat } from '~/graphql/schema/core.gen'
|
||||||
|
|
||||||
// biome-ignore lint/suspicious/noExplicitAny: sort by first char
|
export const byFirstChar = (a: { name?: string; title?: string }, b: { name?: string; title?: string }) =>
|
||||||
export const byFirstChar = (a: { name?: any; title?: any }, b: { name?: any; title?: any }) =>
|
|
||||||
(a.name || a.title || '').localeCompare(b.name || b.title || '')
|
(a.name || a.title || '').localeCompare(b.name || b.title || '')
|
||||||
|
|
||||||
export const byCreated = (a: Shout | Reaction, b: Shout | Reaction) => {
|
export const byCreated = (a: Shout | Reaction, b: Shout | Reaction) => {
|
||||||
|
@ -29,6 +28,7 @@ export const byLength = (
|
||||||
export type SomeStat = { [x: string]: Maybe<number> } | undefined | null
|
export type SomeStat = { [x: string]: Maybe<number> } | undefined | null
|
||||||
|
|
||||||
export const byStat = (metric: string) => {
|
export const byStat = (metric: string) => {
|
||||||
|
if (metric === 'name' || metric === 'title') return byFirstChar
|
||||||
return (a: { stat?: SomeStat }, b: { stat?: SomeStat }) => {
|
return (a: { stat?: SomeStat }, b: { stat?: SomeStat }) => {
|
||||||
const aStat = a.stat?.[metric] ?? 0
|
const aStat = a.stat?.[metric] ?? 0
|
||||||
const bStat = b.stat?.[metric] ?? 0
|
const bStat = b.stat?.[metric] ?? 0
|
||||||
|
|
103
src/routes/(static)/debate.tsx
Normal file
103
src/routes/(static)/debate.tsx
Normal file
|
@ -0,0 +1,103 @@
|
||||||
|
import { StaticPage } from '~/components/Views/StaticPage'
|
||||||
|
|
||||||
|
export default () => (
|
||||||
|
<StaticPage
|
||||||
|
title={'Principles'}
|
||||||
|
desc={'Why you can earn a hole in your karma and how to receive rays of gratitude for your contribution to discussions in samizdat communities'}>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
Открытая редакция существует благодаря дружному сообществу авторов и читателей —
|
||||||
|
вдумчивых и сознательных людей, приверженных ценностям гуманизма, демократии и прав
|
||||||
|
человека. Мы очень ценим атмосферу осмысленного общения, которая здесь сложилась. Чтобы
|
||||||
|
сохранить ее такой же уютной и творческой, мы составили правила общения
|
||||||
|
в сообществе, руководствуясь которыми каждый мог бы соучаствовать в плодотворных
|
||||||
|
дискуссиях, не задевая других. Ключевой принцип этих правил предельно прост —
|
||||||
|
уважайте ближних, постарайтесь не нарушать законы Российской Федерации без крайней
|
||||||
|
на то необходимости и помните, что в дискуссиях чутких и здравомыслящих
|
||||||
|
людей рождается истина.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<h3 id="ban">За что можно получить дырку в карме и выиграть бан в сообществе</h3>
|
||||||
|
<ol>
|
||||||
|
<li>
|
||||||
|
<p>
|
||||||
|
Оскорбления, личные нападки, травля и угрозы. В любом виде. Конкретного человека или
|
||||||
|
социальной группы — не суть. Агрессия, переход на личности
|
||||||
|
и токсичность едва ли способствуют плодотворному общению.
|
||||||
|
</p>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li>
|
||||||
|
<p>
|
||||||
|
Шовинизм, расизм, сексизм, гомофобия, пропаганда ненависти, педофилии, суицида, распространение
|
||||||
|
детской порнографии и другого человеконенавистнического контента.
|
||||||
|
</p>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li>
|
||||||
|
<p>
|
||||||
|
Спам, реклама, фейкньюз, ссылки на пропагандистские СМИ, вбросы дезинформации, специально
|
||||||
|
уводящий от темы флуд, провокации, разжигание конфликтов, намеренный срыв дискуссий.
|
||||||
|
</p>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li>
|
||||||
|
<p>
|
||||||
|
Неаргументированная критика и комментарии вроде «отстой», «зачем
|
||||||
|
я это увидел/а», «не читал, но осуждаю», «либераху
|
||||||
|
порвало», «лол», «скатились», «первый нах» и тому
|
||||||
|
подобные. Односложные реплики не подразумевают возможность обогащающего диалога,
|
||||||
|
не продуктивны и никак не помогают авторам делать материалы лучше,
|
||||||
|
а читателям — разобраться.
|
||||||
|
</p>
|
||||||
|
</li>
|
||||||
|
</ol>
|
||||||
|
|
||||||
|
<h3>За что можно получить лучи добра и благодарности в сообществе</h3>
|
||||||
|
<ol>
|
||||||
|
<li>
|
||||||
|
<p>
|
||||||
|
<strong>Вежливость и конструктивность.</strong> Мы выступаем за конструктивный
|
||||||
|
диалог, аргументированные комментарии и доброжелательное отношение друг к другу.
|
||||||
|
Задавайте содержательные вопросы, пишите развернутые комментарии, подкрепляйте
|
||||||
|
их аргументами, чтобы диалог был полезен всем участникам, помогая глубже понять тему
|
||||||
|
и разобраться в вопросе. И, пожалуйста, уважайте собеседника, даже если он вам
|
||||||
|
лично не импонирует: только так получаются продуктивные дискуссии.
|
||||||
|
</p>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li>
|
||||||
|
<p>
|
||||||
|
<strong>Обмен знаниями и историями.</strong> Осмысленные высказывания по теме поста,
|
||||||
|
оригинальные рассуждения, рассказы о личном опыте и проектах, обмен профессиональной
|
||||||
|
экспертизой, наблюдения и реальные истории из жизни — чем больше
|
||||||
|
мы делимся друг с другом знаниями, тем интереснее и плодотворнее становится наше
|
||||||
|
общение. Помните, что каждый вдумчивый ответ повышает качество дискуссий в сообществе
|
||||||
|
и делает чтение самиздата ещё интереснее.
|
||||||
|
</p>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li>
|
||||||
|
<p>
|
||||||
|
<strong>Чувство юмора и добродушие.</strong> Остроумие и дружелюбие не только
|
||||||
|
направляют дискуссии в продуктивное русло, но и улучшают настроение.
|
||||||
|
Не вредите негативом, которого в интернете и без нас хватает,
|
||||||
|
и не травите на корню классные инициативы — всё великое начинается
|
||||||
|
с малого. Мы за поддерживающую и вдохновляющую атмосферу в сообществе.
|
||||||
|
Надеемся, вы тоже.
|
||||||
|
</p>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li>
|
||||||
|
<p>
|
||||||
|
<strong>Благодарность и поддержка.</strong> Если публикация вам зашла, не стесняйтесь
|
||||||
|
ставить лайки, делиться понравившимися материалами, благодарить авторов, читателей, художников
|
||||||
|
и редакторов в комментариях. Цените и поддерживайте классные проекты, сильные
|
||||||
|
тексты, новое искусство, осмысленные комментарии и вклад других
|
||||||
|
в самиздат — сотрудничество делает нас сильнее и усиливает звучание идей
|
||||||
|
и смыслов, которые помогают лучше понимать мир.
|
||||||
|
</p>
|
||||||
|
</li>
|
||||||
|
</ol>
|
||||||
|
</StaticPage>
|
||||||
|
)
|
44
src/routes/(static)/dogma.tsx
Normal file
44
src/routes/(static)/dogma.tsx
Normal file
|
@ -0,0 +1,44 @@
|
||||||
|
import { StaticPage } from '../../components/Views/StaticPage'
|
||||||
|
|
||||||
|
export default () => (
|
||||||
|
<StaticPage title={'Dogma'} desc=''>
|
||||||
|
<p>
|
||||||
|
Дискурс — журнал с открытой горизонтальной редакцией. Содержание журнала определяется прямым
|
||||||
|
голосованием его авторов. Мы нередко занимаем различные позиции по разным проблемам, но
|
||||||
|
придерживаемся общих профессиональных принципов:
|
||||||
|
</p>
|
||||||
|
<ol>
|
||||||
|
<li>
|
||||||
|
<b>На первое место ставим факты.</b> Наша задача — не судить, а наблюдать и непредвзято
|
||||||
|
фиксировать происходящее. Все утверждения и выводы, которые мы делаем, подтверждаются фактами,
|
||||||
|
цифрами, мнениями экспертов или ссылками на авторитетные источники.
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<b>Ответственно относимся к источникам.</b>
|
||||||
|
Мы выбираем только надежные источники, проверяем информацию и рассказываем, как и откуда мы её
|
||||||
|
получили, кроме случаев, когда это может нанести вред источникам. Тогда мы не раскроем их, даже в
|
||||||
|
суде.
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<b>Выбираем компетентных и независимых экспертов</b>, понимая всю степень ответственности перед
|
||||||
|
аудиторией.
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<b>
|
||||||
|
Даем возможность высказаться всем заинтересованным сторонам, но не присоединяемся ни к чьему
|
||||||
|
лагерю.
|
||||||
|
</b>
|
||||||
|
Ко всем событиям, компаниям и людям мы относимся с одинаковым скептицизмом.
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<b>Всегда исправляем ошибки, если мы их допустили.</b>
|
||||||
|
Никто не безгрешен, иногда и мы ошибаемся. Заметили ошибку — отправьте{' '}
|
||||||
|
<a href="/guide#editing">ремарку</a> автору или напишите нам на{' '}
|
||||||
|
<a href="mailto:welcome@discours.io" target="_blank" rel="noreferrer">
|
||||||
|
welcome@discours.io
|
||||||
|
</a>
|
||||||
|
.
|
||||||
|
</li>
|
||||||
|
</ol>
|
||||||
|
</StaticPage>
|
||||||
|
)
|
216
src/routes/(static)/guide.tsx
Normal file
216
src/routes/(static)/guide.tsx
Normal file
|
@ -0,0 +1,216 @@
|
||||||
|
import { StaticPage } from '~/components/Views/StaticPage'
|
||||||
|
|
||||||
|
export default () => (
|
||||||
|
<StaticPage
|
||||||
|
title={'How Discours works'}
|
||||||
|
desc={'A guide to horizontal editorial: how an open journal works'}
|
||||||
|
>
|
||||||
|
<p>
|
||||||
|
Дискурс — независимый журнал о культуре, науке, искусстве и обществе с
|
||||||
|
<a href="/manifest">открытой редакцией</a>. У нас нет главного редактора, инвестора и вообще
|
||||||
|
никого, кто бы принимал единоличные решения. Вместо традиционных иерархий Дискурс основан
|
||||||
|
на принципах прямой демократии: в нашем горизонтальном сообществе все редакционные вопросы
|
||||||
|
решаются открытым голосованием авторов журнала. Вот как это работает.
|
||||||
|
</p>
|
||||||
|
<h3 id="how-it-works">Как устроен сайт Дискурса</h3>
|
||||||
|
<p>Дискурс состоит из четырех основных разделов:</p>
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
<p>
|
||||||
|
<a href="/topic">Темы</a>
|
||||||
|
— у нас публикуются исследования, обзоры, эссе, интервью, репортажи, аналитика
|
||||||
|
и другие материалы о культуре, науке, искусстве и обществе.
|
||||||
|
</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>
|
||||||
|
<a href="/topic/art">Искусство</a>
|
||||||
|
— здесь, например, представлены художественные произведения: литература, живопись,
|
||||||
|
музыка, фотографии, видео. Этот раздел помогает прозвучать новому искусству, которое создают
|
||||||
|
российские художники, писатели, режиссёры и музыканты.
|
||||||
|
</p>
|
||||||
|
</li>
|
||||||
|
{/*
|
||||||
|
<li>
|
||||||
|
<p>
|
||||||
|
<a href="/topic/events">События</a> — в этом разделе
|
||||||
|
публикуются самые важные, по мнению редакции, культурные
|
||||||
|
события России — выставки, лекции, концерты, кинопоказы, фестивали,
|
||||||
|
художественные и политические акции. Напишите нам
|
||||||
|
на <a href="mailto:welcome@discours.io" target="_blank">почту</a>, если вы
|
||||||
|
хотите разместить объявление. Мы делаем это
|
||||||
|
на безвозмездной основе.
|
||||||
|
</p>
|
||||||
|
</li >
|
||||||
|
<li>
|
||||||
|
<p>
|
||||||
|
<a href="/edit/new" class="ng-scope" target="_blank">Редакция</a> —
|
||||||
|
это внутренний раздел, где появляются новые материалы, которые присылают
|
||||||
|
в редакцию. Здесь авторы обсуждают, редактируют и оценивают
|
||||||
|
публикации, определяя таким образом содержание журнала.
|
||||||
|
</p>
|
||||||
|
</li>
|
||||||
|
*/}
|
||||||
|
</ul>
|
||||||
|
<p>
|
||||||
|
Материалы в Дискурсе объединяются по <b>темам</b>
|
||||||
|
— ключевым словам, которые располагаются в конце материалов и связывают материалы
|
||||||
|
по жанрам (например, <a href="/topic/interview">интервью</a>,{' '}
|
||||||
|
<a href="/topic/reportage">репортажи</a>, <a href="/topic/essay">эссе</a>,{' '}
|
||||||
|
<a href="/topic/likbez">ликбезы</a>
|
||||||
|
), по тематике (<a href="/topic/cinema">кино</a>, <a href="/topic/philosophy">философия</a>,{' '}
|
||||||
|
<a href="/topic/history">история</a>, <a href="/topic/absurdism">абсурдизм</a>,{' '}
|
||||||
|
<a href="/topic/sex">секс</a> и т.д.) или в серии (как «
|
||||||
|
<a href="/topic/zakony-mira">Законы мира</a>» или «
|
||||||
|
<a href="/topic/za-liniey-mannergeyma">За линией Маннергейма</a>
|
||||||
|
»). Темы объединяют сотни публикаций, помогают ориентироваться в журнале и следить
|
||||||
|
за интересными материалами.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<section>
|
||||||
|
<h3 id="become-author">Как стать автором журнала</h3>
|
||||||
|
<p>
|
||||||
|
Дискурс объединяет журналистов, активистов, музыкантов, художников, фотографов, режиссеров,
|
||||||
|
философов, ученых и других замечательных людей. Каждый может <a href="/edit/new">прислать</a>{' '}
|
||||||
|
свой материал в журнал. Формат и тематика не имеют значения, единственное, что важно
|
||||||
|
— <a href="/how-to-write-a-good-article">хороший</a> ли материал. Если сообщество
|
||||||
|
поддержит вашу публикацию, она выйдет в журнале и станет доступна тысячам наших читателей.
|
||||||
|
</p>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<h3 id="voting">Как проходит голосование</h3>
|
||||||
|
<p>
|
||||||
|
Все присылаемые в Дискурс материалы попадают в
|
||||||
|
<strong>«Редакцию»</strong>. Это внутренний раздел сайта, где участники сообщества решают,
|
||||||
|
что будет опубликовано в Дискурсе. Как только работа получает одобрение как минимум пятерых
|
||||||
|
авторов открытой редакции, она немедленно публикуется в журнале. Если же материал набирает
|
||||||
|
более 20% голосов «против», он не выходит и может быть отправлен
|
||||||
|
на доработку. Жестких сроков рассмотрения материалов у нас нет, иногда это занимает час,
|
||||||
|
иногда месяц, обычно — несколько дней.
|
||||||
|
</p>
|
||||||
|
<section>
|
||||||
|
<p>
|
||||||
|
Как только сообщество поддержит публикацию, вы получите приглашение в интернет-редакцию
|
||||||
|
и сможете голосовать за новые материалы.
|
||||||
|
</p>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<h3 id="editing">Как мы делаем тексты друг друга лучше</h3>
|
||||||
|
<p>
|
||||||
|
Дискурс — журнал с совместным редактированием. Совершенствовать тексты нам помогает{' '}
|
||||||
|
<b>система ремарок</b>. Вы можете выделить часть текста в любой статье и оставить
|
||||||
|
к ней замечание, вопрос или предложение — автор текста получит совет на почту
|
||||||
|
и сможет его учесть. Так мы устраняем опечатки, неточности и советуем друг другу, как
|
||||||
|
сделать тексты качественнее и интереснее.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
Среди участников сообщества есть профессиональные редакторы, которые помогают авторам делать тексты
|
||||||
|
лучше. Если вашему материалу потребуется доработка, они помогут отредактировать текст, подобрать
|
||||||
|
иллюстрации, придумать заголовок и красиво сверстать публикацию. Если вы хотите обсудить
|
||||||
|
текст, прежде чем загрузить материал в интернет-редакцию — разместите его
|
||||||
|
в google-документе, откройте доступ к редактированию по ссылке и напишите нам
|
||||||
|
на
|
||||||
|
<a href="mailto:welcome@discours.io" target="_blank" rel="noreferrer">
|
||||||
|
welcome@discours.io
|
||||||
|
</a>
|
||||||
|
.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
Если у вас возникают трудности с тем, чтобы подобрать к своему материалу иллюстрации,
|
||||||
|
тоже пишите на
|
||||||
|
<a href="mailto:welcome@discours.io" target="_blank" rel="noreferrer">
|
||||||
|
почту
|
||||||
|
</a>
|
||||||
|
— наши коллеги-художники могут вам помочь{' '}
|
||||||
|
<a href="/edit/new?collab" target="_blank" rel="noreferrer">
|
||||||
|
в режиме совместного редактирования
|
||||||
|
</a>
|
||||||
|
.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<h3 id="perks">Что сообщество дает авторам</h3>
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
<p>
|
||||||
|
<strong>Право определять, каким будет журнал</strong>. Дискурс — это общественная
|
||||||
|
институция, созданная людьми и ради людей, функционирующая на условиях прямой
|
||||||
|
демократии. Авторы публикуют статьи и художественные проекты, участвуют в обсуждениях,
|
||||||
|
голосуют за работы коллег и таким образом вносят свой вклад в развитие проекта,
|
||||||
|
определяя содержание и направление журнала.
|
||||||
|
</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>
|
||||||
|
<strong>Возможность обратиться к широкой аудитории</strong>. Дискурс читают десятки тысяч
|
||||||
|
людей, и с каждым днем их становится больше.
|
||||||
|
</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>
|
||||||
|
<strong>Поддержка редакции</strong>. Дискурс предоставляет авторам аккредитацию
|
||||||
|
на мероприятия, базу контактов, юридическую поддержку, ознакомление с книжными, кино-
|
||||||
|
и музыкальными новинками до их выхода в свет. Если что-то из этого вам
|
||||||
|
понадобится, пишите на почту{' '}
|
||||||
|
<a href="mailto:welcome@discours.io" target="_blank" rel="noreferrer">
|
||||||
|
welcome@discours.io
|
||||||
|
</a>
|
||||||
|
— поможем.
|
||||||
|
</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>
|
||||||
|
<strong>Пресс-карты для корреспондентов</strong>. Три опубликованные статьи позволяют авторам
|
||||||
|
Дискурса получить официальные удостоверения журналистов (пресс-карты) на следующий год.
|
||||||
|
Пресс-карты удостоверяют, что вы журналист и можете пользоваться всеми теми правами,
|
||||||
|
которые гарантирует Закон о СМИ. Кроме того, многие культурные институции (музеи, галереи
|
||||||
|
и др.) предоставляют журналистам право свободного входа.
|
||||||
|
</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>
|
||||||
|
<strong>Помощь сотен специалистов в разных областях</strong>. В основе Дискурса лежит
|
||||||
|
идея совместного редактирования. Участники редакционного сообщества — несколько сотен
|
||||||
|
журналистов, исследователей, художников, литераторов из разных стран — изучают
|
||||||
|
материалы друг друга до публикации и помогают сделать их качественнее
|
||||||
|
и интереснее. Так, в редакции нередко складываются творческие союзы: например, авторов
|
||||||
|
текстов и художников, создающих для них иллюстрации.
|
||||||
|
</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>
|
||||||
|
<strong>Пространство общения полное выдающихся людей</strong>. Дискурс — большое живое
|
||||||
|
сообщество интеллектуалов, разбросанных по всему земному шару. Вступив в редакцию,
|
||||||
|
вы сможете познакомиться со множеством интересных людей, которые определяют повестку
|
||||||
|
завтрашнего дня, вдохновляют окружающих, создают новое и изучают старое, ищут знания
|
||||||
|
и готовы ими делиться, чтобы менять мир в соответствии со своими идеалами.
|
||||||
|
</p>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<h3 id="contacts">Как быть в курсе</h3>
|
||||||
|
<p>
|
||||||
|
За свежими публикациями Дискурса можно следить не только на сайте,
|
||||||
|
но и на страницах в
|
||||||
|
<a href="https://facebook.com/discoursio/" target="_blank" rel="noreferrer">
|
||||||
|
Фейсбуке
|
||||||
|
</a>
|
||||||
|
,{' '}
|
||||||
|
<a href="https://vk.com/discoursio" target="_blank" rel="noreferrer">
|
||||||
|
ВКонтакте
|
||||||
|
</a>{' '}
|
||||||
|
и
|
||||||
|
<a href="https://t.me/discoursio" target="_blank" rel="noreferrer">
|
||||||
|
Телеграме
|
||||||
|
</a>
|
||||||
|
. А ещё раз в месяц мы отправляем <a href="#subscribe">почтовую рассылку</a>{' '}
|
||||||
|
с дайджестом лучших материалов.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
Если вы хотите сотрудничать, что-то обсудить или предложить — пожалуйста, пишите на
|
||||||
|
<a href="mailto:welcome@discours.io" target="_blank" rel="noreferrer">
|
||||||
|
welcome@discours.io
|
||||||
|
</a>
|
||||||
|
. Мы обязательно ответим.
|
||||||
|
</p>
|
||||||
|
</StaticPage>
|
||||||
|
)
|
|
@ -1,161 +1,134 @@
|
||||||
import { Meta } from '@solidjs/meta'
|
|
||||||
import { Feedback } from '~/components/Discours/Feedback'
|
import { Feedback } from '~/components/Discours/Feedback'
|
||||||
import { Modal } from '~/components/Nav/Modal'
|
import { Modal } from '~/components/Nav/Modal'
|
||||||
import Opener from '~/components/Nav/Modal/Opener'
|
import { Opener } from '~/components/Nav/Modal/Opener'
|
||||||
import { StaticPage } from '~/components/Views/StaticPage'
|
import { StaticPage } from '~/components/Views/StaticPage'
|
||||||
import { Newsletter } from '~/components/_shared/Newsletter'
|
import { Newsletter } from '~/components/_shared/Newsletter'
|
||||||
import { useLocalize } from '~/context/localize'
|
|
||||||
import { getImageUrl } from '~/lib/getImageUrl'
|
|
||||||
|
|
||||||
export default () => {
|
export default () => (
|
||||||
const { t } = useLocalize()
|
<StaticPage
|
||||||
const ogImage = getImageUrl('production/image/logo_image.png')
|
title={'Discours Manifest'}
|
||||||
const ogTitle = t('Discours Manifest')
|
desc={
|
||||||
const description = t(
|
'Manifest of samizdat: principles and mission of \
|
||||||
'Manifest of samizdat: principles and mission of an open magazine with a horizontal editorial board'
|
an open magazine with a horizontal editorial board'
|
||||||
)
|
}
|
||||||
|
>
|
||||||
|
<Modal variant="wide" name="feedback">
|
||||||
|
<Feedback />
|
||||||
|
</Modal>
|
||||||
|
<Modal variant="wide" name="subscribe">
|
||||||
|
<Newsletter />
|
||||||
|
</Modal>
|
||||||
|
|
||||||
return (
|
<p>
|
||||||
<StaticPage title={ogTitle}>
|
Дискурс — независимый художественно-аналитический журнал с горизонтальной редакцией,
|
||||||
<>
|
основанный на принципах свободы слова, прямой демократии и совместного редактирования.
|
||||||
<Modal variant="wide" name="feedback">
|
Дискурс создаётся открытым медиасообществом ученых, журналистов, музыкантов, писателей,
|
||||||
<Feedback />
|
предпринимателей, философов, инженеров, художников и специалистов со всего мира,
|
||||||
</Modal>
|
объединившихся, чтобы вместе делать общий журнал и объяснять с разных точек зрения мозаичную
|
||||||
<Modal variant="wide" name="subscribe">
|
картину современности.
|
||||||
<Newsletter />
|
</p>
|
||||||
</Modal>
|
<p>
|
||||||
<Meta name="descprition" content={description} />
|
Мы пишем о культуре, науке и обществе, рассказываем о новых идеях
|
||||||
<Meta name="keywords" content={t('keywords')} />
|
и современном искусстве, публикуем статьи, исследования, репортажи, интервью людей, чью прямую
|
||||||
<Meta name="og:type" content="article" />
|
речь стоит услышать, и работы художников из разных стран — от фильмов
|
||||||
<Meta name="og:title" content={ogTitle} />
|
и музыки до живописи и фотографии. Помогая друг другу делать публикации качественнее
|
||||||
<Meta name="og:image" content={ogImage} />
|
и общим голосованием выбирая лучшие материалы для журнала, мы создаём новую горизонтальную
|
||||||
<Meta name="twitter:image" content={ogImage} />
|
журналистику, чтобы честно рассказывать о важном и интересном.
|
||||||
<Meta name="og:description" content={description} />
|
</p>
|
||||||
<Meta name="twitter:card" content="summary_large_image" />
|
<p>
|
||||||
<Meta name="twitter:title" content={ogTitle} />
|
Редакция Дискурса открыта для всех: у нас нет цензуры, запретных тем и идеологических рамок.
|
||||||
<Meta name="twitter:description" content={description} />
|
Каждый может <a href="/edit/new">прислать материал</a> в журнал и <a href="/guide">присоединиться к редакции</a>. Предоставляя трибуну для независимой журналистики
|
||||||
|
и художественных проектов, мы помогаем людям рассказывать свои истории так, чтобы они были
|
||||||
|
услышаны. Мы убеждены: чем больше голосов будет звучать на Дискурсе, тем громче
|
||||||
|
в полифонии мнений будет слышна истина.
|
||||||
|
</p>
|
||||||
|
|
||||||
<h1 id="manifest">
|
<h2 class="h2" id="participation">
|
||||||
<span class="wrapped">Манифест</span>
|
<span class="wrapped">Как участвовать в самиздате</span>
|
||||||
</h1>
|
</h2>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
Дискурс — независимый художественно-аналитический журнал с горизонтальной
|
Дискурс создается <a href="/guide">открытым сообществом</a> энтузиастов новой независимой
|
||||||
редакцией, основанный на принципах свободы слова, прямой демократии и совместного
|
журналистики. Участвовать в открытой редакции и помогать журналу можно следующими способами:
|
||||||
редактирования. Дискурс создаётся открытым медиасообществом ученых, журналистов, музыкантов,
|
</p>
|
||||||
писателей, предпринимателей, философов, инженеров, художников и специалистов со всего
|
<details open>
|
||||||
мира, объединившихся, чтобы вместе делать общий журнал и объяснять с разных точек зрения
|
<summary>
|
||||||
мозаичную картину современности.
|
<h3 id="contribute">Предлагать материалы</h3>
|
||||||
</p>
|
</summary>
|
||||||
<p>
|
<p>
|
||||||
Мы пишем о культуре, науке и обществе, рассказываем о новых идеях
|
<a href="/edit/new">Создавайте</a> свои статьи и художественные работы — лучшие из
|
||||||
и современном искусстве, публикуем статьи, исследования, репортажи, интервью людей, чью
|
них будут опубликованы в журнале. Дискурс — некоммерческое издание, авторы
|
||||||
прямую речь стоит услышать, и работы художников из разных стран —
|
публикуются в журнале на общественных началах, получая при этом{' '}
|
||||||
от фильмов и музыки до живописи и фотографии. Помогая друг другу делать
|
<a href="/edit/new?collab=true">поддержку</a> редакции, право голоса, множество других возможностей
|
||||||
публикации качественнее и общим голосованием выбирая лучшие материалы для журнала,
|
и читателей по всему миру.
|
||||||
мы создаём новую горизонтальную журналистику, чтобы честно рассказывать о важном
|
</p>
|
||||||
и интересном.
|
</details>
|
||||||
</p>
|
|
||||||
<p>
|
|
||||||
Редакция Дискурса открыта для всех: у нас нет цензуры, запретных тем и идеологических
|
|
||||||
рамок. Каждый может <a href="/edit/new">прислать материал</a> в журнал и
|
|
||||||
<a href="/guide">присоединиться к редакции</a>. Предоставляя трибуну для независимой
|
|
||||||
журналистики и художественных проектов, мы помогаем людям рассказывать свои истории так,
|
|
||||||
чтобы они были услышаны. Мы убеждены: чем больше голосов будет звучать на Дискурсе, тем
|
|
||||||
громче в полифонии мнений будет слышна истина.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<h2 class="h2" id="participation">
|
<details>
|
||||||
<span class="wrapped">Как участвовать в самиздате</span>
|
<summary>
|
||||||
</h2>
|
<h3 id="donate">Поддерживать проект</h3>
|
||||||
|
</summary>
|
||||||
|
<p>
|
||||||
|
Дискурс существует на пожертвования читателей. Если вам нравится журнал, пожалуйста,{' '}
|
||||||
|
<a href="/support">поддержите</a> нашу работу. Ваши пожертвования пойдут на выпуск новых
|
||||||
|
материалов, оплату серверов, труда программистов, дизайнеров и редакторов.
|
||||||
|
</p>
|
||||||
|
</details>
|
||||||
|
|
||||||
<p>
|
<details>
|
||||||
Дискурс создается <a href="/guide">открытым сообществом</a> энтузиастов новой независимой
|
<summary>
|
||||||
журналистики. Участвовать в открытой редакции и помогать журналу можно следующими
|
<h3 id="cooperation">Сотрудничать с журналом</h3>
|
||||||
способами:
|
</summary>
|
||||||
</p>
|
<p>
|
||||||
<details open>
|
Мы всегда открыты для сотрудничества и рады единомышленникам. Если вы хотите помогать журналу
|
||||||
<summary>
|
с редактурой, корректурой, иллюстрациями, переводами, версткой, подкастами, мероприятиями,
|
||||||
<h3 id="contribute">Предлагать материалы</h3>
|
фандрайзингом или как-то ещё — скорее пишите нам на
|
||||||
</summary>
|
<a href="mailto:welcome@discours.io">welcome@discours.io</a>.
|
||||||
<p>
|
</p>
|
||||||
<a href="/edit/new">Создавайте</a> свои статьи и художественные работы — лучшие
|
<p>
|
||||||
из них будут опубликованы в журнале. Дискурс — некоммерческое издание, авторы
|
Если вы представляете некоммерческую организацию и хотите сделать с нами совместный
|
||||||
публикуются в журнале на общественных началах, получая при этом{' '}
|
проект, получить информационную поддержку или предложить другую форму сотрудничества —{' '}
|
||||||
<a href="/edit/new?collab=true">поддержку</a> редакции, право голоса, множество других
|
<a href="mailto:welcome@discours.io">пишите</a>.
|
||||||
возможностей и читателей по всему миру.
|
</p>
|
||||||
</p>
|
<p>
|
||||||
</details>
|
Если вы разработчик и хотите помогать с развитием сайта Дискурса,{' '}
|
||||||
|
<a href="mailto:services@discours.io">присоединяйтесь к IT-команде самиздата</a>. Открытый код
|
||||||
|
платформы для независимой журналистики, а также всех наших спецпроектов
|
||||||
|
и медиаинструментов находится{' '}
|
||||||
|
<a href="https://github.com/Discours">в свободном доступе на GitHub</a>.
|
||||||
|
</p>
|
||||||
|
</details>
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
<summary>
|
<summary>
|
||||||
<h3 id="donate">Поддерживать проект</h3>
|
<h3 id="follow">Как еще можно помочь</h3>
|
||||||
</summary>
|
</summary>
|
||||||
<p>
|
<p>
|
||||||
Дискурс существует на пожертвования читателей. Если вам нравится журнал, пожалуйста,{' '}
|
Советуйте Дискурс друзьям и знакомым. Обсуждайте и распространяйте наши
|
||||||
<a href="/support">поддержите</a> нашу работу. Ваши пожертвования пойдут на выпуск новых
|
публикации — все материалы открытой редакции можно читать и перепечатывать
|
||||||
материалов, оплату серверов, труда программистов, дизайнеров и редакторов.
|
бесплатно. Подпишитесь на самиздат <a href="https://vk.com/discoursio">ВКонтакте</a>, в
|
||||||
</p>
|
<a href="https://facebook.com/discoursio">Фейсбуке</a> и в
|
||||||
</details>
|
<a href="https://t.me/discoursio">Телеграме</a>, а также на
|
||||||
|
<Opener name="subscribe">рассылку лучших материалов</Opener>, чтобы не пропустить ничего
|
||||||
|
интересного.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<a href="https://forms.gle/9UnHBAz9Q3tjH5dAA">Рассказывайте о впечатлениях</a>{' '}
|
||||||
|
от материалов открытой редакции, <Opener name="feedback">делитесь идеями</Opener>, интересными
|
||||||
|
темами, о которых хотели бы узнать больше, и историями, которые нужно рассказать.
|
||||||
|
</p>
|
||||||
|
</details>
|
||||||
|
|
||||||
<details>
|
<h2 class="h2" id="connection">
|
||||||
<summary>
|
<span class="wrapped">Будем на связи</span>
|
||||||
<h3 id="cooperation">Сотрудничать с журналом</h3>
|
</h2>
|
||||||
</summary>
|
|
||||||
<p>
|
|
||||||
Мы всегда открыты для сотрудничества и рады единомышленникам. Если вы хотите помогать
|
|
||||||
журналу с редактурой, корректурой, иллюстрациями, переводами, версткой, подкастами,
|
|
||||||
мероприятиями, фандрайзингом или как-то ещё — скорее пишите нам на
|
|
||||||
<a href="mailto:welcome@discours.io">welcome@discours.io</a>.
|
|
||||||
</p>
|
|
||||||
<p>
|
|
||||||
Если вы представляете некоммерческую организацию и хотите сделать с нами совместный
|
|
||||||
проект, получить информационную поддержку или предложить другую форму
|
|
||||||
сотрудничества — <a href="mailto:welcome@discours.io">пишите</a>.
|
|
||||||
</p>
|
|
||||||
<p>
|
|
||||||
Если вы разработчик и хотите помогать с развитием сайта Дискурса,{' '}
|
|
||||||
<a href="mailto:services@discours.io">присоединяйтесь к IT-команде самиздата</a>. Открытый
|
|
||||||
код платформы для независимой журналистики, а также всех наших спецпроектов
|
|
||||||
и медиаинструментов находится{' '}
|
|
||||||
<a href="https://github.com/Discours">в свободном доступе на GitHub</a>.
|
|
||||||
</p>
|
|
||||||
</details>
|
|
||||||
|
|
||||||
<details>
|
<p>
|
||||||
<summary>
|
Если вы хотите предложить материал, сотрудничать, рассказать о проблеме, которую нужно осветить,
|
||||||
<h3 id="follow">Как еще можно помочь</h3>
|
сообщить об ошибке или баге, что-то обсудить, уточнить или посоветовать, пожалуйста,{' '}
|
||||||
</summary>
|
<Opener name="feedback">напишите нам здесь</Opener> или на почту{' '}
|
||||||
<p>
|
<a href="mailto:welcome@discours.io">welcome@discours.io</a>. Мы обязательно ответим
|
||||||
Советуйте Дискурс друзьям и знакомым. Обсуждайте и распространяйте наши
|
и постараемся реализовать все хорошие задумки.
|
||||||
публикации — все материалы открытой редакции можно читать и перепечатывать
|
</p>
|
||||||
бесплатно. Подпишитесь на самиздат <a href="https://vk.com/discoursio">ВКонтакте</a>,
|
</StaticPage>
|
||||||
в
|
)
|
||||||
<a href="https://facebook.com/discoursio">Фейсбуке</a> и в
|
|
||||||
<a href="https://t.me/discoursio">Телеграме</a>, а также на
|
|
||||||
<Opener name="subscribe">рассылку лучших материалов</Opener>, чтобы не пропустить ничего
|
|
||||||
интересного.
|
|
||||||
</p>
|
|
||||||
<p>
|
|
||||||
<a href="https://forms.gle/9UnHBAz9Q3tjH5dAA">Рассказывайте о впечатлениях</a>{' '}
|
|
||||||
от материалов открытой редакции, <Opener name="feedback">делитесь идеями</Opener>,
|
|
||||||
интересными темами, о которых хотели бы узнать больше, и историями, которые нужно
|
|
||||||
рассказать.
|
|
||||||
</p>
|
|
||||||
</details>
|
|
||||||
|
|
||||||
<h2 class="h2" id="connection">
|
|
||||||
<span class="wrapped">Будем на связи</span>
|
|
||||||
</h2>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
Если вы хотите предложить материал, сотрудничать, рассказать о проблеме, которую нужно
|
|
||||||
осветить, сообщить об ошибке или баге, что-то обсудить, уточнить или посоветовать,
|
|
||||||
пожалуйста, <Opener name="feedback">напишите нам здесь</Opener> или на почту{' '}
|
|
||||||
<a href="mailto:welcome@discours.io">welcome@discours.io</a>. Мы обязательно ответим
|
|
||||||
и постараемся реализовать все хорошие задумки.
|
|
||||||
</p>
|
|
||||||
</>
|
|
||||||
</StaticPage>
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,29 +1,7 @@
|
||||||
import { Meta } from '@solidjs/meta'
|
|
||||||
import { StaticPage } from '~/components/Views/StaticPage'
|
import { StaticPage } from '~/components/Views/StaticPage'
|
||||||
import { useLocalize } from '~/context/localize'
|
|
||||||
import { getImageUrl } from '~/lib/getImageUrl'
|
|
||||||
|
|
||||||
export default () => {
|
export default () => (
|
||||||
const { t } = useLocalize()
|
<StaticPage title={'Partners'}>
|
||||||
|
{''}
|
||||||
const ogTitle = t('Partners')
|
|
||||||
const ogImage = getImageUrl('production/image/logo_image.png')
|
|
||||||
const description = t('Discours Partners')
|
|
||||||
|
|
||||||
return (
|
|
||||||
<StaticPage title={ogTitle}>
|
|
||||||
<Meta name="descprition" content={description} />
|
|
||||||
<Meta name="keywords" content={t('keywords')} />
|
|
||||||
<Meta name="og:type" content="article" />
|
|
||||||
<Meta name="og:title" content={ogTitle} />
|
|
||||||
<Meta name="og:image" content={ogImage} />
|
|
||||||
<Meta name="twitter:image" content={ogImage} />
|
|
||||||
<Meta name="og:description" content={description} />
|
|
||||||
<Meta name="twitter:card" content="summary_large_image" />
|
|
||||||
<Meta name="twitter:title" content={ogTitle} />
|
|
||||||
<Meta name="twitter:description" content={description} />
|
|
||||||
|
|
||||||
<h1>{t('Partners')}</h1>
|
|
||||||
</StaticPage>
|
</StaticPage>
|
||||||
)
|
)
|
||||||
}
|
|
||||||
|
|
160
src/routes/(static)/principles.tsx
Normal file
160
src/routes/(static)/principles.tsx
Normal file
|
@ -0,0 +1,160 @@
|
||||||
|
import { StaticPage } from '~/components/Views/StaticPage'
|
||||||
|
|
||||||
|
export default () => (
|
||||||
|
<StaticPage
|
||||||
|
title={'Principles'}
|
||||||
|
desc={'Community values and rules of engagement for the open editorial team'}
|
||||||
|
>
|
||||||
|
<ol>
|
||||||
|
<li>
|
||||||
|
<p>
|
||||||
|
<strong>Горизонтальность</strong>. Мы все разные, и это классно. Вертикалей в мире
|
||||||
|
достаточно, мы — горизонтальное сообщество и ценим наши различия, потому что
|
||||||
|
знаем — в них наша сила. Благодаря разнообразию сотен голосов, усиливающих друг
|
||||||
|
друга, в сообществе складывается неповторимая синергия, которая помогает вместе достигать
|
||||||
|
большего.
|
||||||
|
</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>
|
||||||
|
<strong>Многоголосие</strong>. Мы ценим свободу слова и аргументированные мнения.
|
||||||
|
Предоставляя трибуну каждому, кому есть что сказать, самиздат отражает полифонию позиций, знаний
|
||||||
|
и опыта, которые открывают более полную картину реальности.
|
||||||
|
</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>
|
||||||
|
<strong>Взаимопомощь</strong>. Мы помогаем друг другу, потому что хотим, чтобы в мире
|
||||||
|
было еще больше хорошего. Обсуждая что-то, мы всегда интересуемся, чем можем помочь.
|
||||||
|
В самиздате можно найти специалистов практически в любых сферах и получить
|
||||||
|
поддержку от сотен людей. Благодаря коллективной экспертизе глобального сообщества
|
||||||
|
в самиздате выходят крутейшие публикации, которыми можно вечно гордиться.
|
||||||
|
</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>
|
||||||
|
<strong>Взаимоуважение</strong>. Мы ценим, искренне уважаем друг друга и вместо
|
||||||
|
борщевиков враждебности культивируем цветы добра, мира, знания и юмора. Нам некогда
|
||||||
|
доказывать друг другу, кто круче. Гораздо приятнее сотрудничать, помогать и создавать что-то
|
||||||
|
важное, интересное и полезное.
|
||||||
|
</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>
|
||||||
|
<strong>Созидание</strong>. Мы создаем, потому что любим создавать. Мы открыто делимся
|
||||||
|
опытом, дарим идеи, обмениваемся мнениями и благодарим за критику, используя ее для
|
||||||
|
совершенствования мастерства и саморазвития. Мы знаем, что мир не идеальное место,
|
||||||
|
и делаем всё возможное, чтобы он стал лучше.
|
||||||
|
</p>
|
||||||
|
</li>
|
||||||
|
</ol>
|
||||||
|
|
||||||
|
<h2 class="h2" id="participation">
|
||||||
|
<span class="wrapped">Как у нас принято себя вести</span>
|
||||||
|
</h2>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
Открытая редакция объединяет сотни потрясающих людей со всего мира, которые делают крутейшие
|
||||||
|
вещи. Это пространство, где доверяют, вдохновляют, исследуют и создают новое вместе. Поскольку
|
||||||
|
все в сообществе очень разные, как-то мы собрались и решили зафиксировать базовые
|
||||||
|
ценности открытой редакции, а заодно придумали универсальные правила взаимодействия, чтобы
|
||||||
|
общение было не только плодотворным, но и приятным для всех участников сообщества.
|
||||||
|
</p>
|
||||||
|
<ol>
|
||||||
|
<li>
|
||||||
|
<p>
|
||||||
|
<strong>Действуем, помогаем и делимся</strong>. В редакции мы создаем свои проекты
|
||||||
|
и помогаем другим создавать свои — советами, делом, участием, вовлеченностью.
|
||||||
|
Мы открыто делимся опытом, мнениями и идеями, потому что ценим силу сотрудничества
|
||||||
|
и знаем, что идеи реализуются скорее, лучше и веселее, если над ними трудиться сообща.
|
||||||
|
</p>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li>
|
||||||
|
<p>
|
||||||
|
<strong>Общаемся дружелюбно</strong>. Помните, по ту сторону монитора находятся реальные
|
||||||
|
люди. Неуважение ранит других так же, как ранило бы вас самих. Поэтому не стоит
|
||||||
|
кричать (даже капслоком), заполнять эфир желчью и бросаться грубостями — так
|
||||||
|
вы рискуете не только растерять доверие окружающих, но и остаться непонятым.
|
||||||
|
</p>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li>
|
||||||
|
<p>
|
||||||
|
<strong>Критикуем и реагируем конструктивно</strong>. Самиздат про то, чтобы разбираться
|
||||||
|
в сложных вещах всем сообществом, поэтому мы тактично и без агрессии делимся
|
||||||
|
мнениями, стараясь убедительно аргументировать позиции. И с благодарностью принимаем
|
||||||
|
критику, используя ее для улучшения наших проектов. Мы верим, что каждый участник
|
||||||
|
сообщества имеет добрые намерения, и придерживаемся принципов доброжелательной критики,
|
||||||
|
стараемся делиться советами — лучшим средством для самосовершенствования. Обоснованная
|
||||||
|
критика помогает и адресату, и всем участникам сообщества досконально изучить тему
|
||||||
|
и глубже разобраться в проблеме.
|
||||||
|
</p>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li>
|
||||||
|
<p>
|
||||||
|
<strong>Решаем трудности не агрессией, а диалогом</strong>. Обесценивать мнения
|
||||||
|
и оскорблять других людей только потому, что вы с ними
|
||||||
|
не согласны, — не лучший способ донести свою точку зрения. Конечно, важно
|
||||||
|
высказаться, если вас что-то не устраивает и откровенно бесит. Но прежде чем
|
||||||
|
сжигать оппонента гневом, попробуйте понять, почему этот «нехороший человек» так
|
||||||
|
поступает. Возможно, аргументы собеседника окажутся убедительными или вам удастся изменить его
|
||||||
|
мнение. В любом случае конфликты решаются в диалогах и проходят, а налаженное
|
||||||
|
взаимопонимание останется надолго.
|
||||||
|
</p>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li>
|
||||||
|
<p>
|
||||||
|
<strong>Не переходим на личности — это признак токсичности</strong>. Всегда
|
||||||
|
мудрее обсуждать точку зрения человека, а не его самого, даже если он вам
|
||||||
|
не импонирует. Предвзятое отношение ограничивает кругозор, добавляет преждевременные морщины
|
||||||
|
и не помогает окружающим стать лучше. Вежливость и взаимоуважение —
|
||||||
|
краеугольная основа вдумчивых и осмысленных дискуссий.
|
||||||
|
</p>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li>
|
||||||
|
<p>
|
||||||
|
<strong>Благодарим за помощь</strong>. Благодарите коллег даже за самые,
|
||||||
|
казалось бы, простые вещи. «Спасибо» не зря называют волшебным
|
||||||
|
словом — на искренней благодарности держится любое подлинное сотрудничество.
|
||||||
|
Поддержка воодушевляет на новые подвиги и напоминает, что мир делают прекрасным
|
||||||
|
не машины, а живые люди.
|
||||||
|
</p>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li>
|
||||||
|
<p>
|
||||||
|
<strong>Даем еще один шанс</strong>. Все совершают ошибки, и за один проступок
|
||||||
|
не стоит вычеркивать людей из жизни. Ошибки нужны, чтобы на них учиться
|
||||||
|
и делать выводы. Однако если многократно и систематически нарушать правила сообщества,
|
||||||
|
наверняка можно заслужить минусы в карму от других участников и потерять доступ
|
||||||
|
к сообществу.
|
||||||
|
</p>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li>
|
||||||
|
<p>
|
||||||
|
<strong>Вместе создаем идеальную среду общения</strong>. Открытая редакция — это
|
||||||
|
утопическое пространство обогащающей и осмысленной коммуникации. Атмосфера горизонтального
|
||||||
|
сообщества складывается из действий каждого, поэтому мы действуем так, чтобы
|
||||||
|
способствовать сотворчеству, коллективному познанию и развитию самиздата и нашей
|
||||||
|
альтернативной интеллектуальной медиасреды.
|
||||||
|
</p>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li>
|
||||||
|
<p>
|
||||||
|
<strong>Помним, что всё в сообществе зависит от нас</strong>. Если нам чего-то
|
||||||
|
не хватает, мы начинаем действовать — рассказываем об идее, находим
|
||||||
|
единомышленников, готовим и запускаем проект. Так в сообществе становится на одну
|
||||||
|
крутую активность больше. Так появилось наше сообщество. Так появился самиздат и все проекты
|
||||||
|
открытой редакции. Чтобы в сообществе случилось что-то прекрасное, достаточно просто положить
|
||||||
|
этому начало.
|
||||||
|
</p>
|
||||||
|
</li>
|
||||||
|
</ol>
|
||||||
|
</StaticPage>
|
||||||
|
)
|
113
src/routes/(static)/support.tsx
Normal file
113
src/routes/(static)/support.tsx
Normal file
|
@ -0,0 +1,113 @@
|
||||||
|
import { Donate } from '~/components/Discours/Donate'
|
||||||
|
import { StaticPage } from '~/components/Views/StaticPage'
|
||||||
|
|
||||||
|
export default () => (
|
||||||
|
<StaticPage
|
||||||
|
title={'Support Discours'}
|
||||||
|
desc={
|
||||||
|
'Contribute to free samizdat. Support Discours \
|
||||||
|
- an independent non-profit publication that works only for you. \
|
||||||
|
Become a pillar of the open newsroom'
|
||||||
|
}
|
||||||
|
>
|
||||||
|
<p>
|
||||||
|
Дискурс — уникальное независимое издание с горизонтальной редакцией, существующее
|
||||||
|
в интересах своих читателей. Ваша поддержка действительно много значит —
|
||||||
|
не только для редакции Дискурса, но и для сохранения свободной мысли
|
||||||
|
и некоммерческого искусства в нашем обществе.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
Дискурс существует на добровольных началах. Никакой медиахолдинг, фонд или государственная
|
||||||
|
структура не финансирует нас — благодаря этому мы можем писать о том, что
|
||||||
|
важно, а не о том, что выгодно. Сообщество наших волонтеров ежедневно трудится, чтобы
|
||||||
|
рассказывать вам интересные, не освещенные другими изданиями истории —
|
||||||
|
но мы не сможем делать это без вашей помощи. Пожертвования читателей составляют основу
|
||||||
|
нашего бюджета и позволяют нам существовать.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
Если вам нравится то, что мы делаем и вы хотите, чтобы Дискурс продолжался,
|
||||||
|
пожалуйста, поддержите проект.
|
||||||
|
</p>
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-sm-22 col-md-24">
|
||||||
|
<Donate />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<h3 id="financial-report">На что пойдут деньги?</h3>
|
||||||
|
<p>
|
||||||
|
Ваши пожертвования пойдут на оплату серверов, содержание офиса, зарплату редакции и налоги,
|
||||||
|
оплату юридического сопровождения и труда бухгалтера, совершенствование сайта, аренду помещения
|
||||||
|
для открытой редакции, на печать альманаха Дискурс с лучшими текстами авторов
|
||||||
|
за полгода, а также на другие редакционные и технические расходы.
|
||||||
|
</p>
|
||||||
|
<h3>Ваша помощь позволит нам</h3>
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
<h4>Оставаться бесплатным изданием.</h4>
|
||||||
|
<p>
|
||||||
|
Мы делаем открытый журнал для всех желающих, а также собираем искусство лучших авторов
|
||||||
|
по всему миру. Ваша поддержка позволяет нам становиться лучше.
|
||||||
|
</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<h4>Создавать еще больше контента.</h4>
|
||||||
|
<p>
|
||||||
|
Каждый день к нам присоединяются новые люди, и чем больше нас становится, тем больше
|
||||||
|
мы творим и строже оцениваем результаты творчества друг друга. В результате
|
||||||
|
повышается и количество, и качество контента. Каждый день мы трудимся, чтобы открывать
|
||||||
|
нашим читателям новые грани окружающего мира.
|
||||||
|
</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<h4>Развивать форматы и расширять деятельность Дискурса.</h4>
|
||||||
|
<p>
|
||||||
|
Мы создаем различные спецпроекты и регулярно проводим необычные мероприятия.
|
||||||
|
Мы хотим приносить пользу человечеству всеми возможными способами.
|
||||||
|
</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<h4>Модернизировать сайт.</h4>
|
||||||
|
<p>
|
||||||
|
Мы совершенствуем платформу и стараемся сделать проект максимально удобным для вас.
|
||||||
|
Мы работаем над мобильной версией, новым дизайном, фукционалом, системой регистрации,
|
||||||
|
навигации и рекомендаций, которые сделают наше общение еще увлекательней.
|
||||||
|
</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<h4>Выпускать альманах.</h4>
|
||||||
|
<p>
|
||||||
|
Выпускать раз в полугодие печатный альманах Дискурс с 33 лучшими текстами сайта.
|
||||||
|
</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<h4>Захватить весь мир</h4>
|
||||||
|
<p>и принести «Дискурс» в каждый дом.</p>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
<h3 id="trustee">Войдите в попечительский совет Дискурса</h3>
|
||||||
|
<p>
|
||||||
|
Вы хотите сделать крупное пожертвование? Станьте попечителем Дискурса —{' '}
|
||||||
|
<a class="black-link" href="mailto:welcome@discours.io" target="_blank" rel="noreferrer">
|
||||||
|
напишите нам
|
||||||
|
</a>
|
||||||
|
, мы будем рады единомышленникам.
|
||||||
|
</p>
|
||||||
|
<h3 id="other">Как ещё можно поддержать Дискурс?</h3>
|
||||||
|
<p>
|
||||||
|
Есть много других способов поддержать Дискурс и труд наших авторов. Например, вы можете
|
||||||
|
периодически рассказывать о проекте своим друзьям в соцсетях, делиться хорошими материалами
|
||||||
|
или — что еще лучше — публиковать свои статьи в «Дискурсе».
|
||||||
|
Но главное, что вы можете сделать для Дискурса, — читать нас. Мы вкладываем
|
||||||
|
в журнал душу, и внимание каждого читателя убеждает нас в правильности выбранного пути.
|
||||||
|
Не переключайтесь.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
Если вы хотите помочь проекту, но у вас возникли вопросы, напишите нам письмо
|
||||||
|
по адресу{' '}
|
||||||
|
<a class="black-link" href="mailto:welcome@discours.io" target="_blank" rel="noreferrer">
|
||||||
|
welcome@discours.io
|
||||||
|
</a>
|
||||||
|
.
|
||||||
|
</p>
|
||||||
|
</StaticPage>
|
||||||
|
)
|
|
@ -1,242 +1,212 @@
|
||||||
import { Meta } from '@solidjs/meta'
|
|
||||||
import { StaticPage } from '~/components/Views/StaticPage'
|
import { StaticPage } from '~/components/Views/StaticPage'
|
||||||
import { useLocalize } from '~/context/localize'
|
|
||||||
import { getImageUrl } from '~/lib/getImageUrl'
|
|
||||||
|
|
||||||
export default () => {
|
export default () => (
|
||||||
const { t } = useLocalize()
|
<StaticPage title={'Terms of use'} desc={'Rules of the journal Discours'}>
|
||||||
const ogTitle = t('Terms of use')
|
<p>
|
||||||
const ogImage = getImageUrl('production/image/logo_image.png')
|
Дискурс — это сообщество творческих людей, объединенных идеей делать интересный журнал для
|
||||||
const description = t('Rules of the journal Discours')
|
всех желающих. Авторы Дискурса сообща посредством прямого голосования определяют содержание журнала.
|
||||||
|
</p>
|
||||||
return (
|
<p>Для того, чтобы Дискурс работал без помех, разработаны настоящие Правила.</p>
|
||||||
<StaticPage title={ogTitle}>
|
<h3 id="definitions">Определения</h3>
|
||||||
<Meta name="descprition" content={description} />
|
<p>
|
||||||
<Meta name="keywords" content={t('terms of use keywords')} />
|
<strong>Сайт</strong> — портал discours.io
|
||||||
<Meta name="og:type" content="article" />
|
</p>
|
||||||
<Meta name="og:title" content={ogTitle} />
|
<p>
|
||||||
<Meta name="og:image" content={ogImage} />
|
<strong>Пользователь</strong> — лицо, пользующееся Сайтом, либо юридическое лицо,
|
||||||
<Meta name="twitter:image" content={ogImage} />
|
обладающее правами на интеллектуальную собственность.
|
||||||
<Meta name="og:description" content={description} />
|
</p>
|
||||||
<Meta name="twitter:card" content="summary_large_image" />
|
<p>
|
||||||
<Meta name="twitter:title" content={ogTitle} />
|
<strong>Публикация контента</strong> — размещение Пользователем посредством Сайта объектов
|
||||||
<Meta name="twitter:description" content={description} />
|
авторских прав и другой информации для других пользователей.
|
||||||
|
</p>
|
||||||
<h1 id="terms-of-use">
|
<p>
|
||||||
<span class="wrapped">Пользовательское соглашение</span>
|
<strong>Издательство</strong> — администрация сайта, которая занимается технической
|
||||||
</h1>
|
и издательской деятельностью для обеспечения функционирования Сайта и Альманаха.
|
||||||
|
Издательство не вмешивается в принятие редакционных решений авторским сообществом.
|
||||||
<p>
|
</p>
|
||||||
Дискурс — это сообщество творческих людей, объединенных идеей делать интересный журнал
|
<p>
|
||||||
для всех желающих. Авторы Дискурса сообща посредством прямого голосования определяют содержание
|
<strong>Альманах «Дискурс»</strong> (свидетельство о регистрации СМИ: ПИ №
|
||||||
журнала.
|
ФС77-63947 от 18.12.15) — печатное периодическое издание, которое выходит раз
|
||||||
</p>
|
в год и состоит из лучших публикаций на Сайте за это время.
|
||||||
<p>Для того, чтобы Дискурс работал без помех, разработаны настоящие Правила.</p>
|
</p>
|
||||||
<h3 id="definitions">Определения</h3>
|
<h3 id="copyright">Авторские права</h3>
|
||||||
<p>
|
<ol>
|
||||||
<strong>Сайт</strong> — портал discours.io
|
<li>
|
||||||
</p>
|
<p>
|
||||||
<p>
|
Вся информация на сайте (включая тексты, изображения, видеоматериалы, аудиозаписи,
|
||||||
<strong>Пользователь</strong> — лицо, пользующееся Сайтом, либо юридическое лицо,
|
программный код, дизайн сайта и т.д.) является объектом интеллектуальной собственности
|
||||||
обладающее правами на интеллектуальную собственность.
|
ее правообладателей и охраняется законодательством РФ.
|
||||||
</p>
|
</p>
|
||||||
<p>
|
</li>
|
||||||
<strong>Публикация контента</strong> — размещение Пользователем посредством Сайта
|
<li>
|
||||||
объектов авторских прав и другой информации для других пользователей.
|
<p>
|
||||||
</p>
|
Публикуя контент на сайте, Пользователь на безвозмездной основе предоставляет
|
||||||
<p>
|
Издательству право на воспроизведение, распространение, перевод, редактирование контента.
|
||||||
<strong>Издательство</strong> — администрация сайта, которая занимается технической
|
Данное право предоставляется Издательству на весь срок действия авторских прав Пользователя.
|
||||||
и издательской деятельностью для обеспечения функционирования Сайта и Альманаха.
|
</p>
|
||||||
Издательство не вмешивается в принятие редакционных решений авторским сообществом.
|
</li>
|
||||||
</p>
|
<li>
|
||||||
<p>
|
<p>
|
||||||
<strong>Альманах «Дискурс»</strong> (свидетельство о регистрации СМИ: ПИ №
|
Пользователь предоставляет Издательству право редактировать контент, в том числе вносить
|
||||||
ФС77-63947 от 18.12.15) — печатное периодическое издание, которое выходит раз
|
в него изменения, сокращения и дополнения, снабжать его иллюстрациями
|
||||||
в год и состоит из лучших публикаций на Сайте за это время.
|
и пояснениями, исправлять ошибки и уточнять фактические сведения, при условии, что этим
|
||||||
</p>
|
не искажается авторский замысел.
|
||||||
<h3 id="copyright">Авторские права</h3>
|
</p>
|
||||||
<ol>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<p>
|
<p class="ng-binding">
|
||||||
Вся информация на сайте (включая тексты, изображения, видеоматериалы, аудиозаписи,
|
Обнародование контента осуществляется Издательством в соответствии с условиями лицензии{' '}
|
||||||
программный код, дизайн сайта и т.д.) является объектом интеллектуальной собственности
|
<a
|
||||||
ее правообладателей и охраняется законодательством РФ.
|
href="https://creativecommons.org/licenses/by-nc-nd/4.0/deed.ru"
|
||||||
</p>
|
target="_blank"
|
||||||
</li>
|
rel="noreferrer"
|
||||||
<li>
|
>
|
||||||
<p>
|
Creative Commons BY-NC-ND 4.0
|
||||||
Публикуя контент на сайте, Пользователь на безвозмездной основе предоставляет
|
</a>
|
||||||
Издательству право на воспроизведение, распространение, перевод, редактирование контента.
|
. Все материалы сайта предназначены исключительно для личного некоммерческого использования. Права
|
||||||
Данное право предоставляется Издательству на весь срок действия авторских прав
|
на дизайн и программный код сайта принадлежат Издательству.
|
||||||
Пользователя.
|
</p>
|
||||||
</p>
|
</li>
|
||||||
</li>
|
<li>
|
||||||
<li>
|
<p class="ng-binding">
|
||||||
<p>
|
Все аудиовизуальные произведения являются собственностью своих авторов и правообладателей
|
||||||
Пользователь предоставляет Издательству право редактировать контент, в том числе вносить
|
и используются только в образовательных и информационных целях. Если
|
||||||
в него изменения, сокращения и дополнения, снабжать его иллюстрациями
|
вы являетесь собственником того или иного произведения и не согласны с его
|
||||||
и пояснениями, исправлять ошибки и уточнять фактические сведения, при условии, что
|
размещением на сайте, пожалуйста, напишите на
|
||||||
этим не искажается авторский замысел.
|
<a href="mailto:welcome@discours.io" target="_blank" rel="noreferrer">
|
||||||
</p>
|
welcome@discours.io
|
||||||
</li>
|
</a>
|
||||||
<li>
|
.
|
||||||
<p class="ng-binding">
|
</p>
|
||||||
Обнародование контента осуществляется Издательством в соответствии с условиями
|
</li>
|
||||||
лицензии{' '}
|
<li>
|
||||||
<a
|
<p>
|
||||||
href="https://creativecommons.org/licenses/by-nc-nd/4.0/deed.ru"
|
Цитирование, распространение, доведение до всеобщего сведения материалов Cайта
|
||||||
target="_blank"
|
приветствуется. При использовании материалов сайта необходимо указать имя автора и активную
|
||||||
rel="noreferrer"
|
ссылку на материал на Сайте.
|
||||||
>
|
</p>
|
||||||
Creative Commons BY-NC-ND 4.0
|
</li>
|
||||||
</a>
|
</ol>
|
||||||
. Все материалы сайта предназначены исключительно для личного некоммерческого использования.
|
<h3 id="rules">Правила поведения</h3>
|
||||||
Права на дизайн и программный код сайта принадлежат Издательству.
|
<ol>
|
||||||
</p>
|
<li>
|
||||||
</li>
|
<p>
|
||||||
<li>
|
Находясь на Сайте, Пользователь подтверждает свое совершеннолетие, правоспособность,
|
||||||
<p class="ng-binding">
|
а также согласие с настоящими Правилами и политикой конфиденциальности
|
||||||
Все аудиовизуальные произведения являются собственностью своих авторов и правообладателей
|
и готовность нести полную ответственность за их соблюдение.
|
||||||
и используются только в образовательных и информационных целях. Если
|
</p>
|
||||||
вы являетесь собственником того или иного произведения и не согласны с его
|
</li>
|
||||||
размещением на сайте, пожалуйста, напишите на
|
<li>
|
||||||
<a href="mailto:welcome@discours.io" target="_blank" rel="noreferrer">
|
<h4>На сайте запрещено:</h4>
|
||||||
welcome@discours.io
|
<ul>
|
||||||
</a>
|
<li>
|
||||||
.
|
Публиковать контент, авторские права на который принадлежат третьим лицам, без согласия
|
||||||
</p>
|
этих лиц. Если авторские права на контент принадлежат нескольким лицам, то его публикация
|
||||||
</li>
|
предполагает согласие их всех.
|
||||||
<li>
|
</li>
|
||||||
<p>
|
<li>Размещать коммерческую и политическую рекламу.</li>
|
||||||
Цитирование, распространение, доведение до всеобщего сведения материалов Cайта
|
<li>
|
||||||
приветствуется. При использовании материалов сайта необходимо указать имя автора и активную
|
Целенаправленно препятствовать нормальному функционированию сообщества и сайта discours.io
|
||||||
ссылку на материал на Сайте.
|
</li>
|
||||||
</p>
|
<li>Выдавать себя за другого человека и представляться его именем.</li>
|
||||||
</li>
|
<li>
|
||||||
</ol>
|
Размещать информацию, которая не соответствует целям создания Сайта, ущемляет интересы
|
||||||
<h3 id="rules">Правила поведения</h3>
|
других пользователей или третьих лиц, нарушает законы Российской Федерации.
|
||||||
<ol>
|
</li>
|
||||||
<li>
|
</ul>
|
||||||
<p>
|
</li>
|
||||||
Находясь на Сайте, Пользователь подтверждает свое совершеннолетие, правоспособность,
|
<li>
|
||||||
а также согласие с настоящими Правилами и политикой конфиденциальности
|
<p>
|
||||||
и готовность нести полную ответственность за их соблюдение.
|
Пользователь несет всю ответственность за содержание публикуемого контента и свое
|
||||||
</p>
|
взаимодействие с другими пользователями, и обязуется возместить все расходы
|
||||||
</li>
|
в случае предъявления каких-либо претензий третьими лицами. Издательство не несет
|
||||||
<li>
|
ответственности за содержание публикуемой пользователями информации, в том числе
|
||||||
<h4>На сайте запрещено:</h4>
|
за размещенные на сайте комментарии. Переписка между Пользователем и Издательством
|
||||||
<ul>
|
считается юридически значимой. Настоящие Правила могут быть изменены Издательством, изменения
|
||||||
<li>
|
вступают в силу с момента публикации на Сайте.
|
||||||
Публиковать контент, авторские права на который принадлежат третьим лицам, без согласия
|
</p>
|
||||||
этих лиц. Если авторские права на контент принадлежат нескольким лицам, то его публикация
|
</li>
|
||||||
предполагает согласие их всех.
|
<li>
|
||||||
</li>
|
<p>
|
||||||
<li>Размещать коммерческую и политическую рекламу.</li>
|
Если Пользователь очевидно и целенаправленно нарушает правила, Издательство может
|
||||||
<li>
|
и принять в отношении автора следующие меры: вынести предупреждение и обязать
|
||||||
Целенаправленно препятствовать нормальному функционированию сообщества и сайта
|
автора устранить допущенное нарушение, удалить контент, нарушающий правила, заблокировать или
|
||||||
discours.io
|
удалить аккаунт нарушителя.
|
||||||
</li>
|
</p>
|
||||||
<li>Выдавать себя за другого человека и представляться его именем.</li>
|
</li>
|
||||||
<li>
|
</ol>
|
||||||
Размещать информацию, которая не соответствует целям создания Сайта, ущемляет интересы
|
<h3 id="privacy-policy">Политика конфиденциальности</h3>
|
||||||
других пользователей или третьих лиц, нарушает законы Российской Федерации.
|
<ol>
|
||||||
</li>
|
<li>
|
||||||
</ul>
|
<p>Сайт может собирать у пользователей следующие данные:</p>
|
||||||
</li>
|
<ul>
|
||||||
<li>
|
<li>
|
||||||
<p>
|
<p>
|
||||||
Пользователь несет всю ответственность за содержание публикуемого контента и свое
|
Данные, которые пользователи сообщают о себе сами при подаче заявки, регистрации,
|
||||||
взаимодействие с другими пользователями, и обязуется возместить все расходы
|
авторизации или заполнения профиля, в том числе ФИО и контактную информацию.
|
||||||
в случае предъявления каких-либо претензий третьими лицами. Издательство не несет
|
Конфиденциальные данные, такие как идентификатор и электронный адрес, используются для
|
||||||
ответственности за содержание публикуемой пользователями информации, в том числе
|
идентификации пользователя. Данные профиля, размещённые публично по желанию пользователя,
|
||||||
за размещенные на сайте комментарии. Переписка между Пользователем
|
которое выражается фактом их предоставления, используется для демонстрации другим
|
||||||
и Издательством считается юридически значимой. Настоящие Правила могут быть изменены
|
пользователям той информации о себе, которую пользователь готов предоставить.
|
||||||
Издательством, изменения вступают в силу с момента публикации на Сайте.
|
</p>
|
||||||
</p>
|
</li>
|
||||||
</li>
|
<li>
|
||||||
<li>
|
<p>
|
||||||
<p>
|
Данные, собранные автоматическим путем, такие, как cookie-файлы. Эти неперсонализированные
|
||||||
Если Пользователь очевидно и целенаправленно нарушает правила, Издательство может
|
данные могут использоваться для сбора статистики и улучшения работы сайта.
|
||||||
и принять в отношении автора следующие меры: вынести предупреждение и обязать
|
</p>
|
||||||
автора устранить допущенное нарушение, удалить контент, нарушающий правила, заблокировать или
|
</li>
|
||||||
удалить аккаунт нарушителя.
|
</ul>
|
||||||
</p>
|
</li>
|
||||||
</li>
|
<li>
|
||||||
</ol>
|
<p>
|
||||||
<h3 id="privacy-policy">Политика конфиденциальности</h3>
|
Издательство обеспечивает конфиденциальность персональных данных и применяет все необходимые
|
||||||
<ol>
|
организационные и технические меры по их защите.
|
||||||
<li>
|
</p>
|
||||||
<p>Сайт может собирать у пользователей следующие данные:</p>
|
</li>
|
||||||
<ul>
|
<li>
|
||||||
<li>
|
<p class="ng-binding">
|
||||||
<p>
|
По желанию пользователя Издательство готово удалить любую информацию о нем, собранную
|
||||||
Данные, которые пользователи сообщают о себе сами при подаче заявки, регистрации,
|
автоматическим путем. Для этого следует написать на адрес электронной почты{' '}
|
||||||
авторизации или заполнения профиля, в том числе ФИО и контактную информацию.
|
<a href="mailto:welcome@discours.io" target="_blank" rel="noreferrer">
|
||||||
Конфиденциальные данные, такие как идентификатор и электронный адрес, используются для
|
welcome@discours.io
|
||||||
идентификации пользователя. Данные профиля, размещённые публично по желанию
|
</a>
|
||||||
пользователя, которое выражается фактом их предоставления, используется для
|
.
|
||||||
демонстрации другим пользователям той информации о себе, которую пользователь готов
|
</p>
|
||||||
предоставить.
|
</li>
|
||||||
</p>
|
<li>
|
||||||
</li>
|
<p>
|
||||||
<li>
|
Если в информации, предоставляемой Издательству Пользователем, содержатся персональные данные
|
||||||
<p>
|
последнего, то фактом их предоставления он соглашается на их обработку любым
|
||||||
Данные, собранные автоматическим путем, такие, как cookie-файлы. Эти неперсонализированные
|
способом, не запрещенным законодательством РФ.
|
||||||
данные могут использоваться для сбора статистики и улучшения работы сайта.
|
</p>
|
||||||
</p>
|
<p class="ng-binding">
|
||||||
</li>
|
Общедоступные видео на сайте могут транслироваться с YouTube и регулируются{' '}
|
||||||
</ul>
|
<a href="https://policies.google.com/privacy" target="_blank" rel="noreferrer">
|
||||||
</li>
|
политикой конфиденциальности Google
|
||||||
<li>
|
</a>
|
||||||
<p>
|
. Загрузка видео на сайт также означает согласие с
|
||||||
Издательство обеспечивает конфиденциальность персональных данных и применяет все
|
<a href="https://www.youtube.com/t/terms" target="_blank" rel="noreferrer">
|
||||||
необходимые организационные и технические меры по их защите.
|
Условиями использования YouTube
|
||||||
</p>
|
</a>
|
||||||
</li>
|
.
|
||||||
<li>
|
</p>
|
||||||
<p class="ng-binding">
|
</li>
|
||||||
По желанию пользователя Издательство готово удалить любую информацию о нем, собранную
|
<li>
|
||||||
автоматическим путем. Для этого следует написать на адрес электронной почты{' '}
|
<p>
|
||||||
<a href="mailto:welcome@discours.io" target="_blank" rel="noreferrer">
|
Данные, которые мы получаем от вас, мы используем только в соответствии
|
||||||
welcome@discours.io
|
с принципами обработки данных, указанными в этом документе.
|
||||||
</a>
|
</p>
|
||||||
.
|
</li>
|
||||||
</p>
|
</ol>
|
||||||
</li>
|
<h3 id="feedback">Обратная связь</h3>
|
||||||
<li>
|
<p class="ng-binding">
|
||||||
<p>
|
Любые вопросы и предложения по поводу функционирования сайта можно направить
|
||||||
Если в информации, предоставляемой Издательству Пользователем, содержатся персональные
|
по электронной почте{' '}
|
||||||
данные последнего, то фактом их предоставления он соглашается
|
<a href="mailto:welcome@discours.io" target="_blank" rel="noreferrer">
|
||||||
на их обработку любым способом, не запрещенным законодательством РФ.
|
welcome@discours.io
|
||||||
</p>
|
</a>{' '}
|
||||||
<p class="ng-binding">
|
или через форму <a href="/connect">«предложить идею»</a>.
|
||||||
Общедоступные видео на сайте могут транслироваться с YouTube и регулируются{' '}
|
</p>
|
||||||
<a href="https://policies.google.com/privacy" target="_blank" rel="noreferrer">
|
</StaticPage>
|
||||||
политикой конфиденциальности Google
|
)
|
||||||
</a>
|
|
||||||
. Загрузка видео на сайт также означает согласие с
|
|
||||||
<a href="https://www.youtube.com/t/terms" target="_blank" rel="noreferrer">
|
|
||||||
Условиями использования YouTube
|
|
||||||
</a>
|
|
||||||
.
|
|
||||||
</p>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<p>
|
|
||||||
Данные, которые мы получаем от вас, мы используем только в соответствии
|
|
||||||
с принципами обработки данных, указанными в этом документе.
|
|
||||||
</p>
|
|
||||||
</li>
|
|
||||||
</ol>
|
|
||||||
<h3 id="feedback">Обратная связь</h3>
|
|
||||||
<p class="ng-binding">
|
|
||||||
Любые вопросы и предложения по поводу функционирования сайта можно направить
|
|
||||||
по электронной почте{' '}
|
|
||||||
<a href="mailto:welcome@discours.io" target="_blank" rel="noreferrer">
|
|
||||||
welcome@discours.io
|
|
||||||
</a>{' '}
|
|
||||||
или через форму <a href="/connect">«предложить идею»</a>.
|
|
||||||
</p>
|
|
||||||
</StaticPage>
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
71
src/routes/(static)/thanks.tsx
Normal file
71
src/routes/(static)/thanks.tsx
Normal file
|
@ -0,0 +1,71 @@
|
||||||
|
import { StaticPage } from '~/components/Views/StaticPage'
|
||||||
|
|
||||||
|
export default () => (
|
||||||
|
<StaticPage
|
||||||
|
title={'Thank you'}
|
||||||
|
desc={
|
||||||
|
'Self-publishing exists thanks to the help of wonderful people from all over the world. Thank you!'
|
||||||
|
}
|
||||||
|
>
|
||||||
|
{/*
|
||||||
|
<h3><b>Команда</b></h3>
|
||||||
|
<p>
|
||||||
|
Константин Ворович — исполнительный директор,
|
||||||
|
<a href="mailto:welcome@discours.io" target="_blank"
|
||||||
|
>welcome@discours.io</a
|
||||||
|
><br />
|
||||||
|
Александр Гусев — технический архитектор,
|
||||||
|
<a href="mailto:services@discours.io" target="_blank"
|
||||||
|
>services@discours.io</a
|
||||||
|
><br />
|
||||||
|
Екатерина Ильина — шеф-редактор проекта,
|
||||||
|
<a href="mailto:letter@discours.io" target="_blank"
|
||||||
|
>letter@discours.io</a
|
||||||
|
><br />
|
||||||
|
Яна Климова — редактор сайта и соцсетей,
|
||||||
|
<a href="mailto:letter@discours.io" target="_blank"
|
||||||
|
>letter@discours.io</a
|
||||||
|
><br />
|
||||||
|
Николай Носачевский — голос и душа подкаста,
|
||||||
|
<a href="mailto:podcast@discours.io" target="_blank"
|
||||||
|
>podcast@discours.io</a
|
||||||
|
>
|
||||||
|
</p>
|
||||||
|
*/}
|
||||||
|
<h3>Неоценимый вклад в Дискурс внесли и вносят</h3>
|
||||||
|
<p>
|
||||||
|
Мария Бессмертная, Дамир Бикчурин, Константин Ворович, Ян Выговский, Эльдар Гариффулин, Павел
|
||||||
|
Гафаров, Виктория Гендлина, Александр Гусев, Данила Давыдов, Константин Дубовик, Вячеслав Еременко,
|
||||||
|
Кристина Ибрагим, Екатерина Ильина, Анна Капаева, Яна Климова, Александр Коренков, Ирэна Лесневская,
|
||||||
|
Игорь Лобанов, Анастасия Лозовая, Григорий Ломизе, Евгений Медведев, Павел Никулин, Николай
|
||||||
|
Носачевский, Андрей Орловский, Михаил Панин, Антон Панов, Павел Пепперштейн, Любовь Покровская, Илья
|
||||||
|
Розовский, Денис Светличный, Павел Соколов, Сергей Стрельников, Глеб Струнников, Николай Тарковский,
|
||||||
|
Кирилл Филимонов, Алексей Хапов, Екатерина Харитонова
|
||||||
|
</p>
|
||||||
|
<h3>Авторы</h3>
|
||||||
|
<p>
|
||||||
|
Мы безмерно благодарны{' '}
|
||||||
|
<a href="/author" target="_blank" rel="noopener noreferrer">
|
||||||
|
каждому автору
|
||||||
|
</a>{' '}
|
||||||
|
за участие и поддержку проекта. Сегодня, когда для большинства деньги стали целью
|
||||||
|
и основным источником мотивации, бескорыстная помощь и основанный на энтузиазме труд
|
||||||
|
бесценны. Именно вы своим трудом каждый день делаете Дискурс таким, какой он есть.
|
||||||
|
</p>
|
||||||
|
<h3>Иллюстраторы</h3>
|
||||||
|
<p>
|
||||||
|
Ольга Аверинова, Регина Акчурина, Айгуль Берхеева, Екатерина Вакуленко, Анастасия Викулова, Мария
|
||||||
|
Власенко, Ванесса Гаврилова, Ольга Горше, Ксения Горшкова, Ангелина Гребенюкова, Илья Diliago, Антон
|
||||||
|
Жаголкин, Саша Керова, Ольга Машинец, Злата Мечетина, Тала Никитина, Никита Поздняков, Матвей Сапегин,
|
||||||
|
Татьяна Сафонова, Виктория Шибаева
|
||||||
|
</p>
|
||||||
|
<h3>Меценаты</h3>
|
||||||
|
<p>
|
||||||
|
Дискурс существует исключительно на пожертвования читателей. Мы бесконечно признательны
|
||||||
|
всем, кто нас поддерживает. Ваши пожертвования — финансовый фундамент журнала. Благодаря
|
||||||
|
вам мы развиваем платформу качественной журналистики, которая помогает самым разным авторам быть
|
||||||
|
услышанными. Стать нашим меценатом и подписаться на ежемесячную поддержку проекта можно{' '}
|
||||||
|
<a href="/support">здесь</a>.
|
||||||
|
</p>
|
||||||
|
</StaticPage>
|
||||||
|
)
|
|
@ -1,5 +1,5 @@
|
||||||
import { RouteSectionProps, createAsync, useLocation, useParams } from '@solidjs/router'
|
import { RouteSectionProps, createAsync, useLocation, useParams } from '@solidjs/router'
|
||||||
import { ErrorBoundary, Suspense, createMemo, createReaction, createSignal, onMount } from 'solid-js'
|
import { ErrorBoundary, Suspense, createEffect, createMemo, createSignal, on, onMount } from 'solid-js'
|
||||||
import { FourOuFourView } from '~/components/Views/FourOuFour'
|
import { FourOuFourView } from '~/components/Views/FourOuFour'
|
||||||
import { Loading } from '~/components/_shared/Loading'
|
import { Loading } from '~/components/_shared/Loading'
|
||||||
import { gaIdentity } from '~/config'
|
import { gaIdentity } from '~/config'
|
||||||
|
@ -20,7 +20,7 @@ export const route = {
|
||||||
load: async ({ params }: RouteSectionProps<{ article: Shout }>) => await fetchShout(params.slug)
|
load: async ({ params }: RouteSectionProps<{ article: Shout }>) => await fetchShout(params.slug)
|
||||||
}
|
}
|
||||||
|
|
||||||
export const ArticlePage = (props: RouteSectionProps<{ article: Shout }>) => {
|
export default (props: RouteSectionProps<{ article: Shout }>) => {
|
||||||
const params = useParams()
|
const params = useParams()
|
||||||
const loc = useLocation()
|
const loc = useLocation()
|
||||||
const article = createAsync(async () => props.data.article || (await fetchShout(params.slug)))
|
const article = createAsync(async () => props.data.article || (await fetchShout(params.slug)))
|
||||||
|
@ -42,18 +42,22 @@ export const ArticlePage = (props: RouteSectionProps<{ article: Shout }>) => {
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
// docs: `a side effect that is run the first time the expression
|
createEffect(
|
||||||
// wrapped by the returned tracking function is notified of a change`
|
on(
|
||||||
createReaction(() => {
|
article,
|
||||||
if (article()) {
|
(a?: Shout) => {
|
||||||
console.debug('[routes.slug] article signal changed once')
|
if (!a) return
|
||||||
window.gtag?.('event', 'page_view', {
|
console.debug('[routes.slug] article found')
|
||||||
page_title: article()?.title,
|
window.gtag?.('event', 'page_view', {
|
||||||
page_location: window.location.href,
|
page_title: a.title,
|
||||||
page_path: loc.pathname
|
page_location: window.location.href,
|
||||||
})
|
page_path: loc.pathname
|
||||||
}
|
})
|
||||||
})
|
},
|
||||||
|
{ defer: true }
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<ErrorBoundary fallback={(_err) => <FourOuFourView />}>
|
<ErrorBoundary fallback={(_err) => <FourOuFourView />}>
|
||||||
<Suspense fallback={<Loading />}>
|
<Suspense fallback={<Loading />}>
|
||||||
|
@ -75,5 +79,3 @@ export const ArticlePage = (props: RouteSectionProps<{ article: Shout }>) => {
|
||||||
</ErrorBoundary>
|
</ErrorBoundary>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
export default ArticlePage
|
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
import { useNavigate, useParams } from '@solidjs/router'
|
import { redirect, useParams } from '@solidjs/router'
|
||||||
import { createEffect, createMemo, createSignal, lazy, on } from 'solid-js'
|
import { createEffect, createMemo, createSignal, lazy, on } from 'solid-js'
|
||||||
import { AuthGuard } from '~/components/AuthGuard'
|
import { AuthGuard } from '~/components/AuthGuard'
|
||||||
import { PageLayout } from '~/components/_shared/PageLayout'
|
import { PageLayout } from '~/components/_shared/PageLayout'
|
||||||
|
@ -31,12 +31,11 @@ export const EditPage = () => {
|
||||||
const { t } = useLocalize()
|
const { t } = useLocalize()
|
||||||
const { session } = useSession()
|
const { session } = useSession()
|
||||||
const snackbar = useSnackbar()
|
const snackbar = useSnackbar()
|
||||||
const navigate = useNavigate()
|
|
||||||
const fail = async (error: string) => {
|
const fail = async (error: string) => {
|
||||||
console.error(error)
|
console.error(error)
|
||||||
const errorMessage = error === 'forbidden' ? "You can't edit this post" : error
|
const errorMessage = error === 'forbidden' ? "You can't edit this post" : error
|
||||||
await snackbar?.showSnackbar({ type: 'error', body: t(errorMessage) })
|
await snackbar?.showSnackbar({ type: 'error', body: t(errorMessage) })
|
||||||
navigate('/edit')
|
redirect('/edit') // all drafts page
|
||||||
}
|
}
|
||||||
const [shout, setShout] = createSignal<Shout>()
|
const [shout, setShout] = createSignal<Shout>()
|
||||||
const params = useParams()
|
const params = useParams()
|
||||||
|
|
|
@ -162,7 +162,7 @@
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td class="content-block" style="vertical-align: top; padding: 0 0 20px" valign="top">
|
<td class="content-block" style="vertical-align: top; padding: 0 0 20px" valign="top">
|
||||||
— Дискурс
|
— Дискурс
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
</table>
|
</table>
|
||||||
|
|
Loading…
Reference in New Issue
Block a user