diff --git a/src/lib/components/BlogCard.svelte b/src/lib/components/BlogCard.svelte new file mode 100644 index 0000000..1d31599 --- /dev/null +++ b/src/lib/components/BlogCard.svelte @@ -0,0 +1,143 @@ + + + + + +
+ {#if post.thumbnail} + {post.thumbnailAlt + {/if} + {#if isPostFresh} +
+ {#if isPostUpdated} + ОБНОВЛЕНО + {:else} + НОВОЕ + {/if} +
+ {/if} +
+
+
+ + {#if post.dateChanged} + + {/if} +
+ +

{post.title}

+ + {#if post.description} +

{post.description}

+ {/if} +
+
+ + diff --git a/src/lib/components/DateWidget.svelte b/src/lib/components/DateWidget.svelte new file mode 100644 index 0000000..337868d --- /dev/null +++ b/src/lib/components/DateWidget.svelte @@ -0,0 +1,32 @@ + + +
+ + + {dateString + ? new Date(dateString).toLocaleString(undefined, { + month: 'short', + day: 'numeric', + year: 'numeric' + }) + : 'Не опубликован!'} + +
diff --git a/src/lib/util/Blogs.ts b/src/lib/util/Blogs.ts index ad2d430..47939b5 100644 --- a/src/lib/util/Blogs.ts +++ b/src/lib/util/Blogs.ts @@ -1,16 +1,29 @@ import path from 'path'; export const THUMBNAIL_DEFAULT = "https://teasanctuary.ru/common/background-day.webp"; +export const BLOG_POST_FRESHNESS_MILLIS = 3 * 24 * 60 * 60 * 1000; // 3 дня -export async function fetchPostsSorted() { +export type PostComparer = (a: App.BlogPost, b: App.BlogPost) => number; + +export const sortPostsByPostDate: PostComparer = (a, b) => new Date(b.date!).valueOf() - new Date(a.date!).valueOf(); + +function laterDate(a: string, b?: string): number { + const dateA = new Date(a).valueOf(); + if (!b) return dateA; + + const dateB = new Date(b).valueOf(); + return Math.max(dateA, dateB); +} + +export const sortPostsByPostAndUpdateDate: PostComparer = (a, b) => laterDate(b.date!, b.dateChanged) - laterDate(a.date!, a.dateChanged); + +export async function fetchPostsSorted(postComparer?: PostComparer) { const allPosts = await fetchPosts(); const sortedPosts = allPosts // Для списка постов оставляем только те, у которых объявлена дата публикации .filter((a) => !!a.date) - .sort((a, b) => { - return new Date(b.date!).valueOf() - new Date(a.date!).valueOf(); - }); + .sort(postComparer ?? sortPostsByPostDate); return sortedPosts; }; diff --git a/src/routes/+page.server.ts b/src/routes/+page.server.ts new file mode 100644 index 0000000..de4f6ab --- /dev/null +++ b/src/routes/+page.server.ts @@ -0,0 +1,7 @@ +import { fetchPostsSorted, sortPostsByPostAndUpdateDate } from "$src/lib/util/Blogs"; + +const LATEST_POSTS_COUNT = 3; + +export async function load() { + return { posts: (await fetchPostsSorted(sortPostsByPostAndUpdateDate)).slice(0, LATEST_POSTS_COUNT) }; +} \ No newline at end of file diff --git a/src/routes/+page.svelte b/src/routes/+page.svelte index 606b8a5..36571a1 100644 --- a/src/routes/+page.svelte +++ b/src/routes/+page.svelte @@ -2,15 +2,15 @@ import SocialButton from '$lib/components/SocialButton.svelte'; import SocialHyperlink from '$lib/components/SocialHyperlink.svelte'; import { PUBLIC_TS_DISCORD } from '$env/static/public'; + import BlogCard, { BlogCardSize } from '$src/lib/components/BlogCard.svelte'; + import { page } from '$app/state'; Tea Sanctuary -
+
@@ -57,19 +57,12 @@ >
-
+

TEA

SANCTUARY

-
Сообщество @@ -87,6 +80,19 @@
+ +
+

ПОСЛЕДНИЕ ПОСТЫ

+ +
+ {#each page.data.posts as post, i} +
+ +
+ {/each} +
+
+

Кто мы?

- Tea Sanctuary — это в первую очередь коллектив друзей, разрабатывающих проекты - для души, для всеобщего пользования и даже на заказ. С 8 июля 2017 года мы ведём публичную - деятельность в сфере разработки ПО и развлечений. + Tea Sanctuary — это в первую очередь коллектив друзей, разрабатывающих + проекты для души, для всеобщего пользования и даже на заказ. С + 8 июля 2017 года мы ведём публичную деятельность в сфере разработки ПО и развлечений.

- Tea Sanctuary — это также и сообщество единомышленников. Любовь к добротным видеоиграм - и пассивная агрессия к вычислительной технике у нас в крови. Когда-то сообщество было закрытым - и насчитывало около 50 участников, но впоследствии мы решили его расширить. Станьте частью коллектива! + Tea Sanctuary — это также и сообщество единомышленников. Любовь к добротным + видеоиграм и пассивная агрессия к вычислительной технике у нас в крови. Когда-то сообщество + было закрытым и насчитывало около 50 участников, но впоследствии мы решили его расширить. + Станьте частью коллектива!

Что делаем?

- Наша главная страсть — это, конечно, видеоигры. Мы часто участвуем в так называемых - "гейм джемах" — конкурсах на разработку игр. Наши игры вы можете оценить здесь: + Наша главная страсть — это, конечно, видеоигры. Мы часто участвуем в так + называемых "гейм джемах" — конкурсах на разработку игр. Наши игры вы можете + оценить здесь: RandomTrash - FriendlyWithMeat. - Также мы ведём работу над нашим первым полноценным игровым проектом. - Следите за новостями в нашем + + FriendlyWithMeat + . Также мы ведём работу над нашим первым полноценным игровым + проектом. Следите за новостями в нашем сообществе!

- Отдельные участники нашего коллектива занимаются модификацией существующих игр, добавляя в - них новый контент. Например, MegaZerg создаёт оригинальные карты для такой - бессмертной классики, как Counter-Strike 1.6, и выкладывает их на ресурс GameBanana: - kemist + Отдельные участники нашего коллектива занимаются модификацией существующих игр, + добавляя в них новый контент. Например, MegaZerg создаёт оригинальные карты + для такой бессмертной классики, как Counter-Strike 1.6, и выкладывает их на ресурс + GameBanana: + + kemist +

Мы размещаем игровые сервера, как постоянные, так и временные для различных событий. Например, у нас есть сервер - Tea Sanctuary HLDM, где - вы можете ознакомиться с новыми картами от всего сообщества Half-Life. + + Tea Sanctuary HLDM + , где вы можете ознакомиться с новыми картами от всего сообщества + Half-Life.

- Не одними играми едины, за нашими плечами есть несколько прикладных программ, созданных под - заказ. Про них ничего особо рассказать не можем, но если вам надо что-нибудь сделать — - пишите нам! + Не одними играми едины, за нашими плечами есть несколько прикладных программ, + созданных под заказ. Про них ничего особо рассказать не можем, но если вам надо + что-нибудь сделать — пишите нам!

Как с вами связаться?

- Общие вопросы можно задавать в сообществе Tea Sanctuary. - Там же можете написать личное сообщение администраторам. + Общие вопросы можно задавать в + + сообществе Tea Sanctuary + . Там же можете написать личное сообщение администраторам.

- Наши соцсети и почту для более важных обращений можно найти на странице Контакты. + Наши соцсети и почту для более важных обращений можно найти на странице + Контакты.
\ No newline at end of file + + section > h2 { + @apply text-xl sm:text-3xl; + } + diff --git a/src/routes/+page.ts b/src/routes/+page.ts deleted file mode 100644 index f5d539c..0000000 --- a/src/routes/+page.ts +++ /dev/null @@ -1,3 +0,0 @@ -export async function load() { - return { title: undefined }; -} \ No newline at end of file diff --git a/src/routes/blog/+page.svelte b/src/routes/blog/+page.svelte index e5d11ae..870fcc9 100644 --- a/src/routes/blog/+page.svelte +++ b/src/routes/blog/+page.svelte @@ -1,8 +1,8 @@