From 5bd5eea193e3e14e2e7b005bec96aa029214552c Mon Sep 17 00:00:00 2001 From: StepanovPlaton Date: Tue, 3 Feb 2026 23:39:08 +0400 Subject: [PATCH] New page --- public/admin/config.yml | 6 ++ public/admin/index.html | 33 ++++----- src/components/pagination.astro | 12 +++- src/config.ts | 1 + src/constants/link-presets.ts | 6 ++ src/content/about.md | 31 ++++----- src/content/worth-mentioning.md | 111 +++++++++++++++++++++++++++++++ src/i18n/i18nKey.ts | 4 ++ src/i18n/languages/ru.ts | 12 ++-- src/pages/index.astro | 44 ++++++++---- src/pages/projects.astro | 10 +-- src/pages/worth-mentioning.astro | 35 ++++++++++ src/types/config.ts | 1 + twilight.config.yaml | 25 ++++--- 14 files changed, 265 insertions(+), 66 deletions(-) create mode 100644 src/content/worth-mentioning.md create mode 100644 src/pages/worth-mentioning.astro diff --git a/public/admin/config.yml b/public/admin/config.yml index 90a011d..d80723a 100644 --- a/public/admin/config.yml +++ b/public/admin/config.yml @@ -155,6 +155,12 @@ collections: - { label: "Site URL", name: "siteurl", widget: "string" } - { label: "Tags", name: "tags", widget: "list", required: false, default: [] } + - name: "worth-mentioning" + label: "Worth Mentioning" + file: "src/content/worth-mentioning.md" + fields: + - { label: "Body", name: "body", widget: "markdown" } + editor: preview: true \ No newline at end of file diff --git a/public/admin/index.html b/public/admin/index.html index 9a59462..65020c9 100644 --- a/public/admin/index.html +++ b/public/admin/index.html @@ -1,5 +1,6 @@ + @@ -7,18 +8,18 @@ + - + + \ No newline at end of file diff --git a/src/components/pagination.astro b/src/components/pagination.astro index bd1fa5b..390ad71 100644 --- a/src/components/pagination.astro +++ b/src/components/pagination.astro @@ -9,9 +9,10 @@ interface Props { page: Page; class?: string; style?: string; + basePath?: string; // Базовый путь для генерации URL (например, "/news" для главной страницы) } -const { page, style } = Astro.props; +const { page, style, basePath } = Astro.props; const HIDDEN = -1; @@ -48,7 +49,14 @@ if (r === page.lastPage - 2) pages.push(page.lastPage - 1); if (r < page.lastPage) pages.push(page.lastPage); const getPageUrl = (p: number) => { - if (p === 1) return "/"; + if (p === 1) { + // Первая страница всегда на корне + return "/"; + } + // Если указан basePath, используем его для всех страниц кроме первой + if (basePath) { + return `${basePath}/${p}/`; + } return `/${p}/`; }; --- diff --git a/src/config.ts b/src/config.ts index 5094cec..5654f2c 100644 --- a/src/config.ts +++ b/src/config.ts @@ -51,6 +51,7 @@ const linkPresetNameMap: Record = { Anime: LinkPreset.Anime, About: LinkPreset.About, Friends: LinkPreset.Friends, + WorthMentioning: LinkPreset.WorthMentioning, }; const normalizeNavbarLink = ( diff --git a/src/constants/link-presets.ts b/src/constants/link-presets.ts index 228c56a..1cc5a18 100644 --- a/src/constants/link-presets.ts +++ b/src/constants/link-presets.ts @@ -64,4 +64,10 @@ export const LinkPresets: { [key in LinkPreset]: NavbarLink } = { icon: "material-symbols:info", description: i18n(I18nKey.about), }, + [LinkPreset.WorthMentioning]: { + name: i18n(I18nKey.worthMentioning), + url: "/worth-mentioning/", + icon: "material-symbols:star", + description: i18n(I18nKey.worthMentioningSubtitle), + }, }; \ No newline at end of file diff --git a/src/content/about.md b/src/content/about.md index 31d2390..76f2d6a 100644 --- a/src/content/about.md +++ b/src/content/about.md @@ -1,18 +1,19 @@ -# About This Site +# Об этом сайте -Twilight is a CMS integrated static blog template built with [Astro](https://astro.build) framework. +Добро пожаловать на сайт Степанова Платона. Тут много информации обо мне, моих проектах, навыках, увлечениях, мои новости. Я хотел собрать всё это в одном месте, чтобы удобно делиться своим опытом и представляться в интернете. +**Пишите, буду рад новым знакомым!** +--- + +## Достойны упоминания +Если вам понравился этот сайт, вы так же можете [посмотреть проекты других людей, которые я считаю достойными упоминания](../worth-mentioning/) + +--- + +## Создать свой сайт +Если вам понравился этот сайт и вы хотите создать что-то подобное для себя, то эти репозитории вам помогут: + +**Шаблон для Astro Twilight который лежит в основе моего сайта** ::github{repo="Spr-Aachen/Twilight"} - - -## Milestones - -- Integrated content management system in [#1](https://github.com/Spr-Aachen/Twilight/pull/1) -- Seamless wallpaper mode switching in [#2](https://github.com/Spr-Aachen/Twilight/pull/2) -- Dynamic content container response in [#47](https://github.com/Spr-Aachen/Twilight/pull/47) -- Seamless page component loading in [#48](https://github.com/Spr-Aachen/Twilight/pull/48) -- Smart music playback handling in [#49](https://github.com/Spr-Aachen/Twilight/pull/49) -- Infinite-level navigation system in [#50](https://github.com/Spr-Aachen/Twilight/pull/50) -- Comprehensive statistics dashboard in [#51](https://github.com/Spr-Aachen/Twilight/pull/51) -- Low-barrier configuration scheme in [#58](https://github.com/Spr-Aachen/Twilight/pull/58) -- Dynamic breakpoint handling in [#68](https://github.com/Spr-Aachen/Twilight/pull/68) \ No newline at end of file +**Исходный код моего сайта** +::github{repo="StepanovPlaton/AboutMe"} diff --git a/src/content/worth-mentioning.md b/src/content/worth-mentioning.md new file mode 100644 index 0000000..bc132fe --- /dev/null +++ b/src/content/worth-mentioning.md @@ -0,0 +1,111 @@ +# Посмотрите также + +Раз уж у меня появился свой уголок в интернете, я посчитал нужным поделиться с вами классными проектами других людей. Здесь вы найдёте и другие сайты, и книги, и видеоигры, от популярных до нишевых — **всё, что я хочу показать миру**. + +## О дварфах! + +История моей аватарки (стилистики этого сайта, моего сервера и много чего ещё) берёт своё начало с **[легендарной игры DwarfFortress](http://www.bay12games.com/dwarves/)**. Эта игра для меня пример **гениальности, усидчивости и абсурда** в одном лице. + +
+ Я не могу советовать её вам (потому что это игра не для всех), но был обязан упомянуть на своём сайте + +Её движок настолько сложен, что долгое время к нему не могли добавить графику. За **более чем 20 лет разработки** она готова менее чем наполовину, её делают два брата на пожертвования от фанатов, и при всём этом ей вдохновлялись создатели Minecraft и Rimworld, а в 2013 Нью-Йоркский музей современного искусства включил игру в свою коллекцию. + +Это лучший симулятор историй. Обязательно почитайте [историю крепости Боутмёрдед](https://dtf.ru/games/22946-legendy-dwarf-fortress-saga-o-padenii-kreposti-boutmerded) — эти легенды тянут на эпичный фильм от Netflix, но это просто обычная игра в DwarfFortress. Да, здесь можно тренировать дварфов бегать на костылях быстрее, чем на ногах, стреляя в них монетками. Да, на вас может напасть огромная адская автоматически сгенерированная... попа. И да, ваши дварфы могут умереть не только от гоблинов, но и от кошек, безумия, миазмов, одинаковой выпивки и даже сушняка... + +Эта игра не для всех, но я боюсь в неё заходить, потому что потом не могу выйти. + +И помните... Проигрывать весело! +
+ +## Карандаш и Самоделкин + +У всякой истории есть начало. Я начал свою историю отсюда: [Блог команды "Карандаш и Самоделкин"](https://karandashsamodelkin.blogspot.com). Передавайте привет маленькому мне и **большое спасибо моему отцу**! + +## Классные сайты + +Интернет огромен, и в нём куча страниц. Некоторые популярны, другие не очень, но эти особенно интересны: + ++ [Онлайн книга Linux From Scratch](https://linuxfromscratch.org) — бесплатное руководство по созданию своей GNU/Linux системы из исходного кода (с нуля). Лучшее развлечение на вечер для админа. ++ [Этаж 796](https://floor796.com) — проект русского художника, который объединил на 796 этаже космической станции всех самых знаковых персонажей, гиков, мемов, фильмов, комиксов и сериалов человечества. Тут залип на 2 часа... ++ [SCP Foundation](https://scpfoundation.net) — открытая научно-фантастическая онлайн вселенная. Мурашки по коже, невозможно оторваться. Обязательно прочтите [SCP-079 — Старый ИИ](https://scpfoundation.net/scp-079) и [Хаб отдела антимеметики](https://scpfoundation.net/antimemetics-division-hub). ++ [CashGo](https://cashgo.ru) — онлайн игра, тренажёр финансового интеллекта. Здесь я успел ухватить кусочек старого интернета с ламповыми форумами. Спасибо за детство, передавайте привет Оксюше, Пингвинатко, Успеху и Лису! ++ [Неолурк](https://neolurk.org) — народная википедия. + +## IT + ++ [Brainfuck](https://ru.wikipedia.org/wiki/Brainfuck) — эзотерический язык программирования из 8 команд. ++ [KISS](https://ru.wikipedia.org/wiki/KISS_(принцип)) — делай проще, тупица. ++ [Быстрый обратный квадратный корень](https://ru.wikipedia.org/wiki/Быстрый_обратный_квадратный_корень) — магическая функция приближённого вычисления $1/\sqrt{x}$ из Quake. ++ [В††](https://neolurk.org/wiki/В%2B%2B) — язык программирования русских богатырей. ++ [Suckless](https://suckless.org) — эталон минимализма. Обязательно зацените [dwm](https://dwm.suckless.org) и [st](https://st.suckless.org). ++ [9600 бод и все-все-все](https://lib.ru/ANEKDOTY/9600.txt) — Винни Пух стал хакером времён FIDONET. ++ [Nand2Tetris](https://www.nand2tetris.org) — собираем 16-битный компьютер из логических блоков, пишем компилятор, операционную систему и видеоигры. Курс от MIT. + +## Видеоигры + ++ [DwarfFortress](https://ru.wikipedia.org/wiki/Dwarf_Fortress) — симулятор строительства и управления пьяными дварфами. Лучший генератор историй. ++ [Chrono Trigger](https://ru.wikipedia.org/wiki/Chrono_Trigger) — лучшая JRPG из мира ретро-видеоигр. Хочу поделиться этой игрой как дань уважения винтажным видеоиграм и разработчикам, которые их писали (на ассемблере!!). Chrono Trigger — венец творения той эпохи! ++ [Doom](https://ru.wikipedia.org/wiki/Doom) - легендарная игра, одна из первых псевдотрёхмерных видеоигр от первого лица. ++ [Baldur's Gate III](https://ru.wikipedia.org/wiki/Baldur's_Gate_3) — лучшая RPG от легендарной Larian Studios. Если когда-нибудь пойду в GameDev, то только к ним. ++ [Lode Runner](https://ru.wikipedia.org/wiki/Lode_Runner) — люблю эту игру (версию под ZXSpectrum). Одна из тысяч игр той эпохи. Я однажды даже [написал её клон](https://rutracker.org/forum/viewtopic.php?t=5885455). Когда-нибудь я всё же пройду её до конца... ++ [Elite](https://ru.wikipedia.org/wiki/Elite) — космический симулятор, который помещался на ленту в 22Кб. 8 галактик по 256 планет в каждой. ++ [НЕВЕРьвХУДо](https://ru.wikipedia.org/wiki/The_Neverhood) — приключение-головоломка из пластилина. [Саундтрек обязателен к прослушиванию](https://youtu.be/Wh4WnHlsbvM?si=VMTHX2Itt5Vwxr1b). ++ [.kkrieger](https://ru.wikipedia.org/wiki/.kkrieger) — 3D видеоигра размером в 96 килобайт. + +## Кино и сериалы + ++ [Теория большого взрыва](https://www.kinopoisk.ru/series/306084/) — `Всё становится лучше с Bluetooth!` ++ [Компьютерщики](https://www.kinopoisk.ru/series/386715/) — `Алло, техподдержка. Вы пробовали выключить и снова включить?` ++ [Mr. Freeman](https://www.kinopoisk.ru/series/630080/) — `Большим можно оставаться и будучи маленьким` ++ [Масяня](https://www.kinopoisk.ru/series/447446/) — [Как-то один енот жил толстый как барсуууук...](https://www.youtube.com/watch?v=GWpF9LIhXhk) ++ [Revolution OS](https://www.youtube.com/watch?v=n1F_MfLRlX0) — история OpenSource и ядра Linux в озвучке Дмитрия Бачило. + +## Книги + +Я не очень люблю читать книги, но просто обожаю слушать их аудиоверсии. Это книги которые кажутся мне классными. Я специально не стал писать их в список, иначе просто не смог бы определить порядок. Некоторые из них полезные, некоторые развлекательные, некоторые известные, другие нет. Может быть ты найдёшь здесь что-то для себя! + +| | | | +|---|---|---| +| Азимов Айзек — Основание (цикл) | Адамс Дуглас — Автостопом по галактике | Арриан Флавий — Энхиридион (Краткое руководство к нравственной жизни) | +| Бабайкин — На пенсию в 35 лет | Богомазов Валентин — 3017 (цикл) | Валерьев Андрей — Фаранг (цикл) | +| Вейр Энди — Марсианин | Вейр Энди — Проект «Аве Мария» | Гессе Герман — Сиддхартха | +| Дивoв Олег — Лучший экипаж Солнечной | Дивoв Олег — Техподдержка | Дик Филип Киндред — Убик | +| Дик Филип Киндред — Мечтают ли андроиды об электроовцах? | Дорофеев Максим — Джедайские техники | Злотников Роман — Руигат (цикл) | +| Ильин Владимир — Шериф | Казанцев Сергей — Баг | Каменистый Артем — Исчадие техно (цикл) | +| Каменистый Артем — Самый странный нуб (трилогия) | Каменистый Артем — Альфа-ноль (цикл) | Кинг Стивен — Долгая прогулка | +| Кинг Стивен — Бегущий человек | Кларк Артур — 2001: Космическая одиссея (цикл) | Клейсон Джордж — Самый богатый человек в Вавилоне | +| Кострица Евгений — Рарник (цикл) | Кравец Сергей — Спираль времени (цикл) | Лем Станислав — Сказки роботов | +| Лукьяненко Сергей — Линия грёз (цикл) | Лю Цысинь — Задача трех тел (трилогия) | Лю Цысинь — Блуждающая земля | +| Марков Алексей — Хулиномика | Марков Алексей — Жлобология | Мэнсон Марк — Всё хреново: книга о надежде | +| Мэнсон Марк — Тонкое искусство пофигизма | Мэнсон Марк — Мужские правила | Оруэлл Джордж — 1984 | +| Пелевин Виктор — Тайные виды на гору Фудзи | Пелевин Виктор — Омон Ра | Пильюччи Массимо — Как быть стоиком | +| Рейнольдс Аластер — Дождь забвения | Ринпоче Йонге Мингьюр — Будда, мозг и нейрофизиология счастья | Ринпоче Йонге Мингьюр — Радостная мудрость | +| Рус Дмитрий — Играть, чтобы жить (цикл) | Рэнд Айн — Атлант расправил плечи | Саберхаген Фред — Берсеркер | +| Смородинский Георгий — Семнадцатое обновление (цикл) | Смородинский Георгий — Черный барон (цикл) | Смородинский Георгий — Перекресток одиночества | +| Стругацкие Аркадий и Борис — Трудно быть богом | Стругацкие Аркадий и Борис — Понедельник начинается в субботу | Стругацкие Аркадий и Борис — Пикник на обочине | +| Тармашев Сергей — Ареал (цикл) | Тармашев Сергей — Древний (цикл) | Тармашев Сергей — Каждому своё (цикл) | +| Тармашев Сергей — Тьма (цикл) | Франкл Виктор — Сказать жизни «Да!» | Фромм Эрих — Искусство любить | +| Хаксли Олдос — О дивный новый мир | Харари Юваль Ной — Sapiens: Краткая история человечества | Харари Юваль Ной — Homo Deus: Краткая история будущего | +| Хокинг Стивен — Краткая история времени | Хокинг Стивен — Высший замысел | Шаман Павел — Система дефрагментации (цикл) | +| Шаров Кирилл — Проект «Изоляция» (цикл) | Юдковский Элиезер — Гарри Поттер и методы рационального мышления | Юнг Карл Густав — Аналитическая психология: Тавистокские лекции | +| Ямамото Цунэтомо — Хагакурэ. Сокрытое в листве | | | + +## Музыка + ++ [ГРОТ](https://grotmusic.ru) - не просто музыка, а текст и глубокий смысл. ++ [HTP](https://vk.com/nii_rap) - если вы из IT просто полистайте, это весело. + +## Кумиры + +В той или иной мере меня вдохновляют эти люди: ++ [Линус Торвальдс](https://ru.wikipedia.org/wiki/Торвальдс,_Линус) — самый значимый OpenSource проект. ++ [Павел Дуров](https://t.me/durov) — Telegram и борьба за свободу в интернете. ++ [Тарн и Зак Адамс](https://bay12games.com) - самая амбициозая инди-игра. ++ [Глеб Карпов](https://www.youtube.com/@glebprosto) — Просто о сложном и важном. + +## Разное + +Это просто классные вещи, зацените их! + ++ [Цикада 3301](https://habr.com/ru/companies/ruvds/articles/714806/) — одна из самых больших загадок интернета 2010-х. \ No newline at end of file diff --git a/src/i18n/i18nKey.ts b/src/i18n/i18nKey.ts index 5e1178d..1cb6a5f 100644 --- a/src/i18n/i18nKey.ts +++ b/src/i18n/i18nKey.ts @@ -188,6 +188,10 @@ enum I18nKey { // 友链页面 friends = "friends", + // 值得提及的 проекты + worthMentioning = "worthMentioning", + worthMentioningSubtitle = "worthMentioningSubtitle", + // RSS页面 rss = "rss", rssDescription = "rssDescription", diff --git a/src/i18n/languages/ru.ts b/src/i18n/languages/ru.ts index 046715a..76f0311 100644 --- a/src/i18n/languages/ru.ts +++ b/src/i18n/languages/ru.ts @@ -111,8 +111,8 @@ export const ru: Translation = { [Key.skillLevelAdvanced]: "Продвинутый", [Key.skillLevelExpert]: "Эксперт", [Key.skillExperience]: "Опыт", - [Key.skillYears]: " г.", - [Key.skillMonths]: " мес.", + [Key.skillYears]: " г", + [Key.skillMonths]: " мес", [Key.skillsTotal]: "Всего навыков", [Key.skillsExpert]: "Экспертный уровень", [Key.skillsAdvanced]: "Продвинутый", @@ -163,8 +163,8 @@ export const ru: Translation = { [Key.diaryDaysAgo]: "дней назад", // Страница альбомов - [Key.albums]: "Портфолио", //"Альбомы", - [Key.albumsSubtitle]: "Записывайте прекрасные моменты жизни", + [Key.albums]: "Медиа", //"Альбомы", + [Key.albumsSubtitle]: "Скриншоты моих работ и многое другое", [Key.albumsEmpty]: "Нет содержимого", [Key.albumsEmptyDesc]: "Альбомы ещё не созданы. Добавьте прекрасные воспоминания!", [Key.albumsBackToList]: "Вернуться к альбомам", @@ -191,6 +191,10 @@ export const ru: Translation = { // Страница друзей [Key.friends]: "Друзья", + // Страница проектов достойных упоминания + [Key.worthMentioning]: "Посмотрите также", + [Key.worthMentioningSubtitle]: "Проекты достойные упоминания", + // Страница RSS [Key.rss]: "RSS лента", [Key.rssDescription]: "Подпишитесь, чтобы получать последние обновления", diff --git a/src/pages/index.astro b/src/pages/index.astro index 6749b11..c90c4e0 100644 --- a/src/pages/index.astro +++ b/src/pages/index.astro @@ -7,7 +7,10 @@ import { LinkPresets } from "@constants/link-presets"; import { url } from "@utils/url"; import GridLayout from "@layouts/grid.astro"; import { siteConfig } from "@/config"; - +import PostPage from "@components/postPage.astro"; +import { PAGE_SIZE } from "@constants/constants"; +import { getSortedPosts } from "@utils/content"; +import Pagination from "@components/pagination.astro"; // Получаем все ссылки из navbar, включая основные и с подразделами const allLinks: NavbarLink[] = []; @@ -25,23 +28,34 @@ navbarConfig.links.forEach(link => { } }); -// Добавляем ссылку на новости/ленту постов -const newsLink: NavbarLink = { - name: "Новости", - url: "/news/", - icon: "material-symbols:article", - description: "Лента постов и статей", -}; - -// Вставляем ссылку на новости в начало списка -allLinks.unshift(newsLink); - const pageTitle = siteConfig.title; const pageDescription = siteConfig.subtitle || ""; + +const allBlogPosts = await getSortedPosts(); +const firstPagePosts = allBlogPosts.slice(0, PAGE_SIZE); +const totalPages = Math.ceil(allBlogPosts.length / PAGE_SIZE); + +const page = { + currentPage: 1, + lastPage: totalPages, + size: PAGE_SIZE, + total: allBlogPosts.length, + data: firstPagePosts.map((post, index) => ({ + ...post, + index: index + 1, + })), + url: { + current: "/", + prev: undefined, + next: totalPages > 1 ? url("/news/2/") : undefined, + }, +}; +const len = page.data.length; + --- -
+
@@ -84,6 +98,10 @@ const pageDescription = siteConfig.subtitle || "";
+ + {totalPages > 1 && ( + + )}