aboutsummaryrefslogtreecommitdiffstats
path: root/src/ts/types/app.ts
blob: f35411893337f2351436b4b5923675d522b45197 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
pre { line-height: 125%; }
td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }
span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }
td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
.highlight .hll { background-color: #ffffcc }
.highlight .c { color: #888888 } /* Comment */
.highlight .err { color: #a61717; background-color: #e3d2d2 } /* Error */
.highlight .k { color: #008800; font-weight: bold } /* Keyword */
.highlight .ch { color: #888888 } /* Comment.Hashbang */
.highlight .cm { color: #888888 } /* Comment.Multiline */
.highlight .cp { color: #cc0000; font-weight: bold } /* Comment.Preproc */
.highlight .cpf { color: #888888 } /* Comment.PreprocFile */
.highlight .c1 { color: #888888 } /* Comment.Single */
.highlight .cs { color: #cc0000; font-weight: bold; background-color: #fff0f0 } /* Comment.Special */
.highlight .gd { color: #000000; background-color: #ffdddd } /* Generic.Deleted */
.highlight .ge { font-style: italic } /* Generic.Emph */
.highlight .gr { color: #aa0000 } /* Generic.Error */
.highlight .gh { color: #333333 } /* Generic.Heading */
.highlight .gi { color: #000000; background-color: #ddffdd } /* Generic.Inserted */
.highlight .go { color: #888888 } /* Generic.Output */
.highlight .gp { color: #555555 } /* Generic.Prompt */
.highlight .gs { font-weight: bold } /* Generic.Strong */
.highlight .gu { color: #666666 } /* Generic.Subheading */
.highlight .gt { color: #aa0000 } /* Generic.Traceback */
.highlight .kc { color: #008800; font-weight: bold } /* Keyword.Constant */
.highlight .kd { color: #008800; font-weight: bold } /* Keyword.Declaration */
.highlight .kn { color: #008800; font-weight: bold } /* Keyword.Namespace */
.highlight .kp { color: #008800 } /* Keyword.Pseudo */
.highlight .kr { color: #008800; font-weight: bold } /* Keyword.Reserved */
.highlight .kt { color: #888888; font-weight: bold } /* Keyword.Type */
.highlight .m { color: #0000DD; font-weight: bold } /* Literal.Number */
.highlight .s { color: #dd2200; background-color: #fff0f0 } /* Literal.String */
.highlight .na { color: #336699 } /* Name.Attribute */
.highlight .nb { color: #003388 } /* Name.Builtin */
.highlight .nc { color: #bb0066; font-weight: bold } /* Name.Class */
.highlight .no { color: #003366; font-weight: bold } /* Name.Constant */
.highlight .n
export type ContentKind =
  | 'article'
  | 'comment'
  | 'page'
  | 'project'
  | 'thematic'
  | 'topic';

export type Author<T extends ContentKind> = {
  avatar?: Image;
  description?: T extends 'comment' ? never : string;
  name: string;
  website?: string;
};

export type CommentMeta = {
  author: Author<'comment'>;
  date: string;
};

export type Comment = {
  approved: boolean;
  content: string;
  id: number;
  meta: CommentMeta;
  parentId: number;
  replies: Comment[];
};

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<ContentKind, 'comment'>;

export type Meta<T extends PageKind> = {
  articles?: T extends 'thematic' | 'topic' ? Article[] : never;
  author?: T extends 'article' | 'page' ? Author<T> : never;
  commentsCount?: T extends 'article' ? number : never;
  cover?: Image;
  dates: Dates;
  license?: T extends 'project' ? string : never;
  readingTime?: number;
  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<T extends PageKind> = {
  content: string;
  id: number | string;
  intro: string;
  meta: Meta<T>;
  slug: string;
  title: string;
};

export type PageLink = {
  id: number;
  name: string;
  slug: string;
};

export type Article = Page<'article'>;
export type ArticleCard = Pick<Article, 'id' | 'slug' | 'title'> &
  Pick<Meta<'article'>, 'cover' | 'dates'>;
export type Project = Page<'project'>;
export type ProjectPreview = Omit<Page<'project'>, 'content'>;
export type ProjectCard = Pick<Page<'project'>, 'id' | 'slug' | 'title'> & {
  meta: Pick<Meta<'project'>, 'cover' | 'dates' | 'tagline' | 'technologies'>;
};
export type Thematic = Page<'thematic'>;
export type Topic = Page<'topic'>;

export type Slug = {
  slug: string;
};