75 lines
2.6 KiB
JavaScript
75 lines
2.6 KiB
JavaScript
// components/fontTransforms.jsx
|
||
|
||
const unicodeBlocks = {
|
||
sansSerif: { upperStart: 0x1D5A0, lowerStart: 0x1D5BA },
|
||
sansSerifBold: { upperStart: 0x1D5D4, lowerStart: 0x1D5EE },
|
||
script: { upperStart: 0x1D49C, lowerStart: 0x1D4B6 },
|
||
scriptBold: { upperStart: 0x1D4D0, lowerStart: 0x1D4EA },
|
||
fraktur: { upperStart: 0x1D504, lowerStart: 0x1D51E },
|
||
frakturBold: { upperStart: 0x1D56C, lowerStart: 0x1D586 },
|
||
monospace: { upperStart: 0x1D670, lowerStart: 0x1D68A },
|
||
fullwidth: { upperStart: 0xFF21, lowerStart: 0xFF41 }
|
||
};
|
||
|
||
const mapUnicode = (char, block) => {
|
||
const code = char.charCodeAt(0);
|
||
if (code >= 65 && code <= 90) return String.fromCodePoint(block.upperStart + (code - 65));
|
||
if (code >= 97 && code <= 122) return String.fromCodePoint(block.lowerStart + (code - 97));
|
||
return char;
|
||
};
|
||
|
||
const createTransform = (blockKey) => (text) =>
|
||
text.split('').map((c) => mapUnicode(c, unicodeBlocks[blockKey])).join('');
|
||
|
||
const fontList = [
|
||
"Anton", "Bebas Neue", "Dancing Script", "Montserrat", "Orbitron", "Pacifico",
|
||
"Playfair Display", "Poppins"
|
||
];
|
||
|
||
const getCategory = (name) => {
|
||
const normalizedName = name.toLowerCase().replace(/ /g, "-");
|
||
if (["dancing-script", "pacifico"].includes(normalizedName)) return "handwriting";
|
||
if (["anton", "bebas-neue", "playfair-display"].includes(normalizedName)) return "statement";
|
||
if (["orbitron"].includes(normalizedName)) return "futuristic";
|
||
if (["montserrat", "poppins"].includes(normalizedName)) return "modern";
|
||
return "aesthetic";
|
||
};
|
||
|
||
const blockForCategory = {
|
||
modern: "sansSerif",
|
||
handwriting: "scriptBold",
|
||
statement: "fullwidth",
|
||
futuristic: "monospace",
|
||
aesthetic: "frakturBold"
|
||
};
|
||
|
||
export const fontTransforms = Object.fromEntries(
|
||
fontList.map((font) => {
|
||
const normalizedFont = font.toLowerCase().replace(/ /g, "-");
|
||
const category = getCategory(font);
|
||
return [font, {
|
||
transform: (text) => text, // Echte Fonts verwenden, keine Unicode-Transformation
|
||
category,
|
||
description: `${font} – Echte Schriftart verwendet`,
|
||
className: `font-${normalizedFont}`
|
||
}];
|
||
})
|
||
);
|
||
|
||
export const transformText = (text, fontName) => {
|
||
const font = fontTransforms[fontName];
|
||
if (!font || !text) return { transformed: text, fontClassName: "" };
|
||
return {
|
||
transformed: font.transform(text),
|
||
fontClassName: font.className
|
||
};
|
||
};
|
||
|
||
export const getPopularFonts = () => Object.keys(fontTransforms).slice(0, 5);
|
||
|
||
export const getFontsByCategory = (category) =>
|
||
category === "all"
|
||
? Object.keys(fontTransforms)
|
||
: Object.keys(fontTransforms).filter(
|
||
(f) => fontTransforms[f].category === category
|
||
); |