# Badge Polish: Gear Animation + Custom Color Picker — Design Spec
**Date:** 2026-08-26
**Status:** Draft
**Parent spec:** `2026-08-26-inline-color-popover-design.md`
## Overview
Two improvements to the inline color popover and badge system:
1. **Gear icon animation** — remove the permanent padding gap on subreddit badges. The badge grows on hover to reveal the gear, then shrinks back.
2. **Custom color picker** — replace all native `` elements (which delegate to the macOS system picker) with an inline SV+Hue picker widget built in vanilla JS/canvas.
## Improvement 1: Gear Icon Animation
### Current Behavior
`.rt-badge--subreddit` has `padding-right: 18px` at all times, reserving space for the gear icon even when it's hidden. This wastes ~12px on every subreddit badge.
### New Behavior
The subreddit badge uses `padding-right: 6px` at rest (matching the left padding). On hover, `padding-right` transitions to `18px` over 150ms, smoothly expanding the badge to reveal the gear icon. The gear's opacity transition (0 → 0.6, 150ms) runs in parallel. When the mouse leaves, both transitions reverse — the gear fades out and the badge shrinks.
The adjacent comments badge shifts right during the expansion. This is natural inline-block flow and at 150ms feels intentional rather than jittery.
### CSS Changes
```css
.rt-badge--subreddit {
position: relative;
padding-right: 6px;
transition: padding-right 0.15s;
/* background, border-color, color unchanged */
}
.rt-badge--subreddit:hover {
padding-right: 18px;
}
```
The gear icon CSS (`.rt-badge-gear`) is unchanged — it remains `position: absolute; right: 3px` and animates opacity on parent hover.
### File Changes
| File | Change |
|---|---|
| `content/styles/badges.css` | Change `.rt-badge--subreddit` `padding-right` from `18px` to `6px`, add `transition: padding-right 0.15s`, add `.rt-badge--subreddit:hover { padding-right: 18px }`. |
No JS changes required.
---
## Improvement 2: Custom Color Picker Widget
### Problem
The native `` delegates to the OS-level color picker. On macOS, this opens a separate floating panel that is detached from the popover context, has limited precision, and feels foreign to the extension's UI.
### Solution
Replace all `` elements — in both the inline popover and the extension popup — with a custom SV+Hue picker widget. The picker renders inline within the containing UI (popover or popup), provides full color control, and stays visually consistent with the extension's design.
### Picker Anatomy
```
┌──────────────────────────────┐
│ ┌──────────────────────┐ │
│ │ │ │ ← SV square (saturation-value)
│ │ [cursor ●] │ │ Click/drag to pick S + V
│ │ │ │ Canvas-rendered for current hue
│ └──────────────────────┘ │
│ ┌──────────────────────────┐ │
│ │ ← hue slider → │ │ ← Hue bar (horizontal rainbow)
│ └──────────────────────────┘ │ Click/drag to change hue
└──────────────────────────────┘
```
### Color Model
The picker uses HSV internally (hue, saturation, value). HSV maps naturally to the SV square (X = saturation, Y = value) and hue bar (X = hue). Colors are converted to/from hex (`#rrggbb`) for storage, display, and sync with the hex text input.
### SV Square
A `