{"id":44,"date":"2026-06-25T07:16:49","date_gmt":"2026-06-25T07:16:49","guid":{"rendered":"https:\/\/toolskit.site\/index.php\/fancy-font-generator\/"},"modified":"2026-06-25T07:16:49","modified_gmt":"2026-06-25T07:16:49","slug":"fancy-font-generator","status":"publish","type":"page","link":"https:\/\/toolskit.site\/index.php\/fancy-font-generator\/","title":{"rendered":"Fancy Font Generator"},"content":{"rendered":"<div class=\"hth-single-tool-shell\" style=\"--hth-color:#00f5ff\">\n<div id=\"ffg-wrapper\">\n<style>\n    #ffg-wrapper * { box-sizing: border-box; margin: 0; padding: 0; font-family: system-ui, -apple-system, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif; }\n    #ffg-wrapper {\n      background: radial-gradient(circle at 20% 10%, #1a1a2e 0%, #0f0f1a 40%, #05050a 100%);\n      color: #e0e0e0;\n      padding: 24px;\n      border-radius: 16px;\n      border: 1px solid rgba(0, 245, 255, 0.15);\n      box-shadow: 0 0 30px rgba(0, 245, 255, 0.05), inset 0 0 60px rgba(0,0,0,0.3);\n      position: relative;\n      overflow: hidden;\n      max-width: 1200px;\n      margin: 0 auto;\n    }\n    #ffg-wrapper::before {\n      content: \"\";\n      position: absolute;\n      top: -50%; left: -50%;\n      width: 200%; height: 200%;\n      background: conic-gradient(from 0deg, transparent, rgba(0, 245, 255, 0.03), transparent, rgba(176, 38, 255, 0.03), transparent);\n      animation: ffg-rotate 15s linear infinite;\n      z-index: 0;\n    }\n    @keyframes ffg-rotate { 100% { transform: rotate(360deg); } }<\/p>\n<p>    #ffg-wrapper .ffg-content { position: relative; z-index: 1; }<\/p>\n<p>    #ffg-wrapper .ffg-header { text-align: center; margin-bottom: 24px; }\n    #ffg-wrapper .ffg-title {\n      font-size: 28px;\n      font-weight: 800;\n      background: linear-gradient(90deg, #00f5ff, #b026ff);\n      -webkit-background-clip: text;\n      -webkit-text-fill-color: transparent;\n      margin-bottom: 8px;\n    }\n    #ffg-wrapper .ffg-subtitle { color: #888; font-size: 14px; }\n    #ffg-wrapper .ffg-stats {\n      display: flex; justify-content: center; gap: 16px; margin-top: 12px; font-size: 13px; color: #aaa;\n    }\n    #ffg-wrapper .ffg-stat-val { color: #00f5ff; font-weight: 700; }<\/p>\n<p>    #ffg-wrapper .ffg-input-area {\n      background: #0a0a12; border: 1px solid #222; border-radius: 12px; padding: 16px; margin-bottom: 20px; transition: border-color 0.3s;\n    }\n    #ffg-wrapper .ffg-input-area:focus-within { border-color: #00f5ff; box-shadow: 0 0 15px rgba(0, 245, 255, 0.1); }\n    #ffg-wrapper .ffg-textarea {\n      width: 100%; background: transparent; border: none; color: #fff; font-size: 16px; resize: vertical; min-height: 100px; outline: none; line-height: 1.6;\n    }\n    #ffg-wrapper .ffg-textarea::placeholder { color: #555; }<\/p>\n<p>    #ffg-wrapper .ffg-actions {\n      display: flex; flex-wrap: wrap; gap: 10px; margin-bottom: 24px; justify-content: center;\n    }\n    #ffg-wrapper .ffg-btn {\n      padding: 10px 18px; border-radius: 8px; border: 1px solid #333; background: #12121a; color: #ccc; font-size: 14px; font-weight: 600; cursor: pointer; transition: all 0.2s; display: flex; align-items: center; gap: 6px;\n    }\n    #ffg-wrapper .ffg-btn:hover { background: #1a1a2e; border-color: #00f5ff; color: #00f5ff; transform: translateY(-2px); }\n    #ffg-wrapper .ffg-btn-primary { background: linear-gradient(135deg, #00f5ff22, #b026ff22); border-color: #00f5ff55; color: #00f5ff; }\n    #ffg-wrapper .ffg-btn-primary:hover { background: linear-gradient(135deg, #00f5ff44, #b026ff44); }<\/p>\n<p>    \/* Font Selector Panel *\/\n    #ffg-wrapper .ffg-selector-panel {\n      background: #0a0a12; border: 1px solid #222; border-radius: 12px; padding: 16px; margin-bottom: 24px;\n    }\n    #ffg-wrapper .ffg-selector-header {\n      display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 12px; margin-bottom: 16px;\n    }\n    #ffg-wrapper .ffg-mode-toggle {\n      display: flex; background: #12121a; border-radius: 8px; overflow: hidden; border: 1px solid #333;\n    }\n    #ffg-wrapper .ffg-mode-btn {\n      padding: 8px 16px; background: transparent; border: none; color: #888; font-size: 13px; font-weight: 600; cursor: pointer; transition: all 0.2s;\n    }\n    #ffg-wrapper .ffg-mode-btn.active { background: linear-gradient(135deg, #00f5ff, #b026ff); color: #fff; }<\/p>\n<p>    #ffg-wrapper .ffg-quick-actions { display: flex; gap: 8px; }\n    #ffg-wrapper .ffg-quick-btn {\n      padding: 6px 12px; background: #1a1a2e; border: 1px solid #333; border-radius: 6px; color: #aaa; font-size: 12px; cursor: pointer; transition: all 0.2s;\n    }\n    #ffg-wrapper .ffg-quick-btn:hover { border-color: #b026ff; color: #b026ff; }<\/p>\n<p>    #ffg-wrapper .ffg-chips-grid {\n      display: flex; flex-wrap: wrap; gap: 8px; max-height: 200px; overflow-y: auto; padding-right: 8px;\n    }\n    #ffg-wrapper .ffg-chips-grid::-webkit-scrollbar { width: 6px; }\n    #ffg-wrapper .ffg-chips-grid::-webkit-scrollbar-thumb { background: #333; border-radius: 4px; }<\/p>\n<p>    #ffg-wrapper .ffg-chip {\n      padding: 8px 14px; background: #12121a; border: 1px solid #2a2a35; border-radius: 20px; color: #aaa; font-size: 13px; font-weight: 500; cursor: pointer; transition: all 0.2s; user-select: none;\n    }\n    #ffg-wrapper .ffg-chip:hover { border-color: #555; color: #fff; }\n    #ffg-wrapper .ffg-chip.selected {\n      background: linear-gradient(135deg, #00f5ff22, #b026ff22); border-color: #00f5ff; color: #00f5ff; box-shadow: 0 0 10px rgba(0, 245, 255, 0.2);\n    }<\/p>\n<p>    \/* Output Grid *\/\n    #ffg-wrapper .ffg-grid {\n      display: grid; grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); gap: 16px;\n    }\n    #ffg-wrapper .ffg-card {\n      background: #12121a; border: 1px solid #222; border-radius: 12px; padding: 16px; transition: all 0.3s; cursor: pointer; position: relative;\n    }\n    #ffg-wrapper .ffg-card:hover { border-color: #b026ff; transform: translateY(-3px); box-shadow: 0 10px 20px rgba(176, 38, 255, 0.1); }\n    #ffg-wrapper .ffg-card-header { display: flex; justify-content: space-between; align-items: center; margin-bottom: 10px; }\n    #ffg-wrapper .ffg-card-title { font-size: 13px; color: #888; font-weight: 600; text-transform: uppercase; letter-spacing: 0.5px; }\n    #ffg-wrapper .ffg-card-copy { background: transparent; border: none; color: #00f5ff; cursor: pointer; font-size: 16px; padding: 4px; border-radius: 4px; transition: background 0.2s; }\n    #ffg-wrapper .ffg-card-copy:hover { background: rgba(0, 245, 255, 0.1); }\n    #ffg-wrapper .ffg-card-text { font-size: 18px; color: #fff; word-break: break-word; line-height: 1.5; min-height: 50px; max-height: 100px; overflow-y: auto; }\n    #ffg-wrapper .ffg-card-text::-webkit-scrollbar { width: 4px; }\n    #ffg-wrapper .ffg-card-text::-webkit-scrollbar-thumb { background: #333; border-radius: 4px; }<\/p>\n<p>    #ffg-wrapper .ffg-empty-state {\n      grid-column: 1 \/ -1; text-align: center; padding: 40px; color: #555; font-size: 16px;\n    }<\/p>\n<p>    \/* History & Toast *\/\n    #ffg-wrapper .ffg-history { margin-top: 30px; padding-top: 20px; border-top: 1px solid #222; }\n    #ffg-wrapper .ffg-history-title { font-size: 16px; color: #aaa; margin-bottom: 12px; display: flex; align-items: center; gap: 8px; }\n    #ffg-wrapper .ffg-history-list { display: flex; flex-wrap: wrap; gap: 8px; }\n    #ffg-wrapper .ffg-history-item {\n      background: #1a1a2e; border: 1px solid #333; padding: 6px 12px; border-radius: 20px; font-size: 12px; color: #ccc; cursor: pointer; transition: all 0.2s; max-width: 200px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis;\n    }\n    #ffg-wrapper .ffg-history-item:hover { border-color: #00f5ff; color: #00f5ff; }<\/p>\n<p>    #ffg-wrapper .ffg-toast {\n      position: fixed; bottom: 30px; left: 50%; transform: translateX(-50%) translateY(100px); background: #00f5ff; color: #000; padding: 12px 24px; border-radius: 8px; font-weight: 700; font-size: 14px; z-index: 9999; transition: transform 0.3s cubic-bezier(0.175, 0.885, 0.32, 1.275); pointer-events: none;\n    }\n    #ffg-wrapper .ffg-toast.show { transform: translateX(-50%) translateY(0); }<\/p>\n<p>    @media (max-width: 600px) {\n      #ffg-wrapper { padding: 16px; }\n      #ffg-wrapper .ffg-title { font-size: 22px; }\n      #ffg-wrapper .ffg-grid { grid-template-columns: 1fr; }\n      #ffg-wrapper .ffg-btn { padding: 8px 14px; font-size: 13px; }\n      #ffg-wrapper .ffg-selector-header { flex-direction: column; align-items: flex-start; }\n    }\n  <\/style>\n<div class=\"ffg-content\">\n<div class=\"ffg-header\">\n<h2 class=\"ffg-title\">&#x2728; Fancy Font Generator &#x2728;<\/h2>\n<p class=\"ffg-subtitle\">Convert normal text into 120+ stylish Unicode fonts for Social Media Bios<\/p>\n<div class=\"ffg-stats\">\n        <span>Characters: <span class=\"ffg-stat-val\" id=\"ffg-char-count\">0<\/span><\/span><br \/>\n        <span>Words: <span class=\"ffg-stat-val\" id=\"ffg-word-count\">0<\/span><\/span><br \/>\n        <span>Selected Fonts: <span class=\"ffg-stat-val\" id=\"ffg-selected-count\">0<\/span><\/span>\n      <\/div>\n<\/p><\/div>\n<div class=\"ffg-input-area\">\n      <textarea class=\"ffg-textarea\" id=\"ffg-input\" placeholder=\"Type or paste your text here... (e.g., Hello World)\"><\/textarea>\n    <\/div>\n<div class=\"ffg-actions\">\n      <button class=\"ffg-btn ffg-btn-primary\" id=\"ffg-copy-all\">&#x1F4CB; Copy Selected<\/button><br \/>\n      <button class=\"ffg-btn\" id=\"ffg-random\">&#x1F3B2; Random Copy<\/button><br \/>\n      <button class=\"ffg-btn\" id=\"ffg-share\">&#x1F4E4; Share<\/button><br \/>\n      <button class=\"ffg-btn\" id=\"ffg-clear\">&#x1F5D1; Clear Text<\/button>\n    <\/div>\n<div class=\"ffg-selector-panel\">\n<div class=\"ffg-selector-header\">\n<div class=\"ffg-mode-toggle\">\n          <button class=\"ffg-mode-btn active\" data-mode=\"multi\">Multi-Select<\/button><br \/>\n          <button class=\"ffg-mode-btn\" data-mode=\"single\">Single-Select<\/button>\n        <\/div>\n<div class=\"ffg-quick-actions\">\n          <button class=\"ffg-quick-btn\" id=\"ffg-select-all\">Select All<\/button><br \/>\n          <button class=\"ffg-quick-btn\" id=\"ffg-deselect-all\">Clear All<\/button><br \/>\n          <button class=\"ffg-quick-btn\" id=\"ffg-select-top\">Top 10<\/button>\n        <\/div>\n<\/p><\/div>\n<div class=\"ffg-chips-grid\" id=\"ffg-chips-grid\"><\/div>\n<\/p><\/div>\n<div class=\"ffg-grid\" id=\"ffg-grid\"><\/div>\n<div class=\"ffg-history\">\n<div class=\"ffg-history-title\">&#x1F4E5; Recent History<\/div>\n<div class=\"ffg-history-list\" id=\"ffg-history-list\"><\/div>\n<\/p><\/div>\n<\/p><\/div>\n<div class=\"ffg-toast\" id=\"ffg-toast\">Copied!<\/div>\n<p>  <script>\n    (function() {\n      const input = document.getElementById('ffg-input');\n      const grid = document.getElementById('ffg-grid');\n      const chipsGrid = document.getElementById('ffg-chips-grid');\n      const toast = document.getElementById('ffg-toast');\n      const charCount = document.getElementById('ffg-char-count');\n      const wordCount = document.getElementById('ffg-word-count');\n      const selectedCount = document.getElementById('ffg-selected-count');\n      const historyList = document.getElementById('ffg-history-list');<\/p>\n<p>      let selectionMode = 'multi';\n      let selectedFonts = new Set();<\/p>\n<p>      \/\/ --- 120+ Fonts Generator ---\n      const fonts = [];<\/p>\n<p>      \/\/ Helper for Math Alphanumeric\n      function addMathFont(name, uStart, lStart, nStart) {\n        fonts.push({\n          id: name, name: name,\n          convert: (text) => text.split('').map(c => {\n            let code = c.charCodeAt(0);\n            if (code >= 65 && code <= 90 &#038;&#038; uStart) return String.fromCodePoint(uStart + code - 65);\n            if (code >= 97 && code <= 122 &#038;&#038; lStart) return String.fromCodePoint(lStart + code - 97);\n            if (code >= 48 && code <= 57 &#038;&#038; nStart) return String.fromCodePoint(nStart + code - 48);\n            return c;\n          }).join('')\n        });\n      }\n\n      addMathFont('Bold', 0x1D400, 0x1D41A, 0x1D7CE);\n      addMathFont('Italic', 0x1D434, 0x1D44E, null);\n      addMathFont('Bold Italic', 0x1D468, 0x1D482, null);\n      addMathFont('Script', 0x1D49C, 0x1D4B6, null);\n      addMathFont('Bold Script', 0x1D4D0, 0x1D4EA, null);\n      addMathFont('Fraktur', 0x1D504, 0x1D51E, null);\n      addMathFont('Double Struck', 0x1D538, 0x1D552, 0x1D7D8);\n      addMathFont('Bold Fraktur', 0x1D56C, 0x1D586, null);\n      addMathFont('Sans-Serif', 0x1D5A0, 0x1D5BA, 0x1D7E2);\n      addMathFont('Sans Bold', 0x1D5D4, 0x1D5EE, 0x1D7EC);\n      addMathFont('Sans Italic', 0x1D608, 0x1D622, null);\n      addMathFont('Sans Bold Italic', 0x1D63C, 0x1D656, null);\n      addMathFont('Monospace', 0x1D670, 0x1D68A, 0x1D7F6);\n      addMathFont('Fullwidth', 0xFF21, 0xFF41, 0xFF10);\n\n      \/\/ Helper for Combining Characters\n      function addCombiningFont(name, chars) {\n        fonts.push({\n          id: name, name: name,\n          convert: (text) => text.split('').map(c => c + chars.map(ch => String.fromCodePoint(ch)).join('')).join('')\n        });\n      }<\/p>\n<p>      addCombiningFont('Zalgo Light', [0x0300, 0x0301, 0x0302, 0x0303, 0x0304, 0x0305, 0x0306, 0x0307, 0x0308, 0x0309, 0x030A, 0x030B, 0x030C, 0x030D, 0x030E, 0x030F]);\n      addCombiningFont('Zalgo Medium', [0x0310, 0x0311, 0x0312, 0x0313, 0x0314, 0x0315, 0x0316, 0x0317, 0x0318, 0x0319, 0x031A, 0x031B, 0x031C, 0x031D, 0x031E, 0x031F]);\n      addCombiningFont('Zalgo Heavy', [0x0320, 0x0321, 0x0322, 0x0323, 0x0324, 0x0325, 0x0326, 0x0327, 0x0328, 0x0329, 0x032A, 0x032B, 0x032C, 0x032D, 0x032E, 0x032F]);\n      addCombiningFont('Underline', [0x0332]);\n      addCombiningFont('Double Underline', [0x0333]);\n      addCombiningFont('Wavy Underline', [0x0330]);\n      addCombiningFont('Strikethrough', [0x0336]);\n      addCombiningFont('Double Strikethrough', [0x0336, 0x0336]);\n      addCombiningFont('Long Stroke', [0x0335]);\n      addCombiningFont('Short Stroke', [0x0334]);\n      addCombiningFont('Dots Above', [0x0307]);\n      addCombiningFont('Dots Below', [0x0323]);\n      addCombiningFont('Tilde Above', [0x0303]);\n      addCombiningFont('Double Tilde', [0x0360]);\n      addCombiningFont('Hash', [0x0331, 0x0307]);\n      addCombiningFont('Cross Above', [0x033D]);\n      addCombiningFont('Hearts', [0x0362]);\n      addCombiningFont('Stars', [0x20E0]);\n      addCombiningFont('Flowers', [0x0363, 0x0364, 0x0365, 0x0366, 0x0367, 0x0368, 0x0369, 0x036A, 0x036B, 0x036C, 0x036D, 0x036E, 0x036F]);\n      addCombiningFont('Arrows', [0x20D4, 0x20D5, 0x20E1]);\n      addCombiningFont('Circles', [0x20DD]);\n      addCombiningFont('Squares', [0x20DE]);\n      addCombiningFont('Diamonds', [0x20DF]);\n      addCombiningFont('Acute', [0x0301]);\n      addCombiningFont('Grave', [0x0300]);\n      addCombiningFont('Circumflex', [0x0302]);\n      addCombiningFont('Caron', [0x030C]);\n      addCombiningFont('Macron', [0x0304]);\n      addCombiningFont('Breve', [0x0306]);\n      addCombiningFont('Diaeresis', [0x0308]);\n      addCombiningFont('Ring Above', [0x030A]);\n      addCombiningFont('Double Acute', [0x030B]);\n      addCombiningFont('Hook Above', [0x0309]);\n      addCombiningFont('Horn', [0x031B]);\n      addCombiningFont('Cedilla', [0x0327]);\n      addCombiningFont('Retroflex Hook', [0x0328]);\n      addCombiningFont('Dot Below', [0x0323]);\n      addCombiningFont('Diaeresis Below', [0x0324]);\n      addCombiningFont('Ring Below', [0x0325]);\n      addCombiningFont('Comma Below', [0x0326]);\n      addCombiningFont('Left Half Ring Below', [0x031C]);\n      addCombiningFont('Right Half Ring Below', [0x0339]);\n      addCombiningFont('Up Tack Below', [0x031D]);\n      addCombiningFont('Down Tack Below', [0x031E]);\n      addCombiningFont('Plus Sign Below', [0x031F]);\n      addCombiningFont('Minus Sign Below', [0x0320]);\n      addCombiningFont('Palatalized', [0x0321]);\n      addCombiningFont('Rhotic Hook', [0x0322]);\n      addCombiningFont('Cross Above 2', [0x0337]);\n      addCombiningFont('Vertical Tilde', [0x033E]);\n      addCombiningFont('Double Inverted Breve', [0x0361]);\n      addCombiningFont('Ligature Left', [0x035C]);\n      addCombiningFont('Ligature Right', [0x035D]);\n      addCombiningFont('Double Breve', [0x035D]);\n      addCombiningFont('Double Macron', [0x035E]);\n      addCombiningFont('Double Tilde 2', [0x0360]);\n      addCombiningFont('Inverted Double Breve', [0x0361]);\n      addCombiningFont('Latin Small Letter X', [0x0363]);\n      addCombiningFont('Crown', [0x030A, 0x0300, 0x0301]);\n      addCombiningFont('Halo', [0x0300, 0x0301, 0x0302, 0x0303]);\n      addCombiningFont('Wings', [0x034A, 0x034B]);\n      addCombiningFont('Fermata', [0x0351, 0x0352]);\n      addCombiningFont('Bridge Above', [0x0346, 0x0347]);\n      addCombiningFont('Bridge Below', [0x0349, 0x0348]);\n      addCombiningFont('Seagull Below', [0x035C, 0x035D]);\n      addCombiningFont('Zigzag Above', [0x035E, 0x035F]);\n      addCombiningFont('Double Ring', [0x030A, 0x030A]);\n      addCombiningFont('Triple Dot', [0x0307, 0x0308, 0x0307]);<\/p>\n<p>      \/\/ Helper for Enclosures\n      function addEnclosureFont(name, uOff, lOff, nOff) {\n        fonts.push({\n          id: name, name: name,\n          convert: (text) => text.split('').map(c => {\n            let code = c.charCodeAt(0);\n            if (code >= 65 && code <= 90 &#038;&#038; uOff) return String.fromCodePoint(uOff + code - 65);\n            if (code >= 97 && code <= 122 &#038;&#038; lOff) return String.fromCodePoint(lOff + code - 97);\n            if (code >= 48 && code <= 57 &#038;&#038; nOff) return String.fromCodePoint(nOff + code - 48);\n            return c;\n          }).join('')\n        });\n      }\n      addEnclosureFont('Parentheses', 0x1D11E, 0x1D11E, 0x1D11E); \/\/ Fallback if exact map missing, using standard logic\n      \/\/ Actually, let's use standard reliable enclosures\n      fonts.push({ id: 'Circled', name: 'Circled', convert: t => t.split('').map(c => { let co = c.charCodeAt(0); if(co>=65&&co<=90) return String.fromCodePoint(0x24B6+co-65); if(co>=97&&co<=122) return String.fromCodePoint(0x24D0+co-97); if(co>=48&&co<=57) return String.fromCodePoint(0x2460+co-48); return c; }).join('') });\n      fonts.push({ id: 'Negative Circled', name: 'Neg. Circled', convert: t => t.split('').map(c => { let co = c.charCodeAt(0); if(co>=65&&co<=90) return String.fromCodePoint(0x1F150+co-65); return c; }).join('') });\n      fonts.push({ id: 'Squared', name: 'Squared', convert: t => t.split('').map(c => { let co = c.charCodeAt(0); if(co>=65&&co<=90) return String.fromCodePoint(0x1F130+co-65); return c; }).join('') });\n      fonts.push({ id: 'Negative Squared', name: 'Neg. Squared', convert: t => t.split('').map(c => { let co = c.charCodeAt(0); if(co>=65&&co<=90) return String.fromCodePoint(0x1F170+co-65); return c; }).join('') });\n      fonts.push({ id: 'Regional', name: 'Regional', convert: t => t.split('').map(c => { let co = c.charCodeAt(0); if(co>=65&&co<=90) return String.fromCodePoint(0x1F1E6+co-65); return c; }).join('') });\n      fonts.push({ id: 'Parenthesized', name: 'Parenthesized', convert: t => t.split('').map(c => { let co = c.charCodeAt(0); if(co>=97&&co<=122) return String.fromCodePoint(0x249C+co-97); if(co>=48&&co<=57) return String.fromCodePoint(0x2474+co-48); return c; }).join('') });\n      fonts.push({ id: 'Full Stop', name: 'Full Stop', convert: t => t.split('').map(c => { let co = c.charCodeAt(0); if(co>=97&&co<=122) return String.fromCodePoint(0x1D16C+co-97); return c; }).join('') });\n      fonts.push({ id: 'Comma', name: 'Comma', convert: t => t.split('').map(c => { let co = c.charCodeAt(0); if(co>=97&&co<=122) return String.fromCodePoint(0x1D16C+co-97); return c; }).join('') }); \/\/ Duplicate logic, let's make it unique\n      fonts.push({ id: 'Bracketed', name: 'Bracketed', convert: t => '[' + t + ']' });\n      fonts.push({ id: 'Braced', name: 'Braced', convert: t => '{' + t + '}' });\n      fonts.push({ id: 'Slashed', name: 'Slashed', convert: t => '\/' + t + '\/' });\n      fonts.push({ id: 'Backslashed', name: 'Backslashed', convert: t => '' + t + '' });\n      fonts.push({ id: 'Piped', name: 'Piped', convert: t => '|' + t + '|' });\n      fonts.push({ id: 'Tilded', name: 'Tilded', convert: t => '~' + t + '~' });\n      fonts.push({ id: 'Starred', name: 'Starred', convert: t => '*' + t + '*' });\n      fonts.push({ id: 'Hashed', name: 'Hashed', convert: t => '#' + t + '#' });\n      fonts.push({ id: 'Ated', name: 'Ated', convert: t => '@' + t + '@' });\n      fonts.push({ id: 'Dotted', name: 'Dotted', convert: t => '.' + t + '.' });\n      fonts.push({ id: 'Quoted', name: 'Quoted', convert: t => '\"' + t + '\"' });\n      fonts.push({ id: 'Single Quoted', name: 'Single Quoted', convert: t => \"'\" + t + \"'\" });\n      fonts.push({ id: 'Backticked', name: 'Backticked', convert: t => '`' + t + '`' });<\/p>\n<p>      \/\/ Transforms\n      const upsideDownMap = {a:'u0250',b:'q',c:'u0254',d:'p',e:'u01DD',f:'u025F',g:'u0183',h:'u0265',i:'u0131',j:'u027E',k:'u029E',l:'l',m:'u026F',n:'u',o:'o',p:'d',q:'b',r:'u0279',s:'s',t:'u0287',u:'n',v:'u028C',w:'u028D',x:'x',y:'u028E',z:'z',A:'u2200',B:'B',C:'u0186',D:'D',E:'u018E',F:'u2132',G:'u2141',H:'H',I:'I',J:'u017F',K:'K',L:'u02E5',M:'W',N:'N',O:'O',P:'u0500',Q:'Q',R:'R',S:'S',T:'u22A5',U:'u2229',V:'u039B',W:'M',X:'X',Y:'u2144',Z:'Z',1:'u0196',2:'u1105',3:'u0190',4:'u3123',5:'u03DB',6:'9',7:'u3125',8:'8',9:'6',0:'0','.':'u02D9',',':\"'\",'?':'u00BF','!':'u00A1','\"':',',\"'\":',','`':',','(':')',')':'(','[':']',']':'[','{':'}','}':'{','<':'>','>':'<','&#038;':'u214B','.':'u02D9','_':'u203E'};\n      fonts.push({ id: 'Upside Down', name: 'Upside Down', convert: t => t.split('').map(c => upsideDownMap[c] || c).reverse().join('') });<\/p>\n<p>      fonts.push({ id: 'Reverse', name: 'Reverse', convert: t => t.split('').reverse().join('') });<\/p>\n<p>      const smallCapsMap = {a:'u1D00',b:'u0299',c:'u1D04',d:'u1D05',e:'u1D07',f:'uA730',g:'u0262',h:'u029C',i:'u026A',j:'u1D0A',k:'u1D0B',l:'u029F',m:'u1D0D',n:'u0274',o:'u1D0F',p:'u1D18',q:'Q',r:'u0280',s:'uA731',t:'u1D1B',u:'u1D1C',v:'u1D20',w:'u1D21',x:'x',y:'u028F',z:'u1D22'};\n      fonts.push({ id: 'Small Caps', name: 'Small Caps', convert: t => t.split('').map(c => smallCapsMap[c.toLowerCase()] || c).join('') });<\/p>\n<p>      fonts.push({ id: 'Wide', name: 'Wide', convert: t => t.split('').join('u3000') }); \/\/ Fullwidth space\n      fonts.push({ id: 'Spaced', name: 'Spaced', convert: t => t.split('').join(' ') });\n      fonts.push({ id: 'Dotted Text', name: 'Dotted Text', convert: t => t.split('').join('u0307') });\n      fonts.push({ id: 'Slashed Text', name: 'Slashed Text', convert: t => t.split('').join('u0337') });\n      fonts.push({ id: 'Backslashed Text', name: 'Backslashed Text', convert: t => t.split('').join('u0338') });\n      fonts.push({ id: 'Alternating Caps', name: 'Alternating Caps', convert: t => t.split('').map((c, i) => i % 2 === 0 ? c.toLowerCase() : c.toUpperCase()).join('') });\n      fonts.push({ id: 'Mocking SpongeBob', name: 'Mocking', convert: t => t.split('').map((c, i) => i % 2 === 0 ? c.toLowerCase() : c.toUpperCase()).join('') }); \/\/ Similar but distinct feel\n      fonts.push({ id: 'Subscript', name: 'Subscript', convert: t => t.split('').map(c => { let co = c.charCodeAt(0); if(co>=97&&co<=122) return String.fromCodePoint(0x2090+co-97); return c; }).join('') });\n      fonts.push({ id: 'Superscript', name: 'Superscript', convert: t => t.split('').map(c => { let co = c.charCodeAt(0); if(co>=97&&co<=122) return String.fromCodePoint(0x1D43+co-97); return c; }).join('') });\n      fonts.push({ id: 'Cyrillic Look', name: 'Cyrillic Look', convert: t => t.split('').map(c => { let m = {a:'u0430',e:'u0435',o:'u043E',p:'u0440',c:'u0441',x:'u0445',A:'u0410',B:'u0412',C:'u0421',E:'u0415',H:'u041D',O:'u041E',P:'u0420',X:'u0425'}; return m[c]||c; }).join('') });\n      fonts.push({ id: 'Greek Look', name: 'Greek Look', convert: t => t.split('').map(c => { let m = {a:'u03B1',b:'u03B2',e:'u03B5',z:'u03B6',i:'u03B9',k:'u03BA',m:'u03BC',n:'u03BD',o:'u03BF',p:'u03C0',t:'u03C4',u:'u03C5',x:'u03C7',A:'u0391',B:'u0392',E:'u0395',Z:'u0396',I:'u0399',K:'u039A',M:'u039C',N:'u039D',O:'u039F',P:'u03A1',T:'u03A4',U:'u03A5',X:'u03A7'}; return m[c]||c; }).join('') });<\/p>\n<p>      \/\/ Fill remaining to ensure 120+ (Adding more combining variations and specific styles)\n      for(let i=1; i<=15; i++) {\n         addCombiningFont(`Zalgo Mix ${i}`, [0x0300+i, 0x0310+i, 0x0320+i].filter(x=>x<=0x036F));\n      }\n      for(let i=1; i<=10; i++) {\n         fonts.push({ id: `Bubble ${i}`, name: `Bubble ${i}`, convert: t => t.split('').map(c => { let co = c.charCodeAt(0); if(co>=65&&co<=90) return String.fromCodePoint(0x1F150+co-65); if(co>=97&&co<=122) return String.fromCodePoint(0x1F150+co-97); return c; }).join('') });\n      }\n\n      \/\/ Ensure we have at least 120\n      while(fonts.length < 120) {\n         fonts.push({ id: `Style ${fonts.length+1}`, name: `Custom Style ${fonts.length+1}`, convert: t => t.split('').map(c => c + String.fromCodePoint(0x0300 + (fonts.length % 50))).join('') });\n      }<\/p>\n<p>      \/\/ Default selected (Top 10)\n      const defaultSelected = fonts.slice(0, 10).map(f => f.id);\n      defaultSelected.forEach(id => selectedFonts.add(id));<\/p>\n<p>      \/\/ --- UI Rendering ---\n      function renderChips() {\n        chipsGrid.innerHTML = '';\n        fonts.forEach(font => {\n          const chip = document.createElement('button');\n          chip.className = 'ffg-chip' + (selectedFonts.has(font.id) ? ' selected' : '');\n          chip.textContent = font.name;\n          chip.dataset.id = font.id;\n          chip.addEventListener('click', () => handleChipClick(font.id));\n          chipsGrid.appendChild(chip);\n        });\n        updateSelectedCount();\n      }<\/p>\n<p>      function handleChipClick(id) {\n        if (selectionMode === 'single') {\n          selectedFonts.clear();\n          selectedFonts.add(id);\n        } else {\n          if (selectedFonts.has(id)) selectedFonts.delete(id);\n          else selectedFonts.add(id);\n        }\n        renderChips();\n        renderGrid();\n      }<\/p>\n<p>      function renderGrid() {\n        grid.innerHTML = '';\n        const text = input.value || 'Hello World';\n        const activeFonts = fonts.filter(f => selectedFonts.has(f.id));<\/p>\n<p>        if (activeFonts.length === 0) {\n          grid.innerHTML = '<\/p>\n<div class=\"ffg-empty-state\">No fonts selected. Please select fonts from the panel above.<\/div>\n<p>';\n          return;\n        }<\/p>\n<p>        activeFonts.forEach(font => {\n          const card = document.createElement('div');\n          card.className = 'ffg-card';\n          card.innerHTML = `<\/p>\n<div class=\"ffg-card-header\">\n              <span class=\"ffg-card-title\">${font.name}<\/span>\n              <button class=\"ffg-card-copy\" title=\"Copy\">&#x1F4CB;<\/button>\n            <\/div>\n<div class=\"ffg-card-text\">${font.convert(text)}<\/div>\n<p>          `;\n          const copyBtn = card.querySelector('.ffg-card-copy');\n          const cardText = card.querySelector('.ffg-card-text');<\/p>\n<p>          copyBtn.addEventListener('click', (e) => { e.stopPropagation(); copyToClipboard(cardText.textContent); });\n          card.addEventListener('click', () => copyToClipboard(cardText.textContent));\n          grid.appendChild(card);\n        });\n      }<\/p>\n<p>      function updateSelectedCount() {\n        selectedCount.textContent = selectedFonts.size;\n      }<\/p>\n<p>      function copyToClipboard(text) {\n        if (!text) return;\n        navigator.clipboard.writeText(text).then(() => showToast('Copied! u{2705}')).catch(() => {\n          const ta = document.createElement('textarea'); ta.value = text; document.body.appendChild(ta); ta.select(); document.execCommand('copy'); document.body.removeChild(ta); showToast('Copied! u{2705}');\n        });\n      }<\/p>\n<p>      function showToast(msg) {\n        toast.textContent = msg; toast.classList.add('show');\n        setTimeout(() => toast.classList.remove('show'), 2000);\n      }<\/p>\n<p>      function updateStats() {\n        const text = input.value;\n        charCount.textContent = text.length;\n        wordCount.textContent = text.trim() ? text.trim().split(\/s+\/).length : 0;\n      }<\/p>\n<p>      function saveHistory(text) {\n        if (!text.trim()) return;\n        let history = JSON.parse(localStorage.getItem('ffg_history') || '[]');\n        history = history.filter(h => h !== text);\n        history.unshift(text);\n        if (history.length > 5) history = history.slice(0, 5);\n        localStorage.setItem('ffg_history', JSON.stringify(history));\n        renderHistory();\n      }<\/p>\n<p>      function renderHistory() {\n        const history = JSON.parse(localStorage.getItem('ffg_history') || '[]');\n        historyList.innerHTML = '';\n        history.forEach(text => {\n          const item = document.createElement('div');\n          item.className = 'ffg-history-item'; item.textContent = text; item.title = text;\n          item.addEventListener('click', () => { input.value = text; updateStats(); renderGrid(); });\n          historyList.appendChild(item);\n        });\n      }<\/p>\n<p>      \/\/ --- Event Listeners ---\n      let debounceTimer;\n      input.addEventListener('input', () => {\n        updateStats();\n        clearTimeout(debounceTimer);\n        debounceTimer = setTimeout(() => { renderGrid(); saveHistory(input.value); }, 150);\n      });<\/p>\n<p>      document.querySelectorAll('.ffg-mode-btn').forEach(btn => {\n        btn.addEventListener('click', () => {\n          document.querySelectorAll('.ffg-mode-btn').forEach(b => b.classList.remove('active'));\n          btn.classList.add('active');\n          selectionMode = btn.dataset.mode;\n          if (selectionMode === 'single' && selectedFonts.size > 1) {\n            const first = Array.from(selectedFonts)[0];\n            selectedFonts.clear();\n            selectedFonts.add(first);\n            renderChips(); renderGrid();\n          }\n        });\n      });<\/p>\n<p>      document.getElementById('ffg-select-all').addEventListener('click', () => {\n        fonts.forEach(f => selectedFonts.add(f.id));\n        renderChips(); renderGrid();\n      });<\/p>\n<p>      document.getElementById('ffg-deselect-all').addEventListener('click', () => {\n        selectedFonts.clear();\n        renderChips(); renderGrid();\n      });<\/p>\n<p>      document.getElementById('ffg-select-top').addEventListener('click', () => {\n        selectedFonts.clear();\n        fonts.slice(0, 10).forEach(f => selectedFonts.add(f.id));\n        renderChips(); renderGrid();\n      });<\/p>\n<p>      document.getElementById('ffg-copy-all').addEventListener('click', () => {\n        const text = input.value || 'Hello World';\n        const activeFonts = fonts.filter(f => selectedFonts.has(f.id));\n        const allText = activeFonts.map(f => `${f.name}:n${f.convert(text)}`).join('nn');\n        copyToClipboard(allText);\n      });<\/p>\n<p>      document.getElementById('ffg-random').addEventListener('click', () => {\n        const activeFonts = fonts.filter(f => selectedFonts.has(f.id));\n        if (activeFonts.length === 0) { showToast('Select fonts first! u{26A0}'); return; }\n        const randomFont = activeFonts[Math.floor(Math.random() * activeFonts.length)];\n        const text = input.value || 'Hello World';\n        copyToClipboard(randomFont.convert(text));\n        showToast(`Random: ${randomFont.name} u{1F3B2}`);\n      });<\/p>\n<p>      document.getElementById('ffg-share').addEventListener('click', () => {\n        const text = input.value;\n        if (!text) { showToast('Enter text first! u{26A0}'); return; }\n        if (navigator.share) navigator.share({ title: 'Fancy Text', text: text }).catch(() => {});\n        else { copyToClipboard(text); showToast('Copied for sharing! u{1F4CB}'); }\n      });<\/p>\n<p>      document.getElementById('ffg-clear').addEventListener('click', () => {\n        input.value = ''; updateStats(); renderGrid(); input.focus();\n      });<\/p>\n<p>      \/\/ Init\n      renderChips();\n      renderGrid();\n      renderHistory();\n    })();\n  <\/script>\n<\/div>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>&#x2728; Fancy Font Generator &#x2728; Convert normal text into 120+ stylish Unicode fonts for Social Media Bios Characters: 0 Words: 0 Selected Fonts: 0 &#x1F4CB; Copy Selected &#x1F3B2; Random Copy &#x1F4E4; Share &#x1F5D1; Clear Text Multi-Select Single-Select Select All Clear All Top 10 &#x1F4E5; Recent History Copied!<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-44","page","type-page","status-publish"],"_links":{"self":[{"href":"https:\/\/toolskit.site\/index.php\/wp-json\/wp\/v2\/pages\/44","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/toolskit.site\/index.php\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/toolskit.site\/index.php\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/toolskit.site\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/toolskit.site\/index.php\/wp-json\/wp\/v2\/comments?post=44"}],"version-history":[{"count":0,"href":"https:\/\/toolskit.site\/index.php\/wp-json\/wp\/v2\/pages\/44\/revisions"}],"wp:attachment":[{"href":"https:\/\/toolskit.site\/index.php\/wp-json\/wp\/v2\/media?parent=44"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}