From harness-claude
Guides UI design consistency: internal patterns, external platform conventions, temporal stability. Decision rules for conflicts; enforces tokens like CSS border-radius. Use for component design, audits, platform ports, PR reviews.
npx claudepluginhub intense-visions/harness-engineering --plugin harness-claudeThis skill uses the workspace's default tool permissions.
> Internal vs. external consistency — maintaining coherent patterns within a product, adhering to platform conventions, and knowing when to break consistency deliberately
Generates design system from product domain: style, palette, typography, platform patterns, anti-patterns. Outputs .rune/design-system.md as contract for UI skills.
Provides UI/UX design intelligence with 50+ styles, 161 color palettes, 57 font pairings, UX guidelines, and stack-specific best practices for React, Next.js, Vue, Svelte, Tailwind, Flutter, React Native.
Provides UI/UX resources: 50+ styles, color palettes, font pairings, guidelines, charts for web/mobile across React, Next.js, Vue, Svelte, Tailwind, React Native, Flutter. Aids planning, building, reviewing interfaces.
Share bugs, ideas, or general feedback.
Internal vs. external consistency — maintaining coherent patterns within a product, adhering to platform conventions, and knowing when to break consistency deliberately
Internal consistency means every screen, component, and interaction within your product behaves the same way. If cards have 8px border-radius on the dashboard, they have 8px border-radius everywhere.
External consistency means your product behaves like other products on the same platform. iOS apps use bottom tab bars; Android apps use top navigation drawers. Users carry expectations from every other app they use daily.
Temporal consistency means your product behaves the same way today as it did yesterday. Changing a primary button from blue to green between releases breaks the learned affordance for every existing user.
Decision procedure — when levels conflict:
Do not rely on memory or visual inspection. Encode consistency into design tokens.
Stripe's approach: Every interactive element uses one of exactly three border-radius values: 4px (inputs, small elements), 6px (cards, containers), 8px (modals, large surfaces). There is no 12px, no 16px, no pill shape (999px). This constraint is enforced in code — the design system exports only these three radius tokens.
/* Stripe-style radius tokens — exhaustive, no other values permitted */
:root {
--radius-sm: 4px; /* inputs, badges, chips */
--radius-md: 6px; /* cards, dropdowns, popovers */
--radius-lg: 8px; /* modals, dialogs, sheets */
}
/* Violation — inventing a new radius */
.fancy-button {
border-radius: 24px; /* WRONG: not a token, breaks consistency */
}
/* Correct — using the token */
.fancy-button {
border-radius: var(--radius-sm);
}
Material Design's elevation system: Shadows are not ad hoc. There are exactly 5 elevation levels (0dp, 1dp, 2dp, 4dp, 8dp for most components) mapped to specific component types. A card is always 1dp. A raised button is always 2dp. A dialog is always 24dp. Deviating from these creates visual noise that breaks the spatial model.
The principle: Users spend 99% of their time in other apps. Violating platform conventions forces users to relearn interactions they already know.
| Convention | iOS (Apple HIG) | Android (Material) | Web |
|---|---|---|---|
| Back navigation | Left swipe / top-left chevron | System back button / top-left arrow | Browser back button |
| Primary action | Top-right bar button (e.g., "Done") | FAB or top-right icon | Right-aligned button in forms |
| Destructive action | Red text in action sheets | Red text in dialogs | Red button, requires confirmation |
| Pull to refresh | Native UIRefreshControl | SwipeRefreshLayout | Not a convention (use button) |
| Tab bar position | Bottom (max 5 tabs) | Top (scrollable) or bottom (3-5) | Top (horizontal nav) |
Airbnb's cross-platform strategy: On iOS, Airbnb uses a bottom tab bar with 5 items (Explore, Wishlists, Trips, Inbox, Profile) matching Apple HIG. On Android, the same 5 items appear in a bottom navigation bar matching Material guidelines. The information architecture is identical; the implementation respects each platform's conventions. They do not use a hamburger menu on iOS or a bottom bar on web.
Run this audit on every major feature or quarterly on the full product:
Visual properties:
px values in border-radius)Interaction properties:
--accents-2 uniformly)Content properties:
Consistency is not uniformity. Some situations demand breaking the pattern:
Rule: Break consistency only when the inconsistency communicates meaning.
Worked example — Spotify's green CTA: Every surface in Spotify uses a monochrome palette of blacks, grays, and whites. The single exception is the green (#1DB954) used exclusively for the primary action (Play, Shuffle, Follow). This deliberate inconsistency works because the break itself carries meaning — green means "this is the one thing you should do." If green appeared on 10 different element types, the signal would dissolve.
Worked example — Stripe's destructive actions: Stripe's entire UI is composed of neutral blues and grays. Red (#FF4136) appears only on destructive actions (delete, cancel subscription, revoke key). The red breaks the color consistency to signal danger. This is a deliberate, meaningful violation.
Decision procedure for breaking consistency:
Consistency is measurable, not subjective. Count the number of unique values for each visual property across the entire product:
font-size declarations, the scale is not being followed.margin: 13px) to find violations.Tooling for measurement: Run grep -roh 'border-radius: [^;]*' src/ | sort | uniq -c | sort -rn to see every unique border-radius in the codebase. Do the same for font-size, color, margin, padding, and box-shadow. The output is your consistency scorecard.
1. Snowflake components. A designer creates a "special" card variant for a marketing page with different radius, shadow, and padding from the standard card. Another designer sees it and creates their own variant. Within 6 months, the product has 14 card variants that each appeared "justified" in isolation but collectively destroy coherence. Fix: Require all component variants to be added to the design system with explicit documentation of when to use each variant. If you cannot write a clear usage rule, the variant should not exist.
2. Platform denial. Forcing iOS conventions onto Android (or vice versa) because "we want the same experience everywhere." This creates an experience that feels wrong on every platform. Users on Android expect the system back button to work; wrapping navigation in a custom stack that ignores it creates confusion. Fix: Share information architecture and brand identity across platforms. Adapt interaction patterns to each platform's conventions.
3. Pixel-perfect inconsistency. The design file says buttons are 40px tall, but 30% of the buttons in production are 38px or 42px because developers eyeballed it or different developers used different base values. The eye detects these near-misses more than gross differences. Fix: Expose sizing tokens (not pixel values) in the component API. A button's height should be --size-control-md, never a raw number. Lint for hardcoded dimensional values.
4. Terminology drift. The settings page says "Remove account," the confirmation dialog says "Delete account," and the success message says "Account erased." Three synonyms for one action across three screens. Users wonder if these are different actions. Fix: Maintain a terminology glossary in the design system. Each concept has exactly one canonical term. Lint content strings against the glossary.
5. Franken-pattern. Combining conventions from different platforms or design systems in the same product — Material icons with iOS navigation with a custom Android-style FAB on web. Each piece is well-designed in its original context but together they create a disorienting experience. Fix: Choose one design system as the foundation and extend it. Do not mix origin systems.
Vercel — Monochrome as consistency strategy. Vercel's entire dashboard uses exactly two hue categories: grayscale (backgrounds, text, borders) and blue (links, focus rings). There is no green success, no yellow warning, no red error in the primary UI. Status is communicated through icons and labels, not color variation. This extreme consistency means any color that does appear (like a red deployment failure badge) carries enormous visual weight precisely because it is the only chromatic element. The constraint: --geist-foreground (white or black depending on theme) and --geist-background (inverse) are the only two mandatory color tokens.
Apple — Consistency as platform trust. Apple's HIG defines that every destructive action in an action sheet must use the .destructive button style (red text, standard font weight). This is consistent across every first-party and well-behaved third-party app. When a user sees red text in an action sheet, they know — without reading — that this option destroys something. Apps that use red for non-destructive actions (like "Change Color to Red") violate this convention and erode platform trust for all apps.
Material Design — Consistency through systematic constraint. Material's component specs do not say "pick a nice shadow." They prescribe exact elevation values: FAB rests at 6dp, raised button at 2dp, card at 1dp, dialog at 24dp. The shadow values are mathematically derived from the elevation number, not hand-tuned. This system means every Material app has the same spatial hierarchy, making the platform feel cohesive even across apps from different developers.
Airbnb — Card anatomy consistency. Every listing card across Airbnb's product follows identical anatomy: image carousel (16:9 aspect ratio), heart icon (top-right), title (semibold, 16px), subtitle (regular, 14px), metadata line (regular, 14px, secondary color), price (semibold, 16px, right-aligned). This rigid structure means users can scan hundreds of listings without cognitive overhead — their eyes know exactly where to find each piece of information. When Airbnb introduced "Experiences," the cards followed the same anatomy with different content, maintaining recognition.
design-alignment for spatial consistency, design-gestalt-similarity for perceptual grouping through consistent styling, design-brand-consistency for brand-level coherence, and design-design-governance for process-level enforcement.