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

wakeb-font

v1.0.2

Published

Offline Arabic & Latin fonts with tree-shakable CSS subpath imports. Zero JS runtime.

Downloads

56

Readme


Features

  • Zero JS — Pure CSS @font-face declarations, no runtime JavaScript
  • Tree-shakable — Import only the weights you need, bundlers drop the rest
  • Offline — All .woff2 files are bundled, no external network requests
  • Tiny — woff2 format only, font-display: swap for instant text
  • Universal — Works with Vite, Nuxt, Next.js, Webpack, Astro, plain HTML
  • Dynamic loading — Optional JS helper to load fonts on demand
  • 21 font families — 8 Arabic + 13 Latin, 100+ weight/style combinations

Install

npm i wakeb-font
# or
yarn add wakeb-font
# or
pnpm add wakeb-font

Quick Start

// Import all weights of a font
import "wakeb-font/cairo";

// Import specific weights only (tree-shaking)
import "wakeb-font/cairo/400";
import "wakeb-font/cairo/700";
body {
  font-family: "Cairo", sans-serif;
}

That's it. No config, no plugins, no JS overhead.

Dynamic Loading

Load fonts on demand using the JS helper:

import { loadFont, getFontMeta, listFonts } from "wakeb-font";

// Load a font (imports its CSS dynamically)
const { family } = await loadFont("cairo");
const { family } = await loadFont("poppins", 700); // specific weight

// Get metadata without loading
getFontMeta("inter"); // { family: "Inter", weights: [100..900] }

// List all available fonts
listFonts(); // ["29lt-bukra", "cairo", "poppins", ...]

Framework Integration

Vite / Vue / React

// main.js
import "wakeb-font/cairo";
import "wakeb-font/poppins/400";

Nuxt 3

// nuxt.config.ts
export default defineNuxtConfig({
  css: ["wakeb-font/cairo", "wakeb-font/expo-arabic/700"],
});

Next.js

// app/layout.js
import "wakeb-font/inter";

Tailwind CSS

// tailwind.config.js
module.exports = {
  theme: {
    fontFamily: {
      sans: ['"Cairo"', "sans-serif"],
      mono: ['"Trip Sans Mono"', "monospace"],
    },
  },
};

Plain HTML

<link rel="stylesheet" href="node_modules/wakeb-font/cairo/index.css" />

Available Fonts

Arabic

| Font | font-family | Import | Weights | | -------------------- | ------------------------ | --------------------------------- | -------------------------------------- | | 29LT Bukra | "29LT Bukra" | wakeb-font/29lt-bukra | 300, 400, 500, 700 | | 29LT Kaff | "29LT Kaff" | wakeb-font/29lt-kaff | 200, 300, 400, 600, 900 | | Cairo | "Cairo" | wakeb-font/cairo | 200, 300, 400, 500, 600, 700, 800, 900 | | DIN Next LT Arabic | "DIN Next LT Arabic" | wakeb-font/din-next-lt-arabic | 400 | | Droid Kufi | "Droid Kufi" | wakeb-font/droid-kufi | 400 | | Expo Arabic | "Expo Arabic" | wakeb-font/expo-arabic | 300, 400, 500, 700 | | IBM Plex Sans Arabic | "IBM Plex Sans Arabic" | wakeb-font/ibm-plex-sans-arabic | 100, 200, 300, 400, 500, 600, 700 | | Tajawal | "Tajawal" | wakeb-font/tajawal | 200, 300, 400, 500, 700, 800, 900 |

Latin

