Icons

Koala Icons is our own stroke set, drawn on one 24px grid by one spec. Search it, copy any icon as SVG or JSX, and import it as a plain React component.

Koala Icons#

488 icons in 23 categories, and growing. Search by name, tag or category, and switch to Fill to see the solid weight. Hover an icon and use Copy SVG to paste the master into Figma, Copy JSX for the import and the element, or Download SVG for a file.

488 of 488

address-book
airplane
airplane-tilt
ambulance
anchor
app-window
archive
arrow-bend-up-left
arrow-bend-up-right
arrow-clockwise
arrow-counter-clockwise
arrow-down
arrow-left
arrow-line-down
arrow-line-left
arrow-line-right
arrow-line-up
arrow-line-up-right
arrow-right
arrow-square-out
arrow-u-down-left
arrow-u-up-left
arrow-u-up-right
arrow-up
arrow-up-right
arrows-clockwise
arrows-down-up
arrows-horizontal
arrows-in-line-vertical
arrows-in-simple
arrows-left-right
arrows-out
arrows-out-cardinal
arrows-out-line-horizontal
arrows-out-line-vertical
arrows-out-simple
arrows-vertical
article
at
atom
bandaids
bank
barbell
barcode
barricade
basket
battery-full
battery-high
battery-low
battery-medium
battery-warning
bed
bell
bell-ringing
bell-slash
bicycle
binoculars
boat
bone
book-bookmark
book-open
book-open-text
bookmark-simple
books
bounding-box
bowl-food
bowl-steam
brain
bread
briefcase
broadcast
broom
browser
browsers
bug
buildings
cactus
cake
calculator
calendar
calendar-check
calendar-dots
camera
car
car-profile
cards
caret-circle-down
caret-circle-up-down
caret-double-down
caret-double-up
caret-down
caret-left
caret-right
caret-up
caret-up-down
carrot
castle-turret
cell-signal-full
cell-signal-high
cell-signal-low
cell-signal-medium
certificate
chart-bar
chart-donut
chart-line
chart-line-up
chart-pie-slice
chat-circle
chat-circle-dots
chat-circle-text
chats
chats-circle
check
check-circle
check-square
checks
cherries
circle
circle-dashed
circle-half
circle-notch
circles-four
clipboard-text
clock
clock-counter-clockwise
cloud
code
code-block
coffee
coins
columns
command
compass
confetti
cookie
copy
corners-in
corners-out
credit-card
crop
crosshair
crown
cube
currency-circle-dollar
currency-dollar
currency-eur
currency-gbp
cursor
cursor-click
database
desktop
detective
device-mobile
device-tablet
devices
diamond
diamonds-four
dog
dots-nine
dots-six
dots-six-vertical
dots-three
dots-three-vertical
download-simple
drop
egg
egg-crack
envelope-open
envelope-simple
equals
export
eye
eye-slash
eyedropper
factory
file
file-arrow-up
file-code
file-css
file-dashed
file-html
file-image
file-js
file-jsx
file-magnifying-glass
file-md
file-pdf
file-plus
file-png
file-py
file-rs
file-sql
file-svg
file-text
file-ts
file-tsx
file-vue
file-x
files
film-strip
fingerprint
fire
fire-truck
first-aid
first-aid-kit
fish
flag
flag-banner
flask
floppy-disk
folder-lock
folder-open
folder-plus
folder-simple
fork-knife
frame-corners
funnel
game-controller
gas-pump
gauge
gavel
gear-six
gift
git-branch
git-commit
git-merge
git-pull-request
globe
globe-hemisphere-west
graduation-cap
grid-four
grid-nine
hamburger
hammer
hand
hand-grabbing
hand-heart
hand-pointing
hand-waving
handbag
hands-clapping
handshake
hash
headphones
headset
heart
heartbeat
hexagon
hourglass-medium
house
ice-cream
identification-card
image
infinity
info
kanban
key
keyboard
knife
laptop
layout
leaf
lifebuoy
lightbulb
lightning
line-segment
link
link-break
list
list-bullets
list-checks
list-magnifying-glass
list-numbers
lock
magic-wand
magnet
magnifying-glass
magnifying-glass-plus
map-pin
map-pin-area
map-trifold
markdown-logo
medal
megaphone
microphone
microphone-slash
minus
money
monitor
moon
moon-stars
motorcycle
mouse-right-click
music-note
navigation-arrow
newspaper
notches
note
note-pencil
notebook
notification
option
package
paint-brush
palette
paper-plane-tilt
paperclip
paragraph
password
path
pause
paw-print
pen-nib
pencil-simple
percent
person-simple-run
person-simple-tai-chi
phone
phone-call
picture-in-picture
pill
pizza
planet
plant
play
play-circle
plugs
plugs-connected
plus
plus-minus
police-car
polygon
power
presentation-chart
printer
prohibit
pulse
push-pin
push-pin-slash
puzzle-piece
qr-code
question
quotes
radio
radio-button
ranking
receipt
record
repeat
resize
road-horizon
robot
rocket
rocket-launch
rows
ruler
scales
scissors
scroll
seal-check
seal-percent
selection
shapes
share-network
shield-check
shield-star
shopping-bag
shopping-bag-open
shopping-cart
shuffle
sidebar
sign-in
sign-out
signature
signpost
siren
skip-back
skip-forward
sliders
sliders-horizontal
slideshow
smiley
smiley-angry
smiley-meh
smiley-sad
smiley-wink
sneaker
snowflake
sort-ascending
sort-descending
sparkle
speaker-high
speaker-low
speaker-slash
speaker-x
square
square-half
square-split-horizontal
squares-four
stack
stamp
star
steering-wheel
steps
stethoscope
sticker
stop
storefront
strategy
suitcase-simple
sun
sun-horizon
sunglasses
swap
swatches
syringe
t-shirt
table
tabs
tag
target
television
terminal-window
text-aa
text-align-center
text-align-justify
text-align-left
text-align-right
text-b
text-h-four
text-h-one
text-h-three
text-h-two
text-indent
text-italic
text-strikethrough
text-t
text-underline
textbox
thermometer-simple
thumbs-down
thumbs-up
ticket
timer
toggle-left
toggle-right
toolbox
translate
trash
tray
tree-structure
trend-down
trend-up
trophy
truck
upload-simple
user
user-check
user-circle
user-circle-plus
user-focus
user-gear
user-list
user-minus
user-plus
user-switch
users
users-four
users-three
van
video-camera
video-camera-slash
wallet
warehouse
warning
warning-circle
warning-octagon
watch
waveform
waves
wheelchair
wifi-high
wifi-slash
wind
wine
wrench
x
x-circle

