X Enterprises
Wall

WallFeed

Orchestrating feed component that renders pinned and regular posts with search, filter, load-more, and empty states.

Wall

The Wall category provides a complete social feed system. XAWallFeed is the top-level orchestrator; it renders pinned and regular post lists, delegates search/filter to a toolbar, and shows appropriate empty or loading states. Individual posts are rendered by XAWallPost. The remaining components — XAWallInput, XAWallReplies, XAWallReactions, and XAWallTags — can be composed independently or are automatically used inside XAWallFeed and XAWallPost.

Components

<XAWallFeed />

The main feed container. It separates pinned posts (rendered with a highlighted border) from regular posts, wires up search and filter toolbars, handles reply expansion state, and delegates load-more pagination. When no posts exist it shows XAStateEmpty; during a search with no results it shows a search-empty state.

<XAWallFeed
  :posts="posts"
  :pinned-posts="pinnedPosts"
  :has-more="hasMorePages"
  :loading-more="loading"
  searchable
  filterable
  :filter-options="filterOptions"
  @load-more="fetchNextPage"
  @react="handleReaction"
  @reply="handleReply"
  @tag-click="filterByTag"
>
  <template #input>
    <XAWallInput v-model="newPost" @submit="createPost" />
  </template>
  <template #post-actions="{ post }">
    <UButton size="xs" icon="i-lucide-pin" variant="ghost" @click="pin(post)" />
  </template>
</XAWallFeed>

Props

PropTypeDefaultDescription
postsArray[]Array of regular post objects.
pinnedPostsArray[]Array of pinned post objects (rendered above regular posts).
hasMoreBooleanfalseShow the load-more button.
loadingMoreBooleanfalseSet the load-more button to loading state.
loadMoreTextString'Load more posts'Label for the load-more button.
postSizeString'md'Size passed to each XAWallPost'sm', 'md', or 'lg'.
showPostActionsBooleantrueEnable the actions slot on each post.
searchableBooleanfalseShow the search input in the toolbar.
filterableBooleanfalseShow filter controls in the toolbar.
searchString''v-model search value (emits update:search).
filtersObject{}v-model filter values (emits update:filters).
filterOptionsArray[]Filter option definitions passed to the toolbar.
debounceNumber300Debounce delay in ms for search input.
searchPlaceholderString'Search posts...'Placeholder for the search field.
emptyTitleString'No posts yet'Empty state heading.
emptyDescriptionString'Posts will appear here once added.'Empty state body text.
emptyIconString'i-lucide-message-square'Empty state icon.
searchEmptyTitleString'No posts found'Search-empty state heading.
searchEmptyDescriptionString'Try adjusting your search or filters.'Search-empty state body text.

Events

EventDescription
load-moreUser clicked load more.
reactReaction toggled on a post. Payload: { post, emoji }.
replyReply toggle clicked. Payload: { post, expanded }.
reply-reactReaction toggled on a reply.
pinPin action triggered (via post-actions slot).
tag-clickA tag chip was clicked. Payload: tag object.
attachment-clickAn attachment was clicked. Payload: { post, file }.
load-repliesLoad more replies requested for a post.
update:searchSearch value changed.
update:filtersFilter values changed.
clear-filtersClear filters button clicked.

AI Context

component: XAWallFeed
package: "@xenterprises/nuxt-x-app"
auto-import: true
prefix: XA
category: Wall
use-when: Building a top-level social/activity feed. Pass posts and pinnedPosts arrays; it handles layout, search, filters, empty states, and reply expansion automatically. Use the #input slot for the post composer and #post-actions for per-post controls.
Copyright © 2026