npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

@getbluma/tiktok-text

v1.0.6

Published

TikTok-style text component with outline effects

Readme

@getbluma/tiktok-text

TikTok-style text components with outline effects using SVG rendering.

Installation

npm install @getbluma/tiktok-text
# or
pnpm add @getbluma/tiktok-text

Font Setup

This package includes the TikTok Sans variable font. Use the built-in helper to load it:

import { useEffect } from 'react';
import { loadTikTokFont } from '@getbluma/tiktok-text';

export const App: React.FC = () => {
  useEffect(() => {
    loadTikTokFont('/fonts/TikTokSans-Variable.ttf');
  }, []);

  return <TikTokText>Hello World</TikTokText>;
};

Copy the font from node_modules/@getbluma/tiktok-text/fonts/ to your public folder.

Components

TikTokText

Simple text without outline.

import { TikTokText } from '@getbluma/tiktok-text';

<TikTokText>Hello World</TikTokText>
<TikTokText size="xl" weight={550}>Big Text</TikTokText>
<TikTokText theme="cyan">Cyan themed text</TikTokText>

TikTokTextOutline

Text with SVG stroke outline (TikTok caption style).

import { TikTokTextOutline } from '@getbluma/tiktok-text';

// Using theme (recommended)
<TikTokTextOutline theme="cyan">Cyan Theme</TikTokTextOutline>
<TikTokTextOutline theme="paleYellow">Pale Yellow Theme</TikTokTextOutline>
<TikTokTextOutline theme="peach">Peach Theme</TikTokTextOutline>

// Custom colors
<TikTokTextOutline color="#FFFF00" outlineColor="#FF0000">
  Yellow with Red Outline
</TikTokTextOutline>

// With gradient fill
<TikTokTextOutline
  gradient={{
    type: 'linear',
    angle: 90,
    stops: [
      { offset: '0%', color: '#FF0000' },
      { offset: '100%', color: '#FFFF00' }
    ]
  }}
>
  Gradient Text
</TikTokTextOutline>

TikTokTextBlock

Text with gooey/rounded background effect (perfect for multi-line captions).

import { TikTokTextBlock } from '@getbluma/tiktok-text';

// Using theme (recommended)
<TikTokTextBlock theme="purple">Hello World</TikTokTextBlock>
<TikTokTextBlock theme="paleYellow" size="m" weight={450}>
  {"- from someone who got into stanford,\n yale, & other t20's! ('29)"}
</TikTokTextBlock>
<TikTokTextBlock theme="peach" weight={550}>
  {"you are killing\nme inside"}
</TikTokTextBlock>

// Step indicator style (white bg, black text)
<TikTokTextBlock theme="white">
  1. first step title
</TikTokTextBlock>

// Multi-line text with gooey wrap effect
<TikTokTextBlock theme="lavender" size="l" weight={550}>
  {"lavender theme\nwith two lines"}
</TikTokTextBlock>

// Using custom hex colors (overrides theme)
<TikTokTextBlock backgroundColor="#FF69B4" color="#FFFFFF">
  Custom Pink
</TikTokTextBlock>

// With maxWidth for auto word-wrapping
<TikTokTextBlock theme="purple" maxWidth={500}>
  This text will automatically wrap when it exceeds 500px width
</TikTokTextBlock>

// With custom font
<TikTokTextBlock theme="cyan" fontFamily="Arial, sans-serif">
  Custom Font Text
</TikTokTextBlock>

Props

Common Props (all components)

| Prop | Type | Default | Description | |------|------|---------|-------------| | children | ReactNode | required | Text content | | size | TextSize \| number | 'm' (48px) | Size preset or custom pixels | | weight | FontWeight \| number | 'semibold' (550) | Weight preset or custom 100-900 | | theme | ColorPreset | - | Color theme preset | | color | string | from theme | Text color (overrides theme) | | style | CSSProperties | {} | Additional CSS styles | | className | string | '' | CSS class name |

Size Presets

| Preset | Pixels | |--------|--------| | xs | 24px | | s | 32px | | m | 48px | | l | 64px | | xl | 84px | | xxl | 96px | | xxxl | 128px |

Weight Presets

| Preset | Value | |--------|-------| | light | 250 | | regular | 350 | | medium | 450 | | semibold | 550 | | bold | 650 | | extrabold | 750 | | black | 850 |

Color Themes

Themes provide coordinated color pairs (primary for fill/background, secondary for outline/text):

