fireship-ai-blog
Version:
A beautiful, SEO-friendly blog package for Next.js 13+ with Fireship.ai API integration
336 lines (322 loc) • 10.8 kB
TypeScript
import * as react_jsx_runtime from 'react/jsx-runtime';
import React from 'react';
interface FireshipBlogProps$1 {
className?: string;
apiKey?: string;
apiBase?: string;
}
declare function FireshipBlog({ className, apiKey, apiBase }: FireshipBlogProps$1): react_jsx_runtime.JSX.Element;
interface BlogPost {
id: string;
slug: string;
title: string;
excerpt: string;
content: string;
author: {
name: string;
avatar?: string;
bio?: string;
};
publishedAt: string;
updatedAt: string;
tags: string[];
category: string;
featuredImage?: string;
seo: {
metaTitle?: string;
metaDescription?: string;
ogImage?: string;
twitterCard?: 'summary' | 'summary_large_image';
};
analytics: {
views: number;
shares: number;
likes: number;
comments: number;
};
status: 'draft' | 'published' | 'archived';
}
interface RelatedPost {
id: string;
slug: string;
title: string;
excerpt: string;
featuredImage?: string;
publishedAt: string;
category: string;
readTime: number;
}
interface BlogAnalytics {
totalViews: number;
totalShares: number;
totalLikes: number;
totalComments: number;
viewsOverTime: Array<{
date: string;
views: number;
}>;
topReferrers: Array<{
domain: string;
visits: number;
}>;
backlinks: Array<{
url: string;
domain: string;
anchorText: string;
discoveredAt: string;
}>;
topPosts: Array<{
id: string;
title: string;
views: number;
slug: string;
}>;
}
interface ThemeSettings {
primaryColor: string;
secondaryColor: string;
fontFamily: 'inter' | 'sf-pro' | 'system';
fontSize: 'sm' | 'base' | 'lg';
showSidebar: boolean;
glassEffect: boolean;
borderRadius: 'none' | 'sm' | 'md' | 'lg' | 'xl';
}
interface FireshipBlogProps {
slug?: string;
category?: string;
tag?: string;
limit?: number;
showRelatedPosts?: boolean;
showNavigation?: boolean;
customTheme?: Partial<ThemeSettings>;
}
interface FireshipBlogAdminProps {
initialPost?: BlogPost;
onSave?: (post: BlogPost) => void;
onDelete?: (postId: string) => void;
}
interface PostEditorProps {
post?: BlogPost;
onSave: (post: Partial<BlogPost>) => Promise<void>;
onCancel?: () => void;
isLoading?: boolean;
}
interface ThemeSettingsProps {
settings: ThemeSettings;
onSave: (settings: ThemeSettings) => Promise<void>;
}
interface ApiResponse<T> {
data: T;
success: boolean;
message?: string;
error?: string;
}
interface PaginatedResponse<T> {
data: T[];
pagination: {
page: number;
limit: number;
total: number;
totalPages: number;
};
}
interface FireshipApiConfig$1 {
apiKey: string;
baseUrl?: string;
timeout?: number;
}
interface UseFireshipPostsOptions {
category?: string;
tag?: string;
limit?: number;
page?: number;
status?: BlogPost['status'];
sortBy?: 'publishedAt' | 'updatedAt' | 'views';
sortOrder?: 'asc' | 'desc';
}
interface UseFireshipPostsReturn {
posts: BlogPost[];
loading: boolean;
error: string | null;
hasMore: boolean;
loadMore: () => void;
refresh: () => void;
totalCount: number;
}
interface BlogPostViewProps {
post: BlogPost;
showSidebar?: boolean;
showNavigation?: boolean;
showSuggestions?: boolean;
className?: string;
onPostClick?: (post: BlogPost) => void;
onTagClick?: (tag: string) => void;
onCategoryClick?: (category: string) => void;
hasActiveSubscription?: boolean;
}
declare const BlogPostView: React.FC<BlogPostViewProps>;
interface PostCardProps {
post: BlogPost;
onClick?: (post: BlogPost) => void;
showAnalytics?: boolean;
className?: string;
}
declare const PostCard: React.FC<PostCardProps>;
declare const PostCardSkeleton: React.FC;
interface RelatedPostsSidebarProps {
postSlug: string;
limit?: number;
className?: string;
title?: string;
}
declare const RelatedPostsSidebar: React.FC<RelatedPostsSidebarProps>;
declare const TrendingPostsSidebar: React.FC<Omit<RelatedPostsSidebarProps, 'postId'> & {
timeframe?: 'day' | 'week' | 'month' | 'year';
}>;
interface NextPostNavigationProps {
currentPostId: string;
className?: string;
showThumbnails?: boolean;
}
declare const NextPostNavigation: React.FC<NextPostNavigationProps>;
declare const SimplePostNavigation: React.FC<NextPostNavigationProps>;
declare const ThemeSettingsComponent: React.FC<ThemeSettingsProps>;
declare const useFireshipPosts: (options?: UseFireshipPostsOptions) => UseFireshipPostsReturn;
declare const useFireshipPost: (slug: string) => {
post: BlogPost;
loading: boolean;
error: string;
};
declare const useRelatedPosts: (postSlug: string, limit?: number) => {
relatedPosts: RelatedPost[];
loading: boolean;
error: string;
};
declare const useFireshipTheme: () => {
theme: any;
updateTheme: (newTheme: any) => Promise<void>;
};
declare const useFireshipAnalytics: (postId?: string) => {
analytics: any;
loading: boolean;
error: string;
refetch: (dateRange?: {
from: string;
to: string;
}) => Promise<void>;
};
interface FireshipApiConfig {
dataProvider?: {
getPosts: (params?: any) => Promise<PaginatedResponse<BlogPost>>;
getPost: (slug: string) => Promise<BlogPost>;
createPost: (post: Partial<BlogPost>) => Promise<BlogPost>;
updatePost: (slug: string, post: Partial<BlogPost>) => Promise<BlogPost>;
deletePost: (slug: string) => Promise<void>;
getCampaigns?: () => Promise<Array<{
id: string;
name: string;
description?: string;
}>>;
};
endpoints?: {
baseUrl: string;
posts: string;
post: string;
campaigns?: string;
headers?: Record<string, string>;
};
fetcher?: (url: string, options?: RequestInit) => Promise<Response>;
}
declare class FireshipApi {
private config;
constructor(config: FireshipApiConfig);
private request;
getPosts(params?: {
limit?: number;
offset?: number;
category?: string;
tag?: string;
campaignId?: string;
}): Promise<PaginatedResponse<BlogPost>>;
getPostBySlug(slug: string): Promise<BlogPost>;
getRelatedPosts(postSlug: string, limit?: number): Promise<RelatedPost[]>;
submitPost(postData: Partial<BlogPost>): Promise<BlogPost>;
deletePost(postId: string): Promise<void>;
getAnalytics(params?: {
postId?: string;
dateFrom?: string;
dateTo?: string;
}): Promise<BlogAnalytics>;
trackView(postId: string, metadata?: {
userAgent?: string;
referrer?: string;
ip?: string;
}): Promise<void>;
getThemeSettings(): Promise<ThemeSettings>;
updateThemeSettings(settings: ThemeSettings): Promise<ThemeSettings>;
getCampaigns(): Promise<Array<{
id: string;
name: string;
description?: string;
}>>;
}
declare function createFireshipApi(config: FireshipApiConfig): FireshipApi;
declare function createApiHelpers(api: FireshipApi): {
getPosts: (params?: Parameters<FireshipApi["getPosts"]>[0]) => Promise<PaginatedResponse<BlogPost>>;
getPostBySlug: (slug: string) => Promise<BlogPost>;
getRelatedPosts: (postSlug: string, limit?: number) => Promise<RelatedPost[]>;
getAnalytics: (params?: Parameters<FireshipApi["getAnalytics"]>[0]) => Promise<BlogAnalytics>;
updateThemeSettings: (settings: ThemeSettings) => Promise<ThemeSettings>;
submitPost: (postData: Partial<BlogPost>) => Promise<BlogPost>;
trackView: (postId: string, metadata?: Parameters<FireshipApi["trackView"]>[1]) => Promise<void>;
getCampaigns: () => Promise<{
id: string;
name: string;
description?: string;
}[]>;
};
interface FireshipProxyOptions {
apiBase?: string;
getApiKey?: () => string | undefined;
allowOrigin?: string | string[];
domain?: string;
}
declare function createFireshipProxyHandler(options?: FireshipProxyOptions): {
GET: (req: Request, ctx?: {
params?: {
path?: string[];
};
}) => Promise<Response>;
OPTIONS: () => Response;
};
declare const markdownToHtml: (markdown: string) => Promise<string>;
declare const htmlToMarkdown: (html: string) => string;
declare const calculateReadingTime: (markdown: string) => number;
declare const extractExcerpt: (markdown: string, maxLength?: number) => string;
declare const generateTableOfContents: (markdown: string) => Array<{
id: string;
title: string;
level: number;
}>;
declare const validateMarkdown: (markdown: string) => {
isValid: boolean;
errors: string[];
warnings: string[];
};
declare const sanitizeMarkdown: (markdown: string) => string;
declare const defaultTheme: ThemeSettings;
declare const applyTheme: (settings: ThemeSettings) => void;
declare const getThemeClasses: (settings: ThemeSettings) => Record<string, string>;
declare const hexToRgb: (hex: string) => {
r: number;
g: number;
b: number;
} | null;
declare const generateColorVariations: (baseColor: string) => Record<string, string>;
declare const loadThemeFromStorage: () => ThemeSettings;
declare const saveThemeToStorage: (settings: ThemeSettings) => void;
declare const initializeTheme: (settings?: Partial<ThemeSettings>) => ThemeSettings;
declare const getSystemDarkMode: () => boolean;
declare const toggleDarkMode: (isDark?: boolean) => boolean;
declare const initializeDarkMode: () => boolean;
export { type ApiResponse, type BlogAnalytics, type BlogPost, BlogPostView, FireshipApi, type FireshipApiConfig$1 as FireshipApiConfig, FireshipBlog, type FireshipBlogAdminProps, type FireshipBlogProps, NextPostNavigation, type PaginatedResponse, PostCard, PostCardSkeleton, type PostEditorProps, type RelatedPost, RelatedPostsSidebar, SimplePostNavigation, type ThemeSettings, ThemeSettingsComponent, type ThemeSettingsProps, TrendingPostsSidebar, type UseFireshipPostsOptions, type UseFireshipPostsReturn, applyTheme, calculateReadingTime, createApiHelpers, createFireshipApi, createFireshipProxyHandler, defaultTheme, extractExcerpt, generateColorVariations, generateTableOfContents, getSystemDarkMode, getThemeClasses, hexToRgb, htmlToMarkdown, initializeDarkMode, initializeTheme, loadThemeFromStorage, markdownToHtml, sanitizeMarkdown, saveThemeToStorage, toggleDarkMode, useFireshipAnalytics, useFireshipPost, useFireshipPosts, useFireshipTheme, useRelatedPosts, validateMarkdown };