react-fontpicker-ts-lite
Version:
A Google font picker component for React
2,436 lines (2,428 loc) • 52.9 kB
JavaScript
"use strict";
var __defProp = Object.defineProperty;
var __defProps = Object.defineProperties;
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
var __getOwnPropNames = Object.getOwnPropertyNames;
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __propIsEnum = Object.prototype.propertyIsEnumerable;
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
var __spreadValues = (a, b) => {
for (var prop in b || (b = {}))
if (__hasOwnProp.call(b, prop))
__defNormalProp(a, prop, b[prop]);
if (__getOwnPropSymbols)
for (var prop of __getOwnPropSymbols(b)) {
if (__propIsEnum.call(b, prop))
__defNormalProp(a, prop, b[prop]);
}
return a;
};
var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
var __objRest = (source, exclude) => {
var target = {};
for (var prop in source)
if (__hasOwnProp.call(source, prop) && exclude.indexOf(prop) < 0)
target[prop] = source[prop];
if (source != null && __getOwnPropSymbols)
for (var prop of __getOwnPropSymbols(source)) {
if (exclude.indexOf(prop) < 0 && __propIsEnum.call(source, prop))
target[prop] = source[prop];
}
return target;
};
var __esm = (fn, res) => function __init() {
return fn && (res = (0, fn[__getOwnPropNames(fn)[0]])(fn = 0)), res;
};
var __export = (target, all) => {
for (var name in all)
__defProp(target, name, { get: all[name], enumerable: true });
};
var __copyProps = (to, from, except, desc) => {
if (from && typeof from === "object" || typeof from === "function") {
for (let key of __getOwnPropNames(from))
if (!__hasOwnProp.call(to, key) && key !== except)
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
}
return to;
};
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
var __async = (__this, __arguments, generator) => {
return new Promise((resolve, reject) => {
var fulfilled = (value) => {
try {
step(generator.next(value));
} catch (e) {
reject(e);
}
};
var rejected = (value) => {
try {
step(generator.throw(value));
} catch (e) {
reject(e);
}
};
var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected);
step((generator = generator.apply(__this, __arguments)).next());
});
};
// font-preview/font-previews.css
var init_font_previews = __esm({
"font-preview/font-previews.css"() {
}
});
// src/components/FontPreviews.tsx
var FontPreviews_exports = {};
__export(FontPreviews_exports, {
default: () => FontPreviews_default
});
var import_jsx_runtime, FontPreviews, FontPreviews_default;
var init_FontPreviews = __esm({
"src/components/FontPreviews.tsx"() {
"use strict";
init_font_previews();
import_jsx_runtime = require("react/jsx-runtime");
FontPreviews = ({ children }) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_jsx_runtime.Fragment, { children });
FontPreviews_default = FontPreviews;
}
});
// index.ts
var index_exports = {};
__export(index_exports, {
default: () => FontPicker,
toString: () => toString
});
module.exports = __toCommonJS(index_exports);
// src/components/FontPicker.tsx
var import_react = require("react");
// font-preview/fontInfo.json
var fontInfo_default = [
{
category: "display",
name: "Abril Fatface",
sane: "abril_fatface",
variants: [
"0,400"
],
subsets: [
"latin",
"latin-ext"
]
},
{
category: "serif",
name: "Alegreya",
sane: "alegreya",
variants: [
"0,400",
"0,500",
"0,600",
"0,700",
"0,800",
"0,900",
"1,400",
"1,500",
"1,600",
"1,700",
"1,800",
"1,900"
],
subsets: [
"cyrillic",
"cyrillic-ext",
"greek",
"greek-ext",
"latin",
"latin-ext",
"vietnamese"
]
},
{
category: "sans-serif",
name: "Alegreya Sans",
sane: "alegreya_sans",
variants: [
"0,100",
"1,100",
"0,300",
"1,300",
"0,400",
"1,400",
"0,500",
"1,500",
"0,700",
"1,700",
"0,800",
"1,800",
"0,900",
"1,900"
],
subsets: [
"cyrillic",
"cyrillic-ext",
"greek",
"greek-ext",
"latin",
"latin-ext",
"vietnamese"
]
},
{
category: "sans-serif",
name: "Archivo Narrow",
sane: "archivo_narrow",
variants: [
"0,400",
"0,500",
"0,600",
"0,700",
"1,400",
"1,500",
"1,600",
"1,700"
],
subsets: [
"latin",
"latin-ext",
"vietnamese"
]
},
{
category: "monospace",
name: "Azeret Mono",
sane: "azeret_mono",
variants: [
"0,100",
"0,200",
"0,300",
"0,400",
"0,500",
"0,600",
"0,700",
"0,800",
"0,900",
"1,100",
"1,200",
"1,300",
"1,400",
"1,500",
"1,600",
"1,700",
"1,800",
"1,900"
],
subsets: [
"latin",
"latin-ext"
]
},
{
category: "handwriting",
name: "Bad Script",
sane: "bad_script",
variants: [
"0,400"
],
subsets: [
"cyrillic",
"cyrillic-ext",
"latin",
"latin-ext",
"vietnamese"
]
},
{
category: "serif",
name: "BioRhyme",
sane: "biorhyme",
variants: [
"0,200",
"0,300",
"0,400",
"0,500",
"0,600",
"0,700",
"0,800"
],
subsets: [
"latin",
"latin-ext"
]
},
{
category: "serif",
name: "Bitter",
sane: "bitter",
variants: [
"0,100",
"0,200",
"0,300",
"0,400",
"0,500",
"0,600",
"0,700",
"0,800",
"0,900",
"1,100",
"1,200",
"1,300",
"1,400",
"1,500",
"1,600",
"1,700",
"1,800",
"1,900"
],
subsets: [
"cyrillic",
"cyrillic-ext",
"latin",
"latin-ext",
"vietnamese"
]
},
{
category: "serif",
name: "Cardo",
sane: "cardo",
variants: [
"0,400",
"1,400",
"0,700"
],
subsets: [
"greek",
"greek-ext",
"latin",
"latin-ext"
]
},
{
category: "sans-serif",
name: "Chivo",
sane: "chivo",
variants: [
"0,100",
"0,200",
"0,300",
"0,400",
"0,500",
"0,600",
"0,700",
"0,800",
"0,900",
"1,100",
"1,200",
"1,300",
"1,400",
"1,500",
"1,600",
"1,700",
"1,800",
"1,900"
],
subsets: [
"latin",
"latin-ext",
"vietnamese"
]
},
{
category: "handwriting",
name: "Comic Neue",
sane: "comic_neue",
variants: [
"0,300",
"1,300",
"0,400",
"1,400",
"0,700",
"1,700"
],
subsets: [
"latin"
]
},
{
category: "serif",
name: "Cormorant",
sane: "cormorant",
variants: [
"0,300",
"0,400",
"0,500",
"0,600",
"0,700",
"1,300",
"1,400",
"1,500",
"1,600",
"1,700"
],
subsets: [
"cyrillic",
"cyrillic-ext",
"latin",
"latin-ext",
"vietnamese"
]
},
{
category: "handwriting",
name: "Dancing Script",
sane: "dancing_script",
variants: [
"0,400",
"0,500",
"0,600",
"0,700"
],
subsets: [
"latin",
"latin-ext",
"vietnamese"
]
},
{
category: "sans-serif",
name: "DM Sans",
sane: "dm_sans",
variants: [
"0,100",
"0,200",
"0,300",
"0,400",
"0,500",
"0,600",
"0,700",
"0,800",
"0,900",
"1,100",
"1,200",
"1,300",
"1,400",
"1,500",
"1,600",
"1,700",
"1,800",
"1,900"
],
subsets: [
"latin",
"latin-ext"
]
},
{
category: "serif",
name: "DM Serif Display",
sane: "dm_serif_display",
variants: [
"0,400",
"1,400"
],
subsets: [
"latin",
"latin-ext"
]
},
{
category: "serif",
name: "DM Serif Text",
sane: "dm_serif_text",
variants: [
"0,400",
"1,400"
],
subsets: [
"latin",
"latin-ext"
]
},
{
category: "serif",
name: "Eczar",
sane: "eczar",
variants: [
"0,400",
"0,500",
"0,600",
"0,700",
"0,800"
],
subsets: [
"devanagari",
"greek",
"greek-ext",
"latin",
"latin-ext"
]
},
{
category: "sans-serif",
name: "Familjen Grotesk",
sane: "familjen_grotesk",
variants: [
"0,400",
"0,500",
"0,600",
"0,700",
"1,400",
"1,500",
"1,600",
"1,700"
],
subsets: [
"latin",
"latin-ext",
"vietnamese"
]
},
{
category: "sans-serif",
name: "Fira Sans",
sane: "fira_sans",
variants: [
"0,100",
"1,100",
"0,200",
"1,200",
"0,300",
"1,300",
"0,400",
"1,400",
"0,500",
"1,500",
"0,600",
"1,600",
"0,700",
"1,700",
"0,800",
"1,800",
"0,900",
"1,900"
],
subsets: [
"cyrillic",
"cyrillic-ext",
"greek",
"greek-ext",
"latin",
"latin-ext",
"vietnamese"
]
},
{
category: "serif",
name: "Fraunces",
sane: "fraunces",
variants: [
"0,100",
"0,200",
"0,300",
"0,400",
"0,500",
"0,600",
"0,700",
"0,800",
"0,900",
"1,100",
"1,200",
"1,300",
"1,400",
"1,500",
"1,600",
"1,700",
"1,800",
"1,900"
],
subsets: [
"latin",
"latin-ext",
"vietnamese"
]
},
{
category: "sans-serif",
name: "IBM Plex Sans",
sane: "ibm_plex_sans",
variants: [
"0,100",
"0,200",
"0,300",
"0,400",
"0,500",
"0,600",
"0,700",
"1,100",
"1,200",
"1,300",
"1,400",
"1,500",
"1,600",
"1,700"
],
subsets: [
"cyrillic",
"cyrillic-ext",
"greek",
"latin",
"latin-ext",
"vietnamese"
]
},
{
category: "monospace",
name: "Inconsolata",
sane: "inconsolata",
variants: [
"0,200",
"0,300",
"0,400",
"0,500",
"0,600",
"0,700",
"0,800",
"0,900"
],
subsets: [
"latin",
"latin-ext",
"vietnamese"
]
},
{
category: "serif",
name: "Inknut Antiqua",
sane: "inknut_antiqua",
variants: [
"0,300",
"0,400",
"0,500",
"0,600",
"0,700",
"0,800",
"0,900"
],
subsets: [
"devanagari",
"latin",
"latin-ext"
]
},
{
category: "sans-serif",
name: "Inter",
sane: "inter",
variants: [
"0,100",
"0,200",
"0,300",
"0,400",
"0,500",
"0,600",
"0,700",
"0,800",
"0,900",
"1,100",
"1,200",
"1,300",
"1,400",
"1,500",
"1,600",
"1,700",
"1,800",
"1,900"
],
subsets: [
"cyrillic",
"cyrillic-ext",
"greek",
"greek-ext",
"latin",
"latin-ext",
"vietnamese"
]
},
{
category: "sans-serif",
name: "Josefin Sans",
sane: "josefin_sans",
variants: [
"0,100",
"0,200",
"0,300",
"0,400",
"0,500",
"0,600",
"0,700",
"1,100",
"1,200",
"1,300",
"1,400",
"1,500",
"1,600",
"1,700"
],
subsets: [
"latin",
"latin-ext",
"vietnamese"
]
},
{
category: "serif",
name: "Josefin Slab",
sane: "josefin_slab",
variants: [
"0,100",
"0,200",
"0,300",
"0,400",
"0,500",
"0,600",
"0,700",
"1,100",
"1,200",
"1,300",
"1,400",
"1,500",
"1,600",
"1,700"
],
subsets: [
"latin"
]
},
{
category: "sans-serif",
name: "Karla",
sane: "karla",
variants: [
"0,200",
"0,300",
"0,400",
"0,500",
"0,600",
"0,700",
"0,800",
"1,200",
"1,300",
"1,400",
"1,500",
"1,600",
"1,700",
"1,800"
],
subsets: [
"latin",
"latin-ext"
]
},
{
category: "sans-serif",
name: "Lato",
sane: "lato",
variants: [
"0,100",
"1,100",
"0,300",
"1,300",
"0,400",
"1,400",
"0,700",
"1,700",
"0,900",
"1,900"
],
subsets: [
"latin",
"latin-ext"
]
},
{
category: "serif",
name: "Libre Baskerville",
sane: "libre_baskerville",
variants: [
"0,400",
"1,400",
"0,700"
],
subsets: [
"latin",
"latin-ext"
]
},
{
category: "sans-serif",
name: "Libre Franklin",
sane: "libre_franklin",
variants: [
"0,100",
"0,200",
"0,300",
"0,400",
"0,500",
"0,600",
"0,700",
"0,800",
"0,900",
"1,100",
"1,200",
"1,300",
"1,400",
"1,500",
"1,600",
"1,700",
"1,800",
"1,900"
],
subsets: [
"cyrillic",
"cyrillic-ext",
"latin",
"latin-ext",
"vietnamese"
]
},
{
category: "serif",
name: "Literata",
sane: "literata",
variants: [
"0,200",
"0,300",
"0,400",
"0,500",
"0,600",
"0,700",
"0,800",
"0,900",
"1,200",
"1,300",
"1,400",
"1,500",
"1,600",
"1,700",
"1,800",
"1,900"
],
subsets: [
"cyrillic",
"cyrillic-ext",
"greek",
"greek-ext",
"latin",
"latin-ext",
"vietnamese"
]
},
{
category: "serif",
name: "Lora",
sane: "lora",
variants: [
"0,400",
"0,500",
"0,600",
"0,700",
"1,400",
"1,500",
"1,600",
"1,700"
],
subsets: [
"cyrillic",
"cyrillic-ext",
"latin",
"latin-ext",
"math",
"symbols",
"vietnamese"
]
},
{
category: "sans-serif",
name: "Manrope",
sane: "manrope",
variants: [
"0,200",
"0,300",
"0,400",
"0,500",
"0,600",
"0,700",
"0,800"
],
subsets: [
"cyrillic",
"cyrillic-ext",
"greek",
"latin",
"latin-ext",
"vietnamese"
]
},
{
category: "serif",
name: "Merriweather",
sane: "merriweather",
variants: [
"0,300",
"1,300",
"0,400",
"1,400",
"0,700",
"1,700",
"0,900",
"1,900"
],
subsets: [
"cyrillic",
"cyrillic-ext",
"latin",
"latin-ext",
"vietnamese"
]
},
{
category: "sans-serif",
name: "Montserrat",
sane: "montserrat",
variants: [
"0,100",
"0,200",
"0,300",
"0,400",
"0,500",
"0,600",
"0,700",
"0,800",
"0,900",
"1,100",
"1,200",
"1,300",
"1,400",
"1,500",
"1,600",
"1,700",
"1,800",
"1,900"
],
subsets: [
"cyrillic",
"cyrillic-ext",
"latin",
"latin-ext",
"vietnamese"
]
},
{
category: "sans-serif",
name: "Mukta",
sane: "mukta",
variants: [
"0,200",
"0,300",
"0,400",
"0,500",
"0,600",
"0,700",
"0,800"
],
subsets: [
"devanagari",
"latin",
"latin-ext"
]
},
{
category: "serif",
name: "Neuton",
sane: "neuton",
variants: [
"0,200",
"0,300",
"0,400",
"1,400",
"0,700",
"0,800"
],
subsets: [
"latin",
"latin-ext"
]
},
{
category: "display",
name: "New Rocker",
sane: "new_rocker",
variants: [
"0,400"
],
subsets: [
"latin",
"latin-ext"
]
},
{
category: "serif",
name: "Newsreader",
sane: "newsreader",
variants: [
"0,200",
"0,300",
"0,400",
"0,500",
"0,600",
"0,700",
"0,800",
"1,200",
"1,300",
"1,400",
"1,500",
"1,600",
"1,700",
"1,800"
],
subsets: [
"latin",
"latin-ext",
"vietnamese"
]
},
{
category: "sans-serif",
name: "Noto Sans JP",
sane: "noto_sans_jp",
variants: [
"0,100",
"0,200",
"0,300",
"0,400",
"0,500",
"0,600",
"0,700",
"0,800",
"0,900"
],
subsets: [
"cyrillic",
"japanese",
"latin",
"latin-ext",
"vietnamese"
]
},
{
category: "sans-serif",
name: "Nunito",
sane: "nunito",
variants: [
"0,200",
"0,300",
"0,400",
"0,500",
"0,600",
"0,700",
"0,800",
"0,900",
"1,200",
"1,300",
"1,400",
"1,500",
"1,600",
"1,700",
"1,800",
"1,900"
],
subsets: [
"cyrillic",
"cyrillic-ext",
"latin",
"latin-ext",
"vietnamese"
]
},
{
category: "sans-serif",
name: "Nunito Sans",
sane: "nunito_sans",
variants: [
"0,200",
"0,300",
"0,400",
"0,500",
"0,600",
"0,700",
"0,800",
"0,900",
"1,200",
"1,300",
"1,400",
"1,500",
"1,600",
"1,700",
"1,800",
"1,900"
],
subsets: [
"cyrillic",
"cyrillic-ext",
"latin",
"latin-ext",
"vietnamese"
]
},
{
category: "serif",
name: "Old Standard TT",
sane: "old_standard_tt",
variants: [
"0,400",
"1,400",
"0,700"
],
subsets: [
"cyrillic",
"cyrillic-ext",
"latin",
"latin-ext",
"vietnamese"
]
},
{
category: "sans-serif",
name: "Open Sans",
sane: "open_sans",
variants: [
"0,300",
"0,400",
"0,500",
"0,600",
"0,700",
"0,800",
"1,300",
"1,400",
"1,500",
"1,600",
"1,700",
"1,800"
],
subsets: [
"cyrillic",
"cyrillic-ext",
"greek",
"greek-ext",
"hebrew",
"latin",
"latin-ext",
"math",
"symbols",
"vietnamese"
]
},
{
category: "sans-serif",
name: "Oswald",
sane: "oswald",
variants: [
"0,200",
"0,300",
"0,400",
"0,500",
"0,600",
"0,700"
],
subsets: [
"cyrillic",
"cyrillic-ext",
"latin",
"latin-ext",
"vietnamese"
]
},
{
category: "sans-serif",
name: "Outfit",
sane: "outfit",
variants: [
"0,100",
"0,200",
"0,300",
"0,400",
"0,500",
"0,600",
"0,700",
"0,800",
"0,900"
],
subsets: [
"latin",
"latin-ext"
]
},
{
category: "sans-serif",
name: "Overpass",
sane: "overpass",
variants: [
"0,100",
"0,200",
"0,300",
"0,400",
"0,500",
"0,600",
"0,700",
"0,800",
"0,900",
"1,100",
"1,200",
"1,300",
"1,400",
"1,500",
"1,600",
"1,700",
"1,800",
"1,900"
],
subsets: [
"cyrillic",
"cyrillic-ext",
"latin",
"latin-ext",
"vietnamese"
]
},
{
category: "serif",
name: "Playfair Display",
sane: "playfair_display",
variants: [
"0,400",
"0,500",
"0,600",
"0,700",
"0,800",
"0,900",
"1,400",
"1,500",
"1,600",
"1,700",
"1,800",
"1,900"
],
subsets: [
"cyrillic",
"latin",
"latin-ext",
"vietnamese"
]
},
{
category: "sans-serif",
name: "Plus Jakarta Sans",
sane: "plus_jakarta_sans",
variants: [
"0,200",
"0,300",
"0,400",
"0,500",
"0,600",
"0,700",
"0,800",
"1,200",
"1,300",
"1,400",
"1,500",
"1,600",
"1,700",
"1,800"
],
subsets: [
"cyrillic-ext",
"latin",
"latin-ext",
"vietnamese"
]
},
{
category: "sans-serif",
name: "Poppins",
sane: "poppins",
variants: [
"0,100",
"1,100",
"0,200",
"1,200",
"0,300",
"1,300",
"0,400",
"1,400",
"0,500",
"1,500",
"0,600",
"1,600",
"0,700",
"1,700",
"0,800",
"1,800",
"0,900",
"1,900"
],
subsets: [
"latin",
"latin-ext"
]
},
{
category: "sans-serif",
name: "Proza Libre",
sane: "proza_libre",
variants: [
"0,400",
"1,400",
"0,500",
"1,500",
"0,600",
"1,600",
"0,700",
"1,700",
"0,800",
"1,800"
],
subsets: [
"latin",
"latin-ext"
]
},
{
category: "sans-serif",
name: "PT Sans",
sane: "pt_sans",
variants: [
"0,400",
"1,400",
"0,700",
"1,700"
],
subsets: [
"cyrillic",
"cyrillic-ext",
"latin",
"latin-ext"
]
},
{
category: "serif",
name: "PT Serif",
sane: "pt_serif",
variants: [
"0,400",
"1,400",
"0,700",
"1,700"
],
subsets: [
"cyrillic",
"cyrillic-ext",
"latin",
"latin-ext"
]
},
{
category: "sans-serif",
name: "Rajdhani",
sane: "rajdhani",
variants: [
"0,300",
"0,400",
"0,500",
"0,600",
"0,700"
],
subsets: [
"devanagari",
"latin",
"latin-ext"
]
},
{
category: "sans-serif",
name: "Raleway",
sane: "raleway",
variants: [
"0,100",
"0,200",
"0,300",
"0,400",
"0,500",
"0,600",
"0,700",
"0,800",
"0,900",
"1,100",
"1,200",
"1,300",
"1,400",
"1,500",
"1,600",
"1,700",
"1,800",
"1,900"
],
subsets: [
"cyrillic",
"cyrillic-ext",
"latin",
"latin-ext",
"vietnamese"
]
},
{
category: "sans-serif",
name: "Roboto",
sane: "roboto",
variants: [
"0,100",
"0,200",
"0,300",
"0,400",
"0,500",
"0,600",
"0,700",
"0,800",
"0,900",
"1,100",
"1,200",
"1,300",
"1,400",
"1,500",
"1,600",
"1,700",
"1,800",
"1,900"
],
subsets: [
"cyrillic",
"cyrillic-ext",
"greek",
"greek-ext",
"latin",
"latin-ext",
"math",
"symbols",
"vietnamese"
]
},
{
category: "sans-serif",
name: "Roboto Condensed",
sane: "roboto_condensed",
variants: [
"0,100",
"0,200",
"0,300",
"0,400",
"0,500",
"0,600",
"0,700",
"0,800",
"0,900",
"1,100",
"1,200",
"1,300",
"1,400",
"1,500",
"1,600",
"1,700",
"1,800",
"1,900"
],
subsets: [
"cyrillic",
"cyrillic-ext",
"greek",
"greek-ext",
"latin",
"latin-ext",
"vietnamese"
]
},
{
category: "monospace",
name: "Roboto Mono",
sane: "roboto_mono",
variants: [
"0,100",
"0,200",
"0,300",
"0,400",
"0,500",
"0,600",
"0,700",
"1,100",
"1,200",
"1,300",
"1,400",
"1,500",
"1,600",
"1,700"
],
subsets: [
"cyrillic",
"cyrillic-ext",
"greek",
"latin",
"latin-ext",
"vietnamese"
]
},
{
category: "serif",
name: "Roboto Serif",
sane: "roboto_serif",
variants: [
"0,100",
"0,200",
"0,300",
"0,400",
"0,500",
"0,600",
"0,700",
"0,800",
"0,900",
"1,100",
"1,200",
"1,300",
"1,400",
"1,500",
"1,600",
"1,700",
"1,800",
"1,900"
],
subsets: [
"cyrillic",
"cyrillic-ext",
"latin",
"latin-ext",
"vietnamese"
]
},
{
category: "serif",
name: "Roboto Slab",
sane: "roboto_slab",
variants: [
"0,100",
"0,200",
"0,300",
"0,400",
"0,500",
"0,600",
"0,700",
"0,800",
"0,900"
],
subsets: [
"cyrillic",
"cyrillic-ext",
"greek",
"greek-ext",
"latin",
"latin-ext",
"vietnamese"
]
},
{
category: "sans-serif",
name: "Rubik",
sane: "rubik",
variants: [
"0,300",
"0,400",
"0,500",
"0,600",
"0,700",
"0,800",
"0,900",
"1,300",
"1,400",
"1,500",
"1,600",
"1,700",
"1,800",
"1,900"
],
subsets: [
"arabic",
"cyrillic",
"cyrillic-ext",
"hebrew",
"latin",
"latin-ext"
]
},
{
category: "handwriting",
name: "Sacramento",
sane: "sacramento",
variants: [
"0,400"
],
subsets: [
"latin",
"latin-ext"
]
},
{
category: "sans-serif",
name: "Source Sans 3",
sane: "source_sans_3",
variants: [
"0,200",
"0,300",
"0,400",
"0,500",
"0,600",
"0,700",
"0,800",
"0,900",
"1,200",
"1,300",
"1,400",
"1,500",
"1,600",
"1,700",
"1,800",
"1,900"
],
subsets: [
"cyrillic",
"cyrillic-ext",
"greek",
"greek-ext",
"latin",
"latin-ext",
"vietnamese"
]
},
{
category: "serif",
name: "Source Serif 4",
sane: "source_serif_4",
variants: [
"0,200",
"0,300",
"0,400",
"0,500",
"0,600",
"0,700",
"0,800",
"0,900",
"1,200",
"1,300",
"1,400",
"1,500",
"1,600",
"1,700",
"1,800",
"1,900"
],
subsets: [
"cyrillic",
"cyrillic-ext",
"greek",
"latin",
"latin-ext",
"vietnamese"
]
},
{
category: "sans-serif",
name: "Space Grotesk",
sane: "space_grotesk",
variants: [
"0,300",
"0,400",
"0,500",
"0,600",
"0,700"
],
subsets: [
"latin",
"latin-ext",
"vietnamese"
]
},
{
category: "monospace",
name: "Space Mono",
sane: "space_mono",
variants: [
"0,400",
"1,400",
"0,700",
"1,700"
],
subsets: [
"latin",
"latin-ext",
"vietnamese"
]
},
{
category: "serif",
name: "Spectral",
sane: "spectral",
variants: [
"0,200",
"1,200",
"0,300",
"1,300",
"0,400",
"1,400",
"0,500",
"1,500",
"0,600",
"1,600",
"0,700",
"1,700",
"0,800",
"1,800"
],
subsets: [
"cyrillic",
"cyrillic-ext",
"latin",
"latin-ext",
"vietnamese"
]
},
{
category: "sans-serif",
name: "Syne",
sane: "syne",
variants: [
"0,400",
"0,500",
"0,600",
"0,700",
"0,800"
],
subsets: [
"greek",
"latin",
"latin-ext"
]
},
{
category: "handwriting",
name: "Tangerine",
sane: "tangerine",
variants: [
"0,400",
"0,700"
],
subsets: [
"latin"
]
},
{
category: "sans-serif",
name: "Ubuntu",
sane: "ubuntu",
variants: [
"0,300",
"1,300",
"0,400",
"1,400",
"0,500",
"1,500",
"0,700",
"1,700"
],
subsets: [
"cyrillic",
"cyrillic-ext",
"greek",
"greek-ext",
"latin",
"latin-ext"
]
},
{
category: "serif",
name: "Ultra",
sane: "ultra",
variants: [
"0,400"
],
subsets: [
"latin",
"latin-ext"
]
},
{
category: "display",
name: "UnifrakturMaguntia",
sane: "unifrakturmaguntia",
variants: [
"0,400"
],
subsets: [
"latin"
]
},
{
category: "sans-serif",
name: "Varela Round",
sane: "varela_round",
variants: [
"0,400"
],
subsets: [
"hebrew",
"latin",
"latin-ext",
"vietnamese"
]
},
{
category: "sans-serif",
name: "Work Sans",
sane: "work_sans",
variants: [
"0,100",
"0,200",
"0,300",
"0,400",
"0,500",
"0,600",
"0,700",
"0,800",
"0,900",
"1,100",
"1,200",
"1,300",
"1,400",
"1,500",
"1,600",
"1,700",
"1,800",
"1,900"
],
subsets: [
"latin",
"latin-ext",
"vietnamese"
]
},
{
category: "serif",
name: "Zilla Slab",
sane: "zilla_slab",
variants: [
"0,300",
"1,300",
"0,400",
"1,400",
"0,500",
"1,500",
"0,600",
"1,600",
"0,700",
"1,700"
],
subsets: [
"latin",
"latin-ext"
]
}
];
// src/lib/fontChecker.ts
function checkLoaded(_0) {
return __async(this, arguments, function* ({
fontFamily,
fontStyle,
fontWeight,
timeout = 500
}) {
const start = (/* @__PURE__ */ new Date()).getTime();
let timeoutId;
return new Promise(function(resolve, reject) {
if (document == null ? void 0 : document.fonts) {
const checker = new Promise(function(resolve2, reject2) {
const check = function() {
const now = (/* @__PURE__ */ new Date()).getTime();
if (now - start >= timeout) {
reject2(new Error(`Font not loaded within ${timeout} ms`));
} else {
const loaded = document.fonts.check(`${fontStyle != null ? fontStyle : ""} ${fontWeight != null ? fontWeight : ""} 0 ${fontFamily}`);
if (loaded) {
resolve2(true);
} else {
setTimeout(check, 25);
}
}
};
check();
});
const timer = new Promise(function(resolve2, reject2) {
timeoutId = setTimeout(() => reject2(new Error(`Font not loaded within ${timeout} ms`)), timeout);
});
Promise.race([timer, checker]).then((value) => {
clearTimeout(timeoutId);
resolve(value);
}, reject);
} else {
reject(new Error("Fonts API not supported by client"));
}
});
});
}
// src/lib/util.ts
function sanify(fontName) {
return fontName.replace(/\s+/g, "_").replace(/[^a-zA-Z0-9-_]/g, "").toLowerCase();
}
// src/components/FontPicker.tsx
var import_jsx_runtime2 = require("react/jsx-runtime");
var FontPreviews2 = (0, import_react.lazy)(() => Promise.resolve().then(() => (init_FontPreviews(), FontPreviews_exports)));
function toString(v) {
if (typeof v === "string") {
return v;
}
return (v.italic ? "1" : "0") + "," + v.weight;
}
var defaultFont = {
category: "sans-serif",
name: "Open Sans",
sane: "open_sans",
cased: "open sans",
variants: [
"0,300",
"0,400",
"0,500",
"0,600",
"0,700",
"0,800",
"1,300",
"1,400",
"1,500",
"1,600",
"1,700",
"1,800"
]
};
function FontPicker(_a) {
var _b = _a, {
defaultValue = "Open Sans",
noMatches = "No matches",
autoLoad = false,
loaderOnly = false,
loadAllVariants = false,
loadFonts = "",
googleFonts = "all",
fontCategories = "all",
localFonts = [],
mode = "combo",
fontVariants,
value,
fontsLoaded,
fontsLoadedTimeout,
loading = /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", { children: "Font previews loading ..." }),
inputId
} = _b, rest = __objRest(_b, [
"defaultValue",
"noMatches",
"autoLoad",
"loaderOnly",
"loadAllVariants",
"loadFonts",
"googleFonts",
"fontCategories",
"localFonts",
"mode",
"fontVariants",
"value",
"fontsLoaded",
"fontsLoadedTimeout",
"loading",
"inputId"
]);
var _a2, _b2, _c;
const [focused, setFocused] = (0, import_react.useState)(false);
const [selectedFontIndex, setSelectedFontIndex] = (0, import_react.useState)(-1);
const [currentFontIndex, setCurrentFontIndex] = (0, import_react.useState)(-1);
const prevLoadFontsRef = (0, import_react.useRef)([]);
const inputRef = (0, import_react.useRef)(null);
const popoutRef = (0, import_react.useRef)(null);
const previewRef = (0, import_react.useRef)(null);
const handleLoadFont = () => {
if (typeof loadFonts === "string") {
if (loadFonts !== "") {
const fontNames = loadFonts.trim().split(",");
fontNames == null ? void 0 : fontNames.forEach((fontName) => {
if (!prevLoadFontsRef.current.includes(fontName)) {
prevLoadFontsRef.current.push(fontName);
loadFontByName(fontName);
}
});
}
} else {
loadFonts.forEach((font) => {
const fontName = typeof font === "string" ? font : font == null ? void 0 : font.fontName;
if (!fontName) {
return;
}
if (!prevLoadFontsRef.current.includes(fontName)) {
prevLoadFontsRef.current.push(fontName);
if (typeof font === "object" && font.variants) {
loadFontByName(
fontName,
font.variants.map((v) => toString(v))
);
} else {
loadFontByName(fontName);
}
}
});
}
};
const loadFontsFontNames = (0, import_react.useMemo)(() => {
const names = [];
if (loadFonts) {
if (typeof loadFonts === "string") {
names.push(loadFonts);
} else {
loadFonts == null ? void 0 : loadFonts.forEach((font) => {
const fontName = typeof font === "string" ? font : font == null ? void 0 : font.fontName;
if (!fontName) {
return;
}
names.push(fontName);
});
}
}
return names;
}, [loadFonts]);
const fontPickerOptionsRef = (0, import_react.useRef)(null);
const saveOptionsRef = (key) => (node) => {
const map = getOptionsRef();
if (node) {
map.set(key, node);
} else {
map.delete(key);
}
};
const getOptionsRef = () => {
if (!fontPickerOptionsRef.current) {
fontPickerOptionsRef.current = /* @__PURE__ */ new Map();
}
return fontPickerOptionsRef.current;
};
const outerClasses = () => {
const ret = ["fontpicker"];
return ret;
};
const popoutClasses = () => {
const ret = ["fontpicker__popout"];
if (focused) {
ret.push("fontpicker__active");
}
return [...ret];
};
const previewClasses = () => {
const ret = ["fontpicker__preview"];
ret.push("font-preview-" + current.sane);
return [...ret];
};
const allGoogleFonts = (0, import_react.useMemo)(() => {
const ifonts = [];
fontInfo_default.forEach((info) => {
const font = __spreadProps(__spreadValues({}, info), { cased: info.name.toLowerCase() });
ifonts.push(font);
});
return [...ifonts];
}, []);
const fonts = (0, import_react.useMemo)(() => {
var _a3;
let activeFonts;
if (googleFonts === "all") {
activeFonts = [...allGoogleFonts];
} else if (typeof googleFonts === "string") {
const fontNames = googleFonts.trim().split(",").map((v) => v.toLowerCase());
activeFonts = [...allGoogleFonts.filter((a) => fontNames.includes(a.cased))];
} else if (typeof googleFonts === "function") {
activeFonts = [...allGoogleFonts.filter(googleFonts)];
} else {
const fontNames = (_a3 = googleFonts == null ? void 0 : googleFonts.map((v) => {
if (typeof v === "string") {
return v.toLowerCase();
} else {
return v.cased;
}
})) != null ? _a3 : [];
activeFonts = [...allGoogleFonts.filter((a) => fontNames.includes(a.cased))];
}
localFonts.forEach((font) => {
activeFonts.push({
category: font.category,
name: font.name,
cased: font.name.toLowerCase(),
sane: sanify(font.name),
variants: font.variants.map((v) => toString(v)),
isLocal: true
});
});
let activeFontsInCategory;
if (fontCategories === "all") {
activeFontsInCategory = [...activeFonts];
} else if (typeof fontCategories === "string") {
const newFontCategories = fontCategories.trim().split(",").map((v) => v.trim().toLowerCase());
activeFontsInCategory = [...allGoogleFonts.filter((a) => newFontCategories.includes(a.category))];
} else {
const newFontCategories = fontCategories.map((v) => v.toLowerCase());
activeFontsInCategory = [...allGoogleFonts.filter((a) => newFontCategories.includes(a.category))];
}
return [...activeFontsInCategory];
}, [googleFonts, allGoogleFonts, localFonts, fontCategories]);
const saneDefaultValue = (0, import_react.useMemo)(() => {
const search = defaultValue.toLowerCase().trim();
if (!fonts || (fonts == null ? void 0 : fonts.length) <= 0) {
return defaultValue;
}
if (fonts.some((a) => a.cased === search)) {
return defaultValue;
}
return fonts[0].name;
}, [fonts, defaultValue]);
const [typedSearch, setTypedSearch] = (0, import_react.useState)(saneDefaultValue);
const [searchContent, setSearchContent] = (0, import_react.useState)(saneDefaultValue);
const matchingFonts = (0, import_react.useMemo)(() => {
const search = typedSearch.toLowerCase().trim();
return fonts.filter((a) => a.cased.includes(search));
}, [typedSearch, fonts]);
const cancelBlur = (e) => {
e.preventDefault();
};
const searchChanged = (e) => {
var _a3, _b3;
if ((_a3 = popoutRef == null ? void 0 : popoutRef.current) == null ? void 0 : _a3.scrollTop) {
popoutRef.current.scrollTop = 0;
}
const newValue = (_b3 = e.currentTarget) == null ? void 0 : _b3.value;
setSelectedFontIndex(-1);
const isLonger = typedSearch.length < (newValue == null ? void 0 : newValue.length);
setTypedSearch(newValue);
if (!isLonger) {
setSearchContent(newValue);
return;
}
const cased = newValue.toLowerCase();
const matches = fonts.filter((a) => a.cased.startsWith(cased));
if (matches == null ? void 0 : matches.length) {
const firstMatch = matches[0].name;
if (e.currentTarget) {
e.currentTarget.value = firstMatch;
}
setInputSelection(e.currentTarget, newValue.length, firstMatch.length);
setSearchContent(firstMatch);
} else {
setSearchContent(newValue);
}
};
const setInputSelection = (input, startPos, endPos) => {
if (input.setSelectionRange) {
input.setSelectionRange(startPos, endPos);
}
};
const onKeyDown = (e) => {
if (e.key && e.key === "Enter") {
const cased = searchContent.toLowerCase();
const preciseMatches = fonts.filter((a) => a.cased === cased);
if (selectedFontIndex > -1) {
setCurrent(matchingFonts[selectedFontIndex]);
} else if (preciseMatches.length === 1) {
setCurrent(preciseMatches[0]);
} else if (matchingFonts.length > 0) {
setCurrent(matchingFonts[0]);
} else {
setCurrent(current);
}
} else if (e.key && e.key === "ArrowDown") {
e.preventDefault();
if (selectedFontIndex < matchingFonts.length - 1) {
setSearchContent(typedSearch);
const prevSelectedFontIndex = selectedFontIndex;
setSelectedFontIndex((prev) => prev + 1);
showSelectedFont("key", prevSelectedFontIndex + 1);
}
} else if (e.key && e.key === "ArrowUp") {
e.preventDefault();
if (selectedFontIndex > 0) {
setSearchContent(typedSearch);
const prevSelectedFontIndex = selectedFontIndex;
setSelectedFontIndex((prev) => prev - 1);
showSelectedFont("key", prevSelectedFontIndex - 1);
}
} else if (e.key && e.key === "Escape") {
hide();
}
};
const onKeyDownList = (e) => {
if (e.key && e.key === "Enter") {
if (selectedFontIndex > -1) {
setCurrent(fonts[selectedFontIndex]);
} else {
setCurrent(current);
}
} else if (e.key && e.key === "ArrowDown") {
e.preventDefault();
if (selectedFontIndex < fonts.length - 1) {
setSelectedFontIndex((prev) => prev + 1);
}
} else if (e.key && e.key === "ArrowUp") {
e.preventDefault();
if (selectedFontIndex > 0) {
setSelectedFontIndex((prev) => prev - 1);
}
}
};
const showSelectedFont = (why = "key", index = selectedFontIndex) => {
var _a3;
const popout = popoutRef == null ? void 0 : popoutRef.current;
if (popout && index >= 0) {
const selectedFont = matchingFonts[index];
if (selectedFont) {
const fontPreviewElement = popout.querySelector(".font-preview-" + selectedFont.sane);
const fontOptionElement = fontPreviewElement == null ? void 0 : fontPreviewElement.parentElement;
if (fontOptionElement && fontOptionElement instanceof HTMLElement) {
const fontTop = fontOptionElement.offsetTop;
const fontBottom = fontTop + fontOptionElement.offsetHeight;
const popTop = popout.scrollTop;
const popBottom = popTop + popout.clientHeight;
if (why === "opening" || fontTop <= popTop) {
popout.scrollTop = fontTop;
fontOptionElement.classList.add("selected");
const optionRef = (_a3 = getOptionsRef()) == null ? void 0 : _a3.get(selectedFont.sane);
optionRef == null ? void 0 : optionRef.classList.add("selected");
} else if (fontBottom >= popBottom) {
popout.scrollTop = fontBottom - popout.clientHeight - 1;
}
}
}
}
};
const onFocus = () => {
var _a3;
(_a3 = inputRef == null ? void 0 : inputRef.current) == null ? void 0 : _a3.select();
setTypedSearch("");
show();
};
const onClick = (font) => {
setCurrent(font);
hide();
};
const show = () => {
if (!focused) {
setFocused(true);
setTimeout(() => {
let newSelectedFontIndex = selectedFontIndex;
for (const [i, font] of matchingFonts.entries()) {
if (font.name === current.name) {
newSelectedFontIndex = i;
setSelectedFontIndex(i);
break;
}
}
setSearchContent(current.name);
showSelectedFont("opening", newSelectedFontIndex);
}, 1);
}
};
const hide = () => {
var _a3;
(_a3 = inputRef == null ? void 0 : inputRef.current) == null ? void 0 : _a3.blur();
setFocused(false);
};
const getFontByName = (0, import_react.useCallback)(
(name) => {
let found = null;
fonts.forEach((font) => {
if (font.name === name.trim()) {
found = font;
}
});
return found;
},
[fonts]
);
const setCurrent = (font) => {
var _a3;
setCurrentState(font);
setTypedSearch(font.name);
setSearchContent(font.name);
(_a3 = inputRef == null ? void 0 : inputRef.current) == null ? void 0 : _a3.blur();
autoLoadFont(font);
emitFontVariants(font);
emitValue(font);
setCurrentFontIndex(fontIndex(font));
};
const fontIndex = (0, import_react.useCallback)(
(font) => {
var _a3, _b3;
let idx;
if (mode === "list") {
idx = (_a3 = fonts == null ? void 0 : fonts.findIndex((f) => f.name === font.name)) != null ? _a3 : -1;
} else {
idx = (_b3 = matchingFonts == null ? void 0 : matchingFonts.findIndex((f) => f.name === font.name)) != null ? _b3 : -1;
}
if (idx < 0) {
idx = 0;
}
return idx;
},
[fonts, matchingFonts, mode]
);
const emitFontVariants = (0, import_react.useCallback)(
(font) => {
if ((font == null ? void 0 : font.name) && (font == null ? void 0 : font.variants)) {
fontVariants == null ? void 0 : fontVariants({
fontName: font.name,
variants: font.variants
});
}
},
[fontVariants]
);
const emitValue = (0, import_react.useCallback)(
(font) => {
if (font == null ? void 0 : font.name) {
value == null ? void 0 : value(font.name);
}
},
[value]
);
const emitFontLoaded = (0, import_react.useCallback)(
(isLoaded) => {
fontsLoaded == null ? void 0 : fontsLoaded(isLoaded);
},
[fontsLoaded]
);
const loadFontFromObject = (0, import_react.useCallback)(
(font, variants = []) => {
if (font == null ? void 0 : font.isLocal) {
return;
}
if ((variants == null ? void 0 : variants.length) > 0) {
variants = font.variants.filter((v) => variants.includes(v));
} else if (loadAllVariants) {
variants = font.variants;
} else {
variants = getFourVariants(font.variants.map((v) => toString(v)));
}
let cssId = "google-font-" + font.sane;
const cssIdAll = cssId + "-all";
if (variants.length === font.variants.length) {
cssId = cssIdAll;
} else {
cssId += "-" + variants.sort().join("-").replaceAll("1,", "i").replaceAll("0,", "");
}
const existing = document.getElementById(cssId);
const existingAll = document.getElementById(cssIdAll);
if (!existing && !existingAll && (font == null ? void 0 : font.name) && (variants == null ? void 0 : variants.length) > 0) {
const link = document.createElement("link");
link.rel = "stylesheet";
link.id = cssId;
link.href = "https://fonts.googleapis.com/css2?family=" + font.name + ":ital,wght@" + variants.sort().join(";") + "&display=swap";
link.setAttribute("data-testid", cssId);
document.head.appendChild(link);
}
},
[loadAllVariants]
);
const autoLoadFont = (0, import_react.useCallback)(
(font) => {
if (autoLoad) {
loadFontFromObject(font);
}
},
[autoLoad, loadFontFromObject]
);
const loadFontByName = (font, variants = []) => {
if (font === "") {
return;
}
let loaded = font;
if (typeof font === "string") {
loaded = getFontByName(font);
}
if (loaded === null || typeof loaded !== "object" || typeof loaded.sane !== "string") {
console.error("Unknown font", font);
} else if (loaded.variants.length < 1) {
console.error("No valid variants of font", variants);
} else {
loadFontFromObject(loaded, variants);
}
};
const getFourVariants = (variants) => {
const regularWeights = variants.filter((v) => v.substring(0, 2) === "0,").map((v) => parseInt(v.substring(2))).sort((a, b) => a - b);
const italicWeights = variants.filter((v) => v.substring(0, 2) === "1,").map((v) => parseInt(v.substring(2))).sort((a, b) => a - b);
const fourFonts = {};
fourFonts.regular = regularWeights.sort((a, b) => Math.abs(399 - a) - Math.abs(399 - b)).shift();
fourFonts.bold = regularWeights.filter((v) => v > (fourFonts.regular || 0)).sort((a, b) => Math.abs(700 - a) - Math.abs(700 - b)).shift();
fourFonts.italic = italicWeights.sort((a, b) => Math.abs(399 - a) - Math.abs(399 - b)).shift();
fourFonts.boldItalic = italicWeights.filter((v) => v > (fourFonts.italic || 0)).sort((a, b) => Math.abs(700 - a) - Math.abs(700 - b)).shift();
const fourVariants = [];
if (fourFonts.regular) {
fourVariants.push("0," + fourFonts.regular);
}
if (fourFonts.bold) {
fourVariants.push("0," + fourFonts.bold);
}
if (fourFonts.italic) {
fourVariants.push("1," + fourFonts.italic);
}
if (fourFonts.boldItalic) {
fourVariants.push("1," + fourFonts.boldItalic);
}
return fourVariants;
};
const defaultCurrent = getFontByName(saneDefaultValue) || defaultFont;
const [current, setCurrentState] = (0, import_react.useState)(defaultCurrent);
handleLoadFont();
(0, import_react.useEffect)(() => {
setCurrent(defaultCurrent);
}, [defaultCurrent]);
(0, import_react.useEffect)(() => {
function callCheckLoaded(fontNames) {
return __async(this, null, function* () {
try {
const promises = fontNames == null ? void 0 : fontNames.map((font) => __async(this, null, function* () {
try {
const fontLoaded = yield checkLoaded({
fontFamily: font,
timeout: fontsLoadedTimeout
});
return fontLoaded;
} catch (e) {
return false;
}
}));
const results = yield Promise.all(promises);
const allLoaded = !results.some((res) => !res);
emitFontLoaded(allLoaded);
} catch (e) {
console.error(`Exception thrown checking if font families loaded`);
console.error(e);
emitFontLoaded(false);
}
});
}
const fontsToCheck = [.../* @__PURE__ */ new Set([current.name, ...loadFontsFontNames])];
if (fontsLoaded) {
call