- Dark patterns of any kind. No manipulative modals, no guilt-tripping copy, no artificial urgency, no buried opt-outs.
- Emojis in UI unless they are user-generated content. The product chooses its personality through design, not emoji.
- Bad typography. Inconsistent hierarchy, too many font sizes, decorative type without purpose. See Typography.
- Uncomfortable spacing. Generous, consistent whitespace. When something feels wrong, it’s usually cramped or inconsistently spaced. Err on the side of breathing room.
- Unjustified elements. Every button, label, section, and interaction must have a reason for existing. If you can’t articulate why it’s there, remove it.
- Gratuitous visual complexity. No glassmorphism, gradients, shadows, or animation unless they serve a specific functional or emotional purpose.
- Designing for the business instead of the user. If a feature exists primarily to move a metric rather than help the person, flag it.
- Border overuse. Don’t reach for borders by default to separate content. Spacing, background color changes, and subtle shadows are almost always cleaner. See Color & Depth.
- Stretching content to fill space. On large screens, content should have a comfortable max-width. Don’t let it stretch edge-to-edge just because the viewport allows it.
- Neglected empty states. Never leave a blank state undesigned. “No results” or “Nothing here yet” without intention is a missed opportunity.
- Arbitrary values. Never use a spacing value, font size, or color that isn’t from the design system’s defined scale. If it feels “close enough,” use the nearest system value instead. In Sundial terms: tokens from Semantic Colors and Typography, never hand-picked values.
The system-level enforcement of several of these lives in Conventions — e.g. “never hardcode colors or text styles” is the code-level form of the arbitrary-values rule.