Redesign an Existing Stacks UI
Related skills: the audit-first companion to stacks-design-taste (the flagship anti-slop skill). Apply an aesthetic preset with stacks-design-soft, stacks-design-minimalist, or stacks-design-brutalist. Work in stacks-stx, stacks-crosswind, stacks-ui, and stacks-composables.
How This Works
When applied to an existing Stacks project, follow this sequence:
- Scan - Read the codebase. Confirm the stack is stx + Crosswind + composables. Locate
resources/views/*.stx,resources/components/*.stx,resources/layouts/*.stx,config/ui.ts,config/crosswind.ts, and thefontsconfig. Note current design patterns. - Diagnose - Run through the audit below. List every generic pattern, weak point, and missing state you find.
- Fix - Apply targeted upgrades working with the existing stx + Crosswind stack. Do not rewrite from scratch and do not migrate frameworks. Improve what is there.
Design Audit
Typography
Check for these problems and fix them:
- Browser default fonts or Inter everywhere. Replace with a font that has character (
Geist,Outfit,Cabinet Grotesk,Satoshi). Register the choice in thefontsconfig and load it with@font-face/<link>+font-display: swapin the layout.stxhead. For editorial/creative projects, pair a serif header with a sans-serif body. - Headlines lack presence. Increase size for display text, tighten letter-spacing, reduce line-height. Headlines should feel heavy and intentional.
- Body text too wide. Limit paragraph width to roughly 65 characters (
max-w-prose/max-w-2xl). Increase line-height for readability. - Only Regular (400) and Bold (700) weights used. Introduce Medium (500) and SemiBold (600) for subtler hierarchy.
- Numbers in proportional font. Use a monospace font or enable tabular figures (
tabular-nums/font-variant-numeric: tabular-nums) for data-heavy interfaces. - Missing letter-spacing adjustments. Negative tracking for large headers, positive tracking for small caps or labels.
- All-caps subheaders everywhere. Try lowercase italics, sentence case, or small-caps instead.
- Orphaned words. Single words alone on the last line. Fix with
text-wrap: balanceortext-wrap: pretty.
Color and Surfaces
- Pure
#000000background. Replace with off-black, dark charcoal, or tinted dark (#0a0a0a,#121212, or a dark navy). - Oversaturated accent colors. Keep saturation below 80%. Desaturate accents so they blend with neutrals instead of screaming.
- More than one accent color. Pick one. Remove the rest. Consistency beats variety.
- Mixing warm and cool grays. Stick to one gray family; tint all grays with a consistent hue.
- Purple/blue "AI gradient" aesthetic. The most common AI design fingerprint. Replace with neutral bases and a single, considered accent.
- Generic
box-shadow. Tint shadows to match the background hue. Use colored shadows instead of pure black at low opacity. - Flat design with zero texture. Add subtle noise, grain, or micro-patterns to backgrounds. Pure flat vectors feel sterile.
- Perfectly even gradients. Break uniformity with radial gradients, noise overlays, or mesh gradients instead of standard linear 45-degree fades.
- Inconsistent lighting direction. Audit all shadows to suggest a single, consistent light source.
- Random dark sections in a light-mode page (or vice versa). A single dark-background section breaking an otherwise light page looks like a copy-paste accident. Either commit to full dark mode (
dark:+useColorMode()/useDark()) or keep a consistent tone throughout. If contrast is needed, use a slightly darker shade of the same palette, not a sudden jump to#111in the middle of a cream page. - Empty, flat sections with no visual depth. Add high-quality background imagery (blurred, overlaid, or masked), subtle patterns, or ambient gradients. Use
<img>with explicitwidth/heightvia the stx asset pipeline; placeholder sourcehttps://picsum.photos/seed/{name}/1920/1080. Even a subtle full-width photo at low opacity adds presence.
Layout
- Everything centered and symmetrical. Break symmetry with offset margins, mixed aspect ratios, or left-aligned headers over centered content.
- Three equal card columns as feature row. The most generic AI layout. Replace with a 2-column zig-zag, asymmetric grid, horizontal scroll, or masonry layout.
- Using
height: 100vhfor full-screen sections. Replace withmin-h-[100dvh]to prevent layout jumping on mobile browsers (iOS Safari viewport bug). - Complex flexbox percentage math. Replace with CSS Grid (
gridutilities) for reliable multi-column structures. - No max-width container. Add a container constraint (around
max-w-7xl, 1200-1440px) withmx-autoso content does not stretch edge-to-edge on wide screens. - Cards of equal height forced by flexbox. Allow variable heights or use masonry when content varies.
- Uniform border-radius on everything. Vary the radius: tighter on inner elements, softer on containers.
- No overlap or depth. Use negative margins to create layering and visual depth.
- Symmetrical vertical padding. Adjust optically; bottom padding often needs to be slightly larger.
- Dashboard always has a left sidebar. Try top navigation, a floating command menu, or a collapsible panel instead.
- Missing whitespace. Double the spacing. Let the design breathe. Dense layouts work for data dashboards, not for marketing pages.
- Buttons not bottom-aligned in card groups. Pin CTAs to the bottom of each card so they form a clean horizontal line regardless of content above.
- Feature lists starting at different vertical positions. In pricing tables or comparison cards, feature lists should start at the same Y position across columns.
- Inconsistent vertical rhythm in side-by-side elements. Align shared elements (titles, descriptions, prices, buttons) across all items. Misaligned baselines make the layout look broken.
- Mathematical alignment that looks optically wrong. Icons next to text, play buttons in circles, or text in buttons often need 1-2px optical adjustments to feel right.
Interactivity and States
- No hover states on buttons. Add background shift, slight scale, or translate on
hover:. - No active/pressed feedback. Add
active:scale-[0.98]oractive:translate-y-pxto simulate a physical click. - Instant transitions with zero duration. Add smooth transitions (200-300ms) to all interactive elements.
- Missing focus ring. Ensure visible
focus-visible:indicators for keyboard navigation. An accessibility requirement, not optional. - No loading states. Replace generic circular spinners with skeleton loaders that match the layout shape. Drive async state with
useAsync/useFetch/useQuery. - No empty states. Design a composed "getting started" view instead of a blank dashboard.
- No error states. Add clear, inline error messages for forms. Do NOT use
window.alert()(and never barewindow.*in stx scripts). - Dead links. Buttons that link to
#. Either link to real destinations or visually disable them. - No indication of current page in navigation. Style the active nav link differently (use
useRoute()/useRouter()to detect it). - Scroll jumping. Anchor clicks jump instantly. Add
scroll-behavior: smooth. - Animations using
top,left,width,height. Switch totransformandopacityfor GPU-accelerated, smooth animation.
Content
- Generic names like "John Doe" or "Jane Smith". Use diverse, realistic-sounding names.
- Fake round numbers like
99.99%,50%,$100.00. Use organic, messy data:47.2%,$99.00,+1 (312) 847-1928. - Placeholder company names like "Acme Corp", "Nexus", "SmartFlow". Invent contextual, believable brand names.
- AI copywriting cliches. Never use "Elevate", "Seamless", "Unleash", "Next-Gen", "Game-changer", "Delve", "Tapestry", or "In the world of...". Write plain, specific language.
- Exclamation marks in success messages. Remove them. Be confident, not loud.
- "Oops!" error messages. Be direct: "Connection failed. Please try again."
- Passive voice. Use active voice: "We couldn't save your changes" instead of "Mistakes were made."
- All blog post dates identical. Randomize dates to appear real.
- Same avatar image for multiple users. Use unique assets for every distinct person.
- Lorem Ipsum. Never use placeholder latin text. Write real draft copy.
- Title Case On Every Header. Use sentence case instead.
Component Patterns
- Generic card look (border + shadow + white background). Remove the border, or use only background color, or use only spacing. Cards should exist only when elevation communicates hierarchy.
- Always one filled button + one ghost button. Add text links or tertiary styles to reduce visual noise.
- Pill-shaped "New" and "Beta" badges. Try square badges, flags, or plain text labels.
- Accordion FAQ sections. Use a side-by-side list, searchable help, or inline progressive disclosure. When you do keep a disclosure, use the headless
Disclosurefromstacks-ui. - 3-card carousel testimonials with dots. Replace with a masonry wall, embedded social posts, or a single rotating quote.
- Pricing table with 3 towers. Highlight the recommended tier with color and emphasis, not just extra height.
- Modals for everything. Use inline editing, slide-over panels, or expandable sections instead of popups for simple actions. For real modals reach for the headless
Dialog/Modalinstacks-ui. - Avatar circles exclusively. Try squircles or rounded squares for a less generic look.
- Light/dark toggle always a sun/moon switch. Use a dropdown, system preference detection (
useColorMode()/useDark()), or integrate it into settings. - Footer link farm with 4 columns. Simplify. Focus on main navigational paths and legally required links.
Iconography
- Lucide or Feather icons exclusively. The "default" AI icon choice. Use Iconify
i-*classes (Phosphori-ph-*, Heroicons, or the hugeicons default) for differentiation. NEVER hand-roll SVG icon paths and NEVERnpm installan icon library. - Rocketship for "Launch", shield for "Security". Replace cliche metaphors with less obvious icons (bolt, fingerprint, spark, vault).
- Inconsistent stroke widths across icons. Standardize to one stroke weight and one Iconify collection per project.
- Missing favicon. Always include a branded favicon.
- Stock "diverse team" photos. Use real team photos, candid shots, or a consistent illustration style instead of uncanny stock imagery.
Code Quality
- Div soup. Use semantic stx markup:
<nav>,<main>,<article>,<aside>,<section>. - Inline styles mixed with utility classes. Move styling into Crosswind utilities or the
.stx<style>block. - Hardcoded pixel widths. Use relative units (
%,rem,em,max-w-*) for flexible layouts. - Missing alt text on images. Describe image content for screen readers. Never leave
alt=""oralt="image"on meaningful images. - Arbitrary z-index values like
9999. Establish a clean z-index scale in the theme/tokens. - Commented-out dead code. Remove all debug artifacts before shipping.
- Import hallucinations. Check that every import actually exists. Composables are auto-imported (no import line); do not invent composable names. Verify components exist in
resources/components. - Missing meta tags. Add proper
<title>,description,og:image, and social sharing meta via the@seo/@metadirectives oruseHead/useSeoMeta. - Vanilla JS in stx scripts. Replace any
var,document.*, orwindow.*with signals + composables + directives.
Strategic Omissions (What AI Typically Forgets)
- No legal links. Add privacy policy and terms of service links in the footer.
- No "back" navigation. Every page needs a way back.
- No custom 404 page. Design a helpful, branded "page not found" experience.
- No form validation. Add client-side validation for emails, required fields, and format checks.
- No "skip to content" link. Add a hidden skip-link for keyboard users.
- No cookie consent. If required by jurisdiction, add a compliant consent banner.
Upgrade Techniques
Pull from these high-impact techniques to replace generic patterns. All motion is built with Crosswind transitions, CSS keyframes, and composables; Stacks ships no animation library, so do NOT import motion, gsap, or framer-motion.
Typography Upgrades
- Variable font animation. Interpolate weight or width on scroll or hover for text that feels alive.
- Outlined-to-fill transitions. Text starts as a stroke outline and fills with color on scroll entry or interaction.
- Text mask reveals. Large typography acting as a window to video or animated imagery behind it.
Layout Upgrades
- Broken grid / asymmetry. Elements that deliberately ignore column structure: overlapping, bleeding off-screen, or offset with calculated randomness.
- Whitespace maximization. Aggressive negative space to force focus on a single element.
- Parallax card stacks. Sections that stick and physically stack over each other during scroll. Build with
position: sticky+top: 0and CSS scroll-driven animations (animation-timeline: view()/scroll()), not GSAP ScrollTrigger. - Split-screen scroll. Two halves of the screen sliding in opposite directions via CSS scroll-driven animations.
Motion Upgrades
- Smooth scroll with inertia. Use
scroll-behavior: smooth; keep it CSS-driven, never arequestAnimationFrameloop writing signal state every frame. - Staggered entry. Elements cascade in with slight delays, combining Y-axis translation with opacity fade. Toggle with
useIntersectionObserver/useElementVisibility. Never mount everything at once. - Spring physics. Replace linear easing with custom cubic-bezier motion (for example
ease-[cubic-bezier(0.32,0.72,0,1)]) for a natural, weighty feel. - Scroll-driven reveals. Content entering through expanding masks, wipes, or draw-on SVG paths tied to scroll progress via CSS scroll-driven animations. NEVER
window.addEventListener('scroll', ...).
Surface Upgrades
- True glassmorphism. Go beyond
backdrop-blur. Add a 1px inner border and a subtle inner shadow to simulate edge refraction. Apply blur only to fixed/sticky elements. - Spotlight borders. Card borders that illuminate under the cursor. Track the pointer with
useMouse()and drive a CSS custom property from aneffect. - Grain and noise overlays. A fixed,
pointer-events-noneoverlay with subtle noise to break digital flatness. - Colored, tinted shadows. Shadows that carry the hue of the background rather than generic black.
Fix Priority
Apply changes in this order for maximum visual impact with minimum risk:
- Font swap - biggest instant improvement, lowest risk
- Color palette cleanup - remove clashing or oversaturated colors
- Hover and active states - makes the interface feel alive
- Layout and spacing - proper grid, max-width, consistent padding
- Replace generic components - swap cliche patterns for modern alternatives
- Add loading, empty, and error states - makes it feel finished
- Polish typography scale and spacing - the premium final touch
Rules
- Work with the existing stx + Crosswind + composables stack. Do not migrate frameworks or styling libraries.
- Do not break existing functionality. Test after every change.
- Before importing any new library, check
package.jsonfirst. Composables are auto-imported; do not invent composable names (defer tostacks-composablesfor the real list). - Respect CLAUDE.md hard bans: no
var, nodocument.*, nowindow.*in stx scripts; lint with pickier (bunx --bun pickier .), never eslint. - Keep changes reviewable and focused. Small, targeted improvements over big rewrites.
- Ship complete stx; never a skeleton or placeholder comment.