Repository files navigation

Protohiro Effects

Protohiro Effects is a zero-wrapper React library for hard CSS effects on existing elements: gradient borders, spotlight reveal overlays, glass highlights, glow rings, and noise overlays.

Built for design systems and app UIs that need premium effects without extra DOM nodes, layout shifts, or runtime layout measurements.

Demo: protohiro.com/labs/effects

Packages

  • @protohiro/effects-core: shared runtime utilities.
  • @protohiro/effects: React hooks and effect styles.

Quick start

pnpm install
pnpm build
import{useGradientBorderEffect}from'@protohiro/effects';functionButton(){constref=useGradientBorderEffect({thickness: 2,angle: 90});return<buttonref={ref}>Click</button>;}

Why this exists

Most visual effects are easy to prototype and annoying to ship. Hand-rolled CSS often turns into:

  • extra wrapper elements
  • pseudo-element conflicts
  • broken border-radius clipping
  • SSR and hydration edge cases
  • Safari-specific fallback work

Protohiro Effects packages those effects as React hooks that mutate only classList and CSS custom properties on a single existing element.

Best-fit use cases

  • react gradient border without wrappers
  • react spotlight reveal effect on cards and CTAs
  • react glass highlight for premium dark surfaces
  • CSS effects for design systems and headless UI components
  • composable single-element effects that preserve refs

Hooks

useGradientBorderEffect(options)

Single-element gradient border with border-radius support and a graceful Safari fallback.

Options:

  • thickness?: string | number
  • radius?: string | number
  • colors?: string
  • angle?: string | number
  • disabled?: boolean

useGlassHighlightEffect(options)

Adds a restrained glass highlight layer tuned for premium dark surfaces.

Options:

  • color?: string
  • edgeOpacity?: number
  • sheenOpacity?: number
  • tintOpacity?: number
  • angle?: string | number
  • blur?: string | number
  • radius?: string | number
  • inset?: string | number
  • saturate?: number
  • disabled?: boolean

useGlowEffect(options)

Lightweight supporting glow for composition. Useful, but simpler than the core hard effects.

Options:

  • color?: string
  • blur?: string | number
  • spread?: string | number
  • opacity?: number
  • disabled?: boolean

useNoiseEffect(options)

Noise overlay for textured surfaces and layered compositions.

Options:

  • size?: string | number
  • intensity?: number
  • disabled?: boolean

useSpotlightEffect(options)

Interactive spotlight and reveal effect for premium cards, media, and CTA surfaces.

Options:

  • mode?: 'glow' | 'reveal'
  • size?: string | number
  • intensity?: number
  • color?: string
  • softness?: number
  • coreIntensity?: number
  • x?: string | number
  • y?: string | number
  • followPointer?: boolean
  • revealColor?: string
  • revealImage?: string
  • revealSize?: string | number
  • revealOpacity?: number
  • disabled?: boolean

Safari notes

gradient-border uses mask-composite for the preferred ring rendering path. Safari fallback uses a simplified border and layered background. The fallback keeps content readable and does not hide element content.

Positioning

This library is strongest when you need effects that are awkward to ship by hand:

  • gradient borders with correct clipping
  • spotlight reveal overlays
  • subtle glass highlights on existing components

glow and noise are supporting effects. The main value is shipping the harder UI effects safely on a single element.

Composability

Hooks are composable because each effect writes only namespaced classes (pe-*) and CSS variables (--pe-*).

Quality gates

pnpm lint
pnpm typecheck
pnpm test
pnpm size

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

Protohiro Effects

Protohiro Effects is a zero-wrapper React library for hard CSS effects on existing elements: gradient borders, spotlight reveal overlays, glass highlights, glow rings, and noise overlays.

Built for design systems and app UIs that need premium effects without extra DOM nodes, layout shifts, or runtime layout measurements.

Demo: protohiro.com/labs/effects

Packages

  • @protohiro/effects-core: shared runtime utilities.
  • @protohiro/effects: React hooks and effect styles.

Quick start

