Web Artifacts Builder
anthropics/skills
Builds multi-component claude.ai HTML artifacts as a small React, TypeScript and Tailwind project, then bundles it into one shareable HTML file.
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…
$ npx skills add asmyshlyaev177/react-horizontal-scrolling-menu --skill menu-recipes -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install asmyshlyaev177/react-horizontal-scrolling-menu menu-recipes --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-recipes .claude/skills/menu-recipes && 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-recipes" agent skill from https://github.com/asmyshlyaev177/react-horizontal-scrolling-menu/tree/master/skills/menu-recipes into .claude/skills/menu-recipes/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "menu-recipes", 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-recipesType 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-recipes -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install asmyshlyaev177/react-horizontal-scrolling-menu menu-recipes --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-recipes .agents/skills/menu-recipes && 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-recipes" agent skill from https://github.com/asmyshlyaev177/react-horizontal-scrolling-menu/tree/master/skills/menu-recipes into .agents/skills/menu-recipes/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "menu-recipes", 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-recipes -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install asmyshlyaev177/react-horizontal-scrolling-menu menu-recipes --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-recipes .cursor/skills/menu-recipes && 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-recipes" agent skill from https://github.com/asmyshlyaev177/react-horizontal-scrolling-menu/tree/master/skills/menu-recipes into .cursor/skills/menu-recipes/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "menu-recipes", 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-recipes--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-recipes -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install asmyshlyaev177/react-horizontal-scrolling-menu menu-recipes --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-recipes .gemini/skills/menu-recipes && 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-recipes" agent skill from https://github.com/asmyshlyaev177/react-horizontal-scrolling-menu/tree/master/skills/menu-recipes into .gemini/skills/menu-recipes/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "menu-recipes", 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-recipesInstalls 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-recipes -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-recipes .github/skills/menu-recipes && 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-recipes" agent skill from https://github.com/asmyshlyaev177/react-horizontal-scrolling-menu/tree/master/skills/menu-recipes into .github/skills/menu-recipes/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "menu-recipes", 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-recipes -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-recipes --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-recipes .opencode/skills/menu-recipes && 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-recipes" agent skill from https://github.com/asmyshlyaev177/react-horizontal-scrolling-menu/tree/master/skills/menu-recipes into .opencode/skills/menu-recipes/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "menu-recipes", 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-recipesRecipes composed on the react-horizontal-scrolling-menu public API — NOT props: autoplay (setInterval + scrollNext gated on menuVisible), infinite loop/carousel (clone head/tail + scrollLeft…
Menu Recipes is an agent skill from 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 teleport at seams), center on click (scrollToItem 'center'), save/restore scroll position (onUpdate, onInit, scrollContainer), load-more with a loader item (items.last()?.visible in onUpdate), one item per scroll (getPrevElement/getNextElement), snap to a card (CSS scroll-snap on scrollContainerClassName/itemClassName…
Its SKILL.md is about 4k tokens, which your agent loads only when the skill is triggered. The skill folder holds 4 other files, including reference files (for example `references/infinite-loop.md`, `references/scroll-snap.md` and `references/stories.md`).
It sits in Frontend & Design. 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 Recipes loads about 4k tokens when it runs, and up to ~8.1k if it reads all its reference files. Until then it costs about 207 tokens; SKILL.md has 973 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). 973 words, ~4,027 tokens.
.claude/skills/menu-recipes/SKILL.md (or your agent's skills folder). This skill also uses 3 other files; get the full folder from GitHub.No autoplay, loop, or snap props exist, by design (README "What it does — and doesn't"). Each feature below is a ~60-line recipe on the public API; snapping to a card is CSS scroll-snap, not physics. Generate the recipe, never a prop.
Every recipe is also a live-editable Storybook story — URLs and source paths
in references/stories.md.
Shared base every pattern below builds on (scrollbar hiding and item spacing
are plain CSS — see skills/menu-setup/SKILL.md):
import React from 'react';
import {
ScrollMenu,
VisibilityContext,
type publicApiType,
} from 'react-horizontal-scrolling-menu';
import 'react-horizontal-scrolling-menu/dist/styles.css';
const ids = Array.from({ length: 10 }, (_, i) => `item-${i}`);
function LeftArrow() {
const api = React.useContext<publicApiType>(VisibilityContext);
const disabled = api.useLeftArrowVisible();
return (
<button disabled={disabled} onClick={() => api.scrollPrev()}>
Prev
</button>
);
}
function RightArrow() {
const api = React.useContext<publicApiType>(VisibilityContext);
const disabled = api.useRightArrowVisible();
return (
<button disabled={disabled} onClick={() => api.scrollNext()}>
Next
</button>
);
}
function Card({ itemId, title }: { itemId: string; title: string }) {
const api = React.useContext<publicApiType>(VisibilityContext);
const visible = api.useIsVisible(itemId, true);
return <div style={{ width: 160, opacity: visible ? 1 : 0.5 }}>{title}</div>;
}
// Children below are written as ids.map(renderCard) to keep recipes short.
const renderCard = (id: string) => <Card itemId={id} key={id} title={id} />;export function AutoplayMenu({ interval = 3000 }: { interval?: number }) {
const apiRef = React.useRef<publicApiType | null>(null);
const [paused, setPaused] = React.useState(false);
React.useEffect(() => {
if (paused) return;
const id = window.setInterval(() => {
const api = apiRef.current;
// Off-screen scrollNext drags the page; a hidden tab freezes IO.
if (!api?.menuVisible.current || document.visibilityState !== 'visible')
return;
api.scrollNext();
}, interval);
return () => window.clearInterval(id);
}, [paused, interval]);
return (
<div
onMouseEnter={() => setPaused(true)}
onMouseLeave={() => setPaused(false)}
>
<ScrollMenu LeftArrow={LeftArrow} RightArrow={RightArrow} apiRef={apiRef}>
{ids.map(renderCard)}
</ScrollMenu>
</div>
);
}The full story also pauses on touch/focus, stays off under
prefers-reduced-motion (WCAG 2.2.2), and layers this timer on the
infinite-loop hook below so playback never hits the end of the row.
Render [tailClones, ...items, headClones]; when scrolling settles inside a
clone zone, shift scrollLeft by one loop length — clone zones are
pixel-identical, so the jump is invisible.
export function LoopMenu() {
const loop = useInfiniteLoop(ids); // references/infinite-loop.md
return (
<ScrollMenu {...loop.menuProps} LeftArrow={LoopPrev} RightArrow={LoopNext}>
{loop.slides.map(({ itemId, realId }) => (
// itemId must stay unique (clone suffix); display/selection use realId
<Card itemId={itemId} key={itemId} title={realId} />
))}
</ScrollMenu>
);
}Four parts of the hook are load-bearing, and each one is a bug if dropped:
CLONES_PER_SIDE = 6), or a
Next click from the page straddling the seam clamps at the row endoffsetLeft geometry, idempotent, and must not be
gated on visibility flags — they lag a frame behind a teleportuseLeftArrowVisible/useRightArrowVisible track
the outermost items, which here are clones, so they flash at the seamuseIsVisible OR'd across an item and both clone twins, same lagnormalize() also has to run after any manual scrollLeft write (a drag),
not just on scrollend.
Items read the api from VisibilityContext — no apiRef needed inside the
menu. scrollToItem takes an element or item object, never an id string.
function CenterCard({
itemId,
selected,
onSelect,
}: {
itemId: string;
selected: boolean;
onSelect: (id: string) => void;
}) {
const api = React.useContext<publicApiType>(VisibilityContext);
const handleClick = () => {
onSelect(itemId);
const el = api.getItemElementById(itemId);
if (el) api.scrollToItem(el, 'smooth', 'center');
};
return (
<div
role="button"
tabIndex={0}
onClick={handleClick}
onKeyDown={(ev) => ev.code === 'Enter' && handleClick()}
style={{ width: 160, background: selected ? 'palegreen' : 'white' }}
>
{itemId}
</div>
);
}Render CenterCard where Setup renders Card, holding the selected id in the
parent — the menu itself needs no extra props.
Save scrollContainer.current.scrollLeft in onUpdate (fires after scroll
settles — onScroll fires mid-animation), restore it in onInit.
export function RestoredMenu() {
// Also set window.history.scrollRestoration = 'manual' once (an effect),
// so the browser doesn't fight the restore on reload/back navigation.
const save = (api: publicApiType) =>
sessionStorage.setItem(
'menu-pos',
String(api.scrollContainer.current?.scrollLeft ?? 0),
);
const restore = (api: publicApiType) => {
const node = api.scrollContainer.current;
if (node) node.scrollLeft = +(sessionStorage.getItem('menu-pos') ?? 0);
};
return (
<ScrollMenu
LeftArrow={LeftArrow}
RightArrow={RightArrow}
onUpdate={save}
onInit={restore}
>
{ids.map(renderCard)}
</ScrollMenu>
);
}Give the loader its own itemId as the last child; trigger fetching from
onUpdate when the last item becomes visible.
const Loader = ({ itemId }: { itemId: string }) => (
<div style={{ width: 160 }}>Loading…</div>
);
export function LoadMoreMenu() {
const [items, setItems] = React.useState(ids);
const [loading, setLoading] = React.useState(false);
const fetchMore = async () => {
setLoading(true);
const next = await fetchPage(items.length); // your API
setItems((cur) => [...cur, ...next]);
setLoading(false);
};
return (
<ScrollMenu
LeftArrow={LeftArrow}
RightArrow={RightArrow}
onUpdate={(api) => {
if (api.items.last()?.visible && !loading) fetchMore();
}}
>
{items.map(renderCard)}
{loading && <Loader itemId="loader" key="loader" />}
</ScrollMenu>
);
}scrollNext/scrollPrev page a full group of visible items;
getPrevElement()/getNextElement() return the single item adjacent to the
visible window.
function OneRightArrow() {
const api = React.useContext<publicApiType>(VisibilityContext);
const onClick = () => api.scrollToItem(api.getNextElement(), 'smooth', 'end');
return (
<button disabled={api.useRightArrowVisible()} onClick={onClick}>
Next
</button>
);
}
// OneLeftArrow mirrors it: getPrevElement(), 'start', useLeftArrowVisible().For custom group math, slidingWindow(...).next() and getItemsPos(group)
are exported too — see skills/menu-scrolling/SKILL.md.
Snapping is a stylesheet, not a prop: scroll-snap-type: x mandatory on
the rail (scrollContainerClassName), scroll-snap-align: center on every
item (itemClassName), side padding of calc(50% - card / 2) so the edge
cards can center. The library's part is the current card: onScroll picks
the item whose center is closest to the rail's center (offsetLeft against
scrollLeft), and arrows and dots call scrollToItem(el, 'smooth', 'center') — a snap point by construction. The tilted fan of the neighbours
is a CSS scroll-driven animation, and a mouse drag needs snap switched off
for the gesture; the code for all three is in references/scroll-snap.md.
LeftArrow/RightArrow are optional — omit them; the menu
still scrolls natively (wheel, touch, drag recipes).Footer slot; it
reads VisibilityContext like arrows do (<ScrollMenu Footer={Arrows}>).ScrollMenu is independent, but each
must be seen on screen once before its visibility data is valid —
below-the-fold menus show defaultValue states until scrolled into view.key={selectedTab} — see Common Mistakes.Wrong:
<ScrollMenu autoplay autoplayInterval={3000} loop>
{ids.map(renderCard)}
</ScrollMenu>Correct:
// Autoplay: a timer firing scrollNext(), gated on menuVisible — recipe above.
// Loop: the useInfiniteLoop clone-and-teleport hook — references/infinite-loop.md
// Snap: CSS scroll-snap on the rail and items — recipe above.These props do not exist and are silently ignored — the menu renders normally and never plays, loops or snaps. Only spring physics and slide effects are out of scope by design (use Embla or Swiper for those).
Source: README.md "What it does — and doesn't"; stories/Autoplay, stories/InfiniteLoop, stories/ScrollSnap
Wrong: the plain drag recipe — scrollLeft += delta on every mousemove.
Correct:
// mousedown: rail.style.scrollSnapType = 'none'
// mousemove: rail.scrollLeft += delta
// mouseup: scrollToItem(nearest card, 'smooth', 'center'), then
// rail.style.scrollSnapType = '' once scrolling settlesA mandatory snap container snaps every programmatic scrollLeft write, and
restoring snap while the release glide runs jumps instead of gliding.
Source: stories/ScrollSnap/ScrollSnap.source.tsx; references/scroll-snap.md
Wrong:
setInterval(() => apiRef.current?.scrollNext(), 3000);Correct:
setInterval(() => {
if (apiRef.current?.menuVisible.current) apiRef.current.scrollNext();
}, 3000);Scrolling is scrollIntoView-based, so scrollNext on an off-screen menu
scrolls ancestors too — the page keeps jumping back to the menu every tick.
Source: stories/Autoplay/Autoplay.source.tsx:56-66; issue #276
Wrong:
onInit={(api) => api.scrollToItem(api.getItemById('item-9'), 'smooth')}
// menu below the fold: the whole page scrolls to the menu on loadCorrect:
onUpdate={(api) => {
if (api.items.getVisible().length && !api.isItemVisible('item-9')) {
api.scrollToItem(api.getItemById('item-9'), 'smooth');
}
}}Same mechanism as autoplay above, for every recipe calling scroll methods
outside a user gesture — gate on menuVisible.current or items.getVisible().
Source: issue #276 (#277, #174, #230); skills/menu-scrolling/SKILL.md
Wrong:
setItems([...items, newItem]);
apiRef.current.scrollToItem(apiRef.current.getItemById(newItem.id)); // undefinedCorrect:
// after the state update commits (effect or onUpdate callback):
apiRef.current.scrollToItem(apiRef.current.getItemElementById(newItem.id));The internal ItemsMap lags children by one render; getItemElementById
queries the DOM by data-key and sees the new item immediately.
Source: issue #167; discussion #295; stories/AddItemAndScrollToIt
Wrong:
onUpdate={(api) => {
if (api.items.last()?.visible) {
api.scrollToItem(api.items.first(), 'smooth'); // visible rewind jump
}
}}Correct:
// Seamless needs cloned head/tail items plus a scrollLeft teleport at the
// seams — the useInfiniteLoop hook from references/infinite-loop.md:
const loop = useInfiniteLoop(ids);Without pixel-identical clone zones the only possible "loop" is an animated scroll back to the first item — a visible jump, not a loop.
Source: issue #213; stories/InfiniteLoop/InfiniteLoop.source.tsx:94-113; stories/loopTestUtils.ts
Wrong:
<ScrollMenu LeftArrow={LeftArrow} RightArrow={RightArrow}>
{tabs[selected].items.map(renderCard)}
</ScrollMenu>Correct:
<ScrollMenu key={selected} LeftArrow={LeftArrow} RightArrow={RightArrow}>
{tabs[selected].items.map(renderCard)}
</ScrollMenu>Swapping the item set in place keeps the previous tab's scroll offset and visibility entries; key={selected} remounts the menu fresh per tab.
Source: discussion #294; issue #204
Wrong:
onScroll={(api, ev) => {
const el = ev.target as HTMLElement;
if (el.scrollLeft > el.scrollWidth - 800) fetchMore();
}}Correct:
onUpdate={(api) => {
if (api.items.last()?.visible && !loading) fetchMore();
}}Pixel thresholds break with dynamic item widths and onScroll fires
mid-animation; the last item's visibility flag is layout-independent, and
onUpdate fires only after the scroll settles.
Source: stories/AddItems/AddItems.source.tsx:54-59; discussion #297
skills/menu-scrolling/SKILL.md — the imperative API every recipe is
built from (scrollToItem, scrollNext/scrollPrev, apiRef).skills/menu-interactions/SKILL.md — drag, wheel and body-scroll recipes;
mouse/touch props are factories (api) => (event) => void.© asmyshlyaev177, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
SKILL.md and 3 other files (references) in skills/menu-recipes of asmyshlyaev177/react-horizontal-scrolling-menu.
Open the folder on GitHubat commit 42c99aa
Menu Recipes 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 Recipes this skillasmyshlyaev177/react-horizontal-scrolling-menu | 790 | — | ~4k | Automated safety check: Pass | MIT | |
| Web Artifacts Builderanthropics/skills | 180k | 40 repos | ~769 | Automated safety check: Pass | Apache-2.0 | |
| React Doctormakeplane/plane | 61k | 12 repos | ~657 | Automated safety check: Pass | AGPL-3.0 | |
| React Router Developmentremix-run/react-router | 57k | 1 repos | ~1.5k | Automated safety check: Pass | MIT | |
| React UI State PatternsChrisWiles/claude-code-showcase | 6.1k | 8 repos | ~1.6k | Automated safety check: Pass | None | |
| GSAP Core Animationgreensock/gsap-skills | 16k | 3 repos | ~3.7k | Automated safety check: Pass | MIT |
anthropics/skills
Builds multi-component claude.ai HTML artifacts as a small React, TypeScript and Tailwind project, then bundles it into one shareable HTML file.
makeplane/plane
Scans React code for lint, accessibility, bundle size and architecture issues, reports a health score and checks that changes do not lower it.
remix-run/react-router
Guides work on React Router apps by first identifying whether the app uses Framework, Data or Declarative mode, then loading the matching reference and the installed package docs.
ChrisWiles/claude-code-showcase
Sets patterns for React interfaces: when to show loading spinners or skeletons, how to surface errors, how to disable buttons during async work and how to handle empty lists.
greensock/gsap-skills
Covers the GSAP core API for tweens, easing, staggers, defaults and matchMedia, and when to choose GSAP over CSS animations or other JavaScript animation libraries.
lobehub/lobehub
Builds single-file interactive HTML prototypes rendered with the real LobeHub UI components and written as production-style React, so they can later be split into files.
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…
asmyshlyaev177/react-horizontal-scrolling-menu
Animate react-horizontal-scrolling-menu scrolling and build right-to-left menus: noPolyfill defaults to true since v8, so transitionDuration (default 500), a custom-easing-function…
Works with
Categories
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…. Menu Recipes is an agent skill from asmyshlyaev177/react-horizontal-scrolling-menu.
Menu Recipes fits situations like: frontend & Design work in your project.
Run `npx skills add asmyshlyaev177/react-horizontal-scrolling-menu --skill menu-recipes -a claude-code`. Or copy the skill folder (skills/menu-recipes in asmyshlyaev177/react-horizontal-scrolling-menu) into .claude/skills/menu-recipes in your project. Claude Code loads it when a task matches its description.
Run `npx skills add asmyshlyaev177/react-horizontal-scrolling-menu --skill menu-recipes -a codex`. Or copy the skill folder (skills/menu-recipes in asmyshlyaev177/react-horizontal-scrolling-menu) into .agents/skills/menu-recipes 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-recipes -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-recipes, .gemini/skills/menu-recipes, .github/skills/menu-recipes and .opencode/skills/menu-recipes in your project.
SKILL.md names no scripts, command-line tools or credentials: Menu Recipes 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 Recipes is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 4k tokens (SKILL.md is roughly 16k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full. Its references folder adds about 4.1k tokens, read only when the agent opens those files.
Skills that share tags, products or a category with Menu Recipes: Web Artifacts Builder (anthropics/skills, 180k stars), React Doctor (makeplane/plane, 61k stars), React Router Development (remix-run/react-router, 57k stars) and React UI State Patterns (ChrisWiles/claude-code-showcase, 6.1k 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.