CtrlK
BlogDocsLog inGet started
Tessl Logo

tessl/npm-docusaurus--theme-classic

Classic theme for Docusaurus static site generator providing comprehensive React component library for documentation sites

Pending

Quality

Pending

Does it follow best practices?

Impact

Pending

No eval scenarios have been run

Overview
Eval results
Files

blog-components.mddocs/

Blog Components

Comprehensive blog system including blog layout, post items, author components, pagination, and blog-specific navigation for content management and display.

Capabilities

Blog Layout

Main layout component for blog sections and pages.

/**
 * Blog section layout component
 * @param props - Blog layout props
 * @returns Blog layout with sidebar and content
 */
function BlogLayout(props: BlogLayoutProps): ReactNode;

interface BlogLayoutProps {
  readonly children?: ReactNode;
  readonly sidebar?: BlogSidebar;
  readonly toc?: ReactNode;
  readonly title?: string;
  readonly description?: string;
  readonly noFooter?: boolean;
  readonly wrapperClassName?: string;
}

Blog Pages

Components for different blog page types.

/**
 * Blog list page showing recent posts
 * @returns Blog post list with pagination
 */
function BlogListPage(): ReactNode;

/**
 * Blog archive page with chronological organization
 * @returns Organized blog archive
 */
function BlogArchivePage(): ReactNode;

/**
 * Blog tags list page
 * @returns List of all blog tags
 */
function BlogTagsListPage(): ReactNode;

/**
 * Blog posts filtered by tag
 * @returns Tag-filtered blog posts
 */
function BlogTagsPostsPage(): ReactNode;

/**
 * Blog authors list page
 * @returns List of blog authors
 */
function BlogAuthorsListPage(): ReactNode;

/**
 * Blog posts by specific author
 * @returns Author's blog posts
 */
function BlogAuthorsPostsPage(): ReactNode;

Blog List Page Structured Data

SEO structured data for blog listings.

/**
 * Structured data for blog list pages
 * @returns JSON-LD structured data for SEO
 */
function BlogListPageStructuredData(): ReactNode;

Blog Post Components

Components for individual blog posts and their structure.

/**
 * Individual blog post page wrapper
 * @returns Complete blog post page
 */
function BlogPostPage(): ReactNode;

/**
 * Blog post item component
 * @param props - Post item props
 * @returns Blog post item element
 */
function BlogPostItem(props: BlogPostItemProps): ReactNode;

interface BlogPostItemProps {
  children: ReactNode;
  className?: string;
}

/**
 * Collection of blog post items
 * @param props - Post items props
 * @returns List of blog post items
 */
function BlogPostItems(props: BlogPostItemsProps): ReactNode;

interface BlogPostItemsProps {
  items: readonly {content: PropBlogPostContent}[];
  component?: ComponentType<{children: ReactNode}>;
}

Blog Post Structure

Sub-components for blog post structure and layout.

/**
 * Blog post item container
 * @param props - Container props
 * @returns Post item wrapper
 */
function BlogPostItemContainer(props: BlogPostItemContainerProps): ReactNode;

interface BlogPostItemContainerProps {
  children: ReactNode;
  className?: string;
}

/**
 * Blog post content wrapper
 * @param props - Content props
 * @returns Post content container
 */
function BlogPostItemContent(props: BlogPostItemContentProps): ReactNode;

interface BlogPostItemContentProps {
  children: ReactNode;
  className?: string;
}

Blog Post Header

Header components for blog posts including title, metadata, and authors.

/**
 * Blog post header section
 * @returns Post header with title and metadata
 */
function BlogPostItemHeader(): ReactNode;

/**
 * Blog post title component
 * @param props - Title props
 * @returns Post title element
 */
function BlogPostItemHeaderTitle(props: BlogPostItemHeaderTitleProps): ReactNode;

interface BlogPostItemHeaderTitleProps {
  className?: string;
}

/**
 * Blog post metadata info
 * @param props - Info props
 * @returns Post metadata (date, reading time, etc.)
 */
function BlogPostItemHeaderInfo(props: BlogPostItemHeaderInfoProps): ReactNode;

