import React from 'react'; import type { ShTangledString } from '@atcute/tangled'; import { useColorScheme, type ColorSchemePreference } from '../hooks/useColorScheme'; export type TangledStringRecord = ShTangledString.Main; export interface TangledStringRendererProps { record: TangledStringRecord; error?: Error; loading: boolean; colorScheme?: ColorSchemePreference; did: string; rkey: string; canonicalUrl?: string; } export const TangledStringRenderer: React.FC = ({ record, error, loading, colorScheme = 'system', did, rkey, canonicalUrl }) => { const scheme = useColorScheme(colorScheme); if (error) return
Failed to load snippet.
; if (loading && !record) return
Loading…
; const palette = scheme === 'dark' ? theme.dark : theme.light; const viewUrl = canonicalUrl ?? `https://tangled.org/strings/${did}/${encodeURIComponent(rkey)}`; const timestamp = new Date(record.createdAt).toLocaleString(undefined, { dateStyle: 'medium', timeStyle: 'short' }); return (
{record.filename}
View on Tangled
{record.description && (
{record.description}
)}
				{record.contents}
			
); }; const base: Record = { container: { fontFamily: 'system-ui, sans-serif', borderRadius: 6, overflow: 'hidden', transition: 'background-color 180ms ease, border-color 180ms ease, color 180ms ease, box-shadow 180ms ease', width: '100%' }, header: { padding: '10px 16px', display: 'flex', justifyContent: 'space-between', alignItems: 'center', gap: 12 }, headerRight: { display: 'flex', alignItems: 'center', gap: 12, flexWrap: 'wrap', justifyContent: 'flex-end' }, filename: { fontFamily: 'SFMono-Regular, ui-monospace, Menlo, Monaco, "Courier New", monospace', fontSize: 13, wordBreak: 'break-all' }, timestamp: { fontSize: 12 }, headerLink: { fontSize: 12, fontWeight: 600, textDecoration: 'none' }, description: { padding: '10px 16px', fontSize: 13, borderTop: '1px solid transparent' }, codeBlock: { margin: 0, padding: '16px', fontSize: 13, overflowX: 'auto', borderTop: '1px solid transparent', fontFamily: 'SFMono-Regular, ui-monospace, Menlo, Monaco, "Courier New", monospace' } }; const theme = { light: { container: { border: '1px solid #d0d7de', background: '#f6f8fa', color: '#1f2328', boxShadow: '0 1px 2px rgba(31,35,40,0.05)' }, header: { background: '#f6f8fa', borderBottom: '1px solid #d0d7de' }, headerRight: {}, filename: { color: '#1f2328' }, timestamp: { color: '#57606a' }, headerLink: { color: '#2563eb' }, description: { background: '#ffffff', borderBottom: '1px solid #d0d7de', borderTopColor: '#d0d7de', color: '#1f2328' }, codeBlock: { background: '#ffffff', color: '#1f2328', borderTopColor: '#d0d7de' } }, dark: { container: { border: '1px solid #30363d', background: '#0d1117', color: '#c9d1d9', boxShadow: '0 0 0 1px rgba(1,4,9,0.3) inset' }, header: { background: '#161b22', borderBottom: '1px solid #30363d' }, headerRight: {}, filename: { color: '#c9d1d9' }, timestamp: { color: '#8b949e' }, headerLink: { color: '#58a6ff' }, description: { background: '#161b22', borderBottom: '1px solid #30363d', borderTopColor: '#30363d', color: '#c9d1d9' }, codeBlock: { background: '#0d1117', color: '#c9d1d9', borderTopColor: '#30363d' } } } satisfies Record<'light' | 'dark', Record>; export default TangledStringRenderer;