Skip to main content

Styling

The default v4 UI is built in. Most apps can use AchievementsWidget as-is and pass small style overrides when needed.

Widget Styles

Inline widgets inherit surrounding color and typography, which makes them fit drawers, sidebars, menus, and nav bars.

<AchievementsWidget
placement="inline"
buttonStyles={{
borderRadius: 8,
padding: '10px 12px',
}}
modalStyles={{
content: {
maxWidth: 720,
},
}}
/>

Use renderTrigger when the trigger needs to be the app's own drawer row or menu item:

<AchievementsWidget
placement="inline"
renderTrigger={({ buttonProps, unlockedCount, totalCount }) => (
<button {...buttonProps} className="drawer-item">
Achievements
<span>{unlockedCount}/{totalCount}</span>
</button>
)}
/>

You can also open the built-in modal from any existing control:

import { AchievementsModal } from 'react-achievements';

<button onClick={() => setOpen(true)}>Achievements</button>
<AchievementsModal isOpen={open} onClose={() => setOpen(false)} />

Customize modal title and empty state:

<AchievementsModal
isOpen={open}
onClose={() => setOpen(false)}
title="Team achievements"
emptyState="No achievements yet."
/>

Hide scrollbar chrome while keeping the modal scrollable:

<AchievementsModal
isOpen={open}
onClose={() => setOpen(false)}
hideScrollbar
/>

<AchievementsWidget hideModalScrollbar />

Blur the page behind the modal:

<AchievementsModal
isOpen={open}
onClose={() => setOpen(false)}
backdropBlur={2}
/>

<AchievementsWidget modalBackdropBlur={2} />

Pass a number for pixels or a CSS length string such as "0.25rem". Omit the prop or pass 0 to disable backdrop blur.

Use compact square achievement badges when the modal or list needs to show more items at once:

<AchievementsWidget density="compact" />

<AchievementsModal
isOpen={open}
onClose={() => setOpen(false)}
density="compact"
/>

<AchievementsList density="compact" />

density defaults to "comfortable". Custom renderAchievement functions receive the active density, so custom rows can switch between row and badge layouts.

Inline Lists

Use AchievementsList in drawers, profile pages, settings panels, or custom layouts.

import { AchievementsList } from 'react-achievements';

<aside>
<AchievementsList />
</aside>

Hide locked achievements:

<AchievementsList showLocked={false} />

Render list rows yourself:

<AchievementsList
renderAchievement={({ achievement, icon, isLocked }) => (
<div className={isLocked ? 'achievement locked' : 'achievement'}>
<span>{icon}</span>
<strong>{achievement.achievementTitle}</strong>
</div>
)}
/>

Custom UI

For complete control, use the headless entry point and render your own components:

import { AchievementProvider, useAchievementState } from 'react-achievements/headless';

The headless APIs do not import DOM UI components.