pnpm install
pnpm build
import{useGradientBorderEffect}from'@protohiro/effects';functionButton(){constref=useGradientBorderEffect({thickness: 2,angle: 90});return<buttonref={ref}>Click</button>;}

Why this exists

Most visual effects are easy to prototype and annoying to ship. Hand-rolled CSS often turns into:

  • extra wrapper elements
  • pseudo-element conflicts
  • broken border-radius clipping
  • SSR and hydration edge cases
  • Safari-specific fallback work

Protohiro Effects packages those effects as React hooks that mutate only classList and CSS custom properties on a single existing element.

Best-fit use cases

  • react gradient border without wrappers
  • react spotlight reveal effect on cards and CTAs
  • react glass highlight for premium dark surfaces
  • CSS effects for design systems and headless UI components
  • composable single-element effects that preserve refs

Hooks

useGradientBorderEffect(options)

Single-element gradient border with border-radius support and a graceful Safari fallback.

Options:

  • thickness?: string | number
  • radius?: string | number
  • colors?: string
  • angle?: string | number
  • disabled?: boolean

useGlassHighlightEffect(options)

Adds a restrained glass highlight layer tuned for premium dark surfaces.

Options:

  • color?: string
  • edgeOpacity?: number
  • sheenOpacity?: number
  • tintOpacity?: number
  • angle?: string | number
  • blur?: string | number
  • radius?: string | number
  • inset?: string | number
  • saturate?: number
  • disabled?: boolean

useGlowEffect(options)

Lightweight supporting glow for composition. Useful, but simpler than the core hard effects.

Options:

  • color?: string
  • blur?: string | number
  • spread?: string | number
  • opacity?: number
  • disabled?: boolean

useNoiseEffect(options)

Noise overlay for textured surfaces and layered compositions.

Options:

  • size?: string | number
  • intensity?: number
  • disabled?: boolean

useSpotlightEffect(options)

Interactive spotlight and reveal effect for premium cards, media, and CTA surfaces.

Options:

  • mode?: 'glow' | 'reveal'
  • size?: string | number
  • intensity?: number
  • color?: string
  • softness?: number
  • coreIntensity?: number
  • x?: string | number
  • y?: string | number
  • followPointer?: boolean
  • revealColor?: string
  • revealImage?: string
  • revealSize?: string | number
  • revealOpacity?: number
  • disabled?: boolean

Safari notes

gradient-border uses mask-composite for the preferred ring rendering path. Safari fallback uses a simplified border and layered background. The fallback keeps content readable and does not hide element content.

Positioning

This library is strongest when you need effects that are awkward to ship by hand:

  • gradient borders with correct clipping
  • spotlight reveal overlays
  • subtle glass highlights on existing components

glow and noise are supporting effects. The main value is shipping the harder UI effects safely on a single element.

Composability

Hooks are composable because each effect writes only namespaced classes (pe-*) and CSS variables (--pe-*).

Quality gates

pnpm lint
pnpm typecheck
pnpm test
pnpm size

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Protohiro Effects

Protohiro Effects is a zero-wrapper React library for hard CSS effects on existing elements: gradient borders, spotlight reveal overlays, glass highlights, glow rings, and noise overlays.

Built for design systems and app UIs that need premium effects without extra DOM nodes, layout shifts, or runtime layout measurements.

Demo: protohiro.com/labs/effects

Packages

  • @protohiro/effects-core: shared runtime utilities.
  • @protohiro/effects: React hooks and effect styles.

Quick start

pnpm install
pnpm build
import{useGradientBorderEffect}from'@protohiro/effects';functionButton(){constref=useGradientBorderEffect({thickness: 2,angle: 90});return<buttonref={ref}>Click</button>;}

Why this exists

Most visual effects are easy to prototype and annoying to ship. Hand-rolled CSS often turns into:

  • extra wrapper elements
  • pseudo-element conflicts
  • broken border-radius clipping
  • SSR and hydration edge cases
  • Safari-specific fallback work

Protohiro Effects packages those effects as React hooks that mutate only classList and CSS custom properties on a single existing element.

Best-fit use cases

  • react gradient border without wrappers
  • react spotlight reveal effect on cards and CTAs
  • react glass highlight for premium dark surfaces
  • CSS effects for design systems and headless UI components
  • composable single-element effects that preserve refs

Hooks

useGradientBorderEffect(options)

Single-element gradient border with border-radius support and a graceful Safari fallback.

Options:

  • thickness?: string | number
  • radius?: string | number
  • colors?: string
  • angle?: string | number
  • disabled?: boolean

useGlassHighlightEffect(options)

Adds a restrained glass highlight layer tuned for premium dark surfaces.

Options:

  • color?: string
  • edgeOpacity?: number
  • sheenOpacity?: number
  • tintOpacity?: number
  • angle?: string | number
  • blur?: string | number
  • radius?: string | number
  • inset?: string | number
  • saturate?: number
  • disabled?: boolean

useGlowEffect(options)

Lightweight supporting glow for composition. Useful, but simpler than the core hard effects.

Options:

  • color?: string
  • blur?: string | number
  • spread?: string | number
  • opacity?: number
  • disabled?: boolean

useNoiseEffect(options)

Noise overlay for textured surfaces and layered compositions.

Options:

  • size?: string | number
  • intensity?: number
  • disabled?: boolean

useSpotlightEffect(options)

Interactive spotlight and reveal effect for premium cards, media, and CTA surfaces.

Options:

  • mode?: 'glow' | 'reveal'
  • size?: string | number
  • intensity?: number
  • color?: string
  • softness?: number
  • coreIntensity?: number
  • x?: string | number
  • y?: string | number
  • followPointer?: boolean
  • revealColor?: string
  • revealImage?: string
  • revealSize?: string | number
  • revealOpacity?: number
  • disabled?: boolean

Safari notes

gradient-border uses mask-composite for the preferred ring rendering path. Safari fallback uses a simplified border and layered background. The fallback keeps content readable and does not hide element content.

Positioning

This library is strongest when you need effects that are awkward to ship by hand:

  • gradient borders with correct clipping
  • spotlight reveal overlays
  • subtle glass highlights on existing components

glow and noise are supporting effects. The main value is shipping the harder UI effects safely on a single element.

Composability

Hooks are composable because each effect writes only namespaced classes (pe-*) and CSS variables (--pe-*).

Quality gates

pnpm lint
pnpm typecheck
pnpm test
pnpm size

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Protohiro Effects

Protohiro Effects is a zero-wrapper React library for hard CSS effects on existing elements: gradient borders, spotlight reveal overlays, glass highlights, glow rings, and noise overlays.

Built for design systems and app UIs that need premium effects without extra DOM nodes, layout shifts, or runtime layout measurements.

Demo: protohiro.com/labs/effects

Packages

  • @protohiro/effects-core: shared runtime utilities.
  • @protohiro/effects: React hooks and effect styles.

Quick start

pnpm install
pnpm build
import{useGradientBorderEffect}from'@protohiro/effects';functionButton(){constref=useGradientBorderEffect({thickness: 2,angle: 90});return<buttonref={ref}>Click</button>;}

Why this exists

Most visual effects are easy to prototype and annoying to ship. Hand-rolled CSS often turns into:

  • extra wrapper elements
  • pseudo-element conflicts
  • broken border-radius clipping
  • SSR and hydration edge cases
  • Safari-specific fallback work

Protohiro Effects packages those effects as React hooks that mutate only classList and CSS custom properties on a single existing element.

Best-fit use cases

  • react gradient border without wrappers
  • react spotlight reveal effect on cards and CTAs
  • react glass highlight for premium dark surfaces
  • CSS effects for design systems and headless UI components
  • composable single-element effects that preserve refs

Hooks

useGradientBorderEffect(options)

Single-element gradient border with border-radius support and a graceful Safari fallback.

