openvibers/openvibe.tools Commits
Text/Logo pages: shared navbar and footer on every page
Changes
@@@ -74,18 +74,11 @@</ul></div>-- <footer class="site-footer">-- <div class="footer-links">-- <a href="https://text.openvibe.tools">Text.OpenVibe Hub</a>-- <a href="https://fancy.openvibe.tools">Fancy Text</a>-- <a href="https://zalgo.openvibe.tools">Zalgo Text</a>-- <a href="https://symbols.openvibe.tools">Symbols</a>-- </div>-- <p>© 2025 OpenVibe</p>-- </footer>++ <div id="ov-footer" data-related="Fancy Text|https://fancy.openvibe.tools;Zalgo Text|https://zalgo.openvibe.tools;Symbols|https://symbols.openvibe.tools"></div></div><script src="https://openvibe.network/shared/navbar.js"></script>++ <script src="https://openvibe.network/shared/footer.js"></script><script src="https://openvibe.network/shared/notification-ui.js"></script><script src="https://openvibe.network/shared/account-switcher.js"></script><script src="/js/text-engine.js"></script>@@@ -102,18 +102,11 @@</div></div>-- <footer class="site-footer">-- <div class="footer-links">-- <a href="https://logo.openvibe.tools">Logo Hub</a>-- <a href="https://title.openvibe.tools">Title Cards</a>-- <a href="https://wordmark.openvibe.tools">Wordmark</a>-- <a href="https://text.openvibe.tools">Text.OpenVibe</a>-- </div>-- <p>© 2025 OpenVibe</p>-- </footer>++ <div id="ov-footer" data-related="Title Cards|https://title.openvibe.tools;Wordmark|https://wordmark.openvibe.tools"></div></div><script src="https://openvibe.network/shared/navbar.js"></script>++ <script src="https://openvibe.network/shared/footer.js"></script><script src="https://openvibe.network/shared/notification-ui.js"></script><script src="https://openvibe.network/shared/account-switcher.js"></script><script src="/js/logo-engine.js"></script>@@@ -48,17 +48,11 @@<div id="binOutput" class="output-box" style="display:none;"></div></div>-- <footer class="site-footer">-- <div class="footer-links">-- <a href="https://text.openvibe.tools">Text.OpenVibe Hub</a>-- <a href="https://morse.openvibe.tools">Morse Code</a>-- <a href="https://escape.openvibe.tools">Escape / Unescape</a>-- </div>-- <p>© 2025 OpenVibe</p>-- </footer>++ <div id="ov-footer" data-related="Morse Code|https://morse.openvibe.tools;Escape / Unescape|https://escape.openvibe.tools"></div></div><script src="https://openvibe.network/shared/navbar.js"></script>++ <script src="https://openvibe.network/shared/footer.js"></script><script src="https://openvibe.network/shared/notification-ui.js"></script><script src="https://openvibe.network/shared/account-switcher.js"></script><script src="/js/text-engine.js"></script>@@@ -44,17 +44,11 @@</div></div>-- <footer class="site-footer">-- <div class="footer-links">-- <a href="https://text.openvibe.tools">Text.OpenVibe Hub</a>-- <a href="https://nickname.openvibe.tools">Nickname Generator</a>-- <a href="https://fancy.openvibe.tools">Fancy Text</a>-- </div>-- <p>© 2025 OpenVibe</p>-- </footer>++ <div id="ov-footer" data-related="Nickname Generator|https://nickname.openvibe.tools;Fancy Text|https://fancy.openvibe.tools"></div></div><script src="https://openvibe.network/shared/navbar.js"></script>++ <script src="https://openvibe.network/shared/footer.js"></script><script src="https://openvibe.network/shared/notification-ui.js"></script><script src="https://openvibe.network/shared/account-switcher.js"></script><script src="/js/text-engine.js"></script>@@@ -50,17 +50,11 @@</div></div>-- <footer class="site-footer">-- <div class="footer-links">-- <a href="https://text.openvibe.tools">Text.OpenVibe Hub</a>-- <a href="https://morse.openvibe.tools">Morse Code</a>-- <a href="https://binary.openvibe.tools">Binary</a>-- </div>-- <p>© 2025 OpenVibe</p>-- </footer>++ <div id="ov-footer" data-related="Morse Code|https://morse.openvibe.tools;Binary|https://binary.openvibe.tools"></div></div><script src="https://openvibe.network/shared/navbar.js"></script>++ <script src="https://openvibe.network/shared/footer.js"></script><script src="https://openvibe.network/shared/notification-ui.js"></script><script src="https://openvibe.network/shared/account-switcher.js"></script><script src="/js/text-engine.js"></script>@@@ -39,17 +39,11 @@<div id="output" class="output-grid"></div>-- <footer class="site-footer">-- <div class="footer-links">-- <a href="https://text.openvibe.tools">Text.OpenVibe Hub</a>-- <a href="https://fancy.openvibe.tools">Fancy Text</a>-- <a href="https://symbols.openvibe.tools">Symbols</a>-- </div>-- <p>© 2025 OpenVibe</p>-- </footer>++ <div id="ov-footer" data-related="Fancy Text|https://fancy.openvibe.tools;Symbols|https://symbols.openvibe.tools"></div></div><script src="https://openvibe.network/shared/navbar.js"></script>++ <script src="https://openvibe.network/shared/footer.js"></script><script src="https://openvibe.network/shared/notification-ui.js"></script><script src="https://openvibe.network/shared/account-switcher.js"></script><script src="/js/text-engine.js"></script>@@@ -39,18 +39,11 @@<div id="output" class="output-grid" style="grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));"></div>-- <footer class="site-footer">-- <div class="footer-links">-- <a href="https://text.openvibe.tools">Text.OpenVibe Hub</a>-- <a href="https://fancy.openvibe.tools">Fancy Text</a>-- <a href="https://clean.openvibe.tools">Text Cleaner</a>-- <a href="https://count.openvibe.tools">Text Counter</a>-- </div>-- <p>© 2025 OpenVibe</p>-- </footer>++ <div id="ov-footer" data-related="Fancy Text|https://fancy.openvibe.tools;Text Cleaner|https://clean.openvibe.tools;Text Counter|https://count.openvibe.tools"></div></div><script src="https://openvibe.network/shared/navbar.js"></script>++ <script src="https://openvibe.network/shared/footer.js"></script><script src="https://openvibe.network/shared/notification-ui.js"></script><script src="https://openvibe.network/shared/account-switcher.js"></script><script src="/js/text-engine.js"></script>@@@ -58,17 +58,11 @@</div></div>-- <footer class="site-footer">-- <div class="footer-links">-- <a href="https://text.openvibe.tools">Text.OpenVibe Hub</a>-- <a href="https://count.openvibe.tools">Text Counter</a>-- <a href="https://escape.openvibe.tools">Escape / Unescape</a>-- </div>-- <p>© 2025 OpenVibe</p>-- </footer>++ <div id="ov-footer" data-related="Text Counter|https://count.openvibe.tools;Escape / Unescape|https://escape.openvibe.tools"></div></div><script src="https://openvibe.network/shared/navbar.js"></script>++ <script src="https://openvibe.network/shared/footer.js"></script><script src="https://openvibe.network/shared/notification-ui.js"></script><script src="https://openvibe.network/shared/account-switcher.js"></script><script src="/js/text-engine.js"></script>@@@ -70,17 +70,11 @@ A brand new line was added.</textarea><div class="diff-output" id="output"></div></div>-- <footer class="site-footer">-- <div class="footer-links">-- <a href="https://text.openvibe.tools">Text.OpenVibe Hub</a>-- <a href="https://clean.openvibe.tools">Clean Text</a>-- <a href="https://sort.openvibe.tools">Sort Lines</a>-- </div>-- <p>© 2025 OpenVibe</p>-- </footer>++ <div id="ov-footer" data-related="Clean Text|https://clean.openvibe.tools;Sort Lines|https://sort.openvibe.tools"></div></div><script src="https://openvibe.network/shared/navbar.js"></script>++ <script src="https://openvibe.network/shared/footer.js"></script><script src="https://openvibe.network/shared/notification-ui.js"></script><script src="https://openvibe.network/shared/account-switcher.js"></script><script src="/js/shared.js"></script>@@@ -37,18 +37,11 @@</div></div>-- <footer class="site-footer">-- <div class="footer-links">-- <a href="https://text.openvibe.tools">Text.OpenVibe Hub</a>-- <a href="https://clean.openvibe.tools">Text Cleaner</a>-- <a href="https://sort.openvibe.tools">Sort Lines</a>-- <a href="https://case.openvibe.tools">Case Converter</a>-- </div>-- <p>© 2025 OpenVibe</p>-- </footer>++ <div id="ov-footer" data-related="Text Cleaner|https://clean.openvibe.tools;Sort Lines|https://sort.openvibe.tools;Case Converter|https://case.openvibe.tools"></div></div><script src="https://openvibe.network/shared/navbar.js"></script>++ <script src="https://openvibe.network/shared/footer.js"></script><script src="https://openvibe.network/shared/notification-ui.js"></script><script src="https://openvibe.network/shared/account-switcher.js"></script><script src="/js/text-engine.js"></script>@@@ -49,8 +49,7 @@ body {color: var(--text-primary);line-height: 1.6;min-height: 100vh;-- padding-top: var(--navbar-height);-- overflow-x: hidden;++ overflow-x: hidden; /* the shared navbar is sticky and in flow — no reserved top padding */}a { color: var(--accent); text-decoration: none; transition: color var(--transition); }@@@ -698,6 +697,9 @@ textarea.large {@keyframes toastOut { from { opacity: 1; } to { opacity: 0; transform: translateY(10px); } }/* ── Footer ────────────────────────────────────────────────── */++/* The footer itself is the shared OpenVibeFooter (mounted on #ov-footer by shared.js);++ .site-note is the one-line disclaimer some pages keep above it. */++.site-note { text-align: center; padding: 24px 24px 0; color: var(--text-muted); font-size: 0.82rem; margin-top: 40px; border-top: 1px solid var(--border); }.site-footer {text-align: center;padding: 40px 24px;@@@ -48,17 +48,11 @@<div class="escape-grid" id="grid"></div>-- <footer class="site-footer">-- <div class="footer-links">-- <a href="https://text.openvibe.tools">Text.OpenVibe Hub</a>-- <a href="https://unicode.openvibe.tools">Unicode Inspector</a>-- <a href="https://clean.openvibe.tools">Text Cleaner</a>-- </div>-- <p>© 2025 OpenVibe</p>-- </footer>++ <div id="ov-footer" data-related="Unicode Inspector|https://unicode.openvibe.tools;Text Cleaner|https://clean.openvibe.tools"></div></div><script src="https://openvibe.network/shared/navbar.js"></script>++ <script src="https://openvibe.network/shared/footer.js"></script><script src="https://openvibe.network/shared/notification-ui.js"></script><script src="https://openvibe.network/shared/account-switcher.js"></script><script src="/js/text-engine.js"></script>@@@ -43,19 +43,11 @@<div id="output" class="output-grid"></div>-- <footer class="site-footer">-- <div class="footer-links">-- <a href="https://text.openvibe.tools">Text.OpenVibe Hub</a>-- <a href="https://zalgo.openvibe.tools">Zalgo Text</a>-- <a href="https://ascii.openvibe.tools">ASCII Art</a>-- <a href="https://case.openvibe.tools">Case Converter</a>-- <a href="https://logo.openvibe.tools">Logo Maker</a>-- </div>-- <p>© 2025 OpenVibe</p>-- </footer>++ <div id="ov-footer" data-related="Zalgo Text|https://zalgo.openvibe.tools;ASCII Art|https://ascii.openvibe.tools;Case Converter|https://case.openvibe.tools"></div></div><script src="https://openvibe.network/shared/navbar.js"></script>++ <script src="https://openvibe.network/shared/footer.js"></script><script src="https://openvibe.network/shared/notification-ui.js"></script><script src="https://openvibe.network/shared/account-switcher.js"></script><script src="/js/text-engine.js"></script>@@@ -154,7 +154,7 @@@media print {.printable { display: block !important; }.tool-wrap { padding: 0; }-- .site-footer, .pill-tabs, .alert-banner { display: none; }++ .ovf, .site-note, .pill-tabs, .alert-banner { display: none; }}.tab-content { display: none; }@@@ -464,18 +464,12 @@</div></div>-- <footer class="site-footer">-- <div class="footer-links">-- <a href="https://text.openvibe.tools">Text.OpenVibe Hub</a>-- <a href="https://peso.openvibe.tools">OpenVibePeso</a>-- <a href="https://spanish.openvibe.tools">OpenVibeSpanish</a>-- <a href="https://slang.openvibe.tools">OpenVibeSlang</a>-- </div>-- <p>© 2025 OpenVibe — This is informational only, not legal advice.</p>-- </footer>++ <p class="site-note">This is informational only, not legal advice.</p>++ <div id="ov-footer" data-related="OpenVibePeso|https://peso.openvibe.tools;OpenVibeSpanish|https://spanish.openvibe.tools;OpenVibeSlang|https://slang.openvibe.tools"></div></div><script src="https://openvibe.network/shared/navbar.js"></script>++ <script src="https://openvibe.network/shared/footer.js"></script><script src="https://openvibe.network/shared/notification-ui.js"></script><script src="https://openvibe.network/shared/account-switcher.js"></script><script src="/js/shared.js"></script>@@@ -223,25 +223,17 @@</div></div>-- <footer class="site-footer">-- <div class="footer-links">-- <a href="https://openvibe.network">openvibe.tools</a>-- <a href="https://openvibe.live">openvibe.live</a>-- <a href="https://openvibe.games">openvibe.games</a>-- <a href="https://img.openvibe.tools">Img.OpenVibe</a>-- <a href="https://audio.openvibe.tools">Audio.OpenVibe</a>-- </div>-- <p>© OpenVibe — tools for the internet, run by its community.</p>-- </footer>++ <div id="ov-footer"></div></div><script src="https://openvibe.network/shared/navbar.js"></script>++ <script src="https://openvibe.network/shared/footer.js"></script><script src="https://openvibe.network/shared/notification-ui.js"></script><script src="https://openvibe.network/shared/account-switcher.js"></script><script src="/js/text-engine.js"></script><script src="/js/shared.js"></script><script>-- OpenVibeUI.initPage();++ OpenVibeUI.initPage({ footer: 'full' });const input = document.getElementById('quickInput');const preview = document.getElementById('quickPreview');@@@ -129,9 +129,107 @@ async function shareText(text, title = 'Text.OpenVibe') {}}++// ── Shared chrome: navbar + footer ───────────────────────────++// Every page loads navbar.js / footer.js from openvibe.network; this is the one place that++// boots them, so a page only needs a <div id="ov-footer" data-related="Name|url;…"> mount.++const NETWORK = 'https://openvibe.network';++const SILENT_LOGIN = 'https://openvibe.tools/auth/login?silent=1&next={url}';++const LOGO_HOSTS = /^(logo|title|wordmark|textlogo|transparent|badge|sticker|thumbnail|cover|channelart|watermark|neon|overlay|lowerthird)\./;++++// The site's own tool list — the footer columns on the hubs, the "more tools" row elsewhere.++const TEXT_TOOLS = [++ { name: 'Fancy Text', url: 'https://fancy.openvibe.tools' },++ { name: 'Zalgo Text', url: 'https://zalgo.openvibe.tools' },++ { name: 'ASCII Art', url: 'https://ascii.openvibe.tools' },++ { name: 'Symbols', url: 'https://symbols.openvibe.tools' },++ { name: 'Kaomoji', url: 'https://kaomoji.openvibe.tools' },++ { name: 'Case Converter', url: 'https://case.openvibe.tools' },++ { name: 'Text Counter', url: 'https://count.openvibe.tools' },++ { name: 'JSON Formatter', url: 'https://json.openvibe.tools' },++ { name: 'Markdown Preview', url: 'https://markdown.openvibe.tools' },++ { name: 'Diff Checker', url: 'https://compare.openvibe.tools' },++ { name: 'Bio Generator', url: 'https://bio.openvibe.tools' },++];++const LOGO_TOOLS = [++ { name: 'Title Cards', url: 'https://title.openvibe.tools' },++ { name: 'Wordmark', url: 'https://wordmark.openvibe.tools' },++ { name: 'Transparent PNG', url: 'https://transparent.openvibe.tools' },++ { name: 'Badges & Stickers', url: 'https://badge.openvibe.tools' },++ { name: 'Thumbnail Text', url: 'https://thumbnail.openvibe.tools' },++ { name: 'Watermark', url: 'https://watermark.openvibe.tools' },++];++++function getCookie(name) {++ const m = document.cookie.match(new RegExp('(?:^|; )' + name + '=([^;]*)'));++ return m ? decodeURIComponent(m[1]) : null;++}++++function currentService() {++ return LOGO_HOSTS.test(location.hostname) ? 'logo' : 'text';++}++++/** The tool's name for history: "Case Converter — … | case.openvibe.tools" → "Case Converter — …". */++function pageTitle() {++ const h1 = document.querySelector('.page-header h1, .hub-hero h1');++ const fromH1 = h1 ? h1.textContent.replace(/\s+/g, ' ').trim() : '';++ return fromH1 || document.title.split('|')[0].trim();++}++++function initNavbar() {++ if (typeof OpenVibeNavbar === 'undefined') return;++ const token = getCookie('ov_token') || localStorage.getItem('ov_token');++ try {++ OpenVibeNavbar.init({++ service: currentService(),++ apiBase: NETWORK,++ token,++ history: { type: 'tool', title: pageTitle() },++ silentLogin: SILENT_LOGIN,++ });++ } catch (e) { /* the page works without the navbar */ }++ if (typeof OpenVibeAccountSwitcher !== 'undefined') {++ try { OpenVibeAccountSwitcher.init({ apiBase: NETWORK }); } catch (e) { /* optional */ }++ }++ if (token && typeof OpenVibeNotifications !== 'undefined') {++ try {++ OpenVibeNotifications.init({ token, apiBase: NETWORK });++ const mount = OpenVibeNavbar.getBellMount && OpenVibeNavbar.getBellMount();++ if (mount) { const bell = OpenVibeNotifications.createBell(); if (bell) mount.appendChild(bell); }++ } catch (e) { /* optional */ }++ }++}++++/** Footer: related tools from the mount's data-related, then the site's own tool list. */++function initFooter(opts = {}) {++ if (typeof OpenVibeFooter === 'undefined') return;++ const mount = document.getElementById('ov-footer');++ if (!mount) return;++ const related = (mount.dataset.related || '').split(';').map(s => s.trim()).filter(Boolean).map(pair => {++ const [name, url] = pair.split('|');++ return { name: (name || '').trim(), url: (url || '').trim() };++ }).filter(l => l.name && l.url);++ const service = currentService();++ const links = [];++ if (related.length) links.push({ heading: 'Related tools', items: related });++ if (service === 'logo') {++ links.push({ heading: 'Logo tools', items: LOGO_TOOLS });++ links.push({ heading: 'Text tools', items: TEXT_TOOLS.slice(0, 6) });++ } else {++ links.push({ heading: 'Text tools', items: TEXT_TOOLS });++ links.push({ heading: 'Logo tools', items: LOGO_TOOLS });++ }++ try {++ OpenVibeFooter.init({ service, variant: opts.variant || 'compact', links, apiBase: NETWORK, mount: '#ov-footer' });++ } catch (e) { /* optional */ }++}++// ── Common page init ─────────────────────────────────────────--// Called on every page to set up keyboard shortcuts, etc.--function initPage() {++// Called on every page: shared chrome, keyboard shortcuts, live-tool affordances.++// opts.footer — 'full' on the hub pages, 'compact' (default) on tool pages++function initPage(opts = {}) {++ initNavbar();++ initFooter({ variant: opts.footer });++// "/" key focuses input (when not already in a field)document.addEventListener('keydown', (e) => {if (e.key === '/' && !['INPUT', 'TEXTAREA', 'SELECT'].includes(document.activeElement?.tagName)) {@@@ -67,17 +67,11 @@</div></div>-- <footer class="site-footer">-- <div class="footer-links">-- <a href="https://text.openvibe.tools">Text.OpenVibe Hub</a>-- <a href="https://escape.openvibe.tools">Escape / Unescape</a>-- <a href="https://markdown.openvibe.tools">Markdown Preview</a>-- </div>-- <p>© 2025 OpenVibe</p>-- </footer>++ <div id="ov-footer" data-related="Escape / Unescape|https://escape.openvibe.tools;Markdown Preview|https://markdown.openvibe.tools"></div></div><script src="https://openvibe.network/shared/navbar.js"></script>++ <script src="https://openvibe.network/shared/footer.js"></script><script src="https://openvibe.network/shared/notification-ui.js"></script><script src="https://openvibe.network/shared/account-switcher.js"></script><script src="/js/shared.js"></script>@@@ -29,18 +29,11 @@<div id="categories"></div>-- <footer class="site-footer">-- <div class="footer-links">-- <a href="https://text.openvibe.tools">Text.OpenVibe Hub</a>-- <a href="https://symbols.openvibe.tools">Symbols</a>-- <a href="https://bio.openvibe.tools">Bio Generator</a>-- <a href="https://fancy.openvibe.tools">Fancy Text</a>-- </div>-- <p>© 2025 OpenVibe</p>-- </footer>++ <div id="ov-footer" data-related="Symbols|https://symbols.openvibe.tools;Bio Generator|https://bio.openvibe.tools;Fancy Text|https://fancy.openvibe.tools"></div></div><script src="https://openvibe.network/shared/navbar.js"></script>++ <script src="https://openvibe.network/shared/footer.js"></script><script src="https://openvibe.network/shared/notification-ui.js"></script><script src="https://openvibe.network/shared/account-switcher.js"></script><script src="/js/text-engine.js"></script>@@@ -120,25 +120,17 @@</div></div>-- <footer class="site-footer">-- <div class="footer-links">-- <a href="https://openvibe.network">openvibe.tools</a>-- <a href="https://text.openvibe.tools">Text.OpenVibe</a>-- <a href="https://img.openvibe.tools">Img.OpenVibe</a>-- <a href="https://audio.openvibe.tools">Audio.OpenVibe</a>-- <a href="https://openvibe.live">OpenVibe.Live</a>-- </div>-- <p>© OpenVibe — tools for the internet, run by its community.</p>-- </footer>++ <div id="ov-footer"></div></div><script src="https://openvibe.network/shared/navbar.js"></script>++ <script src="https://openvibe.network/shared/footer.js"></script><script src="https://openvibe.network/shared/notification-ui.js"></script><script src="https://openvibe.network/shared/account-switcher.js"></script><script src="/js/logo-engine.js"></script><script src="/js/shared.js"></script><script>-- OpenVibeUI.initPage();++ OpenVibeUI.initPage({ footer: 'full' });const input = document.getElementById('quickInput');const canvas = document.getElementById('previewCanvas');const presetGrid = document.getElementById('presetGrid');@@@ -88,17 +88,11 @@ Made with ♥ by the OpenVibe Network</textarea></div></div>-- <footer class="site-footer">-- <div class="footer-links">-- <a href="https://text.openvibe.tools">Text.OpenVibe Hub</a>-- <a href="https://escape.openvibe.tools">Escape / Unescape</a>-- <a href="https://count.openvibe.tools">Text Counter</a>-- </div>-- <p>© 2025 OpenVibe</p>-- </footer>++ <div id="ov-footer" data-related="Escape / Unescape|https://escape.openvibe.tools;Text Counter|https://count.openvibe.tools"></div></div><script src="https://openvibe.network/shared/navbar.js"></script>++ <script src="https://openvibe.network/shared/footer.js"></script><script src="https://openvibe.network/shared/notification-ui.js"></script><script src="https://openvibe.network/shared/account-switcher.js"></script><script src="/js/shared.js"></script>@@@ -50,17 +50,11 @@</div></div>-- <footer class="site-footer">-- <div class="footer-links">-- <a href="https://text.openvibe.tools">Text.OpenVibe Hub</a>-- <a href="https://binary.openvibe.tools">Binary</a>-- <a href="https://fancy.openvibe.tools">Fancy Text</a>-- </div>-- <p>© 2025 OpenVibe</p>-- </footer>++ <div id="ov-footer" data-related="Binary|https://binary.openvibe.tools;Fancy Text|https://fancy.openvibe.tools"></div></div><script src="https://openvibe.network/shared/navbar.js"></script>++ <script src="https://openvibe.network/shared/footer.js"></script><script src="https://openvibe.network/shared/notification-ui.js"></script><script src="https://openvibe.network/shared/account-switcher.js"></script><script src="/js/text-engine.js"></script>@@@ -43,17 +43,11 @@</div></div>-- <footer class="site-footer">-- <div class="footer-links">-- <a href="https://text.openvibe.tools">Text.OpenVibe Hub</a>-- <a href="https://bio.openvibe.tools">Bio Generator</a>-- <a href="https://fancy.openvibe.tools">Fancy Text</a>-- </div>-- <p>© 2025 OpenVibe</p>-- </footer>++ <div id="ov-footer" data-related="Bio Generator|https://bio.openvibe.tools;Fancy Text|https://fancy.openvibe.tools"></div></div><script src="https://openvibe.network/shared/navbar.js"></script>++ <script src="https://openvibe.network/shared/footer.js"></script><script src="https://openvibe.network/shared/notification-ui.js"></script><script src="https://openvibe.network/shared/account-switcher.js"></script><script src="/js/text-engine.js"></script>@@@ -178,18 +178,11 @@</p></div>-- <footer class="site-footer">-- <div class="footer-links">-- <a href="https://ice.openvibe.tools">ICE Alerts</a>-- <a href="https://spanish.openvibe.tools">OpenVibeSpanish</a>-- <a href="https://slang.openvibe.tools">OpenVibeSlang</a>-- <a href="https://text.openvibe.tools">Text.OpenVibe Hub</a>-- </div>-- <p>© 2025 OpenVibe</p>-- </footer>++ <div id="ov-footer" data-related="ICE Alerts|https://ice.openvibe.tools;OpenVibeSpanish|https://spanish.openvibe.tools;OpenVibeSlang|https://slang.openvibe.tools"></div></div><script src="https://openvibe.network/shared/navbar.js"></script>++ <script src="https://openvibe.network/shared/footer.js"></script><script src="https://openvibe.network/shared/notification-ui.js"></script><script src="https://openvibe.network/shared/account-switcher.js"></script><script src="/js/shared.js"></script>@@@ -39,17 +39,11 @@<div id="output" class="output-grid"></div>-- <footer class="site-footer">-- <div class="footer-links">-- <a href="https://text.openvibe.tools">Text.OpenVibe Hub</a>-- <a href="https://fancy.openvibe.tools">Fancy Text</a>-- <a href="https://zalgo.openvibe.tools">Zalgo Text</a>-- </div>-- <p>© 2025 OpenVibe</p>-- </footer>++ <div id="ov-footer" data-related="Fancy Text|https://fancy.openvibe.tools;Zalgo Text|https://zalgo.openvibe.tools"></div></div><script src="https://openvibe.network/shared/navbar.js"></script>++ <script src="https://openvibe.network/shared/footer.js"></script><script src="https://openvibe.network/shared/notification-ui.js"></script><script src="https://openvibe.network/shared/account-switcher.js"></script><script src="/js/text-engine.js"></script>@@@ -128,18 +128,11 @@<div class="slang-list" id="slang-list"></div></div>-- <footer class="site-footer">-- <div class="footer-links">-- <a href="https://ice.openvibe.tools">ICE Alerts</a>-- <a href="https://peso.openvibe.tools">OpenVibePeso</a>-- <a href="https://spanish.openvibe.tools">OpenVibeSpanish</a>-- <a href="https://text.openvibe.tools">Text.OpenVibe Hub</a>-- </div>-- <p>© 2025 OpenVibe</p>-- </footer>++ <div id="ov-footer" data-related="ICE Alerts|https://ice.openvibe.tools;OpenVibePeso|https://peso.openvibe.tools;OpenVibeSpanish|https://spanish.openvibe.tools"></div></div><script src="https://openvibe.network/shared/navbar.js"></script>++ <script src="https://openvibe.network/shared/footer.js"></script><script src="https://openvibe.network/shared/notification-ui.js"></script><script src="https://openvibe.network/shared/account-switcher.js"></script><script src="/js/shared.js"></script>@@@ -46,17 +46,11 @@</div></div>-- <footer class="site-footer">-- <div class="footer-links">-- <a href="https://text.openvibe.tools">Text.OpenVibe Hub</a>-- <a href="https://case.openvibe.tools">Case Converter</a>-- <a href="https://clean.openvibe.tools">Text Cleaner</a>-- </div>-- <p>© 2025 OpenVibe</p>-- </footer>++ <div id="ov-footer" data-related="Case Converter|https://case.openvibe.tools;Text Cleaner|https://clean.openvibe.tools"></div></div><script src="https://openvibe.network/shared/navbar.js"></script>++ <script src="https://openvibe.network/shared/footer.js"></script><script src="https://openvibe.network/shared/notification-ui.js"></script><script src="https://openvibe.network/shared/account-switcher.js"></script><script src="/js/text-engine.js"></script>@@@ -56,17 +56,11 @@ elderberry</textarea></div></div>-- <footer class="site-footer">-- <div class="footer-links">-- <a href="https://text.openvibe.tools">Text.OpenVibe Hub</a>-- <a href="https://clean.openvibe.tools">Text Cleaner</a>-- <a href="https://count.openvibe.tools">Text Counter</a>-- </div>-- <p>© 2025 OpenVibe</p>-- </footer>++ <div id="ov-footer" data-related="Text Cleaner|https://clean.openvibe.tools;Text Counter|https://count.openvibe.tools"></div></div><script src="https://openvibe.network/shared/navbar.js"></script>++ <script src="https://openvibe.network/shared/footer.js"></script><script src="https://openvibe.network/shared/notification-ui.js"></script><script src="https://openvibe.network/shared/account-switcher.js"></script><script src="/js/text-engine.js"></script>@@@ -114,18 +114,11 @@<div class="phrase-list" id="phrase-list"></div></div>-- <footer class="site-footer">-- <div class="footer-links">-- <a href="https://ice.openvibe.tools">ICE Alerts</a>-- <a href="https://peso.openvibe.tools">OpenVibePeso</a>-- <a href="https://slang.openvibe.tools">OpenVibeSlang</a>-- <a href="https://text.openvibe.tools">Text.OpenVibe Hub</a>-- </div>-- <p>© 2025 OpenVibe</p>-- </footer>++ <div id="ov-footer" data-related="ICE Alerts|https://ice.openvibe.tools;OpenVibePeso|https://peso.openvibe.tools;OpenVibeSlang|https://slang.openvibe.tools"></div></div><script src="https://openvibe.network/shared/navbar.js"></script>++ <script src="https://openvibe.network/shared/footer.js"></script><script src="https://openvibe.network/shared/notification-ui.js"></script><script src="https://openvibe.network/shared/account-switcher.js"></script><script src="/js/shared.js"></script>@@@ -39,18 +39,11 @@<div id="categories"></div>-- <footer class="site-footer">-- <div class="footer-links">-- <a href="https://text.openvibe.tools">Text.OpenVibe Hub</a>-- <a href="https://kaomoji.openvibe.tools">Kaomoji</a>-- <a href="https://fancy.openvibe.tools">Fancy Text</a>-- <a href="https://unicode.openvibe.tools">Unicode Inspector</a>-- </div>-- <p>© 2025 OpenVibe</p>-- </footer>++ <div id="ov-footer" data-related="Kaomoji|https://kaomoji.openvibe.tools;Fancy Text|https://fancy.openvibe.tools;Unicode Inspector|https://unicode.openvibe.tools"></div></div><script src="https://openvibe.network/shared/navbar.js"></script>++ <script src="https://openvibe.network/shared/footer.js"></script><script src="https://openvibe.network/shared/notification-ui.js"></script><script src="https://openvibe.network/shared/account-switcher.js"></script><script src="/js/text-engine.js"></script>@@@ -118,18 +118,11 @@</div></div>-- <footer class="site-footer">-- <div class="footer-links">-- <a href="https://logo.openvibe.tools">Logo Hub</a>-- <a href="https://title.openvibe.tools">Title Cards</a>-- <a href="https://watermark.openvibe.tools">Watermark</a>-- <a href="https://openvibe.live">OpenVibe.Live</a>-- </div>-- <p>© 2025 OpenVibe</p>-- </footer>++ <div id="ov-footer" data-related="Title Cards|https://title.openvibe.tools;Watermark|https://watermark.openvibe.tools"></div></div><script src="https://openvibe.network/shared/navbar.js"></script>++ <script src="https://openvibe.network/shared/footer.js"></script><script src="https://openvibe.network/shared/notification-ui.js"></script><script src="https://openvibe.network/shared/account-switcher.js"></script><script src="/js/logo-engine.js"></script>@@@ -126,18 +126,11 @@</div></div>-- <footer class="site-footer">-- <div class="footer-links">-- <a href="https://logo.openvibe.tools">Logo Hub</a>-- <a href="https://wordmark.openvibe.tools">Wordmark</a>-- <a href="https://badge.openvibe.tools">Badge Maker</a>-- <a href="https://text.openvibe.tools">Text.OpenVibe</a>-- </div>-- <p>© 2025 OpenVibe</p>-- </footer>++ <div id="ov-footer" data-related="Wordmark|https://wordmark.openvibe.tools;Badge Maker|https://badge.openvibe.tools"></div></div><script src="https://openvibe.network/shared/navbar.js"></script>++ <script src="https://openvibe.network/shared/footer.js"></script><script src="https://openvibe.network/shared/notification-ui.js"></script><script src="https://openvibe.network/shared/account-switcher.js"></script><script src="/js/logo-engine.js"></script>@@@ -83,18 +83,11 @@</div></div>-- <footer class="site-footer">-- <div class="footer-links">-- <a href="https://logo.openvibe.tools">Logo Hub</a>-- <a href="https://title.openvibe.tools">Title Cards</a>-- <a href="https://wordmark.openvibe.tools">Wordmark</a>-- <a href="https://text.openvibe.tools">Text.OpenVibe</a>-- </div>-- <p>© 2025 OpenVibe</p>-- </footer>++ <div id="ov-footer" data-related="Title Cards|https://title.openvibe.tools;Wordmark|https://wordmark.openvibe.tools"></div></div><script src="https://openvibe.network/shared/navbar.js"></script>++ <script src="https://openvibe.network/shared/footer.js"></script><script src="https://openvibe.network/shared/notification-ui.js"></script><script src="https://openvibe.network/shared/account-switcher.js"></script><script src="/js/logo-engine.js"></script>@@@ -57,17 +57,11 @@</div></div>-- <footer class="site-footer">-- <div class="footer-links">-- <a href="https://text.openvibe.tools">Text.OpenVibe Hub</a>-- <a href="https://clean.openvibe.tools">Text Cleaner</a>-- <a href="https://binary.openvibe.tools">Binary</a>-- </div>-- <p>© 2025 OpenVibe</p>-- </footer>++ <div id="ov-footer" data-related="Text Cleaner|https://clean.openvibe.tools;Binary|https://binary.openvibe.tools"></div></div><script src="https://openvibe.network/shared/navbar.js"></script>++ <script src="https://openvibe.network/shared/footer.js"></script><script src="https://openvibe.network/shared/notification-ui.js"></script><script src="https://openvibe.network/shared/account-switcher.js"></script><script src="/js/text-engine.js"></script>@@@ -101,18 +101,11 @@</div></div>-- <footer class="site-footer">-- <div class="footer-links">-- <a href="https://logo.openvibe.tools">Logo Hub</a>-- <a href="https://title.openvibe.tools">Title Cards</a>-- <a href="https://transparent.openvibe.tools">Transparent PNG</a>-- <a href="https://img.openvibe.tools">Img.OpenVibe</a>-- </div>-- <p>© 2025 OpenVibe</p>-- </footer>++ <div id="ov-footer" data-related="Title Cards|https://title.openvibe.tools;Transparent PNG|https://transparent.openvibe.tools;Img.OpenVibe|https://img.openvibe.tools"></div></div><script src="https://openvibe.network/shared/navbar.js"></script>++ <script src="https://openvibe.network/shared/footer.js"></script><script src="https://openvibe.network/shared/notification-ui.js"></script><script src="https://openvibe.network/shared/account-switcher.js"></script><script src="/js/logo-engine.js"></script>@@@ -72,18 +72,11 @@<div class="wordmark-grid" id="grid"></div>-- <footer class="site-footer">-- <div class="footer-links">-- <a href="https://logo.openvibe.tools">Logo Hub</a>-- <a href="https://title.openvibe.tools">Title Cards</a>-- <a href="https://badge.openvibe.tools">Badge Maker</a>-- <a href="https://text.openvibe.tools">Text.OpenVibe</a>-- </div>-- <p>© 2025 OpenVibe</p>-- </footer>++ <div id="ov-footer" data-related="Title Cards|https://title.openvibe.tools;Badge Maker|https://badge.openvibe.tools"></div></div><script src="https://openvibe.network/shared/navbar.js"></script>++ <script src="https://openvibe.network/shared/footer.js"></script><script src="https://openvibe.network/shared/notification-ui.js"></script><script src="https://openvibe.network/shared/account-switcher.js"></script><script src="/js/logo-engine.js"></script>@@@ -71,18 +71,11 @@<div id="cleanOutput" class="output-box mono" style="display:none;"></div></div>-- <footer class="site-footer">-- <div class="footer-links">-- <a href="https://text.openvibe.tools">Text.OpenVibe Hub</a>-- <a href="https://fancy.openvibe.tools">Fancy Text</a>-- <a href="https://clean.openvibe.tools">Text Cleaner</a>-- <a href="https://symbols.openvibe.tools">Symbols</a>-- </div>-- <p>© 2025 OpenVibe</p>-- </footer>++ <div id="ov-footer" data-related="Fancy Text|https://fancy.openvibe.tools;Text Cleaner|https://clean.openvibe.tools;Symbols|https://symbols.openvibe.tools"></div></div><script src="https://openvibe.network/shared/navbar.js"></script>++ <script src="https://openvibe.network/shared/footer.js"></script><script src="https://openvibe.network/shared/notification-ui.js"></script><script src="https://openvibe.network/shared/account-switcher.js"></script><script src="/js/text-engine.js"></script>
@@ -74,18 +74,11 @@
@@ -74,18 +74,11 @@
</ul>
</ul>
</div>
</div>
- <footer class="site-footer">
- <div class="footer-links">
- <a href="https://text.openvibe.tools">Text.OpenVibe Hub</a>
- <a href="https://fancy.openvibe.tools">Fancy Text</a>
- <a href="https://zalgo.openvibe.tools">Zalgo Text</a>
- <a href="https://symbols.openvibe.tools">Symbols</a>
- </div>
- <p>© 2025 OpenVibe</p>
- </footer>
+ <div id="ov-footer" data-related="Fancy Text|https://fancy.openvibe.tools;Zalgo Text|https://zalgo.openvibe.tools;Symbols|https://symbols.openvibe.tools"></div>
</div>
</div>
<script src="https://openvibe.network/shared/navbar.js"></script>
<script src="https://openvibe.network/shared/navbar.js"></script>
+ <script src="https://openvibe.network/shared/footer.js"></script>
<script src="https://openvibe.network/shared/notification-ui.js"></script>
<script src="https://openvibe.network/shared/notification-ui.js"></script>
<script src="https://openvibe.network/shared/account-switcher.js"></script>
<script src="https://openvibe.network/shared/account-switcher.js"></script>
<script src="/js/text-engine.js"></script>
<script src="/js/text-engine.js"></script>
@@ -102,18 +102,11 @@
@@ -102,18 +102,11 @@
</div>
</div>
</div>
</div>
- <footer class="site-footer">
- <div class="footer-links">
- <a href="https://logo.openvibe.tools">Logo Hub</a>
- <a href="https://title.openvibe.tools">Title Cards</a>
- <a href="https://wordmark.openvibe.tools">Wordmark</a>
- <a href="https://text.openvibe.tools">Text.OpenVibe</a>
- </div>
- <p>© 2025 OpenVibe</p>
- </footer>
+ <div id="ov-footer" data-related="Title Cards|https://title.openvibe.tools;Wordmark|https://wordmark.openvibe.tools"></div>
</div>
</div>
<script src="https://openvibe.network/shared/navbar.js"></script>
<script src="https://openvibe.network/shared/navbar.js"></script>
+ <script src="https://openvibe.network/shared/footer.js"></script>
<script src="https://openvibe.network/shared/notification-ui.js"></script>
<script src="https://openvibe.network/shared/notification-ui.js"></script>
<script src="https://openvibe.network/shared/account-switcher.js"></script>
<script src="https://openvibe.network/shared/account-switcher.js"></script>
<script src="/js/logo-engine.js"></script>
<script src="/js/logo-engine.js"></script>
@@ -48,17 +48,11 @@
@@ -48,17 +48,11 @@
<div id="binOutput" class="output-box" style="display:none;"></div>
<div id="binOutput" class="output-box" style="display:none;"></div>
</div>
</div>
- <footer class="site-footer">
- <div class="footer-links">
- <a href="https://text.openvibe.tools">Text.OpenVibe Hub</a>
- <a href="https://morse.openvibe.tools">Morse Code</a>
- <a href="https://escape.openvibe.tools">Escape / Unescape</a>
- </div>
- <p>© 2025 OpenVibe</p>
- </footer>
+ <div id="ov-footer" data-related="Morse Code|https://morse.openvibe.tools;Escape / Unescape|https://escape.openvibe.tools"></div>
</div>
</div>
<script src="https://openvibe.network/shared/navbar.js"></script>
<script src="https://openvibe.network/shared/navbar.js"></script>
+ <script src="https://openvibe.network/shared/footer.js"></script>
<script src="https://openvibe.network/shared/notification-ui.js"></script>
<script src="https://openvibe.network/shared/notification-ui.js"></script>
<script src="https://openvibe.network/shared/account-switcher.js"></script>
<script src="https://openvibe.network/shared/account-switcher.js"></script>
<script src="/js/text-engine.js"></script>
<script src="/js/text-engine.js"></script>
@@ -44,17 +44,11 @@
@@ -44,17 +44,11 @@
</div>
</div>
</div>
</div>
- <footer class="site-footer">
- <div class="footer-links">
- <a href="https://text.openvibe.tools">Text.OpenVibe Hub</a>
- <a href="https://nickname.openvibe.tools">Nickname Generator</a>
- <a href="https://fancy.openvibe.tools">Fancy Text</a>
- </div>
- <p>© 2025 OpenVibe</p>
- </footer>
+ <div id="ov-footer" data-related="Nickname Generator|https://nickname.openvibe.tools;Fancy Text|https://fancy.openvibe.tools"></div>
</div>
</div>
<script src="https://openvibe.network/shared/navbar.js"></script>
<script src="https://openvibe.network/shared/navbar.js"></script>
+ <script src="https://openvibe.network/shared/footer.js"></script>
<script src="https://openvibe.network/shared/notification-ui.js"></script>
<script src="https://openvibe.network/shared/notification-ui.js"></script>
<script src="https://openvibe.network/shared/account-switcher.js"></script>
<script src="https://openvibe.network/shared/account-switcher.js"></script>
<script src="/js/text-engine.js"></script>
<script src="/js/text-engine.js"></script>
@@ -50,17 +50,11 @@
@@ -50,17 +50,11 @@
</div>
</div>
</div>
</div>
- <footer class="site-footer">
- <div class="footer-links">
- <a href="https://text.openvibe.tools">Text.OpenVibe Hub</a>
- <a href="https://morse.openvibe.tools">Morse Code</a>
- <a href="https://binary.openvibe.tools">Binary</a>
- </div>
- <p>© 2025 OpenVibe</p>
- </footer>
+ <div id="ov-footer" data-related="Morse Code|https://morse.openvibe.tools;Binary|https://binary.openvibe.tools"></div>
</div>
</div>
<script src="https://openvibe.network/shared/navbar.js"></script>
<script src="https://openvibe.network/shared/navbar.js"></script>
+ <script src="https://openvibe.network/shared/footer.js"></script>
<script src="https://openvibe.network/shared/notification-ui.js"></script>
<script src="https://openvibe.network/shared/notification-ui.js"></script>
<script src="https://openvibe.network/shared/account-switcher.js"></script>
<script src="https://openvibe.network/shared/account-switcher.js"></script>
<script src="/js/text-engine.js"></script>
<script src="/js/text-engine.js"></script>
@@ -39,17 +39,11 @@
@@ -39,17 +39,11 @@
<div id="output" class="output-grid"></div>
<div id="output" class="output-grid"></div>
- <footer class="site-footer">
- <div class="footer-links">
- <a href="https://text.openvibe.tools">Text.OpenVibe Hub</a>
- <a href="https://fancy.openvibe.tools">Fancy Text</a>
- <a href="https://symbols.openvibe.tools">Symbols</a>
- </div>
- <p>© 2025 OpenVibe</p>
- </footer>
+ <div id="ov-footer" data-related="Fancy Text|https://fancy.openvibe.tools;Symbols|https://symbols.openvibe.tools"></div>
</div>
</div>
<script src="https://openvibe.network/shared/navbar.js"></script>
<script src="https://openvibe.network/shared/navbar.js"></script>
+ <script src="https://openvibe.network/shared/footer.js"></script>
<script src="https://openvibe.network/shared/notification-ui.js"></script>
<script src="https://openvibe.network/shared/notification-ui.js"></script>
<script src="https://openvibe.network/shared/account-switcher.js"></script>
<script src="https://openvibe.network/shared/account-switcher.js"></script>
<script src="/js/text-engine.js"></script>
<script src="/js/text-engine.js"></script>
@@ -39,18 +39,11 @@
@@ -39,18 +39,11 @@
<div id="output" class="output-grid" style="grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));"></div>
<div id="output" class="output-grid" style="grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));"></div>
- <footer class="site-footer">
- <div class="footer-links">
- <a href="https://text.openvibe.tools">Text.OpenVibe Hub</a>
- <a href="https://fancy.openvibe.tools">Fancy Text</a>
- <a href="https://clean.openvibe.tools">Text Cleaner</a>
- <a href="https://count.openvibe.tools">Text Counter</a>
- </div>
- <p>© 2025 OpenVibe</p>
- </footer>
+ <div id="ov-footer" data-related="Fancy Text|https://fancy.openvibe.tools;Text Cleaner|https://clean.openvibe.tools;Text Counter|https://count.openvibe.tools"></div>
</div>
</div>
<script src="https://openvibe.network/shared/navbar.js"></script>
<script src="https://openvibe.network/shared/navbar.js"></script>
+ <script src="https://openvibe.network/shared/footer.js"></script>
<script src="https://openvibe.network/shared/notification-ui.js"></script>
<script src="https://openvibe.network/shared/notification-ui.js"></script>
<script src="https://openvibe.network/shared/account-switcher.js"></script>
<script src="https://openvibe.network/shared/account-switcher.js"></script>
<script src="/js/text-engine.js"></script>
<script src="/js/text-engine.js"></script>
@@ -58,17 +58,11 @@
@@ -58,17 +58,11 @@
</div>
</div>
</div>
</div>
- <footer class="site-footer">
- <div class="footer-links">
- <a href="https://text.openvibe.tools">Text.OpenVibe Hub</a>
- <a href="https://count.openvibe.tools">Text Counter</a>
- <a href="https://escape.openvibe.tools">Escape / Unescape</a>
- </div>
- <p>© 2025 OpenVibe</p>
- </footer>
+ <div id="ov-footer" data-related="Text Counter|https://count.openvibe.tools;Escape / Unescape|https://escape.openvibe.tools"></div>
</div>
</div>
<script src="https://openvibe.network/shared/navbar.js"></script>
<script src="https://openvibe.network/shared/navbar.js"></script>
+ <script src="https://openvibe.network/shared/footer.js"></script>
<script src="https://openvibe.network/shared/notification-ui.js"></script>
<script src="https://openvibe.network/shared/notification-ui.js"></script>
<script src="https://openvibe.network/shared/account-switcher.js"></script>
<script src="https://openvibe.network/shared/account-switcher.js"></script>
<script src="/js/text-engine.js"></script>
<script src="/js/text-engine.js"></script>
@@ -70,17 +70,11 @@ A brand new line was added.</textarea>
@@ -70,17 +70,11 @@ A brand new line was added.</textarea>
<div class="diff-output" id="output"></div>
<div class="diff-output" id="output"></div>
</div>
</div>
- <footer class="site-footer">
- <div class="footer-links">
- <a href="https://text.openvibe.tools">Text.OpenVibe Hub</a>
- <a href="https://clean.openvibe.tools">Clean Text</a>
- <a href="https://sort.openvibe.tools">Sort Lines</a>
- </div>
- <p>© 2025 OpenVibe</p>
- </footer>
+ <div id="ov-footer" data-related="Clean Text|https://clean.openvibe.tools;Sort Lines|https://sort.openvibe.tools"></div>
</div>
</div>
<script src="https://openvibe.network/shared/navbar.js"></script>
<script src="https://openvibe.network/shared/navbar.js"></script>
+ <script src="https://openvibe.network/shared/footer.js"></script>
<script src="https://openvibe.network/shared/notification-ui.js"></script>
<script src="https://openvibe.network/shared/notification-ui.js"></script>
<script src="https://openvibe.network/shared/account-switcher.js"></script>
<script src="https://openvibe.network/shared/account-switcher.js"></script>
<script src="/js/shared.js"></script>
<script src="/js/shared.js"></script>
@@ -37,18 +37,11 @@
@@ -37,18 +37,11 @@
</div>
</div>
</div>
</div>
- <footer class="site-footer">
- <div class="footer-links">
- <a href="https://text.openvibe.tools">Text.OpenVibe Hub</a>
- <a href="https://clean.openvibe.tools">Text Cleaner</a>
- <a href="https://sort.openvibe.tools">Sort Lines</a>
- <a href="https://case.openvibe.tools">Case Converter</a>
- </div>
- <p>© 2025 OpenVibe</p>
- </footer>
+ <div id="ov-footer" data-related="Text Cleaner|https://clean.openvibe.tools;Sort Lines|https://sort.openvibe.tools;Case Converter|https://case.openvibe.tools"></div>
</div>
</div>
<script src="https://openvibe.network/shared/navbar.js"></script>
<script src="https://openvibe.network/shared/navbar.js"></script>
+ <script src="https://openvibe.network/shared/footer.js"></script>
<script src="https://openvibe.network/shared/notification-ui.js"></script>
<script src="https://openvibe.network/shared/notification-ui.js"></script>
<script src="https://openvibe.network/shared/account-switcher.js"></script>
<script src="https://openvibe.network/shared/account-switcher.js"></script>
<script src="/js/text-engine.js"></script>
<script src="/js/text-engine.js"></script>
@@ -49,8 +49,7 @@ body {
@@ -49,8 +49,7 @@ body {
color: var(--text-primary);
color: var(--text-primary);
line-height: 1.6;
line-height: 1.6;
min-height: 100vh;
min-height: 100vh;
- padding-top: var(--navbar-height);
- overflow-x: hidden;
+ overflow-x: hidden; /* the shared navbar is sticky and in flow — no reserved top padding */
}
}
a { color: var(--accent); text-decoration: none; transition: color var(--transition); }
a { color: var(--accent); text-decoration: none; transition: color var(--transition); }
@@ -698,6 +697,9 @@ textarea.large {
@@ -698,6 +697,9 @@ textarea.large {
@keyframes toastOut { from { opacity: 1; } to { opacity: 0; transform: translateY(10px); } }
@keyframes toastOut { from { opacity: 1; } to { opacity: 0; transform: translateY(10px); } }
/* ── Footer ────────────────────────────────────────────────── */
/* ── Footer ────────────────────────────────────────────────── */
+/* The footer itself is the shared OpenVibeFooter (mounted on #ov-footer by shared.js);
+ .site-note is the one-line disclaimer some pages keep above it. */
+.site-note { text-align: center; padding: 24px 24px 0; color: var(--text-muted); font-size: 0.82rem; margin-top: 40px; border-top: 1px solid var(--border); }
.site-footer {
.site-footer {
text-align: center;
text-align: center;
padding: 40px 24px;
padding: 40px 24px;
@@ -48,17 +48,11 @@
@@ -48,17 +48,11 @@
<div class="escape-grid" id="grid"></div>
<div class="escape-grid" id="grid"></div>
- <footer class="site-footer">
- <div class="footer-links">
- <a href="https://text.openvibe.tools">Text.OpenVibe Hub</a>
- <a href="https://unicode.openvibe.tools">Unicode Inspector</a>
- <a href="https://clean.openvibe.tools">Text Cleaner</a>
- </div>
- <p>© 2025 OpenVibe</p>
- </footer>
+ <div id="ov-footer" data-related="Unicode Inspector|https://unicode.openvibe.tools;Text Cleaner|https://clean.openvibe.tools"></div>
</div>
</div>
<script src="https://openvibe.network/shared/navbar.js"></script>
<script src="https://openvibe.network/shared/navbar.js"></script>
+ <script src="https://openvibe.network/shared/footer.js"></script>
<script src="https://openvibe.network/shared/notification-ui.js"></script>
<script src="https://openvibe.network/shared/notification-ui.js"></script>
<script src="https://openvibe.network/shared/account-switcher.js"></script>
<script src="https://openvibe.network/shared/account-switcher.js"></script>
<script src="/js/text-engine.js"></script>
<script src="/js/text-engine.js"></script>
@@ -43,19 +43,11 @@
@@ -43,19 +43,11 @@
<div id="output" class="output-grid"></div>
<div id="output" class="output-grid"></div>
- <footer class="site-footer">
- <div class="footer-links">
- <a href="https://text.openvibe.tools">Text.OpenVibe Hub</a>
- <a href="https://zalgo.openvibe.tools">Zalgo Text</a>
- <a href="https://ascii.openvibe.tools">ASCII Art</a>
- <a href="https://case.openvibe.tools">Case Converter</a>
- <a href="https://logo.openvibe.tools">Logo Maker</a>
- </div>
- <p>© 2025 OpenVibe</p>
- </footer>
+ <div id="ov-footer" data-related="Zalgo Text|https://zalgo.openvibe.tools;ASCII Art|https://ascii.openvibe.tools;Case Converter|https://case.openvibe.tools"></div>
</div>
</div>
<script src="https://openvibe.network/shared/navbar.js"></script>
<script src="https://openvibe.network/shared/navbar.js"></script>
+ <script src="https://openvibe.network/shared/footer.js"></script>
<script src="https://openvibe.network/shared/notification-ui.js"></script>
<script src="https://openvibe.network/shared/notification-ui.js"></script>
<script src="https://openvibe.network/shared/account-switcher.js"></script>
<script src="https://openvibe.network/shared/account-switcher.js"></script>
<script src="/js/text-engine.js"></script>
<script src="/js/text-engine.js"></script>
@@ -154,7 +154,7 @@
@@ -154,7 +154,7 @@
@media print {
@media print {
.printable { display: block !important; }
.printable { display: block !important; }
.tool-wrap { padding: 0; }
.tool-wrap { padding: 0; }
- .site-footer, .pill-tabs, .alert-banner { display: none; }
+ .ovf, .site-note, .pill-tabs, .alert-banner { display: none; }
}
}
.tab-content { display: none; }
.tab-content { display: none; }
@@ -464,18 +464,12 @@
@@ -464,18 +464,12 @@
</div>
</div>
</div>
</div>
- <footer class="site-footer">
- <div class="footer-links">
- <a href="https://text.openvibe.tools">Text.OpenVibe Hub</a>
- <a href="https://peso.openvibe.tools">OpenVibePeso</a>
- <a href="https://spanish.openvibe.tools">OpenVibeSpanish</a>
- <a href="https://slang.openvibe.tools">OpenVibeSlang</a>
- </div>
- <p>© 2025 OpenVibe — This is informational only, not legal advice.</p>
- </footer>
+ <p class="site-note">This is informational only, not legal advice.</p>
+ <div id="ov-footer" data-related="OpenVibePeso|https://peso.openvibe.tools;OpenVibeSpanish|https://spanish.openvibe.tools;OpenVibeSlang|https://slang.openvibe.tools"></div>
</div>
</div>
<script src="https://openvibe.network/shared/navbar.js"></script>
<script src="https://openvibe.network/shared/navbar.js"></script>
+ <script src="https://openvibe.network/shared/footer.js"></script>
<script src="https://openvibe.network/shared/notification-ui.js"></script>
<script src="https://openvibe.network/shared/notification-ui.js"></script>
<script src="https://openvibe.network/shared/account-switcher.js"></script>
<script src="https://openvibe.network/shared/account-switcher.js"></script>
<script src="/js/shared.js"></script>
<script src="/js/shared.js"></script>
@@ -223,25 +223,17 @@
@@ -223,25 +223,17 @@
</div>
</div>
</div>
</div>
- <footer class="site-footer">
- <div class="footer-links">
- <a href="https://openvibe.network">openvibe.tools</a>
- <a href="https://openvibe.live">openvibe.live</a>
- <a href="https://openvibe.games">openvibe.games</a>
- <a href="https://img.openvibe.tools">Img.OpenVibe</a>
- <a href="https://audio.openvibe.tools">Audio.OpenVibe</a>
- </div>
- <p>© OpenVibe — tools for the internet, run by its community.</p>
- </footer>
+ <div id="ov-footer"></div>
</div>
</div>
<script src="https://openvibe.network/shared/navbar.js"></script>
<script src="https://openvibe.network/shared/navbar.js"></script>
+ <script src="https://openvibe.network/shared/footer.js"></script>
<script src="https://openvibe.network/shared/notification-ui.js"></script>
<script src="https://openvibe.network/shared/notification-ui.js"></script>
<script src="https://openvibe.network/shared/account-switcher.js"></script>
<script src="https://openvibe.network/shared/account-switcher.js"></script>
<script src="/js/text-engine.js"></script>
<script src="/js/text-engine.js"></script>
<script src="/js/shared.js"></script>
<script src="/js/shared.js"></script>
<script>
<script>
- OpenVibeUI.initPage();
+ OpenVibeUI.initPage({ footer: 'full' });
const input = document.getElementById('quickInput');
const input = document.getElementById('quickInput');
const preview = document.getElementById('quickPreview');
const preview = document.getElementById('quickPreview');
@@ -129,9 +129,107 @@ async function shareText(text, title = 'Text.OpenVibe') {
@@ -129,9 +129,107 @@ async function shareText(text, title = 'Text.OpenVibe') {
}
}
}
}
+// ── Shared chrome: navbar + footer ───────────────────────────
+// Every page loads navbar.js / footer.js from openvibe.network; this is the one place that
+// boots them, so a page only needs a <div id="ov-footer" data-related="Name|url;…"> mount.
+const NETWORK = 'https://openvibe.network';
+const SILENT_LOGIN = 'https://openvibe.tools/auth/login?silent=1&next={url}';
+const LOGO_HOSTS = /^(logo|title|wordmark|textlogo|transparent|badge|sticker|thumbnail|cover|channelart|watermark|neon|overlay|lowerthird)\./;
+
+// The site's own tool list — the footer columns on the hubs, the "more tools" row elsewhere.
+const TEXT_TOOLS = [
+ { name: 'Fancy Text', url: 'https://fancy.openvibe.tools' },
+ { name: 'Zalgo Text', url: 'https://zalgo.openvibe.tools' },
+ { name: 'ASCII Art', url: 'https://ascii.openvibe.tools' },
+ { name: 'Symbols', url: 'https://symbols.openvibe.tools' },
+ { name: 'Kaomoji', url: 'https://kaomoji.openvibe.tools' },
+ { name: 'Case Converter', url: 'https://case.openvibe.tools' },
+ { name: 'Text Counter', url: 'https://count.openvibe.tools' },
+ { name: 'JSON Formatter', url: 'https://json.openvibe.tools' },
+ { name: 'Markdown Preview', url: 'https://markdown.openvibe.tools' },
+ { name: 'Diff Checker', url: 'https://compare.openvibe.tools' },
+ { name: 'Bio Generator', url: 'https://bio.openvibe.tools' },
+];
+const LOGO_TOOLS = [
+ { name: 'Title Cards', url: 'https://title.openvibe.tools' },
+ { name: 'Wordmark', url: 'https://wordmark.openvibe.tools' },
+ { name: 'Transparent PNG', url: 'https://transparent.openvibe.tools' },
+ { name: 'Badges & Stickers', url: 'https://badge.openvibe.tools' },
+ { name: 'Thumbnail Text', url: 'https://thumbnail.openvibe.tools' },
+ { name: 'Watermark', url: 'https://watermark.openvibe.tools' },
+];
+
+function getCookie(name) {
+ const m = document.cookie.match(new RegExp('(?:^|; )' + name + '=([^;]*)'));
+ return m ? decodeURIComponent(m[1]) : null;
+}
+
+function currentService() {
+ return LOGO_HOSTS.test(location.hostname) ? 'logo' : 'text';
+}
+
+/** The tool's name for history: "Case Converter — … | case.openvibe.tools" → "Case Converter — …". */
+function pageTitle() {
+ const h1 = document.querySelector('.page-header h1, .hub-hero h1');
+ const fromH1 = h1 ? h1.textContent.replace(/\s+/g, ' ').trim() : '';
+ return fromH1 || document.title.split('|')[0].trim();
+}
+
+function initNavbar() {
+ if (typeof OpenVibeNavbar === 'undefined') return;
+ const token = getCookie('ov_token') || localStorage.getItem('ov_token');
+ try {
+ OpenVibeNavbar.init({
+ service: currentService(),
+ apiBase: NETWORK,
+ token,
+ history: { type: 'tool', title: pageTitle() },
+ silentLogin: SILENT_LOGIN,
+ });
+ } catch (e) { /* the page works without the navbar */ }
+ if (typeof OpenVibeAccountSwitcher !== 'undefined') {
+ try { OpenVibeAccountSwitcher.init({ apiBase: NETWORK }); } catch (e) { /* optional */ }
+ }
+ if (token && typeof OpenVibeNotifications !== 'undefined') {
+ try {
+ OpenVibeNotifications.init({ token, apiBase: NETWORK });
+ const mount = OpenVibeNavbar.getBellMount && OpenVibeNavbar.getBellMount();
+ if (mount) { const bell = OpenVibeNotifications.createBell(); if (bell) mount.appendChild(bell); }
+ } catch (e) { /* optional */ }
+ }
+}
+
+/** Footer: related tools from the mount's data-related, then the site's own tool list. */
+function initFooter(opts = {}) {
+ if (typeof OpenVibeFooter === 'undefined') return;
+ const mount = document.getElementById('ov-footer');
+ if (!mount) return;
+ const related = (mount.dataset.related || '').split(';').map(s => s.trim()).filter(Boolean).map(pair => {
+ const [name, url] = pair.split('|');
+ return { name: (name || '').trim(), url: (url || '').trim() };
+ }).filter(l => l.name && l.url);
+ const service = currentService();
+ const links = [];
+ if (related.length) links.push({ heading: 'Related tools', items: related });
+ if (service === 'logo') {
+ links.push({ heading: 'Logo tools', items: LOGO_TOOLS });
+ links.push({ heading: 'Text tools', items: TEXT_TOOLS.slice(0, 6) });
+ } else {
+ links.push({ heading: 'Text tools', items: TEXT_TOOLS });
+ links.push({ heading: 'Logo tools', items: LOGO_TOOLS });
+ }
+ try {
+ OpenVibeFooter.init({ service, variant: opts.variant || 'compact', links, apiBase: NETWORK, mount: '#ov-footer' });
+ } catch (e) { /* optional */ }
+}
+
// ── Common page init ─────────────────────────────────────────
// ── Common page init ─────────────────────────────────────────
-// Called on every page to set up keyboard shortcuts, etc.
-function initPage() {
+// Called on every page: shared chrome, keyboard shortcuts, live-tool affordances.
+// opts.footer — 'full' on the hub pages, 'compact' (default) on tool pages
+function initPage(opts = {}) {
+ initNavbar();
+ initFooter({ variant: opts.footer });
+
// "/" key focuses input (when not already in a field)
// "/" key focuses input (when not already in a field)
document.addEventListener('keydown', (e) => {
document.addEventListener('keydown', (e) => {
if (e.key === '/' && !['INPUT', 'TEXTAREA', 'SELECT'].includes(document.activeElement?.tagName)) {
if (e.key === '/' && !['INPUT', 'TEXTAREA', 'SELECT'].includes(document.activeElement?.tagName)) {
@@ -67,17 +67,11 @@
@@ -67,17 +67,11 @@
</div>
</div>
</div>
</div>
- <footer class="site-footer">
- <div class="footer-links">
- <a href="https://text.openvibe.tools">Text.OpenVibe Hub</a>
- <a href="https://escape.openvibe.tools">Escape / Unescape</a>
- <a href="https://markdown.openvibe.tools">Markdown Preview</a>
- </div>
- <p>© 2025 OpenVibe</p>
- </footer>
+ <div id="ov-footer" data-related="Escape / Unescape|https://escape.openvibe.tools;Markdown Preview|https://markdown.openvibe.tools"></div>
</div>
</div>
<script src="https://openvibe.network/shared/navbar.js"></script>
<script src="https://openvibe.network/shared/navbar.js"></script>
+ <script src="https://openvibe.network/shared/footer.js"></script>
<script src="https://openvibe.network/shared/notification-ui.js"></script>
<script src="https://openvibe.network/shared/notification-ui.js"></script>
<script src="https://openvibe.network/shared/account-switcher.js"></script>
<script src="https://openvibe.network/shared/account-switcher.js"></script>
<script src="/js/shared.js"></script>
<script src="/js/shared.js"></script>
@@ -29,18 +29,11 @@
@@ -29,18 +29,11 @@
<div id="categories"></div>
<div id="categories"></div>
- <footer class="site-footer">
- <div class="footer-links">
- <a href="https://text.openvibe.tools">Text.OpenVibe Hub</a>
- <a href="https://symbols.openvibe.tools">Symbols</a>
- <a href="https://bio.openvibe.tools">Bio Generator</a>
- <a href="https://fancy.openvibe.tools">Fancy Text</a>
- </div>
- <p>© 2025 OpenVibe</p>
- </footer>
+ <div id="ov-footer" data-related="Symbols|https://symbols.openvibe.tools;Bio Generator|https://bio.openvibe.tools;Fancy Text|https://fancy.openvibe.tools"></div>
</div>
</div>
<script src="https://openvibe.network/shared/navbar.js"></script>
<script src="https://openvibe.network/shared/navbar.js"></script>
+ <script src="https://openvibe.network/shared/footer.js"></script>
<script src="https://openvibe.network/shared/notification-ui.js"></script>
<script src="https://openvibe.network/shared/notification-ui.js"></script>
<script src="https://openvibe.network/shared/account-switcher.js"></script>
<script src="https://openvibe.network/shared/account-switcher.js"></script>
<script src="/js/text-engine.js"></script>
<script src="/js/text-engine.js"></script>
@@ -120,25 +120,17 @@
@@ -120,25 +120,17 @@
</div>
</div>
</div>
</div>
- <footer class="site-footer">
- <div class="footer-links">
- <a href="https://openvibe.network">openvibe.tools</a>
- <a href="https://text.openvibe.tools">Text.OpenVibe</a>
- <a href="https://img.openvibe.tools">Img.OpenVibe</a>
- <a href="https://audio.openvibe.tools">Audio.OpenVibe</a>
- <a href="https://openvibe.live">OpenVibe.Live</a>
- </div>
- <p>© OpenVibe — tools for the internet, run by its community.</p>
- </footer>
+ <div id="ov-footer"></div>
</div>
</div>
<script src="https://openvibe.network/shared/navbar.js"></script>
<script src="https://openvibe.network/shared/navbar.js"></script>
+ <script src="https://openvibe.network/shared/footer.js"></script>
<script src="https://openvibe.network/shared/notification-ui.js"></script>
<script src="https://openvibe.network/shared/notification-ui.js"></script>
<script src="https://openvibe.network/shared/account-switcher.js"></script>
<script src="https://openvibe.network/shared/account-switcher.js"></script>
<script src="/js/logo-engine.js"></script>
<script src="/js/logo-engine.js"></script>
<script src="/js/shared.js"></script>
<script src="/js/shared.js"></script>
<script>
<script>
- OpenVibeUI.initPage();
+ OpenVibeUI.initPage({ footer: 'full' });
const input = document.getElementById('quickInput');
const input = document.getElementById('quickInput');
const canvas = document.getElementById('previewCanvas');
const canvas = document.getElementById('previewCanvas');
const presetGrid = document.getElementById('presetGrid');
const presetGrid = document.getElementById('presetGrid');
@@ -88,17 +88,11 @@ Made with ♥ by the OpenVibe Network</textarea>
@@ -88,17 +88,11 @@ Made with ♥ by the OpenVibe Network</textarea>
</div>
</div>
</div>
</div>
- <footer class="site-footer">
- <div class="footer-links">
- <a href="https://text.openvibe.tools">Text.OpenVibe Hub</a>
- <a href="https://escape.openvibe.tools">Escape / Unescape</a>
- <a href="https://count.openvibe.tools">Text Counter</a>
- </div>
- <p>© 2025 OpenVibe</p>
- </footer>
+ <div id="ov-footer" data-related="Escape / Unescape|https://escape.openvibe.tools;Text Counter|https://count.openvibe.tools"></div>
</div>
</div>
<script src="https://openvibe.network/shared/navbar.js"></script>
<script src="https://openvibe.network/shared/navbar.js"></script>
+ <script src="https://openvibe.network/shared/footer.js"></script>
<script src="https://openvibe.network/shared/notification-ui.js"></script>
<script src="https://openvibe.network/shared/notification-ui.js"></script>
<script src="https://openvibe.network/shared/account-switcher.js"></script>
<script src="https://openvibe.network/shared/account-switcher.js"></script>
<script src="/js/shared.js"></script>
<script src="/js/shared.js"></script>
@@ -50,17 +50,11 @@
@@ -50,17 +50,11 @@
</div>
</div>
</div>
</div>
- <footer class="site-footer">
- <div class="footer-links">
- <a href="https://text.openvibe.tools">Text.OpenVibe Hub</a>
- <a href="https://binary.openvibe.tools">Binary</a>
- <a href="https://fancy.openvibe.tools">Fancy Text</a>
- </div>
- <p>© 2025 OpenVibe</p>
- </footer>
+ <div id="ov-footer" data-related="Binary|https://binary.openvibe.tools;Fancy Text|https://fancy.openvibe.tools"></div>
</div>
</div>
<script src="https://openvibe.network/shared/navbar.js"></script>
<script src="https://openvibe.network/shared/navbar.js"></script>
+ <script src="https://openvibe.network/shared/footer.js"></script>
<script src="https://openvibe.network/shared/notification-ui.js"></script>
<script src="https://openvibe.network/shared/notification-ui.js"></script>
<script src="https://openvibe.network/shared/account-switcher.js"></script>
<script src="https://openvibe.network/shared/account-switcher.js"></script>
<script src="/js/text-engine.js"></script>
<script src="/js/text-engine.js"></script>
@@ -43,17 +43,11 @@
@@ -43,17 +43,11 @@
</div>
</div>
</div>
</div>
- <footer class="site-footer">
- <div class="footer-links">
- <a href="https://text.openvibe.tools">Text.OpenVibe Hub</a>
- <a href="https://bio.openvibe.tools">Bio Generator</a>
- <a href="https://fancy.openvibe.tools">Fancy Text</a>
- </div>
- <p>© 2025 OpenVibe</p>
- </footer>
+ <div id="ov-footer" data-related="Bio Generator|https://bio.openvibe.tools;Fancy Text|https://fancy.openvibe.tools"></div>
</div>
</div>
<script src="https://openvibe.network/shared/navbar.js"></script>
<script src="https://openvibe.network/shared/navbar.js"></script>
+ <script src="https://openvibe.network/shared/footer.js"></script>
<script src="https://openvibe.network/shared/notification-ui.js"></script>
<script src="https://openvibe.network/shared/notification-ui.js"></script>
<script src="https://openvibe.network/shared/account-switcher.js"></script>
<script src="https://openvibe.network/shared/account-switcher.js"></script>
<script src="/js/text-engine.js"></script>
<script src="/js/text-engine.js"></script>
@@ -178,18 +178,11 @@
@@ -178,18 +178,11 @@
</p>
</p>
</div>
</div>
- <footer class="site-footer">
- <div class="footer-links">
- <a href="https://ice.openvibe.tools">ICE Alerts</a>
- <a href="https://spanish.openvibe.tools">OpenVibeSpanish</a>
- <a href="https://slang.openvibe.tools">OpenVibeSlang</a>
- <a href="https://text.openvibe.tools">Text.OpenVibe Hub</a>
- </div>
- <p>© 2025 OpenVibe</p>
- </footer>
+ <div id="ov-footer" data-related="ICE Alerts|https://ice.openvibe.tools;OpenVibeSpanish|https://spanish.openvibe.tools;OpenVibeSlang|https://slang.openvibe.tools"></div>
</div>
</div>
<script src="https://openvibe.network/shared/navbar.js"></script>
<script src="https://openvibe.network/shared/navbar.js"></script>
+ <script src="https://openvibe.network/shared/footer.js"></script>
<script src="https://openvibe.network/shared/notification-ui.js"></script>
<script src="https://openvibe.network/shared/notification-ui.js"></script>
<script src="https://openvibe.network/shared/account-switcher.js"></script>
<script src="https://openvibe.network/shared/account-switcher.js"></script>
<script src="/js/shared.js"></script>
<script src="/js/shared.js"></script>
@@ -39,17 +39,11 @@
@@ -39,17 +39,11 @@
<div id="output" class="output-grid"></div>
<div id="output" class="output-grid"></div>
- <footer class="site-footer">
- <div class="footer-links">
- <a href="https://text.openvibe.tools">Text.OpenVibe Hub</a>
- <a href="https://fancy.openvibe.tools">Fancy Text</a>
- <a href="https://zalgo.openvibe.tools">Zalgo Text</a>
- </div>
- <p>© 2025 OpenVibe</p>
- </footer>
+ <div id="ov-footer" data-related="Fancy Text|https://fancy.openvibe.tools;Zalgo Text|https://zalgo.openvibe.tools"></div>
</div>
</div>
<script src="https://openvibe.network/shared/navbar.js"></script>
<script src="https://openvibe.network/shared/navbar.js"></script>
+ <script src="https://openvibe.network/shared/footer.js"></script>
<script src="https://openvibe.network/shared/notification-ui.js"></script>
<script src="https://openvibe.network/shared/notification-ui.js"></script>
<script src="https://openvibe.network/shared/account-switcher.js"></script>
<script src="https://openvibe.network/shared/account-switcher.js"></script>
<script src="/js/text-engine.js"></script>
<script src="/js/text-engine.js"></script>
@@ -128,18 +128,11 @@
@@ -128,18 +128,11 @@
<div class="slang-list" id="slang-list"></div>
<div class="slang-list" id="slang-list"></div>
</div>
</div>
- <footer class="site-footer">
- <div class="footer-links">
- <a href="https://ice.openvibe.tools">ICE Alerts</a>
- <a href="https://peso.openvibe.tools">OpenVibePeso</a>
- <a href="https://spanish.openvibe.tools">OpenVibeSpanish</a>
- <a href="https://text.openvibe.tools">Text.OpenVibe Hub</a>
- </div>
- <p>© 2025 OpenVibe</p>
- </footer>
+ <div id="ov-footer" data-related="ICE Alerts|https://ice.openvibe.tools;OpenVibePeso|https://peso.openvibe.tools;OpenVibeSpanish|https://spanish.openvibe.tools"></div>
</div>
</div>
<script src="https://openvibe.network/shared/navbar.js"></script>
<script src="https://openvibe.network/shared/navbar.js"></script>
+ <script src="https://openvibe.network/shared/footer.js"></script>
<script src="https://openvibe.network/shared/notification-ui.js"></script>
<script src="https://openvibe.network/shared/notification-ui.js"></script>
<script src="https://openvibe.network/shared/account-switcher.js"></script>
<script src="https://openvibe.network/shared/account-switcher.js"></script>
<script src="/js/shared.js"></script>
<script src="/js/shared.js"></script>
@@ -46,17 +46,11 @@
@@ -46,17 +46,11 @@
</div>
</div>
</div>
</div>
- <footer class="site-footer">
- <div class="footer-links">
- <a href="https://text.openvibe.tools">Text.OpenVibe Hub</a>
- <a href="https://case.openvibe.tools">Case Converter</a>
- <a href="https://clean.openvibe.tools">Text Cleaner</a>
- </div>
- <p>© 2025 OpenVibe</p>
- </footer>
+ <div id="ov-footer" data-related="Case Converter|https://case.openvibe.tools;Text Cleaner|https://clean.openvibe.tools"></div>
</div>
</div>
<script src="https://openvibe.network/shared/navbar.js"></script>
<script src="https://openvibe.network/shared/navbar.js"></script>
+ <script src="https://openvibe.network/shared/footer.js"></script>
<script src="https://openvibe.network/shared/notification-ui.js"></script>
<script src="https://openvibe.network/shared/notification-ui.js"></script>
<script src="https://openvibe.network/shared/account-switcher.js"></script>
<script src="https://openvibe.network/shared/account-switcher.js"></script>
<script src="/js/text-engine.js"></script>
<script src="/js/text-engine.js"></script>
@@ -56,17 +56,11 @@ elderberry</textarea>
@@ -56,17 +56,11 @@ elderberry</textarea>
</div>
</div>
</div>
</div>
- <footer class="site-footer">
- <div class="footer-links">
- <a href="https://text.openvibe.tools">Text.OpenVibe Hub</a>
- <a href="https://clean.openvibe.tools">Text Cleaner</a>
- <a href="https://count.openvibe.tools">Text Counter</a>
- </div>
- <p>© 2025 OpenVibe</p>
- </footer>
+ <div id="ov-footer" data-related="Text Cleaner|https://clean.openvibe.tools;Text Counter|https://count.openvibe.tools"></div>
</div>
</div>
<script src="https://openvibe.network/shared/navbar.js"></script>
<script src="https://openvibe.network/shared/navbar.js"></script>
+ <script src="https://openvibe.network/shared/footer.js"></script>
<script src="https://openvibe.network/shared/notification-ui.js"></script>
<script src="https://openvibe.network/shared/notification-ui.js"></script>
<script src="https://openvibe.network/shared/account-switcher.js"></script>
<script src="https://openvibe.network/shared/account-switcher.js"></script>
<script src="/js/text-engine.js"></script>
<script src="/js/text-engine.js"></script>
@@ -114,18 +114,11 @@
@@ -114,18 +114,11 @@
<div class="phrase-list" id="phrase-list"></div>
<div class="phrase-list" id="phrase-list"></div>
</div>
</div>
- <footer class="site-footer">
- <div class="footer-links">
- <a href="https://ice.openvibe.tools">ICE Alerts</a>
- <a href="https://peso.openvibe.tools">OpenVibePeso</a>
- <a href="https://slang.openvibe.tools">OpenVibeSlang</a>
- <a href="https://text.openvibe.tools">Text.OpenVibe Hub</a>
- </div>
- <p>© 2025 OpenVibe</p>
- </footer>
+ <div id="ov-footer" data-related="ICE Alerts|https://ice.openvibe.tools;OpenVibePeso|https://peso.openvibe.tools;OpenVibeSlang|https://slang.openvibe.tools"></div>
</div>
</div>
<script src="https://openvibe.network/shared/navbar.js"></script>
<script src="https://openvibe.network/shared/navbar.js"></script>
+ <script src="https://openvibe.network/shared/footer.js"></script>
<script src="https://openvibe.network/shared/notification-ui.js"></script>
<script src="https://openvibe.network/shared/notification-ui.js"></script>
<script src="https://openvibe.network/shared/account-switcher.js"></script>
<script src="https://openvibe.network/shared/account-switcher.js"></script>
<script src="/js/shared.js"></script>
<script src="/js/shared.js"></script>
@@ -39,18 +39,11 @@
@@ -39,18 +39,11 @@
<div id="categories"></div>
<div id="categories"></div>
- <footer class="site-footer">
- <div class="footer-links">
- <a href="https://text.openvibe.tools">Text.OpenVibe Hub</a>
- <a href="https://kaomoji.openvibe.tools">Kaomoji</a>
- <a href="https://fancy.openvibe.tools">Fancy Text</a>
- <a href="https://unicode.openvibe.tools">Unicode Inspector</a>
- </div>
- <p>© 2025 OpenVibe</p>
- </footer>
+ <div id="ov-footer" data-related="Kaomoji|https://kaomoji.openvibe.tools;Fancy Text|https://fancy.openvibe.tools;Unicode Inspector|https://unicode.openvibe.tools"></div>
</div>
</div>
<script src="https://openvibe.network/shared/navbar.js"></script>
<script src="https://openvibe.network/shared/navbar.js"></script>
+ <script src="https://openvibe.network/shared/footer.js"></script>
<script src="https://openvibe.network/shared/notification-ui.js"></script>
<script src="https://openvibe.network/shared/notification-ui.js"></script>
<script src="https://openvibe.network/shared/account-switcher.js"></script>
<script src="https://openvibe.network/shared/account-switcher.js"></script>
<script src="/js/text-engine.js"></script>
<script src="/js/text-engine.js"></script>
@@ -118,18 +118,11 @@
@@ -118,18 +118,11 @@
</div>
</div>
</div>
</div>
- <footer class="site-footer">
- <div class="footer-links">
- <a href="https://logo.openvibe.tools">Logo Hub</a>
- <a href="https://title.openvibe.tools">Title Cards</a>
- <a href="https://watermark.openvibe.tools">Watermark</a>
- <a href="https://openvibe.live">OpenVibe.Live</a>
- </div>
- <p>© 2025 OpenVibe</p>
- </footer>
+ <div id="ov-footer" data-related="Title Cards|https://title.openvibe.tools;Watermark|https://watermark.openvibe.tools"></div>
</div>
</div>
<script src="https://openvibe.network/shared/navbar.js"></script>
<script src="https://openvibe.network/shared/navbar.js"></script>
+ <script src="https://openvibe.network/shared/footer.js"></script>
<script src="https://openvibe.network/shared/notification-ui.js"></script>
<script src="https://openvibe.network/shared/notification-ui.js"></script>
<script src="https://openvibe.network/shared/account-switcher.js"></script>
<script src="https://openvibe.network/shared/account-switcher.js"></script>
<script src="/js/logo-engine.js"></script>
<script src="/js/logo-engine.js"></script>
@@ -126,18 +126,11 @@
@@ -126,18 +126,11 @@
</div>
</div>
</div>
</div>
- <footer class="site-footer">
- <div class="footer-links">
- <a href="https://logo.openvibe.tools">Logo Hub</a>
- <a href="https://wordmark.openvibe.tools">Wordmark</a>
- <a href="https://badge.openvibe.tools">Badge Maker</a>
- <a href="https://text.openvibe.tools">Text.OpenVibe</a>
- </div>
- <p>© 2025 OpenVibe</p>
- </footer>
+ <div id="ov-footer" data-related="Wordmark|https://wordmark.openvibe.tools;Badge Maker|https://badge.openvibe.tools"></div>
</div>
</div>
<script src="https://openvibe.network/shared/navbar.js"></script>
<script src="https://openvibe.network/shared/navbar.js"></script>
+ <script src="https://openvibe.network/shared/footer.js"></script>
<script src="https://openvibe.network/shared/notification-ui.js"></script>
<script src="https://openvibe.network/shared/notification-ui.js"></script>
<script src="https://openvibe.network/shared/account-switcher.js"></script>
<script src="https://openvibe.network/shared/account-switcher.js"></script>
<script src="/js/logo-engine.js"></script>
<script src="/js/logo-engine.js"></script>
@@ -83,18 +83,11 @@
@@ -83,18 +83,11 @@
</div>
</div>
</div>
</div>
- <footer class="site-footer">
- <div class="footer-links">
- <a href="https://logo.openvibe.tools">Logo Hub</a>
- <a href="https://title.openvibe.tools">Title Cards</a>
- <a href="https://wordmark.openvibe.tools">Wordmark</a>
- <a href="https://text.openvibe.tools">Text.OpenVibe</a>
- </div>
- <p>© 2025 OpenVibe</p>
- </footer>
+ <div id="ov-footer" data-related="Title Cards|https://title.openvibe.tools;Wordmark|https://wordmark.openvibe.tools"></div>
</div>
</div>
<script src="https://openvibe.network/shared/navbar.js"></script>
<script src="https://openvibe.network/shared/navbar.js"></script>
+ <script src="https://openvibe.network/shared/footer.js"></script>
<script src="https://openvibe.network/shared/notification-ui.js"></script>
<script src="https://openvibe.network/shared/notification-ui.js"></script>
<script src="https://openvibe.network/shared/account-switcher.js"></script>
<script src="https://openvibe.network/shared/account-switcher.js"></script>
<script src="/js/logo-engine.js"></script>
<script src="/js/logo-engine.js"></script>
@@ -57,17 +57,11 @@
@@ -57,17 +57,11 @@
</div>
</div>
</div>
</div>
- <footer class="site-footer">
- <div class="footer-links">
- <a href="https://text.openvibe.tools">Text.OpenVibe Hub</a>
- <a href="https://clean.openvibe.tools">Text Cleaner</a>
- <a href="https://binary.openvibe.tools">Binary</a>
- </div>
- <p>© 2025 OpenVibe</p>
- </footer>
+ <div id="ov-footer" data-related="Text Cleaner|https://clean.openvibe.tools;Binary|https://binary.openvibe.tools"></div>
</div>
</div>
<script src="https://openvibe.network/shared/navbar.js"></script>
<script src="https://openvibe.network/shared/navbar.js"></script>
+ <script src="https://openvibe.network/shared/footer.js"></script>
<script src="https://openvibe.network/shared/notification-ui.js"></script>
<script src="https://openvibe.network/shared/notification-ui.js"></script>
<script src="https://openvibe.network/shared/account-switcher.js"></script>
<script src="https://openvibe.network/shared/account-switcher.js"></script>
<script src="/js/text-engine.js"></script>
<script src="/js/text-engine.js"></script>
@@ -101,18 +101,11 @@
@@ -101,18 +101,11 @@
</div>
</div>
</div>
</div>
- <footer class="site-footer">
- <div class="footer-links">
- <a href="https://logo.openvibe.tools">Logo Hub</a>
- <a href="https://title.openvibe.tools">Title Cards</a>
- <a href="https://transparent.openvibe.tools">Transparent PNG</a>
- <a href="https://img.openvibe.tools">Img.OpenVibe</a>
- </div>
- <p>© 2025 OpenVibe</p>
- </footer>
+ <div id="ov-footer" data-related="Title Cards|https://title.openvibe.tools;Transparent PNG|https://transparent.openvibe.tools;Img.OpenVibe|https://img.openvibe.tools"></div>
</div>
</div>
<script src="https://openvibe.network/shared/navbar.js"></script>
<script src="https://openvibe.network/shared/navbar.js"></script>
+ <script src="https://openvibe.network/shared/footer.js"></script>
<script src="https://openvibe.network/shared/notification-ui.js"></script>
<script src="https://openvibe.network/shared/notification-ui.js"></script>
<script src="https://openvibe.network/shared/account-switcher.js"></script>
<script src="https://openvibe.network/shared/account-switcher.js"></script>
<script src="/js/logo-engine.js"></script>
<script src="/js/logo-engine.js"></script>
@@ -72,18 +72,11 @@
@@ -72,18 +72,11 @@
<div class="wordmark-grid" id="grid"></div>
<div class="wordmark-grid" id="grid"></div>
- <footer class="site-footer">
- <div class="footer-links">
- <a href="https://logo.openvibe.tools">Logo Hub</a>
- <a href="https://title.openvibe.tools">Title Cards</a>
- <a href="https://badge.openvibe.tools">Badge Maker</a>
- <a href="https://text.openvibe.tools">Text.OpenVibe</a>
- </div>
- <p>© 2025 OpenVibe</p>
- </footer>
+ <div id="ov-footer" data-related="Title Cards|https://title.openvibe.tools;Badge Maker|https://badge.openvibe.tools"></div>
</div>
</div>
<script src="https://openvibe.network/shared/navbar.js"></script>
<script src="https://openvibe.network/shared/navbar.js"></script>
+ <script src="https://openvibe.network/shared/footer.js"></script>
<script src="https://openvibe.network/shared/notification-ui.js"></script>
<script src="https://openvibe.network/shared/notification-ui.js"></script>
<script src="https://openvibe.network/shared/account-switcher.js"></script>
<script src="https://openvibe.network/shared/account-switcher.js"></script>
<script src="/js/logo-engine.js"></script>
<script src="/js/logo-engine.js"></script>
@@ -71,18 +71,11 @@
@@ -71,18 +71,11 @@
<div id="cleanOutput" class="output-box mono" style="display:none;"></div>
<div id="cleanOutput" class="output-box mono" style="display:none;"></div>
</div>
</div>
- <footer class="site-footer">
- <div class="footer-links">
- <a href="https://text.openvibe.tools">Text.OpenVibe Hub</a>
- <a href="https://fancy.openvibe.tools">Fancy Text</a>
- <a href="https://clean.openvibe.tools">Text Cleaner</a>
- <a href="https://symbols.openvibe.tools">Symbols</a>
- </div>
- <p>© 2025 OpenVibe</p>
- </footer>
+ <div id="ov-footer" data-related="Fancy Text|https://fancy.openvibe.tools;Text Cleaner|https://clean.openvibe.tools;Symbols|https://symbols.openvibe.tools"></div>
</div>
</div>
<script src="https://openvibe.network/shared/navbar.js"></script>
<script src="https://openvibe.network/shared/navbar.js"></script>
+ <script src="https://openvibe.network/shared/footer.js"></script>
<script src="https://openvibe.network/shared/notification-ui.js"></script>
<script src="https://openvibe.network/shared/notification-ui.js"></script>
<script src="https://openvibe.network/shared/account-switcher.js"></script>
<script src="https://openvibe.network/shared/account-switcher.js"></script>
<script src="/js/text-engine.js"></script>
<script src="/js/text-engine.js"></script>