Skip to main content

Community Days | Button Test

Button Test

Reference page for visually comparing every Button variant + size in the app. The Standardsection is what should appear in 99% of the codebase — and as of the cdo-default flip, it's what <Button> renders out of the box even without an explicit size prop. All other sections are either exception cases or legacy patterns to recognize and avoid.

🔗 Pages with top-right buttons — audit checklist

Click through each link to visually verify the button conforms to the cdo standard (now the Button default). Status reflects the current code as audited; ✅ already standard, ⚠️ partial, ❌ non-standard.

Modal triggers (not directly linkable)

  • Crop Image modal → triggered by uploading any image in /app/edit-event → Images step
  • Submit Event Confirm (basic-pattern dark) → click Publish on a draft event in /app/dashboard
  • Create/Update Success (basic-pattern dark) → successful save on /app/edit-event or /app/new-event
  • Session Expired / Inactivity Warning → leave /app/edit-event idle for 8 minutes
  • Postpone / Cancel Event → kebab menu on a published event card in /app/dashboard
  • Sponsor Application form → click any sponsorship tier on a public event page

✅ The standard — cdo-* (cdo size is now the Button default)

Every button in the app should use a cdo-* color variant. Bold body-sized text, generous padding, content-driven height that clears the 44px touch standard. As of the defaultVariants flip, size='cdo' is implicit — explicit size='cdo' on existing call sites is harmless but no longer required for new code.

✅ Exception 1 — icon-only buttons

size='icon' is 44×44 square. Pair with variant='ghost' for transparent kebab/menu triggers, or any other variant for solid icon CTAs. Always include aria-label since there's no visible text.

✅ Exception 2 — basic-pattern modal outlines (dark overlay only)

cdo-*-outline-dark variants are designed for the basic-pattern modal (transparent content on a dark overlay). Use ONLY there. The on-dark color tokens (#54C8FF, #2ECC40, #DC73FF, #FF695E, #FF8EDF, #FFE21F) are calibrated for legibility against black.

⚠️ Light-context outlines — exception only

cdo-*-outline (without -dark) exists for narrow cases like delete-confirm modals where you want a less assertive button next to a filled CTA. Don't reach for these by default — use the filled cdo-* variants in normal card modals.

❌ Banned: shadcn default variants

These are the original shadcn variants. They exist on the Button but should NOT be used for new code — they don't map to a CDO color token, so the brand palette can't enforce consistency. Listed here so you can recognize and replace them in audits. (Note: with cdo-default applied, these variants now render at cdo SIZE — the typography matches — but the colors still bypass the CDO palette and that's the real problem.)

⚠️ Legacy sizes — opt-in escape hatches only

default / sm / lg use text-sm font-medium and don't match the CDO design rhythm. They used to be the silent default; after the cdo-default flip they're explicit opt-in escape hatches for the rare dense layout where cdo genuinely doesn't fit. Don't reach for them by default — and if you do, leave a comment explaining why.

🔗 Anchor button (asChild)

When a 'button' needs to navigate, preserve anchor semantics with asChild. Right-click / cmd-click / middle-click navigation works for free, plus screen-reader role announcements.

📐 Touch-target compliance check (44×44 minimum)

Hover/click each button — all should feel comfortable to tap on mobile. The CDO size auto-clears 44px from text-base + py-[0.785em] padding. Icon-size is exactly 44×44.

🎯 Disabled state

The Button base auto-applies disabled:pointer-events-none disabled:opacity-50 across every variant. Disabled state is consistent without per-variant overrides.