Editorial Feed

A rich editorial layout with margin vote annotations, vertical rules, and stacked feed items. Inspired by blog and editorial design.

Preview

243

Add keyboard shortcuts for common actions

Planned#UX#Feature·7 comments3 days ago
412

Dark mode support for the dashboard

In Progress#Design·12 comments1 day ago
81

Export feedback data as CSV

Under Review#Data·3 comments5 days ago

Installation

npx shadcn add https://www.reflet.app/r/feedback-editorial-feed.json

Usage

import {
  EditorialFeed,
  EditorialFeedComments,
  EditorialFeedContent,
  EditorialFeedItem,
  EditorialFeedMeta,
  EditorialFeedRule,
  EditorialFeedStatus,
  EditorialFeedTag,
  EditorialFeedTime,
  EditorialFeedTitle,
  EditorialFeedVote,
} from "@/components/ui/feedback-editorial-feed";
<EditorialFeed>
  <EditorialFeedItem defaultUpvotes={24} defaultDownvotes={3}>
    <EditorialFeedVote />
    <EditorialFeedRule />
    <EditorialFeedContent>
      <EditorialFeedTitle>
        Add keyboard shortcuts for common actions
      </EditorialFeedTitle>
      <EditorialFeedMeta>
        <EditorialFeedStatus color="blue">Planned</EditorialFeedStatus>
        <EditorialFeedTag>UX</EditorialFeedTag>
        <EditorialFeedTag>Feature</EditorialFeedTag>
        <EditorialFeedComments count={7} />
        <EditorialFeedTime>3 days ago</EditorialFeedTime>
      </EditorialFeedMeta>
    </EditorialFeedContent>
  </EditorialFeedItem>
  <EditorialFeedItem defaultUpvotes={41} defaultDownvotes={2}>
    <EditorialFeedVote />
    <EditorialFeedRule />
    <EditorialFeedContent>
      <EditorialFeedTitle>
        Dark mode support for the dashboard
      </EditorialFeedTitle>
      <EditorialFeedMeta>
        <EditorialFeedStatus color="amber">In Progress</EditorialFeedStatus>
        <EditorialFeedTag>Design</EditorialFeedTag>
        <EditorialFeedComments count={12} />
        <EditorialFeedTime>1 day ago</EditorialFeedTime>
      </EditorialFeedMeta>
    </EditorialFeedContent>
  </EditorialFeedItem>
  <EditorialFeedItem defaultUpvotes={8} defaultDownvotes={1}>
    <EditorialFeedVote />
    <EditorialFeedRule />
    <EditorialFeedContent>
      <EditorialFeedTitle>Export feedback data as CSV</EditorialFeedTitle>
      <EditorialFeedMeta>
        <EditorialFeedStatus color="purple">Under Review</EditorialFeedStatus>
        <EditorialFeedTag>Data</EditorialFeedTag>
        <EditorialFeedComments count={3} />
        <EditorialFeedTime>5 days ago</EditorialFeedTime>
      </EditorialFeedMeta>
    </EditorialFeedContent>
  </EditorialFeedItem>
</EditorialFeed>

API Reference

EditorialFeed

List container with vertical dividers between items.

EditorialFeedItem

Individual feed item. Provides vote context for child sub-components.

PropTypeDescription
defaultUpvotesnumberInitial upvote count. Defaults to 0.
defaultDownvotesnumberInitial downvote count. Defaults to 0.
onVoteChange(upvotes, downvotes) => voidCallback fired when the vote changes.

EditorialFeedVote

Absolute-positioned vote annotation in the left margin with animated up/down buttons.

EditorialFeedRule

Thin vertical rule separating the vote margin from the content.

EditorialFeedContent

Wrapper for the title and meta content area.

EditorialFeedTitle

Editorial-style heading with display font.

EditorialFeedMeta

Flex row for status, tags, comments, and time metadata.

EditorialFeedStatus

Colored status badge pill.

PropTypeDescription
colorStatusColorColor key: purple, green, blue, red, amber, pink, or gray. Defaults to "gray".

EditorialFeedTag

Italic tag prefixed with #.

EditorialFeedComments

Comment count with dot separator.

PropTypeDescription
count*numberNumber of comments.

EditorialFeedTime

Italic timestamp text.

All sub-components also accept className and children props unless noted otherwise.