home / skills / toilahuongg / shopify-agents-kit / shopify-polaris-icons

shopify-polaris-icons skill

/.claude/skills/shopify-polaris-icons

This skill helps you implement and style Shopify Polaris Icons correctly across apps, with accessibility, tone, and consistency guidance.

npx playbooks add skill toilahuongg/shopify-agents-kit --skill shopify-polaris-icons

Review the files below or copy the command above to add this skill to your agents.

Files (3)
SKILL.md
8.2 KB
---
name: shopify-polaris-icons
description: Guide for using Shopify Polaris Icons in Shopify Apps. Covers icon usage patterns, accessibility, tone variants, and common icon categories for commerce applications.
---

# Shopify Polaris Icons Skill

Polaris Icons is Shopify's official icon library with **400+ carefully designed icons** focused on commerce and entrepreneurship. These icons are designed to work seamlessly with the Polaris Design System.

## Installation

```bash
npm install @shopify/polaris-icons
# or
yarn add @shopify/polaris-icons
```

> [!NOTE]
> The `@shopify/polaris-icons` package is typically installed alongside `@shopify/polaris`. If you're using Polaris, you likely already have access to these icons.

## Basic Usage

### With Polaris Icon Component (Recommended)

```jsx
import { Icon } from '@shopify/polaris';
import { PlusCircleIcon } from '@shopify/polaris-icons';

function MyComponent() {
  return <Icon source={PlusCircleIcon} />;
}
```

### With Accessibility Label

When an icon appears without accompanying text, **always** provide an accessibility label:

```jsx
import { Icon } from '@shopify/polaris';
import { DeleteIcon } from '@shopify/polaris-icons';

function DeleteButton() {
  return (
    <button>
      <Icon source={DeleteIcon} accessibilityLabel="Delete item" />
    </button>
  );
}
```

### Icon Tones

Use the `tone` prop to set the icon color semantically:

```jsx
import { Icon } from '@shopify/polaris';
import { AlertCircleIcon, CheckCircleIcon, InfoIcon } from '@shopify/polaris-icons';

// Available tones
<Icon source={CheckCircleIcon} tone="success" />    // Green - positive actions
<Icon source={AlertCircleIcon} tone="critical" />   // Red - errors, destructive
<Icon source={AlertCircleIcon} tone="warning" />    // Yellow - warnings
<Icon source={AlertCircleIcon} tone="caution" />    // Orange - caution
<Icon source={InfoIcon} tone="info" />              // Blue - information
<Icon source={InfoIcon} tone="base" />              // Default text color
<Icon source={InfoIcon} tone="subdued" />           // Muted/secondary
<Icon source={InfoIcon} tone="interactive" />       // Link/action color
<Icon source={InfoIcon} tone="inherit" />           // Inherit from parent
<Icon source={InfoIcon} tone="magic" />             // AI/Magic features
<Icon source={InfoIcon} tone="emphasis" />          // Emphasized content
<Icon source={InfoIcon} tone="primary" />           // Primary brand color
```

## Icon Naming Convention

All icons follow a consistent naming pattern: `{Name}Icon`

```jsx
// Examples
import {
  HomeIcon,           // Navigation
  ProductIcon,        // Commerce
  OrderIcon,          // Orders
  CustomerIcon,       // Customers
  SettingsIcon,       // Settings
  PlusIcon,           // Actions
  EditIcon,           // Actions
  DeleteIcon,         // Actions
  SearchIcon,         // Search
  FilterIcon,         // Filtering
} from '@shopify/polaris-icons';
```

## Common Icon Categories

### Navigation & Layout
```jsx
import {
  HomeIcon,
  MenuIcon,
  ChevronLeftIcon,
  ChevronRightIcon,
  ChevronUpIcon,
  ChevronDownIcon,
  ArrowLeftIcon,
  ArrowRightIcon,
  ExternalIcon,
  MaximizeIcon,
  MinimizeIcon,
} from '@shopify/polaris-icons';
```

### Commerce & Products
```jsx
import {
  ProductIcon,
  CollectionIcon,
  InventoryIcon,
  PriceTagIcon,          // Renamed from TagIcon
  GiftCardIcon,
  DiscountIcon,
  CartIcon,
  CartAbandonedIcon,
  StorefrontIcon,
} from '@shopify/polaris-icons';
```