Options:

  • thickness?: string | number
  • radius?: string | number
  • colors?: string
  • angle?: string | number
  • disabled?: boolean

useGlassHighlightEffect(options)

Adds a restrained glass highlight layer tuned for premium dark surfaces.

Options:

  • color?: string
  • edgeOpacity?: number
  • sheenOpacity?: number
  • tintOpacity?: number
  • angle?: string | number
  • blur?: string | number
  • radius?: string | number
  • inset?: string | number
  • saturate?: number
  • disabled?: boolean

useGlowEffect(options)

Lightweight supporting glow for composition. Useful, but simpler than the core hard effects.

Options:

  • color?: string
  • blur?: string | number
  • spread?: string | number
  • opacity?: number
  • disabled?: boolean

useNoiseEffect(options)

Noise overlay for textured surfaces and layered compositions.

Options:

  • size?: string | number
  • intensity?: number
  • disabled?: boolean

useSpotlightEffect(options)

Interactive spotlight and reveal effect for premium cards, media, and CTA surfaces.

Options:

  • mode?: 'glow' | 'reveal'
  • size?: string | number
  • intensity?: number
  • color?: string
  • softness?: number
  • coreIntensity?: number
  • x?: string | number
  • y?: string | number
  • followPointer?: boolean
  • revealColor?: string
  • revealImage?: string
  • revealSize?: string | number
  • revealOpacity?: number
  • disabled?: boolean

Safari notes

gradient-border uses mask-composite for the preferred ring rendering path. Safari fallback uses a simplified border and layered background. The fallback keeps content readable and does not hide element content.

Positioning

This library is strongest when you need effects that are awkward to ship by hand:

  • gradient borders with correct clipping
  • spotlight reveal overlays
  • subtle glass highlights on existing components

glow and noise are supporting effects. The main value is shipping the harder UI effects safely on a single element.

Composability

Hooks are composable because each effect writes only namespaced classes (pe-*) and CSS variables (--pe-*).

Quality gates

pnpm lint
pnpm typecheck
pnpm test
pnpm size

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

Protohiro Effects

Protohiro Effects is a zero-wrapper React library for hard CSS effects on existing elements: gradient borders, spotlight reveal overlays, glass highlights, glow rings, and noise overlays.

Built for design systems and app UIs that need premium effects without extra DOM nodes, layout shifts, or runtime layout measurements.

Demo: protohiro.com/labs/effects

Packages

  • @protohiro/effects-core: shared runtime utilities.
  • @protohiro/effects: React hooks and effect styles.

Quick start

pnpm install
pnpm build
import{useGradientBorderEffect}from'@protohiro/effects';functionButton(){constref=useGradientBorderEffect({thickness: 2,angle: 90});return<buttonref={ref}>Click</button>;}

Why this exists

Most visual effects are easy to prototype and annoying to ship. Hand-rolled CSS often turns into:

  • extra wrapper elements
  • pseudo-element conflicts
  • broken border-radius clipping
  • SSR and hydration edge cases
  • Safari-specific fallback work

Protohiro Effects packages those effects as React hooks that mutate only classList and CSS custom properties on a single existing element.

Best-fit use cases

  • react gradient border without wrappers
  • react spotlight reveal effect on cards and CTAs
  • react glass highlight for premium dark surfaces
  • CSS effects for design systems and headless UI components
  • composable single-element effects that preserve refs

Hooks

useGradientBorderEffect(options)

Single-element gradient border with border-radius support and a graceful Safari fallback.

Options:

  • thickness?: string | number
  • radius?: string | number
  • colors?: string
  • angle?: string | number
  • disabled?: boolean

useGlassHighlightEffect(options)

Adds a restrained glass highlight layer tuned for premium dark surfaces.

Options:

  • color?: string
  • edgeOpacity?: number
  • sheenOpacity?: number
  • tintOpacity?: number
  • angle?: string | number
  • blur?: string | number
  • radius?: string | number
  • inset?: string | number
  • saturate?: number
  • disabled?: boolean

useGlowEffect(options)

