UI

ui-consistency

Provides design system rules for UI consistency across Waldur HomePort components.

Install

mkdir -p .claude/skills/ui-consistency && curl -L -o skill.zip "https://agentskills.codes/api/skills/download/12479" && unzip -o skill.zip -d .claude/skills/ui-consistency && rm skill.zip

Installs to .claude/skills/ui-consistency

Activation

This is the description your AI agent reads to decide when to run this skill — the better it matches your request, the more reliably it fires.

Waldur HomePort UI/UX consistency patterns and design system rules. Use when creating or modifying UI components, tables, forms, buttons, dialogs, empty states, loading states, tooltips, or notifications. Enforces disabled button tooltips, empty state CTAs, proper null value display, and accessibility patterns.
312 chars✓ has a “when” triggerlonger than Claude Code's old 250-char listing cap (fine on current versions)
Beginner

Key capabilities

  • Enforce `renderFieldOrDash` for null/empty values
  • Require tooltips for disabled buttons explaining the reason
  • Mandate `NoResult` component with actionable CTA for empty states
  • Prescribe solid color tokens for disabled styling instead of opacity
  • Guide decisions on hiding vs. disabling buttons based on user permissions

How it works

The skill provides guidelines and a pre-commit checklist to ensure UI components adhere to Waldur HomePort's consistency patterns, including rules for null values, disabled buttons, empty states, and styling.

Inputs & outputs

You give it
UI component, table, form, button, dialog, empty state, loading state, tooltip, or notification
You get back
UI element adhering to Waldur HomePort UI/UX consistency patterns

When to use ui-consistency

  • Implement UI components
  • Fix design inconsistencies
  • Apply accessibility patterns

About this skill

UI Consistency Guidelines

Ensures consistent, accessible UI across Waldur HomePort.

Quick Reference (Critical Rules)

Null/Empty Values

// ALWAYS use renderFieldOrDash - never || 'N/A' or || ''
import { renderFieldOrDash } from '@/table/utils';
{renderFieldOrDash(value)}

Disabled Buttons

// ALWAYS provide tooltip explaining WHY disabled
<Tip label={disabled ? translate('Resource must be in OK state') : null}>
  <Button disabled={disabled}>Action</Button>
</Tip>

Empty States

// ALWAYS use NoResult with actionable CTA
<NoResult
  title={translate('No projects yet')}
  message={translate('Create your first project.')}
  actions={<CreateButton />}
/>

Disabled Styling

// Use solid color tokens - NEVER opacity
className={isDisabled ? 'text-muted' : ''}  // correct
className={isDisabled ? 'opacity-50' : ''}  // wrong

Decision Trees

Hide vs Disable Button?

  • User PERMANENTLY lacks permission → HIDE
  • Temporary/fixable condition → DISABLE + tooltip

Which Empty State?

  • Active filters, no results → "No results match your filters" + Clear filters button
  • First-time use → Encouraging message + Create CTA
  • Search query, no match → "Your search '{query}' did not match any {items}"

Complete Guidelines

For full patterns, examples, and anti-patterns: docs/ui-consistency-guidelines.md

Sections include:

  • Empty states and NoResult component
  • Button visibility (hide vs disable matrix)
  • Loading states and error handling
  • Tables and filter behavior
  • Dialogs and confirmations
  • Notifications
  • Status indicators
  • Tooltips
  • Accessibility
  • Responsive behavior

Pre-Commit Checklist

Before completing UI work, verify:

  • All null/undefined values use renderFieldOrDash()
  • Disabled buttons have tooltips explaining why
  • Empty states use NoResult with CTA
  • No opacity-50 for disabled states (use text-muted)
  • Permissions checked with hasPermission() utility
  • Buttons hidden (not disabled) when user permanently lacks access
  • Filter tables show filter toggle even when empty
  • Confirmation dialogs name the object being affected

Key Imports

import { NoResult } from '@/navigation/header/search/NoResult';
import { renderFieldOrDash } from '@/table/utils';
import { Tip } from '@/core/Tooltip';
import { hasPermission } from '@/permissions/hasPermission';
import { StateIndicator } from '@/core/StateIndicator';
import { LoadingErred } from '@/core/LoadingErred';

When not to use it

  • When using `|| 'N/A'` or `|| ''` for null/empty values
  • When disabled buttons lack tooltips
  • When using `opacity-50` for disabled states

Limitations

  • All null/undefined values must use `renderFieldOrDash()`
  • Disabled buttons must have tooltips explaining why
  • Empty states must use `NoResult` with CTA

How it compares

This skill enforces specific UI consistency patterns and accessibility rules through explicit guidelines and a checklist, providing a structured approach compared to subjective design choices.

Compared to similar skills

ui-consistency side by side with the closest alternatives in the catalog.

SkillInstallsUpdatedSafetyDifficulty
ui-consistency (this skill)03moNo flagsBeginner
frontend-ui-engineering02moNo flagsIntermediate
radix-ui-design-system332moReviewIntermediate
reusable-ui-components16moReviewIntermediate

Try saying

Example prompts that trigger this skill in your AI assistant.

Search skills

Search the agent skills registry