[RFC] feat: add finesse and juicy commands#145
Open
eudresfs wants to merge 3 commits into
Open
Conversation
Two new commands in the Enhance category covering the gap between animate (adds motion) and polish (fixes visual alignment): - `finesse`: refines existing interactions — timing, easing curves, enter/exit choreography, press feedback, focus quality, and prefers-reduced-motion coverage. Operates on live interactions that already exist, not adding new animation. - `juicy`: adds game-feel layers on top of finesse — cursor affordances (grab, resize, copy), drag choreography (custom ghost, drop zone feedback, FLIP reorder), scroll snap, theme crossfade, brand ::selection color, and contextual micro-sounds for consumer SaaS contexts. Requires finesse as soft pre-requisite. Both files include chain-of-thought decision guides per pattern family, before/after few-shots with diff commentary, and a full worked example (NotificationBanner for finesse, KanbanCard for juicy). Also updates pin.mjs VALID_COMMANDS, command-metadata.json, both SKILL.md command tables, and plugin.json (3.0.7 → 3.1.0).
There was a problem hiding this comment.
Cursor Bugbot has reviewed your changes and found 1 potential issue.
❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.
Reviewed by Cursor Bugbot for commit 6ffae7a. Configure here.
Invalid CSS property name in transition-[transform,opacity,shadow]. Tailwind arbitrary values insert directly into transition-property; 'shadow' is not a valid CSS property — 'box-shadow' is.
…examples
P0 fixes:
- finesse: toggle snap easing cubic-bezier(0.34,1.2,0.64,1) contradicted NEVER
bounce rule; replaced with ease-toggle (0.65,0,0.35,1)
- finesse: duration-100 comment said "Below 80ms threshold" (100 > 80); corrected
to "Near the 80ms threshold of perceived simultaneity"
- juicy: SoundManager.play() default volume 0.15 = -16.5dBFS exceeded -18dBFS
hard block; fixed to 0.08 = -22dBFS; createClick() removed baked-in 0.15
gain to prevent double application with play() gain node
- juicy: SoundManager tied enabled state to prefers-reduced-motion (wrong signal;
sound != motion); replaced with localStorage ui-sounds flag
- finesse: confirmation ripple setTimeout(1500) contradicted stated "600ms total"
rule; aligned to setTimeout(600) with ~1s total sequence note
P1 fixes:
- finesse: AnimatePresence example used plain <ListItem>/<EmptyState> without
motion.* wrappers or exit props; replaced with motion.li/motion.div + proper
framer-motion animate/exit props; added import comment
- juicy: KanbanColumn had isDragging={false} hardcoded and isDragOver/
isInvalidTarget unwired; added activeCardId prop, proper wiring comment, and
DnD library guidance (dnd-kit / react-dnd)
- finesse/juicy: worked examples missing import declarations; added commented
import lines for @headlessui/react Transition and framer-motion hooks
Mirrors applied to both .agents/ and .claude/ trees.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.

Important
RFC — looking for maintainer feedback before this merges.
Three open questions at the bottom. Happy to adjust or close without merge based on your direction.
Motivation
There's a gap between
animate(adds new motion) andpolish(fixes visual alignment and design-system drift) that no current command covers: refining the quality of interactions that already exist.The Japanese concept of kodawari — meticulous attention to things that don't need to be there, that most users won't consciously notice, but whose absence you always feel — fits this gap exactly.
Commands added
finesse [target](Enhance)Refines existing interactions without adding new animation. Covers:
active:scale-[0.97]), toggle snap, hover lift, focus ring, confirmation rippletransition-all/ bad defaults, asymmetric enter/exit curves, duration-by-distance tableHard block: won't proceed without
prefers-reduced-motioncoverage.juicy [target](Enhance)Adds game-feel on top of finesse (recommended to run finesse first):
cursor-grab/grabbing,cursor-col-resize,cursor-zoom-in,cursor-copy,cursor-not-allowedscroll-snap, sticky header transforms@media (hover: hover), theme crossfade without flash,prefers-contrasthandling::selectioncolor, range input thumb, search highlightContext gate: explicit institutional/financial/medical block on sound. Default no sound when context unclear.
Pedagogy
Both files go beyond the imperative style of neighbors (
animate.md,polish.md):NotificationBanner(finesse),KanbanCardwith drag (juicy)~3× longer than neighbors — see RFC question #3 on whether to trim.
Files changed
.agents/skills/impeccable/reference/finesse.md.agents/skills/impeccable/reference/juicy.md.claude/skills/impeccable/reference/finesse.md.claude/skills/impeccable/reference/juicy.md.agents/skills/impeccable/SKILL.md.claude/skills/impeccable/SKILL.md.agents/skills/impeccable/scripts/command-metadata.json.agents/skills/impeccable/scripts/pin.mjsfinesse+juicyin VALID_COMMANDS.claude-plugin/plugin.jsonTesting
pin finesse/unpin finesse— works in all 10 harnessespin juicy/unpin juicy— works in all 10 harnessesanimate.md,polish.md,delight.mdRFC: open questions
Category: placed under Enhance alongside
animate,delight,overdrive. Would a new "Feel" or "Refine" category make more sense to you?Naming:
finesse(refine existing interactions) andjuicy(game-feel layer).juicyis borrowed from game design — let me know if that reads as too niche for this audience.Pedagogy weight: few-shots + worked examples make these files ~3× longer than neighbors (~900 lines vs ~250). Happy to trim to the leaner style if you prefer consistency over depth.