Lightweight supporting glow for composition. Useful, but simpler than the core hard effects.

Options:

  • color?: string
  • blur?: string | number
  • spread?: string | number
  • opacity?: number
  • disabled?: boolean

useNoiseEffect(options)

Noise overlay for textured surfaces and layered compositions.

Options:

  • size?: string | number
  • intensity?: number
  • disabled?: boolean

useSpotlightEffect(options)

Interactive spotlight and reveal effect for premium cards, media, and CTA surfaces.

Options:

  • mode?: 'glow' | 'reveal'
  • size?: string | number
  • intensity?: number
  • color?: string
  • softness?: number
  • coreIntensity?: number
  • x?: string | number
  • y?: string | number
  • followPointer?: boolean
  • revealColor?: string
  • revealImage?: string
  • revealSize?: string | number
  • revealOpacity?: number
  • disabled?: boolean

Safari notes

gradient-border uses mask-composite for the preferred ring rendering path. Safari fallback uses a simplified border and layered background. The fallback keeps content readable and does not hide element content.

Positioning

This library is strongest when you need effects that are awkward to ship by hand:

  • gradient borders with correct clipping
  • spotlight reveal overlays
  • subtle glass highlights on existing components

glow and noise are supporting effects. The main value is shipping the harder UI effects safely on a single element.

Composability

Hooks are composable because each effect writes only namespaced classes (pe-*) and CSS variables (--pe-*).

Quality gates

pnpm lint
pnpm typecheck
pnpm test
pnpm size

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Protohiro Effects

Protohiro Effects is a zero-wrapper React library for hard CSS effects on existing elements: gradient borders, spotlight reveal overlays, glass highlights, glow rings, and noise overlays.

Built for design systems and app UIs that need premium effects without extra DOM nodes, layout shifts, or runtime layout measurements.

Demo: protohiro.com/labs/effects

Packages

  • @protohiro/effects-core: shared runtime utilities.
  • @protohiro/effects: React hooks and effect styles.

Quick start

pnpm install
pnpm build
import{useGradientBorderEffect}from'@protohiro/effects';functionButton(){constref=useGradientBorderEffect({thickness: 2,angle: 90});return<buttonref={ref}>Click</button>;}

Why this exists

Most visual effects are easy to prototype and annoying to ship. Hand-rolled CSS often turns into:

  • extra wrapper elements
  • pseudo-element conflicts
  • broken border-radius clipping
  • SSR and hydration edge cases
  • Safari-specific fallback work

Protohiro Effects packages those effects as React hooks that mutate only classList and CSS custom properties on a single existing element.

Best-fit use cases

  • react gradient border without wrappers
  • react spotlight reveal effect on cards and CTAs
  • react glass highlight for premium dark surfaces
  • CSS effects for design systems and headless UI components
  • composable single-element effects that preserve refs

Hooks

useGradientBorderEffect(options)

Single-element gradient border with border-radius support and a graceful Safari fallback.

Options:

  • thickness?: string | number
  • radius?: string | number
  • colors?: string
  • angle?: string | number
  • disabled?: boolean

useGlassHighlightEffect(options)

Adds a restrained glass highlight layer tuned for premium dark surfaces.

Options:

  • color?: string
  • edgeOpacity?: number
  • sheenOpacity?: number
  • tintOpacity?: number
  • angle?: string | number
  • blur?: string | number
  • radius?: string | number
  • inset?: string | number
  • saturate?: number
  • disabled?: boolean

useGlowEffect(options)

Lightweight supporting glow for composition. Useful, but simpler than the core hard effects.

Options:

  • color?: string
  • blur?: string | number
  • spread?: string | number
  • opacity?: number
  • disabled?: boolean

useNoiseEffect(options)

Noise overlay for textured surfaces and layered compositions.

Options:

  • size?: string | number
  • intensity?: number
  • disabled?: boolean

useSpotlightEffect(options)

Interactive spotlight and reveal effect for premium cards, media, and CTA surfaces.