interface BlogPostItemHeaderInfoProps {
  className?: string;
}

/**
 * Blog post authors section
 * @param props - Authors props
 * @returns Post authors list
 */
function BlogPostItemHeaderAuthors(props: BlogPostItemHeaderAuthorsProps): ReactNode;

interface BlogPostItemHeaderAuthorsProps {
  readonly className?: string;
}

Blog Post Footer

Footer components for blog posts.

/**
 * Blog post footer section
 * @returns Post footer with additional info or null
 */
function BlogPostItemFooter(): ReactNode | null;

/**
 * Read more link for blog post excerpts
 * @param props - Read more link props
 * @returns Read more link or null
 */
function BlogPostItemFooterReadMoreLink(props: ReadMoreLinkProps): ReactNode | null;

interface ReadMoreLinkProps {
  blogPostTitle: string;
  to: string;
  className?: string;
  children?: ReactNode;
}

Blog Post Page Components

Components specific to individual blog post pages.

/**
 * Blog post page metadata for SEO
 * @returns Blog post metadata elements
 */
function BlogPostPageMetadata(): ReactNode;

/**
 * Blog post page structured data
 * @returns JSON-LD structured data for blog posts
 */
function BlogPostPageStructuredData(): ReactNode;

Blog Author Components

Components for displaying and managing blog authors.

/**
 * Blog author component
 * @param props - Author props
 * @returns Author information display
 */
function BlogAuthor(props: BlogAuthorProps): ReactNode;

interface BlogAuthorProps {
  readonly as?: 'h1' | 'h2';
  readonly author: Author;
  readonly className?: string;
  readonly count?: number;
}

/**
 * Blog author social links
 * @param props - Author socials props
 * @returns Author social media links
 */
function BlogAuthorSocials(props: BlogAuthorSocialsProps): ReactNode;

interface BlogAuthorSocialsProps {
  readonly author: Author;
  readonly className?: string;
}

Blog Sidebar

Sidebar navigation components for blog sections.

/**
 * Blog sidebar component
 * @param props - Blog sidebar props
 * @returns Blog navigation sidebar or null
 */
function BlogSidebar(props: BlogSidebarProps): ReactNode;

interface BlogSidebarProps {
  readonly sidebar?: BlogSidebar;
}

Blog Sidebar Platform Variants

Desktop and mobile versions of the blog sidebar.

/**
 * Desktop blog sidebar
 * @param props - Desktop sidebar props
 * @returns Desktop blog sidebar
 */
function BlogSidebarDesktop(props: BlogSidebarDesktopProps): ReactNode;

interface BlogSidebarDesktopProps {
  readonly sidebar: BlogSidebar;
}

/**
 * Mobile blog sidebar
 * @param props - Mobile sidebar props
 * @returns Mobile blog sidebar
 */
function BlogSidebarMobile(props: BlogSidebarMobileProps): ReactNode;

interface BlogSidebarMobileProps {
  readonly sidebar: BlogSidebar;
}

Blog Sidebar Content

Content component for blog sidebar.

/**
 * Blog sidebar content
 * @param props - Sidebar content props
 * @returns Sidebar content with navigation items
 */
function BlogSidebarContent(props: BlogSidebarContentProps): ReactNode;

interface BlogSidebarContentProps {
  readonly items: BlogSidebarItem[];
  readonly ListComponent: ComponentType<{items: BlogSidebarItem[]}>;
  readonly yearGroupHeadingClassName?: string;
}

Blog Pagination

Pagination components for blog navigation.

/**
 * Blog list paginator for post lists
 * @param props - List paginator props
 * @returns Blog list pagination
 */
function BlogListPaginator(props: BlogListPaginatorProps): ReactNode;

interface BlogListPaginatorProps {
  readonly metadata: BlogPaginatedMetadata;
}

/**
 * Blog post paginator for prev/next navigation
 * @param props - Post paginator props
 * @returns Blog post navigation
 */
function BlogPostPaginator(props: BlogPostPaginatorProps): ReactNode;

interface BlogPostPaginatorProps {
  readonly nextItem?: BlogNavigationItem;
  readonly prevItem?: BlogNavigationItem;
}