### Orders & Fulfillment
```jsx
import {
  OrderIcon,
  OrderDraftIcon,
  OrderFulfilledIcon,
  DeliveryIcon,
  ShippingLabelIcon,
  PackageIcon,
  ReturnIcon,
  RefundIcon,
} from '@shopify/polaris-icons';
```

### Customers & Users
```jsx
import {
  CustomerIcon,
  CustomerPlusIcon,
  PersonIcon,
  PersonAddIcon,
  TeamIcon,
  ProfileIcon,
} from '@shopify/polaris-icons';
```

### Actions
```jsx
import {
  PlusIcon,
  PlusCircleIcon,
  MinusIcon,
  MinusCircleIcon,
  EditIcon,
  DeleteIcon,
  DuplicateIcon,
  ArchiveIcon,
  SaveIcon,
  UndoIcon,
  RedoIcon,
  RefreshIcon,
  ImportIcon,
  ExportIcon,
  UploadIcon,
  DownloadIcon,
} from '@shopify/polaris-icons';
```

### Status & Feedback
```jsx
import {
  CheckIcon,
  CheckCircleIcon,
  XIcon,
  XCircleIcon,
  AlertCircleIcon,
  AlertTriangleIcon,
  InfoIcon,
  QuestionCircleIcon,
  ClockIcon,
  CalendarIcon,
} from '@shopify/polaris-icons';
```

### Communication
```jsx
import {
  EmailIcon,
  ChatIcon,
  NotificationIcon,
  BellIcon,
  PhoneIcon,
  SendIcon,
  NoteIcon,
} from '@shopify/polaris-icons';
```

### Settings & Tools
```jsx
import {
  SettingsIcon,
  ToolsIcon,
  KeyIcon,
  LockIcon,
  UnlockIcon,
  EyeIcon,
  HideIcon,
  FilterIcon,
  SortIcon,
  SearchIcon,
  CodeIcon,
  ApiIcon,
} from '@shopify/polaris-icons';
```

### Analytics & Reports
```jsx
import {
  AnalyticsIcon,
  ChartVerticalIcon,
  ChartHorizontalIcon,
  ReportIcon,
  TrendingUpIcon,
  TrendingDownIcon,
} from '@shopify/polaris-icons';
```

### Media
```jsx
import {
  ImageIcon,
  ImageAltIcon,
  VideoIcon,
  FileIcon,
  FolderIcon,
  AttachmentIcon,
  LinkIcon,
} from '@shopify/polaris-icons';
```

### AI & Magic (Shopify Magic)
```jsx
import {
  MagicIcon,
  SparklesIcon,        // AI-generated content
  WandIcon,
} from '@shopify/polaris-icons';
```

## Usage in Polaris Components

### Button with Icon

```jsx
import { Button } from '@shopify/polaris';
import { PlusIcon, DeleteIcon } from '@shopify/polaris-icons';

// Icon before text
<Button icon={PlusIcon}>Add product</Button>

// Destructive action
<Button icon={DeleteIcon} variant="primary" tone="critical">
  Delete
</Button>

// Icon-only button (requires accessibilityLabel)
<Button icon={EditIcon} accessibilityLabel="Edit product" />
```

### TextField with Icon

```jsx
import { TextField } from '@shopify/polaris';
import { SearchIcon } from '@shopify/polaris-icons';

<TextField
  label="Search"
  prefix={<Icon source={SearchIcon} />}
  placeholder="Search products..."
/>
```

### Banner with Icon

```jsx
import { Banner, Icon } from '@shopify/polaris';
import { AlertCircleIcon } from '@shopify/polaris-icons';

<Banner
  title="Warning"
  tone="warning"
  icon={AlertCircleIcon}
>
  Please review your settings.
</Banner>
```

### Navigation Item

```jsx
import { Navigation } from '@shopify/polaris';
import { HomeIcon, OrderIcon, ProductIcon } from '@shopify/polaris-icons';

<Navigation location="/">
  <Navigation.Section
    items={[
      { label: 'Home', icon: HomeIcon, url: '/' },
      { label: 'Orders', icon: OrderIcon, url: '/orders' },
      { label: 'Products', icon: ProductIcon, url: '/products' },
    ]}
  />
</Navigation>
```

## Accessibility Best Practices

1. **Decorative Icons**: When an icon accompanies text that already describes the action, the icon is decorative and doesn't need a label:
   ```jsx
   <Button icon={PlusIcon}>Add product</Button>
   // No accessibilityLabel needed - "Add product" describes the action
   ```

2. **Standalone Icons**: When an icon appears without text, always provide an `accessibilityLabel`:
   ```jsx
   <Button icon={EditIcon} accessibilityLabel="Edit product" />
   ```

3. **Status Icons**: For icons that convey important status information:
   ```jsx
   <Icon source={CheckCircleIcon} tone="success" accessibilityLabel="Completed" />
   ```

## Anti-Patterns to Avoid

- **DO NOT** use icons without context. Pair with text or provide accessibility labels.
- **DO NOT** use non-Polaris icons in a Polaris app. This breaks visual consistency.
- **DO NOT** manually set icon colors with CSS. Use the `tone` prop instead.
- **DO NOT** resize icons using CSS. Polaris icons are designed for a 20x20 viewport.
- **DO NOT** use icons for decoration only. Each icon should have semantic meaning.

## References

- [Icon Categories](./references/icon-categories.md) - Complete categorized list of all Polaris icons
- [Migration Guide](./references/migration-guide.md) - Guide for migrating from older icon versions

## External Resources

- [Polaris Icons Browser](https://polaris.shopify.com/icons) - Search and browse all icons
- [Icon Component Docs](https://polaris.shopify.com/components/images-and-icons/icon) - Official component documentation
- [NPM Package](https://www.npmjs.com/package/@shopify/polaris-icons) - Package information and changelog

Overview

This skill guides developers on using Shopify Polaris Icons in Shopify apps. It explains installation, common patterns, accessibility rules, tone variants, and which icons fit typical commerce scenarios. The content focuses on practical usage with Polaris components and avoids visual inconsistencies.

How this skill works

Polaris Icons is a packaged set of 400+ SVG icons exported as {Name}Icon modules that integrate with the Polaris Icon and other components. You install the package, import the icons you need, and supply them as the source to Icon, Button, Navigation, Banner, and form components. Use the tone prop for semantic color and accessibilityLabel when icons appear without text.

When to use it

  • Add icons to buttons, navigation, and banners to improve scannability and reduce cognitive load.
  • Use tone variants (success, critical, warning, info, interactive, magic, etc.) to communicate status and intent.
  • Provide accessibilityLabel for icon-only controls and status indicators.
  • Keep icons limited to Polaris in Polaris apps to preserve visual consistency.
  • Prefer icons alongside text unless the meaning is obvious and labeled for assistive tech.

Best practices

  • Install @shopify/polaris-icons alongside Polaris and import only the icons you use to keep bundle size small.
  • Treat icons that accompany descriptive text as decorative; omit accessibilityLabel in those cases.
  • Always add accessibilityLabel for standalone icon buttons and status-only icons.
  • Use the tone prop instead of custom CSS colors to match Polaris semantics and theming.
  • Keep icon sizing to the intended 20x20 viewport—avoid manual resizing with CSS.

Example use cases

  • Primary actions: Button with icon (e.g., Add product) using PlusIcon before text.
  • Navigation: Navigation.Section items using HomeIcon, OrderIcon, ProductIcon for clear routes.
  • Status banners: Banner with AlertCircleIcon and tone="warning" to call out issues.
  • Form fields: TextField with a SearchIcon prefix for product search inputs.
  • Icon-only controls: Edit or Delete icon buttons with accessibilityLabel for screen readers.

FAQ

Do I need accessibility labels for every icon?

No. If an icon is paired with descriptive text, it is decorative and does not need an accessibilityLabel. For icon-only controls and status indicators, always provide accessibilityLabel.

Can I style icons with custom CSS colors?

Avoid custom CSS for icon colors. Use the Icon component's tone prop to apply semantic colors and maintain design consistency.