Options:

  • mode?: 'glow' | 'reveal'
  • size?: string | number
  • intensity?: number
  • color?: string
  • softness?: number
  • coreIntensity?: number
  • x?: string | number
  • y?: string | number
  • followPointer?: boolean
  • revealColor?: string
  • revealImage?: string
  • revealSize?: string | number
  • revealOpacity?: number
  • disabled?: boolean

Safari notes

gradient-border uses mask-composite for the preferred ring rendering path. Safari fallback uses a simplified border and layered background. The fallback keeps content readable and does not hide element content.

Positioning

This library is strongest when you need effects that are awkward to ship by hand:

  • gradient borders with correct clipping
  • spotlight reveal overlays
  • subtle glass highlights on existing components

glow and noise are supporting effects. The main value is shipping the harder UI effects safely on a single element.

Composability

Hooks are composable because each effect writes only namespaced classes (pe-*) and CSS variables (--pe-*).

Quality gates

pnpm lint
pnpm typecheck
pnpm test
pnpm size

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Protohiro Effects

Protohiro Effects is a zero-wrapper React library for hard CSS effects on existing elements: gradient borders, spotlight reveal overlays, glass highlights, glow rings, and noise overlays.

Built for design systems and app UIs that need premium effects without extra DOM nodes, layout shifts, or runtime layout measurements.

Demo: protohiro.com/labs/effects

Packages

  • @protohiro/effects-core: shared runtime utilities.
  • @protohiro/effects: React hooks and effect styles.

Quick start

pnpm install
pnpm build
import{useGradientBorderEffect}from'@protohiro/effects';functionButton(){constref=useGradientBorderEffect({thickness: 2,angle: 90});return<buttonref={ref}>Click</button>;}

Why this exists

Most visual effects are easy to prototype and annoying to ship. Hand-rolled CSS often turns into:

  • extra wrapper elements
  • pseudo-element conflicts
  • broken border-radius clipping
  • SSR and hydration edge cases
  • Safari-specific fallback work

Protohiro Effects packages those effects as React hooks that mutate only classList and CSS custom properties on a single existing element.

Best-fit use cases

  • react gradient border without wrappers
  • react spotlight reveal effect on cards and CTAs
  • react glass highlight for premium dark surfaces
  • CSS effects for design systems and headless UI components
  • composable single-element effects that preserve refs

Hooks

useGradientBorderEffect(options)

Single-element gradient border with border-radius support and a graceful Safari fallback.

Options:

  • thickness?: string | number
  • radius?: string | number
  • colors?: string
  • angle?: string | number
  • disabled?: boolean

useGlassHighlightEffect(options)

Adds a restrained glass highlight layer tuned for premium dark surfaces.

Options:

  • color?: string
  • edgeOpacity?: number
  • sheenOpacity?: number
  • tintOpacity?: number
  • angle?: string | number
  • blur?: string | number
  • radius?: string | number
  • inset?: string | number
  • saturate?: number
  • disabled?: boolean

useGlowEffect(options)

Lightweight supporting glow for composition. Useful, but simpler than the core hard effects.

Options:

  • color?: string
  • blur?: string | number
  • spread?: string | number
  • opacity?: number
  • disabled?: boolean

useNoiseEffect(options)

Noise overlay for textured surfaces and layered compositions.

Options:

  • size?: string | number
  • intensity?: number
  • disabled?: boolean

useSpotlightEffect(options)

Interactive spotlight and reveal effect for premium cards, media, and CTA surfaces.

Options:

  • mode?: 'glow' | 'reveal'
  • size?: string | number
  • intensity?: number
  • color?: string
  • softness?: number
  • coreIntensity?: number
  • x?: string | number
  • y?: string | number
  • followPointer?: boolean
  • revealColor?: string
  • revealImage?: string
  • revealSize?: string | number
  • revealOpacity?: number
  • disabled?: boolean

Safari notes

gradient-border uses mask-composite for the preferred ring rendering path. Safari fallback uses a simplified border and layered background. The fallback keeps content readable and does not hide element content.

