Agent skill

Reveal Hover Effect

by boraoztunc in boraoztunc/skills

Build cursor-following spotlight reveals that expose a second aligned image through a soft radial mask.

Apache-2.0Auto-check passed

Install Reveal Hover Effect

skills CLI
$ npx skills add boraoztunc/skills --skill reveal-hover-effect -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install boraoztunc/skills reveal-hover-effect --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ git clone --depth 1 https://github.com/boraoztunc/skills.git skills-src && mkdir -p .claude/skills && cp -r skills-src/reveal-hover-effect .claude/skills/reveal-hover-effect && rm -rf skills-src

Use ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.

Claude Code skills documentation · loads skills from .claude/skills/

Facts

Skill name
reveal-hover-effect
GitHub stars
395
Used in
2 other repos
Token cost
~2.6k tokens
SKILL.md length
643 words
Files
2
Skills in repo
52
Repo updated
First seen
Licence
Apache-2.0

At a glance

Build cursor-following spotlight reveals that expose a second aligned image through a soft radial mask.

  • Works in 7 steps: Prepare two images with identical… → Keep the base image fully visible. → Stack the reveal image directly above it. → …
  • Before-and-after
  • SKILL.md covers Core Contract, Motion Defaults, Markup and CSS Mask, plus 6 more sections
  • Instructions only: no scripts, shell commands, URLs or credentials in SKILL.md

What it does

Reveal Hover Effect is an agent skill from boraoztunc/skills. Build cursor-following spotlight reveals that expose a second aligned image through a soft radial mask. Use for hover-to-color, before-and-after, x-ray, material, texture, product-detail, and illustrated hero effects where a desaturated or embossed base image should remain visible while another treatment follows an eased pointer.

Its SKILL.md is about 2.6k tokens, which your agent loads only when the skill is triggered. The skill folder holds 1 other file (for example `REFERENCES.md`).

The repository describes itself as: Claude Code skills for copywriting, SEO, design, and more. The licence is Apache-2.0.

When your agent uses it

  • Before-and-after
  • Illustrated hero effects where a desaturated
  • Embossed base image should remain visible while another treatment follows an eased pointer

Example prompts

  • “/reveal-hover-effect”

Workflow steps

7 steps, taken from the first numbered list in SKILL.md.

  1. Prepare two images with identical dimensions, composition, crop, and focal point.
  2. Keep the base image fully visible.
  3. Stack the reveal image directly above it.
  4. Apply a feathered radial mask-image to the reveal image.
  5. Track pointer coordinates in the component's local coordinate space.
  6. Ease the rendered position toward the raw pointer with requestAnimationFrame.
  7. Collapse the mask on pointer exit; never leave a stale spotlight behind.

What it can do on your machine

Read from SKILL.md and the folder at commit 645553c. It shows what the files ask for, not the result of running them.

  • Tool permissions

    Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.

    From allowed-tools in the SKILL.md frontmatter.

  • Runs code

    No scripts in the folder and no shell commands in SKILL.md (its code samples are html, css and javascript).

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    No URLs in SKILL.md.

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names no API keys, tokens, secrets or passwords.

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

Reveal Hover Effect loads about 2.6k tokens when it runs. Until then it costs about 88 tokens; SKILL.md has 643 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~88
When it runs · the whole SKILL.md, loaded when a task matches
~2.6k

Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.

Safety

Auto-check passed

The automated check found no risky patterns in SKILL.md.

Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.

SKILL.md

The full file from boraoztunc/skills at commit 645553c, republished under its Apache-2.0 licence (© boraoztunc). 643 words, ~2,610 tokens.

