Typography typographycyberpunkdecodeglitchmatrix
Hacker Decode Text
Matrix/Cyberpunk scrambled text reveal effect that rapidly randomizes glyphs before resolving into the final string.
Preview
CYBERNETIC PROTOCOL ONLINE
Usage
Copy the full block below to use this component with its imports.
astro
---
import { HackerDecodeText } from 'astro-component-kit';
---
<HackerDecodeText text="CYBERNETIC_INTERFACE_INITIALIZED" speed={40} /> ---
import { HackerDecodeText } from 'astro-component-kit';
---
<HackerDecodeText text="CYBERNETIC_INTERFACE_INITIALIZED" speed={40} /> Manual Installation
If you are not using the npm package, create a new file src/components/lib/HackerDecodeText.astro and paste the following code:
astro
---
/**
* HackerDecodeText — Cyberpunk Matrix-style randomized character deciphering effect on hover.
*
* @param {string} text - Final decoded text string. Default is 'CYBERNETIC SYSTEM READY'.
* @param {string} tag - HTML heading or paragraph tag. Default is 'h3'.
* @param {string} className - Optional CSS class names.
*/
interface Props {
text?: string;
tag?: 'h1' | 'h2' | 'h3' | 'h4' | 'p' | 'span';
className?: string;
}
const {
text = 'CYBERNETIC PROTOCOL ONLINE',
tag: Tag = 'h3',
className = '',
} = Astro.props;
---
<Tag
class:list={['hacker-text', className]}
data-hacker-text={text}
title="Hover to decode"
>
{text}
</Tag>
<style>
.hacker-text {
font-family: var(--font-mono, 'JetBrains Mono', monospace);
font-size: clamp(1.2rem, 3vw, 2rem);
font-weight: 800;
color: var(--c-primary-light, #d4a017);
letter-spacing: 0.08em;
cursor: default;
user-select: none;
transition: text-shadow 0.2s ease;
}
.hacker-text:hover {
text-shadow: 0 0 12px rgba(212, 160, 23, 0.7);
}
</style>
<script>
const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%^&*()_+-=[]{}|;:,.<>?';
function setupHackerText() {
document.querySelectorAll('[data-hacker-text]').forEach((el) => {
if (el.getAttribute('data-hacker-init')) return;
el.setAttribute('data-hacker-init', 'true');
const original = el.getAttribute('data-hacker-text') || el.textContent || '';
let interval: any = null;
el.addEventListener('pointerenter', () => {
let iteration = 0;
clearInterval(interval);
interval = setInterval(() => {
el.textContent = original
.split('')
.map((char, index) => {
if (char === ' ') return ' ';
if (index < iteration) {
return original[index];
}
return chars[Math.floor(Math.random() * chars.length)];
})
.join('');
if (iteration >= original.length) {
clearInterval(interval);
}
iteration += 1 / 2;
}, 30);
});
});
}
setupHackerText();
document.addEventListener('astro:page-load', setupHackerText);
</script> ---
/**
* HackerDecodeText — Cyberpunk Matrix-style randomized character deciphering effect on hover.
*
* @param {string} text - Final decoded text string. Default is 'CYBERNETIC SYSTEM READY'.
* @param {string} tag - HTML heading or paragraph tag. Default is 'h3'.
* @param {string} className - Optional CSS class names.
*/
interface Props {
text?: string;
tag?: 'h1' | 'h2' | 'h3' | 'h4' | 'p' | 'span';
className?: string;
}
const {
text = 'CYBERNETIC PROTOCOL ONLINE',
tag: Tag = 'h3',
className = '',
} = Astro.props;
---
<Tag
class:list={['hacker-text', className]}
data-hacker-text={text}
title="Hover to decode"
>
{text}
</Tag>
<style>
.hacker-text {
font-family: var(--font-mono, 'JetBrains Mono', monospace);
font-size: clamp(1.2rem, 3vw, 2rem);
font-weight: 800;
color: var(--c-primary-light, #d4a017);
letter-spacing: 0.08em;
cursor: default;
user-select: none;
transition: text-shadow 0.2s ease;
}
.hacker-text:hover {
text-shadow: 0 0 12px rgba(212, 160, 23, 0.7);
}
</style>
<script>
const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%^&*()_+-=[]{}|;:,.<>?';
function setupHackerText() {
document.querySelectorAll('[data-hacker-text]').forEach((el) => {
if (el.getAttribute('data-hacker-init')) return;
el.setAttribute('data-hacker-init', 'true');
const original = el.getAttribute('data-hacker-text') || el.textContent || '';
let interval: any = null;
el.addEventListener('pointerenter', () => {
let iteration = 0;
clearInterval(interval);
interval = setInterval(() => {
el.textContent = original
.split('')
.map((char, index) => {
if (char === ' ') return ' ';
if (index < iteration) {
return original[index];
}
return chars[Math.floor(Math.random() * chars.length)];
})
.join('');
if (iteration >= original.length) {
clearInterval(interval);
}
iteration += 1 / 2;
}, 30);
});
});
}
setupHackerText();
document.addEventListener('astro:page-load', setupHackerText);
</script>
Quick Info
- Category
- Typography
- Filename
HackerDecodeText.astro- Dependencies
- None — pure Astro + CSS
- Tags
- typographycyberpunkdecodeglitchmatrix