Compare commits
No commits in common. "b275856aae5a069f4eda0bf9d5755bb99eec1824" and "0643f481896624228c73f394e500a316ae4406ba" have entirely different histories.
b275856aae
...
0643f48189
5 changed files with 9 additions and 56 deletions
5
src/app.d.ts
vendored
5
src/app.d.ts
vendored
|
|
@ -18,18 +18,13 @@ declare global {
|
|||
|
||||
type MdsvexResolver = () => Promise<MdsvexFile>;
|
||||
|
||||
type BlogPostType = 'article' | 'update' | 'event';
|
||||
|
||||
interface BlogPost {
|
||||
slug: string;
|
||||
type?: BlogPostType;
|
||||
title: string;
|
||||
thumbnail?: string;
|
||||
thumbnailAlt?: string;
|
||||
date?: string;
|
||||
dateChanged?: string;
|
||||
dateEventFrom?: string;
|
||||
dateEventTo?: string;
|
||||
description: string;
|
||||
publisher: string;
|
||||
published?: boolean;
|
||||
|
|
|
|||
|
|
@ -2,9 +2,8 @@
|
|||
title: 'Наш первый блог'
|
||||
thumbnail: 'wave.png'
|
||||
thumbnailAlt: 'Смайлик с махающей рукой'
|
||||
date: '2025-10-22'
|
||||
date: '2025-09-30'
|
||||
description: 'Немного о том, как мы делали наш сайт'
|
||||
type: 'article'
|
||||
authors: 'rndtrash'
|
||||
---
|
||||
|
||||
|
|
@ -28,7 +27,7 @@ _полноценных_ веб-дизайнеров, довольствуемс
|
|||
Но вы не подумайте, что сайт слизан подчистую! Как минимум в процессе обновления версий фреймворков пришлось провести небольшой рефакторинг,
|
||||
а потом ещё пошли наши прочие хотелки (об этом дальше), и можно смело сказать, что спустя
|
||||
[сотню коммитов](https://git.teasanctuary.ru/TeaSanctuary/teasanctuary.ru/commits/branch/master),
|
||||
из общего остались только фреймворки и сама структура сайта.
|
||||
из общего остались только фреймворки и общая структура сайта.
|
||||
|
||||
В общем-то, главная причина почему мы взяли их сайт за основу, а не написали вручную — это удобная **система блогов**.
|
||||
|
||||
|
|
@ -62,10 +61,8 @@ _Но это же не удобно!_ Это ведь надо знать, чт
|
|||
title: 'Наш первый блог'
|
||||
thumbnail: 'wave.png'
|
||||
thumbnailAlt: 'Смайлик с махающей рукой'
|
||||
date: '2025-10-22'
|
||||
date: '2025-09-30'
|
||||
description: 'Немного о том, как мы делали наш сайт'
|
||||
type: 'article'
|
||||
authors: 'rndtrash'
|
||||
---
|
||||
```
|
||||
|
||||
|
|
|
|||
|
|
@ -7,25 +7,18 @@
|
|||
</script>
|
||||
|
||||
<script lang="ts">
|
||||
import {
|
||||
BLOG_POST_FRESHNESS_MILLIS,
|
||||
blogPostTypeToIcon,
|
||||
blogPostTypeToString
|
||||
} from '$lib/util/Blogs';
|
||||
import { BLOG_POST_FRESHNESS_MILLIS } from '$lib/util/Blogs';
|
||||
import DateWidget from '$lib/components/DateWidget.svelte';
|
||||
import Icon from '@iconify/svelte';
|
||||
|
||||
export let post: App.BlogPost;
|
||||
export let size: BlogCardSize = BlogCardSize.Both;
|
||||
|
||||
const type: App.BlogPostType = post.type ?? 'article';
|
||||
const dateNow = new Date().valueOf();
|
||||
const isPostNew = dateNow - new Date(post.date!).valueOf() <= BLOG_POST_FRESHNESS_MILLIS;
|
||||
const isPostUpdated =
|
||||
post.dateChanged != null &&
|
||||
dateNow - new Date(post.dateChanged).valueOf() <= BLOG_POST_FRESHNESS_MILLIS;
|
||||
const isPostFresh = isPostNew || isPostUpdated;
|
||||
// TODO: rndtrash: события и их актуальность
|
||||
|
||||
/**
|
||||
* rndtrash: пришлось дублировать классы с модификатором и без, потому что Tailwind просто не понимает,
|
||||
|
|
@ -66,7 +59,7 @@
|
|||
>
|
||||
<div
|
||||
class="relative w-full basis-auto overflow-hidden
|
||||
{shortClass('h-32 md:h-48')}
|
||||
{shortClass('h-32')}
|
||||
{fullClass('h-auto basis-1/3', 'sm:h-auto sm:basis-1/3')}"
|
||||
>
|
||||
{#if post.thumbnail}
|
||||
|
|
@ -86,7 +79,7 @@
|
|||
</div>
|
||||
{/if}
|
||||
</div>
|
||||
<div class="flex w-full flex-col justify-center p-4 break-words">
|
||||
<div class="flex w-full flex-col justify-center p-4 break-words md:p-8">
|
||||
<div class="flex flex-row flex-wrap justify-start gap-4 pb-2">
|
||||
<DateWidget
|
||||
class={post.dateChanged ? shortClass('hidden', 'not-sm:hidden') : ''}
|
||||
|
|
@ -101,12 +94,6 @@
|
|||
highlight={isPostUpdated}
|
||||
/>
|
||||
{/if}
|
||||
<div class="flex items-center gap-2 p-1 text-lg font-bold">
|
||||
<Icon icon={blogPostTypeToIcon(type)} width={28} height={28} />
|
||||
<span>
|
||||
{blogPostTypeToString(type)}
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<h2 class="text-3xl font-bold">{post.title}</h2>
|
||||
|
|
|
|||
|
|
@ -1,3 +1,5 @@
|
|||
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 дня
|
||||
|
||||
|
|
@ -58,24 +60,4 @@ export function resolveBlogPath(slug?: string, src?: string) {
|
|||
return src.startsWith('http://') || src.startsWith('https://')
|
||||
? src
|
||||
: `/blog/${slug}/${src}`;
|
||||
}
|
||||
|
||||
const bptToString: Record<App.BlogPostType, string> = {
|
||||
'article': 'Заметка',
|
||||
'event': 'Событие',
|
||||
'update': 'Обновление'
|
||||
};
|
||||
|
||||
const bptToIcon: Record<App.BlogPostType, string> = {
|
||||
'article': 'material-symbols:article',
|
||||
'event': 'material-symbols:event',
|
||||
'update': 'material-symbols:autorenew'
|
||||
};
|
||||
|
||||
export function blogPostTypeToString(type: App.BlogPostType): string {
|
||||
return bptToString[type] ?? bptToString['article'];
|
||||
}
|
||||
|
||||
export function blogPostTypeToIcon(type: App.BlogPostType): string {
|
||||
return bptToIcon[type] ?? bptToIcon['article'];
|
||||
}
|
||||
}
|
||||
|
|
@ -4,7 +4,6 @@
|
|||
import InfoBlock from '$src/lib/components/InfoBlock.svelte';
|
||||
import Icon from '@iconify/svelte';
|
||||
import type { PageData } from './$types';
|
||||
import { blogPostTypeToIcon, blogPostTypeToString } from '$src/lib/util/Blogs';
|
||||
|
||||
export let data: PageData;
|
||||
|
||||
|
|
@ -15,7 +14,6 @@
|
|||
: typeof data.blogPost.authors === 'string'
|
||||
? [data.blogPost.authors]
|
||||
: data.blogPost.authors;
|
||||
const type: App.BlogPostType = data.blogPost.type ?? 'article';
|
||||
</script>
|
||||
|
||||
<base target="_blank" />
|
||||
|
|
@ -46,12 +44,6 @@
|
|||
{#if data.blogPost.dateChanged}
|
||||
<DateWidget dateString={data.blogPost.dateChanged} type="updated" />
|
||||
{/if}
|
||||
<div class="flex items-center gap-2 p-1 text-lg font-bold">
|
||||
<Icon icon={blogPostTypeToIcon(type)} width={28} height={28} />
|
||||
<span>
|
||||
{blogPostTypeToString(type)}
|
||||
</span>
|
||||
</div>
|
||||
{#each authors as author}
|
||||
<!-- TODO: rndtrash: из-за 404 не даёт собрать сайт. href="/team/{author}" -->
|
||||
<a class="flex items-center gap-2 p-1 text-lg font-bold" href="#">
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue