Trash
A waste bin for destructive removal actions.
Klean Icons is a focused family of 98 original SVGs drawn from the actions and objects that repeat across Slipway and Hagfish. Every mark uses the same 24px canvas, calm 1.5px stroke, rounded joins, and optical rhythm.
There is no icon font, runtime package, provider, icon registry in the browser, size prop, color prop, or variant API. Install only the source you use. Then style ordinary SVG with Tailwind or native attributes.
Search by name or intent, then copy exactly the source your app needs.
98 icons
A waste bin for destructive removal actions.
A magnifying glass for search and discovery.
A calendar page for dates and schedules.
A checked circle for successful or completed status.
A crossing mark for close, clear, or cancel actions.
A right-facing chevron for forward navigation.
Two overlapping sheets for copying content.
A person for accounts, profiles, and ownership.
A tabbed folder for projects and grouped files.
A stacked server for infrastructure and deployments.
A bell for notifications and updates.
Klean's balanced launch mark for deploy and release actions.
A right-pointing arrow for forward movement and navigation.
Three measured bars for analytics and performance.
A simple check mark for confirmation and selection.
A downward chevron for disclosure and selection.
A left-facing chevron for previous navigation.
A clock face for time, duration, and schedules.
A folded document with text lines.
A downward transfer arrow landing in a tray.
A precise pencil for editing content.
Three horizontal dots for more actions.
Three vertical dots for more actions.
A closed envelope for email and messages.
An arrow leaving a frame for external destinations.
An open eye for visibility and preview.
A crossed eye for hidden or private content.
A globe for public, international, and web contexts.
A returning clock for history and recent activity.
A framed landscape for images and media.
An information mark inside a circle.
A key for credentials and access.
Two joined links for URLs and relationships.
A closed padlock for security and private state.
Three balanced lines for application navigation.
A plus mark for adding and creating.
Two returning arcs for refresh and retry.
A compact gear for settings and configuration.
Three connected nodes for sharing content.
A checked shield for verified protection.
An exit arrow leaving a doorway.
Two people for teams and shared ownership.
A warning mark inside a balanced triangle.
A left-pointing arrow for return and backward movement.
A barred circle for prohibited and unavailable actions.
A calculator for totals, pricing, and arithmetic.
A calendar page marked unavailable.
A camera for capturing and attaching photographs.
A banknote for cash and monetary amounts.
A rounded conversation bubble for chat.
A compact comment card with text lines.
A payment card for billing and checkout.
A dollar mark in a circle for currency values.
A simple folded document for files and records.
An open envelope for received and read messages.
Four outward corners for expanding a view.
A folded document with an archival PDF mark.
Layered fingerprint ridges for identity verification.
A location pin for places and addresses.
A newspaper layout for editorial content and updates.
Two circular arrows for recurring activity.
A folded paper plane for sending content.
A stop square inside a circle for terminating activity.
Opposing horizontal arrows for exchanging values.
A perforated ticket for credits and admissions.
A person with a plus mark for invitations.
A wallet for balances and stored payment methods.
A crossing mark inside a circle for failure and removal.
A downward arrow for movement and descending actions.
An upward arrow for movement and ascending actions.
A sharp energy bolt for fast and powered actions.
An open book for documentation and guides.
A bookmark ribbon for saved items.
A compact office building for organizations.
An upward chevron for collapse and ascending selection.
A cloud receiving an upload arrow.
Angle brackets for code and source.
An isometric cube for packages and services.
A stacked database cylinder for persistent data.
A folded document with a plus mark.
A narrowing funnel for filtering data.
A heart for favorites and care.
An asymmetric panel grid for dashboards.
A branching list for hierarchy and nested resources.
Two vertical bars for pausing activity.
A pushpin for keeping important resources in reach.
A right-pointing play triangle for starting activity.
A sidebar frame with an inward closing cue.
A sidebar frame with an outward opening cue.
Opposing vertical arrows for sorting order.
Concentric signal rings for online status.
A compact stop square for terminating activity.
A structured grid of table cells.
A price tag for labels and metadata.
A command prompt inside a terminal frame.
An upward transfer arrow leaving a tray.
Text lines with a returning wrap arrow.
An angled wrench for tools and maintenance.
Search is reflected in the page URL, so a filtered catalog can be reloaded, bookmarked, and shared. Framework choice is remembered across the Klean docs.
Install one icon by its lowercase name. The CLI detects Vue, React, or Svelte and writes the matching source into the conventional icons directory:
Run one command from a Boring Stack application. Klean detects the framework and conventional destination, then adds the framework-native source and its direct dependencies.
npx klean-ui add icon trashpnpm dlx klean-ui add icon trashyarn dlx klean-ui add icon trashbunx klean-ui add icon trashInstall several icons in one command when a screen needs a set:
npx klean-ui add icon trash search calendarRe-running add preserves changed local source. Use klean-ui check icon trash, diff icon trash, or update icon trash when you deliberately review upstream changes.
The component is decorative by default. Put its meaning in visible button or link text, or in the accessible name of the semantic parent control.
<script setup>
import Trash from '@/components/ui/icons/Trash.vue'
</script>
<template>
<button
type="button"
class="inline-flex items-center gap-2 rounded-lg bg-red-600 px-3 py-2 text-sm font-semibold text-white"
aria-label="Delete invoice"
>
<Trash class="size-4" />
Delete
</button>
</template>
import Trash from '@/components/ui/icons/Trash.jsx'
export default function DeleteInvoice() {
return (
<button
type="button"
className="inline-flex items-center gap-2 rounded-lg bg-red-600 px-3 py-2 text-sm font-semibold text-white"
aria-label="Delete invoice"
>
<Trash className="size-4" />
Delete
</button>
)
}
<script>
import Trash from '$lib/components/ui/icons/Trash.svelte'
</script>
<button
type="button"
class="inline-flex items-center gap-2 rounded-lg bg-red-600 px-3 py-2 text-sm font-semibold text-white"
aria-label="Delete invoice"
>
<Trash class="size-4" />
Delete
</button>
Icons use 1em for width and height and currentColor for stroke. Text size and color utilities therefore work without a Klean-specific API:
<Search class="size-5 text-blue-600" />
<Bell class="size-4 text-gray-500" stroke-width="1.75" />
<Rocket class="size-8 text-orange-500" />Use size-*, text-*, opacity, responsive, state, and dark-mode utilities directly. Native SVG attributes such as stroke-width, aria-label, and role are forwarded by every framework component.
Do not make every icon louder to create hierarchy. Start with one color and one stroke weight. Let placement, visible text, and the parent control carry most of the meaning.
| Input | Default | Purpose |
|---|---|---|
class / className | — | Ordinary Tailwind sizing, color, opacity, state, responsive, and dark-mode utilities. |
stroke-width / strokeWidth | 1.5 | Native SVG stroke override for a deliberate product treatment. |
| other SVG attributes | native | IDs, data hooks, event handlers, roles, labels, and other framework-native SVG inputs. |
| element reference | — | Framework-native access to the SVG element when genuinely needed. |
| accessible presentation | decorative | Hidden from assistive technology by default; override only for a truly informative mark. |
There is no size, color, tone, variant, label, title, spin, filled, or as prop. CSS and SVG already provide those capabilities without another naming layer.
Prefer visible text. In a button that says “Delete”, Trash is decorative and should stay hidden from assistive technology. For an icon-only control, name the button—not the SVG:
<button type="button" aria-label="Delete invoice">
<Trash class="size-5" />
</button>Only make the SVG itself informative when it stands alone and no semantic parent can own its name:
<CheckCircle
class="size-5 text-emerald-600"
role="img"
aria-hidden="false"
aria-label="Payment complete"
/>An icon is interface source, not an opaque service. Installing the exact Vue, React, or Svelte component means an application can inspect it, change geometry when its product genuinely needs to, and keep rendering without a Klean runtime.
The shared 24px geometry keeps Slipway and Hagfish recognizable as part of the same ecosystem. currentColor, native attributes, and caller-owned classes let each product retain its own density, palette, contrast, and motion without forking an icon library API.
Updates are deliberate. Klean never silently replaces local geometry. The CLI shows whether an installed icon differs, and the application chooses when to inspect and accept a new source version.
Use the concrete object or action: Trash, Search, Calendar, Copy. Do not encode placement, product, color, or size into the exported name. The same Bell can appear in a header, notification preference, or activity feed without becoming three components.
The CLI uses lowercase kebab-case names while framework exports use PascalCase:
npx klean-ui add icon check-circle chevron-rightimport CheckCircle from '@/components/ui/icons/CheckCircle.vue'
import ChevronRight from '@/components/ui/icons/ChevronRight.vue'Use Klean Icons for repeated application actions, navigation, statuses, dates, identity, infrastructure, notifications, and deployment language. Use the shared source when consistency is more valuable than a product-specific illustration.