Download SKILL.mdSave it as .claude/skills/reveal-hover-effect/SKILL.md (or your agent's skills folder). This skill also uses 1 other file; get the full folder from GitHub.
name
reveal-hover-effect
description
Build cursor-following spotlight reveals that expose a second aligned image through a soft radial mask. Use for hover-to-color, before-and-after, x-ray, material, texture, product-detail, and illustrated hero effects where a desaturated or embossed base image should remain visible while another treatment follows an eased pointer.

Reveal Hover Effect

Core Contract

  1. Prepare two images with identical dimensions, composition, crop, and focal point.
  2. Keep the base image fully visible.
  3. Stack the reveal image directly above it.
  4. Apply a feathered radial mask-image to the reveal image.
  5. Track pointer coordinates in the component's local coordinate space.
  6. Ease the rendered position toward the raw pointer with requestAnimationFrame.
  7. Collapse the mask on pointer exit; never leave a stale spotlight behind.

Default to CSS masks instead of generating a canvas data URL every frame. The CSS version preserves the same look with less allocation and simpler cleanup.

Motion Defaults

  • Desktop spotlight radius: 260px.
  • Compact spotlight radius: 140px to 220px.
  • Pointer easing: 0.1.
  • Radius easing: 0.14.
  • Mask stops:
    • 0%: alpha 1
    • 40%: alpha 1
    • 60%: alpha 0.75
    • 75%: alpha 0.4
    • 88%: alpha 0.12
    • 100%: alpha 0
  • Initial state: base image only.
  • Exit state: radius eases back to 0.
  • Cursor: keep the native cursor unless the design explicitly needs a custom one.

Markup

Use real images so loading, intrinsic sizing, and accessibility remain predictable.

html
<figure class="reveal-hover" data-reveal-hover data-reveal-radius="260">
  <img
    class="reveal-hover__image reveal-hover__image--base"
    src="/images/product-linework.webp"
    alt="Sculpted product shown in a pale linework treatment"
    width="1600"
    height="1000"
    decoding="async"
  />
  <img
    class="reveal-hover__image reveal-hover__image--overlay"
    src="/images/product-color.webp"
    alt=""
    width="1600"
    height="1000"
    decoding="async"
    aria-hidden="true"
  />
</figure>

Keep the overlay decorative when both images communicate the same subject. If the comparison carries unique information, provide visible labels or a separate accessible description.

CSS Mask

css
.reveal-hover {
  --reveal-x: 50%;
  --reveal-y: 50%;
  --reveal-radius: 0px;

  position: relative;
  overflow: clip;
  isolation: isolate;
  margin: 0;
  background: #f3f1ec;
  contain: paint;
}

.reveal-hover__image {
  display: block;
  width: 100%;
  height: 100%;
  object-fit: cover;
  object-position: center;
}

.reveal-hover__image--base {
  position: relative;
  z-index: 0;
}

.reveal-hover__image--overlay {
  position: absolute;
  z-index: 1;
  inset: 0;
  pointer-events: none;
  -webkit-mask-image: radial-gradient(
    circle var(--reveal-radius) at var(--reveal-x) var(--reveal-y),
    rgb(0 0 0 / 1) 0%,
    rgb(0 0 0 / 1) 40%,
    rgb(0 0 0 / 0.75) 60%,
    rgb(0 0 0 / 0.4) 75%,
    rgb(0 0 0 / 0.12) 88%,
    transparent 100%
  );
  mask-image: radial-gradient(
    circle var(--reveal-radius) at var(--reveal-x) var(--reveal-y),
    rgb(0 0 0 / 1) 0%,
    rgb(0 0 0 / 1) 40%,
    rgb(0 0 0 / 0.75) 60%,
    rgb(0 0 0 / 0.4) 75%,
    rgb(0 0 0 / 0.12) 88%,
    transparent 100%
  );
  -webkit-mask-repeat: no-repeat;
  mask-repeat: no-repeat;
  will-change: -webkit-mask-image, mask-image;
}

@media (hover: none), (pointer: coarse) {
  .reveal-hover__image--overlay {
    display: none;
  }
}

Keep object-fit and object-position identical on both layers. A one-pixel mismatch becomes obvious inside the spotlight.

Eased Pointer Tracking

Run the animation loop only while values are changing. Convert clientX and clientY with getBoundingClientRect(); page coordinates will drift after scroll.

js
function initRevealHover(element) {
  const overlay = element.querySelector(".reveal-hover__image--overlay");
  const finePointer = window.matchMedia("(hover: hover) and (pointer: fine)");
  const reduceMotion = window.matchMedia("(prefers-reduced-motion: reduce)");

  if (!overlay || !finePointer.matches) return () => {};

  const state = {
    x: 0,
    y: 0,
    targetX: 0,
    targetY: 0,
    radius: 0,
    targetRadius: 0,
    clientX: 0,
    clientY: 0,
    inside: false,
    frame: 0,
  };

  const getRadius = () => {
    const requested = Number.parseFloat(element.dataset.revealRadius);
    if (Number.isFinite(requested)) return requested;
    return Math.min(260, Math.max(140, element.clientWidth * 0.22));
  };

  const updateTarget = (clientX, clientY) => {
    const rect = element.getBoundingClientRect();
    state.clientX = clientX;
    state.clientY = clientY;
    state.targetX = clientX - rect.left;
    state.targetY = clientY - rect.top;
  };

  const schedule = () => {
    if (!state.frame) state.frame = requestAnimationFrame(tick);
  };

  const tick = () => {
    state.frame = 0;

    const positionEase = reduceMotion.matches ? 1 : 0.1;
    const radiusEase = reduceMotion.matches ? 1 : 0.14;

    state.x += (state.targetX - state.x) * positionEase;
    state.y += (state.targetY - state.y) * positionEase;
    state.radius += (state.targetRadius - state.radius) * radiusEase;

    element.style.setProperty("--reveal-x", `${state.x.toFixed(2)}px`);
    element.style.setProperty("--reveal-y", `${state.y.toFixed(2)}px`);
    element.style.setProperty("--reveal-radius", `${state.radius.toFixed(2)}px`);

    const unsettled =
      Math.abs(state.targetX - state.x) > 0.1 ||
      Math.abs(state.targetY - state.y) > 0.1 ||
      Math.abs(state.targetRadius - state.radius) > 0.1;

    if (unsettled) schedule();
  };

  const onPointerEnter = (event) => {
    state.inside = true;
    updateTarget(event.clientX, event.clientY);

    if (state.radius < 0.5) {
      state.x = state.targetX;
      state.y = state.targetY;
    }

    state.targetRadius = getRadius();
    schedule();
  };

  const onPointerMove = (event) => {
    updateTarget(event.clientX, event.clientY);

    // A page can load with the pointer already over this element, so the
    // first pointermove may arrive without a preceding pointerenter.
    if (!state.inside) {
      state.inside = true;

      if (state.radius < 0.5) {
        state.x = state.targetX;
        state.y = state.targetY;
      }

      state.targetRadius = getRadius();
    }

    schedule();
  };

  const hideReveal = () => {
    state.inside = false;
    state.targetRadius = 0;
    schedule();
  };

  const onViewportChange = () => {
    if (!state.inside) return;
    updateTarget(state.clientX, state.clientY);
    state.targetRadius = getRadius();
    schedule();
  };

  element.addEventListener("pointerenter", onPointerEnter);
  element.addEventListener("pointermove", onPointerMove);
  element.addEventListener("pointerleave", hideReveal);
  element.addEventListener("pointercancel", hideReveal);
  window.addEventListener("blur", hideReveal);
  window.addEventListener("scroll", onViewportChange, { passive: true });

  const resizeObserver = new ResizeObserver(onViewportChange);
  resizeObserver.observe(element);

  return () => {
    if (state.frame) cancelAnimationFrame(state.frame);
    resizeObserver.disconnect();
    element.removeEventListener("pointerenter", onPointerEnter);
    element.removeEventListener("pointermove", onPointerMove);
    element.removeEventListener("pointerleave", hideReveal);
    element.removeEventListener("pointercancel", hideReveal);
    window.removeEventListener("blur", hideReveal);
    window.removeEventListener("scroll", onViewportChange);
  };
}

const revealHoverCleanups = Array.from(
  document.querySelectorAll("[data-reveal-hover]")
).map(initRevealHover);

In React, Vue, or Svelte, initialize after mount and call every returned cleanup during unmount. Do not create a new animation loop on every render.

Optional Grid Parallax

Add a subtle grid only when it supports the art direction.

  • Use a 48px SVG or CSS grid.
  • Keep opacity near 0.1.
  • Normalize the eased pointer around the component center.
  • Limit drift to ±16px.
  • Ease grid offset with factor 0.06, slower than the reveal.
  • Disable the drift under prefers-reduced-motion.

The grid is atmosphere, not the focal interaction. It should barely move.

Nested Glass or Refraction Cards

When a foreground card must reveal the same alternate treatment:

  1. Stack the same base and reveal assets inside the card.
  2. Use the same viewport pointer state.
  3. Subtract the card's getBoundingClientRect().left and .top before setting its local mask coordinates.
  4. Preserve the card's own crop and border radius.
  5. Update the card and hero from the same animation frame so the refraction does not lag.
Show full SKILL.md (238 more words)Show less

Touch and Accessibility

  • Default coarse pointers to the static base image.
  • If the reveal contains meaningful information, add an explicit “Show alternate” control for touch and keyboard users.
  • Do not rely on hover to expose navigation, pricing, instructions, or essential copy.
  • Under reduced motion, update the spotlight directly without trailing easing and disable parallax.
  • Keep the native cursor visible so the reveal center remains obvious.

Performance Rules

  • Animate CSS custom properties from one requestAnimationFrame loop.
  • Stop the loop after the pointer and radius settle.
  • Do not call canvas.toDataURL() every frame.
  • Keep both images at the same encoded dimensions and responsive source set.
  • Use will-change only on the masked overlay.
  • Test Safari with both mask-* and -webkit-mask-*.
  • Avoid masking a huge page-sized layer when the effect only occupies one component.

Quick Checks

  • Base and reveal assets remain pixel-aligned at every breakpoint.
  • The reveal begins under the pointer rather than sweeping in from the component center.
  • The first pointer movement reveals correctly when the page loads under a stationary cursor.
  • The full-strength core holds through 40% of the radius.
  • The feather reaches full transparency at the edge without a visible ring.
  • Pointer exit and window blur collapse the mask.
  • Scrolling while hovered does not detach the spotlight from the cursor.
  • Touch users get a deliberate static or toggle fallback.
  • Reduced-motion mode has no trailing movement or grid drift.
  • The animation loop stops when idle and cleans up on route changes.

© boraoztunc, Apache-2.0. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

SKILL.md and 1 other file in reveal-hover-effect of boraoztunc/skills.

  • SKILL.md
  • REFERENCES.md

Open the folder on GitHubat commit 645553c

Used in 2 other repositories

We found 2 copies of this SKILL.md (exact, near-identical or edited) in other folders, from 2 other GitHub owners. This page covers the copy in boraoztunc/skills, which our catalogue first saw on October 7, 2026.

Compare with similar skills

Reveal Hover Effect next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.

Reveal Hover Effect compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Reveal Hover Effect this skillboraoztunc/skills3952 repos~2.6kAutomated safety check: PassApache-2.0
Add Effectremotion-dev/remotion62k—~2.8kAutomated safety check: PassCustom licence
Effect V4ComposioHQ/composio30k—~1kAutomated safety check: PassMIT
Kotlin Exposed Patternsaffaan-m/ECC275k—~5.2kAutomated safety check: PassMIT
Kotlin Exposed Patternsaffaan-m/ECC275k2 repos~5.2kAutomated safety check: PassMIT
Kotlin Exposed Patternsaffaan-m/ECC275k4 repos~5.5kAutomated safety check: PassMIT

Similar skills

  • Add Effect

    remotion-dev/remotion

    Official

    Add a new effect to @remotion/effects, including implementation, package exports, docs, demos, preview images, Remotion skill updates, formatting, and builds.

    62k GitHub stars~2.8k tokensUpdated today
    Media & CreativeAuto-check passed
  • Effect V4

    ComposioHQ/composio

    Write, review, or upgrade Effect v4 code in the Composio CLI, cli-keyring, and json-schema-to-effect-schema packages, all pinned exactly to effect@4.0.0-rc.117 — Context.Service and explicit layers…

    30k GitHub stars~1k tokensUpdated yesterday
    Productivity & AutomationAuto-check passed
  • JetBrains Exposed ORM パターン(DSL クエリ、DAO パターン、トランザクション、HikariCP 接続プーリング、Flyway マイグレーション、リポジトリパターンを含む)。

    275k GitHub stars~5.2k tokensUpdated 3 days ago
    DatabasesAuto-check passed
  • JetBrains Exposed ORM 模式,包括 DSL 查询、DAO 模式、事务、HikariCP 连接池、Flyway 迁移和仓库模式。

    275k GitHub starsUsed in 2 repos~5.2k tokens
    DatabasesAuto-check passed
  • JetBrains Exposed ORM patterns including DSL queries, DAO pattern, transactions, HikariCP connection pooling, Flyway migrations, and repository pattern.

    275k GitHub starsUsed in 4 repos~5.5k tokens
    DatabasesAuto-check passed
  • Parallax Effects

    thedaviddias/Front-End-Checklist

    A skill your agent uses when reviewing rendered HTML, interactive components, or design-system patterns related to Provide alternatives to parallax effects.

    74k GitHub stars~523 tokensUpdated 2 days ago
    Frontend & DesignAuto-check passed

More from boraoztunc/skills

All 52 skills in this repo
  • Gsap

    boraoztunc/skills

    GSAP animation reference for HyperFrames. An agent skill from boraoztunc/skills.

    395 GitHub starsUsed in 5 repos~1.9k tokens
    Auto-check passed
  • Hyperframes

    boraoztunc/skills

    Create video compositions, animations, title cards, overlays, captions, voiceovers, audio-reactive visuals, and scene transitions in HyperFrames HTML.

    395 GitHub starsUsed in 9 repos~7.6k tokens
    Auto-check passed
  • Remotion To Hyperframes

    boraoztunc/skills

    Translate an existing Remotion (React-based) video composition into a HyperFrames HTML composition.

    395 GitHub stars~2.2k tokensUpdated 1 mo ago
    Auto-check passed
  • Animejs

    boraoztunc/skills

    Anime.js adapter patterns for HyperFrames. An agent skill from boraoztunc/skills.

    395 GitHub starsUsed in 2 repos~828 tokens
    Auto-check passed
  • Beam Glow States

    boraoztunc/skills

    Create React loading, processing, selected, current, focus, and pressed states with the border-beam package's animated edge glow.

    395 GitHub starsUsed in 2 repos~3.2k tokens
    Auto-check passed
  • Minimal Zine Poster

    boraoztunc/skills

    Compile a theme, sentence, object, mood, article idea, or photo into a quiet Japanese/Korean zine-style editorial poster — tall aged paper, large negative space, one small image anchor, experimental…

    395 GitHub stars~2.5k tokensUpdated 1 mo ago
    Auto-check passed

Questions about Reveal Hover Effect

What does Reveal Hover Effect do?

Build cursor-following spotlight reveals that expose a second aligned image through a soft radial mask. Reveal Hover Effect is an agent skill from boraoztunc/skills. Build cursor-following spotlight reveals that expose a second aligned image through a soft radial mask.

When should I use Reveal Hover Effect?

Reveal Hover Effect fits situations like: before-and-after; illustrated hero effects where a desaturated; embossed base image should remain visible while another treatment follows an eased pointer.

How do I install Reveal Hover Effect in Claude Code?

Run `npx skills add boraoztunc/skills --skill reveal-hover-effect -a claude-code`. Or copy the skill folder (reveal-hover-effect in boraoztunc/skills) into .claude/skills/reveal-hover-effect in your project. Claude Code loads it when a task matches its description.

How do I install Reveal Hover Effect in Codex?

Run `npx skills add boraoztunc/skills --skill reveal-hover-effect -a codex`. Or copy the skill folder (reveal-hover-effect in boraoztunc/skills) into .agents/skills/reveal-hover-effect in your project. Codex loads it when a task matches its description.

Can I use Reveal Hover Effect in Cursor, Gemini CLI or GitHub Copilot?

Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add boraoztunc/skills --skill reveal-hover-effect -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/reveal-hover-effect, .gemini/skills/reveal-hover-effect, .github/skills/reveal-hover-effect and .opencode/skills/reveal-hover-effect in your project.

What does Reveal Hover Effect need to run?

SKILL.md names no scripts, command-line tools or credentials: Reveal Hover Effect is instructions for the agent only.

Does Reveal Hover Effect access the network?

SKILL.md contains no URLs. Any network use would come from the scripts or tools the agent runs. This is read from the text; nothing was executed.

Is Reveal Hover Effect safe to install?

Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.

What licence does Reveal Hover Effect use?

Reveal Hover Effect is published under the Apache-2.0 licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does Reveal Hover Effect use?

About 2.6k tokens (SKILL.md is roughly 10k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.

What are the alternatives to Reveal Hover Effect?

Skills that share tags, products or a category with Reveal Hover Effect: Add Effect (remotion-dev/remotion, 62k stars), Effect V4 (ComposioHQ/composio, 30k stars), Kotlin Exposed Patterns (affaan-m/ECC, 275k stars) and Kotlin Exposed Patterns (affaan-m/ECC, 275k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Reveal Hover Effect?

boraoztunc (a GitHub user) maintains it in boraoztunc/skills, which has 395 GitHub stars. The repository holds 52 skills in this directory. The repository was last updated on August 15, 2026.

Source: boraoztunc/skills on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.