Merge remote-tracking branch 'hub/dev' into feature/rating

This commit is contained in:
Untone 2024-02-15 16:49:40 +03:00
commit 7ccf3f8ce1
22 changed files with 1135 additions and 1139 deletions

View File

@ -2,7 +2,7 @@
"$schema": "https://biomejs.dev/schemas/1.5.3/schema.json",
"files": {
"include": ["*.tsx", "*.ts", "*.js", "*.json"],
"ignore": ["./dist", "./node_modules", ".husky", "docs", "gen"]
"ignore": ["./dist", "./node_modules", ".husky", "docs", "gen", "*.d.ts"]
},
"vcs": {
"defaultBranch": "dev",
@ -29,7 +29,7 @@
}
},
"linter": {
"ignore": ["*.scss", "*.md", ".DS_Store", "*.svg"],
"ignore": ["*.scss", "*.md", ".DS_Store", "*.svg", "*.d.ts"],
"enabled": true,
"rules": {
"all": true,

View File

@ -16,13 +16,10 @@ import { ConditionalWrapper } from '../../_shared/ConditionalWrapper'
import { Icon } from '../../_shared/Icon'
import { Userpic } from '../Userpic'
import { FollowedInfo } from '../../../pages/types'
import stylesButton from '../../_shared/Button/Button.module.scss'
import styles from './AuthorBadge.module.scss'
type FollowedInfo = {
value?: boolean
loaded?: boolean
}
type Props = {
author: Author
minimizeSubscribeButton?: boolean

View File

@ -308,7 +308,13 @@ export const AuthorCard = (props: Props) => {
author={subscription}
/>
) : (
<TopicBadge topic={subscription} />
<TopicBadge
isFollowed={{
loaded: Boolean(authorSubs()),
value: isOwnerSubscribed(subscription.id),
}}
topic={subscription}
/>
)
}
</For>

View File

@ -1,10 +1,13 @@
.TopicBadge {
display: flex;
flex-direction: row;
align-items: flex-start;
margin-bottom: 2rem;
gap: 1rem;
.content {
align-items: flex-start;
display: flex;
flex-direction: row;
margin-bottom: .8rem;
}
.basicInfo {
display: flex;
flex-flow: row nowrap;
@ -78,3 +81,34 @@
width: 9em;
}
}
.stats {
@include font-size(1.5rem);
color: var(--secondary-color);
display: flex;
margin: 0 0 1em;
@include media-breakpoint-down(md) {
flex-wrap: wrap;
}
@include media-breakpoint-down(sm) {
margin-top: 0.5em;
}
.statsItem {
@include font-size(1.4rem);
margin-right: 1.6rem;
white-space: nowrap;
&:last-child {
margin-right: 0;
}
&.followers {
word-break: keep-all;
}
}
}

View File

@ -1,5 +1,5 @@
import { clsx } from 'clsx'
import { Show, createEffect, createSignal } from 'solid-js'
import { Show, createEffect, createSignal, on } from 'solid-js'
import { useFollowing } from '../../../context/following'
import { useLocalize } from '../../../context/localize'
@ -11,11 +11,14 @@ import { getImageUrl } from '../../../utils/getImageUrl'
import { Button } from '../../_shared/Button'
import { CheckButton } from '../../_shared/CheckButton'
import { FollowedInfo } from '../../../pages/types'
import styles from './TopicBadge.module.scss'
type Props = {
topic: Topic
minimizeSubscribeButton?: boolean
isFollowed?: FollowedInfo
showStat?: boolean
}
export const TopicBadge = (props: Props) => {
@ -24,12 +27,12 @@ export const TopicBadge = (props: Props) => {
const [isMobileView, setIsMobileView] = createSignal(false)
const { requireAuthentication } = useSession()
const { setFollowing, loading: subLoading } = useFollowing()
const [followed, setFollowed] = createSignal()
const [isFollowed, setIsFollowed] = createSignal<boolean>()
const handleFollowClick = () => {
const value = !followed()
const value = !isFollowed()
requireAuthentication(() => {
setFollowed(value)
setIsFollowed(value)
setFollowing(FollowingEntity.Topic, props.topic.slug, value)
}, 'subscribe')
}
@ -38,11 +41,21 @@ export const TopicBadge = (props: Props) => {
setIsMobileView(!mediaMatches.sm)
})
createEffect(
on(
() => props.isFollowed,
() => {
setIsFollowed(props.isFollowed.value)
},
),
)
const title = () =>
lang() === 'en' ? capitalize(props.topic.slug.replaceAll('-', ' ')) : props.topic.title
return (
<div class={styles.TopicBadge}>
<div class={styles.content}>
<div class={styles.basicInfo}>
<a
href={`/topic/${props.topic.slug}`}
@ -75,11 +88,11 @@ export const TopicBadge = (props: Props) => {
<Show
when={!props.minimizeSubscribeButton}
fallback={
<CheckButton text={t('Follow')} checked={Boolean(followed())} onClick={handleFollowClick} />
<CheckButton text={t('Follow')} checked={Boolean(isFollowed())} onClick={handleFollowClick} />
}
>
<Show
when={followed()}
when={isFollowed()}
fallback={
<Button
variant="primary"
@ -101,5 +114,13 @@ export const TopicBadge = (props: Props) => {
</Show>
</div>
</div>
<div class={styles.stats}>
<span class={styles.statsItem}>{t('shoutsWithCount', { count: props.topic?.stat?.shouts })}</span>
<span class={styles.statsItem}>{t('authorsWithCount', { count: props.topic?.stat?.authors })}</span>
<span class={styles.statsItem}>
{t('followersWithCount', { count: props.topic?.stat?.followers })}
</span>
</div>
</div>
)
}

View File

@ -32,45 +32,6 @@
}
}
.stats {
@include font-size(1.7rem);
color: #9fa1a7;
display: flex;
margin: 0 0 1em;
@include media-breakpoint-down(md) {
flex-wrap: wrap;
}
@include media-breakpoint-down(sm) {
margin-top: 0.5em;
}
.statsItem {
@include font-size(1.5rem);
margin-right: 1.6rem;
white-space: nowrap;
&:last-child {
margin-right: 0;
}
&.compact {
font-size: small;
}
&.followers {
word-break: keep-all;
}
&.button {
float: right;
}
}
}
.loadMoreContainer {
margin-top: 48px;
text-align: center;

View File

@ -1,21 +1,22 @@
import type { Topic } from '../../graphql/schema/core.gen'
import type { Topic } from '../../../graphql/schema/core.gen'
import { Meta } from '@solidjs/meta'
import { clsx } from 'clsx'
import { For, Show, createEffect, createMemo, createSignal } from 'solid-js'
import { useFollowing } from '../../context/following'
import { useLocalize } from '../../context/localize'
import { useRouter } from '../../stores/router'
import { setTopicsSort, useTopicsStore } from '../../stores/zine/topics'
import { capitalize } from '../../utils/capitalize'
import { dummyFilter } from '../../utils/dummyFilter'
import { getImageUrl } from '../../utils/getImageUrl'
import { scrollHandler } from '../../utils/scroll'
import { TopicCard } from '../Topic/Card'
import { Loading } from '../_shared/Loading'
import { SearchField } from '../_shared/SearchField'
import { useFollowing } from '../../../context/following'
import { useLocalize } from '../../../context/localize'
import { useRouter } from '../../../stores/router'
import { setTopicsSort, useTopicsStore } from '../../../stores/zine/topics'
import { capitalize } from '../../../utils/capitalize'
import { dummyFilter } from '../../../utils/dummyFilter'
import { getImageUrl } from '../../../utils/getImageUrl'
import { scrollHandler } from '../../../utils/scroll'
import { TopicCard } from '../../Topic/Card'
import { Loading } from '../../_shared/Loading'
import { SearchField } from '../../_shared/SearchField'
import { TopicBadge } from '../../Topic/TopicBadge'
import styles from './AllTopics.module.scss'
type AllTopicsPageSearchParams = {
@ -29,7 +30,7 @@ type Props = {
const PAGE_SIZE = 20
export const AllTopicsView = (props: Props) => {
export const AllTopics = (props: Props) => {
const { t, lang } = useLocalize()
const { searchParams, changeSearchParams } = useRouter<AllTopicsPageSearchParams>()
const [limit, setLimit] = createSignal(PAGE_SIZE)
@ -41,8 +42,6 @@ export const AllTopicsView = (props: Props) => {
sortBy: searchParams().by || 'shouts',
})
const { subscriptions } = useFollowing()
createEffect(() => {
if (!searchParams().by) {
changeSearchParams({
@ -76,7 +75,7 @@ export const AllTopicsView = (props: Props) => {
return keys
})
const subscribed = (topicSlug: string) => subscriptions.topics.some((topic) => topic.slug === topicSlug)
const { isOwnerSubscribed } = useFollowing()
const showMore = () => setLimit((oldLimit) => oldLimit + PAGE_SIZE)
const [searchQuery, setSearchQuery] = createSignal('')
@ -186,28 +185,18 @@ export const AllTopicsView = (props: Props) => {
<Show when={searchParams().by && searchParams().by !== 'title'}>
<div class="row">
<div class="col-lg-20 col-xl-18">
<div class="col-lg-20 col-xl-18 py-4">
<For each={filteredResults().slice(0, limit())}>
{(topic) => (
<>
<TopicCard
<TopicBadge
topic={topic}
compact={false}
subscribed={subscribed(topic.slug)}
showPublications={true}
showDescription={true}
isFollowed={{
loaded: filteredResults().length > 0,
value: isOwnerSubscribed(topic.slug),
}}
showStat={true}
/>
<div class={styles.stats}>
<span class={styles.statsItem}>
{t('shoutsWithCount', { count: topic.stat.shouts })}
</span>
<span class={styles.statsItem}>
{t('authorsWithCount', { count: topic.stat.authors })}
</span>
<span class={styles.statsItem}>
{t('followersWithCount', { count: topic.stat.followers })}
</span>
</div>
</>
)}
</For>

View File

@ -0,0 +1 @@
export { AllTopics } from './AllTopics'

View File

@ -128,7 +128,6 @@ export const AuthorView = (props: Props) => {
const data = await apiClient.getReactionsBy({
by: { comment: true, created_by: commenter.id },
})
console.debug('[components.Author] fetched comments', data)
setCommented(data)
}

View File

@ -12,17 +12,15 @@ export const StaticPage = (props: Props) => {
return (
<PageLayout title={props.title}>
<div class="wide-container">
<div class="row">
<article
class="col-md-16 col-lg-14 col-xl-12 offset-md-5"
class="wide-container container--static-page"
id="articleBody"
ref={(el) => (articleBodyElement.current = el)}
>
{props.children}
</article>
<div class="row">
<div class="col-md-12 col-xl-14 offset-md-5 order-md-first">{props.children}</div>
<div class="col-md-6 offset-md-1">
<div class="col-md-6 col-lg-4 order-md-last">
<TableOfContents
variant="article"
parentSelector="#articleBody"
@ -30,7 +28,7 @@ export const StaticPage = (props: Props) => {
/>
</div>
</div>
</div>
</article>
</PageLayout>
)
}

View File

@ -20,7 +20,7 @@ interface FollowingContextType {
loadSubscriptions: () => void
follow: (what: FollowingEntity, slug: string) => Promise<void>
unfollow: (what: FollowingEntity, slug: string) => Promise<void>
isOwnerSubscribed: (userId: number) => boolean
isOwnerSubscribed: (id: number | string) => boolean
}
const FollowingContext = createContext<FollowingContextType>()
@ -109,9 +109,11 @@ export const FollowingProvider = (props: { children: JSX.Element }) => {
}
}
const isOwnerSubscribed = (userId: number) => {
if (!author()) return
return !!subscriptions?.authors?.some((authorEntity) => authorEntity.id === userId)
const isOwnerSubscribed = (id?: number | string) => {
if (!author() || !subscriptions) return
const isAuthorSubscribed = subscriptions.authors?.some((authorEntity) => authorEntity.id === id)
const isTopicSubscribed = subscriptions.topics?.some((topicEntity) => topicEntity.slug === id)
return !!isAuthorSubscribed || !!isTopicSubscribed
}
const value: FollowingContextType = {

View File

@ -15,7 +15,6 @@ export const DiscussionRulesPage = () => {
return (
<StaticPage title={ogTitle}>
<article class="wide-container container--static-page">
<Meta name="descprition" content={description} />
<Meta name="keywords" content={t('principles keywords')} />
<Meta name="og:type" content="article" />
@ -53,8 +52,8 @@ export const DiscussionRulesPage = () => {
<li>
<p>
Шовинизм, расизм, сексизм, гомофобия, пропаганда ненависти, педофилии, суицида,
распространение детской порнографии и&nbsp;другого человеконенавистнического контента.
Шовинизм, расизм, сексизм, гомофобия, пропаганда ненависти, педофилии, суицида, распространение
детской порнографии и&nbsp;другого человеконенавистнического контента.
</p>
</li>
@ -69,9 +68,9 @@ export const DiscussionRulesPage = () => {
<p>
Неаргументированная критика и&nbsp;комментарии вроде &laquo;отстой&raquo;, &laquo;зачем
я&nbsp;это увидел/а&raquo;, &laquo;не&nbsp;читал, но&nbsp;осуждаю&raquo;, &laquo;либераху
порвало&raquo;, &laquo;лол&raquo;, &laquo;скатились&raquo;, &laquo;первый нах&raquo;
и&nbsp;тому подобные. Односложные реплики не&nbsp;подразумевают возможность обогащающего
диалога, не&nbsp;продуктивны и&nbsp;никак не&nbsp;помогают авторам делать материалы лучше,
порвало&raquo;, &laquo;лол&raquo;, &laquo;скатились&raquo;, &laquo;первый нах&raquo; и&nbsp;тому
подобные. Односложные реплики не&nbsp;подразумевают возможность обогащающего диалога,
не&nbsp;продуктивны и&nbsp;никак не&nbsp;помогают авторам делать материалы лучше,
а&nbsp;читателям&nbsp;&mdash; разобраться.
</p>
</li>
@ -95,9 +94,9 @@ export const DiscussionRulesPage = () => {
<strong>Обмен знаниями и&nbsp;историями.</strong> Осмысленные высказывания по&nbsp;теме поста,
оригинальные рассуждения, рассказы о&nbsp;личном опыте и&nbsp;проектах, обмен профессиональной
экспертизой, наблюдения и&nbsp;реальные истории из&nbsp;жизни&nbsp;&mdash; чем больше
мы&nbsp;делимся друг с&nbsp;другом знаниями, тем интереснее и&nbsp;плодотворнее становится
наше общение. Помните, что каждый вдумчивый ответ повышает качество дискуссий
в&nbsp;сообществе и&nbsp;делает чтение самиздата ещё интереснее.
мы&nbsp;делимся друг с&nbsp;другом знаниями, тем интереснее и&nbsp;плодотворнее становится наше
общение. Помните, что каждый вдумчивый ответ повышает качество дискуссий в&nbsp;сообществе
и&nbsp;делает чтение самиздата ещё интереснее.
</p>
</li>
@ -107,23 +106,22 @@ export const DiscussionRulesPage = () => {
направляют дискуссии в&nbsp;продуктивное русло, но&nbsp;и&nbsp;улучшают настроение.
Не&nbsp;вредите негативом, которого в&nbsp;интернете и&nbsp;без нас хватает,
и&nbsp;не&nbsp;травите на&nbsp;корню классные инициативы&nbsp;&mdash; всё великое начинается
с&nbsp;малого. Мы&nbsp;за&nbsp;поддерживающую и&nbsp;вдохновляющую атмосферу
в&nbsp;сообществе. Надеемся, вы&nbsp;тоже.
с&nbsp;малого. Мы&nbsp;за&nbsp;поддерживающую и&nbsp;вдохновляющую атмосферу в&nbsp;сообществе.
Надеемся, вы&nbsp;тоже.
</p>
</li>
<li>
<p>
<strong>Благодарность и&nbsp;поддержка.</strong> Если публикация вам зашла,
не&nbsp;стесняйтесь ставить лайки, делиться понравившимися материалами, благодарить авторов,
читателей, художников и&nbsp;редакторов в&nbsp;комментариях. Цените и&nbsp;поддерживайте
классные проекты, сильные тексты, новое искусство, осмысленные комментарии и&nbsp;вклад других
<strong>Благодарность и&nbsp;поддержка.</strong> Если публикация вам зашла, не&nbsp;стесняйтесь
ставить лайки, делиться понравившимися материалами, благодарить авторов, читателей, художников
и&nbsp;редакторов в&nbsp;комментариях. Цените и&nbsp;поддерживайте классные проекты, сильные
тексты, новое искусство, осмысленные комментарии и&nbsp;вклад других
в&nbsp;самиздат&nbsp;&mdash; сотрудничество делает нас сильнее и&nbsp;усиливает звучание идей
и&nbsp;смыслов, которые помогают лучше понимать мир.
</p>
</li>
</ol>
</article>
</StaticPage>
)
}

View File

@ -23,8 +23,11 @@ export const DogmaPage = () => {
<Meta name="twitter:card" content="summary_large_image" />
<Meta name="twitter:title" content={ogTitle} />
<Meta name="twitter:description" content={description} />
<article class="wide-container container--static-page">
<h4>Редакционные принципы</h4>
<h1>
<span class="wrapped">Редакционные принципы</span>
</h1>
<p>
Дискурс журнал с открытой горизонтальной редакцией. Содержание журнала определяется прямым
голосованием его авторов. Мы нередко занимаем различные позиции по разным проблемам, но
@ -39,8 +42,8 @@ export const DogmaPage = () => {
<li>
<b>Ответственно относимся к источникам.</b>
Мы выбираем только надежные источники, проверяем информацию и рассказываем, как и откуда мы её
получили, кроме случаев, когда это может нанести вред источникам. Тогда мы не раскроем их, даже
в суде.
получили, кроме случаев, когда это может нанести вред источникам. Тогда мы не раскроем их, даже в
суде.
</li>
<li>
<b>Выбираем компетентных и независимых экспертов</b>, понимая всю степень ответственности перед
@ -63,7 +66,6 @@ export const DogmaPage = () => {
.
</li>
</ol>
</article>
</StaticPage>
)
}

View File

@ -24,14 +24,13 @@ export const GuidePage = () => {
<Meta name="twitter:card" content="summary_large_image" />
<Meta name="twitter:title" content={ogTitle} />
<Meta name="twitter:description" content={description} />
<article class="wide-container container--static-page">
<h1 id="about">
<span class="wrapped">{ogTitle}</span>
</h1>
<p>
Дискурс&nbsp;&mdash; независимый журнал о&nbsp;культуре, науке, искусстве и&nbsp;обществе
с&nbsp;
Дискурс&nbsp;&mdash; независимый журнал о&nbsp;культуре, науке, искусстве и&nbsp;обществе с&nbsp;
<a href="/about/manifest">открытой редакцией</a>. У&nbsp;нас нет главного редактора, инвестора
и&nbsp;вообще никого, кто&nbsp;бы принимал единоличные решения. Вместо традиционных иерархий
Дискурс основан на&nbsp;принципах прямой демократии: в&nbsp;нашем горизонтальном сообществе все
@ -50,9 +49,9 @@ export const GuidePage = () => {
<li>
<p>
<a href="/topic/art">Искусство</a>
&nbsp;&mdash; здесь, например, представлены художественные произведения: литература,
живопись, музыка, фотографии, видео. Этот раздел помогает прозвучать новому искусству,
которое создают российские художники, писатели, режиссёры и&nbsp;музыканты.
&nbsp;&mdash; здесь, например, представлены художественные произведения: литература, живопись,
музыка, фотографии, видео. Этот раздел помогает прозвучать новому искусству, которое создают
российские художники, писатели, режиссёры и&nbsp;музыканты.
</p>
</li>
{/*
@ -83,24 +82,24 @@ export const GuidePage = () => {
материалы по&nbsp;жанрам (например, <a href="/topic/interview">интервью</a>,{' '}
<a href="/topic/reportage">репортажи</a>, <a href="/topic/essay">эссе</a>,{' '}
<a href="/topic/likbez">ликбезы</a>
), по&nbsp;тематике (<a href="/topic/cinema">кино</a>, <a href="/topic/philosophy">философия</a>
, <a href="/topic/history">история</a>, <a href="/topic/absurdism">абсурдизм</a>,{' '}
), по&nbsp;тематике (<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> и&nbsp;т.д.) или в&nbsp;серии (как &laquo;
<a href="/topic/zakony-mira">Законы мира</a>&raquo; или &laquo;
<a href="/topic/za-liniey-mannergeyma">За&nbsp;линией Маннергейма</a>
&raquo;). Темы объединяют сотни публикаций, помогают ориентироваться в&nbsp;журнале
и&nbsp;следить за&nbsp;интересными материалами.
&raquo;). Темы объединяют сотни публикаций, помогают ориентироваться в&nbsp;журнале и&nbsp;следить
за&nbsp;интересными материалами.
</p>
<section>
<h3 id="become-author">Как стать автором журнала</h3>
<p>
Дискурс объединяет журналистов, активистов, музыкантов, художников, фотографов, режиссеров,
философов, ученых и&nbsp;других замечательных людей. Каждый может{' '}
<a href="/create">прислать</a> свой материал в&nbsp;журнал. Формат и&nbsp;тематика
не&nbsp;имеют значения, единственное, что важно &mdash;{' '}
<a href="/how-to-write-a-good-article">хороший</a> ли&nbsp;материал. Если сообщество поддержит
вашу публикацию, она выйдет в&nbsp;журнале и&nbsp;станет доступна тысячам наших читателей.
философов, ученых и&nbsp;других замечательных людей. Каждый может <a href="/create">прислать</a>{' '}
свой материал в&nbsp;журнал. Формат и&nbsp;тематика не&nbsp;имеют значения, единственное, что
важно &mdash; <a href="/how-to-write-a-good-article">хороший</a> ли&nbsp;материал. Если
сообщество поддержит вашу публикацию, она выйдет в&nbsp;журнале и&nbsp;станет доступна тысячам
наших читателей.
</p>
</section>
@ -167,8 +166,8 @@ export const GuidePage = () => {
</li>
<li>
<p>
<strong>Возможность обратиться к&nbsp;широкой аудитории</strong>. Дискурс читают десятки
тысяч людей, и&nbsp;с&nbsp;каждым днем их&nbsp;становится больше.
<strong>Возможность обратиться к&nbsp;широкой аудитории</strong>. Дискурс читают десятки тысяч
людей, и&nbsp;с&nbsp;каждым днем их&nbsp;становится больше.
</p>
</li>
<li>
@ -185,12 +184,11 @@ export const GuidePage = () => {
</li>
<li>
<p>
<strong>Пресс-карты для корреспондентов</strong>. Три опубликованные статьи позволяют
авторам Дискурса получить официальные удостоверения журналистов (пресс-карты)
на&nbsp;следующий год. Пресс-карты удостоверяют, что вы&nbsp;журналист и&nbsp;можете
пользоваться всеми теми правами, которые гарантирует Закон о&nbsp;СМИ. Кроме того, многие
культурные институции (музеи, галереи и&nbsp;др.) предоставляют журналистам право свободного
входа.
<strong>Пресс-карты для корреспондентов</strong>. Три опубликованные статьи позволяют авторам
Дискурса получить официальные удостоверения журналистов (пресс-карты) на&nbsp;следующий год.
Пресс-карты удостоверяют, что вы&nbsp;журналист и&nbsp;можете пользоваться всеми теми правами,
которые гарантирует Закон о&nbsp;СМИ. Кроме того, многие культурные институции (музеи, галереи
и&nbsp;др.) предоставляют журналистам право свободного входа.
</p>
</li>
<li>
@ -241,7 +239,6 @@ export const GuidePage = () => {
</a>
. Мы&nbsp;обязательно ответим.
</p>
</article>
</>
</StaticPage>
)

View File

@ -27,24 +27,24 @@ export const HelpPage = () => {
<Meta name="twitter:card" content="summary_large_image" />
<Meta name="twitter:title" content={ogTitle} />
<Meta name="twitter:description" content={description} />
<article class="wide-container container--static-page">
<h1 id="help-us">
<span class="wrapped">Как вы&nbsp;можете поддержать Дискурс?</span>
</h1>
<p>
Дискурс&nbsp;&mdash; уникальное независимое издание с&nbsp;горизонтальной редакцией,
существующее в&nbsp;интересах своих читателей. Ваша поддержка действительно много
значит&nbsp;&mdash; не&nbsp;только для редакции Дискурса, но&nbsp;и&nbsp;для сохранения
свободной мысли и&nbsp;некоммерческого искусства в&nbsp;нашем обществе.
Дискурс&nbsp;&mdash; уникальное независимое издание с&nbsp;горизонтальной редакцией, существующее
в&nbsp;интересах своих читателей. Ваша поддержка действительно много значит&nbsp;&mdash;
не&nbsp;только для редакции Дискурса, но&nbsp;и&nbsp;для сохранения свободной мысли
и&nbsp;некоммерческого искусства в&nbsp;нашем обществе.
</p>
<p>
Дискурс существует на&nbsp;добровольных началах. Никакой медиахолдинг, фонд или государственная
структура не&nbsp;финансирует нас&nbsp;&mdash; благодаря этому мы&nbsp;можем писать о&nbsp;том,
что важно, а&nbsp;не&nbsp;о&nbsp;том, что выгодно. Сообщество наших волонтеров ежедневно
трудится, чтобы рассказывать вам интересные, не&nbsp;освещенные другими изданиями
истории&nbsp;&mdash; но&nbsp;мы&nbsp;не&nbsp;сможем делать это без вашей помощи. Пожертвования
читателей составляют основу нашего бюджета и&nbsp;позволяют нам существовать.
что важно, а&nbsp;не&nbsp;о&nbsp;том, что выгодно. Сообщество наших волонтеров ежедневно трудится,
чтобы рассказывать вам интересные, не&nbsp;освещенные другими изданиями истории&nbsp;&mdash;
но&nbsp;мы&nbsp;не&nbsp;сможем делать это без вашей помощи. Пожертвования читателей составляют
основу нашего бюджета и&nbsp;позволяют нам существовать.
</p>
<p>
Если вам нравится&nbsp;то, что мы&nbsp;делаем и&nbsp;вы&nbsp;хотите, чтобы Дискурс продолжался,
@ -58,10 +58,9 @@ export const HelpPage = () => {
<h3 id="financial-report">На&nbsp;что пойдут деньги?</h3>
<p>
Ваши пожертвования пойдут на&nbsp;оплату серверов, содержание офиса, зарплату редакции
и&nbsp;налоги, оплату юридического сопровождения и&nbsp;труда бухгалтера, совершенствование
сайта, аренду помещения для открытой редакции, на&nbsp;печать альманаха Дискурс с&nbsp;лучшими
текстами авторов за&nbsp;полгода, а&nbsp;также на&nbsp;другие редакционные и&nbsp;технические
расходы.
и&nbsp;налоги, оплату юридического сопровождения и&nbsp;труда бухгалтера, совершенствование сайта,
аренду помещения для открытой редакции, на&nbsp;печать альманаха Дискурс с&nbsp;лучшими текстами
авторов за&nbsp;полгода, а&nbsp;также на&nbsp;другие редакционные и&nbsp;технические расходы.
</p>
<h3>Ваша помощь позволит нам</h3>
<ul>
@ -75,10 +74,10 @@ export const HelpPage = () => {
<li>
<h4>Создавать еще больше контента.</h4>
<p>
Каждый день к&nbsp;нам присоединяются новые люди, и&nbsp;чем больше нас становится, тем
больше мы&nbsp;творим и&nbsp;строже оцениваем результаты творчества друг друга.
В&nbsp;результате повышается и&nbsp;количество, и&nbsp;качество контента. Каждый день мы
трудимся, чтобы открывать нашим читателям новые грани окружающего мира.
Каждый день к&nbsp;нам присоединяются новые люди, и&nbsp;чем больше нас становится, тем больше
мы&nbsp;творим и&nbsp;строже оцениваем результаты творчества друг друга. В&nbsp;результате
повышается и&nbsp;количество, и&nbsp;качество контента. Каждый день мы трудимся, чтобы
открывать нашим читателям новые грани окружающего мира.
</p>
</li>
<li>
@ -91,9 +90,9 @@ export const HelpPage = () => {
<li>
<h4>Модернизировать сайт.</h4>
<p>
Мы&nbsp;совершенствуем платформу и&nbsp;стараемся сделать проект максимально удобным для
вас. Мы&nbsp;работаем над мобильной версией, новым дизайном, фукционалом, системой
регистрации, навигации и&nbsp;рекомендаций, которые сделают наше общение еще увлекательней.
Мы&nbsp;совершенствуем платформу и&nbsp;стараемся сделать проект максимально удобным для вас.
Мы&nbsp;работаем над мобильной версией, новым дизайном, фукционалом, системой регистрации,
навигации и&nbsp;рекомендаций, которые сделают наше общение еще увлекательней.
</p>
</li>
<li>
@ -118,9 +117,9 @@ export const HelpPage = () => {
</p>
<h3 id="other">Как ещё можно поддержать Дискурс?</h3>
<p>
Есть много других способов поддержать Дискурс и&nbsp;труд наших авторов. Например,
вы&nbsp;можете периодически рассказывать о&nbsp;проекте своим друзьям в&nbsp;соцсетях, делиться
хорошими материалами или&nbsp;&mdash; что еще лучше&nbsp;&mdash; публиковать свои статьи
Есть много других способов поддержать Дискурс и&nbsp;труд наших авторов. Например, вы&nbsp;можете
периодически рассказывать о&nbsp;проекте своим друзьям в&nbsp;соцсетях, делиться хорошими
материалами или&nbsp;&mdash; что еще лучше&nbsp;&mdash; публиковать свои статьи
в&nbsp;&laquo;Дискурсе&raquo;. Но&nbsp;главное, что вы&nbsp;можете сделать для Дискурса, &mdash;
читать нас. Мы&nbsp;вкладываем в&nbsp;журнал душу, и&nbsp;внимание каждого читателя убеждает нас
в&nbsp;правильности выбранного пути. Не&nbsp;переключайтесь.
@ -133,7 +132,6 @@ export const HelpPage = () => {
</a>
.
</p>
</article>
</>
</StaticPage>
)

View File

@ -36,7 +36,7 @@ export const ManifestPage = () => {
<Meta name="twitter:card" content="summary_large_image" />
<Meta name="twitter:title" content={ogTitle} />
<Meta name="twitter:description" content={description} />
<article class="wide-container container--static-page">
<h1 id="manifest">
<span class="wrapped">Манифест</span>
</h1>
@ -46,8 +46,8 @@ export const ManifestPage = () => {
редакцией, основанный на&nbsp;принципах свободы слова, прямой демократии и&nbsp;совместного
редактирования. Дискурс создаётся открытым медиасообществом ученых, журналистов, музыкантов,
писателей, предпринимателей, философов, инженеров, художников и&nbsp;специалистов со&nbsp;всего
мира, объединившихся, чтобы вместе делать общий журнал и&nbsp;объяснять с&nbsp;разных точек
зрения мозаичную картину современности.
мира, объединившихся, чтобы вместе делать общий журнал и&nbsp;объяснять с&nbsp;разных точек зрения
мозаичную картину современности.
</p>
<p>
Мы&nbsp;пишем о&nbsp;культуре, науке и&nbsp;обществе, рассказываем о&nbsp;новых идеях
@ -62,9 +62,9 @@ export const ManifestPage = () => {
Редакция Дискурса открыта для всех: у&nbsp;нас нет цензуры, запретных тем и&nbsp;идеологических
рамок. Каждый может <a href="/create">прислать материал</a> в&nbsp;журнал и&nbsp;
<a href="/about/guide">присоединиться к&nbsp;редакции</a>. Предоставляя трибуну для независимой
журналистики и&nbsp;художественных проектов, мы&nbsp;помогаем людям рассказывать свои истории
так, чтобы они были услышаны. Мы&nbsp;убеждены: чем больше голосов будет звучать
на&nbsp;Дискурсе, тем громче в&nbsp;полифонии мнений будет слышна истина.
журналистики и&nbsp;художественных проектов, мы&nbsp;помогаем людям рассказывать свои истории так,
чтобы они были услышаны. Мы&nbsp;убеждены: чем больше голосов будет звучать на&nbsp;Дискурсе, тем
громче в&nbsp;полифонии мнений будет слышна истина.
</p>
<h2 class="h2" id="participation">
@ -81,8 +81,8 @@ export const ManifestPage = () => {
<h3 id="contribute">Предлагать материалы</h3>
</summary>
<p>
<a href="/create">Создавайте</a> свои статьи и&nbsp;художественные работы&nbsp;&mdash; лучшие
из них будут опубликованы в&nbsp;журнале. Дискурс&nbsp;&mdash; некоммерческое издание, авторы
<a href="/create">Создавайте</a> свои статьи и&nbsp;художественные работы&nbsp;&mdash; лучшие из
них будут опубликованы в&nbsp;журнале. Дискурс&nbsp;&mdash; некоммерческое издание, авторы
публикуются в&nbsp;журнале на&nbsp;общественных началах, получая при этом{' '}
<a href="/create?collab=true">поддержку</a> редакции, право голоса, множество других
возможностей и&nbsp;читателей по&nbsp;всему миру.
@ -95,8 +95,8 @@ export const ManifestPage = () => {
</summary>
<p>
Дискурс существует на&nbsp;пожертвования читателей. Если вам нравится журнал, пожалуйста,{' '}
<a href="/about/help">поддержите</a> нашу работу. Ваши пожертвования пойдут на&nbsp;выпуск
новых материалов, оплату серверов, труда программистов, дизайнеров и&nbsp;редакторов.
<a href="/about/help">поддержите</a> нашу работу. Ваши пожертвования пойдут на&nbsp;выпуск новых
материалов, оплату серверов, труда программистов, дизайнеров и&nbsp;редакторов.
</p>
</details>
@ -117,8 +117,8 @@ export const ManifestPage = () => {
</p>
<p>
Если вы разработчик и&nbsp;хотите помогать с&nbsp;развитием сайта Дискурса,{' '}
<a href="mailto:services@discours.io">присоединяйтесь к&nbsp;IT-команде самиздата</a>.
Открытый код платформы для независимой журналистики, а&nbsp;также всех наших спецпроектов
<a href="mailto:services@discours.io">присоединяйтесь к&nbsp;IT-команде самиздата</a>. Открытый
код платформы для независимой журналистики, а&nbsp;также всех наших спецпроектов
и&nbsp;медиаинструментов находится{' '}
<a href="https://github.com/Discours">в&nbsp;свободном доступе на&nbsp;GitHub</a>.
</p>
@ -157,7 +157,6 @@ export const ManifestPage = () => {
<a href="mailto:welcome@discours.io">welcome@discours.io</a>. Мы обязательно ответим
и&nbsp;постараемся реализовать все хорошие задумки.
</p>
</article>
</>
</StaticPage>
)

View File

@ -13,7 +13,6 @@ export const PartnersPage = () => {
return (
<StaticPage title={ogTitle}>
<article class="wide-container container--static-page">
<Meta name="descprition" content={description} />
<Meta name="keywords" content={t('keywords')} />
<Meta name="og:type" content="article" />
@ -24,12 +23,8 @@ export const PartnersPage = () => {
<Meta name="twitter:card" content="summary_large_image" />
<Meta name="twitter:title" content={ogTitle} />
<Meta name="twitter:description" content={description} />
<div class="row">
<div class="col-md-12 col-xl-14 offset-md-5 order-md-first">
<h1>{t('Partners')}</h1>
</div>
</div>
</article>
</StaticPage>
)
}

View File

@ -13,7 +13,6 @@ export const PrinciplesPage = () => {
return (
<StaticPage title={ogTitle}>
<article class="wide-container container--static-page">
<Meta name="descprition" content={description} />
<Meta name="keywords" content={t('principles keywords')} />
<Meta name="og:type" content="article" />
@ -24,6 +23,7 @@ export const PrinciplesPage = () => {
<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>
@ -41,17 +41,17 @@ export const PrinciplesPage = () => {
<li>
<p>
<strong>Многоголосие</strong>. Мы&nbsp;ценим свободу слова и&nbsp;аргументированные мнения.
Предоставляя трибуну каждому, кому есть что сказать, самиздат отражает полифонию позиций,
знаний и&nbsp;опыта, которые открывают более полную картину реальности.
Предоставляя трибуну каждому, кому есть что сказать, самиздат отражает полифонию позиций, знаний
и&nbsp;опыта, которые открывают более полную картину реальности.
</p>
</li>
<li>
<p>
<strong>Взаимопомощь</strong>. Мы&nbsp;помогаем друг другу, потому что хотим, чтобы
в&nbsp;мире было еще больше хорошего. Обсуждая что-то, мы&nbsp;всегда интересуемся, чем можем
помочь. В&nbsp;самиздате можно найти специалистов практически в&nbsp;любых сферах
и&nbsp;получить поддержку от&nbsp;сотен людей. Благодаря коллективной экспертизе глобального
сообщества в&nbsp;самиздате выходят крутейшие публикации, которыми можно вечно гордиться.
<strong>Взаимопомощь</strong>. Мы&nbsp;помогаем друг другу, потому что хотим, чтобы в&nbsp;мире
было еще больше хорошего. Обсуждая что-то, мы&nbsp;всегда интересуемся, чем можем помочь.
В&nbsp;самиздате можно найти специалистов практически в&nbsp;любых сферах и&nbsp;получить
поддержку от&nbsp;сотен людей. Благодаря коллективной экспертизе глобального сообщества
в&nbsp;самиздате выходят крутейшие публикации, которыми можно вечно гордиться.
</p>
</li>
<li>
@ -64,8 +64,8 @@ export const PrinciplesPage = () => {
</li>
<li>
<p>
<strong>Созидание</strong>. Мы&nbsp;создаем, потому что любим создавать. Мы&nbsp;открыто
делимся опытом, дарим идеи, обмениваемся мнениями и&nbsp;благодарим за&nbsp;критику, используя
<strong>Созидание</strong>. Мы&nbsp;создаем, потому что любим создавать. Мы&nbsp;открыто делимся
опытом, дарим идеи, обмениваемся мнениями и&nbsp;благодарим за&nbsp;критику, используя
ее&nbsp;для совершенствования мастерства и&nbsp;саморазвития. Мы&nbsp;знаем, что мир
не&nbsp;идеальное место, и&nbsp;делаем всё возможное, чтобы он&nbsp;стал лучше.
</p>
@ -78,11 +78,10 @@ export const PrinciplesPage = () => {
<p>
Открытая редакция объединяет сотни потрясающих людей со&nbsp;всего мира, которые делают крутейшие
вещи. Это пространство, где доверяют, вдохновляют, исследуют и&nbsp;создают новое вместе.
Поскольку все в&nbsp;сообществе очень разные, как-то мы&nbsp;собрались и&nbsp;решили зафиксировать
базовые ценности открытой редакции, а&nbsp;заодно придумали универсальные правила взаимодействия,
чтобы общение было не&nbsp;только плодотворным, но&nbsp;и&nbsp;приятным для всех участников
сообщества.
вещи. Это пространство, где доверяют, вдохновляют, исследуют и&nbsp;создают новое вместе. Поскольку
все в&nbsp;сообществе очень разные, как-то мы&nbsp;собрались и&nbsp;решили зафиксировать базовые
ценности открытой редакции, а&nbsp;заодно придумали универсальные правила взаимодействия, чтобы
общение было не&nbsp;только плодотворным, но&nbsp;и&nbsp;приятным для всех участников сообщества.
</p>
<ol>
<li>
@ -108,14 +107,13 @@ export const PrinciplesPage = () => {
<li>
<p>
<strong>Критикуем и&nbsp;реагируем конструктивно</strong>. Самиздат про&nbsp;то, чтобы
разбираться в&nbsp;сложных вещах всем сообществом, поэтому мы&nbsp;тактично и&nbsp;без
агрессии делимся мнениями, стараясь убедительно аргументировать позиции.
И&nbsp;с&nbsp;благодарностью принимаем критику, используя ее&nbsp;для улучшения наших
проектов. Мы&nbsp;верим, что каждый участник сообщества имеет добрые намерения,
и&nbsp;придерживаемся принципов доброжелательной критики, стараемся делиться
советами&nbsp;&mdash; лучшим средством для самосовершенствования. Обоснованная критика
помогает и&nbsp;адресату, и&nbsp;всем участникам сообщества досконально изучить тему
и&nbsp;глубже разобраться в&nbsp;проблеме.
разбираться в&nbsp;сложных вещах всем сообществом, поэтому мы&nbsp;тактично и&nbsp;без агрессии
делимся мнениями, стараясь убедительно аргументировать позиции. И&nbsp;с&nbsp;благодарностью
принимаем критику, используя ее&nbsp;для улучшения наших проектов. Мы&nbsp;верим, что каждый
участник сообщества имеет добрые намерения, и&nbsp;придерживаемся принципов доброжелательной
критики, стараемся делиться советами&nbsp;&mdash; лучшим средством для самосовершенствования.
Обоснованная критика помогает и&nbsp;адресату, и&nbsp;всем участникам сообщества досконально
изучить тему и&nbsp;глубже разобраться в&nbsp;проблеме.
</p>
</li>
@ -134,10 +132,10 @@ export const PrinciplesPage = () => {
<li>
<p>
<strong>Не&nbsp;переходим на&nbsp;личности&nbsp;&mdash; это признак токсичности</strong>.
Всегда мудрее обсуждать точку зрения человека, а&nbsp;не&nbsp;его самого, даже если
он&nbsp;вам не&nbsp;импонирует. Предвзятое отношение ограничивает кругозор, добавляет
преждевременные морщины и&nbsp;не&nbsp;помогает окружающим стать лучше. Вежливость
<strong>Не&nbsp;переходим на&nbsp;личности&nbsp;&mdash; это признак токсичности</strong>. Всегда
мудрее обсуждать точку зрения человека, а&nbsp;не&nbsp;его самого, даже если он&nbsp;вам
не&nbsp;импонирует. Предвзятое отношение ограничивает кругозор, добавляет преждевременные
морщины и&nbsp;не&nbsp;помогает окружающим стать лучше. Вежливость
и&nbsp;взаимоуважение&nbsp;&mdash; краеугольная основа вдумчивых и&nbsp;осмысленных дискуссий.
</p>
</li>
@ -156,19 +154,19 @@ export const PrinciplesPage = () => {
<p>
<strong>Даем еще один шанс</strong>. Все совершают ошибки, и&nbsp;за&nbsp;один проступок
не&nbsp;стоит вычеркивать людей из&nbsp;жизни. Ошибки нужны, чтобы на&nbsp;них учиться
и&nbsp;делать выводы. Однако если многократно и&nbsp;систематически нарушать правила
сообщества, наверняка можно заслужить минусы в&nbsp;карму от&nbsp;других участников
и&nbsp;потерять доступ к&nbsp;сообществу.
и&nbsp;делать выводы. Однако если многократно и&nbsp;систематически нарушать правила сообщества,
наверняка можно заслужить минусы в&nbsp;карму от&nbsp;других участников и&nbsp;потерять доступ
к&nbsp;сообществу.
</p>
</li>
<li>
<p>
<strong>Вместе создаем идеальную среду общения</strong>. Открытая редакция&nbsp;&mdash; это
утопическое пространство обогащающей и&nbsp;осмысленной коммуникации. Атмосфера
горизонтального сообщества складывается из&nbsp;действий каждого, поэтому мы&nbsp;действуем
так, чтобы способствовать сотворчеству, коллективному познанию и&nbsp;развитию самиздата
и&nbsp;нашей альтернативной интеллектуальной медиасреды.
утопическое пространство обогащающей и&nbsp;осмысленной коммуникации. Атмосфера горизонтального
сообщества складывается из&nbsp;действий каждого, поэтому мы&nbsp;действуем так, чтобы
способствовать сотворчеству, коллективному познанию и&nbsp;развитию самиздата и&nbsp;нашей
альтернативной интеллектуальной медиасреды.
</p>
</li>
@ -176,14 +174,13 @@ export const PrinciplesPage = () => {
<p>
<strong>Помним, что всё в&nbsp;сообществе зависит от&nbsp;нас</strong>. Если нам чего-то
не&nbsp;хватает, мы&nbsp;начинаем действовать&nbsp;&mdash; рассказываем об&nbsp;идее, находим
единомышленников, готовим и&nbsp;запускаем проект. Так в&nbsp;сообществе становится
на&nbsp;одну крутую активность больше. Так появилось наше сообщество. Так появился самиздат
и&nbsp;все проекты открытой редакции. Чтобы в&nbsp;сообществе случилось что-то прекрасное,
достаточно просто положить этому начало.
единомышленников, готовим и&nbsp;запускаем проект. Так в&nbsp;сообществе становится на&nbsp;одну
крутую активность больше. Так появилось наше сообщество. Так появился самиздат и&nbsp;все
проекты открытой редакции. Чтобы в&nbsp;сообществе случилось что-то прекрасное, достаточно
просто положить этому начало.
</p>
</li>
</ol>
</article>
</StaticPage>
)
}

View File

@ -24,7 +24,6 @@ export const TermsOfUsePage = () => {
<Meta name="twitter:title" content={ogTitle} />
<Meta name="twitter:description" content={description} />
<article class="wide-container container--static-page">
<h1 id="terms-of-use">
<span class="wrapped">Пользовательское соглашение</span>
</h1>
@ -112,8 +111,8 @@ export const TermsOfUsePage = () => {
<li>
<p>
Цитирование, распространение, доведение до&nbsp;всеобщего сведения материалов Cайта
приветствуется. При использовании материалов сайта необходимо указать имя автора
и&nbsp;активную ссылку на&nbsp;материал на&nbsp;Сайте.
приветствуется. При использовании материалов сайта необходимо указать имя автора и&nbsp;активную
ссылку на&nbsp;материал на&nbsp;Сайте.
</p>
</li>
</ol>
@ -131,8 +130,8 @@ export const TermsOfUsePage = () => {
<ul>
<li>
Публиковать контент, авторские права на&nbsp;который принадлежат третьим лицам, без согласия
этих лиц. Если авторские права на контент принадлежат нескольким лицам, то&nbsp;его
публикация предполагает согласие их&nbsp;всех.
этих лиц. Если авторские права на контент принадлежат нескольким лицам, то&nbsp;его публикация
предполагает согласие их&nbsp;всех.
</li>
<li>Размещать коммерческую и&nbsp;политическую рекламу.</li>
<li>
@ -175,8 +174,8 @@ export const TermsOfUsePage = () => {
<p>
Данные, которые пользователи сообщают о&nbsp;себе сами при подаче заявки, регистрации,
авторизации или заполнения профиля, в&nbsp;том числе ФИО и&nbsp;контактную информацию.
Конфиденциальные данные, такие как идентификатор и&nbsp;электронный адрес, используются
для идентификации пользователя. Данные профиля, размещённые публично по&nbsp;желанию
Конфиденциальные данные, такие как идентификатор и&nbsp;электронный адрес, используются для
идентификации пользователя. Данные профиля, размещённые публично по&nbsp;желанию
пользователя, которое выражается фактом их&nbsp;предоставления, используется для
демонстрации другим пользователям той информации о&nbsp;себе, которую пользователь готов
предоставить.
@ -198,8 +197,8 @@ export const TermsOfUsePage = () => {
</li>
<li>
<p class="ng-binding">
По&nbsp;желанию пользователя Издательство готово удалить любую информацию о&nbsp;нем,
собранную автоматическим путем. Для этого следует написать на&nbsp;адрес электронной почты{' '}
По&nbsp;желанию пользователя Издательство готово удалить любую информацию о&nbsp;нем, собранную
автоматическим путем. Для этого следует написать на&nbsp;адрес электронной почты{' '}
<a href="mailto:welcome@discours.io" target="_blank" rel="noreferrer">
welcome@discours.io
</a>
@ -240,7 +239,6 @@ export const TermsOfUsePage = () => {
</a>{' '}
или через форму <a href="/connect">&laquo;предложить идею&raquo;</a>.
</p>
</article>
</StaticPage>
)
}

View File

@ -14,7 +14,6 @@ export const ThanksPage = () => {
return (
<StaticPage title={ogTitle}>
<article class="wide-container container--static-page">
<Meta name="descprition" content={description} />
<Meta name="keywords" content={t('keywords')} />
<Meta name="og:type" content="article" />
@ -25,6 +24,7 @@ export const ThanksPage = () => {
<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>
@ -56,12 +56,12 @@ export const ThanksPage = () => {
<h3>Неоценимый вклад в&nbsp;Дискурс внесли и&nbsp;вносят</h3>
<p>
Мария Бессмертная, Дамир Бикчурин, Константин Ворович, Ян&nbsp;Выговский, Эльдар Гариффулин, Павел
Гафаров, Виктория Гендлина, Александр Гусев, Данила Давыдов, Константин Дубовик, Вячеслав
Еременко, Кристина Ибрагим, Екатерина Ильина, Анна Капаева, Яна Климова, Александр Коренков, Ирэна
Лесневская, Игорь Лобанов, Анастасия Лозовая, Григорий Ломизе, Евгений Медведев, Павел Никулин,
Николай Носачевский, Андрей Орловский, Михаил Панин, Антон Панов, Павел Пепперштейн, Любовь
Покровская, Илья Розовский, Денис Светличный, Павел Соколов, Сергей Стрельников, Глеб Струнников,
Николай Тарковский, Кирилл Филимонов, Алексей Хапов, Екатерина Харитонова
Гафаров, Виктория Гендлина, Александр Гусев, Данила Давыдов, Константин Дубовик, Вячеслав Еременко,
Кристина Ибрагим, Екатерина Ильина, Анна Капаева, Яна Климова, Александр Коренков, Ирэна Лесневская,
Игорь Лобанов, Анастасия Лозовая, Григорий Ломизе, Евгений Медведев, Павел Никулин, Николай
Носачевский, Андрей Орловский, Михаил Панин, Антон Панов, Павел Пепперштейн, Любовь Покровская, Илья
Розовский, Денис Светличный, Павел Соколов, Сергей Стрельников, Глеб Струнников, Николай Тарковский,
Кирилл Филимонов, Алексей Хапов, Екатерина Харитонова
</p>
<h3>Авторы</h3>
<p>
@ -70,25 +70,24 @@ export const ThanksPage = () => {
каждому автору
</a>{' '}
за&nbsp;участие и&nbsp;поддержку проекта. Сегодня, когда для большинства деньги стали целью
и&nbsp;основным источником мотивации, бескорыстная помощь и&nbsp;основанный на&nbsp;энтузиазме
труд бесценны. Именно вы&nbsp;своим трудом каждый день делаете Дискурс таким, какой он&nbsp;есть.
и&nbsp;основным источником мотивации, бескорыстная помощь и&nbsp;основанный на&nbsp;энтузиазме труд
бесценны. Именно вы&nbsp;своим трудом каждый день делаете Дискурс таким, какой он&nbsp;есть.
</p>
<h3>Иллюстраторы</h3>
<p>
Ольга Аверинова, Регина Акчурина, Айгуль Берхеева, Екатерина Вакуленко, Анастасия Викулова, Мария
Власенко, Ванесса Гаврилова, Ольга Горше, Ксения Горшкова, Ангелина Гребенюкова, Илья Diliago,
Антон Жаголкин, Саша Керова, Ольга Машинец, Злата Мечетина, Тала Никитина, Никита Поздняков,
Матвей Сапегин, Татьяна Сафонова, Виктория Шибаева
Власенко, Ванесса Гаврилова, Ольга Горше, Ксения Горшкова, Ангелина Гребенюкова, Илья Diliago, Антон
Жаголкин, Саша Керова, Ольга Машинец, Злата Мечетина, Тала Никитина, Никита Поздняков, Матвей
Сапегин, Татьяна Сафонова, Виктория Шибаева
</p>
<h3>Меценаты</h3>
<p>
Дискурс существует исключительно на&nbsp;пожертвования читателей. Мы&nbsp;бесконечно признательны
всем, кто нас поддерживает. Ваши пожертвования&nbsp;&mdash; финансовый фундамент журнала.
Благодаря вам мы&nbsp;развиваем платформу качественной журналистики, которая помогает самым разным
авторам быть услышанными. Стать нашим меценатом и&nbsp;подписаться на&nbsp;ежемесячную поддержку
проекта можно <a href="/about/help">здесь</a>.
всем, кто нас поддерживает. Ваши пожертвования&nbsp;&mdash; финансовый фундамент журнала. Благодаря
вам мы&nbsp;развиваем платформу качественной журналистики, которая помогает самым разным авторам
быть услышанными. Стать нашим меценатом и&nbsp;подписаться на&nbsp;ежемесячную поддержку проекта
можно <a href="/about/help">здесь</a>.
</p>
</article>
</StaticPage>
)
}

View File

@ -2,7 +2,7 @@ import type { PageProps } from './types'
import { createSignal, onMount } from 'solid-js'
import { AllTopicsView } from '../components/Views/AllTopics'
import { AllTopics } from '../components/Views/AllTopics'
import { PageLayout } from '../components/_shared/PageLayout'
import { useLocalize } from '../context/localize'
import { loadAllTopics } from '../stores/zine/topics'
@ -23,7 +23,7 @@ export const AllTopicsPage = (props: PageProps) => {
return (
<PageLayout title={t('Themes and plots')}>
<AllTopicsView isLoaded={isLoaded()} topics={props.allTopics} />
<AllTopics isLoaded={isLoaded()} topics={props.allTopics} />
</PageLayout>
)
}

View File

@ -50,4 +50,9 @@ export type UploadedFile = {
originalFilename?: string
}
export type FollowedInfo = {
value?: boolean
loaded?: boolean
}
export type SubscriptionFilter = 'all' | 'authors' | 'topics' | 'communities'