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.zipInstalls 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.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
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
NoResultwith CTA - No
opacity-50for disabled states (usetext-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.
| Skill | Installs | Updated | Safety | Difficulty |
|---|---|---|---|---|
| ui-consistency (this skill) | 0 | 3mo | No flags | Beginner |
| frontend-ui-engineering | 0 | 2mo | No flags | Intermediate |
| radix-ui-design-system | 33 | 2mo | Review | Intermediate |
| reusable-ui-components | 1 | 6mo | Review | Intermediate |
Try saying
Example prompts that trigger this skill in your AI assistant.
You might also like
frontend-ui-engineering
charlieviettq
Build and refine web UI—component structure, responsive layout, design tokens, state, and accessibility. Use for feature UI work beyond WCAG checks alone.
radix-ui-design-system
sickn33
Build accessible design systems with Radix UI primitives. Headless component customization, theming strategies, and compound component patterns for production-grade UI libraries.
reusable-ui-components
EvanBacon
Guidelines for creating reusable, portable UI components with native-first design, compound patterns, and accessibility
verify-bulk-action-bar
junnv93
BulkActionBar 패턴 SSOT 검증 — count chip aria-live, role=toolbar, Esc clear, indeterminate Radix, focus management, IME guard. 일괄 작업 UI 변경 시 트리거. canonical = components/common/BulkActionBar.tsx (도메인 무관 generic), components/approvals/BulkActionBar.tsx는 approvals 특화 wrapper.
frontend-patterns
forgivesam168
Frontend development patterns for React, Next.js, state management, performance optimization, and UI best practices.
scroll-experience
davila7
Expert in building immersive scroll-driven experiences - parallax storytelling, scroll animations, interactive narratives, and cinematic web experiences. Like NY Times interactives, Apple product pages, and award-winning web experiences. Makes websites feel like experiences, not just pages. Use when: scroll animation, parallax, scroll storytelling, interactive story, cinematic website.