Icons list
Every icon in @clawscale/react/icons, by name. Filter the list, then click a name to select it for copying.
Usage#
Pass a name to Icon or to any icon prop. Each icon also has a component: data-lineage is DataLineageIcon. See Icons for both.
import { Icon } from "@clawscale/react";
import { DataLineageIcon } from "@clawscale/react/icons";<Icon icon="data-lineage" size={20} />
<DataLineageIcon size={20} />All icons#
The list shows the 20px paths. Names are the same at every size.
add
add-application
add-child
add-clip
add-column-left
add-column-right
add-derived-column
add-location
add-parent
add-row-bottom
add-row-top
add-tile
add-to-artifact
add-to-folder
aimpoints-target
airplane
align-center
align-justify
align-left
align-right
alignment-bottom
alignment-horizontal-center
alignment-left
alignment-right
alignment-top
alignment-vertical-center
ammunition
anchor
annotation
announcement
antenna
app-header
application
applications
archive
area-of-interest
array
array-boolean
array-date
array-floating-point
array-numeric
array-object
array-string
array-timestamp
arrow-bottom-left
arrow-bottom-right
arrow-down
arrow-left
arrow-right
arrow-top-left
arrow-top-right
arrow-up
arrows-arc
arrows-horizontal
arrows-vertical
asterisk
at
automatic-updates
axle
backlink
backward-ten
badge
ban-circle
bank-account
barcode
binary-number
blank
block-promote
blocked-person
bold
book
bookmark
box
branch-locked
branch-unlocked
briefcase
bring-data
bring-forward
british-pound
bug
buggy
build
bullseye
calculator
calendar
camera
caret-down
caret-left
caret-right
caret-up
cargo-ship
cell-tower
changes
chart
chat
chevron-backward
chevron-down
chevron-forward
chevron-left
chevron-right
chevron-up
circle
circle-arrow-down
circle-arrow-left
circle-arrow-right
circle-arrow-up
circle-dashed
citation
clean
clip
clipboard
clipboard-file
cloud
cloud-download
cloud-server
cloud-tick
cloud-upload
code
code-block
cog
collapse-all
color-fill
column-layout
comment
comparison
compass
compressed
confirm
console
console-alert
construction
contrast
control
credit-card
crop
cross
cross-circle
crown
crystal-ball
css-style
cube
cube-add
cube-cutout
cube-cutouts
cube-edit
cube-remove
cubes
curly-braces
curved-range-chart
cut
cycle
dashboard
data-cloud
data-connection
data-lineage
data-search
data-sync
database
delete
delete-clip
delta
derive-column
descendant
desktop
detection
diagnosis
diagram-tree
direction-left
direction-right
disable
divide
document
document-code
document-locked
document-open
document-share
dollar
dot
double-caret-horizontal
double-caret-vertical
Page 1 of 4, 706 icons
import { Button, ButtonGroup, Icon, InputGroup, NonIdealState } from "@clawscale/react";
import { type IconName, IconNames } from "@clawscale/react/icons";
import { type CSSProperties, useDeferredValue, useMemo, useState } from "react";
// IconNames has two keys per icon (DataLineage and DATA_LINEAGE), so dedupe the values.
const ICONS = [...new Set<IconName>(Object.values(IconNames))].sort();
const PAGE_SIZE = 180;
const grid: CSSProperties = {
display: "grid",
gap: 8,
gridTemplateColumns: "repeat(auto-fill, minmax(124px, 1fr))",
};
const card: CSSProperties = {
alignItems: "center",
background: "var(--cs-color-surface-raised)",
border: "1px solid var(--cs-color-border-subtle)",
borderRadius: "var(--cs-radius-md)",
display: "flex",
flexDirection: "column",
gap: 10,
padding: "16px 8px 12px",
};
const label: CSSProperties = {
color: "var(--cs-color-text-muted)",
fontFamily: "var(--cs-font-mono)",
fontSize: "var(--cs-font-size-xs)",
overflowWrap: "anywhere",
textAlign: "center",
userSelect: "all",
};
export default function IconsGallery() {
const [query, setQuery] = useState("");
const [page, setPage] = useState(0);
const deferredQuery = useDeferredValue(query);
const matches = useMemo(() => {
const terms = deferredQuery
.toLowerCase()
.split(/[\s-]+/)
.filter(Boolean);
return ICONS.filter((name) => terms.every((term) => name.includes(term)));
}, [deferredQuery]);
const pageCount = Math.ceil(matches.length / PAGE_SIZE);
const visible = matches.slice(page * PAGE_SIZE, (page + 1) * PAGE_SIZE);
return (
<>
<InputGroup
type="search"
leftIcon="search"
aria-label="Filter icons"
placeholder={`Filter ${ICONS.length} icons, for example "chart" or "arrow up"`}
value={query}
onValueChange={(value) => {
setQuery(value);
setPage(0);
}}
/>
{visible.length === 0 ? (
<NonIdealState icon="search" title="No matching icons" description="Try a shorter or different word." />
) : (
<div style={grid}>
{visible.map((name) => (
<div key={name} style={card}>
<Icon icon={name} size={20} />
<span style={label}>{name}</span>
</div>
))}
</div>
)}
{pageCount > 1 && (
<div style={{ alignItems: "center", display: "flex", gap: 12, justifyContent: "space-between" }}>
<span>
Page {page + 1} of {pageCount}, {matches.length} icons
</span>
<ButtonGroup>
<Button icon="chevron-left" text="Previous" disabled={page === 0} onClick={() => setPage(page - 1)} />
<Button
endIcon="chevron-right"
text="Next"
disabled={page + 1 >= pageCount}
onClick={() => setPage(page + 1)}
/>
</ButtonGroup>
</div>
)}
</>
);
}