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

View File

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

View File

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

View File

@ -1,10 +1,13 @@
.TopicBadge { .TopicBadge {
display: flex;
flex-direction: row;
align-items: flex-start;
margin-bottom: 2rem; margin-bottom: 2rem;
gap: 1rem; gap: 1rem;
.content {
align-items: flex-start;
display: flex;
flex-direction: row;
margin-bottom: .8rem;
}
.basicInfo { .basicInfo {
display: flex; display: flex;
flex-flow: row nowrap; flex-flow: row nowrap;
@ -78,3 +81,34 @@
width: 9em; 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 { clsx } from 'clsx'
import { Show, createEffect, createSignal } from 'solid-js' import { Show, createEffect, createSignal, on } from 'solid-js'
import { useFollowing } from '../../../context/following' import { useFollowing } from '../../../context/following'
import { useLocalize } from '../../../context/localize' import { useLocalize } from '../../../context/localize'
@ -11,11 +11,14 @@ import { getImageUrl } from '../../../utils/getImageUrl'
import { Button } from '../../_shared/Button' import { Button } from '../../_shared/Button'
import { CheckButton } from '../../_shared/CheckButton' import { CheckButton } from '../../_shared/CheckButton'
import { FollowedInfo } from '../../../pages/types'
import styles from './TopicBadge.module.scss' import styles from './TopicBadge.module.scss'
type Props = { type Props = {
topic: Topic topic: Topic
minimizeSubscribeButton?: boolean minimizeSubscribeButton?: boolean
isFollowed?: FollowedInfo
showStat?: boolean
} }
export const TopicBadge = (props: Props) => { export const TopicBadge = (props: Props) => {
@ -24,12 +27,12 @@ export const TopicBadge = (props: Props) => {
const [isMobileView, setIsMobileView] = createSignal(false) const [isMobileView, setIsMobileView] = createSignal(false)
const { requireAuthentication } = useSession() const { requireAuthentication } = useSession()
const { setFollowing, loading: subLoading } = useFollowing() const { setFollowing, loading: subLoading } = useFollowing()
const [followed, setFollowed] = createSignal() const [isFollowed, setIsFollowed] = createSignal<boolean>()
const handleFollowClick = () => { const handleFollowClick = () => {
const value = !followed() const value = !isFollowed()
requireAuthentication(() => { requireAuthentication(() => {
setFollowed(value) setIsFollowed(value)
setFollowing(FollowingEntity.Topic, props.topic.slug, value) setFollowing(FollowingEntity.Topic, props.topic.slug, value)
}, 'subscribe') }, 'subscribe')
} }
@ -38,11 +41,21 @@ export const TopicBadge = (props: Props) => {
setIsMobileView(!mediaMatches.sm) setIsMobileView(!mediaMatches.sm)
}) })
createEffect(
on(
() => props.isFollowed,
() => {
setIsFollowed(props.isFollowed.value)
},
),
)
const title = () => const title = () =>
lang() === 'en' ? capitalize(props.topic.slug.replaceAll('-', ' ')) : props.topic.title lang() === 'en' ? capitalize(props.topic.slug.replaceAll('-', ' ')) : props.topic.title
return ( return (
<div class={styles.TopicBadge}> <div class={styles.TopicBadge}>
<div class={styles.content}>
<div class={styles.basicInfo}> <div class={styles.basicInfo}>
<a <a
href={`/topic/${props.topic.slug}`} href={`/topic/${props.topic.slug}`}
@ -75,11 +88,11 @@ export const TopicBadge = (props: Props) => {
<Show <Show
when={!props.minimizeSubscribeButton} when={!props.minimizeSubscribeButton}
fallback={ fallback={
<CheckButton text={t('Follow')} checked={Boolean(followed())} onClick={handleFollowClick} /> <CheckButton text={t('Follow')} checked={Boolean(isFollowed())} onClick={handleFollowClick} />
} }
> >
<Show <Show
when={followed()} when={isFollowed()}
fallback={ fallback={
<Button <Button
variant="primary" variant="primary"
@ -101,5 +114,13 @@ export const TopicBadge = (props: Props) => {
</Show> </Show>
</div> </div>
</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 { .loadMoreContainer {
margin-top: 48px; margin-top: 48px;
text-align: center; 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 { Meta } from '@solidjs/meta'
import { clsx } from 'clsx' import { clsx } from 'clsx'
import { For, Show, createEffect, createMemo, createSignal } from 'solid-js' import { For, Show, createEffect, createMemo, createSignal } from 'solid-js'
import { useFollowing } from '../../context/following' import { useFollowing } from '../../../context/following'
import { useLocalize } from '../../context/localize' import { useLocalize } from '../../../context/localize'
import { useRouter } from '../../stores/router' import { useRouter } from '../../../stores/router'
import { setTopicsSort, useTopicsStore } from '../../stores/zine/topics' import { setTopicsSort, useTopicsStore } from '../../../stores/zine/topics'
import { capitalize } from '../../utils/capitalize' import { capitalize } from '../../../utils/capitalize'
import { dummyFilter } from '../../utils/dummyFilter' import { dummyFilter } from '../../../utils/dummyFilter'
import { getImageUrl } from '../../utils/getImageUrl' import { getImageUrl } from '../../../utils/getImageUrl'
import { scrollHandler } from '../../utils/scroll' import { scrollHandler } from '../../../utils/scroll'
import { TopicCard } from '../Topic/Card' import { TopicCard } from '../../Topic/Card'
import { Loading } from '../_shared/Loading' import { Loading } from '../../_shared/Loading'
import { SearchField } from '../_shared/SearchField' import { SearchField } from '../../_shared/SearchField'
import { TopicBadge } from '../../Topic/TopicBadge'
import styles from './AllTopics.module.scss' import styles from './AllTopics.module.scss'
type AllTopicsPageSearchParams = { type AllTopicsPageSearchParams = {
@ -29,7 +30,7 @@ type Props = {
const PAGE_SIZE = 20 const PAGE_SIZE = 20
export const AllTopicsView = (props: Props) => { export const AllTopics = (props: Props) => {
const { t, lang } = useLocalize() const { t, lang } = useLocalize()
const { searchParams, changeSearchParams } = useRouter<AllTopicsPageSearchParams>() const { searchParams, changeSearchParams } = useRouter<AllTopicsPageSearchParams>()
const [limit, setLimit] = createSignal(PAGE_SIZE) const [limit, setLimit] = createSignal(PAGE_SIZE)
@ -41,8 +42,6 @@ export const AllTopicsView = (props: Props) => {
sortBy: searchParams().by || 'shouts', sortBy: searchParams().by || 'shouts',
}) })
const { subscriptions } = useFollowing()
createEffect(() => { createEffect(() => {
if (!searchParams().by) { if (!searchParams().by) {
changeSearchParams({ changeSearchParams({
@ -76,7 +75,7 @@ export const AllTopicsView = (props: Props) => {
return keys return keys
}) })
const subscribed = (topicSlug: string) => subscriptions.topics.some((topic) => topic.slug === topicSlug) const { isOwnerSubscribed } = useFollowing()
const showMore = () => setLimit((oldLimit) => oldLimit + PAGE_SIZE) const showMore = () => setLimit((oldLimit) => oldLimit + PAGE_SIZE)
const [searchQuery, setSearchQuery] = createSignal('') const [searchQuery, setSearchQuery] = createSignal('')
@ -186,28 +185,18 @@ export const AllTopicsView = (props: Props) => {
<Show when={searchParams().by && searchParams().by !== 'title'}> <Show when={searchParams().by && searchParams().by !== 'title'}>
<div class="row"> <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())}> <For each={filteredResults().slice(0, limit())}>
{(topic) => ( {(topic) => (
<> <>
<TopicCard <TopicBadge
topic={topic} topic={topic}
compact={false} isFollowed={{
subscribed={subscribed(topic.slug)} loaded: filteredResults().length > 0,
showPublications={true} value: isOwnerSubscribed(topic.slug),
showDescription={true} }}
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> </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({ const data = await apiClient.getReactionsBy({
by: { comment: true, created_by: commenter.id }, by: { comment: true, created_by: commenter.id },
}) })
console.debug('[components.Author] fetched comments', data)
setCommented(data) setCommented(data)
} }

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -13,7 +13,6 @@ export const PartnersPage = () => {
return ( return (
<StaticPage title={ogTitle}> <StaticPage title={ogTitle}>
<article class="wide-container container--static-page">
<Meta name="descprition" content={description} /> <Meta name="descprition" content={description} />
<Meta name="keywords" content={t('keywords')} /> <Meta name="keywords" content={t('keywords')} />
<Meta name="og:type" content="article" /> <Meta name="og:type" content="article" />
@ -24,12 +23,8 @@ export const PartnersPage = () => {
<Meta name="twitter:card" content="summary_large_image" /> <Meta name="twitter:card" content="summary_large_image" />
<Meta name="twitter:title" content={ogTitle} /> <Meta name="twitter:title" content={ogTitle} />
<Meta name="twitter:description" content={description} /> <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> <h1>{t('Partners')}</h1>
</div>
</div>
</article>
</StaticPage> </StaticPage>
) )
} }

View File

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

View File

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

View File

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

View File

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

View File

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