Skip to content

Commit 77d778e

Browse files
feat(web): add relative time display to changelog header using Day.js (#2172)
* feat(web): add relative time display to changelog header using Day.js Co-Authored-By: yujonglee <[email protected]> * fix(web): add relative time to MockWindow header in changelog Co-Authored-By: yujonglee <[email protected]> --------- Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Co-authored-by: yujonglee <[email protected]>
1 parent a838e48 commit 77d778e

File tree

3 files changed

+286
-98
lines changed

3 files changed

+286
-98
lines changed

apps/web/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@
3939
"@tanstack/react-start": "^1.139.14",
4040
"@tanstack/router-plugin": "^1.139.14",
4141
"@unpic/react": "^1.0.1",
42+
"dayjs": "^1.11.19",
4243
"drizzle-orm": "^0.44.7",
4344
"exa-js": "^1.10.2",
4445
"jszip": "^3.10.1",

apps/web/src/routes/_view/changelog/$slug.tsx

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
import { MDXContent } from "@content-collections/mdx/react";
22
import { Icon } from "@iconify-icon/react";
33
import { createFileRoute, notFound, useNavigate } from "@tanstack/react-router";
4+
import dayjs from "dayjs";
5+
import relativeTime from "dayjs/plugin/relativeTime";
46
import { ChevronDown, ChevronLeft, ChevronRight, Menu, X } from "lucide-react";
57
import { AnimatePresence, motion } from "motion/react";
68
import { useEffect, useRef, useState } from "react";
@@ -22,6 +24,8 @@ import {
2224
import { defaultMDXComponents } from "@/components/mdx";
2325
import { MockWindow } from "@/components/mock-window";
2426

27+
dayjs.extend(relativeTime);
28+
2529
const ITEMS_PER_PAGE = 20;
2630

2731
type VersionGroup = {
@@ -115,12 +119,15 @@ function Component() {
115119
}
116120

117121
function HeroSection({ changelog }: { changelog: ChangelogWithMeta }) {
122+
const relativeTimeText = dayjs(changelog.created).fromNow();
123+
118124
return (
119125
<div className="px-6 py-16 lg:py-24">
120126
<div className="text-center max-w-3xl mx-auto">
121-
<h1 className="text-3xl sm:text-4xl font-serif tracking-tight text-stone-600 mb-6">
127+
<h1 className="text-3xl sm:text-4xl font-serif tracking-tight text-stone-600 mb-2">
122128
Version {changelog.version}
123129
</h1>
130+
<p className="text-sm text-neutral-500 mb-6">{relativeTimeText}</p>
124131
<DownloadButtons version={changelog.version} />
125132
</div>
126133
</div>
@@ -251,12 +258,17 @@ function ChangelogContentSection({
251258
}) {
252259
const isMobile = useIsMobile();
253260
const [drawerOpen, setDrawerOpen] = useState(false);
261+
const relativeTimeText = dayjs(changelog.created).fromNow();
254262

255263
return (
256264
<section className="px-6 pb-16 lg:pb-24">
257265
<div className="max-w-4xl mx-auto">
258266
<MockWindow
259-
title={isMobile ? undefined : `Version ${changelog.version}`}
267+
title={
268+
isMobile
269+
? undefined
270+
: `Version ${changelog.version} · ${relativeTimeText}`
271+
}
260272
className="rounded-lg w-full max-w-none"
261273
prefixIcons={
262274
isMobile && (

0 commit comments

Comments
 (0)