import { NextPage } from 'next'; import { AppProps } from 'next/app'; import { ReactElement, ReactNode } from 'react'; export type NextPageWithLayoutOptions = { withExtraPadding?: boolean; isHome?: boolean; useGrid?: boolean; }; export type NextPageWithLayout = NextPage & { getLayout?: ( page: ReactElement, options: NextPageWithLayoutOptions ) => ReactNode; }; export type AppPropsWithLayout = AppProps & { Component: NextPageWithLayout; }; export type ContentKind = | 'article' | 'comment' | 'page' | 'project' | 'thematic' | 'topic'; export type Author = { avatar?: Image; description?: T extends 'comment' ? never : string; name: string; website?: string; }; export type CommentMeta = { author: Author<'comment'>; date: string; }; export type SingleComment = { approved: boolean; content: string; id: number; meta: CommentMeta; parentId?: number; replies: SingleComment[]; }; export type Dates = { publication: string; update?: string; }; export type Image = { alt: string; height: number; src: string; title?: string; width: number; }; export type Repos = { github?: string; gitlab?: string; }; export type SEO = { description: string; title: string; }; export type PageKind = Exclude; export type Meta = { articles?: T extends 'thematic' | 'topic' ? Article[] : never; author?: T extends 'article' | 'page' ? Author : never; commentsCount?: T extends 'article' ? number : never; cover?: Image; dates: Dates; license?: T extends 'project' ? string : never; repos?: T extends 'project' ? Repos : never; seo: SEO; tagline?: T extends 'project' ? string : never; technologies?: T extends 'project' ? string[] : never; thematics?: T extends 'article' | 'topic' ? PageLink[] : never; topics?: T extends 'article' | 'thematic' ? PageLink[] : never; website?: T extends 'topic' ? string : never; wordsCount: number; }; export type Page = { content: string; id: number | string; intro: string; meta: Meta; slug: string; title: string; }; export type PageLink = { id: number; logo?: Image; name: string; url: string; }; export type Article = Page<'article'>; export type ArticleCard = Pick & Pick, 'cover' | 'dates'>; export type Project = Page<'project'>; export type ProjectPreview = Omit, 'content'>; export type ProjectCard = Pick, 'id' | 'slug' | 'title'> & { meta: Pick, 'cover' | 'dates' | 'tagline' | 'technologies'>; }; export type Thematic = Page<'thematic'>; export type Topic = Page<'topic'>; export type Slug = { slug: string; };