Something went wrong. Try again.
React blog kit backed by AT Protocol. Provides filtering UI, pagination, Bluesky comments/embeds, subscribe widget, and markdown rendering.
Something went wrong. Try again.
4.2 kB · 73 lines
TypeScript
at main
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374// Public barrel — single import surface for consumers. Universal /// client-safe: nothing here pulls in `next/*`, `node:fs`, or other// server-only dependencies. Composable with any React-rendering framework.export type { Author, Category, Contributor, Post } from "./types";export type { BlogConfig } from "./config";export { createBlogConfig } from "./config";export type { BlogTelemetry } from "./telemetry";export { consoleTelemetry, noopTelemetry, BlogTelemetryProvider, useBlogTelemetry,} from "./telemetry";export type { AtprotoFeedAdapter, CreateAtprotoFeedInput } from "./atproto-feed";export { createAtprotoFeed } from "./atproto-feed";export { getCategorySlug, makeCategoryTitleResolver } from "./category-utils";export { calculateMatchScore, filterPostsByCategories, getAllCategoriesFromPosts, sortPostsWithMatchScore,} from "./post-filtering-utils";export type { PaginatedPosts } from "./client-post-filters";export { filterSortAndPaginatePosts, paginatePosts } from "./client-post-filters";export type { BlueskyFacet, BlueskyFacetFeature, BlueskyPost } from "./bluesky";export { fetchPost, fetchPostByUrl, isBlueskyPostUrl, resolveHandle, urlToAtUri } from "./bluesky";export type { BlogContextValue, BlogProviderProps } from "./context/blog-context";export { BlogProvider, useBlog } from "./context/blog-context";
// Image platform-adapter context.export type { BlogImageComponent, BlogImageProps, BlogImageSource } from "./context/image-context";export { BlogImageProvider, useBlogImage, normalizeImageSrc } from "./context/image-context";
// Client-side Bluesky avatar resolver.export { AuthorAvatar, useBlueskyAvatar } from "./bluesky-avatar";export type { AuthorAvatarProps } from "./bluesky-avatar";
// Non-async layout components — consume pre-fetched data, work in any React// runtime (RSC, SSR, SPA). For Next.js convenience, the async route helpers// in `@blog/rsc` wrap these with built-in data fetching.export { BlogListLayout } from "./components/blog-list-layout";export type { BlogListLayoutProps } from "./components/blog-list-layout";export { BlogPostLayout } from "./components/blog-post-layout";export type { BlogPostLayoutProps, BlogPostLayoutNotFoundMsg } from "./components/blog-post-layout";export { FeaturedPostCard } from "./components/featured-post-card";export type { FeaturedPostCardProps } from "./components/featured-post-card";export { FeaturedSidebar } from "./components/featured-sidebar";export type { FeaturedSidebarProps } from "./components/featured-sidebar";export { BlogPostMeta } from "./components/blog-post-meta";export type { BlogPostMetaProps } from "./components/blog-post-meta";export { BlogPostCover } from "./components/blog-post-cover";export type { BlogPostCoverProps } from "./components/blog-post-cover";export { BlogPostBody } from "./components/blog-post-body";export type { BlogPostBodyProps } from "./components/blog-post-body";
// Components — AuthorCard avoids collision with the Author type.export { default as AuthorCard } from "./components/author";export { default as BlogPagination } from "./components/blog-pagination";export { default as BlueskyComments } from "./components/bluesky-comments";export { default as BlueskyEmbed, BlueskyPostCard } from "./components/bluesky-embed";export { default as CategoryFilter } from "./components/category-filter";export { default as CollapsibleComments } from "./components/collapsible-comments";export { default as MarkdownContent } from "./components/markdown-content";export type { MarkdownEmbed } from "./components/markdown-content";export { default as PostList } from "./components/post-list";export { default as ReadMoreContent } from "./components/read-more-content";export { default as ScrollLogger } from "./components/scroll-logger";export { default as SortButton } from "./components/sort-button";export { default as Subscribe } from "./components/subscribe";
// Server-only modules live in `@blog/server` (plain Node async filters +// markdown cache). Async React Server Component route helpers live in// `@blog/rsc`. Next.js-specific adapters live in `@blog/next`.