| Font | font-family | Import | Weights | | -------------- | ------------------ | --------------------------- | --------------------------------- | | Clash Display | "Clash Display" | wakeb-font/clash-display | variable | | Inter | "Inter" | wakeb-font/inter | 100–900 | | Lato | "Lato" | wakeb-font/lato | 100, 300, 400, 700, 900 (+italic) | | Open Sans | "Open Sans" | wakeb-font/open-sans | 300–800 (+italic) | | Playwrite IE | "Playwrite IE" | wakeb-font/playwrite-ie | 100, 200, 300, 400 | | Poppins | "Poppins" | wakeb-font/poppins | 100–900 (+italic) | | Public Sans | "Public Sans" | wakeb-font/public-sans | 400 | | Rethink Sans | "Rethink Sans" | wakeb-font/rethink-sans | variable, variable-italic | | Rubik | "Rubik" | wakeb-font/rubik | 300–900 (+italic) | | Times | "Times" | wakeb-font/times | 400 | | Trip Sans | "Trip Sans" | wakeb-font/trip-sans | variable | | Trip Sans Mono | "Trip Sans Mono" | wakeb-font/trip-sans-mono | 400 |

Italic & Variable Variants

// Italic — append 'i' to the weight
import "wakeb-font/poppins/400i";
import "wakeb-font/lato/700i";
import "wakeb-font/rubik/500i";

// Variable fonts
import "wakeb-font/clash-display/variable";
import "wakeb-font/rethink-sans/variable";
import "wakeb-font/rethink-sans/variable-italic";

How It Works

wakeb-font/
  cairo/
    index.css        ← @import all weight files
    400.css          ← @font-face { src: url("./Cairo-Regular.woff2") }
    700.css          ← @font-face { src: url("./Cairo-Bold.woff2") }
    Cairo-Regular.woff2
    Cairo-Bold.woff2
    ...

Each subpath export (wakeb-font/cairo/400) resolves to a single CSS file with an @font-face declaration pointing to a co-located .woff2 file. Your bundler only includes the CSS + font files you actually import.

License

MIT © Wakeb

wakeb-font

Offline Arabic & Latin fonts with tree-shakable CSS subpath imports.

  • Zero runtime JS
  • Works with Vite / Nuxt / Webpack / any bundler
  • font-display: swap for fast rendering
  • woff2 only — smallest file size
  • 21 font families, 100+ weights

Install

npm i wakeb-font

Usage

Import all weights of a font

import "wakeb-font/cairo";

Import specific weights (tree-shaking)

import "wakeb-font/cairo/400";
import "wakeb-font/cairo/700";

Use in CSS

body {
  font-family: "Cairo", sans-serif;
}

Framework Examples

Vite / Vue / React

// main.js or main.ts
import "wakeb-font/cairo";
import "wakeb-font/ibm-plex-sans-arabic/400";

Nuxt

// nuxt.config.ts
export default defineNuxtConfig({
  css: ["wakeb-font/cairo", "wakeb-font/expo-arabic/700"],
});

Webpack

// index.js
import "wakeb-font/inter";

Plain HTML

<link rel="stylesheet" href="node_modules/wakeb-font/cairo/index.css" />

Available Fonts

| Font | CSS font-family | Import | Weights | | -------------------- | ------------------------ | --------------------------------- | ------------------------------------------- | | 29LT Bukra | "29LT Bukra" | wakeb-font/29lt-bukra | 300, 400, 500, 700 | | 29LT Kaff | "29LT Kaff" | wakeb-font/29lt-kaff | 200, 300, 400, 600, 900 | | Cairo | "Cairo" | wakeb-font/cairo | 200, 300, 400, 500, 600, 700, 800, 900 | | Clash Display | "Clash Display" | wakeb-font/clash-display | variable | | DIN Next LT Arabic | "DIN Next LT Arabic" | wakeb-font/din-next-lt-arabic | 400 | | Droid Kufi | "Droid Kufi" | wakeb-font/droid-kufi | 400 | | Expo Arabic | "Expo Arabic" | wakeb-font/expo-arabic | 300, 400, 500, 700 | | IBM Plex Sans Arabic | "IBM Plex Sans Arabic" | wakeb-font/ibm-plex-sans-arabic | 100, 200, 300, 400, 500, 600, 700 | | Inter | "Inter" | wakeb-font/inter | 100, 200, 300, 400, 500, 600, 700, 800, 900 | | Lato | "Lato" | wakeb-font/lato | 100, 300, 400, 700, 900 (+italic) | | Open Sans | "Open Sans" | wakeb-font/open-sans | 300, 400, 500, 600, 700, 800 (+italic) | | Playwrite IE | "Playwrite IE" | wakeb-font/playwrite-ie | 100, 200, 300, 400 | | Poppins | "Poppins" | wakeb-font/poppins | 100–900 (+italic) | | Public Sans | "Public Sans" | wakeb-font/public-sans | 400 | | Rethink Sans | "Rethink Sans" | wakeb-font/rethink-sans | variable, variable-italic | | Roboto | "Roboto" | wakeb-font/roboto | variable, variable-italic | | Rubik | "Rubik" | wakeb-font/rubik | 300–900 (+italic) | | Tajawal | "Tajawal" | wakeb-font/tajawal | 200, 300, 400, 500, 700, 800, 900 | | Times | "Times" | wakeb-font/times | 400 | | Trip Sans | "Trip Sans" | wakeb-font/trip-sans | variable | | Trip Sans Mono | "Trip Sans Mono" | wakeb-font/trip-sans-mono | 400 |

