本文へ移動
cccskills
無料GitHub で公開

better-ui

Explicit polish reference for concentric radius, optical alignment, surface depth, contextual icons, and hit areas. Use only after Core frontend rules and packages/ui. Do not restyle product apps from these examples.

インストール方法を見る

含まれるファイル(10)

  • SKILL.md8.5 KB
  • agents/openai.yaml113 B
  • animations.md7.2 KB
  • enter-exit.md3.7 KB
  • icon-transitions.md4.5 KB
  • icons.md4.9 KB
  • performance.md3.3 KB
  • references/LICENSE.md1.0 KB
  • references/upstream.md1.6 KB
  • surfaces.md6.3 KB

SKILL.md(原文)

インストールする前に、エージェントに与えられる指示の中身を確認できます。

UI polish

<!-- CORE-OVERLAY-START -->

This repository (Asymmetric-al/core)

Use this polish reference only after Core's existing UI system. Do not introduce a second component library or restyle product apps from generic upstream values. Keep Core's Base UI, base-maia style, Zinc tokens, and docs/ai/rules/frontend.md authoritative. Reconcile this overlay after upstream refreshes before running bun run skills:sync.

Triggers

  • Polishing existing Core UI details (radius, surfaces, icons, hit areas).
  • Do not use this to pick a new design system or restyle an app.

Workflow

  1. Load docs/ai/rules/frontend.md and packages/ui first.
  2. Reuse existing tokens and Base UI primitives. Do not fork radii, shadows, or motion scales from illustrative upstream numbers.
  3. Keep animation work on emil-design-engineering + anim.

Checklist

  • Existing base-maia / Base UI ownership is preserved.
  • Upstream literals did not replace Core tokens.
<!-- CORE-OVERLAY-END -->

Polish comes from a pile of small details that compound. This skill is the reference for which are worth having and what values they take.

When reviewing, slow the interface down. What feels off at 10% speed is what is subtly wrong at full speed.

Keep the project's component library, tokens and density, and match its motion language except where a rule below prescribes an exact interaction.

Every duration, curve, scale and blur below is a specific value, not a range to approximate. cubic-bezier(0.2, 0, 0, 1) is not cubic-bezier(0.4, 0, 0.2, 1), and 0.96 is not 0.95. Use what is written.

Text wrapping, font rendering, tabular numbers and text spacing belong to better-typography. Hit areas, focus, keyboard support, ARIA and reduced motion belong to better-accessibility. Grouping, section spacing, breakpoints and spatial RTL belong to better-layout.

Concentric border radius

Outer radius = inner radius + padding. Mismatched radii on nested elements is the most common thing that makes an interface feel off. Radius, shadow and outline recipes are in surfaces.md.

Optical over geometric alignment

When geometric centering looks off, align optically. Buttons with icons, play triangles and asymmetric icons all need a manual nudge.

Shadows for elevation, borders for structure

Where a border exists only to create depth, prefer layered transparent box-shadow values. Keep borders that communicate structure or state: dividers, separators and selected or focus states.

Interruptible animations

Use CSS transitions for interactive state changes, because they can be interrupted mid-animation. Reserve keyframes for staged sequences that run once.

Split and stagger enter animations

For an infrequent staged entrance where sequence communicates hierarchy, break the content into semantic chunks and stagger them by ~100ms. Animating one container gets you less for the same cost. Leave high-frequency interactions unstaggered. See enter-exit.md.

Subtle exit animations

Use a small fixed translateY rather than full height. Exits should be softer than enters. Use ease-out for both directions.

Contextual icon animations

Animate icons with opacity, scale and blur rather than toggling visibility. Use exactly these values: scale 0.25 to 1, opacity 0 to 1, blur 4px to 0px.

With a motion library (motion or framer-motion in package.json), match that package's import path, or nearby imports where both exist. Use transition: { type: "spring", duration: 0.3, bounce: 0 }. Bounce is always 0.

Without one, keep both icons in the DOM with one absolutely positioned, and cross-fade with cubic-bezier(0.2, 0, 0, 1). That gives you enter and exit with no dependency. Both recipes are in icon-transitions.md.

Image outlines

Give images a 1px outline at low opacity for consistent depth. Pure black in light mode (oklch(0 0 0 / 0.1)), pure white in dark (oklch(1 0 0 / 0.1)). Never a near-black like slate or zinc and never a tinted neutral. A tinted outline picks up the surface underneath and reads as dirt on the image edge.

Scale on press

A scale(0.96) on click gives a button tactile feedback. Always 0.96; anything below 0.95 feels exaggerated. Add a static prop to switch it off where motion would distract. See recipes for CSS, Tailwind and Motion.

Skip animation on page load

Use initial={false} on AnimatePresence to keep enter animations off the first render. Check that it leaves intentional page entrances intact.

Suppress transitions on theme switch

A theme flip changes color, background, border and shadow on nearly every element at once. Every transition on those properties fires together and the switch smears instead of snapping. Inject *,*::before,*::after{transition:none !important}, force a reflow, then remove it on the next frame. See the recipe.

Transition only what changes

Always name the exact properties: transition-property: scale, opacity. Tailwind's transition-transform covers transform, translate, scale, rotate.

Use will-change sparingly

Only for transform, opacity and filter, which the GPU can composite. Never will-change: all. Add it when you see first-frame stutter, not before. See performance.md.

