Iconography
The oneSlash Design System uses Lucide React for all icons, providing access to 1,400+ consistent, high-quality SVG icons optimized for performance and accessibility.
Library: Lucide React v0.553.0
Bundle Size: ~1 KB per icon
License: ISC (permissive)
Browse Icons: lucide.dev/icons
Why Lucide?
- 1,400+ Icons: Comprehensive icon set covering all common use cases
- Lightweight: 54% smaller than previous library (~1 KB vs ~2.2 KB per icon)
- Consistent Design: All icons share the same visual language and stroke width
- Tree-shakeable: Only bundle the icons you actually use
- TypeScript Support: Full type definitions included
Icon Sizes
The design system uses three standard icon sizes:
Small
16px (size-4)Compact UIs, inline text
Medium
20px (size-5)Default size
Large
24px (size-6)Emphasized actions
Using Icons in Components
Icons are integrated into multiple components throughout the design system. Here are common examples:
IconButton
<IconButton
iconName="X"
color="primary"
size="medium"
state="enabled"
onClick={handleClose}
/>Button with Icons
<Button
label="Save Changes"
decoIcon="CheckCircle" // Left icon
actionIcon="ChevronDown" // Right icon
type="primary"
size="medium"
state="enabled"
onClickButton={handleSave}
onClickActionIcon={handleDropdown}
/>MenuItem with Icons
<MenuItem
label="Settings"
iconName="Settings" // Left icon
iconRight="ChevronRight" // Right icon
onClick={handleNavigate}
/>Tab with Icons
<Tab
label="Dashboard"
decoIcon="Home" // Left icon
actionIcon="X" // Right icon
isSelected={isActive}
onClickTab={handleSelect}
onClickActionIcon={handleClose}
/>Tag with Icon
<Tag variant="contained" size="medium" label="Active" iconName="CheckCircle" state="enabled" />
Select with Icon
const options = [
{ value: '1', label: 'Option 1', iconName: 'Home' },
{ value: '2', label: 'Option 2', iconName: 'Settings' },
];
<Select
options={options}
value={selectedValue}
onChange={handleChange}
decoIconName="Search" // Icon in select trigger
/>Popular Icons
Here are the most commonly used icons in the design system:
Actions
XClose, dismiss, remove
CheckConfirm, complete, success
PlusAdd, create, expand
MinusRemove, decrease, collapse
Trash2Delete, remove permanently
PencilEdit, modify
CopyDuplicate, copy to clipboard
DownloadDownload files
UploadUpload files
RefreshCwRefresh, reload
Navigation
ChevronDownExpand, dropdown
ChevronUpCollapse, scroll up
ChevronLeftPrevious, back
ChevronRightNext, forward
ArrowLeftGo back
ArrowRightGo forward
HomeHome navigation
MenuMenu, hamburger
Status & Feedback
AlertCircleError, alert, warning
AlertTriangleWarning, caution
InfoInformation, help
CheckCircleSuccess, completed
XCircleError, failed
HelpCircleHelp, tooltip
Communication
MailEmail, messages
MessageCircleChat, comments
PhonePhone, call
BellNotifications
SendSend message
User & Account
UserUser profile
UserCircleUser avatar
UsersGroup, team
SettingsSettings, configuration
LockSecure, private
UnlockUnlocked, public
Content
SearchSearch functionality
FilterFilter, refine
FileGeneric file
FileTextDocument, text file
FolderFolder, directory
ImageImage, photo
CalendarDate, calendar
ClockTime, timestamp
Icon Naming Conventions
Lucide uses PascalCase naming without an "Icon" suffix:
Correct
CheckCircle
AlertTriangle
X
Settings
Incorrect
check-circle (kebab-case)
CheckCircleIcon (has "Icon" suffix)
checkCircle (camelCase)
Design Guidelines
Stroke Width
All icons use strokeWidth={2} for visual consistency. This is automatically applied by components.
Color
Icons inherit text color by default and respect light/dark mode.
Spacing
Gap between icon and text: 8px (space-2)
Icon button padding: Based on size (4px or 8px)
Accessibility
Icon-only buttons must have accessible labels:
// Good - has accessible label
<IconButton
iconName="X"
onClick={handleClose}
aria-label="Close dialog"
/>Components with Built-in Icons
Some components include icons automatically - no icon props needed:
Alert
Alert icons are automatically selected based on type:
<Alert type="success" message="Saved!" /> // Uses CheckCircle <Alert type="error" message="Failed" /> // Uses AlertCircle <Alert type="warning" message="Warning" /> // Uses AlertTriangle <Alert type="info" message="Info" /> // Uses Info
EmptyBox
Empty state component includes a default icon:
<EmptyBox text="No items found" size="large" /> // Uses AlertCircle
Select
Dropdown chevron is included automatically:
<Select options={options} value={value} /> // ChevronDown includedBest Practices
Do
- Use semantic icon names that match their purpose
- Keep icons consistent in size within the same context
- Use icon components provided by the design system
- Provide accessible labels for icon-only buttons
- Test icons in both light and dark modes
Don't
- Mix different icon sizes in the same component group
- Use icons without considering accessibility
- Override icon stroke width (breaks consistency)
- Use icons for decoration only
- Rely solely on color to convey meaning
Resources
- Browse all icons: lucide.dev/icons
- Lucide documentation: lucide.dev/guide
- GitHub: github.com/lucide-icons/lucide