minimal-ui-design-system
Build minimal UI for Next.js, React, Svelte, and Vite. Use verified Hugeicons, Geist, simple colors, soft borders, clear spacing, and ample breathing room so no component competes for attention. Maintain enterprise-grade UX with an ultra-clean design. Avoid decorative styling. Keep the design clean, consistent, and easy to use.
- risk
- safe
- source
- trysapphire.today
- date added
- 2026-03-27
Minimal UI Design System
This skill governs UI and design generation for minimal, clean, production-grade interfaces.
It is not a persona. It is not roleplay. It is a strict execution standard.
The goal is simple:
- Build minimal interfaces that feel intentional
- Keep the visual system clean, modern, and calm
- Remove decorative noise
- Preserve usability, hierarchy, and production quality
- Eliminate ambiguity before implementation
1. Mandatory Preflight
Before generating visual UI code, resolve these two design decisions first unless the user already specified them:
Required Question 1 — Neutral Palette
Ask which neutral family the user wants for the design system:
zincneutralstoneslate
Do not assume this. Do not mix multiple neutral families in one design.
Required Question 2 — Primary Accent
Ask which primary accent color the user wants for interactive emphasis.
This primary color may be used for:
- primary buttons
- active navigation states
- links
- focus accents
- selected states
- data emphasis
Do not use multiple primary accents unless the user explicitly requests that.
Default Fallback Rule
If the user does not specify either value and the task requires immediate output, use:
- Neutral family:
zinc - Primary accent: one restrained modern hue only
Do not introduce gradients. Do not introduce rainbow accents. Do not invent multiple brand colors.
2. Core Design Laws
These rules are mandatory.
Always
- Design for minimalism, clarity, and production quality
- Use restrained visual hierarchy
- Use clean spacing and calm surfaces
- Keep borders subtle and non-harsh
- Keep typography sharp and readable
- Use one neutral palette consistently
- Use one primary accent consistently
- Prefer simple composition over decorative styling
Never
- Never use shadows
- Never use gradients
- Never use glow effects
- Never use glassmorphism
- Never use decorative blur as styling
- Never use random icon libraries
- Never guess icon names
- Never add visual noise to “make it feel modern”
- Never confuse minimal with empty or monochrome
Minimal does not mean black and white only.
A valid minimal palette may be:
- one neutral family for structure
- one primary accent for emphasis
- black or near-black for strongest text
- white or near-white for base surfaces
That is allowed. That is preferred. Gradient-heavy “AI slop” styling is not allowed.
Guardrails
Do not generate generic AI-slop. Do not default to safe SaaS patterns, trendy gradients, fake luxury clichés, bloated layouts, or decorative noise. Create a design with a clear point of view, one memorable idea, and real visual intent. Use generous breathing room, but do not confuse whitespace with weak design or inflated layout. Keep everything minimal, sharp, and deliberate.
Minimal means ruthless restraint, strong hierarchy, precise spacing, excellent typography, and zero unnecessary elements. Do not bloat titles, descriptions, cards, sections, or navigation. For website hero sections, keep the main heading to a maximum of 5 to 6 words and the supporting description to a maximum of 15 to 17 words. For cards and supporting sections, keep copy equally restrained: short title, short supporting text, no filler.
Emphasize the headline more than the description. Most users scan; they do not read bloated paragraphs. Write only what strengthens the interface. Every color, type choice, image treatment, and layout decision must feel intentional, distinctive, and specific to the product. If any section looks templated, predictable, bloated, or replaceable with a hundred other AI outputs, redesign it until it has identity.
3. Icon Standard — Hugeicons Only
Hugeicons is the canonical icon source.
Use Hugeicons only unless the user explicitly requests another icon system.
Strict Rules
- Always verify icon availability before using an icon
- Never hallucinate icon names
- Never import icons blindly from old package paths
- Never mix Hugeicons with Lucide, Heroicons, Tabler, or others unless explicitly requested
Discovery Procedure
Free library discovery command:
node -e "import('@hugeicons/core-free-icons').then(m=>console.log(Object.keys(m).join('\n')))"
If using a Pro style, replace the package name accordingly, for example:
@hugeicons-pro/core-solid-rounded
Installation
Install both the renderer and the icon pack:
npm install @hugeicons/react @hugeicons/core-free-icons
or
pnpm add @hugeicons/react @hugeicons/core-free-icons
Required Usage Pattern
Use the wrapper + icon data pattern.
import { HugeiconsIcon } from "@hugeicons/react"; import { DashboardSquare01Icon } from "@hugeicons/core-free-icons"; <HugeiconsIcon icon={DashboardSquare01Icon} size={24} color="currentColor" />
Icon Rules
- Use
HugeiconsIconfor rendering - Use verified icon data imports from the core package
- Keep icon size proportional to surrounding typography
- Use
currentColorby default - Icon-only controls must have accessible labels
- Do not oversize icons to compensate for weak layout
- Do not use icons decoratively unless they support hierarchy or usability
4. Typography Standard — Geist by Default
Geist is the default font system.
Use Geist first. Do not default to Inter. Do not mix multiple sans families by default.
Install
bun add geist
Allowed Font Roles
GeistSansfor UI textGeistMonofor code, data, technical valuesGeistPixel*only if the user explicitly requests a pixel-display aesthetic
Pixel variants are not the default body font.
Minimal Root Layout Example
Keep the implementation minimal.
import "./globals.css"; import { GeistSans } from "geist/font/sans"; import { GeistMono } from "geist/font/mono"; import { cn } from "@/lib/utils"; export default function RootLayout({ children, }: { children: React.ReactNode; }) { return ( <html lang="en" className={cn("h-full antialiased", GeistSans.variable, GeistMono.variable)} > <body className="min-h-full font-sans tracking-normal"> {children} </body> </html> ); }
Typography Rules
Always use:
antialiasedtracking-normalortracking-tight
Never use:
tracking-wide- exaggerated letter spacing
- decorative font mixing
- random display fonts
Weight Rules
Default weights:
font-normalfont-mediumonly when necessary for hierarchy
Avoid:
font-semiboldfont-bold
Use stronger weights only if the user explicitly asks for stronger emphasis.
Hierarchy Rules
Typography must feel calm and precise.
Preferred pattern:
- page title: restrained, clean, not oversized
- section title: one step below page title
- card title: compact and readable
- body: clear and low-friction
- helper text: lighter emphasis, never noisy
- code/data:
font-mono
Numeric Data
Use tabular figures for metrics, prices, counts, and aligned technical values.
5. Color System
The selected neutral family controls the structural palette.
Apply it consistently to:
- text hierarchy
- borders
- dividers
- muted surfaces
- table headers
- input chrome
- layout framing
Structural Palette Rules
Use the chosen neutral family for:
- primary text
- secondary text
- tertiary text
- borders
- dividers
- muted backgrounds
- inactive controls
Do not mix stone with zinc, or slate with neutral, inside one system unless explicitly instructed.
Primary Accent Rules
The primary accent may be used for:
- CTA buttons
- active tabs
- selected states
- links
- focused controls
- progress/data emphasis
Do not use the primary accent for:
- large page backgrounds
- card backgrounds by default
- decorative gradients
- purely ornamental glow or branding clutter
Minimal Color Principle
Minimal does not mean monochrome. It means restrained color allocation.
Valid:
- neutral system + one primary accent
- black/near-black + neutral system + one primary accent
- white/near-white + neutral system + one primary accent
Invalid:
- gradients
- multiple competing accents
- neon decoration
- colored shadows
- arbitrary colorful surfaces
6. Surface, Border, and Radius Rules
Shadows
No shadows. None.
Do not use:
shadow-*drop-shadow-*- glowing rings as decoration
- fake depth through blur and bloom
Borders
Borders must be soft, subtle, and non-harsh.
Preferred border behavior:
- light neutral border
- slightly stronger on hover
- calm focus state
- visible enough for structure, never heavy
Do not use:
- black borders by default
- thick outlines
- harsh contrast borders
- double-border styling for decoration
Radius
Use restrained radius. Preferred values:
rounded-lgrounded-xlfor larger containers only
Do not use:
- sharp corners by default
- pill shapes everywhere
- oversized radius on every component
7. Layout and Spacing Rules
Minimal UI fails when spacing is cramped.
Always
- give sections breathing room
- separate content groups clearly
- keep containers readable
- preserve rhythm across vertical stacks
- use clean max-width constraints
- avoid edge-to-edge layout unless explicitly requested
Never
- cram content into dense cards
- stack unrelated controls tightly
- create fake complexity with too many nested wrappers
- fill every empty area just because space exists
Layout Pattern
Default page structure:
- header
- supporting text if needed
- content sections
- action area
Use spacing to define hierarchy before using color.
8. Component Rules
Buttons
Buttons must:
- have clear visual priority
- use the chosen primary accent or a neutral treatment
- include hover and active states
- have disabled styling
- preserve readable text contrast
- avoid over-rounded “pill for everything” styling
Primary buttons should feel deliberate, not loud.
Inputs
Inputs must:
- use subtle neutral borders
- use calm focus indication
- avoid harsh outlines
- keep background clean
- preserve strong readability
- feel soft, not decorative
Cards
Cards must:
- use subtle borders
- have clean internal padding
- avoid shadows
- avoid loud filled backgrounds unless explicitly needed
- separate header/content cleanly
Tables
Tables must:
- have readable row spacing
- use subtle dividers
- keep headers restrained
- support hover states only when interactive
- avoid noisy zebra patterns unless needed for scanning
Dialogs / Drawers
Must:
- be compact
- be clearly framed
- use subtle borders
- preserve hierarchy through spacing
- avoid theatrical styling
Navigation
Navigation must:
- be visually obvious
- distinguish active state clearly
- not depend on color alone
- use Hugeicons consistently
- avoid oversized icons and oversized labels
9. Interaction Rules
Every interactive element must clearly look interactive.
Required:
- hover state
- active state
- focus-visible state
- disabled state
- pointer cursor where appropriate
Do not leave clickable elements visually static.
Motion
Keep motion restrained.
Allowed:
- fast, subtle transitions
- opacity change
- border-color change
- background-color change
- transform only when light and justified
Not allowed:
- bouncy motion
- decorative parallax
- dramatic reveal animations
- motion used to fake quality
10. Accessibility Rules
Accessibility is mandatory.
Required
- sufficient contrast
- visible keyboard focus
- semantic HTML first
aria-labelon icon-only controls- real button elements for buttons
- real links for navigation
- headings that reflect page hierarchy
Never
- rely on color alone for state
- use icons without accessible meaning
- use div soup when semantic elements are correct
11. Implementation Rules
Technical Baseline
- strict TypeScript only
- no
any - no unsafe shortcuts
- production-ready structure
- modern React patterns
- modern Tailwind usage
- minimal but complete implementation
Styling Rule
Every visual decision must be intentional.
Do not rely on component defaults and assume they look good. Style every important surface deliberately.
Design Resolution Rule
If the user’s request conflicts with this skill:
- follow explicit user instruction
- otherwise follow this skill
- do not silently invent a third direction
12. Output Contract
When generating UI work, return:
- code
- short implementation summary
- explicit checklist confirming all requested requirements were satisfied
Do not add filler. Do not add design philosophy paragraphs unless requested. Do not teach unless the user asks for explanation.
13. Hard Prohibitions
These are absolute unless the user explicitly overrides them.
- No shadows
- No gradients
- No glow
- No glassmorphism
- No random icon library mixing
- No unverified Hugeicons imports
- No defaulting to Inter over Geist
- No decorative font mixing
- No tracking-wide by default
- No harsh borders
- No thick outlines
- No bright decorative color systems
- No fake “modern” styling tricks
- No roleplay language
- No persona framing
- No unnecessary refactors outside the user request
14. Final Checklist
Before finalizing, verify all of the following:
Design Decisions
- Neutral family is resolved:
zinc,neutral,stone, orslate - Primary accent is resolved
- No extra accent system was introduced
Icon System
- Hugeicons used
- Icon names were verified from the correct package
HugeiconsIconwrapper used- Icon-only controls have labels
Typography
- Geist is the default font system
antialiasedis appliedtracking-normalortracking-tightused- no tracking-wide by default
- weight usage is restrained and consistent
Styling
- no shadows
- no gradients
- no glow
- borders are subtle
- radius is restrained
- spacing is clean
UX
- hover states exist
- focus states exist
- disabled states exist
- clickable items look clickable
- accessibility basics are satisfied
Output
- code is production-ready
- summary is brief
- checklist is explicit
- no filler was added
15. Reference Snippets
Hugeicons Example
import { HugeiconsIcon } from "@hugeicons/react"; import { DashboardSquare01Icon, Settings02Icon, UserCircleIcon, } from "@hugeicons/core-free-icons"; export function SidebarNavigation() { return ( <nav className="flex flex-col gap-4"> <div className="flex items-center gap-2"> <HugeiconsIcon icon={DashboardSquare01Icon} size={24} color="currentColor" /> <span>Dashboard</span> </div> <div className="flex items-center gap-2"> <HugeiconsIcon icon={Settings02Icon} size={24} strokeWidth={2} color="currentColor" /> <span>Settings</span> </div> <button aria-label="User Profile" type="button"> <HugeiconsIcon icon={UserCircleIcon} size={28} /> </button> </nav> ); }
Geist Import Reference
import { GeistSans } from "geist/font/sans"; import { GeistMono } from "geist/font/mono"; import { GeistPixelSquare, GeistPixelGrid, GeistPixelCircle, GeistPixelTriangle, GeistPixelLine, } from "geist/font/pixel";
Use the pixel variants only when the user explicitly asks for a pixel-display treatment. They are not default UI body fonts.