diff --git a/src/components/CalendarEventContent/index.tsx b/src/components/CalendarEventContent/index.tsx index 61c0c41a..af8319d4 100644 --- a/src/components/CalendarEventContent/index.tsx +++ b/src/components/CalendarEventContent/index.tsx @@ -283,7 +283,7 @@ export default function CalendarEventContent({ href={url} target="_blank" rel="noopener noreferrer" - className="inline-flex items-center gap-1 text-xs font-medium text-primary underline-offset-2 hover:underline" + className="inline-flex items-center gap-1 text-xs font-medium text-primary underline-offset-2 hover:text-foreground hover:underline transition-colors" > {t('Open link')} diff --git a/src/components/CalendarEventNip52StructuredMeta.tsx b/src/components/CalendarEventNip52StructuredMeta.tsx index f49d99b2..b5a8b1d7 100644 --- a/src/components/CalendarEventNip52StructuredMeta.tsx +++ b/src/components/CalendarEventNip52StructuredMeta.tsx @@ -51,7 +51,7 @@ export function CalendarEventNip52StructuredMeta({ if (!hasLocations && !summaryTrim && !hasGeo) return null const linkClass = - 'inline-flex shrink-0 items-center gap-1 text-xs font-medium text-primary underline-offset-2 hover:underline' + 'inline-flex shrink-0 items-center gap-1 text-xs font-medium text-primary underline-offset-2 hover:text-foreground hover:underline transition-colors' return (
@@ -183,7 +183,7 @@ export function CalendarEventNip52StructuredMeta({ href={r.value} target="_blank" rel="noopener noreferrer" - className="inline-flex min-w-0 max-w-full items-start gap-1 break-all text-xs font-medium text-primary underline-offset-2 hover:underline" + className="inline-flex min-w-0 max-w-full items-start gap-1 break-all text-xs font-medium text-primary underline-offset-2 hover:text-foreground hover:underline transition-colors" > {r.value} diff --git a/src/components/CitationCard/index.tsx b/src/components/CitationCard/index.tsx index 4e5d74f4..50dbcf40 100644 --- a/src/components/CitationCard/index.tsx +++ b/src/components/CitationCard/index.tsx @@ -390,7 +390,7 @@ export default function CitationCard({ event, className, displayType = 'end', ci
{formatDate(citationData.publishedOn)}
)} {citationData.url && ( -
+
{citationData.url} @@ -526,7 +526,7 @@ export default function CitationCard({ event, className, displayType = 'end', ci
{t('Version')}: {citationData.version}
)} {citationData.url && ( -
+
{citationData.url} @@ -572,7 +572,7 @@ export default function CitationCard({ event, className, displayType = 'end', ci { e.preventDefault() // Scroll to full citation in references section diff --git a/src/components/Content/index.tsx b/src/components/Content/index.tsx index 55886c48..fe3601b3 100644 --- a/src/components/Content/index.tsx +++ b/src/components/Content/index.tsx @@ -65,7 +65,7 @@ function renderRedirectText(text: string, key: number) { {prefix} Read{' '} e.stopPropagation()} > @@ -618,11 +618,7 @@ export default function Content({ } if (node.type === 'payto') { return ( - + ) } if (node.type === 'websocket-url') { diff --git a/src/components/ContentPreview/Content.tsx b/src/components/ContentPreview/Content.tsx index 2e6c24e5..3fcf26cc 100644 --- a/src/components/ContentPreview/Content.tsx +++ b/src/components/ContentPreview/Content.tsx @@ -42,11 +42,7 @@ export default function Content({ } if (node.type === 'payto') { return ( - + ) } if (node.type === 'emoji') { diff --git a/src/components/Embedded/EmbeddedHashtag.tsx b/src/components/Embedded/EmbeddedHashtag.tsx index 1ac04511..d2874d60 100644 --- a/src/components/Embedded/EmbeddedHashtag.tsx +++ b/src/components/Embedded/EmbeddedHashtag.tsx @@ -13,7 +13,7 @@ export function EmbeddedHashtag({ hashtag }: { hashtag: string }) { return ( diff --git a/src/components/Note/MarkdownArticle/MarkdownArticle.tsx b/src/components/Note/MarkdownArticle/MarkdownArticle.tsx index 363d6637..187f609a 100644 --- a/src/components/Note/MarkdownArticle/MarkdownArticle.tsx +++ b/src/components/Note/MarkdownArticle/MarkdownArticle.tsx @@ -25,6 +25,7 @@ import { } from '@/lib/url' import { getHttpUrlFromITags, getImetaInfosFromEvent } from '@/lib/event' import { canonicalizeRssArticleUrl } from '@/lib/rss-article' +import { URI_LINK_CLASS } from '@/lib/link-styles' import { cn } from '@/lib/utils' import { Event, kinds } from 'nostr-tools' import Emoji, { EMOJI_IMG_INLINE_CLASS } from '@/components/Emoji' @@ -2188,7 +2189,7 @@ function parseMarkdownContentLegacy( @@ -2202,7 +2203,7 @@ function parseMarkdownContentLegacy( @@ -2236,7 +2237,7 @@ function parseMarkdownContentLegacy( @@ -2248,7 +2249,7 @@ function parseMarkdownContentLegacy( @@ -2283,7 +2284,7 @@ function parseMarkdownContentLegacy( { e.stopPropagation() e.preventDefault() @@ -2300,7 +2301,7 @@ function parseMarkdownContentLegacy( @@ -2347,7 +2348,7 @@ function parseMarkdownContentLegacy( { e.stopPropagation() e.preventDefault() @@ -2547,7 +2548,7 @@ function parseMarkdownContentLegacy( { e.preventDefault() const footnoteElement = document.getElementById(`footnote-${footnoteId}`) @@ -2585,7 +2586,7 @@ function parseMarkdownContentLegacy( { e.preventDefault() const citationElement = document.getElementById(`citation-${citationIndex}`) @@ -2615,7 +2616,7 @@ function parseMarkdownContentLegacy( { e.preventDefault() const refSection = document.getElementById('references-section') @@ -2673,7 +2674,7 @@ function parseMarkdownContentLegacy( { e.stopPropagation() e.preventDefault() @@ -3041,7 +3042,7 @@ function parseMarkdownContentLegacy( {' '} { e.preventDefault() const refElement = document.getElementById(`footnote-ref-${id}`) @@ -3082,7 +3083,7 @@ function parseMarkdownContentLegacy( { e.preventDefault() @@ -3126,7 +3127,7 @@ function parseMarkdownContentLegacy( { e.preventDefault() @@ -3415,8 +3416,9 @@ function parseMarkdownContentMarked( const cleaned = cleanUrl(href) const linkTip = markdownTokenTitle(token) const linkVisual = cn( - 'text-green-600 dark:text-green-400 hover:text-green-700 dark:hover:text-green-300 hover:underline break-words', - linkTip && 'cursor-help underline decoration-dotted decoration-current/70 underline-offset-2' + URI_LINK_CLASS, + linkTip && + 'cursor-help no-underline hover:underline decoration-dotted decoration-current/70 underline-offset-2' ) if (href.startsWith('payto://')) { const children = stripNestedAnchorsFromNodes( @@ -3711,7 +3713,7 @@ function parseMarkdownContentMarked( { e.preventDefault() navigateToRelay(paragraphText) @@ -3742,7 +3744,7 @@ function parseMarkdownContentMarked( { e.preventDefault() navigateToRelay(line) @@ -3817,7 +3819,7 @@ function parseMarkdownContentMarked( href={cleaned} target="_blank" rel="noopener noreferrer" - className="inline text-green-600 dark:text-green-400 hover:text-green-700 dark:hover:text-green-300 hover:underline break-words" + className={cn('inline', URI_LINK_CLASS)} > {cleaned} @@ -3990,7 +3992,7 @@ function parseMarkdownContentMarked( href={cleaned} target="_blank" rel="noopener noreferrer" - className="inline text-green-600 dark:text-green-400 hover:text-green-700 dark:hover:text-green-300 hover:underline break-words" + className={cn('inline', URI_LINK_CLASS)} > {cleaned} @@ -4672,7 +4674,7 @@ function parseMarkdownContentMarked( {parseInlineMarkdown(text, `footnote-${id}`, footnotes, emojiInfos, navigateToHashtag, emojiLightbox)}{' '} { e.preventDefault() const refElement = document.getElementById(`footnote-ref-${id}`) @@ -4789,7 +4791,7 @@ function parseInlineMarkdown( {children} @@ -4799,7 +4801,7 @@ function parseInlineMarkdown( @@ -5076,7 +5078,7 @@ function parseInlineMarkdownLegacy( const { text, url } = pattern.data if (url.startsWith('payto://')) { parts.push( - + {parseInlineMarkdownLegacy(text, `${keyPrefix}-link-${i}`, _footnotes, emojiInfos, undefined, emojiLightbox)} ) @@ -5093,7 +5095,7 @@ function parseInlineMarkdownLegacy( @@ -5109,7 +5111,7 @@ function parseInlineMarkdownLegacy( { if (!navigateToHashtag) return e.stopPropagation() @@ -5127,7 +5129,7 @@ function parseInlineMarkdownLegacy( { e.preventDefault() const footnoteElement = document.getElementById(`footnote-${footnoteId}`) @@ -5150,7 +5152,7 @@ function parseInlineMarkdownLegacy( {url} @@ -5175,7 +5177,7 @@ function parseInlineMarkdownLegacy( ) } else if (pattern.type === 'emoji') { diff --git a/src/components/Note/index.tsx b/src/components/Note/index.tsx index fca3e8b1..7209ce20 100644 --- a/src/components/Note/index.tsx +++ b/src/components/Note/index.tsx @@ -442,7 +442,7 @@ export default function Note({ href={href} target="_blank" rel="noopener noreferrer" - className="text-sm text-primary underline-offset-4 hover:underline break-all" + className="text-sm text-primary underline-offset-4 hover:text-foreground hover:underline transition-colors break-all" > {href} diff --git a/src/components/NoteStats/ZapButton.tsx b/src/components/NoteStats/ZapButton.tsx index 089af2e7..d0875076 100644 --- a/src/components/NoteStats/ZapButton.tsx +++ b/src/components/NoteStats/ZapButton.tsx @@ -1,18 +1,22 @@ import { Skeleton } from '@/components/ui/skeleton' import { useNoteStatsById } from '@/hooks/useNoteStatsById' -import { getLightningAddressFromProfile } from '@/lib/lightning' +import { + buildOrderedZapLightningAddresses, + recipientHasAnyPaymentOptions +} from '@/lib/merge-payment-methods' +import { getPaymentInfoFromEvent, getProfileFromEvent } from '@/lib/event-metadata' import { cn } from '@/lib/utils' +import { useNoteFeedProfileContext } from '@/providers/NoteFeedProfileContext' import { useNostr } from '@/providers/NostrProvider' import { useZap } from '@/providers/ZapProvider' -import { replaceableEventService } from '@/services/client.service' -import { getProfileFromEvent } from '@/lib/event-metadata' -import { kinds } from 'nostr-tools' +import client, { replaceableEventService } from '@/services/client.service' +import type { TProfile } from '@/types' +import { kinds, type Event } from 'nostr-tools' import lightning from '@/services/lightning.service' import noteStatsService from '@/services/note-stats.service' import type { TNoteStats } from '@/services/note-stats.service' import { Zap } from 'lucide-react' -import { Event } from 'nostr-tools' -import { MouseEvent, TouchEvent, useEffect, useMemo, useRef, useState } from 'react' +import { MouseEvent, TouchEvent, useCallback, useEffect, useMemo, useRef, useState } from 'react' import { useTranslation } from 'react-i18next' import { toast } from 'sonner' import ZapDialog from '../ZapDialog' @@ -40,25 +44,79 @@ export function ZapButtonWithStats({ event, hideCount = false, noteStats }: ZapB } }, [noteStats, pubkey]) const showZapAmount = !hideCount && (statsLoaded || (zapAmount ?? 0) > 0) + const authorPubkey = event.pubkey.toLowerCase() + const isSelf = !!pubkey && pubkey.toLowerCase() === authorPubkey + const feedProfiles = useNoteFeedProfileContext() + const feedProfile = feedProfiles?.profiles.get(authorPubkey) + const feedProfileRef = useRef(feedProfile) + feedProfileRef.current = feedProfile + const [disable, setDisable] = useState(true) + const [canLightningZap, setCanLightningZap] = useState(false) const timerRef = useRef | null>(null) const isLongPressRef = useRef(false) + const applyTipAvailability = useCallback( + ( + profile: TProfile | null, + profileEvent: Event | null | undefined, + paymentInfo: ReturnType | null + ) => { + const canTip = recipientHasAnyPaymentOptions(paymentInfo, profile, profileEvent ?? null) + setDisable(!canTip) + setCanLightningZap( + buildOrderedZapLightningAddresses({ profileEvent, paymentInfo }).length > 0 + ) + }, + [] + ) + + /** Re-enable when the feed batch loads a real profile (not a placeholder row). */ useEffect(() => { + if (isSelf) return + if (!feedProfile || feedProfile.batchPlaceholder) return + applyTipAvailability(feedProfile, null, null) + }, [isSelf, feedProfile, feedProfiles?.version, applyTipAvailability]) + + useEffect(() => { + if (isSelf) { + setDisable(true) + setCanLightningZap(false) + return + } + setDisable(true) + setCanLightningZap(false) let cancelled = false - replaceableEventService.fetchReplaceableEvent(event.pubkey, kinds.Metadata).then((profileEvent) => { + + void Promise.allSettled([ + replaceableEventService.fetchReplaceableEvent(authorPubkey, kinds.Metadata), + client.fetchPaymentInfoEvent(authorPubkey), + replaceableEventService.getProfileFromIndexedDB(authorPubkey) + ]).then(([profileRes, paymentRes, idbRes]) => { if (cancelled) return - const profile = profileEvent ? getProfileFromEvent(profileEvent) : undefined - if (!profile) return - if (pubkey === profile.pubkey) return - const lightningAddress = getLightningAddressFromProfile(profile) - if (lightningAddress) setDisable(false) + + const profileEvent = + profileRes.status === 'fulfilled' ? profileRes.value : undefined + const paymentEvent = + paymentRes.status === 'fulfilled' ? paymentRes.value : undefined + const idbProfile = idbRes.status === 'fulfilled' ? idbRes.value : undefined + + const cachedFeed = feedProfileRef.current + const profile = + (profileEvent ? getProfileFromEvent(profileEvent) : null) ?? + (cachedFeed && !cachedFeed.batchPlaceholder ? cachedFeed : null) ?? + idbProfile ?? + null + const paymentInfo = paymentEvent ? getPaymentInfoFromEvent(paymentEvent) : null + + applyTipAvailability(profile, profileEvent ?? null, paymentInfo) }) + return () => { cancelled = true } - }, [event.pubkey, pubkey]) + }, [authorPubkey, isSelf, applyTipAvailability]) const handleZap = async () => { try { @@ -143,7 +201,14 @@ export function ZapButtonWithStats({ event, hideCount = false, noteStats }: ZapB setZapping(true) }) } else if (!isLongPressRef.current) { - checkLogin(() => handleZap()) + if (canLightningZap) { + checkLogin(() => handleZap()) + } else { + checkLogin(() => { + setOpenZapDialog(true) + setZapping(true) + }) + } } isLongPressRef.current = false } diff --git a/src/components/PaymentMethodsSection/index.tsx b/src/components/PaymentMethodsSection/index.tsx index 84bd7ed2..6c3aa345 100644 --- a/src/components/PaymentMethodsSection/index.tsx +++ b/src/components/PaymentMethodsSection/index.tsx @@ -1,6 +1,7 @@ import PaytoLink from '@/components/PaytoLink' import type { PaymentMethodGroup } from '@/lib/merge-payment-methods' -import { isLightningPaytoType } from '@/lib/payto' +import { PRIMARY_LINK_HOVER_CLASS } from '@/lib/link-styles' +import { isZappableLightningPaytoType } from '@/lib/payto' import { cn } from '@/lib/utils' import { Copy } from 'lucide-react' import { useTranslation } from 'react-i18next' @@ -33,10 +34,7 @@ export default function PaymentMethodsSection({ {title ?? t('Payment Methods')}
{headerHelpText ? ( -

+

{headerHelpText}

) : null} @@ -62,13 +60,13 @@ export default function PaymentMethodsSection({ type={method.type} authority={method.authority} paytoUri={method.payto} - pubkey={isLightningPaytoType(method.type) ? recipientPubkey : undefined} + pubkey={isZappableLightningPaytoType(method.type) ? recipientPubkey : undefined} onOpenZap={ - isLightningPaytoType(method.type) && onOpenZap + isZappableLightningPaytoType(method.type) && onOpenZap ? (_pk, authority) => onOpenZap(authority) : undefined } - className="hover:underline break-all min-w-0 text-primary flex-1" + className={cn(PRIMARY_LINK_HOVER_CLASS, 'break-all min-w-0 flex-1')} > {method.authority} diff --git a/src/components/PaytoLink/index.tsx b/src/components/PaytoLink/index.tsx index 7c49bbcb..2e742af6 100644 --- a/src/components/PaytoLink/index.tsx +++ b/src/components/PaytoLink/index.tsx @@ -10,10 +10,12 @@ import { getPaytoLogoPath, getPaytoProfileUrl, isKnownPaytoType, - isLightningPaytoType + isLightningPaytoType, + isZappableLightningPaytoType } from '@/lib/payto' import PaytoDialog from '@/components/PaytoDialog' import { HelpCircle } from 'lucide-react' +import { PRIMARY_LINK_HOVER_CLASS, URI_LINK_CLASS } from '@/lib/link-styles' import { cn } from '@/lib/utils' export default function PaytoLink({ @@ -58,7 +60,7 @@ export default function PaytoLink({ const info = getPaytoTypeInfo(type) const known = isKnownPaytoType(type) const isLightning = isLightningPaytoType(type) - const canZap = isLightning && !!pubkey && !!onOpenZap + const canZap = isZappableLightningPaytoType(type) && !!pubkey && !!onOpenZap const handleClick = (e: React.MouseEvent) => { e.preventDefault() @@ -112,7 +114,8 @@ export default function PaytoLink({ target="_blank" rel="noopener noreferrer" className={cn( - 'text-primary hover:underline cursor-pointer text-left break-words inline-flex items-center gap-1.5', + URI_LINK_CLASS, + 'cursor-pointer text-left inline-flex items-center gap-1.5', className )} title={ @@ -133,7 +136,8 @@ export default function PaytoLink({ type="button" onClick={handleClick} className={cn( - 'text-primary hover:underline cursor-pointer text-left break-words inline-flex items-center gap-1.5', + URI_LINK_CLASS, + 'cursor-pointer text-left inline-flex items-center gap-1.5', className )} title={ diff --git a/src/components/Profile/index.tsx b/src/components/Profile/index.tsx index 11fe6604..ef91b954 100644 --- a/src/components/Profile/index.tsx +++ b/src/components/Profile/index.tsx @@ -86,12 +86,13 @@ import { FAST_READ_RELAY_URLS, FAST_WRITE_RELAY_URLS } from '@/constants' import { nip66Service } from '@/services/nip66.service' import PaymentMethodsSection from '@/components/PaymentMethodsSection' import { - getAlternativePaymentMethods, groupPaymentMethodsByDisplayType, mergePaymentMethods, + recipientHasAnyPaymentOptions, sortMergedPaymentMethods } from '@/lib/merge-payment-methods' -import { isLightningPaytoType } from '@/lib/payto' +import { PRIMARY_LINK_HOVER_CLASS } from '@/lib/link-styles' +import { cn } from '@/lib/utils' export default function Profile({ id, @@ -139,8 +140,8 @@ export default function Profile({ const { relaySets, favoriteRelays } = useFavoriteRelays() const mergedPaymentMethods = useMemo( - () => sortMergedPaymentMethods(mergePaymentMethods(paymentInfo, profile ?? null)), - [paymentInfo, profile] + () => sortMergedPaymentMethods(mergePaymentMethods(paymentInfo, profile ?? null, profileEvent)), + [paymentInfo, profile, profileEvent] ) const paymentMethodsByType = useMemo( @@ -148,11 +149,10 @@ export default function Profile({ [mergedPaymentMethods] ) - const hasTipDialog = useMemo(() => { - const merged = sortMergedPaymentMethods(mergePaymentMethods(paymentInfo, profile ?? null)) - if (merged.some((m) => isLightningPaytoType(m.type))) return true - return getAlternativePaymentMethods(merged).length > 0 - }, [paymentInfo, profile]) + const hasTipDialog = useMemo( + () => recipientHasAnyPaymentOptions(paymentInfo, profile ?? null, profileEvent), + [paymentInfo, profile, profileEvent] + ) const syncAuthorReplaceablesFromCache = useCallback(async (pubkey: string) => { try { @@ -563,13 +563,16 @@ export default function Profile({ /> {/* Display websites - show first one prominently, others below */} {website && ( -
- +
+ {website} @@ -578,13 +581,22 @@ export default function Profile({ {websiteList && websiteList.length > 1 && (
{websiteList.slice(1).map((url: string, idx: number) => ( -
- +
+ {url} diff --git a/src/components/ProfileAbout/index.tsx b/src/components/ProfileAbout/index.tsx index 1d5377ee..c10d3b69 100644 --- a/src/components/ProfileAbout/index.tsx +++ b/src/components/ProfileAbout/index.tsx @@ -8,6 +8,8 @@ import { } from '@/lib/content-parser' import { replaceStandardEmojiShortcodesInContent } from '@/lib/emoji-content' import PaytoLink from '@/components/PaytoLink' +import { URI_LINK_CLASS } from '@/lib/link-styles' +import { cn } from '@/lib/utils' import { marked } from 'marked' import { EmbeddedHashtag, @@ -53,11 +55,7 @@ export default function ProfileAbout({ about, className }: { about?: string; cla } if (node.type === 'payto') { return ( - + ) } if (node.type === 'hashtag') { @@ -120,11 +118,7 @@ export default function ProfileAbout({ about, className }: { about?: string; cla const label = String(token.text ?? href) if (href.startsWith('payto://')) { out.push( - + {label} ) @@ -135,7 +129,7 @@ export default function ProfileAbout({ about, className }: { about?: string; cla href={href} target="_blank" rel="noopener noreferrer" - className="text-green-600 dark:text-green-400 hover:text-green-700 dark:hover:text-green-300 hover:underline break-words" + className={URI_LINK_CLASS} > {label} diff --git a/src/components/RelayInfo/index.tsx b/src/components/RelayInfo/index.tsx index f141363d..160654a4 100644 --- a/src/components/RelayInfo/index.tsx +++ b/src/components/RelayInfo/index.tsx @@ -96,7 +96,7 @@ export default function RelayInfo({ url, className }: { url: string; className?: {normalizeHttpUrl(relayInfo.url)} diff --git a/src/components/RelayStatusDisplay/index.tsx b/src/components/RelayStatusDisplay/index.tsx index 546bcc28..9a8a5233 100644 --- a/src/components/RelayStatusDisplay/index.tsx +++ b/src/components/RelayStatusDisplay/index.tsx @@ -71,7 +71,7 @@ function renderTextWithLinks(text: string): React.ReactNode { href={url} target="_blank" rel="noopener noreferrer" - className="text-blue-600 dark:text-blue-400 hover:underline break-all" + className="text-blue-600 dark:text-blue-400 hover:text-foreground hover:underline underline-offset-2 transition-colors break-all" onClick={(e) => e.stopPropagation()} > {url} diff --git a/src/components/RssFeedItem/index.tsx b/src/components/RssFeedItem/index.tsx index 7ed825cf..4b303a86 100644 --- a/src/components/RssFeedItem/index.tsx +++ b/src/components/RssFeedItem/index.tsx @@ -914,7 +914,7 @@ export default function RssFeedItem({ href={item.link} target="_blank" rel="noopener noreferrer" - className="text-primary hover:underline inline-flex items-center gap-1 min-w-0 truncate" + className="text-primary hover:text-foreground hover:underline underline-offset-2 transition-colors inline-flex items-center gap-1 min-w-0 truncate" onClick={(e) => e.stopPropagation()} > {t('Read full article')} diff --git a/src/components/StandardRssFeedUrlRow/index.tsx b/src/components/StandardRssFeedUrlRow/index.tsx index 00da83ad..c00350f3 100644 --- a/src/components/StandardRssFeedUrlRow/index.tsx +++ b/src/components/StandardRssFeedUrlRow/index.tsx @@ -68,7 +68,7 @@ export default function StandardRssFeedUrlRow({ feedUrl, className, actions }: P href={feedUrl} target="_blank" rel="noopener noreferrer" - className="block break-all text-xs text-primary hover:underline" + className="block break-all text-xs text-primary hover:text-foreground hover:underline underline-offset-2 transition-colors" onClick={(e) => e.stopPropagation()} > {feedUrl} diff --git a/src/components/UniversalContent/Wikilink.tsx b/src/components/UniversalContent/Wikilink.tsx index 32bca6af..5603b0ee 100644 --- a/src/components/UniversalContent/Wikilink.tsx +++ b/src/components/UniversalContent/Wikilink.tsx @@ -22,7 +22,7 @@ export default function Wikilink({ dTag, displayText, className }: WikilinkProps