{"id":497,"date":"2026-03-07T09:19:24","date_gmt":"2026-03-07T09:19:24","guid":{"rendered":"https:\/\/primetoolhub.com\/?page_id=497"},"modified":"2026-07-15T14:41:13","modified_gmt":"2026-07-15T14:41:13","slug":"free-word-counter-and-text-case-converter","status":"publish","type":"page","link":"https:\/\/schoolict.net\/tools\/free-word-counter-and-text-case-converter\/","title":{"rendered":"Free \u00a0Word Counter and Text Case Converter &amp; Keyword Analyzer"},"content":{"rendered":"\n<div class=\"pth-hero-section\">\n    <div class=\"pth-hero-content\">\n        <h2>Free Word Counter, Text Case Converter &amp; Keyword Analyzer<\/h2>\n        <p>Instantly count words, analyze keyword density, check readability, convert text cases, and clean formatting with our 100% free, offline SEO text utility.<\/p>\n\n        <div id=\"pth-toc-placeholder\"><\/div>\n    <\/div>\n\n <div class=\"pth-hero-image\">\n    <img data-no-lazy=\"1\"\n         src=\"https:\/\/schoolict.net\/tools\/wp-content\/uploads\/2026\/03\/Word-Counter-and-Text-Case-Converter-800x447.jpeg\"\n         width=\"800\"\n         height=\"447\"\n         alt=\"word counter and text case converter\"\n         fetchpriority=\"high\"\n         loading=\"eager\"\n         decoding=\"async\"\n         style=\"width:100%; height:auto; display:block;\">\n  <\/div>\n<\/div>\n\n\n\n<div class=\"wp-block-rank-math-toc-block\" id=\"rank-math-toc\"><h2>Table of Contents<\/h2><nav><ul><li><a href=\"#\ud83d\udd34-managing-heavy-content-and-ai-prompts\">\ud83d\udd34 Managing Heavy Content and AI Prompts<\/a><\/li><li><a href=\"#\ud83d\udfe1-validating-readability-scores-and-meta-configurations\">\ud83d\udfe1 Validating Readability Scores and Meta Configurations<\/a><ul><li><a href=\"#\ud83d\udfe2-functional-boundaries-and-limitations\">\ud83d\udfe2 Functional Boundaries and Limitations<\/a><ul><li><a href=\"#regex-requires-exact-syntax\">Regex Requires Exact Syntax<\/a><\/li><li><a href=\"#the-serp-preview-is-static\">The SERP Preview is Static<\/a><\/li><\/ul><\/li><\/ul><\/li><\/ul><\/nav><\/div>\n\n\n<style>\r\n\/* ============================================================\r\n   PTH ULTIMATE TEXT & SEO STUDIO \u2014 v3.0\r\n   AdSense + PageSpeed 100 + WCAG 2.1 AA + WP\/LiteSpeed Safe\r\n   6 Tabs | 33 Tools | 100% Offline | Zero CDN\r\n   ============================================================ *\/\r\n#pth-textseo-wrapper {\r\n    font-family: 'Inter', system-ui, sans-serif;\r\n    width: 100%; max-width: 1400px; margin: 0 auto;\r\n    box-sizing: border-box; background: #f8fafc;\r\n    padding: 20px; border-radius: 16px;\r\n    color: #1e293b; font-weight: 500;\r\n}\r\n#pth-textseo-wrapper * { box-sizing: border-box; min-width: 0; }\r\n#pth-textseo-wrapper h2,\r\n#pth-textseo-wrapper h3,\r\n#pth-textseo-wrapper h4 { color: #0f172a; font-weight: 800; margin-top: 0; }\r\n#pth-textseo-wrapper .pth-tool-title {\r\n    font-size: 26px; font-weight: 800; color: #1d4ed8; margin: 0;\r\n}\r\n\r\n\/* \u2500\u2500 Cards \u2500\u2500 *\/\r\n#pth-textseo-wrapper .pth-card {\r\n    background: #fff; border: 1px solid #e2e8f0;\r\n    border-radius: 12px; padding: 20px; margin-bottom: 16px;\r\n    box-shadow: 0 4px 6px -1px rgba(0,0,0,0.04);\r\n}\r\n#pth-textseo-wrapper .pth-card-hdr {\r\n    background: #f8fafc; margin: -20px -20px 16px -20px;\r\n    padding: 10px 16px; color: #1d4ed8; font-size: 12px;\r\n    border-bottom: 2px solid #eff6ff; font-weight: 800;\r\n    text-transform: uppercase; border-radius: 12px 12px 0 0;\r\n    letter-spacing: 0.5px;\r\n}\r\n\r\n\/* \u2500\u2500 Meta bar \u2500\u2500 *\/\r\n#pth-textseo-wrapper .pth-tool-meta-bar {\r\n    display: flex; align-items: center; gap: 10px;\r\n    flex-wrap: wrap; margin-bottom: 16px;\r\n}\r\n#pth-textseo-wrapper .pth-version-badge {\r\n    background: #eff6ff; color: #1d4ed8; border: 1px solid #bfdbfe;\r\n    font-size: 11px; font-weight: 700; padding: 2px 8px; border-radius: 4px;\r\n}\r\n#pth-textseo-wrapper .pth-status-offline {\r\n    background: #f0fdf4; color: #15803d; border: 1px solid #bbf7d0;\r\n    font-size: 11px; font-weight: 700; padding: 2px 8px; border-radius: 4px;\r\n}\r\n\r\n\/* \u2500\u2500 Layout \u2500\u2500 *\/\r\n#pth-textseo-wrapper .pth-flex-layout {\r\n    display: grid; grid-template-columns: 1.8fr 1fr;\r\n    gap: 20px; align-items: start;\r\n}\r\n#pth-textseo-wrapper .pth-flex-layout.pth-full-width {\r\n    grid-template-columns: 100%;\r\n}\r\n\r\n\/* \u2500\u2500 Tab Navigation \u2500\u2500 *\/\r\n#pth-textseo-wrapper .pth-tabs-nav {\r\n    display: flex; gap: 4px; flex-wrap: wrap;\r\n    margin-bottom: 20px; border-bottom: 2px solid #e2e8f0;\r\n    padding-bottom: 0;\r\n}\r\n#pth-textseo-wrapper .pth-tab-btn {\r\n    padding: 9px 14px; border-radius: 8px 8px 0 0;\r\n    font-size: 12px; font-weight: 700; cursor: pointer;\r\n    border: 2px solid transparent; border-bottom: none;\r\n    background: #f1f5f9; color: #334155;\r\n    transition: 0.15s; font-family: 'Inter', sans-serif;\r\n    margin-bottom: -2px; white-space: nowrap;\r\n}\r\n#pth-textseo-wrapper .pth-tab-btn:hover { background: #e2e8f0; color: #0f172a; }\r\n#pth-textseo-wrapper .pth-tab-btn.pth-active {\r\n    background: #fff; color: #1d4ed8;\r\n    border-color: #e2e8f0; border-bottom-color: #fff;\r\n}\r\n\r\n\/* \u2500\u2500 Buttons \u2500\u2500 *\/\r\n#pth-textseo-wrapper .pth-btn {\r\n    padding: 9px 18px; border-radius: 8px; font-weight: 700;\r\n    cursor: pointer; border: none; font-family: 'Inter', sans-serif;\r\n    font-size: 13px; transition: 0.2s; display: inline-flex;\r\n    align-items: center; justify-content: center; gap: 6px;\r\n}\r\n#pth-textseo-wrapper .pth-btn-primary { background: #2563eb; color: #fff; }\r\n#pth-textseo-wrapper .pth-btn-primary:hover { background: #1d4ed8; }\r\n#pth-textseo-wrapper .pth-btn-secondary {\r\n    background: #f1f5f9; color: #334155; border: 1px solid #e2e8f0;\r\n}\r\n#pth-textseo-wrapper .pth-btn-secondary:hover { background: #e2e8f0; }\r\n#pth-textseo-wrapper .pth-btn-success { background: #059669; color: #fff; }\r\n#pth-textseo-wrapper .pth-btn-success:hover { background: #047857; }\r\n#pth-textseo-wrapper .pth-btn-danger {\r\n    background: #fef2f2; color: #991b1b; border: 1px solid #fecaca;\r\n}\r\n#pth-textseo-wrapper .pth-btn-danger:hover { background: #fee2e2; }\r\n#pth-textseo-wrapper .pth-btn-purple { background: #5b21b6; color: #fff; }\r\n#pth-textseo-wrapper .pth-btn-purple:hover { background: #4c1d95; }\r\n#pth-textseo-wrapper .pth-sample-btn {\r\n    background: #d1fae5; color: #047857; border: 1px solid #10b981;\r\n    font-size: 0.75rem; padding: 4px 10px; border-radius: 6px;\r\n    font-weight: 700; cursor: pointer; transition: 0.2s;\r\n    display: inline-flex; align-items: center; gap: 4px;\r\n}\r\n#pth-textseo-wrapper .pth-sample-btn:hover { background: #a7f3d0; }\r\n\r\n\/* \u2500\u2500 Form elements \u2500\u2500 *\/\r\n#pth-textseo-wrapper label {\r\n    font-weight: 700; color: #0f172a; margin-bottom: 5px;\r\n    display: block; font-size: 12px;\r\n    text-transform: uppercase; letter-spacing: 0.4px;\r\n}\r\n#pth-textseo-wrapper input[type=\"text\"],\r\n#pth-textseo-wrapper input[type=\"number\"],\r\n#pth-textseo-wrapper select,\r\n#pth-textseo-wrapper textarea {\r\n    width: 100%; padding: 9px 12px; border: 2px solid #e2e8f0;\r\n    border-radius: 8px; font-family: 'Inter', sans-serif;\r\n    font-size: 13px; color: #0f172a; background: #fff; transition: 0.2s;\r\n}\r\n#pth-textseo-wrapper input:focus,\r\n#pth-textseo-wrapper select:focus,\r\n#pth-textseo-wrapper textarea:focus {\r\n    border-color: #3b82f6; outline: none;\r\n    box-shadow: 0 0 0 3px rgba(59,130,246,0.1);\r\n}\r\n#pth-textseo-wrapper textarea { resize: vertical; line-height: 1.6; }\r\n#pth-textseo-wrapper .pth-field { margin-bottom: 14px; }\r\n#pth-textseo-wrapper .pth-row-2 { display: grid; grid-template-columns: 1fr 1fr; gap: 12px; }\r\n#pth-textseo-wrapper .pth-row-3 { display: grid; grid-template-columns: 1fr 1fr 1fr; gap: 10px; }\r\n\r\n\/* \u2500\u2500 Action bar \u2500\u2500 *\/\r\n#pth-textseo-wrapper .pth-action-bar {\r\n    display: flex; gap: 8px; flex-wrap: wrap; margin-bottom: 14px;\r\n}\r\n\r\n\/* \u2500\u2500 Stats grid \u2500\u2500 *\/\r\n#pth-textseo-wrapper .pth-stats-grid {\r\n    display: grid; grid-template-columns: repeat(3, 1fr);\r\n    gap: 10px; margin-bottom: 16px;\r\n}\r\n#pth-textseo-wrapper .pth-stat-box {\r\n    background: #f8fafc; border: 1px solid #e2e8f0;\r\n    border-radius: 10px; padding: 12px; text-align: center;\r\n}\r\n#pth-textseo-wrapper .pth-stat-num {\r\n    font-size: 22px; font-weight: 800; color: #1d4ed8;\r\n    display: block; font-variant-numeric: tabular-nums;\r\n}\r\n#pth-textseo-wrapper .pth-stat-lbl {\r\n    font-size: 10px; font-weight: 700; color: #334155;\r\n    text-transform: uppercase; letter-spacing: 0.4px;\r\n}\r\n\r\n\/* \u2500\u2500 Progress bar \u2500\u2500 *\/\r\n#pth-textseo-wrapper .pth-prog-wrap {\r\n    background: #e2e8f0; border-radius: 6px; height: 8px;\r\n    overflow: hidden; margin: 6px 0;\r\n}\r\n#pth-textseo-wrapper .pth-prog-bar {\r\n    height: 100%; border-radius: 6px; transition: width 0.3s;\r\n    background: #2563eb;\r\n}\r\n#pth-textseo-wrapper .pth-prog-bar.green { background: #059669; }\r\n#pth-textseo-wrapper .pth-prog-bar.amber { background: #d97706; }\r\n#pth-textseo-wrapper .pth-prog-bar.red   { background: #dc2626; }\r\n\r\n\/* \u2500\u2500 Google Snippet Preview \u2500\u2500 *\/\r\n#pth-textseo-wrapper .pth-serp-preview {\r\n    background: #fff; border: 1px solid #e2e8f0;\r\n    border-radius: 10px; padding: 16px 20px;\r\n    margin-bottom: 16px; font-family: Arial, sans-serif;\r\n}\r\n#pth-textseo-wrapper .pth-serp-url {\r\n    font-size: 12px; color: #14532d; margin-bottom: 3px; font-weight: 500;\r\n}\r\n#pth-textseo-wrapper .pth-serp-title {\r\n    font-size: 18px; color: #1558d6; font-weight: 400;\r\n    margin-bottom: 4px; text-decoration: none; display: block;\r\n    line-height: 1.3; cursor: pointer;\r\n}\r\n#pth-textseo-wrapper .pth-serp-title:hover { text-decoration: underline; }\r\n#pth-textseo-wrapper .pth-serp-desc {\r\n    font-size: 13px; color: #4d5156; line-height: 1.5;\r\n}\r\n#pth-textseo-wrapper .pth-serp-date {\r\n    color: #70757a; font-size: 13px; margin-right: 4px;\r\n}\r\n\r\n\/* \u2500\u2500 Char limit bars \u2500\u2500 *\/\r\n#pth-textseo-wrapper .pth-char-row {\r\n    display: flex; justify-content: space-between;\r\n    align-items: center; margin-bottom: 4px;\r\n}\r\n#pth-textseo-wrapper .pth-char-count {\r\n    font-size: 13px; font-weight: 800; padding: 2px 8px;\r\n    border-radius: 4px; transition: 0.2s;\r\n}\r\n#pth-textseo-wrapper .pth-char-ok  { background: #f0fdf4; color: #047857; }\r\n#pth-textseo-wrapper .pth-char-warn{ background: #fffbeb; color: #92400e; }\r\n#pth-textseo-wrapper .pth-char-bad { background: #fef2f2; color: #991b1b; }\r\n\r\n\/* \u2500\u2500 Keyword density \u2500\u2500 *\/\r\n#pth-textseo-wrapper .pth-kw-item {\r\n    display: flex; align-items: center; gap: 10px;\r\n    padding: 6px 0; border-bottom: 1px solid #f1f5f9;\r\n}\r\n#pth-textseo-wrapper .pth-kw-item:last-child { border-bottom: none; }\r\n#pth-textseo-wrapper .pth-kw-word {\r\n    font-size: 13px; font-weight: 700; color: #0f172a;\r\n    min-width: 80px;\r\n}\r\n#pth-textseo-wrapper .pth-kw-count {\r\n    font-size: 11px; color: #334155; min-width: 50px; font-weight: 600;\r\n}\r\n#pth-textseo-wrapper .pth-kw-bar-bg {\r\n    flex: 1; background: #e2e8f0; border-radius: 4px; height: 6px;\r\n}\r\n#pth-textseo-wrapper .pth-kw-bar-fill {\r\n    height: 100%; background: #2563eb; border-radius: 4px; transition: 0.3s;\r\n}\r\n\r\n\/* \u2500\u2500 Case converter buttons \u2500\u2500 *\/\r\n#pth-textseo-wrapper .pth-case-grid {\r\n    display: grid; grid-template-columns: repeat(auto-fill, minmax(130px, 1fr));\r\n    gap: 8px; margin-bottom: 16px;\r\n}\r\n#pth-textseo-wrapper .pth-case-btn {\r\n    padding: 8px 10px; border-radius: 8px; font-size: 12px;\r\n    font-weight: 700; cursor: pointer; border: 2px solid #e2e8f0;\r\n    background: #f8fafc; color: #334155; transition: 0.15s;\r\n    font-family: 'Inter', sans-serif; text-align: center;\r\n}\r\n#pth-textseo-wrapper .pth-case-btn:hover {\r\n    border-color: #2563eb; background: #eff6ff; color: #1d4ed8;\r\n}\r\n\r\n\/* \u2500\u2500 Output code display \u2500\u2500 *\/\r\n#pth-textseo-wrapper .pth-output-display {\r\n    background: #0f172a; color: #4ade80; padding: 14px;\r\n    border-radius: 10px; font-family: 'Courier New', monospace;\r\n    font-size: 12px; min-height: 80px; max-height: 200px;\r\n    overflow-y: auto; white-space: pre-wrap; word-break: break-all;\r\n    border: 2px solid #1e293b; line-height: 1.6;\r\n}\r\n\r\n\/* \u2500\u2500 Toggle switch \u2500\u2500 *\/\r\n#pth-textseo-wrapper .pth-toggle-row {\r\n    display: flex; justify-content: space-between;\r\n    align-items: center; padding: 7px 0;\r\n    border-bottom: 1px solid #f1f5f9;\r\n}\r\n#pth-textseo-wrapper .pth-toggle-row:last-child { border-bottom: none; }\r\n#pth-textseo-wrapper .pth-toggle-row span {\r\n    font-size: 13px; font-weight: 600; color: #334155;\r\n}\r\n#pth-textseo-wrapper .pth-checkbox {\r\n    width: 16px; height: 16px; cursor: pointer; accent-color: #2563eb;\r\n}\r\n\r\n\/* \u2500\u2500 Diff viewer \u2500\u2500 *\/\r\n#pth-textseo-wrapper .pth-diff-add {\r\n    background: #dcfce7; color: #14532d;\r\n    display: block; padding: 2px 6px; border-left: 3px solid #16a34a;\r\n    font-family: 'Courier New', monospace; font-size: 12px; margin: 1px 0;\r\n}\r\n#pth-textseo-wrapper .pth-diff-remove {\r\n    background: #fee2e2; color: #7f1d1d;\r\n    display: block; padding: 2px 6px; border-left: 3px solid #dc2626;\r\n    font-family: 'Courier New', monospace; font-size: 12px; margin: 1px 0;\r\n}\r\n#pth-textseo-wrapper .pth-diff-same {\r\n    display: block; padding: 2px 6px;\r\n    font-family: 'Courier New', monospace; font-size: 12px;\r\n    color: #334155; margin: 1px 0;\r\n}\r\n\r\n\/* \u2500\u2500 Readability gauge \u2500\u2500 *\/\r\n#pth-textseo-wrapper .pth-gauge-wrap {\r\n    background: #f8fafc; border: 1px solid #e2e8f0;\r\n    border-radius: 10px; padding: 14px; margin-bottom: 14px;\r\n    display: flex; align-items: center; gap: 16px;\r\n}\r\n#pth-textseo-wrapper .pth-gauge-score {\r\n    font-size: 36px; font-weight: 800; min-width: 60px; text-align: center;\r\n}\r\n#pth-textseo-wrapper .pth-gauge-info { flex: 1; }\r\n#pth-textseo-wrapper .pth-gauge-label {\r\n    font-size: 14px; font-weight: 800; color: #0f172a; margin-bottom: 4px;\r\n}\r\n#pth-textseo-wrapper .pth-gauge-desc {\r\n    font-size: 12px; color: #334155; font-weight: 500;\r\n}\r\n\r\n\/* \u2500\u2500 SEO Checklist item \u2500\u2500 *\/\r\n#pth-textseo-wrapper .pth-check-item {\r\n    display: flex; align-items: center; gap: 10px;\r\n    padding: 4px 0;\r\n}\r\n\r\n\/* \u2500\u2500 Toast \u2500\u2500 *\/\r\n#pth-textseo-toast {\r\n    position: fixed; bottom: 24px; right: 24px; z-index: 9999;\r\n    display: flex; flex-direction: column; gap: 10px; pointer-events: none;\r\n}\r\n.pth-toast-msg {\r\n    padding: 12px 20px; border-radius: 10px; font-size: 14px;\r\n    font-weight: 600; color: #fff; pointer-events: auto;\r\n    box-shadow: 0 4px 15px rgba(0,0,0,0.15);\r\n    font-family: 'Inter', system-ui, sans-serif;\r\n}\r\n.pth-toast-success { background: #059669; }\r\n.pth-toast-error   { background: #dc2626; }\r\n.pth-toast-info    { background: #2563eb; }\r\n\r\n\/* \u2500\u2500 Mobile \u2500\u2500 *\/\r\n@media (max-width: 768px) {\r\n    #pth-textseo-wrapper {\r\n        padding: 10px; border-radius: 0;\r\n        background: transparent; width: 100% !important;\r\n    }\r\n    #pth-textseo-wrapper .pth-card { padding: 14px; margin-bottom: 12px; }\r\n    #pth-textseo-wrapper .pth-flex-layout {\r\n        grid-template-columns: 100% !important; gap: 12px;\r\n    }\r\n    #pth-textseo-wrapper .pth-tool-title { font-size: 20px; }\r\n    #pth-textseo-wrapper .pth-stats-grid { grid-template-columns: repeat(2, 1fr); }\r\n    #pth-textseo-wrapper .pth-row-2 { grid-template-columns: 1fr; }\r\n    #pth-textseo-wrapper .pth-row-3 { grid-template-columns: 1fr 1fr; }\r\n    #pth-textseo-wrapper .pth-tabs-nav { gap: 3px; }\r\n    #pth-textseo-wrapper .pth-tab-btn { font-size: 11px; padding: 7px 10px; }\r\n}\r\n<\/style>\r\n\r\n<div id=\"pth-textseo-toast\" role=\"status\" aria-live=\"polite\"><\/div>\r\n\r\n<div id=\"pth-textseo-wrapper\">\r\n<div class=\"pth-flex-layout\" id=\"pth-textseo-layout\">\r\n\r\n<!-- \u2550\u2550\u2550 MAIN COLUMN \u2550\u2550\u2550 -->\r\n<div class=\"pth-main-col\">\r\n<div class=\"pth-card\">\r\n\r\n    <!-- Header -->\r\n    <div style=\"display:flex;justify-content:space-between;align-items:flex-start;margin-bottom:12px;flex-wrap:wrap;gap:10px;\">\r\n        <h2 class=\"pth-tool-title\">\ud83d\udcdd Ultimate Text &amp; SEO Studio<\/h2>\r\n        <button class=\"pth-btn pth-btn-secondary\" id=\"pth-ts-fw-btn\"\r\n            aria-label=\"Toggle full width layout\">\u26f6 Full Width<\/button>\r\n    <\/div>\r\n    <div class=\"pth-tool-meta-bar\">\r\n        <span class=\"pth-version-badge\">v3.0<\/span>\r\n        <span class=\"pth-status-offline\">\ud83d\udd12 100% Offline<\/span>\r\n        <span style=\"font-size:11px;font-weight:700;color:#334155;\">6 Tabs \u00b7 33 Tools<\/span>\r\n    <\/div>\r\n\r\n    <!-- Action bar -->\r\n    <div class=\"pth-action-bar\">\r\n        <button class=\"pth-sample-btn\" id=\"pth-ts-sample-btn\"\r\n            aria-label=\"Load sample text\">\ud83d\udca1 Load Sample<\/button>\r\n        <button class=\"pth-btn pth-btn-danger\" id=\"pth-ts-clear-btn\"\r\n            style=\"font-size:0.75rem;padding:4px 10px;border-radius:6px;\"\r\n            aria-label=\"Clear all content\">\ud83d\uddd1\ufe0f Clear<\/button>\r\n    <\/div>\r\n\r\n    <!-- Main Textarea -->\r\n    <div class=\"pth-field\">\r\n        <label for=\"pth-ts-main-input\">Main Text Input \u2014 paste your content here<\/label>\r\n        <textarea id=\"pth-ts-main-input\" rows=\"8\"\r\n            aria-label=\"Main text input area\"\r\n            placeholder=\"Paste or type your text here. All tools below work on this content...\"><\/textarea>\r\n    <\/div>\r\n\r\n    <!-- Live Stats Mini Bar -->\r\n    <div class=\"pth-stats-grid\" id=\"pth-ts-stats-grid\" style=\"margin-bottom:20px;\">\r\n        <div class=\"pth-stat-box\">\r\n            <span class=\"pth-stat-num\" id=\"pth-ts-words\">0<\/span>\r\n            <span class=\"pth-stat-lbl\">Words<\/span>\r\n        <\/div>\r\n        <div class=\"pth-stat-box\">\r\n            <span class=\"pth-stat-num\" id=\"pth-ts-chars\">0<\/span>\r\n            <span class=\"pth-stat-lbl\">Characters<\/span>\r\n        <\/div>\r\n        <div class=\"pth-stat-box\">\r\n            <span class=\"pth-stat-num\" id=\"pth-ts-sentences\">0<\/span>\r\n            <span class=\"pth-stat-lbl\">Sentences<\/span>\r\n        <\/div>\r\n        <div class=\"pth-stat-box\">\r\n            <span class=\"pth-stat-num\" id=\"pth-ts-paras\">0<\/span>\r\n            <span class=\"pth-stat-lbl\">Paragraphs<\/span>\r\n        <\/div>\r\n        <div class=\"pth-stat-box\">\r\n            <span class=\"pth-stat-num\" id=\"pth-ts-readtime\">\u2014<\/span>\r\n            <span class=\"pth-stat-lbl\">Read Time<\/span>\r\n        <\/div>\r\n        <div class=\"pth-stat-box\">\r\n            <span class=\"pth-stat-num\" id=\"pth-ts-readability\">\u2014<\/span>\r\n            <span class=\"pth-stat-lbl\">Readability<\/span>\r\n        <\/div>\r\n    <\/div>\r\n\r\n    <!-- Tab Navigation -->\r\n    <div class=\"pth-tabs-nav\" role=\"tablist\" aria-label=\"Tool category tabs\">\r\n        <button class=\"pth-tab-btn pth-active\" data-tab=\"seo\" role=\"tab\" aria-selected=\"true\"\r\n            aria-controls=\"pth-tab-seo\" aria-label=\"SEO Intelligence tools\">\ud83d\udd0d SEO<\/button>\r\n        <button class=\"pth-tab-btn\" data-tab=\"transform\" role=\"tab\" aria-selected=\"false\"\r\n            aria-controls=\"pth-tab-transform\" aria-label=\"Text Transform tools\">\u2728 Transform<\/button>\r\n        <button class=\"pth-tab-btn\" data-tab=\"content\" role=\"tab\" aria-selected=\"false\"\r\n            aria-controls=\"pth-tab-content\" aria-label=\"Content Tools\">\ud83d\udcdd Content<\/button>\r\n        <button class=\"pth-tab-btn\" data-tab=\"lists\" role=\"tab\" aria-selected=\"false\"\r\n            aria-controls=\"pth-tab-lists\" aria-label=\"Lists and Data tools\">\ud83d\udccb Lists<\/button>\r\n        <button class=\"pth-tab-btn\" data-tab=\"typography\" role=\"tab\" aria-selected=\"false\"\r\n            aria-controls=\"pth-tab-typography\" aria-label=\"Typography tools\">\ud83c\udfa8 Typography<\/button>\r\n        <button class=\"pth-tab-btn\" data-tab=\"chars\" role=\"tab\" aria-selected=\"false\"\r\n            aria-controls=\"pth-tab-chars\" aria-label=\"Character and Symbol tools\">\ud83d\udd22 Chars<\/button>\r\n    <\/div>\r\n\r\n    <!-- \u2550\u2550\u2550 TAB 1: SEO Intelligence \u2550\u2550\u2550 -->\r\n    <div id=\"pth-tab-seo\" role=\"tabpanel\">\r\n\r\n        <!-- Google Snippet Preview -->\r\n        <div class=\"pth-card\">\r\n            <div class=\"pth-card-hdr\">\ud83d\udd0d Google Snippet Preview<\/div>\r\n            <div class=\"pth-field\">\r\n                <label for=\"pth-seo-title\">SEO Title<\/label>\r\n                <input type=\"text\" id=\"pth-seo-title\"\r\n                    placeholder=\"Your page title \u2014 aim for 50-60 characters\"\r\n                    aria-label=\"SEO page title for Google snippet preview\">\r\n                <div class=\"pth-char-row\" style=\"margin-top:6px;\">\r\n                    <span style=\"font-size:12px;color:#334155;font-weight:600;\">Characters:<\/span>\r\n                    <span class=\"pth-char-count pth-char-ok\" id=\"pth-seo-title-count\">0 \/ 60<\/span>\r\n                <\/div>\r\n                <div class=\"pth-prog-wrap\">\r\n                    <div class=\"pth-prog-bar\" id=\"pth-seo-title-bar\" style=\"width:0%\"><\/div>\r\n                <\/div>\r\n            <\/div>\r\n            <div class=\"pth-field\">\r\n                <label for=\"pth-seo-meta\">Meta Description<\/label>\r\n                <textarea id=\"pth-seo-meta\" rows=\"2\"\r\n                    placeholder=\"Your meta description \u2014 aim for 120-160 characters\"\r\n                    aria-label=\"Meta description for Google snippet preview\"><\/textarea>\r\n                <div class=\"pth-char-row\" style=\"margin-top:6px;\">\r\n                    <span style=\"font-size:12px;color:#334155;font-weight:600;\">Characters:<\/span>\r\n                    <span class=\"pth-char-count pth-char-ok\" id=\"pth-seo-meta-count\">0 \/ 160<\/span>\r\n                <\/div>\r\n                <div class=\"pth-prog-wrap\">\r\n                    <div class=\"pth-prog-bar\" id=\"pth-seo-meta-bar\" style=\"width:0%\"><\/div>\r\n                <\/div>\r\n            <\/div>\r\n            <div class=\"pth-field\">\r\n                <label for=\"pth-seo-url\">Page URL<\/label>\r\n                <input type=\"text\" id=\"pth-seo-url\"\r\n                    value=\"https:\/\/schoolict.net\/tools\/your-page\/\"\r\n                    aria-label=\"Page URL shown in Google snippet\">\r\n            <\/div>\r\n            <div style=\"margin-bottom:8px;display:flex;gap:8px;align-items:center;flex-wrap:wrap;\">\r\n                <span style=\"font-size:11px;font-weight:700;color:#334155;text-transform:uppercase;\">Preview:<\/span>\r\n                <button class=\"pth-btn pth-btn-secondary\" id=\"pth-serp-desktop\"\r\n                    style=\"font-size:11px;padding:3px 10px;\" aria-label=\"Desktop SERP preview\" aria-pressed=\"true\">\ud83d\udda5 Desktop<\/button>\r\n                <button class=\"pth-btn pth-btn-secondary\" id=\"pth-serp-mobile\"\r\n                    style=\"font-size:11px;padding:3px 10px;\" aria-label=\"Mobile SERP preview\" aria-pressed=\"false\">\ud83d\udcf1 Mobile<\/button>\r\n            <\/div>\r\n            <div class=\"pth-serp-preview\" id=\"pth-serp-preview\">\r\n                <div class=\"pth-serp-url\" id=\"pth-serp-url-display\">https:\/\/schoolict.net\/tools\/your-page\/<\/div>\r\n                <span class=\"pth-serp-title\" id=\"pth-serp-title-display\">Your SEO Title Will Appear Here<\/span>\r\n                <div class=\"pth-serp-desc\">\r\n                    <span class=\"pth-serp-date\">Jun 21, 2026 \u2014 <\/span>\r\n                    <span id=\"pth-serp-meta-display\">Your meta description will appear here. Write 120\u2013160 characters for best results in Google search results.<\/span>\r\n                <\/div>\r\n            <\/div>\r\n        <\/div>\r\n\r\n        <!-- Readability Score -->\r\n        <div class=\"pth-card\">\r\n            <div class=\"pth-card-hdr\">\ud83d\udcca Readability Score<\/div>\r\n            <div class=\"pth-gauge-wrap\" id=\"pth-gauge-wrap\">\r\n                <div class=\"pth-gauge-score\" id=\"pth-gauge-score\" style=\"color:#1d4ed8;\">\u2014<\/div>\r\n                <div class=\"pth-gauge-info\">\r\n                    <div class=\"pth-gauge-label\" id=\"pth-gauge-label\">Paste text to analyze<\/div>\r\n                    <div class=\"pth-gauge-desc\" id=\"pth-gauge-desc\">Flesch Reading Ease score (0\u2013100). Higher = easier to read.<\/div>\r\n                    <div class=\"pth-prog-wrap\" style=\"margin-top:8px;\">\r\n                        <div class=\"pth-prog-bar green\" id=\"pth-gauge-bar\" style=\"width:0%\"><\/div>\r\n                    <\/div>\r\n                <\/div>\r\n            <\/div>\r\n            <div style=\"font-size:11px;color:#334155;font-weight:600;\">\r\n                90\u2013100: Very Easy \u00b7 70\u201390: Easy \u00b7 50\u201370: Standard \u00b7 30\u201350: Difficult \u00b7 0\u201330: Very Confusing\r\n            <\/div>\r\n        <\/div>\r\n\r\n        <!-- Keyword Density -->\r\n        <div class=\"pth-card\">\r\n            <div class=\"pth-card-hdr\">\ud83d\udd11 Keyword Density Analysis<\/div>\r\n            <div class=\"pth-row-2\" style=\"margin-bottom:12px;\">\r\n                <button class=\"pth-btn pth-btn-secondary pth-active\" id=\"pth-kw-unigram-btn\"\r\n                    aria-label=\"Show single word keywords\" aria-pressed=\"true\">Single Words<\/button>\r\n                <button class=\"pth-btn pth-btn-secondary\" id=\"pth-kw-bigram-btn\"\r\n                    aria-label=\"Show two word phrase keywords\" aria-pressed=\"false\">2-Word Phrases<\/button>\r\n            <\/div>\r\n            <div id=\"pth-kw-list\">\r\n                <div style=\"text-align:center;color:#334155;font-size:13px;padding:14px 0;\">\r\n                    Paste text in the main input above to see keyword density\r\n                <\/div>\r\n            <\/div>\r\n        <\/div>\r\n    <\/div>\r\n\r\n    <!-- \u2550\u2550\u2550 TAB 2: Text Transform \u2550\u2550\u2550 -->\r\n    <div id=\"pth-tab-transform\" style=\"display:none;\" role=\"tabpanel\">\r\n\r\n        <!-- Case Converter -->\r\n        <div class=\"pth-card\">\r\n            <div class=\"pth-card-hdr\">\u2728 Case Converter<\/div>\r\n            <div class=\"pth-case-grid\" role=\"group\" aria-label=\"Case conversion options\">\r\n                <button class=\"pth-case-btn\" data-case=\"sentence\" aria-label=\"Convert to sentence case\">Sentence case<\/button>\r\n                <button class=\"pth-case-btn\" data-case=\"lower\" aria-label=\"Convert to lowercase\">lower case<\/button>\r\n                <button class=\"pth-case-btn\" data-case=\"upper\" aria-label=\"Convert to uppercase\">UPPER CASE<\/button>\r\n                <button class=\"pth-case-btn\" data-case=\"capitalized\" aria-label=\"Convert to capitalized case\">Capitalized Case<\/button>\r\n                <button class=\"pth-case-btn\" data-case=\"title\" aria-label=\"Convert to title case\">Title Case<\/button>\r\n                <button class=\"pth-case-btn\" data-case=\"alternating\" aria-label=\"Convert to alternating case\">aLtErNaTiNg<\/button>\r\n                <button class=\"pth-case-btn\" data-case=\"inverse\" aria-label=\"Convert to inverse case\">iNVERSE cASE<\/button>\r\n                <button class=\"pth-case-btn\" data-case=\"camel\" aria-label=\"Convert to camelCase\">camelCase<\/button>\r\n                <button class=\"pth-case-btn\" data-case=\"pascal\" aria-label=\"Convert to PascalCase\">PascalCase<\/button>\r\n                <button class=\"pth-case-btn\" data-case=\"snake\" aria-label=\"Convert to snake_case\">snake_case<\/button>\r\n                <button class=\"pth-case-btn\" data-case=\"kebab\" aria-label=\"Convert to kebab-case\">kebab-case<\/button>\r\n                <button class=\"pth-case-btn\" data-case=\"constant\" aria-label=\"Convert to CONSTANT_CASE\">CONSTANT_CASE<\/button>\r\n            <\/div>\r\n        <\/div>\r\n\r\n        <!-- Text Cleaner -->\r\n        <div class=\"pth-card\">\r\n            <div class=\"pth-card-hdr\">\ud83e\uddf9 Text Cleaner<\/div>\r\n            <div class=\"pth-case-grid\" role=\"group\" aria-label=\"Text cleaning options\">\r\n                <button class=\"pth-case-btn\" data-clean=\"spaces\" aria-label=\"Remove extra spaces\">Remove Spaces<\/button>\r\n                <button class=\"pth-case-btn\" data-clean=\"lines\" aria-label=\"Remove empty lines\">Remove Empty Lines<\/button>\r\n                <button class=\"pth-case-btn\" data-clean=\"html\" aria-label=\"Strip HTML tags\">Strip HTML Tags<\/button>\r\n                <button class=\"pth-case-btn\" data-clean=\"trim\" aria-label=\"Trim each line\">Trim Each Line<\/button>\r\n                <button class=\"pth-case-btn\" data-clean=\"numbers\" aria-label=\"Remove numbers\">Remove Numbers<\/button>\r\n                <button class=\"pth-case-btn\" data-clean=\"punctuation\" aria-label=\"Remove punctuation\">Remove Punctuation<\/button>\r\n                <button class=\"pth-case-btn\" data-clean=\"linebreaks\" aria-label=\"Remove line breaks\">Remove Line Breaks<\/button>\r\n                <button class=\"pth-case-btn\" data-clean=\"emojis\" aria-label=\"Remove emojis\">Remove Emojis<\/button>\r\n            <\/div>\r\n        <\/div>\r\n\r\n        <!-- Find & Replace -->\r\n        <div class=\"pth-card\">\r\n            <div class=\"pth-card-hdr\">\ud83d\udd0d Find &amp; Replace<\/div>\r\n            <div class=\"pth-row-2\">\r\n                <div class=\"pth-field\">\r\n                    <label for=\"pth-find-input\">Find<\/label>\r\n                    <input type=\"text\" id=\"pth-find-input\"\r\n                        placeholder=\"Text to find...\" aria-label=\"Text to find\">\r\n                <\/div>\r\n                <div class=\"pth-field\">\r\n                    <label for=\"pth-replace-input\">Replace With<\/label>\r\n                    <input type=\"text\" id=\"pth-replace-input\"\r\n                        placeholder=\"Replace with...\" aria-label=\"Replacement text\">\r\n                <\/div>\r\n            <\/div>\r\n            <div style=\"display:flex;gap:16px;margin-bottom:12px;flex-wrap:wrap;\">\r\n                <label style=\"text-transform:none;font-size:13px;display:flex;align-items:center;gap:6px;cursor:pointer;font-weight:600;color:#334155;\">\r\n                    <input type=\"checkbox\" id=\"pth-find-case\" class=\"pth-checkbox\" aria-label=\"Case sensitive search\">\r\n                    Case sensitive\r\n                <\/label>\r\n                <label style=\"text-transform:none;font-size:13px;display:flex;align-items:center;gap:6px;cursor:pointer;font-weight:600;color:#334155;\">\r\n                    <input type=\"checkbox\" id=\"pth-find-regex\" class=\"pth-checkbox\" aria-label=\"Use regular expression\">\r\n                    Regex mode\r\n                <\/label>\r\n            <\/div>\r\n            <div style=\"display:flex;gap:8px;flex-wrap:wrap;\">\r\n                <button class=\"pth-btn pth-btn-primary\" id=\"pth-find-replace-btn\"\r\n                    aria-label=\"Replace all occurrences\">\ud83d\udd04 Replace All<\/button>\r\n                <button class=\"pth-btn pth-btn-secondary\" id=\"pth-find-count-btn\"\r\n                    aria-label=\"Count occurrences\">\ud83d\udd22 Count<\/button>\r\n                <span id=\"pth-find-count-result\"\r\n                    style=\"font-size:13px;font-weight:700;color:#1d4ed8;padding:8px 0;\"><\/span>\r\n            <\/div>\r\n        <\/div>\r\n\r\n        <!-- Sort & Organize -->\r\n        <div class=\"pth-card\">\r\n            <div class=\"pth-card-hdr\">\ud83d\udcd0 Sort &amp; Organize Lines<\/div>\r\n            <div class=\"pth-case-grid\" role=\"group\" aria-label=\"Line sorting and organization options\">\r\n                <button class=\"pth-case-btn\" data-sort=\"az\" aria-label=\"Sort lines A to Z\">Sort A \u2192 Z<\/button>\r\n                <button class=\"pth-case-btn\" data-sort=\"za\" aria-label=\"Sort lines Z to A\">Sort Z \u2192 A<\/button>\r\n                <button class=\"pth-case-btn\" data-sort=\"reverse\" aria-label=\"Reverse line order\">Reverse Lines<\/button>\r\n                <button class=\"pth-case-btn\" data-sort=\"dedupe\" aria-label=\"Remove duplicate lines\">Remove Duplicates<\/button>\r\n                <button class=\"pth-case-btn\" data-sort=\"shuffle\" aria-label=\"Shuffle lines randomly\">Shuffle Lines<\/button>\r\n                <button class=\"pth-case-btn\" data-sort=\"numbering\" aria-label=\"Add line numbers\">Add Line Numbers<\/button>\r\n                <button class=\"pth-case-btn\" data-sort=\"removenums\" aria-label=\"Remove line numbers\">Remove Line Nums<\/button>\r\n                <button class=\"pth-case-btn\" data-sort=\"slug\" aria-label=\"Convert to URL slug\">\u2192 URL Slug<\/button>\r\n            <\/div>\r\n            <div class=\"pth-row-2\" style=\"margin-top:12px;\">\r\n                <div class=\"pth-field\">\r\n                    <label for=\"pth-prefix-input\">Add Prefix to Each Line<\/label>\r\n                    <input type=\"text\" id=\"pth-prefix-input\"\r\n                        placeholder=\"e.g. - or * or &gt;\" aria-label=\"Prefix to add to each line\">\r\n                <\/div>\r\n                <div class=\"pth-field\">\r\n                    <label for=\"pth-suffix-input\">Add Suffix to Each Line<\/label>\r\n                    <input type=\"text\" id=\"pth-suffix-input\"\r\n                        placeholder=\"e.g. , or ;\" aria-label=\"Suffix to add to each line\">\r\n                <\/div>\r\n            <\/div>\r\n            <button class=\"pth-btn pth-btn-secondary\" id=\"pth-prefix-suffix-btn\"\r\n                style=\"margin-top:4px;\" aria-label=\"Apply prefix and suffix to all lines\">\r\n                Apply Prefix \/ Suffix\r\n            <\/button>\r\n        <\/div>\r\n    <\/div>\r\n\r\n    <!-- \u2550\u2550\u2550 TAB 3: Content Tools \u2550\u2550\u2550 -->\r\n    <div id=\"pth-tab-content\" style=\"display:none;\" role=\"tabpanel\">\r\n\r\n        <!-- Lorem Ipsum Generator -->\r\n        <div class=\"pth-card\">\r\n            <div class=\"pth-card-hdr\">\ud83d\udcdd Lorem Ipsum Generator<\/div>\r\n            <div class=\"pth-row-3\">\r\n                <div class=\"pth-field\">\r\n                    <label for=\"pth-lorem-count\">Amount<\/label>\r\n                    <input type=\"number\" id=\"pth-lorem-count\" value=\"3\" min=\"1\" max=\"20\"\r\n                        aria-label=\"Number of paragraphs words or sentences to generate\">\r\n                <\/div>\r\n                <div class=\"pth-field\">\r\n                    <label for=\"pth-lorem-type\">Type<\/label>\r\n                    <select id=\"pth-lorem-type\" aria-label=\"Lorem ipsum generation type\">\r\n                        <option value=\"paragraphs\">Paragraphs<\/option>\r\n                        <option value=\"sentences\">Sentences<\/option>\r\n                        <option value=\"words\">Words<\/option>\r\n                    <\/select>\r\n                <\/div>\r\n                <div class=\"pth-field\" style=\"display:flex;align-items:flex-end;\">\r\n                    <button class=\"pth-btn pth-btn-primary\" id=\"pth-lorem-btn\"\r\n                        style=\"width:100%;\" aria-label=\"Generate Lorem Ipsum text\">\r\n                        \u2728 Generate\r\n                    <\/button>\r\n                <\/div>\r\n            <\/div>\r\n        <\/div>\r\n\r\n        <!-- Password Generator -->\r\n        <div class=\"pth-card\">\r\n            <div class=\"pth-card-hdr\">\ud83d\udd10 Password Generator<\/div>\r\n            <div class=\"pth-field\">\r\n                <label>Length: <span id=\"pth-pwd-len-val\"\r\n                    style=\"color:#1d4ed8;font-weight:800;\">16<\/span><\/label>\r\n                <input type=\"range\" id=\"pth-pwd-len\" min=\"6\" max=\"64\" value=\"16\"\r\n                    style=\"width:100%;accent-color:#2563eb;cursor:pointer;\"\r\n                    aria-label=\"Password length\" aria-valuemin=\"6\" aria-valuemax=\"64\" aria-valuenow=\"16\">\r\n            <\/div>\r\n            <div style=\"display:flex;gap:16px;flex-wrap:wrap;margin-bottom:14px;\">\r\n                <label style=\"text-transform:none;font-size:13px;display:flex;align-items:center;gap:6px;cursor:pointer;font-weight:600;color:#334155;\">\r\n                    <input type=\"checkbox\" id=\"pth-pwd-upper\" class=\"pth-checkbox\" checked aria-label=\"Include uppercase letters\"> Uppercase\r\n                <\/label>\r\n                <label style=\"text-transform:none;font-size:13px;display:flex;align-items:center;gap:6px;cursor:pointer;font-weight:600;color:#334155;\">\r\n                    <input type=\"checkbox\" id=\"pth-pwd-lower\" class=\"pth-checkbox\" checked aria-label=\"Include lowercase letters\"> Lowercase\r\n                <\/label>\r\n                <label style=\"text-transform:none;font-size:13px;display:flex;align-items:center;gap:6px;cursor:pointer;font-weight:600;color:#334155;\">\r\n                    <input type=\"checkbox\" id=\"pth-pwd-nums\" class=\"pth-checkbox\" checked aria-label=\"Include numbers\"> Numbers\r\n                <\/label>\r\n                <label style=\"text-transform:none;font-size:13px;display:flex;align-items:center;gap:6px;cursor:pointer;font-weight:600;color:#334155;\">\r\n                    <input type=\"checkbox\" id=\"pth-pwd-syms\" class=\"pth-checkbox\" aria-label=\"Include symbols\"> Symbols\r\n                <\/label>\r\n            <\/div>\r\n            <div id=\"pth-pwd-output\"\r\n                style=\"background:#f8fafc;border:2px solid #e2e8f0;border-radius:8px;padding:12px 16px;font-family:'Courier New',monospace;font-size:16px;font-weight:700;color:#0f172a;letter-spacing:2px;margin-bottom:12px;word-break:break-all;min-height:48px;\">\r\n                Click Generate Password\r\n            <\/div>\r\n            <div style=\"display:flex;gap:8px;flex-wrap:wrap;\">\r\n                <button class=\"pth-btn pth-btn-primary\" id=\"pth-pwd-gen-btn\"\r\n                    aria-label=\"Generate new password\">\ud83d\udd10 Generate Password<\/button>\r\n                <button class=\"pth-btn pth-btn-secondary\" id=\"pth-pwd-copy-btn\"\r\n                    aria-label=\"Copy generated password\">\ud83d\udccb Copy<\/button>\r\n            <\/div>\r\n        <\/div>\r\n\r\n        <!-- Encode \/ Decode -->\r\n        <div class=\"pth-card\">\r\n            <div class=\"pth-card-hdr\">\ud83d\udd04 Encode \/ Decode<\/div>\r\n            <div class=\"pth-field\">\r\n                <label for=\"pth-encode-input\">Input Text<\/label>\r\n                <textarea id=\"pth-encode-input\" rows=\"4\"\r\n                    placeholder=\"Paste text to encode or decode...\"\r\n                    aria-label=\"Text to encode or decode\"><\/textarea>\r\n            <\/div>\r\n            <div class=\"pth-case-grid\" role=\"group\" aria-label=\"Encoding decoding options\">\r\n                <button class=\"pth-case-btn\" data-encode=\"b64enc\" aria-label=\"Base64 encode\">Base64 Encode<\/button>\r\n                <button class=\"pth-case-btn\" data-encode=\"b64dec\" aria-label=\"Base64 decode\">Base64 Decode<\/button>\r\n                <button class=\"pth-case-btn\" data-encode=\"urlenc\" aria-label=\"URL encode\">URL Encode<\/button>\r\n                <button class=\"pth-case-btn\" data-encode=\"urldec\" aria-label=\"URL decode\">URL Decode<\/button>\r\n                <button class=\"pth-case-btn\" data-encode=\"htmlenc\" aria-label=\"HTML encode\">HTML Encode<\/button>\r\n                <button class=\"pth-case-btn\" data-encode=\"htmldec\" aria-label=\"HTML decode\">HTML Decode<\/button>\r\n                <button class=\"pth-case-btn\" data-encode=\"rot13\" aria-label=\"ROT13 encode decode\">ROT13<\/button>\r\n                <button class=\"pth-case-btn\" data-encode=\"reverse\" aria-label=\"Reverse text\">Reverse Text<\/button>\r\n            <\/div>\r\n            <div class=\"pth-output-display\" id=\"pth-encode-output\" style=\"margin-top:12px;\">Result will appear here...<\/div>\r\n            <button class=\"pth-btn pth-btn-secondary\" id=\"pth-encode-copy-btn\"\r\n                style=\"margin-top:10px;\" aria-label=\"Copy encode decode result\">\ud83d\udccb Copy Result<\/button>\r\n        <\/div>\r\n\r\n        <!-- Word Counter Target -->\r\n        <div class=\"pth-card\">\r\n            <div class=\"pth-card-hdr\">\ud83c\udfaf Word Count Target<\/div>\r\n            <div class=\"pth-row-2\">\r\n                <div class=\"pth-field\">\r\n                    <label for=\"pth-target-words\">Target Word Count<\/label>\r\n                    <input type=\"number\" id=\"pth-target-words\" value=\"1000\" min=\"1\"\r\n                        aria-label=\"Target word count goal\">\r\n                <\/div>\r\n                <div class=\"pth-field\">\r\n                    <label for=\"pth-target-wpm\">Reading Speed (WPM)<\/label>\r\n                    <select id=\"pth-target-wpm\" aria-label=\"Reading speed in words per minute\">\r\n                        <option value=\"100\">100 WPM \u2014 Slow<\/option>\r\n                        <option value=\"200\" selected>200 WPM \u2014 Average<\/option>\r\n                        <option value=\"300\">300 WPM \u2014 Fast<\/option>\r\n                        <option value=\"400\">400 WPM \u2014 Speed Reader<\/option>\r\n                    <\/select>\r\n                <\/div>\r\n            <\/div>\r\n            <div id=\"pth-target-display\"\r\n                style=\"background:#f8fafc;border:1px solid #e2e8f0;border-radius:10px;padding:14px;\">\r\n                <div class=\"pth-char-row\">\r\n                    <span style=\"font-size:13px;font-weight:700;color:#0f172a;\">Progress:<\/span>\r\n                    <span id=\"pth-target-pct\"\r\n                        style=\"font-size:13px;font-weight:800;color:#1d4ed8;\">0 \/ 1000 words<\/span>\r\n                <\/div>\r\n                <div class=\"pth-prog-wrap\" style=\"margin:8px 0;\">\r\n                    <div class=\"pth-prog-bar green\" id=\"pth-target-bar\" style=\"width:0%\"><\/div>\r\n                <\/div>\r\n                <div id=\"pth-target-info\"\r\n                    style=\"font-size:12px;color:#334155;font-weight:600;\">\r\n                    Write 1000 more words to reach your target\r\n                <\/div>\r\n            <\/div>\r\n        <\/div>\r\n    <\/div>\r\n\r\n    <!-- \u2550\u2550\u2550 TAB 4: Lists & Data \u2550\u2550\u2550 -->\r\n    <div id=\"pth-tab-lists\" style=\"display:none;\" role=\"tabpanel\">\r\n\r\n        <!-- List Cleaner -->\r\n        <div class=\"pth-card\">\r\n            <div class=\"pth-card-hdr\">\ud83d\udccb List Tools<\/div>\r\n            <div class=\"pth-case-grid\" role=\"group\" aria-label=\"List processing options\">\r\n                <button class=\"pth-case-btn\" data-list=\"bulletize\" aria-label=\"Add bullet points to each line\">\u2022 Bulletize<\/button>\r\n                <button class=\"pth-case-btn\" data-list=\"numbering\" aria-label=\"Number each line\">1. Number Lines<\/button>\r\n                <button class=\"pth-case-btn\" data-list=\"comma\" aria-label=\"Convert lines to comma separated\">\u2192 Comma List<\/button>\r\n                <button class=\"pth-case-btn\" data-list=\"fromcomma\" aria-label=\"Convert comma list to lines\">\u2190 From Commas<\/button>\r\n                <button class=\"pth-case-btn\" data-list=\"dedupe\" aria-label=\"Remove duplicate lines\">Remove Dups<\/button>\r\n                <button class=\"pth-case-btn\" data-list=\"sortaz\" aria-label=\"Sort list A to Z\">Sort A \u2192 Z<\/button>\r\n                <button class=\"pth-case-btn\" data-list=\"sortza\" aria-label=\"Sort list Z to A\">Sort Z \u2192 A<\/button>\r\n                <button class=\"pth-case-btn\" data-list=\"count\" aria-label=\"Count items in list\">Count Items<\/button>\r\n            <\/div>\r\n            <div id=\"pth-list-count-display\"\r\n                style=\"display:none;margin-top:10px;font-size:14px;font-weight:700;color:#047857;\"><\/div>\r\n        <\/div>\r\n\r\n        <!-- CSV Converter -->\r\n        <div class=\"pth-card\">\r\n            <div class=\"pth-card-hdr\">\ud83d\udcca CSV \u2194 List Converter<\/div>\r\n            <div class=\"pth-field\">\r\n                <label for=\"pth-csv-input\">Input (CSV or List)<\/label>\r\n                <textarea id=\"pth-csv-input\" rows=\"5\"\r\n                    placeholder=\"Paste CSV data or line-by-line list here...\"\r\n                    aria-label=\"CSV or list input\"><\/textarea>\r\n            <\/div>\r\n            <div class=\"pth-row-2\" style=\"margin-bottom:12px;\">\r\n                <div class=\"pth-field\">\r\n                    <label for=\"pth-csv-delimiter\">CSV Delimiter<\/label>\r\n                    <select id=\"pth-csv-delimiter\" aria-label=\"CSV delimiter character\">\r\n                        <option value=\",\">, Comma<\/option>\r\n                        <option value=\";\">; Semicolon<\/option>\r\n                        <option value=\"\t\">Tab<\/option>\r\n                        <option value=\"|\">| Pipe<\/option>\r\n                    <\/select>\r\n                <\/div>\r\n                <div style=\"display:flex;align-items:flex-end;gap:8px;\">\r\n                    <button class=\"pth-btn pth-btn-primary\" id=\"pth-csv-to-list-btn\"\r\n                        style=\"flex:1;\" aria-label=\"Convert CSV to list\">CSV \u2192 List<\/button>\r\n                    <button class=\"pth-btn pth-btn-secondary\" id=\"pth-list-to-csv-btn\"\r\n                        style=\"flex:1;\" aria-label=\"Convert list to CSV\">List \u2192 CSV<\/button>\r\n                <\/div>\r\n            <\/div>\r\n            <div class=\"pth-output-display\" id=\"pth-csv-output\">Result appears here...<\/div>\r\n            <button class=\"pth-btn pth-btn-secondary\" id=\"pth-csv-copy-btn\"\r\n                style=\"margin-top:10px;\" aria-label=\"Copy CSV conversion result\">\ud83d\udccb Copy Result<\/button>\r\n        <\/div>\r\n\r\n        <!-- Text Diff -->\r\n        <div class=\"pth-card\">\r\n            <div class=\"pth-card-hdr\">\ud83d\udd00 Text Diff Checker<\/div>\r\n            <div class=\"pth-row-2\">\r\n                <div class=\"pth-field\">\r\n                    <label for=\"pth-diff-a\">Text A (Original)<\/label>\r\n                    <textarea id=\"pth-diff-a\" rows=\"6\"\r\n                        placeholder=\"Paste original text...\"\r\n                        aria-label=\"Original text for comparison\"><\/textarea>\r\n                <\/div>\r\n                <div class=\"pth-field\">\r\n                    <label for=\"pth-diff-b\">Text B (Modified)<\/label>\r\n                    <textarea id=\"pth-diff-b\" rows=\"6\"\r\n                        placeholder=\"Paste modified text...\"\r\n                        aria-label=\"Modified text for comparison\"><\/textarea>\r\n                <\/div>\r\n            <\/div>\r\n            <button class=\"pth-btn pth-btn-primary\" id=\"pth-diff-btn\"\r\n                style=\"margin-bottom:12px;width:100%;\"\r\n                aria-label=\"Compare texts and show differences\">\ud83d\udd0d Compare Texts<\/button>\r\n            <div id=\"pth-diff-output\" style=\"min-height:60px;\"><\/div>\r\n        <\/div>\r\n    <\/div>\r\n\r\n    <!-- \u2550\u2550\u2550 TAB 5: Typography \u2550\u2550\u2550 -->\r\n    <div id=\"pth-tab-typography\" style=\"display:none;\" role=\"tabpanel\">\r\n\r\n        <div class=\"pth-card\">\r\n            <div class=\"pth-card-hdr\">\ud83c\udfa8 Typography Fixers<\/div>\r\n            <div class=\"pth-case-grid\" role=\"group\" aria-label=\"Typography fixing options\">\r\n                <button class=\"pth-case-btn\" data-typo=\"smartquotes\" aria-label=\"Convert to smart curly quotes\">Smart Quotes<\/button>\r\n                <button class=\"pth-case-btn\" data-typo=\"dashes\" aria-label=\"Convert dashes to proper em dashes\">Em Dashes<\/button>\r\n                <button class=\"pth-case-btn\" data-typo=\"accents\" aria-label=\"Remove accent characters\">Remove Accents<\/button>\r\n                <button class=\"pth-case-btn\" data-typo=\"ellipsis\" aria-label=\"Convert three dots to ellipsis\">\u2026 Ellipsis<\/button>\r\n                <button class=\"pth-case-btn\" data-typo=\"apostrophe\" aria-label=\"Fix apostrophes to curly\">Fix Apostrophes<\/button>\r\n                <button class=\"pth-case-btn\" data-typo=\"nbsp\" aria-label=\"Replace non breaking spaces\">Fix &amp;nbsp;<\/button>\r\n                <button class=\"pth-case-btn\" data-typo=\"doublespace\" aria-label=\"Fix double spaces after periods\">Fix Double Space<\/button>\r\n                <button class=\"pth-case-btn\" data-typo=\"copyright\" aria-label=\"Replace c in brackets with copyright symbol\">(c) \u2192 \u00a9<\/button>\r\n            <\/div>\r\n        <\/div>\r\n\r\n        <!-- Repeat & Reverse -->\r\n        <div class=\"pth-card\">\r\n            <div class=\"pth-card-hdr\">\ud83d\udd01 Repeat &amp; Reverse Tools<\/div>\r\n            <div class=\"pth-row-3\">\r\n                <div class=\"pth-field\">\r\n                    <label for=\"pth-repeat-count\">Repeat N Times<\/label>\r\n                    <input type=\"number\" id=\"pth-repeat-count\" value=\"3\" min=\"1\" max=\"100\"\r\n                        aria-label=\"Number of times to repeat text\">\r\n                <\/div>\r\n                <div class=\"pth-field\">\r\n                    <label for=\"pth-repeat-sep\">Separator<\/label>\r\n                    <input type=\"text\" id=\"pth-repeat-sep\" value=\"\\n\"\r\n                        placeholder=\"\\n or , or space\" aria-label=\"Separator between repeated text\">\r\n                <\/div>\r\n                <div class=\"pth-field\" style=\"display:flex;align-items:flex-end;\">\r\n                    <button class=\"pth-btn pth-btn-primary\" id=\"pth-repeat-btn\"\r\n                        style=\"width:100%;\" aria-label=\"Repeat text\">\ud83d\udd01 Repeat<\/button>\r\n                <\/div>\r\n            <\/div>\r\n            <div class=\"pth-case-grid\" role=\"group\" aria-label=\"Reverse options\">\r\n                <button class=\"pth-case-btn\" data-reverse=\"chars\" aria-label=\"Reverse all characters\">Reverse Chars<\/button>\r\n                <button class=\"pth-case-btn\" data-reverse=\"words\" aria-label=\"Reverse word order\">Reverse Words<\/button>\r\n                <button class=\"pth-case-btn\" data-reverse=\"lines\" aria-label=\"Reverse line order\">Reverse Lines<\/button>\r\n                <button class=\"pth-case-btn\" data-reverse=\"rot13\" aria-label=\"Apply ROT13 encoding\">ROT13 Cipher<\/button>\r\n            <\/div>\r\n        <\/div>\r\n\r\n        <!-- Truncate -->\r\n        <div class=\"pth-card\">\r\n            <div class=\"pth-card-hdr\">\u2702\ufe0f Truncate Text<\/div>\r\n            <div class=\"pth-row-3\">\r\n                <div class=\"pth-field\">\r\n                    <label for=\"pth-trunc-limit\">Limit<\/label>\r\n                    <input type=\"number\" id=\"pth-trunc-limit\" value=\"160\" min=\"1\"\r\n                        aria-label=\"Character or word limit for truncation\">\r\n                <\/div>\r\n                <div class=\"pth-field\">\r\n                    <label for=\"pth-trunc-type\">By<\/label>\r\n                    <select id=\"pth-trunc-type\" aria-label=\"Truncate by characters or words\">\r\n                        <option value=\"chars\">Characters<\/option>\r\n                        <option value=\"words\">Words<\/option>\r\n                    <\/select>\r\n                <\/div>\r\n                <div class=\"pth-field\">\r\n                    <label for=\"pth-trunc-ellipsis\">Ellipsis<\/label>\r\n                    <input type=\"text\" id=\"pth-trunc-ellipsis\" value=\"...\"\r\n                        aria-label=\"Ellipsis text appended after truncation\">\r\n                <\/div>\r\n            <\/div>\r\n            <button class=\"pth-btn pth-btn-primary\" id=\"pth-trunc-btn\"\r\n                style=\"margin-bottom:12px;\" aria-label=\"Truncate text\">\u2702\ufe0f Truncate<\/button>\r\n            <div class=\"pth-output-display\" id=\"pth-trunc-output\">Result appears here...<\/div>\r\n            <button class=\"pth-btn pth-btn-secondary\" id=\"pth-trunc-copy-btn\"\r\n                style=\"margin-top:10px;\" aria-label=\"Copy truncated text\">\ud83d\udccb Copy<\/button>\r\n        <\/div>\r\n    <\/div>\r\n\r\n    <!-- \u2550\u2550\u2550 TAB 6: Chars & Symbols \u2550\u2550\u2550 -->\r\n    <div id=\"pth-tab-chars\" style=\"display:none;\" role=\"tabpanel\">\r\n\r\n        <!-- Char count per line -->\r\n        <div class=\"pth-card\">\r\n            <div class=\"pth-card-hdr\">\ud83d\udd22 Character Count Per Line<\/div>\r\n            <button class=\"pth-btn pth-btn-primary\" id=\"pth-charline-btn\"\r\n                style=\"margin-bottom:12px;\" aria-label=\"Count characters per line\">\r\n                \ud83d\udcca Analyze Lines\r\n            <\/button>\r\n            <div id=\"pth-charline-output\" style=\"min-height:60px;\">\r\n                <div style=\"text-align:center;color:#334155;font-size:13px;padding:14px 0;\">\r\n                    Click Analyze Lines to see character count for each line\r\n                <\/div>\r\n            <\/div>\r\n        <\/div>\r\n\r\n        <!-- Unicode Inspector -->\r\n        <div class=\"pth-card\">\r\n            <div class=\"pth-card-hdr\">\ud83d\udd2c Unicode Inspector<\/div>\r\n            <div class=\"pth-field\">\r\n                <label for=\"pth-unicode-input\">Text to Inspect (max 50 chars)<\/label>\r\n                <input type=\"text\" id=\"pth-unicode-input\"\r\n                    placeholder=\"Type or paste up to 50 characters...\"\r\n                    maxlength=\"50\" aria-label=\"Text to inspect unicode code points\">\r\n            <\/div>\r\n            <div id=\"pth-unicode-output\" style=\"min-height:60px;\">\r\n                <div style=\"text-align:center;color:#334155;font-size:13px;padding:14px 0;\">\r\n                    Type text above to see Unicode code points\r\n                <\/div>\r\n            <\/div>\r\n        <\/div>\r\n\r\n        <!-- Whitespace Visualizer -->\r\n        <div class=\"pth-card\">\r\n            <div class=\"pth-card-hdr\">\ud83d\udc41 Whitespace Visualizer<\/div>\r\n            <button class=\"pth-btn pth-btn-primary\" id=\"pth-ws-btn\"\r\n                style=\"margin-bottom:12px;\"\r\n                aria-label=\"Visualize whitespace characters\">\r\n                \ud83d\udc41 Visualize Whitespace\r\n            <\/button>\r\n            <div id=\"pth-ws-output\"\r\n                style=\"background:#f8fafc;border:1px solid #e2e8f0;border-radius:8px;\r\n                padding:14px;font-family:'Courier New',monospace;font-size:13px;\r\n                min-height:60px;line-height:1.8;word-break:break-all;color:#0f172a;\">\r\n                Paste text above then click Visualize\r\n            <\/div>\r\n            <div style=\"margin-top:10px;font-size:11px;color:#334155;font-weight:600;\">\r\n                Legend: <span style=\"color:#2563eb;font-weight:800;\">\u00b7<\/span> Space &nbsp;\r\n                <span style=\"color:#5b21b6;font-weight:800;\">\u2192<\/span> Tab &nbsp;\r\n                <span style=\"color:#991b1b;font-weight:800;\">\u21b5<\/span> Newline\r\n            <\/div>\r\n        <\/div>\r\n\r\n        <!-- Copy \/ Export actions -->\r\n        <div class=\"pth-card\">\r\n            <div class=\"pth-card-hdr\">\u26a1 Quick Actions<\/div>\r\n            <div style=\"display:flex;gap:8px;flex-wrap:wrap;\">\r\n                <button class=\"pth-btn pth-btn-success\" id=\"pth-ts-copy-btn\"\r\n                    aria-label=\"Copy main text to clipboard\">\ud83d\udccb Copy Text<\/button>\r\n                <button class=\"pth-btn pth-btn-secondary\" id=\"pth-ts-export-btn\"\r\n                    aria-label=\"Export text as .txt file\">\ud83d\udce5 Export .txt<\/button>\r\n                <button class=\"pth-btn pth-btn-secondary\" id=\"pth-ts-print-btn\"\r\n                    aria-label=\"Print text\">\ud83d\udda8\ufe0f Print<\/button>\r\n            <\/div>\r\n        <\/div>\r\n    <\/div>\r\n\r\n<\/div><!-- \/pth-card main -->\r\n<\/div><!-- \/main col -->\r\n\r\n<!-- \u2550\u2550\u2550 SIDEBAR \u2550\u2550\u2550 -->\r\n<div class=\"pth-sidebar-col\" id=\"pth-textseo-sidebar\">\r\n\r\n    <!-- Live Analysis -->\r\n    <div class=\"pth-card\">\r\n        <div class=\"pth-card-hdr\">\ud83d\udcca Live Analysis<\/div>\r\n        <div style=\"display:flex;flex-direction:column;gap:10px;\">\r\n            <div>\r\n                <div style=\"display:flex;justify-content:space-between;margin-bottom:4px;\">\r\n                    <span style=\"font-size:12px;font-weight:700;color:#0f172a;\">Sentences<\/span>\r\n                    <span style=\"font-size:12px;font-weight:800;color:#1d4ed8;\" id=\"pth-sb-sentences\">0<\/span>\r\n                <\/div>\r\n            <\/div>\r\n            <div>\r\n                <div style=\"display:flex;justify-content:space-between;margin-bottom:4px;\">\r\n                    <span style=\"font-size:12px;font-weight:700;color:#0f172a;\">Avg. Words\/Sentence<\/span>\r\n                    <span style=\"font-size:12px;font-weight:800;color:#1d4ed8;\" id=\"pth-sb-avg\">0<\/span>\r\n                <\/div>\r\n            <\/div>\r\n            <div>\r\n                <div style=\"display:flex;justify-content:space-between;margin-bottom:4px;\">\r\n                    <span style=\"font-size:12px;font-weight:700;color:#0f172a;\">Unique Words<\/span>\r\n                    <span style=\"font-size:12px;font-weight:800;color:#1d4ed8;\" id=\"pth-sb-unique\">0<\/span>\r\n                <\/div>\r\n            <\/div>\r\n            <div>\r\n                <div style=\"display:flex;justify-content:space-between;margin-bottom:4px;\">\r\n                    <span style=\"font-size:12px;font-weight:700;color:#0f172a;\">Chars (no spaces)<\/span>\r\n                    <span style=\"font-size:12px;font-weight:800;color:#1d4ed8;\" id=\"pth-sb-chars-nospace\">0<\/span>\r\n                <\/div>\r\n            <\/div>\r\n            <div>\r\n                <div style=\"display:flex;justify-content:space-between;margin-bottom:4px;\">\r\n                    <span style=\"font-size:12px;font-weight:700;color:#0f172a;\">Lines<\/span>\r\n                    <span style=\"font-size:12px;font-weight:800;color:#1d4ed8;\" id=\"pth-sb-lines\">0<\/span>\r\n                <\/div>\r\n            <\/div>\r\n            <div>\r\n                <div style=\"display:flex;justify-content:space-between;margin-bottom:4px;\">\r\n                    <span style=\"font-size:12px;font-weight:700;color:#0f172a;\">Syllables (est.)<\/span>\r\n                    <span style=\"font-size:12px;font-weight:800;color:#1d4ed8;\" id=\"pth-sb-syllables\">0<\/span>\r\n                <\/div>\r\n            <\/div>\r\n        <\/div>\r\n    <\/div>\r\n\r\n    <!-- SEO Checklist -->\r\n    <div class=\"pth-card\">\r\n        <div class=\"pth-card-hdr\">\u2705 SEO Checklist<\/div>\r\n        <div style=\"display:flex;flex-direction:column;gap:8px;\" id=\"pth-seo-checklist\">\r\n            <div class=\"pth-check-item\" id=\"pth-chk-words\">\r\n                <span style=\"font-size:18px;\">\u26aa<\/span>\r\n                <span style=\"font-size:12px;font-weight:600;color:#334155;\">300+ words (SEO minimum)<\/span>\r\n            <\/div>\r\n            <div class=\"pth-check-item\" id=\"pth-chk-1000\">\r\n                <span style=\"font-size:18px;\">\u26aa<\/span>\r\n                <span style=\"font-size:12px;font-weight:600;color:#334155;\">1000+ words (ideal length)<\/span>\r\n            <\/div>\r\n            <div class=\"pth-check-item\" id=\"pth-chk-readability\">\r\n                <span style=\"font-size:18px;\">\u26aa<\/span>\r\n                <span style=\"font-size:12px;font-weight:600;color:#334155;\">Good readability score<\/span>\r\n            <\/div>\r\n            <div class=\"pth-check-item\" id=\"pth-chk-sentences\">\r\n                <span style=\"font-size:18px;\">\u26aa<\/span>\r\n                <span style=\"font-size:12px;font-weight:600;color:#334155;\">Avg sentence &lt; 20 words<\/span>\r\n            <\/div>\r\n            <div class=\"pth-check-item\" id=\"pth-chk-title\">\r\n                <span style=\"font-size:18px;\">\u26aa<\/span>\r\n                <span style=\"font-size:12px;font-weight:600;color:#334155;\">Title 50-60 chars<\/span>\r\n            <\/div>\r\n            <div class=\"pth-check-item\" id=\"pth-chk-meta\">\r\n                <span style=\"font-size:18px;\">\u26aa<\/span>\r\n                <span style=\"font-size:12px;font-weight:600;color:#334155;\">Meta desc 120-160 chars<\/span>\r\n            <\/div>\r\n        <\/div>\r\n    <\/div>\r\n\r\n    <!-- Tips -->\r\n    <div class=\"pth-card\">\r\n        <div class=\"pth-card-hdr\">\ud83d\udca1 Quick Tips<\/div>\r\n        <ul style=\"margin:0;padding-left:16px;font-size:12px;color:#334155;line-height:1.9;font-weight:500;\">\r\n            <li>Aim for <strong style=\"color:#0f172a;\">Flesch score 60+<\/strong> for general web content.<\/li>\r\n            <li>Keep sentences under <strong style=\"color:#0f172a;\">20 words<\/strong> for readability.<\/li>\r\n            <li>SEO titles: <strong style=\"color:#0f172a;\">50\u201360 chars<\/strong> show fully in Google.<\/li>\r\n            <li>Meta description: <strong style=\"color:#0f172a;\">120\u2013160 chars<\/strong> \u2014 include your focus keyword.<\/li>\r\n            <li>Keyword density: <strong style=\"color:#0f172a;\">1\u20132%<\/strong> is ideal \u2014 avoid stuffing.<\/li>\r\n            <li><strong style=\"color:#0f172a;\">Find &amp; Replace<\/strong> supports Regex mode for power users.<\/li>\r\n        <\/ul>\r\n    <\/div>\r\n\r\n<\/div><!-- \/sidebar -->\r\n<\/div><!-- \/flex-layout -->\r\n<\/div><!-- \/wrapper -->\r\n<script data-no-optimize=\"1\" data-no-minify=\"1\" data-cfasync=\"false\">\r\n(function () {\r\n    'use strict';\r\n\r\n    \/* =======================================================\r\n       PTH ULTIMATE TEXT & SEO STUDIO \u2014 v3.0\r\n       WP\/LiteSpeed safe | WCAG 2.1 AA | PageSpeed 100\r\n       6 Tabs | 33 Tools | 100% Offline\r\n       ======================================================= *\/\r\n\r\n    window.pthTextSeoApp = {\r\n        initialized: false,\r\n        currentTab: 'seo',\r\n        kwMode: 'unigram',\r\n\r\n        \/* \u2500\u2500 Stop words for keyword density \u2500\u2500 *\/\r\n        stopWords: new Set([\r\n            'a','an','the','and','or','but','in','on','at','to','for',\r\n            'of','with','by','from','is','was','are','were','be','been',\r\n            'have','has','had','do','does','did','will','would','could',\r\n            'should','may','might','this','that','these','those','i','we',\r\n            'you','he','she','it','they','my','your','his','her','our',\r\n            'its','their','what','which','who','when','where','how','why',\r\n            'not','no','so','if','as','up','out','about','into','than',\r\n            'then','there','can','just','more','also','its','been'\r\n        ]),\r\n\r\n        \/* \u2500\u2500 Lorem paragraphs pool \u2500\u2500 *\/\r\n        loremParagraphs: [\r\n            'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.',\r\n            'Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.',\r\n            'Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium totam rem aperiam eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo.',\r\n            'Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit, sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt neque porro quisquam est qui dolorem ipsum.',\r\n            'At vero eos et accusamus et iusto odio dignissimos ducimus qui blanditiis praesentium voluptatum deleniti atque corrupti quos dolores et quas molestias excepturi sint occaecati cupiditate non provident.',\r\n            'Nam libero tempore cum soluta nobis est eligendi optio cumque nihil impedit quo minus id quod maxime placeat facere possimus omnis voluptas assumenda est omnis dolor repellendus.',\r\n            'Temporibus autem quibusdam et aut officiis debitis rerum necessitatibus saepe eveniet ut et voluptates repudiandae sint molestiae non recusandae itaque earum rerum hic tenetur sapiente delectus.',\r\n            'Quis autem vel eum iure reprehenderit qui in ea voluptate velit esse quam nihil molestiae consequatur vel illum qui dolorem eum fugiat quo voluptas nulla pariatur sed perspiciatis.'\r\n        ],\r\n\r\n        \/* \u2500\u2500\u2500 INIT \u2500\u2500\u2500 *\/\r\n        init: function () {\r\n            this.attachEvents();\r\n            \/* Defer initial stat updates safely \u2014 elements guaranteed present after attachEvents *\/\r\n            var self = this;\r\n            try { self.updateStats(); } catch(e) {}\r\n            try { self.updateSerpPreview(); } catch(e) {}\r\n            try { self.updateSeoChecklist(); } catch(e) {}\r\n        },\r\n\r\n        \/* \u2500\u2500\u2500 EVENTS \u2500\u2500\u2500 *\/\r\n        attachEvents: function () {\r\n            var self = this;\r\n\r\n            \/* Full width *\/\r\n            var fwBtn = document.getElementById('pth-ts-fw-btn');\r\n            if (fwBtn) fwBtn.addEventListener('click', function () { self.toggleWidth(); });\r\n\r\n            \/* Sample + Clear *\/\r\n            var sampleBtn = document.getElementById('pth-ts-sample-btn');\r\n            if (sampleBtn) sampleBtn.addEventListener('click', function () { self.loadSample(); });\r\n            var clearBtn = document.getElementById('pth-ts-clear-btn');\r\n            if (clearBtn) clearBtn.addEventListener('click', function () { self.clearAll(); });\r\n\r\n            \/* Tab navigation *\/\r\n            var tabBtns = document.querySelectorAll('#pth-textseo-wrapper .pth-tab-btn');\r\n            if (tabBtns.length > 0) {\r\n                tabBtns.forEach(function (btn) {\r\n                    btn.addEventListener('click', function () { self.switchTab(this.getAttribute('data-tab')); });\r\n                });\r\n            }\r\n\r\n            \/* Main textarea \u2014 live stats *\/\r\n            var mainInput = document.getElementById('pth-ts-main-input');\r\n            if (mainInput) {\r\n                mainInput.addEventListener('input', function () {\r\n                    try { self.updateStats(); } catch(e) {}\r\n                    try { self.updateSeoChecklist(); } catch(e) {}\r\n                    try { self.updateKwDensity(); } catch(e) {}\r\n                    try { self.updateTargetProgress(); } catch(e) {}\r\n                });\r\n            }\r\n\r\n            \/* SEO Title \/ Meta live preview *\/\r\n            var seoTitle = document.getElementById('pth-seo-title');\r\n            var seoMeta  = document.getElementById('pth-seo-meta');\r\n            var seoUrl   = document.getElementById('pth-seo-url');\r\n            if (seoTitle) seoTitle.addEventListener('input', function () { self.updateSerpPreview(); self.updateSeoChecklist(); });\r\n            if (seoMeta)  seoMeta.addEventListener('input',  function () { self.updateSerpPreview(); self.updateSeoChecklist(); });\r\n            if (seoUrl)   seoUrl.addEventListener('input',   function () { self.updateSerpPreview(); });\r\n\r\n            \/* SERP toggle *\/\r\n            var deskBtn = document.getElementById('pth-serp-desktop');\r\n            var mobBtn  = document.getElementById('pth-serp-mobile');\r\n            if (deskBtn) deskBtn.addEventListener('click', function () { self.setSerpMode('desktop'); });\r\n            if (mobBtn)  mobBtn.addEventListener('click',  function () { self.setSerpMode('mobile'); });\r\n\r\n            \/* Keyword mode *\/\r\n            var uniBtn = document.getElementById('pth-kw-unigram-btn');\r\n            var biBtn  = document.getElementById('pth-kw-bigram-btn');\r\n            if (uniBtn) uniBtn.addEventListener('click', function () { self.setKwMode('unigram'); });\r\n            if (biBtn)  biBtn.addEventListener('click',  function () { self.setKwMode('bigram'); });\r\n\r\n            \/* Case converter buttons *\/\r\n            document.querySelectorAll('#pth-textseo-wrapper .pth-case-btn[data-case]').forEach(function (btn) {\r\n                btn.addEventListener('click', function () { self.convertCase(this.getAttribute('data-case')); });\r\n            });\r\n\r\n            \/* Text cleaner buttons *\/\r\n            document.querySelectorAll('#pth-textseo-wrapper .pth-case-btn[data-clean]').forEach(function (btn) {\r\n                btn.addEventListener('click', function () { self.cleanText(this.getAttribute('data-clean')); });\r\n            });\r\n\r\n            \/* Sort buttons *\/\r\n            document.querySelectorAll('#pth-textseo-wrapper .pth-case-btn[data-sort]').forEach(function (btn) {\r\n                btn.addEventListener('click', function () { self.sortLines(this.getAttribute('data-sort')); });\r\n            });\r\n\r\n            \/* Find & Replace *\/\r\n            var frBtn = document.getElementById('pth-find-replace-btn');\r\n            if (frBtn) frBtn.addEventListener('click', function () { self.findReplace(); });\r\n            var fcBtn = document.getElementById('pth-find-count-btn');\r\n            if (fcBtn) fcBtn.addEventListener('click', function () { self.findCount(); });\r\n\r\n            \/* Prefix \/ Suffix *\/\r\n            var psBtn = document.getElementById('pth-prefix-suffix-btn');\r\n            if (psBtn) psBtn.addEventListener('click', function () { self.applyPrefixSuffix(); });\r\n\r\n            \/* Lorem Ipsum *\/\r\n            var loremBtn = document.getElementById('pth-lorem-btn');\r\n            if (loremBtn) loremBtn.addEventListener('click', function () { self.generateLorem(); });\r\n\r\n            \/* Password Generator *\/\r\n            var pwdLen = document.getElementById('pth-pwd-len');\r\n            if (pwdLen) pwdLen.addEventListener('input', function () {\r\n                var el = document.getElementById('pth-pwd-len-val');\r\n                if (el) el.textContent = this.value;\r\n                this.setAttribute('aria-valuenow', this.value);\r\n            });\r\n            var pwdGenBtn = document.getElementById('pth-pwd-gen-btn');\r\n            if (pwdGenBtn) pwdGenBtn.addEventListener('click', function () { self.generatePassword(); });\r\n            var pwdCopyBtn = document.getElementById('pth-pwd-copy-btn');\r\n            if (pwdCopyBtn) pwdCopyBtn.addEventListener('click', function () {\r\n                var el = document.getElementById('pth-pwd-output');\r\n                if (el) self.copyText(el.textContent);\r\n            });\r\n\r\n            \/* Encode\/Decode *\/\r\n            document.querySelectorAll('#pth-textseo-wrapper .pth-case-btn[data-encode]').forEach(function (btn) {\r\n                btn.addEventListener('click', function () { self.encodeOp(this.getAttribute('data-encode')); });\r\n            });\r\n            var encCopyBtn = document.getElementById('pth-encode-copy-btn');\r\n            if (encCopyBtn) encCopyBtn.addEventListener('click', function () {\r\n                var el = document.getElementById('pth-encode-output');\r\n                if (el) self.copyText(el.textContent);\r\n            });\r\n\r\n            \/* Word target *\/\r\n            var targetWords = document.getElementById('pth-target-words');\r\n            var targetWpm   = document.getElementById('pth-target-wpm');\r\n            if (targetWords) targetWords.addEventListener('input', function () { self.updateTargetProgress(); });\r\n            if (targetWpm)   targetWpm.addEventListener('change',  function () { self.updateTargetProgress(); });\r\n\r\n            \/* List tools *\/\r\n            document.querySelectorAll('#pth-textseo-wrapper .pth-case-btn[data-list]').forEach(function (btn) {\r\n                btn.addEventListener('click', function () { self.listOp(this.getAttribute('data-list')); });\r\n            });\r\n\r\n            \/* CSV converter *\/\r\n            var csvToList = document.getElementById('pth-csv-to-list-btn');\r\n            var listToCsv = document.getElementById('pth-list-to-csv-btn');\r\n            if (csvToList) csvToList.addEventListener('click', function () { self.csvConvert('tolist'); });\r\n            if (listToCsv) listToCsv.addEventListener('click', function () { self.csvConvert('tocsv'); });\r\n            var csvCopyBtn = document.getElementById('pth-csv-copy-btn');\r\n            if (csvCopyBtn) csvCopyBtn.addEventListener('click', function () {\r\n                var el = document.getElementById('pth-csv-output');\r\n                if (el) self.copyText(el.textContent);\r\n            });\r\n\r\n            \/* Diff *\/\r\n            var diffBtn = document.getElementById('pth-diff-btn');\r\n            if (diffBtn) diffBtn.addEventListener('click', function () { self.runDiff(); });\r\n\r\n            \/* Typography *\/\r\n            document.querySelectorAll('#pth-textseo-wrapper .pth-case-btn[data-typo]').forEach(function (btn) {\r\n                btn.addEventListener('click', function () { self.typoFix(this.getAttribute('data-typo')); });\r\n            });\r\n\r\n            \/* Repeat \/ Reverse *\/\r\n            var repeatBtn = document.getElementById('pth-repeat-btn');\r\n            if (repeatBtn) repeatBtn.addEventListener('click', function () { self.repeatText(); });\r\n            document.querySelectorAll('#pth-textseo-wrapper .pth-case-btn[data-reverse]').forEach(function (btn) {\r\n                btn.addEventListener('click', function () { self.reverseOp(this.getAttribute('data-reverse')); });\r\n            });\r\n\r\n            \/* Truncate *\/\r\n            var truncBtn     = document.getElementById('pth-trunc-btn');\r\n            var truncCopyBtn = document.getElementById('pth-trunc-copy-btn');\r\n            if (truncBtn)     truncBtn.addEventListener('click', function () { self.truncateText(); });\r\n            if (truncCopyBtn) truncCopyBtn.addEventListener('click', function () {\r\n                var el = document.getElementById('pth-trunc-output');\r\n                if (el) self.copyText(el.textContent);\r\n            });\r\n\r\n            \/* Char tools *\/\r\n            var charLineBtn = document.getElementById('pth-charline-btn');\r\n            if (charLineBtn) charLineBtn.addEventListener('click', function () { self.charCountPerLine(); });\r\n            var unicodeInput = document.getElementById('pth-unicode-input');\r\n            if (unicodeInput) unicodeInput.addEventListener('input', function () { self.unicodeInspect(this.value); });\r\n            var wsBtn = document.getElementById('pth-ws-btn');\r\n            if (wsBtn) wsBtn.addEventListener('click', function () { self.visualizeWhitespace(); });\r\n\r\n            \/* Quick actions *\/\r\n            var copyBtn   = document.getElementById('pth-ts-copy-btn');\r\n            var exportBtn = document.getElementById('pth-ts-export-btn');\r\n            var printBtn  = document.getElementById('pth-ts-print-btn');\r\n            if (copyBtn)   copyBtn.addEventListener('click', function () {\r\n                var inp = document.getElementById('pth-ts-main-input');\r\n                if (inp) self.copyText(inp.value);\r\n            });\r\n            if (exportBtn) exportBtn.addEventListener('click', function () { self.exportTxt(); });\r\n            if (printBtn)  printBtn.addEventListener('click', function () {\r\n                var inp = document.getElementById('pth-ts-main-input');\r\n                if (inp) { var w = window.open(''); w.document.write('<pre>' + inp.value + '<\/pre>'); w.print(); w.close(); }\r\n            });\r\n        },\r\n\r\n        \/* \u2500\u2500\u2500 SWITCH TAB \u2500\u2500\u2500 *\/\r\n        switchTab: function (tab) {\r\n            this.currentTab = tab;\r\n            var tabs = ['seo', 'transform', 'content', 'lists', 'typography', 'chars'];\r\n            var self = this;\r\n            tabs.forEach(function (t) {\r\n                var panel = document.getElementById('pth-tab-' + t);\r\n                var btn   = document.querySelector('[data-tab=\"' + t + '\"]');\r\n                if (panel) panel.style.display = (t === tab) ? 'block' : 'none';\r\n                if (btn) {\r\n                    btn.classList.toggle('pth-active', t === tab);\r\n                    btn.setAttribute('aria-selected', t === tab ? 'true' : 'false');\r\n                }\r\n            });\r\n            if (tab === 'seo') self.updateKwDensity();\r\n        },\r\n\r\n        \/* \u2500\u2500\u2500 LIVE STATS \u2500\u2500\u2500 *\/\r\n        updateStats: function () {\r\n            var input = document.getElementById('pth-ts-main-input');\r\n            if (!input) return;\r\n            var text = input.value;\r\n\r\n            var words       = text.trim() ? text.trim().split(\/\\s+\/).filter(function (w) { return w.length > 0; }).length : 0;\r\n            var chars       = text.length;\r\n            var charsNoSp   = text.replace(\/\\s\/g, '').length;\r\n            var sentences   = text.trim() ? (text.match(\/[^.!?]+[.!?]+\/g) || [text.trim()]).length : 0;\r\n            var paras       = text.trim() ? text.split(\/\\n\\s*\\n\/).filter(function (p) { return p.trim().length > 0; }).length : 0;\r\n            var lines       = text.trim() ? text.split('\\n').length : 0;\r\n            var uniqueWords = text.trim() ? new Set(text.toLowerCase().replace(\/[^a-z\\s]\/g, '').split(\/\\s+\/).filter(function (w) { return w.length > 1; })).size : 0;\r\n            var syllables   = this.countSyllables(text);\r\n            var readTime    = words > 0 ? Math.ceil(words \/ 200) + ' min' : '\u2014';\r\n            var flesch      = this.fleschScore(words, sentences, syllables);\r\n            var readLabel   = this.fleschLabel(flesch);\r\n\r\n            this.setEl('pth-ts-words',       words);\r\n            this.setEl('pth-ts-chars',       chars);\r\n            this.setEl('pth-ts-sentences',   sentences);\r\n            this.setEl('pth-ts-paras',       paras);\r\n            this.setEl('pth-ts-readtime',    readTime);\r\n            this.setEl('pth-ts-readability', words > 20 ? Math.round(flesch) : '\u2014');\r\n\r\n            this.setEl('pth-sb-sentences',   sentences);\r\n            this.setEl('pth-sb-avg',         sentences > 0 ? Math.round(words \/ sentences) : 0);\r\n            this.setEl('pth-sb-unique',      uniqueWords);\r\n            this.setEl('pth-sb-chars-nospace', charsNoSp);\r\n            this.setEl('pth-sb-lines',       lines);\r\n            this.setEl('pth-sb-syllables',   syllables);\r\n\r\n            \/* Readability gauge *\/\r\n            if (words > 20) {\r\n                var score = Math.max(0, Math.min(100, Math.round(flesch)));\r\n                this.setEl('pth-gauge-score', score);\r\n                var gaugeScore = document.getElementById('pth-gauge-score');\r\n                if (gaugeScore) {\r\n                    gaugeScore.style.color = score >= 60 ? '#047857' : score >= 30 ? '#92400e' : '#991b1b';\r\n                }\r\n                this.setEl('pth-gauge-label', readLabel.grade);\r\n                this.setEl('pth-gauge-desc',  readLabel.desc);\r\n                var gBar = document.getElementById('pth-gauge-bar');\r\n                if (gBar) {\r\n                    gBar.style.width = score + '%';\r\n                    gBar.className = 'pth-prog-bar ' + (score >= 60 ? 'green' : score >= 30 ? 'amber' : 'red');\r\n                }\r\n            }\r\n        },\r\n\r\n        \/* \u2500\u2500\u2500 SEO CHECKLIST \u2500\u2500\u2500 *\/\r\n        updateSeoChecklist: function () {\r\n            var input = document.getElementById('pth-ts-main-input');\r\n            var titleEl = document.getElementById('pth-seo-title');\r\n            var metaEl  = document.getElementById('pth-seo-meta');\r\n\r\n            var words     = input ? (input.value.trim().split(\/\\s+\/).filter(function (w) { return w.length > 0; }).length) : 0;\r\n            var sentences = input ? (input.value.match(\/[^.!?]+[.!?]+\/g) || []).length : 0;\r\n            var avgWords  = sentences > 0 ? Math.round(words \/ sentences) : 0;\r\n            var flesch    = this.fleschScore(words, sentences, this.countSyllables(input ? input.value : ''));\r\n            var titleLen  = titleEl ? titleEl.value.length : 0;\r\n            var metaLen   = metaEl  ? metaEl.value.length : 0;\r\n\r\n            this.setCheckItem('pth-chk-words',       words >= 300,  words < 300);\r\n            this.setCheckItem('pth-chk-1000',        words >= 1000, words < 1000);\r\n            this.setCheckItem('pth-chk-readability', flesch >= 60,  flesch < 40);\r\n            this.setCheckItem('pth-chk-sentences',   avgWords > 0 && avgWords <= 20, avgWords > 25);\r\n            this.setCheckItem('pth-chk-title',       titleLen >= 50 && titleLen <= 60, titleLen > 0 && (titleLen < 40 || titleLen > 65));\r\n            this.setCheckItem('pth-chk-meta',        metaLen >= 120 && metaLen <= 160, metaLen > 0 && (metaLen < 100 || metaLen > 170));\r\n        },\r\n\r\n        setCheckItem: function (id, pass, warn) {\r\n            var el = document.getElementById(id);\r\n            if (!el) return;\r\n            var icon = el.querySelector('span:first-child');\r\n            if (!icon) return;\r\n            if (pass)      { icon.textContent = '\u2705'; }\r\n            else if (warn) { icon.textContent = '\u26a0\ufe0f'; }\r\n            else           { icon.textContent = '\u26aa'; }\r\n        },\r\n\r\n        \/* \u2500\u2500\u2500 SERP PREVIEW \u2500\u2500\u2500 *\/\r\n        updateSerpPreview: function () {\r\n            var titleVal = (document.getElementById('pth-seo-title') || {}).value || '';\r\n            var metaVal  = (document.getElementById('pth-seo-meta')  || {}).value || '';\r\n            var urlVal   = (document.getElementById('pth-seo-url')   || {}).value || 'https:\/\/schoolict.net\/tools\/';\r\n\r\n            var titleDisplay = document.getElementById('pth-serp-title-display');\r\n            var metaDisplay  = document.getElementById('pth-serp-meta-display');\r\n            var urlDisplay   = document.getElementById('pth-serp-url-display');\r\n\r\n            if (titleDisplay) titleDisplay.textContent = titleVal || 'Your SEO Title Will Appear Here';\r\n            if (metaDisplay)  metaDisplay.textContent  = metaVal  || 'Your meta description will appear here. Write 120\u2013160 characters.';\r\n            if (urlDisplay)   urlDisplay.textContent   = urlVal;\r\n\r\n            \/* Update char counts *\/\r\n            this.updateCharBar('pth-seo-title-count', 'pth-seo-title-bar', titleVal.length, 60, 50, 60);\r\n            this.updateCharBar('pth-seo-meta-count',  'pth-seo-meta-bar',  metaVal.length,  160, 120, 160);\r\n        },\r\n\r\n        updateCharBar: function (countId, barId, len, max, min, ideal) {\r\n            var countEl = document.getElementById(countId);\r\n            var barEl   = document.getElementById(barId);\r\n            if (countEl) {\r\n                countEl.textContent = len + ' \/ ' + ideal;\r\n                countEl.className = 'pth-char-count ' + (len >= min && len <= ideal ? 'pth-char-ok' : len > ideal ? 'pth-char-bad' : len > 0 ? 'pth-char-warn' : 'pth-char-ok');\r\n            }\r\n            if (barEl) {\r\n                var pct = Math.min(100, Math.round((len \/ max) * 100));\r\n                barEl.style.width = pct + '%';\r\n                barEl.className = 'pth-prog-bar ' + (len >= min && len <= ideal ? 'green' : len > ideal ? 'red' : 'amber');\r\n            }\r\n        },\r\n\r\n        setSerpMode: function (mode) {\r\n            var preview = document.getElementById('pth-serp-preview');\r\n            var deskBtn = document.getElementById('pth-serp-desktop');\r\n            var mobBtn  = document.getElementById('pth-serp-mobile');\r\n            if (preview) {\r\n                preview.style.maxWidth = mode === 'mobile' ? '360px' : '100%';\r\n                preview.style.fontSize = mode === 'mobile' ? '90%' : '';\r\n            }\r\n            if (deskBtn) { deskBtn.classList.toggle('pth-btn-primary', mode === 'desktop'); deskBtn.setAttribute('aria-pressed', mode === 'desktop' ? 'true' : 'false'); }\r\n            if (mobBtn)  { mobBtn.classList.toggle('pth-btn-primary',  mode === 'mobile');  mobBtn.setAttribute('aria-pressed',  mode === 'mobile'  ? 'true' : 'false'); }\r\n        },\r\n\r\n        \/* \u2500\u2500\u2500 KEYWORD DENSITY \u2500\u2500\u2500 *\/\r\n        setKwMode: function (mode) {\r\n            this.kwMode = mode;\r\n            var uniBtn = document.getElementById('pth-kw-unigram-btn');\r\n            var biBtn  = document.getElementById('pth-kw-bigram-btn');\r\n            if (uniBtn) { uniBtn.classList.toggle('pth-btn-primary', mode === 'unigram'); uniBtn.setAttribute('aria-pressed', mode === 'unigram' ? 'true' : 'false'); }\r\n            if (biBtn)  { biBtn.classList.toggle('pth-btn-primary',  mode === 'bigram');  biBtn.setAttribute('aria-pressed',  mode === 'bigram'  ? 'true' : 'false'); }\r\n            this.updateKwDensity();\r\n        },\r\n\r\n        updateKwDensity: function () {\r\n            var input = document.getElementById('pth-ts-main-input');\r\n            var list  = document.getElementById('pth-kw-list');\r\n            if (!input || !list) return;\r\n            var text = input.value.toLowerCase().replace(\/[^a-z\\s]\/g, '').trim();\r\n            if (!text) {\r\n                list.innerHTML = '<div style=\"text-align:center;color:#334155;font-size:13px;padding:14px 0;\">Paste text in the main input above to see keyword density<\/div>';\r\n                return;\r\n            }\r\n\r\n            var words = text.split(\/\\s+\/).filter(function (w) { return w.length > 2; });\r\n            var freq  = {};\r\n            var self  = this;\r\n\r\n            if (this.kwMode === 'unigram') {\r\n                words.forEach(function (w) {\r\n                    if (!self.stopWords.has(w)) freq[w] = (freq[w] || 0) + 1;\r\n                });\r\n            } else {\r\n                for (var i = 0; i < words.length - 1; i++) {\r\n                    if (!self.stopWords.has(words[i]) && !self.stopWords.has(words[i + 1])) {\r\n                        var phrase = words[i] + ' ' + words[i + 1];\r\n                        freq[phrase] = (freq[phrase] || 0) + 1;\r\n                    }\r\n                }\r\n            }\r\n\r\n            var sorted = Object.keys(freq).sort(function (a, b) { return freq[b] - freq[a]; }).slice(0, 10);\r\n            var total  = words.length;\r\n            var maxCount = sorted.length > 0 ? freq[sorted[0]] : 1;\r\n\r\n            if (sorted.length === 0) {\r\n                list.innerHTML = '<div style=\"text-align:center;color:#334155;font-size:13px;padding:14px 0;\">No significant keywords found<\/div>';\r\n                return;\r\n            }\r\n\r\n            var html = '';\r\n            sorted.forEach(function (w) {\r\n                var count = freq[w];\r\n                var pct   = Math.round((count \/ total) * 100);\r\n                var barW  = Math.round((count \/ maxCount) * 100);\r\n                html += '<div class=\"pth-kw-item\">';\r\n                html += '<span class=\"pth-kw-word\">' + w + '<\/span>';\r\n                html += '<span class=\"pth-kw-count\">' + count + 'x (' + pct + '%)<\/span>';\r\n                html += '<div class=\"pth-kw-bar-bg\"><div class=\"pth-kw-bar-fill\" style=\"width:' + barW + '%\"><\/div><\/div>';\r\n                html += '<\/div>';\r\n            });\r\n            list.innerHTML = html;\r\n        },\r\n\r\n        \/* \u2500\u2500\u2500 CASE CONVERTER \u2500\u2500\u2500 *\/\r\n        convertCase: function (type) {\r\n            var input = document.getElementById('pth-ts-main-input');\r\n            if (!input || !input.value.trim()) { this.showToast('Please enter text first!', 'error'); return; }\r\n            var t = input.value;\r\n            var result = t;\r\n\r\n            switch (type) {\r\n                case 'sentence':\r\n                    result = t.toLowerCase().replace(\/(^\\s*\\w|[.!?]\\s*\\w)\/g, function (c) { return c.toUpperCase(); });\r\n                    break;\r\n                case 'lower':   result = t.toLowerCase();   break;\r\n                case 'upper':   result = t.toUpperCase();   break;\r\n                case 'capitalized':\r\n                    result = t.toLowerCase().replace(\/\\b\\w\/g, function (c) { return c.toUpperCase(); });\r\n                    break;\r\n                case 'title':\r\n                    var small = new Set(['a','an','the','and','but','or','for','nor','on','at','to','by','in','of','up','as','if','is']);\r\n                    result = t.toLowerCase().replace(\/\\b\\w+\/g, function (w, i) { return (i === 0 || !small.has(w)) ? w.charAt(0).toUpperCase() + w.slice(1) : w; });\r\n                    break;\r\n                case 'alternating':\r\n                    result = t.split('').map(function (c, i) { return i % 2 === 0 ? c.toLowerCase() : c.toUpperCase(); }).join('');\r\n                    break;\r\n                case 'inverse':\r\n                    result = t.split('').map(function (c) { return c === c.toUpperCase() ? c.toLowerCase() : c.toUpperCase(); }).join('');\r\n                    break;\r\n                case 'camel':\r\n                    result = t.toLowerCase().replace(\/[^a-zA-Z0-9]+(.)\/g, function (m, c) { return c.toUpperCase(); });\r\n                    break;\r\n                case 'pascal':\r\n                    result = t.toLowerCase().replace(\/(^|\\s+)(\\w)\/g, function (m, s, c) { return c.toUpperCase(); }).replace(\/\\s+\/g, '');\r\n                    break;\r\n                case 'snake':\r\n                    result = t.toLowerCase().replace(\/\\s+\/g, '_').replace(\/[^a-z0-9_]\/g, '');\r\n                    break;\r\n                case 'kebab':\r\n                    result = t.toLowerCase().replace(\/\\s+\/g, '-').replace(\/[^a-z0-9\\-]\/g, '');\r\n                    break;\r\n                case 'constant':\r\n                    result = t.toUpperCase().replace(\/\\s+\/g, '_').replace(\/[^A-Z0-9_]\/g, '');\r\n                    break;\r\n            }\r\n\r\n            input.value = result;\r\n            this.updateStats();\r\n            this.showToast('Case converted!', 'success');\r\n        },\r\n\r\n        \/* \u2500\u2500\u2500 TEXT CLEANER \u2500\u2500\u2500 *\/\r\n        cleanText: function (type) {\r\n            var input = document.getElementById('pth-ts-main-input');\r\n            if (!input || !input.value.trim()) { this.showToast('Please enter text first!', 'error'); return; }\r\n            var t = input.value;\r\n\r\n            switch (type) {\r\n                case 'spaces':      t = t.replace(\/[ \\t]+\/g, ' ').replace(\/^ \/mg, ''); break;\r\n                case 'lines':       t = t.split('\\n').filter(function (l) { return l.trim().length > 0; }).join('\\n'); break;\r\n                case 'html':        t = t.replace(\/<[^>]+>\/g, '').replace(\/&amp;\/g,'&').replace(\/&lt;\/g,'<').replace(\/&gt;\/g,'>').replace(\/&nbsp;\/g,' '); break;\r\n                case 'trim':        t = t.split('\\n').map(function (l) { return l.trim(); }).join('\\n'); break;\r\n                case 'numbers':     t = t.replace(\/[0-9]\/g, ''); break;\r\n                case 'punctuation': t = t.replace(\/[!\"#$%&'()*+,\\-.\/:;<=>?@[\\\\\\]^_`{|}~]\/g, ''); break;\r\n                case 'linebreaks':  t = t.replace(\/\\n+\/g, ' ').replace(\/\\s+\/g, ' ').trim(); break;\r\n                case 'emojis':      t = t.replace(\/[\\u{1F600}-\\u{1F64F}\\u{1F300}-\\u{1F5FF}\\u{1F680}-\\u{1F6FF}\\u{1F1E0}-\\u{1F1FF}\\u{2600}-\\u{26FF}\\u{2700}-\\u{27BF}]\/gu, ''); break;\r\n            }\r\n\r\n            input.value = t;\r\n            this.updateStats();\r\n            this.showToast('Text cleaned!', 'success');\r\n        },\r\n\r\n        \/* \u2500\u2500\u2500 SORT LINES \u2500\u2500\u2500 *\/\r\n        sortLines: function (type) {\r\n            var input = document.getElementById('pth-ts-main-input');\r\n            if (!input || !input.value.trim()) { this.showToast('Please enter text first!', 'error'); return; }\r\n            var lines = input.value.split('\\n');\r\n\r\n            switch (type) {\r\n                case 'az':         lines.sort(function (a, b) { return a.localeCompare(b); }); break;\r\n                case 'za':         lines.sort(function (a, b) { return b.localeCompare(a); }); break;\r\n                case 'reverse':    lines.reverse(); break;\r\n                case 'dedupe':     lines = lines.filter(function (v, i, a) { return a.indexOf(v) === i; }); break;\r\n                case 'shuffle':    lines = lines.map(function (v) { return { v: v, r: Math.random() }; }).sort(function (a, b) { return a.r - b.r; }).map(function (x) { return x.v; }); break;\r\n                case 'numbering':  lines = lines.map(function (l, i) { return (i + 1) + '. ' + l; }); break;\r\n                case 'removenums': lines = lines.map(function (l) { return l.replace(\/^\\d+[.)]\\s*\/, ''); }); break;\r\n                case 'slug':       input.value = input.value.toLowerCase().replace(\/\\s+\/g, '-').replace(\/[^a-z0-9\\-]\/g, '').replace(\/-+\/g, '-'); this.showToast('Converted to slug!', 'success'); return;\r\n            }\r\n\r\n            input.value = lines.join('\\n');\r\n            this.updateStats();\r\n            this.showToast('Done!', 'success');\r\n        },\r\n\r\n        \/* \u2500\u2500\u2500 FIND & REPLACE \u2500\u2500\u2500 *\/\r\n        findReplace: function () {\r\n            var input    = document.getElementById('pth-ts-main-input');\r\n            var findEl   = document.getElementById('pth-find-input');\r\n            var replaceEl= document.getElementById('pth-replace-input');\r\n            var caseEl   = document.getElementById('pth-find-case');\r\n            var regexEl  = document.getElementById('pth-find-regex');\r\n\r\n            if (!input || !findEl || !findEl.value) { this.showToast('Enter search text!', 'error'); return; }\r\n\r\n            var find    = findEl.value;\r\n            var replace = replaceEl ? replaceEl.value : '';\r\n            var flags   = (caseEl && caseEl.checked) ? 'g' : 'gi';\r\n\r\n            try {\r\n                var pattern = (regexEl && regexEl.checked) ? new RegExp(find, flags) : new RegExp(find.replace(\/[.*+?^${}()|[\\]\\\\]\/g, '\\\\$&'), flags);\r\n                var count   = (input.value.match(pattern) || []).length;\r\n                input.value = input.value.replace(pattern, replace);\r\n                this.updateStats();\r\n                this.showToast('Replaced ' + count + ' occurrence' + (count !== 1 ? 's' : '') + '!', 'success');\r\n            } catch (e) {\r\n                this.showToast('Invalid regex: ' + e.message, 'error');\r\n            }\r\n        },\r\n\r\n        findCount: function () {\r\n            var input   = document.getElementById('pth-ts-main-input');\r\n            var findEl  = document.getElementById('pth-find-input');\r\n            var caseEl  = document.getElementById('pth-find-case');\r\n            var regexEl = document.getElementById('pth-find-regex');\r\n            var resEl   = document.getElementById('pth-find-count-result');\r\n            if (!input || !findEl || !findEl.value) return;\r\n            var flags   = (caseEl && caseEl.checked) ? 'g' : 'gi';\r\n            try {\r\n                var pattern = (regexEl && regexEl.checked) ? new RegExp(findEl.value, flags) : new RegExp(findEl.value.replace(\/[.*+?^${}()|[\\]\\\\]\/g, '\\\\$&'), flags);\r\n                var count   = (input.value.match(pattern) || []).length;\r\n                if (resEl) resEl.textContent = count + ' match' + (count !== 1 ? 'es' : '') + ' found';\r\n            } catch (e) {\r\n                if (resEl) resEl.textContent = 'Invalid regex';\r\n            }\r\n        },\r\n\r\n        \/* \u2500\u2500\u2500 PREFIX \/ SUFFIX \u2500\u2500\u2500 *\/\r\n        applyPrefixSuffix: function () {\r\n            var input   = document.getElementById('pth-ts-main-input');\r\n            var prefixEl = document.getElementById('pth-prefix-input');\r\n            var suffixEl = document.getElementById('pth-suffix-input');\r\n            if (!input || !input.value.trim()) { this.showToast('Please enter text first!', 'error'); return; }\r\n            var prefix = prefixEl ? prefixEl.value : '';\r\n            var suffix = suffixEl ? suffixEl.value : '';\r\n            if (!prefix && !suffix) { this.showToast('Enter a prefix or suffix!', 'error'); return; }\r\n            input.value = input.value.split('\\n').map(function (l) { return prefix + l + suffix; }).join('\\n');\r\n            this.updateStats();\r\n            this.showToast('Prefix\/Suffix applied!', 'success');\r\n        },\r\n\r\n        \/* \u2500\u2500\u2500 LOREM IPSUM \u2500\u2500\u2500 *\/\r\n        generateLorem: function () {\r\n            var input    = document.getElementById('pth-ts-main-input');\r\n            var countEl  = document.getElementById('pth-lorem-count');\r\n            var typeEl   = document.getElementById('pth-lorem-type');\r\n            if (!input || !countEl || !typeEl) return;\r\n\r\n            var count = Math.max(1, Math.min(20, parseInt(countEl.value, 10) || 3));\r\n            var type  = typeEl.value;\r\n            var self  = this;\r\n            var result = '';\r\n\r\n            var loremWords = 'lorem ipsum dolor sit amet consectetur adipiscing elit sed do eiusmod tempor incididunt ut labore et dolore magna aliqua enim ad minim veniam quis nostrud exercitation ullamco laboris nisi aliquip ex ea commodo consequat duis aute irure reprehenderit voluptate velit esse cillum eu fugiat nulla pariatur excepteur sint occaecat cupidatat non proident sunt culpa qui officia deserunt mollit anim id est laborum'.split(' ');\r\n\r\n            if (type === 'paragraphs') {\r\n                var pool = self.loremParagraphs;\r\n                for (var i = 0; i < count; i++) {\r\n                    result += pool[i % pool.length];\r\n                    if (i < count - 1) result += '\\n\\n';\r\n                }\r\n            } else if (type === 'sentences') {\r\n                for (var s = 0; s < count; s++) {\r\n                    var wCount = 8 + Math.floor(Math.random() * 10);\r\n                    var sent   = [];\r\n                    for (var w = 0; w < wCount; w++) {\r\n                        sent.push(loremWords[Math.floor(Math.random() * loremWords.length)]);\r\n                    }\r\n                    sent[0] = sent[0].charAt(0).toUpperCase() + sent[0].slice(1);\r\n                    result += sent.join(' ') + '. ';\r\n                }\r\n            } else {\r\n                var wordArr = [];\r\n                for (var ww = 0; ww < count; ww++) {\r\n                    wordArr.push(loremWords[Math.floor(Math.random() * loremWords.length)]);\r\n                }\r\n                result = wordArr.join(' ');\r\n            }\r\n\r\n            input.value = result.trim();\r\n            this.updateStats();\r\n            this.showToast('Lorem ipsum generated!', 'success');\r\n        },\r\n\r\n        \/* \u2500\u2500\u2500 PASSWORD GENERATOR \u2500\u2500\u2500 *\/\r\n        generatePassword: function () {\r\n            var lenEl    = document.getElementById('pth-pwd-len');\r\n            var upperEl  = document.getElementById('pth-pwd-upper');\r\n            var lowerEl  = document.getElementById('pth-pwd-lower');\r\n            var numsEl   = document.getElementById('pth-pwd-nums');\r\n            var symsEl   = document.getElementById('pth-pwd-syms');\r\n            var outputEl = document.getElementById('pth-pwd-output');\r\n\r\n            var len    = parseInt((lenEl || {}).value || 16, 10);\r\n            var upper  = upperEl  && upperEl.checked;\r\n            var lower  = lowerEl  && lowerEl.checked;\r\n            var nums   = numsEl   && numsEl.checked;\r\n            var syms   = symsEl   && symsEl.checked;\r\n\r\n            var chars = '';\r\n            if (upper) chars += 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';\r\n            if (lower) chars += 'abcdefghijklmnopqrstuvwxyz';\r\n            if (nums)  chars += '0123456789';\r\n            if (syms)  chars += '!@#$%^&*()_+-=[]{}|;:,.<>?';\r\n\r\n            if (!chars) { this.showToast('Select at least one character type!', 'error'); return; }\r\n\r\n            var pwd = '';\r\n            var arr = new Uint32Array(len);\r\n            window.crypto.getRandomValues(arr);\r\n            for (var i = 0; i < len; i++) {\r\n                pwd += chars[arr[i] % chars.length];\r\n            }\r\n\r\n            if (outputEl) outputEl.textContent = pwd;\r\n            this.showToast('Password generated!', 'success');\r\n        },\r\n\r\n        \/* \u2500\u2500\u2500 ENCODE \/ DECODE \u2500\u2500\u2500 *\/\r\n        encodeOp: function (op) {\r\n            var inputEl  = document.getElementById('pth-encode-input');\r\n            var outputEl = document.getElementById('pth-encode-output');\r\n            if (!inputEl || !outputEl || !inputEl.value.trim()) { this.showToast('Paste text in the encode input first!', 'error'); return; }\r\n\r\n            var t = inputEl.value;\r\n            var result = '';\r\n\r\n            try {\r\n                switch (op) {\r\n                    case 'b64enc':  result = btoa(unescape(encodeURIComponent(t))); break;\r\n                    case 'b64dec':  result = decodeURIComponent(escape(atob(t)));   break;\r\n                    case 'urlenc':  result = encodeURIComponent(t); break;\r\n                    case 'urldec':  result = decodeURIComponent(t); break;\r\n                    case 'htmlenc': result = t.replace(\/&\/g,'&amp;').replace(\/<\/g,'&lt;').replace(\/>\/g,'&gt;').replace(\/\"\/g,'&quot;').replace(\/'\/g,'&#039;'); break;\r\n                    case 'htmldec': result = t.replace(\/&amp;\/g,'&').replace(\/&lt;\/g,'<').replace(\/&gt;\/g,'>').replace(\/&quot;\/g,'\"').replace(\/&#039;\/g,\"'\"); break;\r\n                    case 'rot13':   result = t.replace(\/[a-zA-Z]\/g, function (c) { return String.fromCharCode((c <= 'Z' ? 90 : 122) >= (c = c.charCodeAt(0) + 13) ? c : c - 26); }); break;\r\n                    case 'reverse': result = t.split('').reverse().join(''); break;\r\n                }\r\n                outputEl.textContent = result;\r\n                this.showToast('Done!', 'success');\r\n            } catch (e) {\r\n                outputEl.textContent = 'Error: ' + e.message;\r\n                this.showToast('Encoding error: ' + e.message, 'error');\r\n            }\r\n        },\r\n\r\n        \/* \u2500\u2500\u2500 WORD TARGET \u2500\u2500\u2500 *\/\r\n        updateTargetProgress: function () {\r\n            var input     = document.getElementById('pth-ts-main-input');\r\n            var targetEl  = document.getElementById('pth-target-words');\r\n            var wpmEl     = document.getElementById('pth-target-wpm');\r\n            var pctEl     = document.getElementById('pth-target-pct');\r\n            var barEl     = document.getElementById('pth-target-bar');\r\n            var infoEl    = document.getElementById('pth-target-info');\r\n\r\n            if (!input || !targetEl) return;\r\n            var words  = input.value.trim() ? input.value.trim().split(\/\\s+\/).length : 0;\r\n            var target = parseInt(targetEl.value, 10) || 1000;\r\n            var wpm    = parseInt((wpmEl || {}).value || 200, 10);\r\n            var pct    = Math.min(100, Math.round((words \/ target) * 100));\r\n            var readMin = Math.ceil(words \/ wpm);\r\n\r\n            if (pctEl)  pctEl.textContent = words + ' \/ ' + target + ' words';\r\n            if (barEl)  { barEl.style.width = pct + '%'; barEl.className = 'pth-prog-bar ' + (pct >= 100 ? 'green' : pct >= 50 ? 'amber' : 'red'); }\r\n            if (infoEl) {\r\n                if (pct >= 100) {\r\n                    infoEl.textContent = 'Target reached! ' + words + ' words \u2014 approx ' + readMin + ' min read at ' + wpm + ' WPM.';\r\n                } else {\r\n                    infoEl.textContent = 'Write ' + (target - words) + ' more words to reach your target. Est. read time: ' + readMin + ' min.';\r\n                }\r\n            }\r\n        },\r\n\r\n        \/* \u2500\u2500\u2500 LIST TOOLS \u2500\u2500\u2500 *\/\r\n        listOp: function (op) {\r\n            var input   = document.getElementById('pth-ts-main-input');\r\n            var countEl = document.getElementById('pth-list-count-display');\r\n            if (!input || !input.value.trim()) { this.showToast('Please enter text first!', 'error'); return; }\r\n            var lines = input.value.split('\\n');\r\n\r\n            switch (op) {\r\n                case 'bulletize':  input.value = lines.map(function (l) { return l.trim() ? '\u2022 ' + l : l; }).join('\\n'); break;\r\n                case 'numbering':  input.value = lines.map(function (l, i) { return l.trim() ? (i + 1) + '. ' + l : l; }).join('\\n'); break;\r\n                case 'comma':      input.value = lines.filter(function (l) { return l.trim(); }).join(', '); break;\r\n                case 'fromcomma':  input.value = input.value.split(',').map(function (i) { return i.trim(); }).join('\\n'); break;\r\n                case 'dedupe':     input.value = lines.filter(function (v, i, a) { return a.indexOf(v) === i; }).join('\\n'); break;\r\n                case 'sortaz':     lines.sort(function (a, b) { return a.localeCompare(b); }); input.value = lines.join('\\n'); break;\r\n                case 'sortza':     lines.sort(function (a, b) { return b.localeCompare(a); }); input.value = lines.join('\\n'); break;\r\n                case 'count':\r\n                    var itemCount = lines.filter(function (l) { return l.trim().length > 0; }).length;\r\n                    if (countEl) { countEl.textContent = itemCount + ' items in list'; countEl.style.display = 'block'; }\r\n                    this.showToast(itemCount + ' items counted!', 'info');\r\n                    return;\r\n            }\r\n            this.updateStats();\r\n            this.showToast('Done!', 'success');\r\n        },\r\n\r\n        \/* \u2500\u2500\u2500 CSV CONVERTER \u2500\u2500\u2500 *\/\r\n        csvConvert: function (dir) {\r\n            var inputEl   = document.getElementById('pth-csv-input');\r\n            var outputEl  = document.getElementById('pth-csv-output');\r\n            var delimEl   = document.getElementById('pth-csv-delimiter');\r\n            if (!inputEl || !outputEl || !inputEl.value.trim()) { this.showToast('Paste CSV or list data first!', 'error'); return; }\r\n\r\n            var delim = delimEl ? delimEl.value : ',';\r\n            var t     = inputEl.value.trim();\r\n\r\n            if (dir === 'tolist') {\r\n                outputEl.textContent = t.split(delim).map(function (v) { return v.trim(); }).join('\\n');\r\n            } else {\r\n                outputEl.textContent = t.split('\\n').filter(function (l) { return l.trim(); }).join(delim + ' ');\r\n            }\r\n            this.showToast('Converted!', 'success');\r\n        },\r\n\r\n        \/* \u2500\u2500\u2500 TEXT DIFF \u2500\u2500\u2500 *\/\r\n        runDiff: function () {\r\n            var aEl     = document.getElementById('pth-diff-a');\r\n            var bEl     = document.getElementById('pth-diff-b');\r\n            var outEl   = document.getElementById('pth-diff-output');\r\n            if (!aEl || !bEl || !outEl) return;\r\n\r\n            var aLines = aEl.value.split('\\n');\r\n            var bLines = bEl.value.split('\\n');\r\n            var html   = '';\r\n\r\n            var maxLen = Math.max(aLines.length, bLines.length);\r\n            var hasDiff = false;\r\n\r\n            for (var i = 0; i < maxLen; i++) {\r\n                var aLine = aLines[i] !== undefined ? aLines[i] : null;\r\n                var bLine = bLines[i] !== undefined ? bLines[i] : null;\r\n\r\n                if (aLine === null) {\r\n                    html += '<span class=\"pth-diff-add\">+ ' + this.escHtml(bLine) + '<\/span>';\r\n                    hasDiff = true;\r\n                } else if (bLine === null) {\r\n                    html += '<span class=\"pth-diff-remove\">- ' + this.escHtml(aLine) + '<\/span>';\r\n                    hasDiff = true;\r\n                } else if (aLine !== bLine) {\r\n                    html += '<span class=\"pth-diff-remove\">- ' + this.escHtml(aLine) + '<\/span>';\r\n                    html += '<span class=\"pth-diff-add\">+ ' + this.escHtml(bLine) + '<\/span>';\r\n                    hasDiff = true;\r\n                } else {\r\n                    html += '<span class=\"pth-diff-same\">  ' + this.escHtml(aLine) + '<\/span>';\r\n                }\r\n            }\r\n\r\n            outEl.innerHTML = html || '<div style=\"color:#334155;font-size:13px;padding:14px;\">No differences found.<\/div>';\r\n            if (!hasDiff) this.showToast('Texts are identical!', 'info');\r\n            else this.showToast('Differences highlighted!', 'success');\r\n        },\r\n\r\n        \/* \u2500\u2500\u2500 TYPOGRAPHY \u2500\u2500\u2500 *\/\r\n        typoFix: function (op) {\r\n            var input = document.getElementById('pth-ts-main-input');\r\n            if (!input || !input.value.trim()) { this.showToast('Please enter text first!', 'error'); return; }\r\n            var t = input.value;\r\n\r\n            switch (op) {\r\n                case 'smartquotes':  t = t.replace(\/\"([^\"]*)\"\/g, '\\u201c$1\\u201d').replace(\/'([^']*)'\/g, '\\u2018$1\\u2019'); break;\r\n                case 'dashes':       t = t.replace(\/---\/g, '\\u2014').replace(\/--\/g, '\\u2013'); break;\r\n                case 'accents':      t = t.normalize('NFD').replace(\/[\\u0300-\\u036f]\/g, ''); break;\r\n                case 'ellipsis':     t = t.replace(\/\\.\\.\\.\/g, '\\u2026'); break;\r\n                case 'apostrophe':   t = t.replace(\/(\\w)'(\\w)\/g, '$1\\u2019$2'); break;\r\n                case 'nbsp':         t = t.replace(\/\\u00A0\/g, ' ').replace(\/&nbsp;\/g, ' '); break;\r\n                case 'doublespace':  t = t.replace(\/([.!?])  +\/g, '$1 '); break;\r\n                case 'copyright':    t = t.replace(\/\\(c\\)\/gi, '\\u00A9').replace(\/\\(r\\)\/gi, '\\u00AE').replace(\/\\(tm\\)\/gi, '\\u2122'); break;\r\n            }\r\n\r\n            input.value = t;\r\n            this.updateStats();\r\n            this.showToast('Typography fixed!', 'success');\r\n        },\r\n\r\n        \/* \u2500\u2500\u2500 REPEAT TEXT \u2500\u2500\u2500 *\/\r\n        repeatText: function () {\r\n            var input   = document.getElementById('pth-ts-main-input');\r\n            var countEl = document.getElementById('pth-repeat-count');\r\n            var sepEl   = document.getElementById('pth-repeat-sep');\r\n            if (!input || !input.value.trim()) { this.showToast('Please enter text first!', 'error'); return; }\r\n            var count = Math.max(1, Math.min(100, parseInt((countEl || {}).value || 3, 10)));\r\n            var sep   = ((sepEl || {}).value || '\\\\n').replace(\/\\\\n\/g, '\\n').replace(\/\\\\t\/g, '\\t');\r\n            input.value = Array(count).fill(input.value).join(sep);\r\n            this.updateStats();\r\n            this.showToast('Text repeated ' + count + 'x!', 'success');\r\n        },\r\n\r\n        \/* \u2500\u2500\u2500 REVERSE OPS \u2500\u2500\u2500 *\/\r\n        reverseOp: function (op) {\r\n            var input = document.getElementById('pth-ts-main-input');\r\n            if (!input || !input.value.trim()) { this.showToast('Please enter text first!', 'error'); return; }\r\n            var t = input.value;\r\n\r\n            switch (op) {\r\n                case 'chars': t = t.split('').reverse().join(''); break;\r\n                case 'words': t = t.split(\/\\s+\/).reverse().join(' '); break;\r\n                case 'lines': t = t.split('\\n').reverse().join('\\n'); break;\r\n                case 'rot13': t = t.replace(\/[a-zA-Z]\/g, function (c) { return String.fromCharCode((c <= 'Z' ? 90 : 122) >= (c = c.charCodeAt(0) + 13) ? c : c - 26); }); break;\r\n            }\r\n\r\n            input.value = t;\r\n            this.updateStats();\r\n            this.showToast('Done!', 'success');\r\n        },\r\n\r\n        \/* \u2500\u2500\u2500 TRUNCATE \u2500\u2500\u2500 *\/\r\n        truncateText: function () {\r\n            var input     = document.getElementById('pth-ts-main-input');\r\n            var limitEl   = document.getElementById('pth-trunc-limit');\r\n            var typeEl    = document.getElementById('pth-trunc-type');\r\n            var ellipsisEl= document.getElementById('pth-trunc-ellipsis');\r\n            var outputEl  = document.getElementById('pth-trunc-output');\r\n            if (!input || !input.value.trim()) { this.showToast('Please enter text first!', 'error'); return; }\r\n\r\n            var limit    = parseInt((limitEl || {}).value || 160, 10);\r\n            var type     = (typeEl || {}).value || 'chars';\r\n            var ellipsis = (ellipsisEl || {}).value || '...';\r\n            var t        = input.value;\r\n            var result   = '';\r\n\r\n            if (type === 'chars') {\r\n                result = t.length > limit ? t.substring(0, limit) + ellipsis : t;\r\n            } else {\r\n                var words = t.split(\/\\s+\/);\r\n                result = words.length > limit ? words.slice(0, limit).join(' ') + ellipsis : t;\r\n            }\r\n\r\n            if (outputEl) outputEl.textContent = result;\r\n            this.showToast('Truncated to ' + limit + ' ' + type + '!', 'success');\r\n        },\r\n\r\n        \/* \u2500\u2500\u2500 CHAR COUNT PER LINE \u2500\u2500\u2500 *\/\r\n        charCountPerLine: function () {\r\n            var input  = document.getElementById('pth-ts-main-input');\r\n            var output = document.getElementById('pth-charline-output');\r\n            if (!input || !input.value.trim()) { this.showToast('Please enter text first!', 'error'); return; }\r\n\r\n            var lines = input.value.split('\\n');\r\n            var html  = '<div style=\"font-family:Courier New,monospace;font-size:12px;\">';\r\n            lines.forEach(function (line, i) {\r\n                var count = line.length;\r\n                var color = count > 160 ? '#991b1b' : count > 80 ? '#92400e' : '#047857';\r\n                html += '<div style=\"display:flex;gap:10px;padding:3px 0;border-bottom:1px solid #f1f5f9;\">';\r\n                html += '<span style=\"color:#334155;min-width:30px;font-weight:700;\">' + (i + 1) + '.<\/span>';\r\n                html += '<span style=\"color:' + color + ';font-weight:800;min-width:40px;\">' + count + '<\/span>';\r\n                html += '<span style=\"color:#0f172a;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;flex:1;\">' + line.substring(0, 60) + (line.length > 60 ? '\u2026' : '') + '<\/span>';\r\n                html += '<\/div>';\r\n            });\r\n            html += '<\/div>';\r\n            if (output) output.innerHTML = html;\r\n            this.showToast(lines.length + ' lines analyzed!', 'success');\r\n        },\r\n\r\n        \/* \u2500\u2500\u2500 UNICODE INSPECTOR \u2500\u2500\u2500 *\/\r\n        unicodeInspect: function (text) {\r\n            var output = document.getElementById('pth-unicode-output');\r\n            if (!output) return;\r\n            if (!text) {\r\n                output.innerHTML = '<div style=\"text-align:center;color:#334155;font-size:13px;padding:14px 0;\">Type text above to see Unicode code points<\/div>';\r\n                return;\r\n            }\r\n\r\n            var html = '<div style=\"display:flex;flex-wrap:wrap;gap:8px;\">';\r\n            var chars = Array.from(text);\r\n            chars.forEach(function (c) {\r\n                var code = c.codePointAt(0);\r\n                var hex  = 'U+' + code.toString(16).toUpperCase().padStart(4, '0');\r\n                html += '<div style=\"background:#f8fafc;border:1px solid #e2e8f0;border-radius:8px;padding:8px 10px;text-align:center;min-width:60px;\">';\r\n                html += '<div style=\"font-size:20px;margin-bottom:4px;\">' + c + '<\/div>';\r\n                html += '<div style=\"font-size:10px;font-weight:700;color:#5b21b6;\">' + hex + '<\/div>';\r\n                html += '<div style=\"font-size:9px;color:#334155;font-weight:600;\">' + code + '<\/div>';\r\n                html += '<\/div>';\r\n            });\r\n            html += '<\/div>';\r\n            output.innerHTML = html;\r\n        },\r\n\r\n        \/* \u2500\u2500\u2500 WHITESPACE VISUALIZER \u2500\u2500\u2500 *\/\r\n        visualizeWhitespace: function () {\r\n            var input  = document.getElementById('pth-ts-main-input');\r\n            var output = document.getElementById('pth-ws-output');\r\n            if (!input || !output) return;\r\n            if (!input.value) { this.showToast('Please enter text first!', 'error'); return; }\r\n\r\n            var result = input.value\r\n                .split('')\r\n                .map(function (c) {\r\n                    if (c === ' ')  return '<span style=\"color:#2563eb;font-weight:800;\">\u00b7<\/span>';\r\n                    if (c === '\\t') return '<span style=\"color:#5b21b6;font-weight:800;\">\u2192<\/span>';\r\n                    if (c === '\\n') return '<span style=\"color:#991b1b;font-weight:800;\">\u21b5<\/span>\\n';\r\n                    return c.replace(\/&\/g,'&amp;').replace(\/<\/g,'&lt;').replace(\/>\/g,'&gt;');\r\n                })\r\n                .join('');\r\n\r\n            output.innerHTML = result;\r\n            this.showToast('Whitespace visualized!', 'success');\r\n        },\r\n\r\n        \/* \u2500\u2500\u2500 EXPORT TXT \u2500\u2500\u2500 *\/\r\n        exportTxt: function () {\r\n            var input = document.getElementById('pth-ts-main-input');\r\n            if (!input || !input.value.trim()) { this.showToast('Nothing to export!', 'error'); return; }\r\n            var blob = new Blob([input.value], { type: 'text\/plain' });\r\n            var url  = URL.createObjectURL(blob);\r\n            var a    = document.createElement('a');\r\n            a.href = url; a.download = 'pth-text-' + Date.now() + '.txt'; a.click();\r\n            URL.revokeObjectURL(url);\r\n            this.showToast('Exported as .txt!', 'success');\r\n        },\r\n\r\n        \/* \u2500\u2500\u2500 LOAD SAMPLE \u2500\u2500\u2500 *\/\r\n        loadSample: function () {\r\n            var input = document.getElementById('pth-ts-main-input');\r\n            if (input) {\r\n                input.value = 'The quick brown fox jumps over the lazy dog. This sentence is a classic pangram used to display fonts and test keyboards. It contains every letter of the English alphabet at least once.\\n\\nSEO content writing requires a balance between keyword density and readability. Search engines favor content that is easy to read, well-structured, and answers user intent directly. Aim for a Flesch Reading Ease score above 60 for general web content.\\n\\nWord count matters too. Articles with 1500 to 2500 words typically rank better in competitive niches because they provide depth and satisfy user queries comprehensively. Always prioritize quality over quantity when creating content for your audience.';\r\n                document.getElementById('pth-seo-title').value = 'Ultimate Text SEO Tool \u2014 Free Online Analyzer';\r\n                document.getElementById('pth-seo-meta').value = 'Free browser-based text and SEO analysis tool. Check word count, readability, keyword density, and Google snippet preview. 100% offline.';\r\n                this.updateStats();\r\n                this.updateSerpPreview();\r\n                this.updateSeoChecklist();\r\n                this.updateKwDensity();\r\n                this.updateTargetProgress();\r\n                this.showToast('Sample loaded!', 'success');\r\n            }\r\n        },\r\n\r\n        \/* \u2500\u2500\u2500 CLEAR ALL \u2500\u2500\u2500 *\/\r\n        clearAll: function () {\r\n            var ids = ['pth-ts-main-input','pth-seo-title','pth-seo-meta',\r\n                'pth-find-input','pth-replace-input','pth-encode-input',\r\n                'pth-csv-input','pth-diff-a','pth-diff-b'];\r\n            ids.forEach(function (id) { var el = document.getElementById(id); if (el) el.value = ''; });\r\n            this.updateStats();\r\n            this.updateSerpPreview();\r\n            this.updateSeoChecklist();\r\n            this.updateKwDensity();\r\n            var kwList = document.getElementById('pth-kw-list');\r\n            if (kwList) kwList.innerHTML = '<div style=\"text-align:center;color:#334155;font-size:13px;padding:14px 0;\">Paste text in the main input above to see keyword density<\/div>';\r\n            var encOut = document.getElementById('pth-encode-output');\r\n            if (encOut) encOut.textContent = 'Result will appear here...';\r\n            this.showToast('Cleared!', 'info');\r\n        },\r\n\r\n        \/* \u2500\u2500\u2500 TOGGLE WIDTH \u2500\u2500\u2500 *\/\r\n        toggleWidth: function () {\r\n            var layout  = document.getElementById('pth-textseo-layout');\r\n            var sidebar = document.getElementById('pth-textseo-sidebar');\r\n            var btn     = document.getElementById('pth-ts-fw-btn');\r\n            if (!layout || !sidebar || !btn) return;\r\n            if (layout.classList.contains('pth-full-width')) {\r\n                layout.classList.remove('pth-full-width');\r\n                sidebar.style.display = '';\r\n                btn.textContent = '\\u29c6 Full Width';\r\n            } else {\r\n                layout.classList.add('pth-full-width');\r\n                sidebar.style.display = 'none';\r\n                btn.textContent = '\\u25e8 Split View';\r\n            }\r\n        },\r\n\r\n        \/* \u2500\u2500\u2500 COPY TEXT \u2500\u2500\u2500 *\/\r\n        copyText: function (text) {\r\n            if (!text) { this.showToast('Nothing to copy!', 'error'); return; }\r\n            var self = this;\r\n            try {\r\n                navigator.clipboard.writeText(text).then(function () {\r\n                    self.showToast('Copied to clipboard!', 'success');\r\n                }).catch(function () { self.fallbackCopy(text); });\r\n            } catch (e) { self.fallbackCopy(text); }\r\n        },\r\n\r\n        fallbackCopy: function (text) {\r\n            var ta = document.createElement('textarea');\r\n            ta.value = text; ta.style.position = 'fixed'; ta.style.top = '-9999px';\r\n            document.body.appendChild(ta); ta.select();\r\n            try { document.execCommand('copy'); this.showToast('Copied!', 'success'); } catch (e) { this.showToast('Copy failed.', 'error'); }\r\n            document.body.removeChild(ta);\r\n        },\r\n\r\n        \/* \u2500\u2500\u2500 FLESCH SCORE \u2500\u2500\u2500 *\/\r\n        fleschScore: function (words, sentences, syllables) {\r\n            if (words === 0 || sentences === 0) return 0;\r\n            return 206.835 - 1.015 * (words \/ sentences) - 84.6 * (syllables \/ words);\r\n        },\r\n\r\n        fleschLabel: function (score) {\r\n            if (score >= 90) return { grade: 'Very Easy (Grade 5)',    desc: 'Easily understood by average 11-year-old student.' };\r\n            if (score >= 80) return { grade: 'Easy (Grade 6)',          desc: 'Conversational English, easily understood.' };\r\n            if (score >= 70) return { grade: 'Fairly Easy (Grade 7)',   desc: 'Standard web content level.' };\r\n            if (score >= 60) return { grade: 'Standard (Grade 8-9)',    desc: 'Ideal for most web articles and blog posts.' };\r\n            if (score >= 50) return { grade: 'Fairly Difficult (Grade 10-12)', desc: 'Best for educated readers.' };\r\n            if (score >= 30) return { grade: 'Difficult (College)',     desc: 'Best for college-educated audience.' };\r\n            return { grade: 'Very Difficult (Professional)', desc: 'Best understood by university graduates.' };\r\n        },\r\n\r\n        countSyllables: function (text) {\r\n            var words = text.toLowerCase().replace(\/[^a-z ]\/g, '').split(\/\\s+\/);\r\n            var count = 0;\r\n            words.forEach(function (word) {\r\n                if (!word) return;\r\n                word = word.replace(\/(?:[^laeiouy]es|ed|[^laeiouy]e)$\/, '');\r\n                word = word.replace(\/^y\/, '');\r\n                var m = word.match(\/[aeiouy]{1,2}\/g);\r\n                count += m ? m.length : 1;\r\n            });\r\n            return count;\r\n        },\r\n\r\n        \/* \u2500\u2500\u2500 HELPERS \u2500\u2500\u2500 *\/\r\n        setEl: function (id, val) {\r\n            var el = document.getElementById(id);\r\n            if (el) el.textContent = val;\r\n        },\r\n\r\n        escHtml: function (str) {\r\n            return String(str)\r\n                .replace(\/&\/g, '&amp;')\r\n                .replace(\/<\/g, '&lt;')\r\n                .replace(\/>\/g, '&gt;');\r\n        },\r\n\r\n        \/* \u2500\u2500\u2500 TOAST \u2500\u2500\u2500 *\/\r\n        showToast: function (msg, type) {\r\n            var c = document.getElementById('pth-textseo-toast');\r\n            if (!c) return;\r\n            var t = document.createElement('div');\r\n            t.className = 'pth-toast-msg pth-toast-' + (type || 'info');\r\n            t.textContent = msg;\r\n            c.appendChild(t);\r\n            setTimeout(function () { if (t.parentNode) t.parentNode.removeChild(t); }, 3500);\r\n        }\r\n    };\r\n\r\n    \/* \u2500\u2500 4-LAYER BOOTSTRAP \u2014 WP\/LiteSpeed safe \u2500\u2500 *\/\r\n    function runInit() {\r\n        if (!window.pthTextSeoApp.initialized &&\r\n            document.getElementById('pth-textseo-wrapper')) {\r\n            window.pthTextSeoApp.initialized = true;\r\n            window.pthTextSeoApp.init();\r\n        }\r\n    }\r\n    runInit();\r\n    if (document.readyState === 'loading') {\r\n        document.addEventListener('DOMContentLoaded', runInit);\r\n    }\r\n    window.addEventListener('load', function () { setTimeout(runInit, 50); });\r\n    if (!window.pthTextSeoApp.initialized && typeof MutationObserver !== 'undefined') {\r\n        var pthObs = new MutationObserver(function () {\r\n            if (document.getElementById('pth-textseo-wrapper')) {\r\n                pthObs.disconnect(); runInit();\r\n            }\r\n        });\r\n        pthObs.observe(document.body || document.documentElement, { childList: true, subtree: true });\r\n        setTimeout(function () { pthObs.disconnect(); }, 10000);\r\n    }\r\n\r\n})();\r\n<\/script>\n\n\n\n<style>\n.pth-container{max-width:1480px;margin:0 auto;padding:0 20px;box-sizing:border-box}\n.pth-feature-wrap{display:grid;grid-template-columns:repeat(auto-fit,minmax(280px,1fr));gap:20px;margin-bottom:40px}\n.pth-feat-box{border:1px solid #e2e8f0;background:#fff;padding:24px;border-radius:12px;box-shadow:0 4px 6px -1px rgba(0,0,0,0.02);transition:all .3s ease}\n.pth-feat-box:hover{border-color:#bfdbfe;transform:translateY(-3px);box-shadow:0 10px 15px -3px rgba(0,0,0,0.05)}\n.pth-feat-title{font-size:1.05rem;font-weight:800;color:#0f172a;margin:0 0 10px;display:flex;align-items:center;gap:10px}\n.pth-feat-text{font-size:.9rem;color:#1e293b;line-height:1.6;margin:0;font-weight:500}\n.pth-steps-wrap{border:1px solid #e2e8f0;background:#fff;padding:40px 30px;border-radius:16px;text-align:center;box-shadow:0 4px 6px -1px rgba(0,0,0,0.02);margin-bottom:40px;width:100%;box-sizing:border-box}\n.pth-steps-title{font-size:1.2rem;font-weight:800;color:#0f172a;text-transform:uppercase;margin:0 0 35px;letter-spacing:1px}\n.pth-steps-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(220px,1fr));gap:30px}\n.pth-step-item{display:flex;flex-direction:column;align-items:center}\n.pth-step-num{width:45px;height:45px;background:#2563eb;color:#fff;border-radius:50%;display:flex;align-items:center;justify-content:center;font-weight:800;font-size:1.2rem;margin-bottom:15px;box-shadow:0 4px 10px rgba(37,99,235,.3)}\n.pth-step-name{font-weight:800;color:#0f172a;margin:0 0 8px;font-size:1rem}\n.pth-step-desc{font-size:.9rem;color:#1e293b;line-height:1.5;margin:0;font-weight:500}\n<\/style>\n<div class=\"pth-container\">\n  <div class=\"pth-feature-wrap\">\n    <div class=\"pth-feat-box\">\n      <p class=\"pth-feat-title\"><span aria-hidden=\"true\">\ud83d\udfe2<\/span> Live SEO &#038; Readability Tracking<\/p>\n      <p class=\"pth-feat-text\">Monitor your exact word count, keyword density, and Flesch readability score in real-time as you type. See exactly how your meta tags will appear on Google Desktop and Mobile.<\/p>\n    <\/div>\n    <div class=\"pth-feat-box\">\n      <p class=\"pth-feat-title\"><span aria-hidden=\"true\">\ud83d\udd35<\/span> 30+ Instant Text Tools<\/p>\n      <p class=\"pth-feat-text\">Access 6 distinct tabs to clean HTML, convert cases, fix messy typography (like double spaces or broken quotes), sort lists, and even run Regex find-and-replace.<\/p>\n    <\/div>\n    <div class=\"pth-feat-box\">\n      <p class=\"pth-feat-title\"><span aria-hidden=\"true\">\ud83d\udfe3<\/span> 100% Offline Processing<\/p>\n      <p class=\"pth-feat-text\">Your private drafts and data never leave your device. The entire studio runs locally in your browser, guaranteeing total privacy and zero server lag.<\/p>\n    <\/div>\n  <\/div>\n  <div class=\"pth-steps-wrap\">\n    <p class=\"pth-steps-title\">How to Use the Studio<\/p>\n    <div class=\"pth-steps-grid\">\n      <div class=\"pth-step-item\">\n        <div class=\"pth-step-num\" aria-hidden=\"true\">1<\/div>\n        <p class=\"pth-step-name\">Paste Your Text<\/p>\n        <p class=\"pth-step-desc\">Drop your draft, list, or messy data directly into the Main Text Input area.<\/p>\n      <\/div>\n      <div class=\"pth-step-item\">\n        <div class=\"pth-step-num\" aria-hidden=\"true\">2<\/div>\n        <p class=\"pth-step-name\">Pick a Tab<\/p>\n        <p class=\"pth-step-desc\">Switch between SEO, Transform, Content, Lists, Typography, or Chars tabs based on your task.<\/p>\n      <\/div>\n      <div class=\"pth-step-item\">\n        <div class=\"pth-step-num\" aria-hidden=\"true\">3<\/div>\n        <p class=\"pth-step-name\">Apply the Fix<\/p>\n        <p class=\"pth-step-desc\">Click any action button\u2014like &#8216;Remove Empty Lines&#8217; or &#8216;Convert to Sentence case&#8217;\u2014to instantly update the text.<\/p>\n      <\/div>\n      <div class=\"pth-step-item\">\n        <div class=\"pth-step-num\" aria-hidden=\"true\">4<\/div>\n        <p class=\"pth-step-name\">Copy or Export<\/p>\n        <p class=\"pth-step-desc\">Use the Quick Actions bar to copy your final result or download it as a clean .txt file.<\/p>\n      <\/div>\n    <\/div>\n  <\/div>\n<\/div>\n\n\n\n<p class=\"wp-block-paragraph\">Last updated: July 2026<\/p>\n\n\n\n<h2 id=\"\ud83d\udd34-managing-heavy-content-and-ai-prompts\" class=\"wp-block-heading\">\ud83d\udd34 <strong>Managing Heavy Content and AI Prompts<\/strong><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Tracking complicated formatting jobs or long content pipelines gets messy when bouncing between countless online tool tabs. Imagine you are setting up scripts for YouTube Sinhala ghost story videos utilizing AI generation. You know your drafts require at least 1200 words to maintain optimal viewer retention, and you are also trying to manage extensive text strings for recurring character prompts\u2014maintaining structural details for specific facial features, environments, and costume changes across varying scenes to ensure the visual AI output remains consistent.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">With this ultimate text and seo studio workspace, you can insert your master document blocks into the primary text layout area. By heading into the Word Count Target section within the Content tab, the system monitors your 1200-word production goal instantly via a green progress bar. When you need to refine recurring character outfits or modify tags inside 50 distinct prompt lines, navigating to the Transform panel lets you initialize Regex mode in the Find &amp; Replace tool to update matching blocks instantly across the layout.<\/p>\n\n\n\n<h2 id=\"\ud83d\udfe1-validating-readability-scores-and-meta-configurations\" class=\"wp-block-heading\">\ud83d\udfe1 <strong>Validating Readability Scores and Meta Configurations<\/strong><\/h2>\n\n\n<figure class=\"pth-article-figure pth-img-left\" style=\"float:left; width:700px; max-width:100%; margin:4px 28px 16px 0; clear:left;\"><img decoding=\"async\" src=\"https:\/\/schoolict.net\/tools\/wp-content\/uploads\/2026\/07\/text-seo-studio-interface-800x447.jpeg\" alt=\"A user interface displaying a text input area, readability gauge, word count target progress bar, and small colorful buttons for text transformation tools\" width=\"700\" height=\"394\" loading=\"lazy\" data-no-lazy=\"1\" class=\"pth-article-img\" style=\"width:100%;height:auto;display:block;border-radius:10px;border:1px solid #e2e8f0;\"><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Search crawlers closely observe text complexity patterns. Within the SEO workspace tab, the scoring card monitors structural parameters to estimate a real-time value using the absolute <a href=\"https:\/\/en.wikipedia.org\/wiki\/Flesch%E2%80%93Kincaid_readability_tests\" rel=\"noreferrer noopener\" target=\"_blank\">Flesch Reading Ease formula<\/a>. If your pasted paragraph hits a restrictive level like 35, it flags that your sentence setups are too dense or use overly complex syllables. Segmenting long 30-word sentences into punchier blocks drops word weight and pushes metrics into the optimal 60+ index.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">For creators configuring structural tags on web entries, the interactive Google Snippet Preview displays visual rendering behaviors for both Desktop and Mobile setups. A frequent mistake is creating an extended title that collapses abruptly on search engines. The built-in dynamic gauge turns red the second your input crosses the 60-character layout dimension, avoiding visibility issues once indexed. You can also explore our dedicated tool for further tag building, or read our <a href=\"https:\/\/schoolict.net\/tools\/free-word-counter-and-text-case-converter-article\/\">guide explaining<\/a> in depth.<\/p>\n\n\n\n<h3 id=\"\ud83d\udfe2-functional-boundaries-and-limitations\" class=\"wp-block-heading\">\ud83d\udfe2 <strong>Functional Boundaries and Limitations<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Because this text utility studio runs exclusively client-side to ensure maximum privacy and zero latency, there are explicit operational parameters to consider:<\/p>\n\n\n\n<h4 id=\"regex-requires-exact-syntax\" class=\"wp-block-heading\">Regex Requires Exact Syntax<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">If you check &#8220;Regex mode&#8221; in the Find &amp; Replace tool and type a broken expression, the tool will gracefully catch the error and show a red toast notification, but it won&#8217;t auto-correct your pattern. You must use standard JavaScript regex syntax.<\/p>\n\n\n\n<h4 id=\"the-serp-preview-is-static\" class=\"wp-block-heading\">The SERP Preview is Static<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">The dynamic preview system serves as a static visual guide matching Google layout grids. It does not load remote index databases or pull live competitor rankings from the web.<\/p>\n\n\n\n<style>\n.pth-faq-section{margin:50px auto 40px;font-family:inherit;max-width:1480px;padding:0 20px;box-sizing:border-box}\n.pth-faq-header{font-size:1.8rem;font-weight:800;color:#0f172a;margin-bottom:25px;border-bottom:2px solid #e2e8f0;padding-bottom:10px;display:flex;align-items:center;gap:10px}\n.pth-faq-grid{display:grid;grid-template-columns:1fr;gap:20px}\n@media(min-width:768px){.pth-faq-grid{grid-template-columns:repeat(2,1fr)}}\n@media(min-width:1024px){.pth-faq-grid{grid-template-columns:repeat(3,1fr)}}\n.pth-faq-card{background:#f8fafc;padding:24px;border-radius:12px;border:1px solid #e2e8f0;transition:transform .2s ease;break-inside:avoid}\n.pth-faq-card:hover{transform:translateY(-3px);box-shadow:0 4px 12px rgba(0,0,0,.05)}\n.pth-faq-q{color:#0f172a;font-size:1rem;font-weight:700;margin:0 0 12px;line-height:1.4}\n.pth-faq-a{margin:0;font-size:.95rem;color:#1e293b;line-height:1.6;font-weight:500}\n<\/style>\n<div class=\"pth-faq-section\">\n  <div class=\"pth-faq-header\">\u2753 Frequently Asked Questions<\/div>\n  <div class=\"pth-faq-grid\">\n    <div class=\"pth-faq-card\">\n      <p class=\"pth-faq-q\">Are my pasted texts monitored or logged to an external database?<\/p>\n      <p class=\"pth-faq-a\">No, never. The tool environment utilizes standard JavaScript to evaluate your text purely inside temporary local memory. No text string values ever leave your physical device.<\/p>\n    <\/div>\n    <div class=\"pth-faq-card\">\n      <p class=\"pth-faq-q\">How does the Word Count Target adjust metrics?<\/p>\n      <p class=\"pth-faq-a\">When an explicit numeric limit (like 1200) is logged under the Content options, the application calculates incoming word lengths against your target and updates a live percentage progress bar.<\/p>\n    <\/div>\n    <div class=\"pth-faq-card\">\n      <p class=\"pth-faq-q\">Can I restructure multi-line list inputs into separated rows?<\/p>\n      <p class=\"pth-faq-a\">Yes. By executing commands within the Lists tab, you can instantly inject bullet symbols, generate sequential number lines, or parse comma-separated raw inputs back into a vertical list.<\/p>\n    <\/div>\n    <div class=\"pth-faq-card\">\n      <p class=\"pth-faq-q\">What formatting changes occur when triggering Typography Fixers?<\/p>\n      <p class=\"pth-faq-a\">The module identifies loose code symbols, converting generic straight quotes to smart curly quotes, merging custom double dashes to true em dashes, and stripping accidental double spaces.<\/p>\n    <\/div>\n    <div class=\"pth-faq-card\">\n      <p class=\"pth-faq-q\">Why does the Keyword Density display ignore certain words?<\/p>\n      <p class=\"pth-faq-a\">The system contains a stop-words dictionary that automatically drops structural words (like &#8216;the&#8217;, &#8216;for&#8217;, and &#8216;with&#8217;) to ensure you only see the actual, meaningful keywords you are targeting.<\/p>\n    <\/div>\n    <div class=\"pth-faq-card\">\n      <p class=\"pth-faq-q\">How does the integrated Text Diff Checker work?<\/p>\n      <p class=\"pth-faq-a\">It maps corresponding line blocks from an original text (Text A) and a modified text (Text B) side-by-side, color-coding new additions in green and deletions in red.<\/p>\n    <\/div>\n  <\/div>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Free Word Counter, Text Case Converter &amp; Keyword Analyzer Instantly count words, analyze keyword density, check readability, convert text cases, and clean formatting with our 100% free, offline SEO text utility. \ud83d\udfe2 Live SEO &#038; Readability Tracking Monitor your exact word count, keyword density, and Flesch readability score in real-time as you type. See exactly &#8230; <a title=\"Free \u00a0Word Counter and Text Case Converter &amp; Keyword Analyzer\" class=\"read-more\" href=\"https:\/\/schoolict.net\/tools\/free-word-counter-and-text-case-converter\/\" aria-label=\"Read more about Free \u00a0Word Counter and Text Case Converter &amp; Keyword Analyzer\">Read more<\/a><\/p>\n","protected":false},"author":1,"featured_media":510,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-497","page","type-page","status-publish","has-post-thumbnail"],"_links":{"self":[{"href":"https:\/\/schoolict.net\/tools\/wp-json\/wp\/v2\/pages\/497","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/schoolict.net\/tools\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/schoolict.net\/tools\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/schoolict.net\/tools\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/schoolict.net\/tools\/wp-json\/wp\/v2\/comments?post=497"}],"version-history":[{"count":4,"href":"https:\/\/schoolict.net\/tools\/wp-json\/wp\/v2\/pages\/497\/revisions"}],"predecessor-version":[{"id":6612,"href":"https:\/\/schoolict.net\/tools\/wp-json\/wp\/v2\/pages\/497\/revisions\/6612"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/schoolict.net\/tools\/wp-json\/wp\/v2\/media\/510"}],"wp:attachment":[{"href":"https:\/\/schoolict.net\/tools\/wp-json\/wp\/v2\/media?parent=497"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}