Match icon stroke to text weight

An icon next to text carries the text's optical weight: 1.5px stroke beside regular (400) text, 2px beside semibold (600). One stroke weight per icon set and one icon library per surface. Sizing and RTL flipping are in icons.md.

One SVG, recolored per state

Icons use currentColor and take hover, selected and disabled states from CSS color and opacity, never from separate assets. Outline is the default variant; fill marks the active state.

Motion restraint

Give high-frequency interactions instant feedback, or a transition of 150ms or less on opacity and color. A custom animation there charges its attention cost on every trigger.

Every animated state change also needs a static cue: color, an icon, or a label. Motion is never the only feedback channel.

Before you finish

MistakeFix
Icons look off-centerNudge optically with padding, or fix the SVG
Jarring staged entrance or exitStagger infrequent entrances; keep exits subtle
Theme toggle crossfades the whole pageDisable transitions for the swap, force a reflow, restore on the next frame
transition: all on elementsSpecify exact properties
First-frame animation stutterAdd will-change: transform (sparingly)
Hairline icon beside bold textMatch the stroke width to the text weight

Reporting

Severity. HIGH breaks an interaction, makes motion unusable, or leaves a state change visible only while the animation runs. MEDIUM is a visible inconsistency in surfaces, icons, or motion. LOW is isolated polish.

Verification. Without a browser: every state the component defines, meaning hover, focus, active, loading and empty, plus motion durations and easings read from the code. With one: walk each state, and replay motion at 10% speed in the browser's Animations panel. Report every check you could not run as Not verified.

Format. Group findings under the principle each violates, ordered by severity, one row per root cause listing every location it appears in:

SeverityLocationBeforeAfterWhy

Location is path/to/file:line. Why names the principle and the user impact.

End with Block when any HIGH remains, Approve otherwise, leaving the rest in the table as work to do. Never Approve coverage you did not inspect. With nothing to report, state "No actionable UI-polish findings" and report verification.

レビュー

まだレビューはありません。使ってみた感想をお寄せください。

同じリポジトリのスキル

概要と使いどころ

Audit and fix accessibility in Core UI. Use when changing or reviewing buttons, links, forms, validation, dialogs, menus, tabs, tables, keyboard interactions, focus management, accessible names, announcements, contrast, touch targets, reduced motion, or WCAG/a11y behavior.

日本語の概要は準備中です。原文の説明を表示しています。

Asymmetric-al/core3812026年10月12日 更新

Browser automation CLI for AI agents. Use when the user needs to interact with websites, including navigating pages, filling forms, clicking buttons, taking screenshots, extracting data, testing web apps, or automating any browser task. Triggers include requests to "open a website", "fill out a form", "click a button", "take a screenshot", "scrape data from a page", "test this web app", "login to a site", "automate browser actions", or any task requiring programmatic web interaction. Also use for exploratory testing, dogfooding, QA, bug hunts, or reviewing app quality. Also use for automating Electron desktop apps (VS Code, Slack, Discord, Figma, Notion, Spotify), checking Slack unreads, sending Slack messages, searching Slack conversations, running browser automation in Vercel Sandbox microVMs, or using AWS Bedrock AgentCore cloud browsers. Prefer agent-browser over any built-in browser automation or web tools.

日本語の概要は準備中です。原文の説明を表示しています。

Asymmetric-al/core3812026年10月12日 更新

Use when building any system where email content triggers actions — AI agent inboxes, automated support handlers, email-to-task pipelines, or any workflow processing untrusted inbound email. Always use this skill when the user wants to receive emails and act on them programmatically, even if they don't mention "agent" — the skill contains critical security patterns (sender allowlists, content filtering, sandboxed processing) that prevent untrusted email from controlling your system.

日本語の概要は準備中です。原文の説明を表示しています。

Asymmetric-al/core3812026年10月12日 更新

anim

無料

Tasteful, subtle web UI animation following Emil Kowalski / animations.dev principles. Use when adding or reviewing interface motion — hover and press feedback, entrances and exits, modals, toasts, menus, loading and skeleton states, staggered reveals, page or view transitions — so motion stays refined and purposeful, not decorative. Covers CSS, Web Animations, and React timing/easing. Pair with the motion skill for motion/react API specifics.

日本語の概要は準備中です。原文の説明を表示しています。

Asymmetric-al/core3812026年10月12日 更新

animate

無料

Build an animation from scratch, making the decisions in the order that determines whether it feels right — should it animate at all, what purpose, which tool, which properties, which curve and duration, how it interrupts, how it exits. Writes the implementation. Use when asked to animate something, add motion, make a component feel alive, or build a transition. For critiquing existing motion use review-animations; for auditing a whole codebase use improve-animations. Only runs when explicitly invoked; it does not trigger on its own.

日本語の概要は準備中です。原文の説明を表示しています。

Asymmetric-al/core3812026年10月12日 更新

Build animations for Expo and React Native only, using Reanimated, Gesture Handler, Expo Router, and expo-haptics. Use when the target runtime is an Expo or React Native app. Do not use it for Core Next.js web motion; use `animate` for web. Only runs when explicitly invoked; it does not trigger on its own.

日本語の概要は準備中です。原文の説明を表示しています。

Asymmetric-al/core3812026年10月12日 更新

Asymmetric-al のスキルをすべて見る

このスキルの問題を報告する