Skip to content

[RFC] feat: add finesse and juicy commands#145

Open
eudresfs wants to merge 3 commits into
pbakaus:mainfrom
eudresfs:feat/finesse-juicy
Open

[RFC] feat: add finesse and juicy commands#145
eudresfs wants to merge 3 commits into
pbakaus:mainfrom
eudresfs:feat/finesse-juicy

Conversation

@eudresfs
Copy link
Copy Markdown

@eudresfs eudresfs commented May 9, 2026

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) and polish (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:

  • Exits: choreographed exit for flow elements, fade for overlays, collapse vertical, directional slide-out
  • Entries: stagger, snap-in, expand vertical, fade-in
  • Feedback: press feedback (active:scale-[0.97]), toggle snap, hover lift, focus ring, confirmation ripple
  • Coordinated sequences: backdrop-before-content for modals, skeleton→content crossfade, loading inline, error shake
  • Data transitions: animated numbers, content swap, empty-state transition
  • Easing quality: audit for transition-all / bad defaults, asymmetric enter/exit curves, duration-by-distance table

Hard block: won't proceed without prefers-reduced-motion coverage.

juicy [target] (Enhance)

Adds game-feel on top of finesse (recommended to run finesse first):

  • Cursor: cursor-grab/grabbing, cursor-col-resize, cursor-zoom-in, cursor-copy, cursor-not-allowed
  • Drag choreography: custom ghost element, drop zone progressive feedback (idle/valid/invalid), FLIP reorder animation
  • Scroll: scroll-snap, sticky header transforms
  • Awareness: hover guard @media (hover: hover), theme crossfade without flash, prefers-contrast handling
  • Selection and text: brand ::selection color, range input thumb, search highlight
  • Keyboard: shortcut echo, polished focus ring
  • Sound (opt-in, consumer/SaaS only): AudioContext micro-sounds, volume targets (-18 to -24 dBFS), mute path

Context 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):

  • Chain-of-thought decision guides before each pattern family
  • Few-shots with before/after diffs and diff commentary per pattern
  • Worked examples: NotificationBanner (finesse), KanbanCard with drag (juicy)

~3× longer than neighbors — see RFC question #3 on whether to trim.

Files changed

File Change
.agents/skills/impeccable/reference/finesse.md New
.agents/skills/impeccable/reference/juicy.md New
.claude/skills/impeccable/reference/finesse.md New (mirror)
.claude/skills/impeccable/reference/juicy.md New (mirror)
.agents/skills/impeccable/SKILL.md +2 rows in Enhance
.claude/skills/impeccable/SKILL.md +2 rows + argument-hint updated
.agents/skills/impeccable/scripts/command-metadata.json +2 entries
.agents/skills/impeccable/scripts/pin.mjs finesse + juicy in VALID_COMMANDS
.claude-plugin/plugin.json 3.0.7 → 3.1.0, "23 commands" → "25 commands"

Testing

  • pin finesse / unpin finesse — works in all 10 harnesses
  • pin juicy / unpin juicy — works in all 10 harnesses
  • Voice consistent with animate.md, polish.md, delight.md

RFC: open questions

  1. Category: placed under Enhance alongside animate, delight, overdrive. Would a new "Feel" or "Refine" category make more sense to you?

  2. Naming: finesse (refine existing interactions) and juicy (game-feel layer). juicy is borrowed from game design — let me know if that reads as too niche for this audience.

  3. 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.

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).
@eudresfs eudresfs requested a review from pbakaus as a code owner May 9, 2026 13:30
Copy link
Copy Markdown

@cursor cursor Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes and found 1 potential issue.

Fix All in Cursor

❌ 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.

Comment thread .agents/skills/impeccable/reference/juicy.md Outdated
eudresfs added 2 commits May 9, 2026 10:35
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.
@eudresfs eudresfs changed the title feat: add finesse and juicy commands [RFC] feat: add finesse and juicy commands May 9, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant