Sollte richtig sein aber zu viele fonts

This commit is contained in:
2025-08-06 11:17:40 +02:00
parent da306a8f0f
commit feb3f96984
10 changed files with 2944 additions and 601 deletions

View File

@@ -1,87 +1,50 @@
// components/fontTransforms.jsx
// 1) Unicode-Blöcke
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 }
};
// 2) Unicode-Mapping-Funktion
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('');
// 3) Font-Definitionen
const fontList = [
"abril-fatface", "alegreya", "alfa-slab-one", "almendra", "amatic-sc", "andika",
"architects-daughter", "audiowide", "averia-libre", "bebas-neue", "black-ops-one",
"caveat", "cinzel-decorative", "courgette", "dancing-script", "exo", "fjalla-one",
"germania-one", "glass-antiqua", "gloria-hallelujah", "great-vibes", "holtwood-one-sc",
"indie-flower", "italiana", "jost", "kaushan-script", "lato", "metal-mania", "montserrat",
"neucha", "noto-sans", "open-sans", "orbitron", "oswald", "pacifico", "permanent-marker",
"philosopher", "playfair-display", "poppins", "press-start-2p", "questrial", "quicksand",
"rajdhani", "raleway", "righteous", "roboto", "sacramento", "satisfy", "space-mono",
"spectral", "staatliches", "stint-ultra-condensed", "syncopate", "ultra", "unica-one",
"work-sans", "yellowtail"
export const fontList = [
  "abril-fatface", "alegreya", "alfa-slab-one", "almendra", "amatic-sc", "andika",
  "architects-daughter", "audiowide", "averia-libre", "bebas-neue", "black-ops-one",
  "caveat", "cinzel-decorative", "courgette", "dancing-script", "exo", "fjalla-one",
  "germania-one", "glass-antiqua", "gloria-hallelujah", "great-vibes", "holtwood-one-sc",
  "indie-flower", "italiana", "jost", "kaushan-script", "lato", "metal-mania", "montserrat",
  "neucha", "noto-sans", "open-sans", "orbitron", "oswald", "pacifico", "permanent-marker",
  "philosopher", "playfair-display", "poppins", "press-start-2p", "questrial", "quicksand",
  "rajdhani", "raleway", "righteous", "roboto", "sacramento", "satisfy", "space-mono",
  "spectral", "staatliches", "stint-ultra-condensed", "syncopate", "ultra", "unica-one",
  "work-sans", "yellowtail"
];
// 4) Kategorie-Regeln (vereinfacht)
const getCategory = (name) => {
if (["caveat", "dancing-script", "pacifico", "amatic-sc", "kaushan-script", "courgette", "great-vibes", "satisfy", "sacramento", "neucha", "gloria-hallelujah", "almendra", "indie-flower", "architects-daughter"].includes(name)) return "handwriting";
if (["bebas-neue", "black-ops-one", "holtwood-one-sc", "abril-fatface", "playfair-display", "permanent-marker", "alfa-slab-one", "germania-one", "oswald", "stint-ultra-condensed"].includes(name)) return "statement";
if (["exo", "orbitron", "audiowide", "rajdhani", "space-mono", "questrial", "syncopate", "unica-one", "italiana", "staatliches"].includes(name)) return "futuristic";
if (["press-start-2p", "righteous", "metal-mania", "alegreya", "spectral", "fjalla-one", "glass-antiqua", "cinzel-decorative", "andika"].includes(name)) return "aesthetic";
return "modern";
};
const blockForCategory = {
modern: "sansSerif",
handwriting: "scriptBold",
statement: "fullwidth",
futuristic: "monospace",
aesthetic: "frakturBold"
  if (["caveat", "dancing-script", "pacifico", "amatic-sc", "kaushan-script", "courgette", "great-vibes", "satisfy", "sacramento", "neucha", "gloria-hallelujah", "almendra", "indie-flower", "architects-daughter"].includes(name)) return "handwriting";
  if (["bebas-neue", "black-ops-one", "holtwood-one-sc", "abril-fatface", "playfair-display", "permanent-marker", "alfa-slab-one", "germania-one", "oswald", "stint-ultra-condensed"].includes(name)) return "statement";
  if (["exo", "orbitron", "audiowide", "rajdhani", "space-mono", "questrial", "syncopate", "unica-one", "italiana", "staatliches"].includes(name)) return "futuristic";
  if (["press-start-2p", "righteous", "metal-mania", "alegreya", "spectral", "fjalla-one", "glass-antiqua", "cinzel-decorative", "andika"].includes(name)) return "aesthetic";
  return "modern";
};
export const fontTransforms = Object.fromEntries(
fontList.map((font) => {
const name = font.replace(/-/g, " ").replace(/\b\w/g, (l) => l.toUpperCase());
const category = getCategory(font);
const block = blockForCategory[category];
return [name, {
transform: createTransform(block),
category,
description: `${name} Unicode-Stil automatisch zugewiesen` ,
className: `font-${font}`
}];
})
  fontList.map((font) => {
    const name = font.replace(/-/g, " ").replace(/\b\w/g, (l) => l.toUpperCase());
    const category = getCategory(font);
    return [font, {
      category,
      description: `Eine moderne, saubere Schriftart.`,
      className: `font-${font}`
    }];
  })
);
export const transformText = (text, fontName) => {
const font = fontTransforms[fontName];
if (!font || !text) return { transformed: text, fontClassName: "" };
return {
transformed: font.transform(text),
fontClassName: font.className
};
  const font = fontTransforms[fontName];
  if (!font || !text) return { transformed: text, fontClassName: "" };
  return {
    transformed: text,
    fontClassName: font.className
  };
};
export const getPopularFonts = () => Object.keys(fontTransforms).slice(0, 10);
export const getPopularFonts = () => fontList.slice(0, 10);
export const getFontsByCategory = (category) =>
category === "all"
? Object.keys(fontTransforms)
: Object.keys(fontTransforms).filter(
(f) => fontTransforms[f].category === category
);
  category === "all"
    ? fontList
    : fontList.filter((f) => getCategory(f) === category);