Clawscale

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>
      )}
    </>
  );
}