Vercel Composition Patterns
supabase/supabase
React composition patterns that scale. An agent skill from supabase/supabase.
Track which react-horizontal-scrolling-menu items are on screen: useIsVisible(itemId | 'first' | 'last', defaultValue), useLeftArrowVisible/useRightArrowVisible, the options prop (ratio, rootMargin…
$ npx skills add asmyshlyaev177/react-horizontal-scrolling-menu --skill menu-visibility -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install asmyshlyaev177/react-horizontal-scrolling-menu menu-visibility --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/asmyshlyaev177/react-horizontal-scrolling-menu.git skills-src && mkdir -p .claude/skills && cp -r skills-src/skills/menu-visibility .claude/skills/menu-visibility && rm -rf skills-srcUse ~/.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/
Install the "menu-visibility" agent skill from https://github.com/asmyshlyaev177/react-horizontal-scrolling-menu/tree/master/skills/menu-visibility into .claude/skills/menu-visibility/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "menu-visibility", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/asmyshlyaev177/react-horizontal-scrolling-menu/tree/master/skills/menu-visibilityType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add asmyshlyaev177/react-horizontal-scrolling-menu --skill menu-visibility -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install asmyshlyaev177/react-horizontal-scrolling-menu menu-visibility --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/asmyshlyaev177/react-horizontal-scrolling-menu.git skills-src && mkdir -p .agents/skills && cp -r skills-src/skills/menu-visibility .agents/skills/menu-visibility && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "menu-visibility" agent skill from https://github.com/asmyshlyaev177/react-horizontal-scrolling-menu/tree/master/skills/menu-visibility into .agents/skills/menu-visibility/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "menu-visibility", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add asmyshlyaev177/react-horizontal-scrolling-menu --skill menu-visibility -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install asmyshlyaev177/react-horizontal-scrolling-menu menu-visibility --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/asmyshlyaev177/react-horizontal-scrolling-menu.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/skills/menu-visibility .cursor/skills/menu-visibility && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "menu-visibility" agent skill from https://github.com/asmyshlyaev177/react-horizontal-scrolling-menu/tree/master/skills/menu-visibility into .cursor/skills/menu-visibility/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "menu-visibility", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/asmyshlyaev177/react-horizontal-scrolling-menu.git --path skills/menu-visibility--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add asmyshlyaev177/react-horizontal-scrolling-menu --skill menu-visibility -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install asmyshlyaev177/react-horizontal-scrolling-menu menu-visibility --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/asmyshlyaev177/react-horizontal-scrolling-menu.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/skills/menu-visibility .gemini/skills/menu-visibility && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "menu-visibility" agent skill from https://github.com/asmyshlyaev177/react-horizontal-scrolling-menu/tree/master/skills/menu-visibility into .gemini/skills/menu-visibility/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "menu-visibility", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install asmyshlyaev177/react-horizontal-scrolling-menu menu-visibilityInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add asmyshlyaev177/react-horizontal-scrolling-menu --skill menu-visibility -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/asmyshlyaev177/react-horizontal-scrolling-menu.git skills-src && mkdir -p .github/skills && cp -r skills-src/skills/menu-visibility .github/skills/menu-visibility && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "menu-visibility" agent skill from https://github.com/asmyshlyaev177/react-horizontal-scrolling-menu/tree/master/skills/menu-visibility into .github/skills/menu-visibility/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "menu-visibility", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add asmyshlyaev177/react-horizontal-scrolling-menu --skill menu-visibility -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install asmyshlyaev177/react-horizontal-scrolling-menu menu-visibility --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/asmyshlyaev177/react-horizontal-scrolling-menu.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/skills/menu-visibility .opencode/skills/menu-visibility && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "menu-visibility" agent skill from https://github.com/asmyshlyaev177/react-horizontal-scrolling-menu/tree/master/skills/menu-visibility into .opencode/skills/menu-visibility/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "menu-visibility", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
menu-visibilityTrack which react-horizontal-scrolling-menu items are on screen: useIsVisible(itemId | 'first' | 'last', defaultValue), useLeftArrowVisible/useRightArrowVisible, the options prop (ratio, rootMargin…
Menu Visibility is an agent skill from asmyshlyaev177/react-horizontal-scrolling-menu. Track which react-horizontal-scrolling-menu items are on screen: useIsVisible(itemId | 'first' | 'last', defaultValue), useLeftArrowVisible/useRightArrowVisible, the options prop (ratio, rootMargin, threshold), items.getVisible()/subscribe/unsubscribe, and the async IntersectionObserver truth model (items must be seen once, menuVisible gating, non-reactive isFirstItemVisible reads). Load when disabling arrows at the edges, styling items by visibility, building progress indicators, or debugging flickering or dead…
Its SKILL.md is about 3.6k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.
It sits in Development. It works with React. The repository describes itself as: Horizontal scrolling menu component for React with per-item visibility tracking. Supports mouse and touch devices, SSR-safe. The licence is MIT.
Read from SKILL.md and the folder at commit 42c99aa. It shows what the files ask for, not the result of running them.
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.
No scripts in the folder and no shell commands in SKILL.md (its code samples are typescript).
From the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md.
From URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Menu Visibility loads about 3.6k tokens when it runs. Until then it costs about 135 tokens; SKILL.md has 1,046 words of instructions outside code blocks.
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.
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.
The full file from asmyshlyaev177/react-horizontal-scrolling-menu at commit 42c99aa, republished under its MIT licence (© asmyshlyaev177). 1,046 words, ~3,578 tokens.
.claude/skills/menu-visibility/SKILL.md (or your agent's skills folder).Visibility is IntersectionObserver-driven and asynchronous. An item has
visibility data only after the observer has reported it at least once — which
requires the menu itself to have been on screen. Nothing is true
synchronously: not at mount, not on the server, not in the same tick as a
click or a scroll call. Read visibility reactively (hooks) or inside
callbacks (onUpdate, event handlers) — never as a one-shot read during
setup.
Two structural facts drive everything below:
api.items, an ItemsMap (a Map of
String(itemId) → IOItem), where IOItem is
{ index: string; key: string; entry: IntersectionObserverEntry; visible: boolean }.api.useIsVisible(...),
api.useLeftArrowVisible()). Unusual, but rules-of-hooks-safe: the api is
built in a React.useMemo whose dependencies (items, transition props,
noPolyfill, menuVisible ref) never change after mount, so the hook
identities are stable. Call them unconditionally at the top of components
rendered under ScrollMenu (arrows, header/footer, items).import React from 'react';
import {
ScrollMenu,
VisibilityContext,
type publicApiType,
} from 'react-horizontal-scrolling-menu';
import 'react-horizontal-scrolling-menu/dist/styles.css';
const items = Array.from({ length: 10 }, (_, i) => `item-${i + 1}`);
export function App() {
return (
<ScrollMenu LeftArrow={LeftArrow} RightArrow={RightArrow}>
{items.map((id) => (
<Card itemId={id} key={id} title={id} />
))}
</ScrollMenu>
);
}
function LeftArrow() {
const api = React.useContext<publicApiType>(VisibilityContext);
const disabled = api.useLeftArrowVisible();
return (
<button disabled={disabled} onClick={() => api.scrollPrev()}>
←
</button>
);
}
function RightArrow() {
const api = React.useContext<publicApiType>(VisibilityContext);
const disabled = api.useRightArrowVisible();
return (
<button disabled={disabled} onClick={() => api.scrollNext()}>
→
</button>
);
}
function Card({ itemId, title }: { itemId: string; title: string }) {
const api = React.useContext<publicApiType>(VisibilityContext);
const isVisible = api.useIsVisible(itemId, true);
return (
<div style={{ width: '160px', opacity: isVisible ? 1 : 0.4 }}>{title}</div>
);
}useLeftArrowVisible() / useRightArrowVisible() return the disabled
state for each arrow. They wrap useIsVisible('first', true) /
useIsVisible('last', false) plus a latch: the internal state only
updates while menuVisible.current is true, so arrows do not flicker when
the page scrolls the menu out of the viewport vertically
(src/createApi.ts:65-89). This is the canonical arrow pattern from
stories/Simple — prefer it over hand-rolling useIsVisible arrows.
function LeftArrow() {
const api = React.useContext<publicApiType>(VisibilityContext);
const disabled = api.useLeftArrowVisible();
return (
<button disabled={disabled} onClick={() => api.scrollPrev()}>
Left
</button>
);
}useIsVisible(itemId | 'first' | 'last', defaultValue = false) subscribes
to one item and re-renders on changes. defaultValue is the SSR /
first-paint state — what renders before the first IntersectionObserver batch
arrives client-side. The canonical arrow defaults (('first', true),
('last', false)) paint a row scrolled to its start; for items above the
fold use true so they don't flash from hidden styling on hydration.
function Card({ itemId, title }: { itemId: string; title: string }) {
const api = React.useContext<publicApiType>(VisibilityContext);
const isVisible = api.useIsVisible(itemId, true);
return <div data-visible={isVisible}>{title}</div>;
}The hook also reads the ItemsMap directly on mount, because the observer's
first batch can fire before the subscription effect runs
(src/createApi.ts:37-60) — you never need to handle that race yourself.
For progress dots, lazy loading, or analytics, read the visible set inside
the onUpdate callback — it fires after each visibility batch.
items.getVisible() returns [itemId, IOItem] pairs sorted by index.
<ScrollMenu
onUpdate={(api: publicApiType) => {
const visibleIds = api.items.getVisible().map(([id]) => id);
console.log('visible now:', visibleIds);
}}
>
{items.map((id) => (
<Card itemId={id} key={id} title={id} />
))}
</ScrollMenu>For a single item outside the menu tree, subscribe on the items instance —
keys are an itemId or 'first', 'last', 'onInit', 'onUpdate'.
subscribe and unsubscribe both take (key, callback) and cleanup must
pass the same callback instance (src/ItemsMap/ItemsMap.ts:15-21).
Defaults from src/settings.ts:
{ ratio: 0.9, rootMargin: '5px', threshold: [0.05, 0.5, 0.75, 0.95] }.
An item counts as visible when its intersectionRatio >= ratio. The prop is
partially merged over the defaults.
<ScrollMenu options={{ ratio: 0.5, rootMargin: '5px' }}>
{items.map((id) => (
<Card itemId={id} key={id} title={id} />
))}
</ScrollMenu>Lower ratio when items are nearly as wide as the container. root is not
configurable — it is always the internal scroll container.
Wrong:
const { isFirstItemVisible, scrollPrev } = React.useContext(VisibilityContext);
return (
<button disabled={isFirstItemVisible} onClick={() => scrollPrev()}>
←
</button>
);Correct:
const api = React.useContext<publicApiType>(VisibilityContext);
const disabled = api.useLeftArrowVisible();
return (
<button disabled={disabled} onClick={() => api.scrollPrev()}>
←
</button>
);Reading these fields never subscribes the component: the value is live at
read time (live getters over the ItemsMap; on <= 8.3.1 they were frozen at
api creation and stuck false), but nothing re-renders when it changes.
Reactive paths are the hooks, or items.getVisible() inside callbacks;
reading the getters inside event handlers and timers is fine.
Source: src/createApi.ts (isFirstItemVisible/isLastItemVisible getters); CHANGELOG v6.0.0
Wrong:
const { isFirstItemVisible, visibleElements, initComplete } =
React.useContext(VisibilityContext);Correct:
const api = React.useContext<publicApiType>(VisibilityContext);
const disabled = api.useLeftArrowVisible();
const visibleIds = api.items.getVisible().map(([id]) => id);visibleElements, initComplete and reactive
isFirstItemVisible/isLastItemVisible were removed in v6 (Observer
rewrite); nearly every pre-2024 tutorial uses them, and in v8 they are
undefined or non-reactive getters.
Source: CHANGELOG v6.0.0 (#270); issue #282; see skills/menu-migration/SKILL.md
Wrong:
<ScrollMenu
onInit={(api: publicApiType) => {
if (!api.isItemVisible('item-9')) {
api.scrollToItem(api.getItemById('item-9'));
}
}}
>
{cards}
</ScrollMenu>Correct:
<ScrollMenu
onUpdate={(api: publicApiType) => {
if (api.items.getVisible().length && !api.isItemVisible('item-9')) {
api.scrollToItem(api.getItemById('item-9'));
}
}}
>
{cards}
</ScrollMenu>Items must be observed on screen at least once before visibility data
exists; a menu below the fold at load has no valid data (dead or wrong
arrows, isItemVisible always false) until it is scrolled into view.
Source: https://github.com/asmyshlyaev177/react-horizontal-scrolling-menu/issues/286 (#289, #284)
Wrong:
const api = React.useContext<publicApiType>(VisibilityContext);
const disabled = api.useIsVisible('first', true);
// flickers: items leave the viewport when the page scrolls past the menuCorrect:
const api = React.useContext<publicApiType>(VisibilityContext);
const isFirst = api.useIsVisible('first', true);
const [disabled, setDisabled] = React.useState(isFirst);
React.useEffect(() => {
if (api.menuVisible.current) {
setDisabled(isFirst);
}
}, [isFirst, api]);When the page scrolls the menu off screen every item reports not-visible, so
naive visibility-driven arrows flicker; useLeftArrowVisible/
useRightArrowVisible already contain this menuVisible-gated latch —
hand-rolled useIsVisible arrows must add it (a
!!api.items.getVisible().length gate works too).
Source: https://github.com/asmyshlyaev177/react-horizontal-scrolling-menu/issues/284 (#275, #147, #298); stories/Simple; src/createApi.ts:65-89
Wrong:
const disabled = api.useIsVisible('first'); // SSR paints enabled, flips on hydrationCorrect:
const disabled = api.useIsVisible('first', true);defaultValue is the server-rendered/first-paint state (it defaults to
false); the canonical arrows use ('first', true) / ('last', false) so
SSR matches a row at its start — wrong defaults flip arrow state after
hydration.
Source: README.md SSR; maintainer interview; see skills/menu-testing-ssr/SKILL.md
Wrong:
<ScrollMenu>{fullWidthSlides}</ScrollMenu>
// 100vw-wide slides with the default ratio 0.9 — never "visible"Correct:
<ScrollMenu options={{ ratio: 0.5 }}>{fullWidthSlides}</ScrollMenu>An item is visible when intersectionRatio >= options.ratio (default 0.9);
an item bigger than the container can never reach that, so edge detection
and arrows break — lower the ratio for oversized items.
Source: https://github.com/asmyshlyaev177/react-horizontal-scrolling-menu/issues/287 (#279); src/settings.ts
Wrong:
<ScrollMenu options={{ root: document.querySelector('#viewport') }}>
{cards}
</ScrollMenu>Correct:
<ScrollMenu options={{ ratio: 0.5, rootMargin: '5px' }}>{cards}</ScrollMenu>The options prop type accepts IntersectionObserverInit, but root is
always overridden with the internal scroll container — a custom root is
silently ignored.
Source: src/hooks/useIntersectionObserver.ts:42
Wrong:
React.useEffect(() => {
api.items.subscribe('item-5', (item) => setVisible(!!item?.visible));
}, [api]);Correct:
React.useEffect(() => {
const cb = (item?: { visible: boolean }) => setVisible(!!item?.visible);
api.items.subscribe('item-5', cb);
return () => api.items.unsubscribe('item-5', cb);
}, [api]);subscribe/unsubscribe both take (key, fn) and require the same
callback instance — subscribing without cleanup (or unsubscribing a fresh
closure, or omitting the key) leaks subscribers across renders.
Source: README.md items class instance; src/ItemsMap/ItemsMap.ts:15-21; src/Observer/Observer.ts:19-26
The library contains zero throws or warnings — every visibility contract
violation (missing/duplicate itemId, render-reading the getters, off-screen
menus) fails silently with no error to debug from. Self-check the contracts
instead of waiting for the console. Setup-side contracts:
skills/menu-setup/SKILL.md; scrolling-side: skills/menu-scrolling/SKILL.md.
The api object mixes live methods, reactive hooks, non-reactive getters
(isFirstItemVisible) and mutable stores (items, apiRef). Reads during
render don't subscribe and go stale; hooks are correct but bound by rules of
hooks. Read data via hooks (or the getters/getVisible() inside callbacks),
fire methods imperatively. Imperative side: skills/menu-scrolling/SKILL.md.
The server paints defaultValue guesses; real visibility exists only after
IntersectionObserver fires client-side — until then nothing about the menu
is true. Never read visibility at mount and never assert it synchronously in
tests (poll instead). Details: skills/menu-testing-ssr/SKILL.md.
items.getVisible(); programmatic scroll gating uses menuVisibleuseIsVisible defaultValue; test assertions must respect the async
visibility model© asmyshlyaev177, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
Just SKILL.md in skills/menu-visibility of asmyshlyaev177/react-horizontal-scrolling-menu.
Open the folder on GitHubat commit 42c99aa
Menu Visibility 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.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Menu Visibility this skillasmyshlyaev177/react-horizontal-scrolling-menu | 790 | — | ~3.6k | Automated safety check: Pass | MIT | |
| Vercel Composition Patternssupabase/supabase | 111k | 58 repos | ~726 | Automated safety check: Pass | MIT | |
| @pierre/diffs Code Renderingpierrecomputer/pierre | 6.3k | 2 repos | ~803 | Automated safety check: Pass | Apache-2.0 | |
| OpenTUI Terminal Interfacescline/cline | 70k | — | ~1.9k | Automated safety check: Pass | Apache-2.0 | |
| Claude Code Skillcodeaashu/claude-code | 3.4k | 1 repos | ~2.7k | Automated safety check: Pass | Proprietary | |
| Wagmi Feature Developmentwevm/wagmi | 6.8k | — | ~3.8k | Automated safety check: Pass | MIT |
supabase/supabase
React composition patterns that scale. An agent skill from supabase/supabase.
pierrecomputer/pierre
Guides an agent through using @pierre/diffs to render syntax-highlighted files and diffs, and to build editing and review surfaces in React or plain JavaScript.
cline/cline
Helps build terminal user interfaces with OpenTUI using its core imperative API or its React and Solid reconcilers, with references for layout, keyboard, animation and testing.
codeaashu/claude-code
Development conventions and architecture guide for the Claude Code CLI repository.
wevm/wagmi
Walks through adding a Wagmi feature across its layers: a Viem-based core action, TanStack Query options, and React and Vue bindings.
keybase/client
Analyzes Chrome or Electron DevTools Performance trace exports with Python scripts to find where render time actually goes, without opening DevTools.
asmyshlyaev177/react-horizontal-scrolling-menu
Recipes composed on the react-horizontal-scrolling-menu public API — NOT props: autoplay (setInterval + scrollNext gated on menuVisible), infinite loop/carousel (clone head/tail + scrollLeft…
asmyshlyaev177/react-horizontal-scrolling-menu
Imperative scrolling for react-horizontal-scrolling-menu: scrollToItem(getItemById(id), behavior, inline, block), scrollNext/scrollPrev, apiRef for controlling the menu from outside (fire methods…
asmyshlyaev177/react-horizontal-scrolling-menu
Wire mouse, wheel and touch input for react-horizontal-scrolling-menu: onWheel/onScroll are plain (api, event) = void callbacks, while ALL mouse/touch props (onMouseDown, onMouseUp, onMouseMove…
asmyshlyaev177/react-horizontal-scrolling-menu
Detect and upgrade pre-v8 react-horizontal-scrolling-menu patterns that agents trained on older data still generate: destructured visibleElements/isFirstItemVisible/isLastItemVisible/initComplete…
asmyshlyaev177/react-horizontal-scrolling-menu
Build a working react-horizontal-scrolling-menu: install, the mandatory 'react-horizontal-scrolling-menu/dist/styles.css' import, ScrollMenu with a unique itemId per child, arrow components via…
asmyshlyaev177/react-horizontal-scrolling-menu
Server rendering and testing for react-horizontal-scrolling-menu: the library is client-only ('use client' required in React Server Components, else "createContext is not a function"), SSR first…
Works with
Categories
Track which react-horizontal-scrolling-menu items are on screen: useIsVisible(itemId | 'first' | 'last', defaultValue), useLeftArrowVisible/useRightArrowVisible, the options prop (ratio, rootMargin…. Menu Visibility is an agent skill from asmyshlyaev177/react-horizontal-scrolling-menu.getVisible()/subscribe/unsubscribe, and the async IntersectionObserver truth model (items must be seen once, menuVisible gating, non-reactive isFirstItemVisible reads).
Menu Visibility fits situations like: development work in your project.
Run `npx skills add asmyshlyaev177/react-horizontal-scrolling-menu --skill menu-visibility -a claude-code`. Or copy the skill folder (skills/menu-visibility in asmyshlyaev177/react-horizontal-scrolling-menu) into .claude/skills/menu-visibility in your project. Claude Code loads it when a task matches its description.
Run `npx skills add asmyshlyaev177/react-horizontal-scrolling-menu --skill menu-visibility -a codex`. Or copy the skill folder (skills/menu-visibility in asmyshlyaev177/react-horizontal-scrolling-menu) into .agents/skills/menu-visibility in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add asmyshlyaev177/react-horizontal-scrolling-menu --skill menu-visibility -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/menu-visibility, .gemini/skills/menu-visibility, .github/skills/menu-visibility and .opencode/skills/menu-visibility in your project.
SKILL.md names no scripts, command-line tools or credentials: Menu Visibility is instructions for the agent only.
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.
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.
Menu Visibility is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 3.6k tokens (SKILL.md is roughly 14k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with Menu Visibility: Vercel Composition Patterns (supabase/supabase, 111k stars), @pierre/diffs Code Rendering (pierrecomputer/pierre, 6.3k stars), OpenTUI Terminal Interfaces (cline/cline, 70k stars) and Claude Code Skill (codeaashu/claude-code, 3.4k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
asmyshlyaev177 (a GitHub user) maintains it in asmyshlyaev177/react-horizontal-scrolling-menu, which has 790 GitHub stars. The repository holds 8 skills in this directory. The repository was last updated on October 1, 2026.
Source: asmyshlyaev177/react-horizontal-scrolling-menu on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.