Install and import#

Install the koala-icons package and import each icon by name. Every icon is a plain function with no context and no client hooks, so it renders in Server Components with no "use client" boundary. Import optical.css once, in your root layout, for the small optical size.

TerminalTSX
npm install koala-icons
app/layout.tsxTSX
import "koala-icons/optical.css"
example.tsxTSX
import { Bell, ArrowRight } from "koala-icons"<Bell /><ArrowRight className="size-5" />// One module per icon, for setups that don't tree-shake a barrelimport { Bell } from "koala-icons/icons/bell"

Sizes#

An icon is 1em by default, so it follows the text beside it. Set a size with Tailwind's size-*, or the size prop in pixels. Pick it by context: 16 in buttons, 20 in rows led by a text label, 14 in chips. Button, Input and Badge size an unclassed icon for you.

size-3.5

14px

size-4

16px

size-5

20px

size-6

24px

Weights#

Two weights: regular, the outline, and fill, the solid version for selected and status states. Fill is derived from the outline, so the two never drift. Only icons with a body get it; a line glyph like a check or an arrow keeps its outline.

Bellregular · fill
Starregular · fill
Houseregular · fill
Lockregular · fill
CheckCircleregular · fill
Checkregular · fill
example.tsxTSX
<Star />                  {/* regular, the default */}<Star weight="fill" />    {/* selected, active */}<Check weight="fill" />   {/* no body: stays an outline */}

Optical sizes#

At 16px and below the stroke gets heavier, and icons with fine inner marks swap to a simpler small drawing. It happens by itself, from the size each icon renders at, once optical.css is imported. Without it, the large drawing shows at every size.

Trash

House

Info

Copy

Color#

Icons draw in currentColor, so a text-* utility on the icon or any ancestor colors it. Use semantic tokens only, never a raw value, so the icon re-themes across all four themes.

foreground
muted-fg
brand
destructive
success
info

Accessibility#

An icon is decorative by default: aria-hidden="true", because the text beside it already says what it means. An icon-only control names the control, not the icon. An icon that carries meaning on its own takes title or aria-label, which gives it role="img".

a11y.tsxTSX
// Decorative: the label says it, the icon is skipped<Button>  Continue <ArrowRight /></Button>// Icon-only: name the button, not the icon<Button iconOnly aria-label="Notifications">  <Bell /></Button>// Meaningful on its own: give the icon a name<CheckCircle title="Verified" className="text-success" />// Avoid: a label on the icon inside a labelled control is read twice<Button aria-label="Next step">  <ArrowRight aria-label="Next step" /></Button>

In context#

Button and Badge size an unclassed icon to their own step, so composing needs no size class: 16px in a button, 14px in a badge.

Deployed 3 new
usage.tsxTSX
import { ArrowRight, Bell, Check, Plus } from "koala-icons"import { Button } from "@/components/ui/button"import { Badge } from "@/components/ui/badge"<Button><Plus /> New project</Button><Button variant="outline">Continue <ArrowRight /></Button><Badge variant="success"><Check /> Deployed</Badge><Badge variant="info"><Bell weight="fill" /> 3 new</Badge>