mirror of
https://github.com/sergeyyarkov/yarkov.tech.git
synced 2026-10-11 10:29:21 +03:00
refactor: changed pages layouts
This commit is contained in:
parent
4613a61d25
commit
0640038da9
1002
package-lock.json
generated
1002
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
12
package.json
12
package.json
@ -16,12 +16,12 @@
|
|||||||
"preview": "astro preview --host"
|
"preview": "astro preview --host"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@astrojs/solid-js": "^0.2.1",
|
"@astrojs/solid-js": "^0.4.1",
|
||||||
"@typescript-eslint/eslint-plugin": "^5.30.6",
|
"@typescript-eslint/eslint-plugin": "^5.30.7",
|
||||||
"@typescript-eslint/parser": "^5.30.6",
|
"@typescript-eslint/parser": "^5.30.7",
|
||||||
"astro": "^1.0.0-beta.63",
|
"astro": "^1.0.0-beta.73",
|
||||||
"astro-icon": "^0.7.1",
|
"astro-icon": "^0.7.3",
|
||||||
"eslint": "^8.19.0",
|
"eslint": "^8.20.0",
|
||||||
"eslint-plugin-solid": "^0.7.1",
|
"eslint-plugin-solid": "^0.7.1",
|
||||||
"prettier": "^2.7.1",
|
"prettier": "^2.7.1",
|
||||||
"prettier-plugin-astro": "^0.1.1",
|
"prettier-plugin-astro": "^0.1.1",
|
||||||
|
|||||||
@ -18,10 +18,9 @@
|
|||||||
font-family: monospace;
|
font-family: monospace;
|
||||||
color: var(--font-color-gray);
|
color: var(--font-color-gray);
|
||||||
text-transform: uppercase;
|
text-transform: uppercase;
|
||||||
margin: 0;
|
|
||||||
text-align: right;
|
text-align: right;
|
||||||
white-space: nowrap;
|
white-space: nowrap;
|
||||||
margin-bottom: 10px;
|
margin-bottom: 0;
|
||||||
}
|
}
|
||||||
&:hover {
|
&:hover {
|
||||||
text-decoration: none;
|
text-decoration: none;
|
||||||
@ -38,6 +37,9 @@
|
|||||||
& a {
|
& a {
|
||||||
flex-direction: column-reverse;
|
flex-direction: column-reverse;
|
||||||
align-items: flex-start;
|
align-items: flex-start;
|
||||||
|
& p {
|
||||||
|
margin-bottom: 5px;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
48
src/components/ArticlePost/ArticlePost.astro
Normal file
48
src/components/ArticlePost/ArticlePost.astro
Normal file
@ -0,0 +1,48 @@
|
|||||||
|
---
|
||||||
|
import type { ArticleType } from '@root/types';
|
||||||
|
|
||||||
|
import { DateFormatter } from '@root/utils';
|
||||||
|
import './ArticlePost.scss';
|
||||||
|
|
||||||
|
export interface Props {
|
||||||
|
data: ArticleType;
|
||||||
|
}
|
||||||
|
|
||||||
|
const { data } = Astro.props as Props;
|
||||||
|
const { title, tags, author, published_at } = data;
|
||||||
|
---
|
||||||
|
|
||||||
|
<article class='article'>
|
||||||
|
<header>
|
||||||
|
<div class='meta'>
|
||||||
|
<ul class='list-links'>
|
||||||
|
{tags.map((tag) => (
|
||||||
|
<li>
|
||||||
|
<a class="btn-link" href={`/articles?tags=${tag}`}>
|
||||||
|
{tag}
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
))}
|
||||||
|
</ul>
|
||||||
|
<div>
|
||||||
|
<time datetime={published_at}>{DateFormatter.format(new Date(published_at))}</time>
|
||||||
|
<span>Опубликовал <b>{author}</b></span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class='heading'>
|
||||||
|
<h1>{title}</h1>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<figure>
|
||||||
|
<img
|
||||||
|
src='https://img.freepik.com/premium-photo/beautiful-emerald-lake-yoho-national-park-british-columbia-canada_131985-177.jpg?w=1920'
|
||||||
|
alt='Article Image'
|
||||||
|
/>
|
||||||
|
</figure>
|
||||||
|
</div>
|
||||||
|
</header>
|
||||||
|
<slot></slot>
|
||||||
|
<footer>
|
||||||
|
<h2>Comments</h2>
|
||||||
|
</footer>
|
||||||
|
</article>
|
||||||
78
src/components/ArticlePost/ArticlePost.scss
Normal file
78
src/components/ArticlePost/ArticlePost.scss
Normal file
@ -0,0 +1,78 @@
|
|||||||
|
.article {
|
||||||
|
& header {
|
||||||
|
& .meta {
|
||||||
|
display: flex;
|
||||||
|
justify-content: space-between;
|
||||||
|
align-items: flex-end;
|
||||||
|
column-gap: 5px;
|
||||||
|
|
||||||
|
& ul {
|
||||||
|
max-width: 350px;
|
||||||
|
}
|
||||||
|
|
||||||
|
& div {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
text-align: right;
|
||||||
|
white-space: nowrap;
|
||||||
|
& time {
|
||||||
|
text-transform: uppercase;
|
||||||
|
font-size: var(--font-size-sm);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
& .heading {
|
||||||
|
margin-top: 2rem;
|
||||||
|
|
||||||
|
& h1 {
|
||||||
|
font-weight: 600;
|
||||||
|
font-size: 2.25rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
& p {
|
||||||
|
font-size: 1.125rem;
|
||||||
|
line-height: var(--line-height-base);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
& figure {
|
||||||
|
margin: 0;
|
||||||
|
|
||||||
|
& img {
|
||||||
|
border-radius: var(--border-radius-md);
|
||||||
|
display: block;
|
||||||
|
margin: 0 auto;
|
||||||
|
max-width: 100%;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
& footer {
|
||||||
|
margin-top: 5rem;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@media screen and (max-width: 560px) {
|
||||||
|
.article {
|
||||||
|
& header {
|
||||||
|
& .heading h1 {
|
||||||
|
font-size: 2rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
& .meta {
|
||||||
|
flex-direction: column-reverse;
|
||||||
|
align-items: flex-start;
|
||||||
|
|
||||||
|
& ul {
|
||||||
|
max-width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
& div {
|
||||||
|
align-self: flex-end;
|
||||||
|
margin-bottom: 1.2rem;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
1
src/components/ArticlePost/index.ts
Normal file
1
src/components/ArticlePost/index.ts
Normal file
@ -0,0 +1 @@
|
|||||||
|
export { default } from './ArticlePost.astro';
|
||||||
@ -9,9 +9,9 @@ export interface Props {
|
|||||||
const { heading, description } = Astro.props as Props;
|
const { heading, description } = Astro.props as Props;
|
||||||
---
|
---
|
||||||
|
|
||||||
<header class='page-heading'>
|
<div class='page-heading'>
|
||||||
<h1 style={!description && 'margin-bottom: 2.5rem;'}>
|
<h1 style={!description && 'margin-bottom: 2.5rem;'}>
|
||||||
{heading}
|
{heading}
|
||||||
</h1>
|
</h1>
|
||||||
{description && <p>{description}</p>}
|
{description && <p>{description}</p>}
|
||||||
</header>
|
</div>
|
||||||
|
|||||||
@ -16,14 +16,12 @@ const recent = sortArtcilesByDate(articles);
|
|||||||
---
|
---
|
||||||
|
|
||||||
<section class='recent'>
|
<section class='recent'>
|
||||||
<div class='container'>
|
|
||||||
<div class='recent-heading'>
|
<div class='recent-heading'>
|
||||||
<h2>недавние публикации</h2>
|
<h2>недавние публикации</h2>
|
||||||
<a href='/articles'>смотреть все</a>
|
<a href='/articles'>смотреть все</a>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class='recent-list container'>
|
<div class='recent-list'>
|
||||||
{recent.length !== 0 ? (
|
{recent.length !== 0 ? (
|
||||||
recent.slice(0, length).map((article) => <ArticleItem data={article} />)
|
recent.slice(0, length).map((article) => <ArticleItem data={article} />)
|
||||||
) : (
|
) : (
|
||||||
|
|||||||
@ -2,6 +2,6 @@
|
|||||||
import './Splash.scss';
|
import './Splash.scss';
|
||||||
---
|
---
|
||||||
|
|
||||||
<section class='splash container'>
|
<section class='splash'>
|
||||||
<slot></slot>
|
<slot></slot>
|
||||||
</section>
|
</section>
|
||||||
|
|||||||
34
src/layouts/article.astro
Normal file
34
src/layouts/article.astro
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
---
|
||||||
|
import type { Props as BaseHeadProps } from '@root/components/BaseHead.astro';
|
||||||
|
import type { ArticleType } from '@root/types';
|
||||||
|
|
||||||
|
import '@styles/global.scss';
|
||||||
|
import BaseHead from '@root/components/BaseHead.astro';
|
||||||
|
import BaseLayout from '@components/BaseLayout';
|
||||||
|
import { DateFormatter } from '@root/utils';
|
||||||
|
import ArticleContent from '@root/components/ArticleContent';
|
||||||
|
import ArticlePost from '@root/components/ArticlePost';
|
||||||
|
|
||||||
|
export interface Props extends BaseHeadProps {
|
||||||
|
lang?: string | undefined;
|
||||||
|
content: ArticleType;
|
||||||
|
}
|
||||||
|
|
||||||
|
const { lang = 'ru', content } = Astro.props as Props;
|
||||||
|
---
|
||||||
|
|
||||||
|
<html lang={lang}>
|
||||||
|
<head>
|
||||||
|
<BaseHead title={content.title} />
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<BaseLayout>
|
||||||
|
<div class='container'>
|
||||||
|
<ArticlePost data={content}>
|
||||||
|
<ArticleContent>
|
||||||
|
<slot></slot>
|
||||||
|
</ArticleContent>
|
||||||
|
</ArticlePost>
|
||||||
|
</div>
|
||||||
|
</BaseLayout>
|
||||||
|
</html>
|
||||||
@ -5,20 +5,25 @@ import '@styles/global.scss';
|
|||||||
import BaseHead from '@root/components/BaseHead.astro';
|
import BaseHead from '@root/components/BaseHead.astro';
|
||||||
import BaseLayout from '@components/BaseLayout';
|
import BaseLayout from '@components/BaseLayout';
|
||||||
import { SITE_METADATA } from '@root/config';
|
import { SITE_METADATA } from '@root/config';
|
||||||
|
import PageHeading from '@root/components/PageHeading';
|
||||||
|
|
||||||
export interface Props extends BaseHeadProps {
|
export interface Props extends BaseHeadProps {
|
||||||
lang?: string | undefined;
|
lang?: string | undefined;
|
||||||
|
showPageHeading?: boolean | undefined;
|
||||||
}
|
}
|
||||||
|
|
||||||
const { title = SITE_METADATA.title, description, lang = 'ru' } = Astro.props as Props;
|
const { title, description, lang = 'ru', showPageHeading = true } = Astro.props as Props;
|
||||||
---
|
---
|
||||||
|
|
||||||
<html lang={lang}>
|
<html lang={lang}>
|
||||||
<head>
|
<head>
|
||||||
<BaseHead title={title} description={description} />
|
<BaseHead title={title ? `${title} | ${SITE_METADATA.title}` : SITE_METADATA.title} description={description} />
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<BaseLayout>
|
<BaseLayout>
|
||||||
|
<div class='container'>
|
||||||
|
{showPageHeading && <PageHeading heading={title} description={description} />}
|
||||||
<slot></slot>
|
<slot></slot>
|
||||||
|
</div>
|
||||||
</BaseLayout>
|
</BaseLayout>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
@ -1,44 +1,21 @@
|
|||||||
---
|
---
|
||||||
import '@root/styles/prism-one-light.css';
|
import '@root/styles/prism-one-light.css';
|
||||||
import PageLayout from '@root/layouts/default.astro';
|
import ArticleLayout from '@root/layouts/article.astro';
|
||||||
import { Markdown } from 'astro/components';
|
import { Markdown } from 'astro/components';
|
||||||
import ArticleContent from '@components/ArticleContent';
|
|
||||||
|
|
||||||
export function getStaticPaths() {
|
export function getStaticPaths() {
|
||||||
return [{ params: { article: 'article' } }];
|
return [{ params: { article: 'article' } }];
|
||||||
}
|
}
|
||||||
---
|
---
|
||||||
|
|
||||||
<PageLayout title='Article'>
|
<ArticleLayout
|
||||||
<article class='article container'>
|
content={{
|
||||||
<header>
|
title: 'Lorem ipsum dolor sit amet, consectetur adipiscing elit.',
|
||||||
<div class='meta'>
|
author: 'Sergey Yarkov',
|
||||||
<ul class='list-links'>
|
tags: ['AVR', 'JavaScript', 'NodeJS'],
|
||||||
<li><a class='btn-link' href='#'>JavaScript</a></li>
|
published_at: new Date().toISOString(),
|
||||||
<li><a class='btn-link' href='#'>Docker</a></li>
|
}}
|
||||||
<li><a class='btn-link' href='#'>Node.js</a></li>
|
>
|
||||||
<li><a class='btn-link' href='#'>AVR</a></li>
|
|
||||||
<li><a class='btn-link' href='#'>GraphQL</a></li>
|
|
||||||
<li><a class='btn-link' href='#'>Web-development</a></li>
|
|
||||||
</ul>
|
|
||||||
<div>
|
|
||||||
<time datetime='2022-01-01'> 19 ЯНВ, 2022</time>
|
|
||||||
<span>Опубликовал <b>Sergey Yarkov</b></span>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class='heading'>
|
|
||||||
<h1>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</h1>
|
|
||||||
</div>
|
|
||||||
<div>
|
|
||||||
<figure>
|
|
||||||
<img
|
|
||||||
src='https://img.freepik.com/premium-photo/beautiful-emerald-lake-yoho-national-park-british-columbia-canada_131985-177.jpg?w=1920'
|
|
||||||
alt='Article Image'
|
|
||||||
/>
|
|
||||||
</figure>
|
|
||||||
</div>
|
|
||||||
</header>
|
|
||||||
<ArticleContent>
|
|
||||||
<Markdown>
|
<Markdown>
|
||||||
## Introduction
|
## Introduction
|
||||||
|
|
||||||
@ -100,83 +77,4 @@ export function getStaticPaths() {
|
|||||||
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam eu turpis molestie, dictum est a, mattis tellus.
|
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam eu turpis molestie, dictum est a, mattis tellus.
|
||||||
Sed dignissim, metus nec fringilla accumsan, risus sem sollicitudin lacus, ut interdum tellus elit sed risus.
|
Sed dignissim, metus nec fringilla accumsan, risus sem sollicitudin lacus, ut interdum tellus elit sed risus.
|
||||||
</Markdown>
|
</Markdown>
|
||||||
</ArticleContent>
|
</ArticleLayout>
|
||||||
<footer>
|
|
||||||
<h2>Comments</h2>
|
|
||||||
</footer>
|
|
||||||
</article>
|
|
||||||
<style lang='scss'>
|
|
||||||
.article {
|
|
||||||
& header {
|
|
||||||
& .meta {
|
|
||||||
display: flex;
|
|
||||||
justify-content: space-between;
|
|
||||||
align-items: flex-start;
|
|
||||||
column-gap: 5px;
|
|
||||||
& ul {
|
|
||||||
max-width: 350px;
|
|
||||||
}
|
|
||||||
|
|
||||||
& div {
|
|
||||||
display: flex;
|
|
||||||
flex-direction: column;
|
|
||||||
text-align: right;
|
|
||||||
white-space: nowrap;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
& .heading {
|
|
||||||
margin-top: 2rem;
|
|
||||||
|
|
||||||
& h1 {
|
|
||||||
font-weight: 600;
|
|
||||||
font-size: 2.25rem;
|
|
||||||
}
|
|
||||||
|
|
||||||
& p {
|
|
||||||
font-size: 1.125rem;
|
|
||||||
line-height: var(--line-height-base);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
& figure {
|
|
||||||
margin: 0;
|
|
||||||
|
|
||||||
& img {
|
|
||||||
border-radius: var(--border-radius-md);
|
|
||||||
display: block;
|
|
||||||
margin: 0 auto;
|
|
||||||
max-width: 100%;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
& footer {
|
|
||||||
margin-top: 5rem;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@media screen and (max-width: 560px) {
|
|
||||||
.article {
|
|
||||||
& header {
|
|
||||||
& .heading h1 {
|
|
||||||
font-size: 2rem;
|
|
||||||
}
|
|
||||||
|
|
||||||
& .meta {
|
|
||||||
flex-direction: column-reverse;
|
|
||||||
|
|
||||||
& ul {
|
|
||||||
max-width: 100%;
|
|
||||||
}
|
|
||||||
|
|
||||||
& div {
|
|
||||||
align-self: flex-end;
|
|
||||||
margin-bottom: 1.2rem;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
</PageLayout>
|
|
||||||
|
|||||||
@ -2,7 +2,6 @@
|
|||||||
import { SITE_METADATA } from '@root/config';
|
import { SITE_METADATA } from '@root/config';
|
||||||
import { Markdown } from 'astro/components';
|
import { Markdown } from 'astro/components';
|
||||||
import PageLayout from '@layouts/default.astro';
|
import PageLayout from '@layouts/default.astro';
|
||||||
import PageHeading from '@components/PageHeading';
|
|
||||||
import SkillsList from '@components/SkillsList';
|
import SkillsList from '@components/SkillsList';
|
||||||
import SkillsBlock from '@components/SkillsBlock';
|
import SkillsBlock from '@components/SkillsBlock';
|
||||||
|
|
||||||
@ -13,9 +12,8 @@ import ArticleContent from '@components/ArticleContent';
|
|||||||
const { skills } = SITE_METADATA;
|
const { skills } = SITE_METADATA;
|
||||||
---
|
---
|
||||||
|
|
||||||
<PageLayout title='Обо мне | Sergey Yarkov'>
|
<PageLayout title='Обо мне'>
|
||||||
<section class='container'>
|
<section>
|
||||||
<PageHeading heading='Обо мне' />
|
|
||||||
<ArticleContent>
|
<ArticleContent>
|
||||||
<Markdown content={aboutContent.rawContent()}>
|
<Markdown content={aboutContent.rawContent()}>
|
||||||
|
|
||||||
|
|||||||
@ -1,6 +1,5 @@
|
|||||||
---
|
---
|
||||||
import PageLayout from '@layouts/default.astro';
|
import PageLayout from '@layouts/default.astro';
|
||||||
import { ArticlesList } from '@components/ArticlesList';
|
|
||||||
import { ArticleType } from '@root/types';
|
import { ArticleType } from '@root/types';
|
||||||
import * as utils from '@utils/index';
|
import * as utils from '@utils/index';
|
||||||
|
|
||||||
@ -8,6 +7,9 @@ const articles = await Astro.glob<ArticleType>('../../content/articles/**/*.md')
|
|||||||
const tags = new Set(articles.map((article) => article.frontmatter.tags).flat());
|
const tags = new Set(articles.map((article) => article.frontmatter.tags).flat());
|
||||||
---
|
---
|
||||||
|
|
||||||
<PageLayout title='Статьи | Sergey Yarkov'>
|
<PageLayout
|
||||||
|
title='Статьи'
|
||||||
|
description='Технические статьи, туториалы и различные справочные материалы которые связаны с IT тематикой находятся здесь.'
|
||||||
|
>
|
||||||
<!-- <ArticlesList client:load data={utils.transformArticles(articles)} tags={[...tags]} /> -->
|
<!-- <ArticlesList client:load data={utils.transformArticles(articles)} tags={[...tags]} /> -->
|
||||||
</PageLayout>
|
</PageLayout>
|
||||||
|
|||||||
@ -5,9 +5,8 @@ import ContactForm from '@components/ContactForm';
|
|||||||
import ContactsList from '@components/ContactsList';
|
import ContactsList from '@components/ContactsList';
|
||||||
---
|
---
|
||||||
|
|
||||||
<PageLayout title='Контакты | Sergey Yarkov'>
|
<PageLayout title='Контакты' description='Воспользуйтесь формой обратной связи или напишите мне в социальные сети.'>
|
||||||
<section class='container'>
|
<section>
|
||||||
<PageHeading heading='Контакты' description='Воспользуйтесь формой обратной связи или напишите мне в социальные сети.' />
|
|
||||||
<ContactForm client:idle />
|
<ContactForm client:idle />
|
||||||
<ContactsList />
|
<ContactsList />
|
||||||
</section>
|
</section>
|
||||||
|
|||||||
@ -10,7 +10,7 @@ const data = await Astro.glob<ArticleType>('../../content/articles/**/*.md');
|
|||||||
const articles = utils.transformArticles(data);
|
const articles = utils.transformArticles(data);
|
||||||
---
|
---
|
||||||
|
|
||||||
<PageLayout>
|
<PageLayout showPageHeading={false}>
|
||||||
<Splash>
|
<Splash>
|
||||||
<SplashHeading>
|
<SplashHeading>
|
||||||
<hgroup>
|
<hgroup>
|
||||||
@ -24,6 +24,5 @@ const articles = utils.transformArticles(data);
|
|||||||
<Link icon='email_filled' href='/about'>написать мне</Link>
|
<Link icon='email_filled' href='/about'>написать мне</Link>
|
||||||
</SplashLinks>
|
</SplashLinks>
|
||||||
</Splash>
|
</Splash>
|
||||||
|
|
||||||
<RecentArticles articles={articles} length={4} />
|
<RecentArticles articles={articles} length={4} />
|
||||||
</PageLayout>
|
</PageLayout>
|
||||||
|
|||||||
@ -1,16 +1,14 @@
|
|||||||
---
|
---
|
||||||
import { SITE_METADATA } from '@root/config';
|
import { SITE_METADATA } from '@root/config';
|
||||||
import PageLayout from '@layouts/default.astro';
|
import PageLayout from '@layouts/default.astro';
|
||||||
import PageHeading from '@root/components/PageHeading';
|
import ProjectsList from '@components/ProjectsList';
|
||||||
import ProjectsList from '@root/components/ProjectsList';
|
import ProjectItem from '@components/ProjectItem';
|
||||||
import ProjectItem from '@root/components/ProjectItem';
|
|
||||||
|
|
||||||
const { projects } = SITE_METADATA;
|
const { projects } = SITE_METADATA;
|
||||||
---
|
---
|
||||||
|
|
||||||
<PageLayout title='Проекты | Sergey Yarkov'>
|
<PageLayout title='Проекты' description='Несколько моих основных проектов которые были разработаны и выложены в открытый доступ.'>
|
||||||
<section class='container'>
|
<section>
|
||||||
<PageHeading heading='Проекты' description='Несколько моих основных проектов которые были разработаны и выложены в открытый доступ.' />
|
|
||||||
<ProjectsList>
|
<ProjectsList>
|
||||||
{projects.map((project) => <ProjectItem data={project} />)}
|
{projects.map((project) => <ProjectItem data={project} />)}
|
||||||
</ProjectsList>
|
</ProjectsList>
|
||||||
|
|||||||
@ -2,7 +2,7 @@ export type ArticleType = {
|
|||||||
title: string;
|
title: string;
|
||||||
author: string;
|
author: string;
|
||||||
tags: Array<string>;
|
tags: Array<string>;
|
||||||
published_at: number;
|
published_at: string;
|
||||||
};
|
};
|
||||||
|
|
||||||
export type ProjectType = {
|
export type ProjectType = {
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user