This commit is contained in:
tonyrewin 2022-11-21 09:35:32 +03:00
commit 4b87a699e4
44 changed files with 524 additions and 494 deletions

View File

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

View File

@ -1,7 +1,7 @@
import { Icon } from '../_shared/Icon'
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 { Popup } from '../_shared/Popup'

View File

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

View File

@ -31,7 +31,10 @@ export const AuthorCard = (props: AuthorCardProps) => {
() => session()?.news?.authors?.some((u) => u === props.author.slug) || false
)
const canFollow = createMemo(() => !props.hideFollow && session()?.user?.slug !== props.author.slug)
const bio = () => props.caption || props.author.bio || t('Our regular contributor')
const bio = createMemo(() => {
return props.caption || props.author.bio || t('Our regular contributor')
})
const name = () => {
return props.author.name === 'Дискурс' && locale() !== 'ru'
? 'Discours'

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -5,7 +5,8 @@ import { showModal } from '../../stores/ui'
export default () => {
return (
<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">
<h4>{t('Horizontal collaborative journalistic platform')}</h4>
<p>
@ -38,5 +39,6 @@ export default () => {
</div>
</div>
</div>
</div>
)
}

View File

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

View File

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

View File

@ -14,7 +14,8 @@ export default (props: GroupProps) => {
return (
<div class="floor floor--important floor--group">
<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="col-lg-6">
@ -77,6 +78,7 @@ export default (props: GroupProps) => {
</div>
</div>
</div>
</div>
</Show>
</div>
)

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -1,7 +1,7 @@
import { useSession } from '../../context/session'
import type { PopupProps } 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'>

View File

@ -1,7 +1,6 @@
import { createEffect, createMemo, createSignal, For, Show } from 'solid-js'
import type { Author } from '../../graphql/types.gen'
import { AuthorCard } from '../Author/Card'
import { Icon } from '../_shared/Icon'
import { t } from '../../utils/intl'
import { useAuthorsStore, setAuthorsSort } from '../../stores/zine/authors'
import { useRouter } from '../../stores/router'
@ -41,7 +40,7 @@ export const AllAuthorsView = (props: Props) => {
const byLetter = createMemo<{ [letter: string]: Author[] }>(() => {
return sortedAuthors().reduce((acc, author) => {
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] = []
acc[letter].push(author)
return acc
@ -111,7 +110,7 @@ export const AllAuthorsView = (props: Props) => {
}
}
return (
<div class={clsx(styles.allTopicsPage, 'container')}>
<div class={clsx(styles.allTopicsPage, 'wide-container')}>
<Show when={sortedAuthors().length > 0 || searchResults().length > 0}>
<div class="shift-content">
<AllAuthorsHead />
@ -151,7 +150,7 @@ export const AllAuthorsView = (props: Props) => {
<div class={clsx(styles.topic, 'topic col-sm-6 col-md-4')}>
<div class="topic-title">
<a href={`/author/${author.slug}`}>{author.name}</a>
<sup>{author.stat.shouts}</sup>
<span class={styles.articlesCounter}>{author.stat.shouts}</span>
</div>
</div>
)}
@ -165,7 +164,6 @@ export const AllAuthorsView = (props: Props) => {
</For>
</Show>
<div class={styles.stats}>
<Show when={searchResults().length > 0}>
<For each={searchResults().slice(0, limit())}>
{(author) => (
@ -183,7 +181,7 @@ export const AllAuthorsView = (props: Props) => {
</Show>
<Show when={searchParams().by && searchParams().by !== 'name'}>
<div class="row">
<div class={clsx(styles.stats, 'row')}>
<div class="col-lg-10 col-xl-9">
<For each={sortedAuthors().slice(0, limit())}>
{(author) => (
@ -212,7 +210,6 @@ export const AllAuthorsView = (props: Props) => {
</div>
</Show>
</div>
</div>
</Show>
</div>
)

View File

@ -116,13 +116,12 @@ export const AllTopicsView = (props: AllTopicsViewProps) => {
)
return (
<div class={clsx(styles.allTopicsPage, 'container')}>
<div class={clsx(styles.allTopicsPage, 'wide-container')}>
<div class="shift-content">
<AllTopicsHead />
<Show when={sortedTopics().length > 0 || searchResults().length > 0}>
<Show when={searchParams().by === 'title'}>
<div class="row">
<div class="col-lg-10 col-xl-9">
<ul class={clsx('nodash', styles.alphabet)}>
<For each={ALPHABET}>
@ -141,7 +140,6 @@ export const AllTopicsView = (props: AllTopicsViewProps) => {
</For>
</ul>
</div>
</div>
<For each={sortedKeys()}>
{(letter, index) => (
@ -154,9 +152,8 @@ export const AllTopicsView = (props: AllTopicsViewProps) => {
<For each={byLetter()[letter]}>
{(topic) => (
<div class={clsx(styles.topic, 'topic col-sm-6 col-md-4')}>
<div class="topic-title">
<a href={`/topic/${topic.slug}`}>{topic.title}</a>
</div>
<span class={styles.articlesCounter}>{topic.stat.shouts}</span>
</div>
)}
</For>
@ -196,13 +193,11 @@ export const AllTopicsView = (props: AllTopicsViewProps) => {
</Show>
<Show when={sortedTopics().length > limit()}>
<div class="row">
<div class={clsx(styles.loadMoreContainer, 'col-12 col-md-10')}>
<div class={clsx(styles.loadMoreContainer, 'col-12 col-md-10 offset-md-1')}>
<button class={clsx('button', styles.loadMoreButton)} onClick={showMore}>
{t('Load more')}
</button>
</div>
</div>
</Show>
</Show>
</div>

View File

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

View File

@ -70,8 +70,9 @@ export const AuthorView = (props: AuthorProps) => {
)
return (
<div class="container author-page">
<div class="author-page">
<Show when={author()} fallback={<div class="center">{t('Loading')}</div>}>
<div class="wide-container">
<AuthorFull author={author()} />
<div class="row group__controls">
<div class="col-md-8">
@ -99,11 +100,11 @@ export const AuthorView = (props: AuthorProps) => {
<span class="mode-switcher__control">{t('All posts')}</span>
</div>
</div>
</div>
<h3 class="col-12">{title()}</h3>
</div>
</div>
<div class="row">
<Beside
title={t('Topics which supported by author')}
values={topicsByAuthor()[author().slug].slice(0, 5)}
@ -136,7 +137,6 @@ export const AuthorView = (props: AuthorProps) => {
</button>
</p>
</Show>
</div>
</Show>
</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 stylesBeside from '../../components/Feed/Beside.module.scss'
import { Icon } from '../_shared/Icon'
@ -14,15 +14,14 @@ import { useAuthorsStore } from '../../stores/zine/authors'
import { useTopicsStore } from '../../stores/zine/topics'
import { useTopAuthorsStore } from '../../stores/zine/topAuthors'
import { useSession } from '../../context/session'
import { Collab, ReactionKind, Shout } from '../../graphql/types.gen'
import { collabs, setCollabs } from '../../stores/editor'
import type { Shout } from '../../graphql/types.gen'
const AUTHORSHIP_REACTIONS = [
ReactionKind.Accept,
ReactionKind.Reject,
ReactionKind.Propose,
ReactionKind.Ask
]
// const AUTHORSHIP_REACTIONS = [
// ReactionKind.Accept,
// ReactionKind.Reject,
// ReactionKind.Propose,
// ReactionKind.Ask
// ]
export const FEED_PAGE_SIZE = 20
@ -57,15 +56,10 @@ export const FeedView = () => {
// load recent editing shouts ( visibility = authors )
const userslug = session().user.slug
await loadShouts({ filters: { author: userslug, visibility: 'authors' }, limit: 15, offset: 0 })
const collaborativeShouts = sortedArticles().filter((s: Shout, n: number, arr: Shout[]) => {
if (s.visibility !== 'authors') {
arr.splice(n, 1)
return arr
}
})
await loadShouts({ filters: { author: userslug, visibility: 'authors' }, limit: 15 })
const collaborativeShouts = sortedArticles().filter((shout) => shout.visibility === 'authors')
// 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 (

View File

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

View File

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

View File

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

View File

@ -7,7 +7,7 @@ type SearchFieldProps = {
}
export const SearchField = (props: SearchFieldProps) => {
const handleInputChange = (event) => props.onChange(event.target.value)
const handleInputChange = (event) => props.onChange(event.target.value.trim())
return (
<div class={styles.searchField}>

View File

@ -1,8 +1,10 @@
import { cacheExchange, CacheExchangeOpts } from '@urql/exchange-graphcache'
// import schema from './introspec.gen'
// import schema from './introspec.gen'
// NOTE: include codegened introspection schema when needed
// TODO: use urql-provided caching
export const cache = cacheExchange({
// TODO: include introspection schema when needed
keys: {
Shout: (data) => data.slug,
Author: (data) => data.slug,

View File

@ -1,7 +1,7 @@
import { ClientOptions, dedupExchange, fetchExchange, Exchange } from '@urql/core'
import { ClientOptions, dedupExchange, fetchExchange, Exchange, createClient } from '@urql/core'
import { devtoolsExchange } from '@urql/devtools'
import { isDev, apiBaseUrl } from '../utils/config'
import { initClient } from './client'
// import { cache } from './cache'
const TOKEN_LOCAL_STORAGE_KEY = 'token'
@ -38,4 +38,4 @@ const options: ClientOptions = {
exchanges
}
export const privateGraphQLClient = initClient(options)
export const privateGraphQLClient = createClient(options)

View File

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

View File

@ -7,7 +7,7 @@ import { PRERENDERED_ARTICLES_COUNT } from '../../../components/Views/Author'
const slug = Astro.params.slug.toString()
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
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 { createSignal } from 'solid-js'
// TODO: import { roomConnect } from '../../utils/p2p'

View File

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

View File

@ -550,10 +550,6 @@ figcaption {
margin-bottom: 6.4rem;
}
.wide-container {
padding: 0;
}
.container {
padding-left: $container-padding-x;
padding-right: $container-padding-x;
@ -617,14 +613,14 @@ figcaption {
}
}
.row > * {
.row {
@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-right: divide(-$container-padding-x, 2);
> * {
padding-left: divide($container-padding-x, 2);
padding-right: divide($container-padding-x, 2);
}
}
}
@ -789,6 +785,7 @@ details {
.text-truncate {
display: -webkit-box !important;
overflow: hidden;
position: relative;
-webkit-line-clamp: 2;
-webkit-box-orient: vertical;
white-space: normal;

View File

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

100
yarn.lock
View File

@ -1656,7 +1656,7 @@
optionalDependencies:
"@solid-devtools/transform" "^0.8.0"
"@solid-devtools/debugger@^0.15.0":
"@solid-devtools/debugger@^0.15.0", "@solid-devtools/debugger@^0.15.1":
version "0.15.1"
resolved "https://registry.yarnpkg.com/@solid-devtools/debugger/-/debugger-0.15.1.tgz#c98ccf401be9efb2965809de27525e6175ea6d6c"
integrity sha512-E5vXsdemei9T/k/0X0GyZFvKpHiz73am3o8PmWV6vYhipvwVgPRnBvvHI85IjmtqBKK8gqHVtqu2D2qNu0rN2w==
@ -2263,7 +2263,7 @@
"@typescript-eslint/types" "5.43.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"
resolved "https://registry.yarnpkg.com/@urql/core/-/core-3.0.5.tgz#a26c326dd788d6d6abb839493bce86147f5a45c9"
integrity sha512-6/1HG+WEAcPs+hXSFnxWBTWkNUwa8dj2cHysWokMaFIbAioGtUaSdxp2q9FDMtWAIGdc640NFSt2B8itGLdoAA==
@ -2278,14 +2278,6 @@
dependencies:
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":
version "5.0.5"
resolved "https://registry.yarnpkg.com/@urql/exchange-graphcache/-/exchange-graphcache-5.0.5.tgz#187a4077b4a0e2c91c5a06eaf8f03231605f7397"
@ -2919,7 +2911,7 @@ boolean@^3.0.1:
resolved "https://registry.yarnpkg.com/boolean/-/boolean-3.2.0.tgz#9e5294af4e98314494cbb17979fa54ca159f116b"
integrity sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw==
bootstrap@^5.2.0:
bootstrap@^5.2.2:
version "5.2.2"
resolved "https://registry.yarnpkg.com/bootstrap/-/bootstrap-5.2.2.tgz#834e053eed584a65e244d8aa112a6959f56e27a0"
integrity sha512-dEtzMTV71n6Fhmbg4fYJzQsw1N29hJKO1js5ackCgIpDcGid2ETMGC6zwSYw09v05Y+oRdQ9loC54zB1La3hHQ==
@ -3340,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"
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:
version "9.4.1"
resolved "https://registry.yarnpkg.com/commander/-/commander-9.4.1.tgz#d1dd8f2ce6faf93147295c0df13c7c21141cfbdd"
@ -3453,6 +3450,13 @@ crelt@^1.0.0:
resolved "https://registry.yarnpkg.com/crelt/-/crelt-1.0.5.tgz#57c0d52af8c859e354bace1883eb2e1eb182bb94"
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:
version "3.1.5"
resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-3.1.5.tgz#e1389f44d9e7ba767907f7af8454787952ab534f"
@ -3460,7 +3464,7 @@ cross-fetch@^3.1.5:
dependencies:
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"
resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6"
integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==
@ -4032,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"
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"
resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.14.54.tgz#8b44dcf2b0f1a66fc22459943dccf477535e9aa2"
integrity sha512-Cy9llcy8DvET5uznocPyqL3BFRrFXSVqbgpMJ9Wz8oVjZlh/zUSNbPRbov0VX7VxN2JH1Oa0uNxZ7eLRb62pJA==
@ -4843,7 +4847,7 @@ glob-parent@^6.0.2:
dependencies:
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"
resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b"
integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==
@ -5322,11 +5326,6 @@ ignore@^5.1.1, ignore@^5.2.0:
resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.0.tgz#6d3bac8fa7fe0d45d9f9be7bac2fc279577e345a"
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:
version "3.7.6"
resolved "https://registry.yarnpkg.com/immutable/-/immutable-3.7.6.tgz#13b4d3cb12befa15482a26fe1b2ebae640071e4b"
@ -7844,9 +7843,9 @@ postcss-scss@^4.0.2:
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:
version "6.0.10"
resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz#79b61e2c0d1bfc2602d549e11d0876256f8df88d"
integrity sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==
version "6.0.11"
resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.11.tgz#2e41dc39b7ad74046e1615185185cd0b17d0c8dc"
integrity sha512-zbARubNdogI9j7WY4nQJBiNqQf3sLS3wCP4WfOidu+p28LofJqDH1tcXypGrcmMHhDk2t9wGhCsYe/+szLTy1g==
dependencies:
cssesc "^3.0.0"
util-deprecate "^1.0.2"
@ -7861,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"
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"
resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.19.tgz#61178e2add236b17351897c8bcc0b4c8ecab56fc"
integrity sha512-h+pbPsyhlYj6N2ozBmHhHrs9DzGmbaarbLvWipMRO7RLS+v4onj26MPFXA5OBYFxyqYhUJK456SwDcY9H2/zsA==
@ -7963,9 +7962,9 @@ property-expr@^2.0.4:
integrity sha512-IJUkICM5dP5znhCckHSv30Q4b5/JA5enCtkRHYaOVOAocnH/1BQEYTC5NMfT3AVl/iXKdr3aqQbQn9DxyWknwA==
property-information@^6.0.0:
version "6.1.1"
resolved "https://registry.yarnpkg.com/property-information/-/property-information-6.1.1.tgz#5ca85510a3019726cb9afed4197b7b8ac5926a22"
integrity sha512-hrzC564QIl0r0vy4l6MvRLhafmUowhO/O3KgVSoXIbbA2Sz4j8HGpJc6T2cubRVwMwpdiG/vKGfhT4IixmKN9w==
version "6.2.0"
resolved "https://registry.yarnpkg.com/property-information/-/property-information-6.2.0.tgz#b74f522c31c097b5149e3c3cb8d7f3defd986a1d"
integrity sha512-kma4U7AFCTwpqq5twzC1YVIDXSqg6qQK6JN0smOw8fgRy1OkMi0CYSzFmsy6dnqSenamAtj0CyXMUJ1Mf6oROg==
prosemirror-commands@^1.0.0, prosemirror-commands@^1.3.1:
version "1.3.1"
@ -8099,6 +8098,16 @@ punycode@^2.1.0:
resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec"
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:
version "1.3.2"
resolved "https://registry.yarnpkg.com/pvtsutils/-/pvtsutils-1.3.2.tgz#9f8570d132cdd3c27ab7d51a2799239bf8d8d5de"
@ -8484,6 +8493,13 @@ rollup-pluginutils@^2.8.2:
dependencies:
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:
version "2.79.1"
resolved "https://registry.yarnpkg.com/rollup/-/rollup-2.79.1.tgz#bedee8faef7c9f93a2647ac0108748f497f081c7"
@ -8560,14 +8576,12 @@ sass-formatter@^0.7.5:
dependencies:
suf-log "^2.5.3"
sass@^1.56.1:
version "1.56.1"
resolved "https://registry.yarnpkg.com/sass/-/sass-1.56.1.tgz#94d3910cd468fd075fa87f5bb17437a0b617d8a7"
integrity sha512-VpEyKpyBPCxE7qGDtOcdJ6fFbcpOM+Emu7uZLxVrkX8KVU/Dp5UF7WLvzqRuUhB6mqqQt1xffLoG+AndxTZrCQ==
sass@1.32.13:
version "1.32.13"
resolved "https://registry.yarnpkg.com/sass/-/sass-1.32.13.tgz#8d29c849e625a415bce71609c7cf95e15f74ed00"
integrity sha512-dEgI9nShraqP7cXQH+lEXVf73WOPCse0QlFzSD8k+1TcOxCMwVXfQlr0jtoluZysQOyJGnfr21dLvYKDJq8HkA==
dependencies:
chokidar ">=3.0.0 <4.0.0"
immutable "^4.0.0"
source-map-js ">=0.6.2 <2.0.0"
scslre@^0.1.6:
version "0.1.6"
@ -8816,7 +8830,7 @@ sort-package-json@^2.1.0:
is-plain-obj "^4.1.0"
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"
resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c"
integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==
@ -9747,6 +9761,26 @@ vfile@^5.0.0, vfile@^5.3.2:
unist-util-stringify-position "^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:
version "3.2.4"
resolved "https://registry.yarnpkg.com/vite/-/vite-3.2.4.tgz#d8c7892dd4268064e04fffbe7d866207dd24166e"