Positioning

This library is strongest when you need effects that are awkward to ship by hand:

  • gradient borders with correct clipping
  • spotlight reveal overlays
  • subtle glass highlights on existing components

glow and noise are supporting effects. The main value is shipping the harder UI effects safely on a single element.

Composability

Hooks are composable because each effect writes only namespaced classes (pe-*) and CSS variables (--pe-*).

Quality gates

pnpm lint
pnpm typecheck
pnpm test
pnpm size

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

Protohiro Effects

Protohiro Effects is a zero-wrapper React library for hard CSS effects on existing elements: gradient borders, spotlight reveal overlays, glass highlights, glow rings, and noise overlays.

Built for design systems and app UIs that need premium effects without extra DOM nodes, layout shifts, or runtime layout measurements.

Demo: protohiro.com/labs/effects

Packages

  • @protohiro/effects-core: shared runtime utilities.
  • @protohiro/effects: React hooks and effect styles.

Quick start

pnpm install
pnpm build
import{useGradientBorderEffect}from'@protohiro/effects';functionButton(){constref=useGradientBorderEffect({thickness: 2,angle: 90});return<buttonref={ref}>Click</button>;}

Why this exists

Most visual effects are easy to prototype and annoying to ship. Hand-rolled CSS often turns into:

  • extra wrapper elements
  • pseudo-element conflicts
  • broken border-radius clipping
  • SSR and hydration edge cases
  • Safari-specific fallback work

Protohiro Effects packages those effects as React hooks that mutate only classList and CSS custom properties on a single existing element.

Best-fit use cases

  • react gradient border without wrappers
  • react spotlight reveal effect on cards and CTAs
  • react glass highlight for premium dark surfaces
  • CSS effects for design systems and headless UI components
  • composable single-element effects that preserve refs

Hooks

useGradientBorderEffect(options)

Single-element gradient border with border-radius support and a graceful Safari fallback.

Options:

  • thickness?: string | number
  • radius?: string | number
  • colors?: string
  • angle?: string | number
  • disabled?: boolean

useGlassHighlightEffect(options)

Adds a restrained glass highlight layer tuned for premium dark surfaces.

Options:

  • color?: string
  • edgeOpacity?: number
  • sheenOpacity?: number
  • tintOpacity?: number
  • angle?: string | number
  • blur?: string | number
  • radius?: string | number
  • inset?: string | number
  • saturate?: number
  • disabled?: boolean

useGlowEffect(options)

Lightweight supporting glow for composition. Useful, but simpler than the core hard effects.

Options:

  • color?: string
  • blur?: string | number
  • spread?: string | number
  • opacity?: number
  • disabled?: boolean

useNoiseEffect(options)

Noise overlay for textured surfaces and layered compositions.

Options:

  • size?: string | number
  • intensity?: number
  • disabled?: boolean

useSpotlightEffect(options)

Interactive spotlight and reveal effect for premium cards, media, and CTA surfaces.

Options:

  • mode?: 'glow' | 'reveal'
  • size?: string | number
  • intensity?: number
  • color?: string
  • softness?: number
  • coreIntensity?: number
  • x?: string | number
  • y?: string | number
  • followPointer?: boolean
  • revealColor?: string
  • revealImage?: string
  • revealSize?: string | number
  • revealOpacity?: number
  • disabled?: boolean

Safari notes

gradient-border uses mask-composite for the preferred ring rendering path. Safari fallback uses a simplified border and layered background. The fallback keeps content readable and does not hide element content.

Positioning

This library is strongest when you need effects that are awkward to ship by hand:

  • gradient borders with correct clipping
  • spotlight reveal overlays
  • subtle glass highlights on existing components

glow and noise are supporting effects. The main value is shipping the harder UI effects safely on a single element.

Composability

Hooks are composable because each effect writes only namespaced classes (pe-*) and CSS variables (--pe-*).

Quality gates

pnpm lint
pnpm typecheck
pnpm test
pnpm size

Releases

Packages

Contributors

Languages