| Theme | Primary | Secondary | Best For | |-------|---------|-----------|----------| | white | #FFFFFF | #000000 | Light backgrounds | | black | #000000 | #FFFFFF | Dark text | | cyan | #00A8CD | #FFFFFF | Bright accents | | paleYellow | #FFF7A7 | #B0642A | Warm highlights | | peach | #F8E2D7 | #DF3932 | Soft warm tones | | pink | #FAC2FF | #922BAA | Feminine accents | | lavender | #B4AFFF | #402FB0 | Soft purple | | skyBlue | #8ADDEB | #105B68 | Cool tones | | periwinkle | #95ABFF | #21337A | Blue-purple | | purple | #9A66F1 | #FFFFFF | Bold purple | | indigo | #5756D5 | #FFFFFF | Deep purple-blue | | blue | #3496EF | #FFFFFF | Standard blue | | darkBlue | #2444B3 | #FFFFFF | Deep blue | | green | #77C25D | #FFFFFF | Natural green | | teal | #00B09B | #FFFFFF | Blue-green | | yellow | #F2CE46 | #FFFFFF | Bright yellow | | orange | #FF923D | #FFFFFF | Warm orange | | red | #EA4040 | #FFFFFF | Alert red | | magenta | #CA2FFE | #FFFFFF | Vivid pink | | dustyRose | #D26793 | #FFFFFF | Muted pink | | brown | #412E28 | #FFFFFF | Earth tone | | rust | #B2533D | #FFFFFF | Warm brown | | olive | #A4895A | #FFFFFF | Muted green | | darkGreen | #32523B | #FFFFFF | Forest green | | darkTeal | #2E698E | #FFFFFF | Deep teal | | navy | #223655 | #FFFFFF | Dark blue | | gray | #92979D | #FFFFFF | Neutral | | darkGray | #333333 | #FFFFFF | Dark neutral |

TikTokTextOutline Additional Props

| Prop | Type | Default | Description | |------|------|---------|-------------| | outlineColor | string | from theme | Stroke color (overrides theme) | | align | 'left' \| 'center' \| 'right' | 'center' | Text alignment | | maxCharsPerLine | number | - | Text wrapping threshold | | lineHeight | number | 1.4 | Line height multiplier | | letterSpacing | number | 0 | Letter spacing in pixels | | wordSpacing | number | 0 | Word spacing in pixels | | strokeWidth | number | auto | Explicit stroke width | | strokeRatio | number | 0.16 | Stroke ratio relative to font size | | italic | boolean | false | Italic style | | opacity | number | 1 | Global opacity (0-1) | | fillOpacity | number | - | Fill-only opacity | | strokeOpacity | number | - | Stroke-only opacity | | textDecoration | TextDecoration | 'none' | underline, overline, line-through | | textTransform | TextTransform | 'none' | uppercase, lowercase, capitalize | | rotate | number | 0 | Rotation in degrees | | skewX | number | 0 | Horizontal skew in degrees | | skewY | number | 0 | Vertical skew in degrees | | scaleX | number | 1 | Horizontal scale | | scaleY | number | 1 | Vertical scale | | dx | number | 0 | Horizontal offset | | dy | number | 0 | Vertical offset | | shadow | TextShadow | - | Drop shadow config | | gradient | TextGradient | - | Gradient fill config | | svgWidth | number | 1000 | SVG viewBox width |

TikTokTextBlock Additional Props

| Prop | Type | Default | Description | |------|------|---------|-------------| | backgroundColor | string | from theme | Background color (overrides theme) | | align | 'left' \| 'center' \| 'right' | 'center' | Text alignment | | textTransform | TextTransform | 'lowercase' | Text transform | | lineHeight | number | 1.4 | Line height multiplier (auto-boosted for small sizes) | | letterSpacing | number | -1 | Letter spacing in pixels | | paddingX | number | 0.5 | Horizontal padding in em units | | paddingTop | number | 6 | Top padding in pixels | | paddingBottom | number | 10 | Bottom padding in pixels | | blurRadius | number | auto | Blur radius for gooey effect (auto-scales with font size) | | maxWidth | number \| string | - | Max width for text wrapping (enables word wrap when set) | | fontFamily | string | TikTok Sans | Custom font family | | filterId | string | auto | Custom SVG filter ID |

Shadow Config

shadow={{
  offsetX: 4,
  offsetY: 4,
  blur: 8,
  color: 'rgba(0,0,0,0.5)'
}}

Gradient Config

gradient={{
  type: 'linear', // or 'radial'
  angle: 90,      // for linear gradients
  stops: [
    { offset: '0%', color: '#FF0000' },
    { offset: '100%', color: '#FFFF00' }
  ]
}}

Utilities

loadTikTokFont

Helper function to load the TikTok Sans variable font.

import { loadTikTokFont, isTikTokFontLoaded } from '@getbluma/tiktok-text';

// Load the font
await loadTikTokFont('/path/to/TikTokSans-Variable.ttf');

// Check if loaded
if (isTikTokFontLoaded()) {
  console.log('Font ready!');
}

wrapText

Helper function to wrap text by character count.

import { wrapText } from '@getbluma/tiktok-text';

const lines = wrapText('Long text that needs wrapping', 20);
// Returns: ['Long text that needs', 'wrapping']

Exports

// Components
export { TikTokText, TikTokTextOutline, TikTokTextBlock } from '@getbluma/tiktok-text';

// Font utilities
export { loadTikTokFont, isTikTokFontLoaded, TIKTOK_SANS } from '@getbluma/tiktok-text';

// Helper functions
export { wrapText } from '@getbluma/tiktok-text';

// Types
export type {
  TikTokTextProps,
  TikTokTextOutlineProps,
  TikTokTextBlockProps,
  ColorPreset,
  TextSize,
  FontWeight,
  TextAlign,
  TextDecoration,
  TextTransform,
  TextShadow,
  TextGradient,
  GradientStop,
} from '@getbluma/tiktok-text';

License

MIT

TikTok Sans font is licensed under SIL Open Font License.