Merge remote-tracking branch 'origin/dev' into prepare-inbox

# Conflicts:
#	src/utils/config.ts
This commit is contained in:
ilya-bkv 2022-11-21 09:01:20 +03:00
commit 9f0502cab0
57 changed files with 843 additions and 625 deletions

View File

@ -25,6 +25,7 @@
"preview": "astro preview", "preview": "astro preview",
"server": "node server/server.mjs", "server": "node server/server.mjs",
"start": "astro dev", "start": "astro dev",
"start:local": "cross-env PUBLIC_API_URL=http://localhost:8080 astro dev",
"typecheck": "astro check && tsc --noEmit", "typecheck": "astro check && tsc --noEmit",
"typecheck:watch": "tsc --noEmit --watch", "typecheck:watch": "tsc --noEmit --watch",
"vercel-build": "astro build" "vercel-build": "astro build"
@ -46,7 +47,7 @@
"@nanostores/router": "^0.7.0", "@nanostores/router": "^0.7.0",
"@nanostores/solid": "^0.3.0", "@nanostores/solid": "^0.3.0",
"@popperjs/core": "^2.11.6", "@popperjs/core": "^2.11.6",
"@solid-devtools/debugger": "^0.14.0", "@solid-devtools/debugger": "^0.15.1",
"@solid-devtools/logger": "^0.5.0", "@solid-devtools/logger": "^0.5.0",
"@solid-primitives/memo": "^1.1.2", "@solid-primitives/memo": "^1.1.2",
"@solid-primitives/storage": "^1.3.3", "@solid-primitives/storage": "^1.3.3",
@ -57,15 +58,15 @@
"@typescript-eslint/parser": "^5.43.0", "@typescript-eslint/parser": "^5.43.0",
"@urql/core": "^3.0.5", "@urql/core": "^3.0.5",
"@urql/devtools": "^2.0.3", "@urql/devtools": "^2.0.3",
"@urql/exchange-auth": "^1.0.0",
"@urql/exchange-graphcache": "^5.0.5", "@urql/exchange-graphcache": "^5.0.5",
"astro": "^1.6.8", "astro": "^1.6.8",
"astro-eslint-parser": "^0.9.0", "astro-eslint-parser": "^0.9.0",
"bcryptjs": "^2.4.3", "bcryptjs": "^2.4.3",
"bootstrap": "5.2.2", "bootstrap": "^5.2.2",
"clsx": "^1.2.1", "clsx": "^1.2.1",
"cookie": "^0.5.0", "cookie": "^0.5.0",
"cookie-signature": "^1.2.0", "cookie-signature": "^1.2.0",
"cross-env": "^7.0.3",
"eslint": "^8.27.0", "eslint": "^8.27.0",
"eslint-config-stylelint": "^17.0.0", "eslint-config-stylelint": "^17.0.0",
"eslint-import-resolver-typescript": "^3.5.2", "eslint-import-resolver-typescript": "^3.5.2",
@ -112,7 +113,7 @@
"prosemirror-view": "^1.29.1", "prosemirror-view": "^1.29.1",
"rollup": "^2.79.1", "rollup": "^2.79.1",
"rollup-plugin-visualizer": "^5.8.3", "rollup-plugin-visualizer": "^5.8.3",
"sass": "^1.56.1", "sass": "1.32.13",
"solid-devtools": "^0.22.0", "solid-devtools": "^0.22.0",
"solid-js": "^1.6.2", "solid-js": "^1.6.2",
"solid-js-form": "^0.1.5", "solid-js-form": "^0.1.5",
@ -133,6 +134,7 @@
"unique-names-generator": "^4.7.1", "unique-names-generator": "^4.7.1",
"uuid": "^9.0.0", "uuid": "^9.0.0",
"vite": "^3.2.4", "vite": "^3.2.4",
"vite-plugin-html-purgecss": "^0.1.1",
"ws": "^8.11.0", "ws": "^8.11.0",
"y-prosemirror": "^1.2.0", "y-prosemirror": "^1.2.0",
"y-protocols": "^1.0.5", "y-protocols": "^1.0.5",

View File

@ -1,7 +1,7 @@
import { Icon } from '../_shared/Icon' import { Icon } from '../_shared/Icon'
import { t } from '../../utils/intl' import { t } from '../../utils/intl'
import styles from '../_shared/Popup.module.scss' import styles from '../_shared/Popup/Popup.module.scss'
import type { PopupProps } from '../_shared/Popup' import type { PopupProps } from '../_shared/Popup'
import { Popup } from '../_shared/Popup' import { Popup } from '../_shared/Popup'

View File