Import examples

// All weights
import "wakeb-font/ibm-plex-sans-arabic";

// Single weight
import "wakeb-font/ibm-plex-sans-arabic/400";
import "wakeb-font/inter/700";
import "wakeb-font/poppins/600";
import "wakeb-font/tajawal/500";

// Italic variants (append 'i' to weight)
import "wakeb-font/lato/400i";
import "wakeb-font/poppins/700i";
import "wakeb-font/rubik/500i";

// Variable fonts
import "wakeb-font/roboto/variable";
import "wakeb-font/roboto/variable-italic";
import "wakeb-font/clash-display/variable";

How it works

Each import resolves to a plain CSS file containing @font-face declarations with relative paths to bundled .woff2 files. No JavaScript is executed at runtime. Bundlers only include the weights you actually import.

Publish

npm login
npm publish --access public

License

MIT

wakeb-font

Offline Arabic & Latin fonts with tree-shakable CSS subpath imports.

  • Zero runtime JS
  • Works with Vite / Nuxt / Webpack / any bundler
  • font-display: swap for fast rendering
  • woff2 only — smallest file size

Install

npm i wakeb-font

Usage

Import all weights

import "wakeb-font/cairo";

Import specific weights (tree-shaking)

import "wakeb-font/cairo/400";
import "wakeb-font/cairo/700";

Use in CSS

body {
  font-family: "Cairo", sans-serif;
}

Framework Examples

Vite / Vue / React

// main.js or main.ts
import "wakeb-font/cairo";

Nuxt

// nuxt.config.ts
export default defineNuxtConfig({
  css: ["wakeb-font/cairo"],
});

Webpack

// index.js
import "wakeb-font/cairo";

Plain HTML

<link rel="stylesheet" href="node_modules/wakeb-font/cairo/index.css" />

Available Fonts

| Font | Weights | Import path | | ----- | -------- | ------------------ | | Cairo | 400, 700 | wakeb-font/cairo |

Weight imports

| Weight | Import path | | ------ | ---------------------- | | 400 | wakeb-font/cairo/400 | | 700 | wakeb-font/cairo/700 |

How it works

Each import resolves to a plain CSS file containing @font-face declarations with relative paths to bundled .woff2 files. No JavaScript is executed at runtime.

wakeb-font/
  cairo/
    index.css                          ← imports 400.css + 700.css
    400.css                            ← @font-face for weight 400
    700.css                            ← @font-face for weight 700
    cairo-arabic-400-normal.woff2      ← Arabic subset
    cairo-latin-400-normal.woff2       ← Latin subset
    cairo-latin-ext-400-normal.woff2   ← Latin Extended subset
    cairo-arabic-700-normal.woff2
    cairo-latin-700-normal.woff2
    cairo-latin-ext-700-normal.woff2

Unicode-range subsetting ensures the browser only downloads the subsets it actually needs.

Publish

npm login
npm publish --access public

License

MIT