[APP-2160] Build new standard.site link card UI (#10468)

Co-authored-by: vineyardbovines <spencer@thepope.dev>
Co-authored-by: Eric Bailey <git@esb.lol>
Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
Spence Pope
2026-05-22 18:36:06 -04:00
committed by GitHub
parent 6159cd7777
commit 5db37729bb
28 changed files with 1265 additions and 38 deletions
+1
View File
@@ -442,6 +442,7 @@ async function resolveMedia(
title: resolvedLink.title,
description: resolvedLink.description,
thumb: blob,
associatedRefs: resolvedLink.associatedRefs,
},
}
}
+4 -2
View File
@@ -39,7 +39,8 @@ type ResolvedExternalLink = {
* The AT-URI of the Atmosphere record representing this external content, if
* it exists. Example: a site.standard.document record.
*/
associatedRecord?: LinkMeta['associatedRecord']
associatedRefs?: LinkMeta['associatedRefs']
view?: LinkMeta['view']
}
type ResolvedPostRecord = {
@@ -245,7 +246,8 @@ async function resolveExternal(
title: result.title ?? '',
description: result.description ?? '',
thumb: result.image ? await imageToThumb(result.image) : undefined,
associatedRecord: result.associatedRecord,
associatedRefs: result.associatedRefs,
view: result.view,
}
}
+5 -3
View File
@@ -1,4 +1,4 @@
import {type BskyAgent} from '@atproto/api'
import {type AppBskyEmbedExternal, type BskyAgent} from '@atproto/api'
import {LINK_META_PROXY} from '#/lib/constants'
import {getGiphyMetaUri} from '#/lib/strings/embed-player'
@@ -26,7 +26,8 @@ export interface LinkMeta {
* The AT-URI of the Atmosphere record representing this external content, if
* it exists. Example: a site.standard.document record.
*/
associatedRecord?: string
associatedRefs?: AppBskyEmbedExternal.External['associatedRefs']
view?: AppBskyEmbedExternal.View
}
export async function getLinkMeta(
@@ -94,7 +95,8 @@ export async function getLinkMeta(
meta.description = body.description
meta.image = body.image
meta.title = body.title
meta.associatedRecord = body.associated_record
meta.associatedRefs = body.associated_refs
meta.view = body.view || body.external_view
if (shouldFollowRedirect) {
meta.url = body.url
}
+4 -2
View File
@@ -5,21 +5,23 @@ export function niceDate(
i18n: I18n,
date: number | string | Date,
dateStyle: 'short' | 'medium' | 'long' | 'full' | 'dot separated' = 'long',
timeStyle: 'short' | 'medium' | 'long' | 'full' | 'none' = 'short',
) {
const ts = timeStyle === 'none' ? undefined : timeStyle
const d = new Date(date)
if (dateStyle === 'dot separated') {
return i18n._(
msg({
context: 'date and time formatted like this: [time] · [date]',
message: `${i18n.date(d, {timeStyle: 'short'})} · ${i18n.date(d, {dateStyle: 'medium'})}`,
message: `${i18n.date(d, {timeStyle: ts})} · ${i18n.date(d, {dateStyle: 'medium'})}`,
}),
)
}
return i18n.date(d, {
dateStyle,
timeStyle: 'short',
timeStyle: ts,
})
}