diff --git a/src/assets/favorites/books/book-2.jpeg b/src/assets/favorites/books/book-2.jpeg deleted file mode 100644 index fab0cf6..0000000 Binary files a/src/assets/favorites/books/book-2.jpeg and /dev/null differ diff --git a/src/assets/favorites/books/book-2.jpg b/src/assets/favorites/books/book-2.jpg new file mode 100644 index 0000000..9eaf279 Binary files /dev/null and b/src/assets/favorites/books/book-2.jpg differ diff --git a/src/data/config.ts b/src/data/config.ts index 463b18c..b0816fa 100644 --- a/src/data/config.ts +++ b/src/data/config.ts @@ -10,7 +10,7 @@ const config = { now: 'now', }, }, - seo: { + meta: { title: 'Mark Freeman - Senior React Developer', description: 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. In sodales ac dui at vestibulum. In condimentum metus id dui tincidunt, in blandit mi vehicula.', diff --git a/src/data/sections/favorites-section.data.ts b/src/data/sections/favorites-section.data.ts index 503869f..bddc896 100644 --- a/src/data/sections/favorites-section.data.ts +++ b/src/data/sections/favorites-section.data.ts @@ -18,7 +18,7 @@ const favoritesSectionData = { url: 'https://www.goodreads.com/book/show/4099.The_Pragmatic_Programmer', }, { - image: 'https://m.media-amazon.com/images/I/61aFldsgAmL._SY344_BO1,204,203,200_QL70_ML2_.jpg', + image: import('@/assets/favorites/books/book-2.jpg'), title: 'Domain-Driven Design: Tackling Complexity in the Heart of Software', author: 'Eric Evans', url: 'https://www.goodreads.com/book/show/179133.Domain_Driven_Design', diff --git a/src/types/config/i18n-config.types.ts b/src/types/config/i18n-config.types.ts index a90540d..0e2ce80 100644 --- a/src/types/config/i18n-config.types.ts +++ b/src/types/config/i18n-config.types.ts @@ -1,9 +1,23 @@ import type { Locale } from 'date-fns'; export interface I18nConfig { + /** + * Language code used for date formatting, translations, and value of the page `lang` attribute. + */ locale: Locale; + + /** + * Date format used when displaying date ranges in some sections. + */ dateFormat: string; + + /** + * List of translations used in the application. + */ translations: { + /** + * Used in date ranges to represent the current date. + */ now: string; }; } diff --git a/src/types/config/meta-config.types.ts b/src/types/config/meta-config.types.ts new file mode 100644 index 0000000..5cff761 --- /dev/null +++ b/src/types/config/meta-config.types.ts @@ -0,0 +1,55 @@ +export interface MetaConfig { + /** + * [WEB] Page title. + * + * Displayed as browser tab title and in search results. + * It's recommended to keep it between 30 and 60 characters. + * + * @see https://www.screamingfrog.co.uk/learn-seo/page-title + */ + title: string; + + /** + * [WEB] Page description. + * + * Displayed under the title in search results. + * It's recommended to keep it between 70 and 155 characters. + * + * @see https://www.screamingfrog.co.uk/learn-seo/meta-description + */ + description: string; + + /** + * [WEB] URL or path to the page's favicon. + * + * Specified icon will be displayed next to the page title in browser tab. + */ + favicon: string; + + /** + * [WEB] Title used in open graph links. + * + * If not specified, the title property will be used. + * + * @see https://ahrefs.com/blog/open-graph-meta-tags + */ + ogTitle?: string; + + /** + * [WEB] Description used in open graph links. + * + * If not specified, the description property will be used. + * + * @see https://ahrefs.com/blog/open-graph-meta-tags + */ + ogDescription?: string; + + /** + * [WEB] Image used in open graph links. + * + * It's recommended to keep it between 30 and 60 characters. + * + * @see https://ahrefs.com/blog/open-graph-meta-tags + */ + ogImage?: string; +} diff --git a/src/types/config/pdf-config.types.ts b/src/types/config/pdf-config.types.ts index 9112955..f1cf9f3 100644 --- a/src/types/config/pdf-config.types.ts +++ b/src/types/config/pdf-config.types.ts @@ -1,3 +1,8 @@ export interface PdfConfig { + /** + * [PDF] Displays footer with specified content on each PDF page. + * + * You can use it to add the data processing clause. + */ footer?: string; } diff --git a/src/types/config/seo-config.types.ts b/src/types/config/seo-config.types.ts deleted file mode 100644 index d1a7be8..0000000 --- a/src/types/config/seo-config.types.ts +++ /dev/null @@ -1,8 +0,0 @@ -export interface SeoConfig { - title: string; - description: string; - favicon: string; - ogTitle?: string; - ogDescription?: string; - ogImage?: string; -} diff --git a/src/types/data.ts b/src/types/data.ts index b42d387..5dbfd77 100644 --- a/src/types/data.ts +++ b/src/types/data.ts @@ -1,6 +1,6 @@ import type { I18nConfig } from './config/i18n-config.types'; import type { PdfConfig } from './config/pdf-config.types'; -import type { SeoConfig } from './config/seo-config.types'; +import type { MetaConfig } from './config/meta-config.types'; import type { EducationSection } from './sections/education-section.types'; import type { ExperienceSection } from './sections/experience-section.types'; import type { FavoritesSection } from './sections/favorites-section.types'; @@ -10,22 +10,70 @@ import type { SkillsSection } from './sections/skills-section.types'; import type { TestimonialsSection } from './sections/testimonials-section.types'; export interface Config { - seo: SeoConfig; + /** + * [WEB] Page metadata used for SEO and social media sharing. + */ + meta: MetaConfig; + + /** + * Language and date display configuration. + */ i18n: I18nConfig; + + /** + * [PDF] Configuration of the pdf generation. + */ pdf?: PdfConfig; } export interface Sections { + /** + * Basic information about you. + */ main: MainSection; + + /** + * Grouped lists of your skills. + */ skills: SkillsSection; + + /** + * Your employment history. + */ experience: ExperienceSection; + + /** + * Your projects and initiatives. + */ portfolio: PortfolioSection; + + /** + * Your education degrees and certifications. + */ education: EducationSection; + + /** + * [WEB] Recommendations from your previous employers and people you worked with. + */ testimonials: TestimonialsSection; + + /** + * [WEB] List of sources you use to gain knowledge and inspiration. + */ favorites: FavoritesSection; } +/** + * All data used to generate the cv. + */ export interface Data { + /** + * Global configuration of the web and pdf versions of the cv. + */ config: Config; + + /** + * Configurations for the particular sections of the cv. + */ sections: Sections; } diff --git a/src/types/sections/education-section.types.ts b/src/types/sections/education-section.types.ts index d08f836..3c41207 100644 --- a/src/types/sections/education-section.types.ts +++ b/src/types/sections/education-section.types.ts @@ -1,13 +1,35 @@ import type { DateRange, Description, LinkButton, Section } from '../shared'; export interface Diploma { + /** + * Name of the certificate or the degree you got. + */ title: string; + + /** + * Name of the institution that issued the certificate or degree. + */ institution: string; + + /** + * Date range when you were studying in the institution. + */ dates: DateRange; + + /** + * A short overview of your studies. You can write it as a paragraph (string) or as a list of bullet points (string[]). + */ description: Description; + + /** + * [WEB] Links related to your studies (e.g. course/university website, link to realized project). + */ links: LinkButton[]; } export interface EducationSection extends Section { + /** + * List of your diplomas, certificates, .etc. Start with the most recent one. + */ diplomas: Diploma[]; } diff --git a/src/types/sections/experience-section.types.ts b/src/types/sections/experience-section.types.ts index b1bb4cc..37c7726 100644 --- a/src/types/sections/experience-section.types.ts +++ b/src/types/sections/experience-section.types.ts @@ -1,14 +1,41 @@ import type { DateRange, Description, LinkButton, Section, TagsList } from '../shared'; export interface Job { + /** + * Your position in the company. + */ role: string; + + /** + * Name of the company. + */ company: string; + + /** + * Date range when you were working in the company. + */ dates: DateRange; + + /** + * A short overview of your job. You can write it as a paragraph (string) or as a list of bullet points (string[]). + */ description: Description; + + /** + * Any information that you want to highlight. + * We recommend to describe the technologies used in the project. + */ tagsList: TagsList; + + /** + * [WEB] Links related to your job (e.g. production app, company's website, project website). + */ links: LinkButton[]; } export interface ExperienceSection extends Section { + /** + * List of your jobs in a chronological order. Start with the most recent one. + */ jobs: Job[]; } diff --git a/src/types/sections/favorites-section.types.ts b/src/types/sections/favorites-section.types.ts index 5351c0c..904a6a9 100644 --- a/src/types/sections/favorites-section.types.ts +++ b/src/types/sections/favorites-section.types.ts @@ -1,39 +1,129 @@ import type { Photo, Section } from '../shared'; export interface Book { + /** + * [WEB] Book title. + */ title: string; + + /** + * [WEB] Book cover. + * + * **Ratio**: 3:4 + * + * **Display size**: 300x400px + */ image: Photo; + + /** + * [WEB] Full name of the book author. + */ author: string; + + /** + * [WEB] Website to buy the book or read more about it. + */ url: string; } export interface Person { + /** + * [WEB] Full name of the person. + */ name: string; + + /** + * [WEB] Photo of the person. + * + * **Ratio**: 1:1 + * + * **Display size**: 200x200px + */ image: Photo; + + /** + * [WEB] Main website related to the person. + */ url?: string; } export interface Video { + /** + * [WEB] Title of the video. + */ title: string; + + /** + * [WEB] Thumbnail of the video. + * + * **Ratio**: 16:9 + * + * **Display size**: 448x252px + */ image: Photo; + + /** + * [WEB] Link to the video. + */ url: string; } export interface Media { + /** + * [WEB] Title of the media. + */ title: string; + + /** + * [WEB] Type of the media (e.g. podcast, blog, newsletter, YouTube channel, .etc). + */ type: string; + + /** + * [WEB] Logo of the media. + * + * **Ratio**: 1:1 + * + * **Display size**: 200x200px + */ image: Photo; + + /** + * [WEB] URL to the main website related to the media. + */ url: string; } export interface SubSection { + /** + * [WEB] Title that will be displayed above the list of items. + */ title: string; + + /** + * [WEB] List of items to display within the subsection. + */ data: Data[]; } export interface FavoritesSection extends Section { + /** + * [WEB] List of your favorite books. + */ books?: SubSection; + + /** + * [WEB] List of the people that inspire you. + */ people?: SubSection; + + /** + * [WEB] List of the videos you learned the most from. + */ videos?: SubSection