timeline

Activity feed timeline with user avatars

Activity feed timeline with user avatars

Загрузка превью…

src/timeline/c-timeline-11.vue

<!--
  Расхождение с апстримом: сетевые аватары (unsplash) заменены статичным
  1x1 data-URI (PIXEL) — сетевые запросы в headless-стенде недетерминированы.
-->
<script setup lang="ts">
import { Timeline, TimelineContent, TimelineDate, TimelineHeader, TimelineIndicator, TimelineItem, TimelineSeparator } from "@/components/reui/timeline"
import { Avatar, AvatarFallback, AvatarImage } from "@/components/ui/avatar"

const PIXEL =
  "data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs="

const activities = [
  { id: 1, user: "Alex Johnson", avatar: PIXEL, action: "pushed 3 commits to", target: "main", date: "5 minutes ago" },
  { id: 2, user: "Sarah Chen", avatar: PIXEL, action: "opened pull request", target: "#284 — Add dark mode", date: "20 minutes ago" },
  { id: 3, user: "David Kim", avatar: PIXEL, action: "commented on", target: "Issue #142", date: "1 hour ago" },
  { id: 4, user: "Emma Wilson", avatar: PIXEL, action: "deployed to", target: "production", date: "2 hours ago" },
  { id: 5, user: "Michael Rodriguez", avatar: PIXEL, action: "merged branch", target: "feat/notifications", date: "3 hours ago" },
]

function initials(name: string) {
  return name
    .split(" ")
    .map((n) => n[0])
    .join("")
}
</script>

<template>
  <div class="w-full max-w-md">
    <Timeline :value="5">
      <TimelineItem
        v-for="activity in activities"
        :key="activity.id"
        :step="activity.id"
        class="group-data-[orientation=vertical]/timeline:ms-10"
      >
        <TimelineHeader>
          <TimelineSeparator class="bg-input! group-data-[orientation=vertical]/timeline:top-2 group-data-[orientation=vertical]/timeline:-left-8 group-data-[orientation=vertical]/timeline:h-[calc(100%-2.5rem)] group-data-[orientation=vertical]/timeline:translate-y-7" />
          <TimelineIndicator class="size-8 overflow-hidden rounded-full border-none group-data-[orientation=vertical]/timeline:-left-8">
            <Avatar class="size-8">
              <AvatarImage :src="activity.avatar" :alt="activity.user" />
              <AvatarFallback class="text-[10px]">{{ initials(activity.user) }}</AvatarFallback>
            </Avatar>
          </TimelineIndicator>
        </TimelineHeader>
        <TimelineContent>
          <p class="text-sm">
            <span class="font-medium">{{ activity.user }}</span> <span class="text-muted-foreground">{{ activity.action }}</span> <span class="font-medium">{{ activity.target }}</span>
          </p>
          <TimelineDate class="mt-0.5 mb-0">{{ activity.date }}</TimelineDate>
        </TimelineContent>
      </TimelineItem>
    </Timeline>
  </div>
</template>

Установка

npx shadcn-vue@latest add https://revueui.rootapi.dev/r/c-timeline-11.json

Зависимости реестра

Источник: порт из ReUI (Keenthemes, MIT)