Type Definitions

// Blog author information
interface Author {
  name?: string;
  title?: string;
  url?: string;  
  imageURL?: string;
  email?: string;
  page?: string;
  socials?: {
    [platform: string]: string;
  };
}

// Blog sidebar structure
interface BlogSidebar {
  title: string;
  items: BlogSidebarItem[];
}

interface BlogSidebarItem {
  title: string;
  permalink: string;
  unlisted?: boolean;
  date: Date;
}

// Blog post content
interface PropBlogPostContent {
  metadata: BlogPostMetadata;
  contentTitle?: string;
}

interface BlogPostMetadata {
  permalink: string;
  title: string;
  description?: string;
  date: Date;
  formattedDate: string;
  readingTime?: number;
  hasTruncateMarker: boolean;
  authors: Author[];
  tags: Tag[];
  unlisted: boolean;
  frontMatter: BlogPostFrontMatter;
}

interface BlogPostFrontMatter {
  title?: string;
  description?: string;
  slug?: string;
  authors?: (string | Author)[];
  tags?: (string | Tag)[];
  hide_reading_time?: boolean;
  hide_table_of_contents?: boolean;
  toc_min_heading_level?: number;
  toc_max_heading_level?: number;
  keywords?: string[];
  image?: string;
  draft?: boolean;
  unlisted?: boolean;
  date?: Date | string;
}

// Blog pagination
interface BlogPaginatedMetadata {
  totalCount: number;
  currentPage: number;
  totalPages: number;
  blogTitle: string;
  blogDescription?: string;
  nextPage?: string;
  previousPage?: string;
}

// Blog navigation
interface BlogNavigationItem {
  readonly title: string;
  readonly permalink: string;
}

// Tags
interface Tag {
  label: string;
  permalink: string;
  count?: number;
}

Usage Examples

Custom Blog Post Item

import React from 'react';
import BlogPostItem from '@theme/BlogPostItem';
import BlogPostItemContainer from '@theme/BlogPostItem/Container';
import BlogPostItemHeader from '@theme/BlogPostItem/Header';
import BlogPostItemContent from '@theme/BlogPostItem/Content';

export default function CustomBlogPostItem({children, ...props}) {
  return (
    <BlogPostItem {...props}>
      <BlogPostItemContainer className="custom-blog-post">
        <BlogPostItemHeader />
        <BlogPostItemContent>
          {children}
        </BlogPostItemContent>
        <div className="custom-footer">
          Custom footer content
        </div>
      </BlogPostItemContainer>
    </BlogPostItem>
  );
}

Blog Configuration

// docusaurus.config.js
export default {
  themeConfig: {
    blog: {
      sidebar: {
        groupByYear: true,
      },
    },
  },
  presets: [
    [
      '@docusaurus/preset-classic',
      {
        blog: {
          showReadingTime: true,
          blogTitle: 'My Blog',
          blogDescription: 'A technical blog',
          postsPerPage: 5,
          blogSidebarTitle: 'Recent Posts',
          blogSidebarCount: 10,
        },
      },
    ],
  ],
};

Custom Author Component

import React from 'react';
import Link from '@docusaurus/Link';
import {translate} from '@docusaurus/Translate';

export default function CustomBlogAuthor({author, count}) {
  const {name, title, url, imageURL, email} = author;
  
  return (
    <div className="custom-author">
      {imageURL && (
        <img src={imageURL} alt={name} className="author-avatar" />
      )}
      <div className="author-info">
        <h3>
          {url ? <Link to={url}>{name}</Link> : name}
        </h3>
        {title && <p className="author-title">{title}</p>}
        {count && (
          <p>
            {translate(
              {
                id: 'theme.blog.author.posts.count',
                message: '{count} posts',
                description: 'Number of posts by author',
              },
              {count}
            )}
          </p>
        )}
      </div>
    </div>
  );
}

Install with Tessl CLI

npx tessl i tessl/npm-docusaurus--theme-classic

docs

blog-components.md

content-components.md

core-plugin.md

documentation-components.md

icon-components.md

index.md

layout-components.md

navigation-components.md

theme-configuration.md

utility-components.md

tile.json