The best way to embed tweets in your Svelte app, supporting both SSR and static prerendering modes.
This package is a Svelte version of vercel/react-tweet licensed under MIT License, many thanks to the original authors for making it possible!
This repo is fork of fayez-nazzal/sveltekit-tweet
runes
)npx nypm add sveltweet
The simplest way to embed tweets is using SvelteKit's remote functions. This approach allows you to fetch tweet data directly inside your components without setting up separate server files.
Create a remote function to fetch tweet data:
// src/lib/tweet.remote.ts
import { query } from '@sveltejs/kit';
import { getTweet } from 'sveltweet/api';
export const getTweetData = query(async (id: string) => getTweet(id));
Use it directly in your component:
Recommended way to use the Tweet
component with remote functions:
<script lang='ts'>
import { Tweet } from 'sveltweet';
import { getTweetData } from '$lib/tweet.remote';
</script>
<!-- Recommended: Using await directly -->
<svelte:boundary>
<Tweet tweet={await getTweetData(tweetId)} />
{#snippet pending()}
<TweetSkeleton />
{/snippet}
{#snippet failed()}
<TweetNotFound />
{/snippet}
</svelte:boundary>
Or, if you prefer to handle loading states manually:
<script lang='ts'>
import { Tweet } from 'sveltweet';
import { getTweetData } from '$lib/tweet.remote';
const tweetId = '1234567890';
const tweet = getTweetData(tweetId);
</script>
<!-- Alternative: Using {#if} block for loading states -->
{#if tweet.error}
<p>Error loading tweet: {tweet.error.message}</p>
{:else if tweet.loading}
<p>Loading tweet...</p>
{:else if tweet.ready}
<Tweet tweet={tweet.current} />
{/if}
[!NOTE] Remote functions and await syntax require configuration. See the SvelteKit remote functions documentation and Svelte await expressions documentation for setup instructions.
[!IMPORTANT] When using
await
directly, make sure to wrap your component with<svelte:boundary>
for error handling. See the Svelte boundary documentation for details.
If you prefer the traditional approach or need more control over data loading:
Go to the tweet you want to embed. You will find the URL
Use the getTweet
function in your +page.server.ts
file to fetch the tweet data.
import { getTweet } from 'sveltweet/api';
import { error } from '@sveltejs/kit';
import type { RequestEvent } from './$types';
export async function load({ params }: RequestEvent) {
const { id } = params;
try {
const tweet = await getTweet(id);
return { tweet };
}
catch {
return error(500, 'Could not load tweet');
}
}
Use the Tweet
component in your +page.svelte
file to render the tweet.
<script lang='ts'>
import { Tweet } from 'sveltweet';
import type { PageData } from './$types';
const { data }: { data: PageData } = $props()
</script>
<Tweet tweet={data.tweet} />
<script lang='ts'>
import { Tweet } from 'sveltweet';
import { getTweet } from 'sveltweet/api';
const id = '';
</script>
{#await getTweet(id) then tweet}
<Tweet tweet={data.tweet} />
{/await}
Tweet
shares the same CSS file with react-tweet
.
So, refer to the Custom Theme
section in the react-tweet
documentation to customise the tweet appearance.