relative-time-card
diceui-radix/relative-time-cardFreeComponent
diceui/radix publishes no description for this item.
Install it
npx shadcn@latest add https://raw.githubusercontent.com/sadmann7/diceui/HEAD/docs/public/r/styles/radix-nova/relative-time-card.jsonSource
1"use client";23import { cva, type VariantProps } from "class-variance-authority";4import { Slot as SlotPrimitive } from "radix-ui";5import * as React from "react";6import { cn } from "@/lib/utils";7import {8 HoverCard,9 HoverCardContent,10 HoverCardTrigger,11} from "@/registry/bases/radix/ui/hover-card";1213function pluralize(n: number, word: string) {14 return `${n} ${word}${n === 1 ? "" : "s"}`;15}1617function formatRelativeTime(date: Date): string {18 const now = new Date();19 const diff = now.getTime() - date.getTime();20 const isInFuture = diff < 0;21 const absDiff = Math.abs(diff);2223 const seconds = Math.floor(absDiff / 1000);24 const minutes = Math.floor(seconds / 60);25 const hours = Math.floor(minutes / 60);26 const days = Math.floor(hours / 24);2728 if (seconds < 5) return "just now";2930 if (isInFuture) {31 if (seconds < 60) return `in ${pluralize(seconds, "second")}`;32 if (minutes < 60) return `in ${pluralize(minutes, "minute")}`;33 if (hours < 24) return `in ${pluralize(hours, "hour")}`;34 if (days < 7) return `in ${pluralize(days, "day")}`;35 return date.toLocaleDateString();36 }3738 if (seconds < 60) return `${pluralize(seconds, "second")} ago`;39 if (minutes < 60)40 return `${pluralize(minutes, "minute")} ${pluralize(seconds % 60, "second")} ago`;41 if (hours < 24) return `${pluralize(hours, "hour")} ago`;42 if (days < 7) return `${pluralize(days, "day")} ago`;43 return date.toLocaleDateString();44}4546interface TimezoneCardProps extends React.ComponentProps<"div"> {47 date: Date;48 timezone?: string;49}5051function TimezoneCard(props: TimezoneCardProps) {52 const { date, timezone, ...cardProps } = props;5354 const locale = React.useMemo(55 () => Intl.DateTimeFormat().resolvedOptions().locale,56 [],57 );5859 const timezoneName = React.useMemo(60 () =>61 timezone ??62 new Intl.DateTimeFormat(locale, { timeZoneName: "shortOffset" })63 .formatToParts(date)64 .find((part) => part.type === "timeZoneName")?.value,65 [date, timezone, locale],66 );6768 const { formattedDate, formattedTime } = React.useMemo(69 () => ({70 formattedDate: new Intl.DateTimeFormat(locale, {71 month: "long",72 day: "numeric",73 year: "numeric",74 timeZone: timezone,75 }).format(date),76 formattedTime: new Intl.DateTimeFormat(locale, {77 hour: "2-digit",78 minute: "2-digit",79 second: "2-digit",80 hour12: true,81 timeZone: timezone,82 }).format(date),83 }),84// … truncated
What it pulls in
npm packages
Other registry items
Files it writes
More from diceui/radix
All 58 items| Component | Registry | Kind | Access | Installs | Command |
|---|---|---|---|---|---|
| action-baraction-bar | diceui/radix | Components | Free | 1 dep · 2 files | |
| angle-sliderangle-slider | diceui/radix | Components | Free | 1 dep · 3 files | |
| avatar-groupavatar-group | diceui/radix | Components | Free | 1 dep | |
| badge-overflowbadge-overflow | diceui/radix | Components | Free | 1 dep · 2 files | |
| bannerbanner | diceui/radix | Components | Free | 1 dep | |
| checkbox-groupcheckbox-group | diceui/radix | Components | Free | 1 dep | |
| circular-progresscircular-progress | diceui/radix | Components | Free | 1 dep | |
| client-onlyclient-only | diceui/radix | Components | Free | no deps |