@ -15,9 +15,6 @@
.authorDetails { .authorDetails {
display: flex; display: flex;
flex: 1; flex: 1;
width: max-content;
// padding-right: 1.2rem;
@include media-breakpoint-down(sm) { @include media-breakpoint-down(sm) {
flex-wrap: wrap; flex-wrap: wrap;
@ -193,6 +190,7 @@
.authorSubscribe { .authorSubscribe {
margin-top: 2rem; margin-top: 2rem;
padding-left: 0;
} }
.authorDetails { .authorDetails {

View File

@ -11,6 +11,7 @@ import { clsx } from 'clsx'
import { useSession } from '../../context/session' import { useSession } from '../../context/session'
interface AuthorCardProps { interface AuthorCardProps {
caption?: string
compact?: boolean compact?: boolean
hideDescription?: boolean hideDescription?: boolean
hideFollow?: boolean hideFollow?: boolean
@ -30,7 +31,10 @@ export const AuthorCard = (props: AuthorCardProps) => {
() => session()?.news?.authors?.some((u) => u === props.author.slug) || false () => session()?.news?.authors?.some((u) => u === props.author.slug) || false
) )
const canFollow = createMemo(() => !props.hideFollow && session()?.user?.slug !== props.author.slug) const canFollow = createMemo(() => !props.hideFollow && session()?.user?.slug !== props.author.slug)
const bio = () => props.author.bio || t('Our regular contributor') const bio = createMemo(() => {
return props.caption || props.author.bio || t('Our regular contributor')
})
const name = () => { const name = () => {
return props.author.name === 'Дискурс' && locale() !== 'ru' return props.author.name === 'Дискурс' && locale() !== 'ru'
? 'Discours' ? 'Discours'

View File

@ -1,6 +1,5 @@
.user-details { .user-details {
margin-bottom: 4.4rem; margin-bottom: 4.4rem;
padding: 0;
} }
.author-page { .author-page {

View File

@ -4,12 +4,10 @@ import './Full.scss'
export const AuthorFull = (props: { author: Author }) => { export const AuthorFull = (props: { author: Author }) => {
return ( return (
<div class="container">
<div class="row"> <div class="row">
<div class="col-md-8 offset-md-2 user-details"> <div class="col-md-8 offset-md-2 user-details">
<AuthorCard author={props.author} compact={false} isAuthorPage={true} /> <AuthorCard author={props.author} compact={false} isAuthorPage={true} />
</div> </div>
</div> </div>
</div>
) )
} }

View File

@ -29,13 +29,8 @@
display: flex; display: flex;
flex-direction: column; flex-direction: column;
justify-content: center; justify-content: center;
padding-left: 0;
padding-top: 1em; padding-top: 1em;
@include media-breakpoint-up(sm) {
padding-left: $grid-gutter-width;
}
a { a {
display: inline-block; display: inline-block;
margin: 0 1em 1em 0; margin: 0 1em 1em 0;

View File

@ -6,7 +6,8 @@ import { clsx } from 'clsx'
export default () => { export default () => {
return ( return (
<div class={styles.discoursBanner}> <div class={styles.discoursBanner}>
<div class="wide-container row"> <div class="wide-container">
<div class="row">
<div class={clsx(styles.discoursBannerContent, 'col-lg-5')}> <div class={clsx(styles.discoursBannerContent, 'col-lg-5')}>
<h3>{t('Discours is created with our common effort')}</h3> <h3>{t('Discours is created with our common effort')}</h3>
<p> <p>
@ -22,5 +23,6 @@ export default () => {
</div> </div>
</div> </div>
</div> </div>
</div>
) )
} }

View File

@ -34,12 +34,6 @@
margin-top: 0.8rem; margin-top: 0.8rem;
} }
.wideContainer {
@include media-breakpoint-down(sm) {
padding: 0 $container-padding-x;
}
}
::selection { ::selection {
background: #fff; background: #fff;
color: #000; color: #000;

View File

@ -109,7 +109,7 @@ export const Footer = () => {
] ]
return ( return (
<footer class={styles.discoursFooter}> <footer class={styles.discoursFooter}>
<div class={clsx('wide-container', styles.wideContainer)}> <div class="wide-container">
<div class="row"> <div class="row">
<For each={links()}> <For each={links()}>
{({ header, items }) => ( {({ header, items }) => (

View File

@ -16,10 +16,6 @@
font-weight: inherit; font-weight: inherit;
} }
.wide-container {
padding: 0;
}
::selection { ::selection {
background: #fff; background: #fff;
color: #000; color: #000;

View File

@ -5,7 +5,8 @@ import { showModal } from '../../stores/ui'
export default () => { export default () => {
return ( return (
<div class="about-discours"> <div class="about-discours">
<div class="wide-container row"> <div class="wide-container">
<div class="row">
<div class="col-lg-10 offset-lg-1 col-xl-8 offset-xl-2"> <div class="col-lg-10 offset-lg-1 col-xl-8 offset-xl-2">
<h4>{t('Horizontal collaborative journalistic platform')}</h4> <h4>{t('Horizontal collaborative journalistic platform')}</h4>
<p> <p>
@ -38,5 +39,6 @@ export default () => {
</div> </div>
</div> </div>
</div> </div>
</div>
) )
} }

View File

@ -2,6 +2,10 @@
display: flex; display: flex;
width: 100%; width: 100%;
@include media-breakpoint-down(md) {
margin-bottom: 2.4rem;
}
@include media-breakpoint-between(md, xl) { @include media-breakpoint-between(md, xl) {
flex-direction: column; flex-direction: column;
} }

View File

@ -26,7 +26,8 @@ export const Beside = (props: BesideProps) => {
return ( return (
<Show when={!!props.beside?.slug && props.values?.length > 0}> <Show when={!!props.beside?.slug && props.values?.length > 0}>
<div class="floor floor--9"> <div class="floor floor--9">
<div class="wide-container row"> <div class="wide-container">
<div class="row">
<Show when={!!props.values}> <Show when={!!props.values}>
<div class="col-md-4"> <div class="col-md-4">
<Show when={!!props.title}> <Show when={!!props.title}>
@ -90,6 +91,7 @@ export const Beside = (props: BesideProps) => {
</div> </div>
</div> </div>
</div> </div>
</div>
</Show> </Show>
) )
} }

View File

@ -14,7 +14,8 @@ export default (props: GroupProps) => {
return ( return (
<div class="floor floor--important floor--group"> <div class="floor floor--important floor--group">
<Show when={props.articles.length > 4}> <Show when={props.articles.length > 4}>
<div class="wide-container row"> <div class="wide-container">
<div class="row">
<div class="group__header col-12">{props.header}</div> <div class="group__header col-12">{props.header}</div>
<div class="col-lg-6"> <div class="col-lg-6">
@ -77,6 +78,7 @@ export default (props: GroupProps) => {
</div> </div>
</div> </div>
</div> </div>
</div>
</Show> </Show>
</div> </div>
) )

View File

@ -5,11 +5,13 @@ import { ArticleCard } from './Card'
export const Row1 = (props: { article: Shout }) => ( export const Row1 = (props: { article: Shout }) => (
<Show when={!!props.article}> <Show when={!!props.article}>
<div class="floor floor--one-article"> <div class="floor floor--one-article">
<div class="wide-container row"> <div class="wide-container">
<div class="row">
<div class="col-12"> <div class="col-12">
<ArticleCard article={props.article} settings={{ isSingle: true }} /> <ArticleCard article={props.article} settings={{ isSingle: true }} />
</div> </div>
</div> </div>
</div> </div>
</div>
</Show> </Show>
) )

View File

@ -15,7 +15,8 @@ export const Row2 = (props: { articles: Shout[]; isEqual?: boolean }) => {
return ( return (
<div class="floor"> <div class="floor">
<div class="wide-container row"> <div class="wide-container">
<div class="row">
<For each={props.articles}> <For each={props.articles}>
{(a, i) => { {(a, i) => {
return ( return (
@ -23,7 +24,10 @@ export const Row2 = (props: { articles: Shout[]; isEqual?: boolean }) => {
<div class={`col-md-${props.isEqual ? '6' : x[y()][i()]}`}> <div class={`col-md-${props.isEqual ? '6' : x[y()][i()]}`}>
<ArticleCard <ArticleCard
article={a} article={a}
settings={{ isWithCover: props.isEqual || x[y()][i()] === '8', nodate: props.isEqual }} settings={{
isWithCover: props.isEqual || x[y()][i()] === '8',
nodate: props.isEqual
}}
/> />
</div> </div>
</Show> </Show>
@ -32,5 +36,6 @@ export const Row2 = (props: { articles: Shout[]; isEqual?: boolean }) => {
</For> </For>
</div> </div>
</div> </div>
</div>
) )
} }

View File

@ -6,7 +6,8 @@ import { ArticleCard } from './Card'
export const Row3 = (props: { articles: Shout[]; header?: JSX.Element }) => { export const Row3 = (props: { articles: Shout[]; header?: JSX.Element }) => {
return ( return (
<div class="floor"> <div class="floor">
<div class="wide-container row"> <div class="wide-container">
<div class="row">
<div class="floor-header">{props.header}</div> <div class="floor-header">{props.header}</div>
<For each={props.articles}> <For each={props.articles}>
{(a) => ( {(a) => (
@ -17,5 +18,6 @@ export const Row3 = (props: { articles: Shout[]; header?: JSX.Element }) => {
</For> </For>
</div> </div>
</div> </div>
</div>
) )
} }

View File

@ -4,7 +4,8 @@ import { ArticleCard } from './Card'
export const Row5 = (props: { articles: Shout[] }) => { export const Row5 = (props: { articles: Shout[] }) => {
return ( return (
<div class="floor floor--1"> <div class="floor floor--1">
<div class="wide-container row"> <div class="wide-container">
<div class="row">
<div class="col-md-3"> <div class="col-md-3">
<ArticleCard article={props.articles[0]} /> <ArticleCard article={props.articles[0]} />
<ArticleCard article={props.articles[1]} settings={{ noimage: true, withBorder: true }} /> <ArticleCard article={props.articles[1]} settings={{ noimage: true, withBorder: true }} />
@ -18,5 +19,6 @@ export const Row5 = (props: { articles: Shout[] }) => {
</div> </div>
</div> </div>
</div> </div>
</div>
) )
} }

View File

@ -4,7 +4,8 @@ import { ArticleCard } from './Card'
export default (props: { articles: Shout[] }) => ( export default (props: { articles: Shout[] }) => (
<div class="floor floor--7"> <div class="floor floor--7">
<div class="wide-container row"> <div class="wide-container">
<div class="row">
<For each={props.articles}> <For each={props.articles}>
{(a) => ( {(a) => (
<div class="col-md-6 col-lg-3"> <div class="col-md-6 col-lg-3">
@ -22,4 +23,5 @@ export default (props: { articles: Shout[] }) => (
</For> </For>
</div> </div>
</div> </div>
</div>
) )

View File

@ -61,7 +61,8 @@ export default (props: SliderProps) => {
return ( return (
<div class="floor floor--important"> <div class="floor floor--important">
<div class="wide-container row"> <div class="wide-container">
<div class="row">
<h2 class="col-12">{props.title}</h2> <h2 class="col-12">{props.title}</h2>
<Show when={!!articles()}> <Show when={!!articles()}>
<div class="swiper" classList={{ 'cards-with-cover': isCardsWithCover }} ref={el}> <div class="swiper" classList={{ 'cards-with-cover': isCardsWithCover }} ref={el}>
@ -91,5 +92,6 @@ export default (props: SliderProps) => {
</Show> </Show>
</div> </div>
</div> </div>
</div>
) )
} }

View File

@ -123,7 +123,6 @@ export const RegisterForm = () => {
</Show> </Show>
<div class="pretty-form__item"> <div class="pretty-form__item">
<input <input
id="name"
name="name" name="name"
type="text" type="text"
placeholder={t('Full name')} placeholder={t('Full name')}
@ -140,7 +139,7 @@ export const RegisterForm = () => {
id="email" id="email"
name="email" name="email"
autocomplete="email" autocomplete="email"
type="text" type="email"
value={email()} value={email()}
placeholder={t('Email')} placeholder={t('Email')}
onInput={(event) => handleEmailInput(event.currentTarget.value)} onInput={(event) => handleEmailInput(event.currentTarget.value)}

View File

@ -1,7 +1,7 @@
import { useSession } from '../../context/session' import { useSession } from '../../context/session'
import type { PopupProps } from '../_shared/Popup' import type { PopupProps } from '../_shared/Popup'
import { Popup } from '../_shared/Popup' import { Popup } from '../_shared/Popup'
import styles from '../_shared/Popup.module.scss' import styles from '../_shared/Popup/Popup.module.scss'
type ProfilePopupProps = Omit<PopupProps, 'children'> type ProfilePopupProps = Omit<PopupProps, 'children'>

View File

@ -71,6 +71,7 @@
color: #9fa1a7; color: #9fa1a7;
display: flex; display: flex;
margin-bottom: 1em;
@include media-breakpoint-down(md) { @include media-breakpoint-down(md) {
flex-wrap: wrap; flex-wrap: wrap;

View File

@ -1,7 +1,7 @@
.topicHeader { .topicHeader {
@include font-size(1.7rem); @include font-size(1.7rem);
padding-top: 2.8rem; padding: 2.8rem $container-padding-x 0;
text-align: center; text-align: center;
h1 { h1 {
@ -24,7 +24,8 @@
color: #fff; color: #fff;
cursor: pointer; cursor: pointer;
font-size: 100%; font-size: 100%;
margin: 0 1.2rem; margin: 0 1.2rem 1em;
padding: 0.8rem 1.6rem; padding: 0.8rem 1.6rem;
white-space: nowrap;
} }
} }

View File

@ -18,7 +18,7 @@ export const FullTopic = (props: Props) => {
return ( return (
<div class={styles.topicFull}> <div class={styles.topicFull}>
<Show when={!!props.topic?.slug}> <Show when={!!props.topic?.slug}>
<div class={clsx(styles.topicHeader, 'col-md-8 offset-md-2')}> <div class={clsx(styles.topicHeader, 'col-md-8 col-lg-6 offset-md-2 offset-lg-3')}>
<h1>#{props.topic.title}</h1> <h1>#{props.topic.title}</h1>
<p>{props.topic.body}</p> <p>{props.topic.body}</p>
<div class={clsx(styles.topicActions)}> <div class={clsx(styles.topicActions)}>

View File

@ -1,7 +1,6 @@
import { createEffect, createMemo, createSignal, For, Show } from 'solid-js' import { createEffect, createMemo, createSignal, For, Show } from 'solid-js'
import type { Author } from '../../graphql/types.gen' import type { Author } from '../../graphql/types.gen'
import { AuthorCard } from '../Author/Card' import { AuthorCard } from '../Author/Card'
import { Icon } from '../_shared/Icon'
import { t } from '../../utils/intl' import { t } from '../../utils/intl'
import { useAuthorsStore, setAuthorsSort } from '../../stores/zine/authors' import { useAuthorsStore, setAuthorsSort } from '../../stores/zine/authors'
import { useRouter } from '../../stores/router' import { useRouter } from '../../stores/router'
@ -9,6 +8,9 @@ import styles from '../../styles/AllTopics.module.scss'
import { clsx } from 'clsx' import { clsx } from 'clsx'
import { useSession } from '../../context/session' import { useSession } from '../../context/session'
import { locale } from '../../stores/ui' import { locale } from '../../stores/ui'
import { translit } from '../../utils/ru2en'
import { SearchField } from '../_shared/SearchField'
import { scrollHandler } from '../../utils/scroll'
type AllAuthorsPageSearchParams = { type AllAuthorsPageSearchParams = {
by: '' | 'name' | 'shouts' | 'rating' by: '' | 'name' | 'shouts' | 'rating'
@ -19,6 +21,7 @@ type Props = {
} }
const PAGE_SIZE = 20 const PAGE_SIZE = 20
const ALPHABET = [...'@АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ']
export const AllAuthorsView = (props: Props) => { export const AllAuthorsView = (props: Props) => {
const { sortedAuthors } = useAuthorsStore({ authors: props.authors }) const { sortedAuthors } = useAuthorsStore({ authors: props.authors })
@ -32,12 +35,12 @@ export const AllAuthorsView = (props: Props) => {
const subscribed = (s) => Boolean(session()?.news?.authors && session()?.news?.authors?.includes(s || '')) const subscribed = (s) => Boolean(session()?.news?.authors && session()?.news?.authors?.includes(s || ''))
const { searchParams } = useRouter<AllAuthorsPageSearchParams>() const { searchParams, changeSearchParam } = useRouter<AllAuthorsPageSearchParams>()
const byLetter = createMemo<{ [letter: string]: Author[] }>(() => { const byLetter = createMemo<{ [letter: string]: Author[] }>(() => {
return sortedAuthors().reduce((acc, author) => { return sortedAuthors().reduce((acc, author) => {
let letter = author.name.trim().split(' ').pop().at(0).toUpperCase() let letter = author.name.trim().split(' ').pop().at(0).toUpperCase()
if (!/[А-я]/i.test(letter) && locale() === 'ru') letter = '@' if (!/[А-Я]/i.test(letter) && locale() === 'ru') letter = '@'
if (!acc[letter]) acc[letter] = [] if (!acc[letter]) acc[letter] = []
acc[letter].push(author) acc[letter].push(author)
return acc return acc
@ -51,11 +54,7 @@ export const AllAuthorsView = (props: Props) => {
}) })
const showMore = () => setLimit((oldLimit) => oldLimit + PAGE_SIZE) const showMore = () => setLimit((oldLimit) => oldLimit + PAGE_SIZE)
const AllAuthorsHead = () => (
return (
<div class={clsx(styles.allTopicsPage, 'container')}>
<Show when={sortedAuthors().length > 0}>
<div class="shift-content">
<div class="row"> <div class="row">
<div class={clsx(styles.pageHeader, 'col-lg-10 col-xl-9')}> <div class={clsx(styles.pageHeader, 'col-lg-10 col-xl-9')}>
<h1>{t('Authors')}</h1> <h1>{t('Authors')}</h1>
@ -69,23 +68,120 @@ export const AllAuthorsView = (props: Props) => {
<a href="/authors?by=rating">{t('By rating')}</a> <a href="/authors?by=rating">{t('By rating')}</a>
</li> </li>
<li classList={{ selected: !searchParams().by || searchParams().by === 'name' }}> <li classList={{ selected: !searchParams().by || searchParams().by === 'name' }}>
<a href="/authors">{t('By alphabet')}</a> <a href="/authors?by=name">{t('By name')}</a>
</li> </li>
<li class="view-switcher__search"> <li class="view-switcher__search">
<a href="/authors/search"> <SearchField onChange={searchAuthors} />
<Icon name="search" />
{t('Search author')}
</a>
</li> </li>
</ul> </ul>
</div> </div>
</div> </div>
)
const [searchResults, setSearchResults] = createSignal<Author[]>([])
// eslint-disable-next-line sonarjs/cognitive-complexity
const searchAuthors = (value) => {
/* very stupid search algorithm with no deps */
let q = value.toLowerCase()
if (q.length > 0) {
console.debug(q)
setSearchResults([])
<Show if (locale() === 'ru') q = translit(q, 'ru')
when={!searchParams().by || searchParams().by === 'name'} const aaa: Author[] = []
fallback={() => ( sortedAuthors().forEach((a) => {
<div class={styles.stats}> let flag = false
a.slug.split('-').forEach((w) => {
if (w.startsWith(q)) flag = true
})
if (!flag) {
let wrds: string = a.name.toLowerCase()
if (locale() === 'ru') wrds = translit(wrds, 'ru')
wrds.split(' ').forEach((w: string) => {
if (w.startsWith(q)) flag = true
})
}
if (flag && !aaa.includes(a)) aaa.push(a)
})
setSearchResults((sr: Author[]) => [...sr, ...aaa])
changeSearchParam('by', '')
}
}
return (
<div class={clsx(styles.allTopicsPage, 'wide-container')}>
<Show when={sortedAuthors().length > 0 || searchResults().length > 0}>
<div class="shift-content">
<AllAuthorsHead />
<Show when={searchParams().by === 'name'}>
<div class="row"> <div class="row">
<div class="col-lg-10 col-xl-9">
<ul class={clsx('nodash', styles.alphabet)}>
<For each={ALPHABET}>
{(letter: string, index) => (
<li>
<Show when={letter in byLetter()} fallback={letter}>
<a
href={`/authors?by=name#letter-${index()}`}
onClick={() => scrollHandler(`letter-${index()}`)}
>
{letter}
</a>
</Show>
</li>
)}
</For>
</ul>
</div>
</div>
<For each={sortedKeys()}>
{(letter, index) => (
<div class={clsx(styles.group, 'group')}>
<h2 id={`letter-${index()}`}>{letter}</h2>
<div class="container">
<div class="row">
<div class="col-lg-10">
<div class="row">
<For each={byLetter()[letter]}>
{(author) => (
<div class={clsx(styles.topic, 'topic col-sm-6 col-md-4')}>
<div class="topic-title">
<a href={`/author/${author.slug}`}>{author.name}</a>
<span class={styles.articlesCounter}>{author.stat.shouts}</span>
</div>
</div>
)}
</For>
</div>
</div>
</div>
</div>
</div>
)}
</For>
</Show>
<Show when={searchResults().length > 0}>
<For each={searchResults().slice(0, limit())}>
{(author) => (
<AuthorCard
author={author}
compact={false}
hasLink={true}
subscribed={subscribed(author.slug)}
noSocialButtons={true}
isAuthorsList={true}
truncateBio={true}
/>
)}
</For>
</Show>
<Show when={searchParams().by && searchParams().by !== 'name'}>
<div class={clsx(styles.stats, 'row')}>
<div class="col-lg-10 col-xl-9"> <div class="col-lg-10 col-xl-9">
<For each={sortedAuthors().slice(0, limit())}> <For each={sortedAuthors().slice(0, limit())}>
{(author) => ( {(author) => (
@ -102,6 +198,8 @@ export const AllAuthorsView = (props: Props) => {
</For> </For>
</div> </div>
</div> </div>
</Show>
<Show when={sortedAuthors().length > limit()}> <Show when={sortedAuthors().length > limit()}>
<div class="row"> <div class="row">
<div class={clsx(styles.loadMoreContainer, 'col-12 col-md-10')}> <div class={clsx(styles.loadMoreContainer, 'col-12 col-md-10')}>
@ -112,34 +210,6 @@ export const AllAuthorsView = (props: Props) => {
</div> </div>
</Show> </Show>
</div> </div>
)}
>
<For each={sortedKeys()}>
{(letter) => (
<div class={clsx(styles.group, 'group')}>
<h2>{letter}</h2>
<div class="container">
<div class="row">
<div class="col-lg-10">
<div class="row">
<For each={byLetter()[letter]}>
{(author: Author) => (
<div class={clsx(styles.topic, 'topic col-sm-6 col-md-4')}>
<div class="topic-title">
<a href={`/author/${author.slug}`}>{author.name}</a>
</div>
</div>
)}
</For>
</div>
</div>
</div>
</div>
</div>
)}
</For>
</Show>
</div>
</Show> </Show>
</div> </div>
) )

View File

@ -1,6 +1,5 @@
import { createEffect, createMemo, createSignal, For, Show } from 'solid-js' import { createEffect, createMemo, createSignal, For, Show } from 'solid-js'
import type { Topic } from '../../graphql/types.gen' import type { Topic } from '../../graphql/types.gen'
import { Icon } from '../_shared/Icon'
import { t } from '../../utils/intl' import { t } from '../../utils/intl'
import { setTopicsSort, useTopicsStore } from '../../stores/zine/topics' import { setTopicsSort, useTopicsStore } from '../../stores/zine/topics'
import { useRouter } from '../../stores/router' import { useRouter } from '../../stores/router'
@ -10,6 +9,8 @@ import { useSession } from '../../context/session'
import { locale } from '../../stores/ui' import { locale } from '../../stores/ui'
import { translit } from '../../utils/ru2en' import { translit } from '../../utils/ru2en'
import styles from '../../styles/AllTopics.module.scss' import styles from '../../styles/AllTopics.module.scss'
import { SearchField } from '../_shared/SearchField'
import { scrollHandler } from '../../utils/scroll'
type AllTopicsPageSearchParams = { type AllTopicsPageSearchParams = {
by: 'shouts' | 'authors' | 'title' | '' by: 'shouts' | 'authors' | 'title' | ''
@ -20,6 +21,7 @@ type AllTopicsViewProps = {
} }
const PAGE_SIZE = 20 const PAGE_SIZE = 20
const ALPHABET = [...'#АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ']
export const AllTopicsView = (props: AllTopicsViewProps) => { export const AllTopicsView = (props: AllTopicsViewProps) => {
const { searchParams, changeSearchParam } = useRouter<AllTopicsPageSearchParams>() const { searchParams, changeSearchParam } = useRouter<AllTopicsPageSearchParams>()
@ -56,12 +58,11 @@ export const AllTopicsView = (props: AllTopicsViewProps) => {
const subscribed = (s) => Boolean(session()?.news?.topics && session()?.news?.topics?.includes(s || '')) const subscribed = (s) => Boolean(session()?.news?.topics && session()?.news?.topics?.includes(s || ''))
const showMore = () => setLimit((oldLimit) => oldLimit + PAGE_SIZE) const showMore = () => setLimit((oldLimit) => oldLimit + PAGE_SIZE)
let searchEl: HTMLInputElement
const [searchResults, setSearchResults] = createSignal<Topic[]>([]) const [searchResults, setSearchResults] = createSignal<Topic[]>([])
// eslint-disable-next-line sonarjs/cognitive-complexity // eslint-disable-next-line sonarjs/cognitive-complexity
const searchTopics = () => { const searchTopics = (value) => {
/* very stupid search algorithm with no deps */ /* very stupid search algorithm with no deps */
let q = searchEl.value.toLowerCase() let q = value.toLowerCase()
if (q.length > 0) { if (q.length > 0) {
console.debug(q) console.debug(q)
setSearchResults([]) setSearchResults([])
@ -104,34 +105,46 @@ export const AllTopicsView = (props: AllTopicsViewProps) => {
<a href="/topics?by=authors">{t('By authors')}</a> <a href="/topics?by=authors">{t('By authors')}</a>
</li> </li>
<li classList={{ selected: searchParams().by === 'title' }}> <li classList={{ selected: searchParams().by === 'title' }}>
<a href="/topics?by=title">{t('By alphabet')}</a> <a href="/topics?by=title">{t('By title')}</a>
</li> </li>
<li class="search-switcher"> <li class="view-switcher__search">
<Icon name="search" /> <SearchField onChange={searchTopics} />
<input
class="search-input"
ref={searchEl}
onChange={searchTopics}
onInput={searchTopics}
onFocus={() => (searchEl.innerHTML = '')}
placeholder={t('Search')}
/>
</li> </li>
</ul> </ul>
</div> </div>
</div> </div>
) )
return ( return (
<div class={clsx(styles.allTopicsPage, 'container')}> <div class={clsx(styles.allTopicsPage, 'wide-container')}>
<div class="shift-content">
<AllTopicsHead /> <AllTopicsHead />
<div class="shift-content">
<Show when={sortedTopics().length > 0 || searchResults().length > 0}> <Show when={sortedTopics().length > 0 || searchResults().length > 0}>
<Show when={searchParams().by === 'title'}> <Show when={searchParams().by === 'title'}>
<div class="col-lg-10 col-xl-9">
<ul class={clsx('nodash', styles.alphabet)}>
<For each={ALPHABET}>
{(letter, index) => (
<li>
<Show when={letter in byLetter()} fallback={letter}>
<a
href={`/topics?by=title#letter-${index()}`}
onClick={() => scrollHandler(`letter-${index()}`)}
>
{letter}
</a>
</Show>
</li>
)}
</For>
</ul>
</div>
<For each={sortedKeys()}> <For each={sortedKeys()}>
{(letter) => ( {(letter, index) => (
<div class={clsx(styles.group, 'group')}> <div class={clsx(styles.group, 'group')}>
<h2>{letter}</h2> <h2 id={`letter-${index()}`}>{letter}</h2>
<div class="container"> <div class="container">
<div class="row"> <div class="row">
<div class="col-lg-10"> <div class="col-lg-10">
@ -139,9 +152,8 @@ export const AllTopicsView = (props: AllTopicsViewProps) => {
<For each={byLetter()[letter]}> <For each={byLetter()[letter]}>
{(topic) => ( {(topic) => (
<div class={clsx(styles.topic, 'topic col-sm-6 col-md-4')}> <div class={clsx(styles.topic, 'topic col-sm-6 col-md-4')}>
<div class="topic-title">
<a href={`/topic/${topic.slug}`}>{topic.title}</a> <a href={`/topic/${topic.slug}`}>{topic.title}</a>
</div> <span class={styles.articlesCounter}>{topic.stat.shouts}</span>
</div> </div>
)} )}
</For> </For>
@ -167,20 +179,7 @@ export const AllTopicsView = (props: AllTopicsViewProps) => {
</For> </For>
</Show> </Show>
<Show when={searchParams().by === 'authors'}> <Show when={searchParams().by && searchParams().by !== 'title'}>
<For each={sortedTopics().slice(0, limit())}>
{(topic) => (
<TopicCard
topic={topic}
compact={false}
subscribed={subscribed(topic.slug)}
showPublications={true}
/>
)}
</For>
</Show>
<Show when={searchParams().by === 'shouts'}>
<For each={sortedTopics().slice(0, limit())}> <For each={sortedTopics().slice(0, limit())}>
{(topic) => ( {(topic) => (
<TopicCard <TopicCard
@ -194,13 +193,11 @@ export const AllTopicsView = (props: AllTopicsViewProps) => {
</Show> </Show>
<Show when={sortedTopics().length > limit()}> <Show when={sortedTopics().length > limit()}>
<div class="row"> <div class={clsx(styles.loadMoreContainer, 'col-12 col-md-10 offset-md-1')}>
<div class={clsx(styles.loadMoreContainer, 'col-12 col-md-10')}>
<button class={clsx('button', styles.loadMoreButton)} onClick={showMore}> <button class={clsx('button', styles.loadMoreButton)} onClick={showMore}>
{t('Load more')} {t('Load more')}
</button> </button>
</div> </div>
</div>
</Show> </Show>
</Show> </Show>
</div> </div>

View File

@ -16,14 +16,7 @@ const ARTICLE_COMMENTS_PAGE_SIZE = 50
export const ArticleView = (props: ArticlePageProps) => { export const ArticleView = (props: ArticlePageProps) => {
const [getCommentsPage] = createSignal(1) const [getCommentsPage] = createSignal(1)
const [getIsCommentsLoading, setIsCommentsLoading] = createSignal(false) const [getIsCommentsLoading, setIsCommentsLoading] = createSignal(false)
const { const { reactionsByShout, loadReactionsBy } = useReactionsStore({ reactions: props.reactions })
reactionsByShout,
sortedReactions,
createReaction,
updateReaction,
deleteReaction,
loadReactionsBy
} = useReactionsStore({ reactions: props.reactions })
createEffect(async () => { createEffect(async () => {
try { try {

View File

@ -70,8 +70,9 @@ export const AuthorView = (props: AuthorProps) => {
) )
return ( return (
<div class="container author-page"> <div class="author-page">
<Show when={author()} fallback={<div class="center">{t('Loading')}</div>}> <Show when={author()} fallback={<div class="center">{t('Loading')}</div>}>
<div class="wide-container">
<AuthorFull author={author()} /> <AuthorFull author={author()} />
<div class="row group__controls"> <div class="row group__controls">
<div class="col-md-8"> <div class="col-md-8">
@ -99,11 +100,11 @@ export const AuthorView = (props: AuthorProps) => {
<span class="mode-switcher__control">{t('All posts')}</span> <span class="mode-switcher__control">{t('All posts')}</span>
</div> </div>
</div> </div>
</div>
<h3 class="col-12">{title()}</h3> <h3 class="col-12">{title()}</h3>
</div>
</div>
<div class="row">
<Beside <Beside
title={t('Topics which supported by author')} title={t('Topics which supported by author')}
values={topicsByAuthor()[author().slug].slice(0, 5)} values={topicsByAuthor()[author().slug].slice(0, 5)}
@ -136,7 +137,6 @@ export const AuthorView = (props: AuthorProps) => {
</button> </button>
</p> </p>
</Show> </Show>
</div>
</Show> </Show>
</div> </div>
) )

View File

@ -1,4 +1,4 @@
import { createEffect, createSignal, For, onMount, Show } from 'solid-js' import { createSignal, For, onMount, Show } from 'solid-js'
import '../../styles/Feed.scss' import '../../styles/Feed.scss'
import stylesBeside from '../../components/Feed/Beside.module.scss' import stylesBeside from '../../components/Feed/Beside.module.scss'
import { Icon } from '../_shared/Icon' import { Icon } from '../_shared/Icon'
@ -14,15 +14,14 @@ import { useAuthorsStore } from '../../stores/zine/authors'
import { useTopicsStore } from '../../stores/zine/topics' import { useTopicsStore } from '../../stores/zine/topics'
import { useTopAuthorsStore } from '../../stores/zine/topAuthors' import { useTopAuthorsStore } from '../../stores/zine/topAuthors'
import { useSession } from '../../context/session' import { useSession } from '../../context/session'
import { Collab, ReactionKind, Shout } from '../../graphql/types.gen' import type { Shout } from '../../graphql/types.gen'
import { collabs, setCollabs } from '../../stores/editor'
const AUTHORSHIP_REACTIONS = [ // const AUTHORSHIP_REACTIONS = [
ReactionKind.Accept, // ReactionKind.Accept,
ReactionKind.Reject, // ReactionKind.Reject,
ReactionKind.Propose, // ReactionKind.Propose,
ReactionKind.Ask // ReactionKind.Ask
] // ]
export const FEED_PAGE_SIZE = 20 export const FEED_PAGE_SIZE = 20
@ -57,15 +56,10 @@ export const FeedView = () => {
// load recent editing shouts ( visibility = authors ) // load recent editing shouts ( visibility = authors )
const userslug = session().user.slug const userslug = session().user.slug
await loadShouts({ filters: { author: userslug, visibility: 'authors' }, limit: 15, offset: 0 }) await loadShouts({ filters: { author: userslug, visibility: 'authors' }, limit: 15 })
const collaborativeShouts = sortedArticles().filter((s: Shout, n: number, arr: Shout[]) => { const collaborativeShouts = sortedArticles().filter((shout) => shout.visibility === 'authors')
if (s.visibility !== 'authors') {
arr.splice(n, 1)
return arr
}
})
// load recent reactions on collabs // load recent reactions on collabs
await loadReactionsBy({ by: { shouts: [...collaborativeShouts], body: true }, limit: 5, offset: 0 }) await loadReactionsBy({ by: { shouts: [...collaborativeShouts], body: true }, limit: 5 })
}) })
return ( return (

View File

@ -0,0 +1 @@
export * from './Icon'

View File

@ -1,7 +1,7 @@
import { createEffect, createSignal, JSX, Show } from 'solid-js' import { createEffect, createSignal, JSX, Show } from 'solid-js'
import styles from './Popup.module.scss' import styles from './Popup.module.scss'
import { clsx } from 'clsx' import { clsx } from 'clsx'
import { useOutsideClickHandler } from '../../utils/useOutsideClickHandler' import { useOutsideClickHandler } from '../../../utils/useOutsideClickHandler'
type HorizontalAnchor = 'center' | 'right' type HorizontalAnchor = 'center' | 'right'

View File

@ -0,0 +1 @@
export * from './Popup'

View File

@ -0,0 +1,22 @@
.searchField {
display: flex;
justify-content: flex-end;
input {
border: none;
border-bottom: 1px solid #ccc;
font-family: inherit;
font-size: inherit;
width: 100%;
}
label {
@include media-breakpoint-up(md) {
flex: 1 60%;
}
}
.icon {
width: 2rem;
}
}

View File

@ -0,0 +1,26 @@
import styles from './SearchField.module.scss'
import { Icon } from './Icon'
import { t } from '../../utils/intl'
type SearchFieldProps = {
onChange: (value: string) => void
}
export const SearchField = (props: SearchFieldProps) => {
const handleInputChange = (event) => props.onChange(event.target.value.trim())
return (
<div class={styles.searchField}>
<label for="search-field">
<Icon name="search" class={styles.icon} />
</label>
<input
id="search-field"
type="text"
class="search-input"
onInput={handleInputChange}
placeholder={t('Search')}
/>
</div>
)
}

View File

@ -1,6 +1,7 @@
import { createClient, ClientOptions, dedupExchange, fetchExchange, Exchange } from '@urql/core' import { ClientOptions, dedupExchange, fetchExchange, Exchange, createClient } from '@urql/core'
import { devtoolsExchange } from '@urql/devtools' import { devtoolsExchange } from '@urql/devtools'
import { isDev, apiBaseUrl } from '../utils/config' import { isDev, apiBaseUrl } from '../utils/config'
// import { cache } from './cache'
const TOKEN_LOCAL_STORAGE_KEY = 'token' const TOKEN_LOCAL_STORAGE_KEY = 'token'

View File

@ -1,8 +1,9 @@
import { ClientOptions, dedupExchange, fetchExchange, createClient, Exchange } from '@urql/core' import { ClientOptions, dedupExchange, fetchExchange, Exchange, createClient } from '@urql/core'
import { devtoolsExchange } from '@urql/devtools' import { devtoolsExchange } from '@urql/devtools'
import { isDev, apiBaseUrl } from '../utils/config' import { isDev, apiBaseUrl } from '../utils/config'
// import { cache } from './cache'
const exchanges: Exchange[] = [dedupExchange, fetchExchange] const exchanges: Exchange[] = [dedupExchange, fetchExchange] //, cache]
if (isDev) { if (isDev) {
exchanges.unshift(devtoolsExchange) exchanges.unshift(devtoolsExchange)

View File

@ -11,8 +11,8 @@ export default gql`
links links
lastSeen lastSeen
stat { stat {
shouts
followers followers
followings
} }
} }
} }

View File

@ -8,8 +8,6 @@ export default gql`
body body
slug slug
pic pic
parents
children
# community # community
stat { stat {
_id: shouts _id: shouts

View File

@ -7,8 +7,6 @@ export default gql`
body body
slug slug
pic pic
parents
children
# community # community
stat { stat {
_id: shouts _id: shouts

View File

@ -7,8 +7,6 @@ export default gql`
body body
slug slug
pic pic
parents
children
# community # community
stat { stat {
_id: shouts _id: shouts

View File

@ -8,8 +8,6 @@ export default gql`
body body
slug slug
pic pic
parents
children
# community # community
stat { stat {
_id: shouts _id: shouts

View File

@ -39,6 +39,7 @@ export type AuthorStat = {
followers?: Maybe<Scalars['Int']> followers?: Maybe<Scalars['Int']>
followings?: Maybe<Scalars['Int']> followings?: Maybe<Scalars['Int']>
rating?: Maybe<Scalars['Int']> rating?: Maybe<Scalars['Int']>
shouts?: Maybe<Scalars['Int']>
} }
export type AuthorsBy = { export type AuthorsBy = {

View File

@ -2,26 +2,32 @@
"...subscribing": "...подписываем", "...subscribing": "...подписываем",
"About the project": "О проекте", "About the project": "О проекте",
"All": "Все", "All": "Все",
"All authors": "Все авторы",
"All posts": "Все публикации", "All posts": "Все публикации",
"All topics": "Все темы", "All topics": "Все темы",
"All authors": "Все авторы", "Almost done! Check your email.": "Почти готово! Осталось подтвердить вашу почту.",
"Artworks": "Артворки",
"Audio": "Аудио",
"Authors": "Авторы", "Authors": "Авторы",
"Back to main page": "Вернуться на главную", "Back to main page": "Вернуться на главную",
"Become an author": "Стать автором", "Become an author": "Стать автором",
"Bookmarked": "Сохранено", "Bookmarked": "Сохранено",
"By alphabet": "По алфавиту", "By alphabet": "По алфавиту",
"By authors": "По авторам", "By authors": "По авторам",
"By name": "По имени",
"By rating": "По популярности", "By rating": "По популярности",
"By relevance": "По релевантности", "By relevance": "По релевантности",
"By shouts": "По публикациям", "By shouts": "По публикациям",
"By signing up you agree with our": "Регистрируясь, вы соглашаетесь с", "By signing up you agree with our": "Регистрируясь, вы соглашаетесь с",
"By title": "По названию",
"By updates": "По обновлениям", "By updates": "По обновлениям",
"By views": "По просмотрам", "By views": "По просмотрам",
"Collaborate": "Помочь редактировать", "Collaborate": "Помочь редактировать",
"Comments": "Комментарии", "Comments": "Комментарии",
"Communities": "Сообщества", "Communities": "Сообщества",
"Create account": "Создать аккаунт",
"Copy link": "Скопировать ссылку", "Copy link": "Скопировать ссылку",
"Create account": "Создать аккаунт",
"Create post": "Создать публикацию",
"Delete": "Удалить", "Delete": "Удалить",
"Discours": "Дискурс", "Discours": "Дискурс",
"Discours is an intellectual environment, a web space and tools that allows authors to collaborate with readers and come together to co-create publications and media projects": "Дискурс — это интеллектуальная среда, веб-пространство и инструменты, которые позволяют авторам сотрудничать с читателями и объединяться для совместного создания публикаций и медиапроектов", "Discours is an intellectual environment, a web space and tools that allows authors to collaborate with readers and come together to co-create publications and media projects": "Дискурс — это интеллектуальная среда, веб-пространство и инструменты, которые позволяют авторам сотрудничать с читателями и объединяться для совместного создания публикаций и медиапроектов",
@ -31,6 +37,8 @@
"Dogma": "Догма", "Dogma": "Догма",
"Edit": "Редактировать", "Edit": "Редактировать",
"Email": "Почта", "Email": "Почта",
"Enter": "Войти",
"Enter text": "Введите текст",
"Enter the Discours": "Войти в Дискурс", "Enter the Discours": "Войти в Дискурс",
"Enter the code or click the link from email to confirm": "Введите код из письма или пройдите по ссылке в письме для подтверждения регистрации", "Enter the code or click the link from email to confirm": "Введите код из письма или пройдите по ссылке в письме для подтверждения регистрации",
"Enter your new password": "Введите новый пароль", "Enter your new password": "Введите новый пароль",
@ -44,18 +52,26 @@
"Follow": "Подписаться", "Follow": "Подписаться",
"Follow the topic": "Подписаться на тему", "Follow the topic": "Подписаться на тему",
"Forgot password?": "Забыли пароль?", "Forgot password?": "Забыли пароль?",
"Full name": "Имя и фамилия",
"Get to know the most intelligent people of our time, edit and discuss the articles, share your expertise, rate and decide what to publish in the magazine": "Познакомитесь с выдающимися людьми нашего времени, участвуйте в редактировании и обсуждении статей, выступайте экспертом, оценивайте материалы других авторов со всего мира и определяйте, какие статьи будут опубликованы в журнале", "Get to know the most intelligent people of our time, edit and discuss the articles, share your expertise, rate and decide what to publish in the magazine": "Познакомитесь с выдающимися людьми нашего времени, участвуйте в редактировании и обсуждении статей, выступайте экспертом, оценивайте материалы других авторов со всего мира и определяйте, какие статьи будут опубликованы в журнале",
"Go to main page": "Перейти на главную",
"Help to edit": "Помочь редактировать", "Help to edit": "Помочь редактировать",
"Hooray! Welcome!": "Ура! Добро пожаловать!",
"Horizontal collaborative journalistic platform": "Горизонтальная платформа для коллаборативной журналистики", "Horizontal collaborative journalistic platform": "Горизонтальная платформа для коллаборативной журналистики",
"How it works": "Как это работает", "How it works": "Как это работает",
"How to write an article": "Как написать статью", "How to write an article": "Как написать статью",
"I have an account": "У меня есть аккаунт!", "I have an account": "У меня есть аккаунт!",
"I have no account yet": "У меня еще нет аккаунта", "I have no account yet": "У меня еще нет аккаунта",
"I know the password": "Я знаю пароль", "I know the password": "Я знаю пароль",
"Invalid email": "Проверьте правильность ввода почты",
"Join": "Присоединиться",
"Join our maillist": "Чтобы получать рассылку лучших публикаций, просто укажите свою почту", "Join our maillist": "Чтобы получать рассылку лучших публикаций, просто укажите свою почту",
"Join the community": "Присоединиться к сообществу", "Join the community": "Присоединиться к сообществу",
"Join the global community of authors!": "Присоединятесь к глобальному сообществу авторов со всего мира!", "Join the global community of authors!": "Присоединятесь к глобальному сообществу авторов со всего мира!",
"Just start typing...": "Просто начните печатать...",
"Knowledge base": "База знаний", "Knowledge base": "База знаний",
"Link sent, check your email": "Ссылка отправлена, проверьте почту",
"Literature": "Литература",
"Load more": "Показать ещё", "Load more": "Показать ещё",
"Loading": "Загрузка", "Loading": "Загрузка",
"Manifest": "Манифест", "Manifest": "Манифест",
@ -76,6 +92,11 @@
"Passwords are not equal": "Пароли не совпадают", "Passwords are not equal": "Пароли не совпадают",
"Please check your email address": "Пожалуйста, проверьте введенный адрес почты", "Please check your email address": "Пожалуйста, проверьте введенный адрес почты",
"Please confirm your email to finish": "Подтвердите почту и действие совершится", "Please confirm your email to finish": "Подтвердите почту и действие совершится",
"Please enter a name to sign your comments and publication": "Пожалуйста, введите имя, которое будет отображаться на сайте",
"Please enter email": "Пожалуйста, введите почту",
"Please enter password": "Пожалуйста, введите пароль",
"Please enter password again": "Пожалуйста, введите пароль ещё рез",
"Please, confirm email": "Пожалуйста, подтвердите электронную почту",
"Popular": "Популярное", "Popular": "Популярное",
"Popular authors": "Популярные авторы", "Popular authors": "Популярные авторы",
"Principles": "Принципы сообщества", "Principles": "Принципы сообщества",
@ -86,12 +107,15 @@
"Reply": "Ответить", "Reply": "Ответить",
"Report": "Пожаловаться", "Report": "Пожаловаться",
"Resend code": "Выслать подтверждение", "Resend code": "Выслать подтверждение",
"Restore password": "Восстановить пароль",
"Search": "Поиск", "Search": "Поиск",
"Search author": "Поиск автора", "Search author": "Поиск автора",
"Search topic": "Поиск темы", "Search topic": "Поиск темы",
"Sections": "Разделы", "Sections": "Разделы",
"Send link again": "Прислать ссылку ещё раз",
"Share": "Поделиться", "Share": "Поделиться",
"Show": "Показать", "Show": "Показать",
"Something went wrong, check email and password": "Что-то пошло не так. Проверьте адрес электронной почты и пароль",
"Special projects": "Спецпроекты", "Special projects": "Спецпроекты",
"Subscribe": "Подписаться", "Subscribe": "Подписаться",
"Subscribe what you like to tune your personal feed": "Подпишитесь на интересующие вас темы, чтобы настроить вашу персональную ленту и моментально узнавать о новых публикациях и обсуждениях", "Subscribe what you like to tune your personal feed": "Подпишитесь на интересующие вас темы, чтобы настроить вашу персональную ленту и моментально узнавать о новых публикациях и обсуждениях",
@ -102,6 +126,7 @@
"Support us": "Помочь журналу", "Support us": "Помочь журналу",
"Terms of use": "Правила сайта", "Terms of use": "Правила сайта",
"Thank you": "Благодарности", "Thank you": "Благодарности",
"This email is already taken. If it's you": "Такой email уже зарегистрирован. Если это вы",
"To leave a comment please": "Чтобы оставить комментарий, необходимо", "To leave a comment please": "Чтобы оставить комментарий, необходимо",
"Top authors": "Рейтинг авторов", "Top authors": "Рейтинг авторов",
"Top commented": "Самое комментируемое", "Top commented": "Самое комментируемое",
@ -118,16 +143,21 @@
"Unfollow": "Отписаться", "Unfollow": "Отписаться",
"Unfollow the topic": "Отписаться от темы", "Unfollow the topic": "Отписаться от темы",
"Username": "Имя пользователя", "Username": "Имя пользователя",
"Video": "Видео",
"Views": "Просмотры", "Views": "Просмотры",
"We are convinced that one voice is good, but many is better": "Мы убеждены, один голос хорошо, а много — лучше", "We are convinced that one voice is good, but many is better": "Мы убеждены, один голос хорошо, а много — лучше",
"We can't find you, check email or": "Не можем вас найти, проверьте адрес электронной почты или",
"We create the most amazing stories together": "Самые потрясающиe истории мы создаём вместе", "We create the most amazing stories together": "Самые потрясающиe истории мы создаём вместе",
"We know you, please try to login": "Такой адрес почты уже зарегистрирован, попробуйте залогиниться", "We know you, please try to login": "Такой адрес почты уже зарегистрирован, попробуйте залогиниться",
"We've sent you a message with a link to enter our website.": "Мы выслали вам письмо с ссылкой на почту. Перейдите по ссылке в письме, чтобы войти на сайт.",
"Work with us": "Сотрудничать с Дискурсом", "Work with us": "Сотрудничать с Дискурсом",
"Write": "Написать", "Write": "Написать",
"Write about the topic": "Написать в тему", "Write about the topic": "Написать в тему",
"Write comment": "Написать комментарий", "Write comment": "Написать комментарий",
"Write to us": "Напишите нам", "Write to us": "Напишите нам",
"You are subscribed": "Вы подписаны", "You are subscribed": "Вы подписаны",
"You was successfully authorized": "Вы были успешно авторизованы",
"You've confirmed email": "Вы подтвердили почту",
"You've reached a non-existed page": "Вы попали на несуществующую страницу", "You've reached a non-existed page": "Вы попали на несуществующую страницу",
"actions": "действия", "actions": "действия",
"all topics": "все темы", "all topics": "все темы",
@ -136,46 +166,17 @@
"collections": "коллекции", "collections": "коллекции",
"community": "сообщество", "community": "сообщество",
"email not confirmed": "email не подтвержден", "email not confirmed": "email не подтвержден",
"Enter": "Войти", "enter": "войдите",
"feed": "лента", "feed": "лента",
"follower": "подписчик", "follower": "подписчик",
"invalid password": "некорректный пароль", "invalid password": "некорректный пароль",
"personal data usage and email notifications": "на обработку персональных данных и на получение почтовых уведомлений", "personal data usage and email notifications": "на обработку персональных данных и на получение почтовых уведомлений",
"post": "пост", "post": "пост",
"register": "зарегистрируйтесь",
"sign up or sign in": "зарегистрироваться или войти", "sign up or sign in": "зарегистрироваться или войти",
"terms of use": "правилами пользования сайтом", "terms of use": "правилами пользования сайтом",
"topics": "темы", "topics": "темы",
"user already exist": "пользователь уже существует", "user already exist": "пользователь уже существует",
"view": "просмотр", "view": "просмотр",
"zine": "журнал", "zine": "журнал"
"Please, confirm email": "Пожалуйста, подтвердите электронную почту",
"Something went wrong, check email and password": "Что-то пошло не так. Проверьте адрес электронной почты и пароль",
"You was successfully authorized": "Вы были успешно авторизованы",
"Invalid email": "Проверьте правильность ввода почты",
"Please enter email": "Пожалуйста, введите почту",
"Please enter password": "Пожалуйста, введите пароль",
"Please enter password again": "Пожалуйста, введите пароль ещё рез",
"Join": "Присоединиться",
"Please enter a name to sign your comments and publication": "Пожалуйста, введите имя, которое будет отображаться на сайте",
"Full name": "Имя и фамилия",
"Restore password": "Восстановить пароль",
"Hooray! Welcome!": "Ура! Добро пожаловать!",
"You've confirmed email": "Вы подтвердили почту",
"This email is already taken. If it's you": "Такой email уже зарегистрирован. Если это вы",
"enter": "войдите",
"Go to main page": "Перейти на главную",
"Back to main page": "Вернуться на главную",
"Almost done! Check your email.": "Почти готово! Осталось подтвердить вашу почту.",
"We've sent you a message with a link to enter our website.": "Мы выслали вам письмо с ссылкой на почту. Перейдите по ссылке в письме, чтобы войти на сайт.",
"Send link again": "Прислать ссылку ещё раз",
"Link sent, check your email": "Ссылка отправлена, проверьте почту",
"Create post": "Создать публикацию",
"Just start typing...": "Просто начните печатать...",
"Artworks": "Артворки",
"Audio": "Аудио",
"Video": "Видео",
"Literature": "Литература",
"We can't find you, check email or": "Не можем вас найти, проверьте адрес электронной почты или",
"register": "зарегистрируйтесь",
"Enter text": "Введите текст"
} }

View File

@ -7,7 +7,7 @@ import { PRERENDERED_ARTICLES_COUNT } from '../../../components/Views/Author'
const slug = Astro.params.slug.toString() const slug = Astro.params.slug.toString()
const shouts = await apiClient.getShouts({ filters: { author: slug }, limit: PRERENDERED_ARTICLES_COUNT }) const shouts = await apiClient.getShouts({ filters: { author: slug }, limit: PRERENDERED_ARTICLES_COUNT })
const author = await apiClient.getAuthorsBy({ by: { slug } }) const author = await apiClient.getAuthor({ slug })
const { pathname, search } = Astro.url const { pathname, search } = Astro.url
initRouter(pathname, search) initRouter(pathname, search)

View File

@ -1,4 +1,4 @@
import type { Reaction, Shout } from '../../graphql/types.gen' import type { Reaction } from '../../graphql/types.gen'
import { apiClient } from '../../utils/apiClient' import { apiClient } from '../../utils/apiClient'
import { createSignal } from 'solid-js' import { createSignal } from 'solid-js'
// TODO: import { roomConnect } from '../../utils/p2p' // TODO: import { roomConnect } from '../../utils/p2p'

View File

@ -1,6 +1,7 @@
.allTopicsPage { .allTopicsPage {
.group { .group {
font-weight: bold; @include font-size(1.6rem);
margin: 3em 0 9.6rem; margin: 3em 0 9.6rem;
@include media-breakpoint-down(sm) { @include media-breakpoint-down(sm) {
@ -17,11 +18,7 @@
} }
.topic { .topic {
margin-bottom: 1.6rem; margin-bottom: 2.4rem;
@include media-breakpoint-down(sm) {
margin-left: 2.6rem;
}
} }
} }
@ -52,3 +49,26 @@
} }
} }
} }
.alphabet {
color: rgba(0 0 0 / 20%);
display: flex;
flex-wrap: wrap;
font-weight: 700;
margin: 1.5em -3% 0 0;
@include font-size(1.5rem);
li {
min-width: 1.5em;
margin-right: 3%;
color: gray;
}
}
.articlesCounter {
@include font-size(1.2rem);
margin-left: 0.5em;
vertical-align: super;
}

View File

@ -2,7 +2,7 @@
.groupControls { .groupControls {
align-items: baseline; align-items: baseline;
margin-bottom: 4rem; margin-bottom: 4rem;
margin-top: 7rem; margin-top: 0;
} }
.floorImportant { .floorImportant {

View File

@ -523,6 +523,7 @@ figcaption {
} }
.view-switcher__search { .view-switcher__search {
flex: 1 100%;
text-align: right; text-align: right;
white-space: nowrap; white-space: nowrap;
@ -549,10 +550,6 @@ figcaption {
margin-bottom: 6.4rem; margin-bottom: 6.4rem;
} }
.wide-container {
padding: 0;
}
.container { .container {
padding-left: $container-padding-x; padding-left: $container-padding-x;
padding-right: $container-padding-x; padding-right: $container-padding-x;
@ -616,14 +613,14 @@ figcaption {
} }
} }
.row > * { .row {
@include media-breakpoint-down(sm) { @include media-breakpoint-down(sm) {
padding-left: divide($container-padding-x, 2);
padding-right: divide($container-padding-x, 2);
> .row {
margin-left: divide(-$container-padding-x, 2); margin-left: divide(-$container-padding-x, 2);
margin-right: divide(-$container-padding-x, 2); margin-right: divide(-$container-padding-x, 2);
> * {
padding-left: divide($container-padding-x, 2);
padding-right: divide($container-padding-x, 2);
} }
} }
} }
@ -788,6 +785,7 @@ details {
.text-truncate { .text-truncate {
display: -webkit-box !important; display: -webkit-box !important;
overflow: hidden; overflow: hidden;
position: relative;
-webkit-line-clamp: 2; -webkit-line-clamp: 2;
-webkit-box-orient: vertical; -webkit-box-orient: vertical;
white-space: normal; white-space: normal;

View File

@ -1,6 +1,4 @@
export const isDev = import.meta.env.MODE === 'development' export const isDev = import.meta.env.MODE === 'development'
// export const apiBaseUrl = 'https://v2.discours.io' const defaultApiUrl = 'https://testapi.discours.io'
// export const apiBaseUrl = 'https://newapi.discours.io' export const apiBaseUrl = import.meta.env.PUBLIC_API_URL || defaultApiUrl
// testapi.discours.io
export const apiBaseUrl = 'http://localhost:8080'

View File

@ -14,3 +14,14 @@ export const restoreScrollPosition = () => {
left: scrollPosition.left left: scrollPosition.left
}) })
} }
export const scrollHandler = (elemId) => {
const anchor = document.querySelector('#' + elemId)
// console.debug(elemId)
if (anchor) {
window.scrollTo({
top: anchor.getBoundingClientRect().top - 100,
behavior: 'smooth'
})
}
}

255
yarn.lock
View File

@ -1108,11 +1108,11 @@
tslib "^2.4.0" tslib "^2.4.0"
"@graphql-tools/prisma-loader@^7.2.7": "@graphql-tools/prisma-loader@^7.2.7":
version "7.2.37" version "7.2.39"
resolved "https://registry.yarnpkg.com/@graphql-tools/prisma-loader/-/prisma-loader-7.2.37.tgz#79bbfea8e5f09cd24bd5d9c686e6367af53aafd1" resolved "https://registry.yarnpkg.com/@graphql-tools/prisma-loader/-/prisma-loader-7.2.39.tgz#056c97751fb89787cba30bb2d0cc0ceccce297de"
integrity sha512-6O18hT/LRAUMhWh28MjHzvZB6Ad8SGWhmQlgKlQUJGo8MR2uhk14m/VelZBdsiDcN7F84+leZE9XvCERncqvSQ== integrity sha512-WcLOFFDmLjxcE3Lp0qdX7vD0KkJqAh3af1sVQnpFQLptWLoRHru44AbhECGs3XigICMBKrHO9MV+qtg7FAzhvA==
dependencies: dependencies:
"@graphql-tools/url-loader" "7.16.17" "@graphql-tools/url-loader" "7.16.19"
"@graphql-tools/utils" "9.1.1" "@graphql-tools/utils" "9.1.1"
"@types/js-yaml" "^4.0.0" "@types/js-yaml" "^4.0.0"
"@types/json-stable-stringify" "^1.0.32" "@types/json-stable-stringify" "^1.0.32"
@ -1161,10 +1161,10 @@
tslib "^2.4.0" tslib "^2.4.0"
value-or-promise "1.0.11" value-or-promise "1.0.11"
"@graphql-tools/url-loader@7.16.17", "@graphql-tools/url-loader@^7.13.2", "@graphql-tools/url-loader@^7.16.16", "@graphql-tools/url-loader@^7.9.7": "@graphql-tools/url-loader@7.16.19", "@graphql-tools/url-loader@^7.13.2", "@graphql-tools/url-loader@^7.16.16", "@graphql-tools/url-loader@^7.9.7":
version "7.16.17" version "7.16.19"
resolved "https://registry.yarnpkg.com/@graphql-tools/url-loader/-/url-loader-7.16.17.tgz#73edd2881101f1367ef24a0d5e3593345cb45e62" resolved "https://registry.yarnpkg.com/@graphql-tools/url-loader/-/url-loader-7.16.19.tgz#4e95443bcaf8ec66e72118caa48252180bedf37d"
integrity sha512-foI9ZKG2ILN2Aj308Sx54+QMYCr1MkP5CNpBFzYzrizWq/MbG3rEycIy+Q+BrxF+cU/Ms4hGcT9+0Gy9oi6Fow== integrity sha512-vFHstaANoojDCXUb/a25mTubteTUV8b7XVLHbbSvAQvwGUne6d+Upg5MeGrKBeHl2Wpn240cJnaa4A1mrwivWA==
dependencies: dependencies:
"@ardatan/sync-fetch" "0.0.1" "@ardatan/sync-fetch" "0.0.1"
"@graphql-tools/delegate" "9.0.17" "@graphql-tools/delegate" "9.0.17"
@ -1172,7 +1172,7 @@
"@graphql-tools/executor-http" "0.0.3" "@graphql-tools/executor-http" "0.0.3"
"@graphql-tools/executor-legacy-ws" "0.0.3" "@graphql-tools/executor-legacy-ws" "0.0.3"
"@graphql-tools/utils" "9.1.1" "@graphql-tools/utils" "9.1.1"
"@graphql-tools/wrap" "9.2.14" "@graphql-tools/wrap" "9.2.16"
"@types/ws" "^8.0.0" "@types/ws" "^8.0.0"
"@whatwg-node/fetch" "^0.5.0" "@whatwg-node/fetch" "^0.5.0"
isomorphic-ws "5.0.0" isomorphic-ws "5.0.0"
@ -1201,10 +1201,10 @@
dependencies: dependencies:
tslib "^2.4.0" tslib "^2.4.0"
"@graphql-tools/wrap@9.2.14": "@graphql-tools/wrap@9.2.16":
version "9.2.14" version "9.2.16"
resolved "https://registry.yarnpkg.com/@graphql-tools/wrap/-/wrap-9.2.14.tgz#4d25820496d5d1a218fc901b6b150f1e8a901893" resolved "https://registry.yarnpkg.com/@graphql-tools/wrap/-/wrap-9.2.16.tgz#ec7696101a34cacd1bfefb86ccb631f55651c8fa"
integrity sha512-aAHZpCiYD87GckVK+WAxI6ZTru3D+zxv/EI9TU/wSg6FAgdAPvT/z/oGTDNOPOT0MrYDqVGCIrk0vU4QWiFRJA== integrity sha512-fWTvGytllPq0IVrRcEAc6VuVUInfCEpOUhSAo1ocsSe0HZMoyrQkS1ST0jmCpEWeGWuUd/S2zBLS2yjH8fYfhA==
dependencies: dependencies:
"@graphql-tools/delegate" "9.0.17" "@graphql-tools/delegate" "9.0.17"
"@graphql-tools/schema" "9.0.10" "@graphql-tools/schema" "9.0.10"
@ -1656,27 +1656,44 @@
optionalDependencies: optionalDependencies:
"@solid-devtools/transform" "^0.8.0" "@solid-devtools/transform" "^0.8.0"
"@solid-devtools/logger@^0.5.0": "@solid-devtools/debugger@^0.15.0", "@solid-devtools/debugger@^0.15.1":
version "0.5.0" version "0.15.1"
resolved "https://registry.yarnpkg.com/@solid-devtools/logger/-/logger-0.5.0.tgz#612c5b4849af81840faf3f6e51fe4f7cf95f0c0a" resolved "https://registry.yarnpkg.com/@solid-devtools/debugger/-/debugger-0.15.1.tgz#c98ccf401be9efb2965809de27525e6175ea6d6c"
integrity sha512-xuigrpLs4eqtP9E73dbu8lhXpIWndNzW3NayflFSaEhYf/E0SjyRQWlQfMPMz10uN6NyfDBe82Blum55+cXrpw== integrity sha512-E5vXsdemei9T/k/0X0GyZFvKpHiz73am3o8PmWV6vYhipvwVgPRnBvvHI85IjmtqBKK8gqHVtqu2D2qNu0rN2w==
dependencies: dependencies:
"@solid-devtools/debugger" "^0.14.0" "@solid-devtools/shared" "^0.10.1"
"@solid-devtools/shared" "^0.10.0" "@solid-devtools/transform" "^0.9.0"
"@solid-primitives/utils" "^3.1.0" "@solid-primitives/bounds" "^0.0.105"
"@solid-primitives/cursor" "^0.0.103"
"@solid-primitives/event-bus" "^0.1.3"
"@solid-primitives/event-listener" "^2.2.3"
"@solid-primitives/keyboard" "^1.0.3"
"@solid-primitives/platform" "^0.0.102"
"@solid-primitives/scheduled" "^1.2.0"
"@solid-primitives/utils" "^4.0.0"
type-fest "^3.2.0"
"@solid-devtools/shared@^0.10.0": "@solid-devtools/logger@^0.5.0":
version "0.10.0" version "0.5.1"
resolved "https://registry.yarnpkg.com/@solid-devtools/shared/-/shared-0.10.0.tgz#d925e5fe2778bd37d3d380bddc89566d7b862c29" resolved "https://registry.yarnpkg.com/@solid-devtools/logger/-/logger-0.5.1.tgz#7481f05246a558b680e2fbbaeafd8dc60b9ff949"
integrity sha512-3kCdzGUbiJxOTcWJSqOSpe/lJnysIPg8+PVxnHMRz7GSUxi73+vXQWcuOQDOcf8trzxyQCJcgBd6KN13nj4K/A== integrity sha512-tn1KRLKW0Ho/hhGM/JeiC0NauAvcMLsTgx736ARnSesyJJd8y3YKnVrlH9oN/jeh1F66VVxBmZYW/ubz+rgQhw==
dependencies:
"@solid-devtools/debugger" "^0.15.0"
"@solid-devtools/shared" "^0.10.1"
"@solid-primitives/utils" "^4.0.0"
"@solid-devtools/shared@^0.10.0", "@solid-devtools/shared@^0.10.1":
version "0.10.1"
resolved "https://registry.yarnpkg.com/@solid-devtools/shared/-/shared-0.10.1.tgz#1547665eba540203ddcb7a104a1e3c6a0ec42d31"
integrity sha512-RCa6Ev5ZGdOWIo34bqcZixlaV9tEuVMTxELjuzCg561Lbja2JSp3SwKCpxu9CQrJ21CZpgvu/PxsJ28YEHJ0TA==
dependencies: dependencies:
"@solid-primitives/event-bus" "^0.1.3" "@solid-primitives/event-bus" "^0.1.3"
"@solid-primitives/event-listener" "^2.2.3" "@solid-primitives/event-listener" "^2.2.3"
"@solid-primitives/media" "^2.0.3" "@solid-primitives/media" "^2.0.3"
"@solid-primitives/rootless" "^1.2.0" "@solid-primitives/rootless" "^1.2.0"
"@solid-primitives/scheduled" "^1.1.0" "@solid-primitives/scheduled" "^1.1.0"
"@solid-primitives/styles" "^0.0.100" "@solid-primitives/styles" "^0.0.101"
"@solid-primitives/utils" "^3.1.0" "@solid-primitives/utils" "^4.0.0"
type-fest "^3.2.0" type-fest "^3.2.0"
"@solid-devtools/transform@^0.8.0": "@solid-devtools/transform@^0.8.0":
@ -1689,6 +1706,16 @@
"@babel/types" "^7.19.4" "@babel/types" "^7.19.4"
"@solid-devtools/shared" "^0.10.0" "@solid-devtools/shared" "^0.10.0"
"@solid-devtools/transform@^0.9.0":
version "0.9.0"
resolved "https://registry.yarnpkg.com/@solid-devtools/transform/-/transform-0.9.0.tgz#d1bf14184786c487c3301b542d372fd82fc90ed6"
integrity sha512-68Fz80+lkUNTfePvjiv0jC02cPGsZTYl06F2N8Y2DxnujAGYEJbg5mpdC805Q5ykIWMDcibUP3vdGYmNq1JL9w==
dependencies:
"@babel/core" "^7.19.6"
"@babel/plugin-syntax-typescript" "^7.18.6"
"@babel/types" "^7.19.4"
"@solid-devtools/shared" "^0.10.1"
"@solid-primitives/bounds@^0.0.104": "@solid-primitives/bounds@^0.0.104":
version "0.0.104" version "0.0.104"
resolved "https://registry.yarnpkg.com/@solid-primitives/bounds/-/bounds-0.0.104.tgz#fa83e4bdb0966e915abfea1820cabd2da8856298" resolved "https://registry.yarnpkg.com/@solid-primitives/bounds/-/bounds-0.0.104.tgz#fa83e4bdb0966e915abfea1820cabd2da8856298"
@ -1698,6 +1725,15 @@
"@solid-primitives/resize-observer" "^2.0.5" "@solid-primitives/resize-observer" "^2.0.5"
"@solid-primitives/utils" "^3.1.0" "@solid-primitives/utils" "^3.1.0"
"@solid-primitives/bounds@^0.0.105":
version "0.0.105"
resolved "https://registry.yarnpkg.com/@solid-primitives/bounds/-/bounds-0.0.105.tgz#5f8330b2b5b86c724d05d3e895da29c1149c347a"
integrity sha512-a2ZRuZayXV1/kSKx8cEOR5pIs2zKAF9lS3Gj/r7uHmBQBmn25GYCYOwj4LbLQbqqbumZr2eJO+/wDyi4UOX5pw==
dependencies:
"@solid-primitives/event-listener" "^2.2.4"
"@solid-primitives/resize-observer" "^2.0.6"
"@solid-primitives/utils" "^4.0.0"
"@solid-primitives/cursor@^0.0.101": "@solid-primitives/cursor@^0.0.101":
version "0.0.101" version "0.0.101"
resolved "https://registry.yarnpkg.com/@solid-primitives/cursor/-/cursor-0.0.101.tgz#06945f518cd0de747a87a49eeb7b074b7d6a127b" resolved "https://registry.yarnpkg.com/@solid-primitives/cursor/-/cursor-0.0.101.tgz#06945f518cd0de747a87a49eeb7b074b7d6a127b"
@ -1705,6 +1741,13 @@
dependencies: dependencies:
"@solid-primitives/utils" "^3.1.0" "@solid-primitives/utils" "^3.1.0"
"@solid-primitives/cursor@^0.0.103":
version "0.0.103"
resolved "https://registry.yarnpkg.com/@solid-primitives/cursor/-/cursor-0.0.103.tgz#d127b069b0e62e2c33f912f382bd47f1deea6725"
integrity sha512-bb5x5lCimBf7R2VqrrMVcP2y/aGTMjNj7fjvY+RvTAC3/WtG/odqeYwka4lCBV27pX9TiJCKtNS6mVTigdfLMA==
dependencies:
"@solid-primitives/utils" "^4.0.0"
"@solid-primitives/event-bus@^0.1.3": "@solid-primitives/event-bus@^0.1.3":
version "0.1.4" version "0.1.4"
resolved "https://registry.yarnpkg.com/@solid-primitives/event-bus/-/event-bus-0.1.4.tgz#1f3186e8d51386c433d94c006daecc04a5c49f5b" resolved "https://registry.yarnpkg.com/@solid-primitives/event-bus/-/event-bus-0.1.4.tgz#1f3186e8d51386c433d94c006daecc04a5c49f5b"
@ -1765,7 +1808,7 @@
resolved "https://registry.yarnpkg.com/@solid-primitives/platform/-/platform-0.0.102.tgz#cd4aa3e209f6b1671656396ef0d890802a17ef5f" resolved "https://registry.yarnpkg.com/@solid-primitives/platform/-/platform-0.0.102.tgz#cd4aa3e209f6b1671656396ef0d890802a17ef5f"
integrity sha512-1eZA1/HYOhmlZ9LrrGot+LUi/ypO2NXqfB+9F1WY98dGNDMz9pG9k+X7kg2YDJTUHDGbzY7WrsBRyAE8LurE7Q== integrity sha512-1eZA1/HYOhmlZ9LrrGot+LUi/ypO2NXqfB+9F1WY98dGNDMz9pG9k+X7kg2YDJTUHDGbzY7WrsBRyAE8LurE7Q==
"@solid-primitives/resize-observer@^2.0.5": "@solid-primitives/resize-observer@^2.0.5", "@solid-primitives/resize-observer@^2.0.6":
version "2.0.7" version "2.0.7"
resolved "https://registry.yarnpkg.com/@solid-primitives/resize-observer/-/resize-observer-2.0.7.tgz#0f909ed58d5fd7ec59b2fee15ddafdd28fdce4c8" resolved "https://registry.yarnpkg.com/@solid-primitives/resize-observer/-/resize-observer-2.0.7.tgz#0f909ed58d5fd7ec59b2fee15ddafdd28fdce4c8"
integrity sha512-/RtCTs61ACdsCKJodNTgnKA05CI09dkg7usAb5jg14L6mzwTNWWdZbXtbYsUlD+kh1/1j+BKxp6VtkbpgJE5yQ== integrity sha512-/RtCTs61ACdsCKJodNTgnKA05CI09dkg7usAb5jg14L6mzwTNWWdZbXtbYsUlD+kh1/1j+BKxp6VtkbpgJE5yQ==
@ -1774,7 +1817,7 @@
"@solid-primitives/rootless" "^1.2.1" "@solid-primitives/rootless" "^1.2.1"
"@solid-primitives/utils" "^4.0.0" "@solid-primitives/utils" "^4.0.0"
"@solid-primitives/rootless@^1.1.3", "@solid-primitives/rootless@^1.2.0", "@solid-primitives/rootless@^1.2.1": "@solid-primitives/rootless@^1.2.0", "@solid-primitives/rootless@^1.2.1":
version "1.2.1" version "1.2.1"
resolved "https://registry.yarnpkg.com/@solid-primitives/rootless/-/rootless-1.2.1.tgz#17d3a7428ebc3d2c7fbf2ec96093edad3b7ad217" resolved "https://registry.yarnpkg.com/@solid-primitives/rootless/-/rootless-1.2.1.tgz#17d3a7428ebc3d2c7fbf2ec96093edad3b7ad217"
integrity sha512-8RpdyS1e58PQbDjgjpyCh+IGoX3QEs/2LauMfl94eXJ5d/o1y/c6P61z9XqQm+Bx1Otdgx4nbFCoF7HPqa0mwg== integrity sha512-8RpdyS1e58PQbDjgjpyCh+IGoX3QEs/2LauMfl94eXJ5d/o1y/c6P61z9XqQm+Bx1Otdgx4nbFCoF7HPqa0mwg==
@ -1796,12 +1839,12 @@
resolved "https://registry.yarnpkg.com/@solid-primitives/storage/-/storage-1.3.3.tgz#22b5a4e70497aa9ae06cb2f579582d389a65e625" resolved "https://registry.yarnpkg.com/@solid-primitives/storage/-/storage-1.3.3.tgz#22b5a4e70497aa9ae06cb2f579582d389a65e625"
integrity sha512-xauu5jMgZMALB9UAzPUHm0Tnkt0JvtX+37UEP6fVJUOcS9WvnsZqUnZTJaRI69sO3jSCFUBKfQk4aRquGIO+ig== integrity sha512-xauu5jMgZMALB9UAzPUHm0Tnkt0JvtX+37UEP6fVJUOcS9WvnsZqUnZTJaRI69sO3jSCFUBKfQk4aRquGIO+ig==
"@solid-primitives/styles@^0.0.100": "@solid-primitives/styles@^0.0.101":
version "0.0.100" version "0.0.101"
resolved "https://registry.yarnpkg.com/@solid-primitives/styles/-/styles-0.0.100.tgz#142d52c2ade553c71cbe5008469d6987dcc5e8eb" resolved "https://registry.yarnpkg.com/@solid-primitives/styles/-/styles-0.0.101.tgz#63220a1d7a40034913f27c155e383f7fdac3d6ee"
integrity sha512-9OPLQX3dbi26ur0f/VayIvW8FZ+wMMxRYLj6xnxtgUayVX8ZqmPqRBsBSBDWEL4C0YihEhAsYYUzXhiL76jiWw== integrity sha512-tHkeUMntlS/w+/zDzXJv82hhMy3J3q7tVV3ZTbahRo0hZienAM8ZJrCYZNK/fu2px8NHVSZFRufxv9qhIclPTw==
dependencies: dependencies:
"@solid-primitives/rootless" "^1.1.3" "@solid-primitives/rootless" "^1.2.0"
"@solid-primitives/utils@^3.1.0": "@solid-primitives/utils@^3.1.0":
version "3.1.0" version "3.1.0"
@ -2220,7 +2263,7 @@
"@typescript-eslint/types" "5.43.0" "@typescript-eslint/types" "5.43.0"
eslint-visitor-keys "^3.3.0" eslint-visitor-keys "^3.3.0"
"@urql/core@>=3.0.0", "@urql/core@>=3.0.5", "@urql/core@^3.0.5": "@urql/core@>=3.0.5", "@urql/core@^3.0.5":
version "3.0.5" version "3.0.5"
resolved "https://registry.yarnpkg.com/@urql/core/-/core-3.0.5.tgz#a26c326dd788d6d6abb839493bce86147f5a45c9" resolved "https://registry.yarnpkg.com/@urql/core/-/core-3.0.5.tgz#a26c326dd788d6d6abb839493bce86147f5a45c9"
integrity sha512-6/1HG+WEAcPs+hXSFnxWBTWkNUwa8dj2cHysWokMaFIbAioGtUaSdxp2q9FDMtWAIGdc640NFSt2B8itGLdoAA== integrity sha512-6/1HG+WEAcPs+hXSFnxWBTWkNUwa8dj2cHysWokMaFIbAioGtUaSdxp2q9FDMtWAIGdc640NFSt2B8itGLdoAA==
@ -2235,14 +2278,6 @@
dependencies: dependencies:
wonka ">= 4.0.9" wonka ">= 4.0.9"
"@urql/exchange-auth@^1.0.0":
version "1.0.0"
resolved "https://registry.yarnpkg.com/@urql/exchange-auth/-/exchange-auth-1.0.0.tgz#cf846189632662330b616704387b1cf762561638"
integrity sha512-79hqPQab+ifeINOxvQykvqub4ixWHBEIagN4U67ijcHGMfp3c4yEWRk4IJMPwF+OMT7LrRFuv+jRIZTQn/9VwQ==
dependencies:
"@urql/core" ">=3.0.0"
wonka "^6.0.0"
"@urql/exchange-graphcache@^5.0.5": "@urql/exchange-graphcache@^5.0.5":
version "5.0.5" version "5.0.5"
resolved "https://registry.yarnpkg.com/@urql/exchange-graphcache/-/exchange-graphcache-5.0.5.tgz#187a4077b4a0e2c91c5a06eaf8f03231605f7397" resolved "https://registry.yarnpkg.com/@urql/exchange-graphcache/-/exchange-graphcache-5.0.5.tgz#187a4077b4a0e2c91c5a06eaf8f03231605f7397"
@ -2580,9 +2615,9 @@ astro-eslint-parser@^0.9.0:
espree "^9.0.0" espree "^9.0.0"
astro@^1.6.8: astro@^1.6.8:
version "1.6.9" version "1.6.10"
resolved "https://registry.yarnpkg.com/astro/-/astro-1.6.9.tgz#08d7aed72168f8f45fc46e3ac47dd1a8ac0e2bbc" resolved "https://registry.yarnpkg.com/astro/-/astro-1.6.10.tgz#8d9877b49e6f2b0ee64503bcc759d73a992b05bf"
integrity sha512-KXFKXobe8MIYl4gduUPLcAazMz+thox6N1pOv3F3QMbJS5rMRXkWloVK/6XebBO7p3DYkOfOGB4qA9ijTc4ftA== integrity sha512-W/ZGROkCKsDicpiXB82n8EkY6I0/12wdXS80NGaBdIUR1jZZxdN+0YMmdz+C2kYbjlo45KUsXpC/Tej+5KQYSQ==
dependencies: dependencies:
"@astrojs/compiler" "^0.29.15" "@astrojs/compiler" "^0.29.15"
"@astrojs/language-server" "^0.28.3" "@astrojs/language-server" "^0.28.3"
@ -2876,7 +2911,7 @@ boolean@^3.0.1:
resolved "https://registry.yarnpkg.com/boolean/-/boolean-3.2.0.tgz#9e5294af4e98314494cbb17979fa54ca159f116b" resolved "https://registry.yarnpkg.com/boolean/-/boolean-3.2.0.tgz#9e5294af4e98314494cbb17979fa54ca159f116b"
integrity sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw== integrity sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw==
bootstrap@5.2.2: bootstrap@^5.2.2:
version "5.2.2" version "5.2.2"
resolved "https://registry.yarnpkg.com/bootstrap/-/bootstrap-5.2.2.tgz#834e053eed584a65e244d8aa112a6959f56e27a0" resolved "https://registry.yarnpkg.com/bootstrap/-/bootstrap-5.2.2.tgz#834e053eed584a65e244d8aa112a6959f56e27a0"
integrity sha512-dEtzMTV71n6Fhmbg4fYJzQsw1N29hJKO1js5ackCgIpDcGid2ETMGC6zwSYw09v05Y+oRdQ9loC54zB1La3hHQ== integrity sha512-dEtzMTV71n6Fhmbg4fYJzQsw1N29hJKO1js5ackCgIpDcGid2ETMGC6zwSYw09v05Y+oRdQ9loC54zB1La3hHQ==
@ -3297,6 +3332,11 @@ comma-separated-tokens@^2.0.0:
resolved "https://registry.yarnpkg.com/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz#4e89c9458acb61bc8fef19f4529973b2392839ee" resolved "https://registry.yarnpkg.com/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz#4e89c9458acb61bc8fef19f4529973b2392839ee"
integrity sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg== integrity sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==
commander@^8.0.0:
version "8.3.0"
resolved "https://registry.yarnpkg.com/commander/-/commander-8.3.0.tgz#4837ea1b2da67b9c616a67afbb0fafee567bca66"
integrity sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==
commander@^9.3.0: commander@^9.3.0:
version "9.4.1" version "9.4.1"
resolved "https://registry.yarnpkg.com/commander/-/commander-9.4.1.tgz#d1dd8f2ce6faf93147295c0df13c7c21141cfbdd" resolved "https://registry.yarnpkg.com/commander/-/commander-9.4.1.tgz#d1dd8f2ce6faf93147295c0df13c7c21141cfbdd"
@ -3410,6 +3450,13 @@ crelt@^1.0.0:
resolved "https://registry.yarnpkg.com/crelt/-/crelt-1.0.5.tgz#57c0d52af8c859e354bace1883eb2e1eb182bb94" resolved "https://registry.yarnpkg.com/crelt/-/crelt-1.0.5.tgz#57c0d52af8c859e354bace1883eb2e1eb182bb94"
integrity sha512-+BO9wPPi+DWTDcNYhr/W90myha8ptzftZT+LwcmUbbok0rcP/fequmFYCw8NMoH7pkAZQzU78b3kYrlua5a9eA== integrity sha512-+BO9wPPi+DWTDcNYhr/W90myha8ptzftZT+LwcmUbbok0rcP/fequmFYCw8NMoH7pkAZQzU78b3kYrlua5a9eA==
cross-env@^7.0.3:
version "7.0.3"
resolved "https://registry.yarnpkg.com/cross-env/-/cross-env-7.0.3.tgz#865264b29677dc015ba8418918965dd232fc54cf"
integrity sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==
dependencies:
cross-spawn "^7.0.1"
cross-fetch@^3.1.5: cross-fetch@^3.1.5:
version "3.1.5" version "3.1.5"
resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-3.1.5.tgz#e1389f44d9e7ba767907f7af8454787952ab534f" resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-3.1.5.tgz#e1389f44d9e7ba767907f7af8454787952ab534f"
@ -3417,7 +3464,7 @@ cross-fetch@^3.1.5:
dependencies: dependencies:
node-fetch "2.6.7" node-fetch "2.6.7"
cross-spawn@^7.0.2, cross-spawn@^7.0.3: cross-spawn@^7.0.1, cross-spawn@^7.0.2, cross-spawn@^7.0.3:
version "7.0.3" version "7.0.3"
resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6"
integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==
@ -3989,7 +4036,7 @@ esbuild-windows-arm64@0.15.14:
resolved "https://registry.yarnpkg.com/esbuild-windows-arm64/-/esbuild-windows-arm64-0.15.14.tgz#8eb50ab9a0ecaf058593fbad17502749306f801d" resolved "https://registry.yarnpkg.com/esbuild-windows-arm64/-/esbuild-windows-arm64-0.15.14.tgz#8eb50ab9a0ecaf058593fbad17502749306f801d"
integrity sha512-KW9W4psdZceaS9A7Jsgl4WialOznSURvqX/oHZk3gOP7KbjtHLSsnmSvNdzagGJfxbAe30UVGXRe8q8nDsOSQw== integrity sha512-KW9W4psdZceaS9A7Jsgl4WialOznSURvqX/oHZk3gOP7KbjtHLSsnmSvNdzagGJfxbAe30UVGXRe8q8nDsOSQw==
esbuild@^0.14.0, esbuild@^0.14.43: esbuild@^0.14.0, esbuild@^0.14.27, esbuild@^0.14.43:
version "0.14.54" version "0.14.54"
resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.14.54.tgz#8b44dcf2b0f1a66fc22459943dccf477535e9aa2" resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.14.54.tgz#8b44dcf2b0f1a66fc22459943dccf477535e9aa2"
integrity sha512-Cy9llcy8DvET5uznocPyqL3BFRrFXSVqbgpMJ9Wz8oVjZlh/zUSNbPRbov0VX7VxN2JH1Oa0uNxZ7eLRb62pJA== integrity sha512-Cy9llcy8DvET5uznocPyqL3BFRrFXSVqbgpMJ9Wz8oVjZlh/zUSNbPRbov0VX7VxN2JH1Oa0uNxZ7eLRb62pJA==
@ -4291,9 +4338,9 @@ eslint-visitor-keys@^3.0.0, eslint-visitor-keys@^3.1.0, eslint-visitor-keys@^3.3
integrity sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA== integrity sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==
eslint@^8.27.0, eslint@^8.7.0: eslint@^8.27.0, eslint@^8.7.0:
version "8.27.0" version "8.28.0"
resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.27.0.tgz#d547e2f7239994ad1faa4bb5d84e5d809db7cf64" resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.28.0.tgz#81a680732634677cc890134bcdd9fdfea8e63d6e"
integrity sha512-0y1bfG2ho7mty+SiILVf9PfuRA49ek4Nc60Wmmu62QlobNR+CeXa4xXIJgcuwSQgZiWaPH+5BDsctpIW0PR/wQ== integrity sha512-S27Di+EVyMxcHiwDrFzk8dJYAaD+/5SoWKxL1ri/71CRHsnJnRDPNt2Kzj24+MT9FDupf4aqqyqPrvI8MvQ4VQ==
dependencies: dependencies:
"@eslint/eslintrc" "^1.3.3" "@eslint/eslintrc" "^1.3.3"
"@humanwhocodes/config-array" "^0.11.6" "@humanwhocodes/config-array" "^0.11.6"
@ -4800,7 +4847,7 @@ glob-parent@^6.0.2:
dependencies: dependencies:
is-glob "^4.0.3" is-glob "^4.0.3"
glob@^7.1.1, glob@^7.1.3, glob@^7.1.4: glob@^7.1.1, glob@^7.1.3, glob@^7.1.4, glob@^7.1.7:
version "7.2.3" version "7.2.3"
resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b"
integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==
@ -4846,9 +4893,9 @@ globals@^11.1.0:
integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==
globals@^13.15.0: globals@^13.15.0:
version "13.17.0" version "13.18.0"
resolved "https://registry.yarnpkg.com/globals/-/globals-13.17.0.tgz#902eb1e680a41da93945adbdcb5a9f361ba69bd4" resolved "https://registry.yarnpkg.com/globals/-/globals-13.18.0.tgz#fb224daeeb2bb7d254cd2c640f003528b8d0c1dc"
integrity sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw== integrity sha512-/mR4KI8Ps2spmoc0Ulu9L7agOF0du1CZNQ3dke8yItYlyKNmGrkONemBbd6V8UTc1Wgcqn21t3WYB7dbRmh6/A==
dependencies: dependencies:
type-fest "^0.20.2" type-fest "^0.20.2"
@ -5279,11 +5326,6 @@ ignore@^5.1.1, ignore@^5.2.0:
resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.0.tgz#6d3bac8fa7fe0d45d9f9be7bac2fc279577e345a" resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.0.tgz#6d3bac8fa7fe0d45d9f9be7bac2fc279577e345a"
integrity sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ== integrity sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==
immutable@^4.0.0:
version "4.1.0"
resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.1.0.tgz#f795787f0db780183307b9eb2091fcac1f6fafef"
integrity sha512-oNkuqVTA8jqG1Q6c+UglTOD1xhC1BtjKI7XkCXRkZHrN5m18/XsnUp8Q89GkQO/z+0WjonSvl0FLhDYftp46nQ==
immutable@~3.7.6: immutable@~3.7.6:
version "3.7.6" version "3.7.6"
resolved "https://registry.yarnpkg.com/immutable/-/immutable-3.7.6.tgz#13b4d3cb12befa15482a26fe1b2ebae640071e4b" resolved "https://registry.yarnpkg.com/immutable/-/immutable-3.7.6.tgz#13b4d3cb12befa15482a26fe1b2ebae640071e4b"
@ -6531,9 +6573,9 @@ magic-string@^0.25.9:
sourcemap-codec "^1.4.8" sourcemap-codec "^1.4.8"
mailgun.js@^8.0.2: mailgun.js@^8.0.2:
version "8.0.4" version "8.0.6"
resolved "https://registry.yarnpkg.com/mailgun.js/-/mailgun.js-8.0.4.tgz#cb0ff2c8119f23cff70f52346550453f698b9bbc" resolved "https://registry.yarnpkg.com/mailgun.js/-/mailgun.js-8.0.6.tgz#56a4e208bab5cfe0476f413cdf271c905ff34d8c"
integrity sha512-9XbXz0TMOFFwdm/8mTtAf6EXAKITREJp/yKVUq9vHfBx9a4U9sebj0Q4E8XDWJ4PRuEIlsM6Rv+OafSVVAvzNg== integrity sha512-b+c7QO1T4oFsudEcRB2H7oZKth8ZDeYRW4xjW12QQVNYDSJCVxqSQfps6ofcH8fqcCMJdzc76HVNGdnUZgBPCw==
dependencies: dependencies:
axios "^0.27.2" axios "^0.27.2"
base-64 "^1.0.0" base-64 "^1.0.0"
@ -7801,9 +7843,9 @@ postcss-scss@^4.0.2:
integrity sha512-F7xpB6TrXyqUh3GKdyB4Gkp3QL3DDW1+uI+gxx/oJnUt/qXI4trj5OGlp9rOKdoABGULuqtqeG+3HEVQk4DjmA== integrity sha512-F7xpB6TrXyqUh3GKdyB4Gkp3QL3DDW1+uI+gxx/oJnUt/qXI4trj5OGlp9rOKdoABGULuqtqeG+3HEVQk4DjmA==
postcss-selector-parser@^6.0.10, postcss-selector-parser@^6.0.2, postcss-selector-parser@^6.0.4, postcss-selector-parser@^6.0.6: postcss-selector-parser@^6.0.10, postcss-selector-parser@^6.0.2, postcss-selector-parser@^6.0.4, postcss-selector-parser@^6.0.6:
version "6.0.10" version "6.0.11"
resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz#79b61e2c0d1bfc2602d549e11d0876256f8df88d" resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.11.tgz#2e41dc39b7ad74046e1615185185cd0b17d0c8dc"
integrity sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w== integrity sha512-zbARubNdogI9j7WY4nQJBiNqQf3sLS3wCP4WfOidu+p28LofJqDH1tcXypGrcmMHhDk2t9wGhCsYe/+szLTy1g==
dependencies: dependencies:
cssesc "^3.0.0" cssesc "^3.0.0"
util-deprecate "^1.0.2" util-deprecate "^1.0.2"
@ -7818,7 +7860,7 @@ postcss-value-parser@^4.1.0, postcss-value-parser@^4.2.0:
resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514" resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514"
integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==
postcss@^8.3.11, postcss@^8.4.14, postcss@^8.4.18, postcss@^8.4.19: postcss@^8.3.11, postcss@^8.3.5, postcss@^8.4.13, postcss@^8.4.14, postcss@^8.4.18, postcss@^8.4.19:
version "8.4.19" version "8.4.19"
resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.19.tgz#61178e2add236b17351897c8bcc0b4c8ecab56fc" resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.19.tgz#61178e2add236b17351897c8bcc0b4c8ecab56fc"
integrity sha512-h+pbPsyhlYj6N2ozBmHhHrs9DzGmbaarbLvWipMRO7RLS+v4onj26MPFXA5OBYFxyqYhUJK456SwDcY9H2/zsA== integrity sha512-h+pbPsyhlYj6N2ozBmHhHrs9DzGmbaarbLvWipMRO7RLS+v4onj26MPFXA5OBYFxyqYhUJK456SwDcY9H2/zsA==
@ -7920,9 +7962,9 @@ property-expr@^2.0.4:
integrity sha512-IJUkICM5dP5znhCckHSv30Q4b5/JA5enCtkRHYaOVOAocnH/1BQEYTC5NMfT3AVl/iXKdr3aqQbQn9DxyWknwA== integrity sha512-IJUkICM5dP5znhCckHSv30Q4b5/JA5enCtkRHYaOVOAocnH/1BQEYTC5NMfT3AVl/iXKdr3aqQbQn9DxyWknwA==
property-information@^6.0.0: property-information@^6.0.0:
version "6.1.1" version "6.2.0"
resolved "https://registry.yarnpkg.com/property-information/-/property-information-6.1.1.tgz#5ca85510a3019726cb9afed4197b7b8ac5926a22" resolved "https://registry.yarnpkg.com/property-information/-/property-information-6.2.0.tgz#b74f522c31c097b5149e3c3cb8d7f3defd986a1d"
integrity sha512-hrzC564QIl0r0vy4l6MvRLhafmUowhO/O3KgVSoXIbbA2Sz4j8HGpJc6T2cubRVwMwpdiG/vKGfhT4IixmKN9w== integrity sha512-kma4U7AFCTwpqq5twzC1YVIDXSqg6qQK6JN0smOw8fgRy1OkMi0CYSzFmsy6dnqSenamAtj0CyXMUJ1Mf6oROg==
prosemirror-commands@^1.0.0, prosemirror-commands@^1.3.1: prosemirror-commands@^1.0.0, prosemirror-commands@^1.3.1:
version "1.3.1" version "1.3.1"
@ -8011,9 +8053,9 @@ prosemirror-menu@^1.0.0, prosemirror-menu@^1.2.1:
prosemirror-state "^1.0.0" prosemirror-state "^1.0.0"
prosemirror-model@^1.0.0, prosemirror-model@^1.16.0, prosemirror-model@^1.18.2: prosemirror-model@^1.0.0, prosemirror-model@^1.16.0, prosemirror-model@^1.18.2:
version "1.18.2" version "1.18.3"
resolved "https://registry.yarnpkg.com/prosemirror-model/-/prosemirror-model-1.18.2.tgz#a85c2dbf66ccc114ab35d8dac39228ed294b9b7a" resolved "https://registry.yarnpkg.com/prosemirror-model/-/prosemirror-model-1.18.3.tgz#d1026a78cff928fd600e90d87cf7d162e0a4e3fd"
integrity sha512-uOQorJr20qVvqp2hs2RdWtWoidQxJ1ceE11bSmkf57XS989mdg1zKPJIp5HOHfY8/KjXPn3cLZqUYYwRrfBBPw== integrity sha512-yUVejauEY3F1r7PDy4UJKEGeIU+KFc71JQl5sNvG66CLVdKXRjhWpBW6KMeduGsmGOsw85f6EGrs6QxIKOVILA==
dependencies: dependencies:
orderedmap "^2.0.0" orderedmap "^2.0.0"
@ -8056,6 +8098,16 @@ punycode@^2.1.0:
resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec"
integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==
purgecss@^4.1.1:
version "4.1.3"
resolved "https://registry.yarnpkg.com/purgecss/-/purgecss-4.1.3.tgz#683f6a133c8c4de7aa82fe2746d1393b214918f7"
integrity sha512-99cKy4s+VZoXnPxaoM23e5ABcP851nC2y2GROkkjS8eJaJtlciGavd7iYAw2V84WeBqggZ12l8ef44G99HmTaw==
dependencies:
commander "^8.0.0"
glob "^7.1.7"
postcss "^8.3.5"
postcss-selector-parser "^6.0.6"
pvtsutils@^1.3.2: pvtsutils@^1.3.2:
version "1.3.2" version "1.3.2"
resolved "https://registry.yarnpkg.com/pvtsutils/-/pvtsutils-1.3.2.tgz#9f8570d132cdd3c27ab7d51a2799239bf8d8d5de" resolved "https://registry.yarnpkg.com/pvtsutils/-/pvtsutils-1.3.2.tgz#9f8570d132cdd3c27ab7d51a2799239bf8d8d5de"
@ -8151,9 +8203,9 @@ refa@^0.9.0:
regexpp "^3.2.0" regexpp "^3.2.0"
regenerator-runtime@^0.13.10: regenerator-runtime@^0.13.10:
version "0.13.10" version "0.13.11"
resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.10.tgz#ed07b19616bcbec5da6274ebc75ae95634bfc2ee" resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz#f6dca3e7ceec20590d07ada785636a90cdca17f9"
integrity sha512-KepLsg4dU12hryUO7bp/axHAKvwGOCV0sGloQtpagJ12ai+ojVDqkeGSiRX1zlq+kjIMZ1t7gpze+26QqtdGqw== integrity sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==
regexp-ast-analysis@^0.2.3: regexp-ast-analysis@^0.2.3:
version "0.2.4" version "0.2.4"
@ -8441,6 +8493,13 @@ rollup-pluginutils@^2.8.2:
dependencies: dependencies:
estree-walker "^0.6.1" estree-walker "^0.6.1"
"rollup@>=2.59.0 <2.78.0":
version "2.77.3"
resolved "https://registry.yarnpkg.com/rollup/-/rollup-2.77.3.tgz#8f00418d3a2740036e15deb653bed1a90ee0cc12"
integrity sha512-/qxNTG7FbmefJWoeeYJFbHehJ2HNWnjkAFRKzWN/45eNBBF/r8lo992CwcJXEzyVxs5FmfId+vTSTQDb+bxA+g==
optionalDependencies:
fsevents "~2.3.2"
rollup@^2.79.1: rollup@^2.79.1:
version "2.79.1" version "2.79.1"
resolved "https://registry.yarnpkg.com/rollup/-/rollup-2.79.1.tgz#bedee8faef7c9f93a2647ac0108748f497f081c7" resolved "https://registry.yarnpkg.com/rollup/-/rollup-2.79.1.tgz#bedee8faef7c9f93a2647ac0108748f497f081c7"
@ -8517,14 +8576,12 @@ sass-formatter@^0.7.5:
dependencies: dependencies:
suf-log "^2.5.3" suf-log "^2.5.3"
sass@^1.56.1: sass@1.32.13:
version "1.56.1" version "1.32.13"
resolved "https://registry.yarnpkg.com/sass/-/sass-1.56.1.tgz#94d3910cd468fd075fa87f5bb17437a0b617d8a7" resolved "https://registry.yarnpkg.com/sass/-/sass-1.32.13.tgz#8d29c849e625a415bce71609c7cf95e15f74ed00"
integrity sha512-VpEyKpyBPCxE7qGDtOcdJ6fFbcpOM+Emu7uZLxVrkX8KVU/Dp5UF7WLvzqRuUhB6mqqQt1xffLoG+AndxTZrCQ== integrity sha512-dEgI9nShraqP7cXQH+lEXVf73WOPCse0QlFzSD8k+1TcOxCMwVXfQlr0jtoluZysQOyJGnfr21dLvYKDJq8HkA==
dependencies: dependencies:
chokidar ">=3.0.0 <4.0.0" chokidar ">=3.0.0 <4.0.0"
immutable "^4.0.0"
source-map-js ">=0.6.2 <2.0.0"
scslre@^0.1.6: scslre@^0.1.6:
version "0.1.6" version "0.1.6"
@ -8773,7 +8830,7 @@ sort-package-json@^2.1.0:
is-plain-obj "^4.1.0" is-plain-obj "^4.1.0"
sort-object-keys "^1.1.3" sort-object-keys "^1.1.3"
"source-map-js@>=0.6.2 <2.0.0", source-map-js@^1.0.2: source-map-js@^1.0.2:
version "1.0.2" version "1.0.2"
resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c" resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c"
integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==
@ -9687,23 +9744,43 @@ vfile-location@^4.0.0:
vfile "^5.0.0" vfile "^5.0.0"
vfile-message@^3.0.0: vfile-message@^3.0.0:
version "3.1.2" version "3.1.3"
resolved "https://registry.yarnpkg.com/vfile-message/-/vfile-message-3.1.2.tgz#a2908f64d9e557315ec9d7ea3a910f658ac05f7d" resolved "https://registry.yarnpkg.com/vfile-message/-/vfile-message-3.1.3.tgz#1360c27a99234bebf7bddbbbca67807115e6b0dd"
integrity sha512-QjSNP6Yxzyycd4SVOtmKKyTsSvClqBPJcd00Z0zuPj3hOIjg0rUPG6DbFGPvUKRgYyaIWLPKpuEclcuvb3H8qA== integrity sha512-0yaU+rj2gKAyEk12ffdSbBfjnnj+b1zqTBv3OQCTn8yEB02bsPizwdBPrLJjHnK+cU9EMMcUnNv938XcZIkmdA==
dependencies: dependencies:
"@types/unist" "^2.0.0" "@types/unist" "^2.0.0"
unist-util-stringify-position "^3.0.0" unist-util-stringify-position "^3.0.0"
vfile@^5.0.0, vfile@^5.3.2: vfile@^5.0.0, vfile@^5.3.2:
version "5.3.5" version "5.3.6"
resolved "https://registry.yarnpkg.com/vfile/-/vfile-5.3.5.tgz#ec2e206b1414f561c85b7972bb1eeda8ab47ee61" resolved "https://registry.yarnpkg.com/vfile/-/vfile-5.3.6.tgz#61b2e70690cc835a5d0d0fd135beae74e5a39546"
integrity sha512-U1ho2ga33eZ8y8pkbQLH54uKqGhFJ6GYIHnnG5AhRpAh3OWjkrRHKa/KogbmQn8We+c0KVV3rTOgR9V/WowbXQ== integrity sha512-ADBsmerdGBs2WYckrLBEmuETSPyTD4TuLxTrw0DvjirxW1ra4ZwkbzG8ndsv3Q57smvHxo677MHaQrY9yxH8cA==
dependencies: dependencies:
"@types/unist" "^2.0.0" "@types/unist" "^2.0.0"
is-buffer "^2.0.0" is-buffer "^2.0.0"
unist-util-stringify-position "^3.0.0" unist-util-stringify-position "^3.0.0"
vfile-message "^3.0.0" vfile-message "^3.0.0"
vite-plugin-html-purgecss@^0.1.1:
version "0.1.1"
resolved "https://registry.yarnpkg.com/vite-plugin-html-purgecss/-/vite-plugin-html-purgecss-0.1.1.tgz#e392c4c26470c1a80d45e70c5638cd07866e1292"
integrity sha512-/VJnN/CkUoXlgVCvIbFymfsW7hUEO2Dch5uWwiKJFTb4SLLNhTr/sPJfEUl1wTj5y3SwPXgPz002sQgXJj0mCw==
dependencies:
purgecss "^4.1.1"
vite "^2.6.7"
vite@^2.6.7:
version "2.9.15"
resolved "https://registry.yarnpkg.com/vite/-/vite-2.9.15.tgz#2858dd5b2be26aa394a283e62324281892546f0b"
integrity sha512-fzMt2jK4vQ3yK56te3Kqpkaeq9DkcZfBbzHwYpobasvgYmP2SoAr6Aic05CsB4CzCZbsDv4sujX3pkEGhLabVQ==
dependencies:
esbuild "^0.14.27"
postcss "^8.4.13"
resolve "^1.22.0"
rollup ">=2.59.0 <2.78.0"
optionalDependencies:
fsevents "~2.3.2"
vite@^3.2.4, vite@~3.2.4: vite@^3.2.4, vite@~3.2.4:
version "3.2.4" version "3.2.4"
resolved "https://registry.yarnpkg.com/vite/-/vite-3.2.4.tgz#d8c7892dd4268064e04fffbe7d866207dd24166e" resolved "https://registry.yarnpkg.com/vite/-/vite-3.2.4.tgz#d8c7892dd4268064e04fffbe7d866207dd24166e"