Compare commits

..
Author SHA1 Message Date
Eric Fennis 917d2ca847 Merge branch 'main' of https://github.com/lucide-icons/lucide into add-extra-checks 2026-08-07 13:04:12 +02:00
Eric Fennis dd4da98c1f Update sha 2026-08-07 10:42:33 +02:00
Eric Fennis cceab3d776 Merge branch 'main' of https://github.com/lucide-icons/lucide into ci-hardening 2026-08-07 09:53:25 +02:00
Thibaud-Vdb 6b9e93615c ci: don't restore the pnpm cache in the release-creating job
The create-release job restored the shared pnpm store through
setup-node before computing and tagging the new version. Actions
caches can be written by other workflow runs, so the job that cuts
releases should install from the registry instead; the frozen
lockfile still pins and verifies every dependency, and this job runs
only a few times a day at most.
2026-08-05 11:07:03 +02:00
Thibaud-Vdb 79d4dd48a7 ci: declare least-privilege workflow permissions
Jobs without a permissions block inherit the repository default token
scope. Scopes are derived from what each workflow actually does with
the token:

- the fourteen package build and test workflows plus the code linter
  never write through the token, they drop to contents: read.
- lint-pr-title.yml gets pull-requests: read, which is what the
  semantic PR title action documents needing.
- comment-icon-preview.yml runs on workflow_run, a privileged trigger
  processing artifacts produced by fork PRs, so an exact scope matters
  most there: actions: read to download the artifact, issues: write
  plus pull-requests: write to post the preview comment, contents:
  read for the rest.

The workflows that already declared scoped permissions (labeler,
stale, linting-icons, release and friends) are untouched.
2026-08-05 11:06:37 +02:00
Thibaud-Vdb 8298424ae0 ci: pass only the secret the release workflow needs
Both reusable calls to release.yml used 'secrets: inherit', which
forwards the caller's entire secret set. The only secret release.yml
reads is BLOB_READ_WRITE_TOKEN, used by the build-font job to upload
the code points blob; npm publishing is OIDC trusted publishing and
needs no token secret at all. Declare that one secret on the reusable
workflow and pass it explicitly, so the workflow files show exactly
which secret flows into the release path and nothing else does. It is
declared optional, so tag-push runs (which read it from the repo
secrets directly) and forks without the secret behave as before.
2026-08-05 11:05:42 +02:00
Thibaud-Vdb 7c8f38774b ci: pin actions to commit SHAs
Version tags are movable pointers: whoever controls an action's repo
can re-point them, and the previous commit's CVE is the proof it
happens in practice, to this very repository's dependency set. These
workflows hold real credentials: release.yml publishes the whole
lucide npm family with OIDC trusted publishing, ci.yml creates the
GitHub releases, and the comment and review workflows carry
pull-request write tokens.

Pinning by full commit SHA makes the reviewed code the code that runs.
Every pin keeps a version comment, resolved from the upstream repo and
cross-checked against its release tag (softprops v1 has no patch tag,
the comment names the floating tag it replaced). Dependabot understands
SHA pins and keeps bumping them with the comment in sync; the repo has
no dependabot.yml yet, adding one with the github-actions ecosystem is
a one-block follow-up.
2026-08-05 11:05:00 +02:00
Thibaud-Vdb 237ab7fa68 ci: move changed-files off the CVE-2025-30066 affected v41
request-review.yml still referenced tj-actions/changed-files@v41, the
action and version range hit by the March 2025 supply chain compromise
(GHSA-mrrh-fwg8-r2c3): the attacker re-pointed existing version tags at
code that dumped the runner's memory, including the job's GITHUB_TOKEN,
into the public build logs.

Bump to v46.0.5, pinned by commit SHA so the ref cannot be re-pointed
again; the two other call sites already on v46 get the same pin in the
next commit. The action's file-matching API is unchanged between v41
and v46 for the patterns used here.
2026-08-05 11:04:21 +02:00
246 changed files with 1924 additions and 8599 deletions
+11
View File
@@ -0,0 +1,11 @@
dist
build
coverage
lib
tests
node_modules
.eslintrc.js
docs/images
docs/**/examples/
packages/lucide-react/dynamicIconImports.js
packages/angular/.angular
+75
View File
@@ -0,0 +1,75 @@
const DEFAULT_ATTRS = require('./tools/build-icons/render/default-attrs.json');
module.exports = {
root: true,
env: {
browser: true,
node: true,
},
extends: ['airbnb-base', 'prettier'],
plugins: ['import', '@html-eslint'],
rules: {
'no-console': 'off',
'no-param-reassign': 'off',
'no-shadow': 'off',
'no-use-before-define': 'off',
'import/no-extraneous-dependencies': [
'error',
{
devDependencies: ['**/*.test.js', '**/*.spec.js', '**/scripts/**'],
},
],
'import/extensions': [
'error',
{
pattern: {
mjs: 'always',
json: 'always',
},
},
],
},
parserOptions: {
tsconfigRootDir: __dirname,
project: ['./docs/tsconfig.json', './packages/*/tsconfig.json'],
ecmaVersion: 'latest',
sourceType: 'module',
},
overrides: [
{
files: ['./icons/*.svg'],
parser: '@html-eslint/parser',
rules: {
'@html-eslint/require-doctype': 'off',
'@html-eslint/no-duplicate-attrs': 'error',
'@html-eslint/no-inline-styles': 'error',
'@html-eslint/require-attrs': [
'error',
...Object.entries(DEFAULT_ATTRS).map(([attr, value]) => ({
tag: 'svg',
attr,
value: String(value),
})),
],
'@html-eslint/indent': ['error', 2],
'@html-eslint/no-multiple-empty-lines': ['error', { max: 0 }],
'@html-eslint/no-extra-spacing-attrs': [
'error',
{
enforceBeforeSelfClose: true,
},
],
'@html-eslint/require-closing-tags': [
'error',
{
selfClosing: 'always',
allowSelfClosingCustom: true,
},
],
'@html-eslint/element-newline': 'error',
'@html-eslint/no-trailing-spaces': 'error',
'@html-eslint/quotes': 'error',
},
},
],
};
@@ -1,49 +0,0 @@
title: 'Icon Request: '
body:
- type: markdown
attributes:
value: |
Before submitting an icon request check if it has already been requested. If there is an open request, please add a 👍.
> [!CAUTION]
> New brand logos are **not** allowed, see our official statement: https://github.com/lucide-icons/lucide/blob/main/BRAND_LOGOS_STATEMENT.md.
>
> Existing brand icons have been phased out. Consider using https://simpleicons.org, which offers purpose-built SVGs that are also on a 24×24px grid.
- type: input
id: name
attributes:
label: Icon name
description: What should this icon depict? For multiple icons, provide a comma-separated list.
validations:
required: true
- type: textarea
id: use-cases
attributes:
label: Use cases
description: Why do you need this icon? Include at least two real-life use cases per requested icon, avoiding generic descriptions like "it's a car icon".
placeholder: e.g. I need a star icon to use in my rating system.
validations:
required: true
- type: textarea
id: design-ideas
attributes:
label: Design ideas
description: What should this icon look like? Provide simple, minimalistic icon examples from other sets or your own drafts to help us visualize your request.
validations:
required: true
- type: checkboxes
id: checklist
attributes:
label: Checklist
description: Please review the following checklist before submitting your request.
options:
- label: I have searched if someone has submitted a similar request before and there weren't any.
required: true
- label: I have searched existing icons to make sure it does not already exist and I didn't find any.
required: true
- label: I am not requesting a brand logo and the art is not protected by copyright, see more at https://github.com/lucide-icons/lucide/blob/main/BRAND_LOGOS_STATEMENT.md
required: true
- label: I am not requesting an icon that includes religious, war/violence related, political imagery or hate symbols.
required: true
- label: I have provided appropriate use cases for the icon(s) requested.
required: true
+1 -3
View File
@@ -78,10 +78,8 @@ updates:
- 'vite-plugin-*'
linting-deps:
patterns:
- '@eslint/*'
- '@html-eslint/*'
- '@typescript-eslint/*'
- 'angular-eslint'
- 'cspell'
- 'eslint'
- 'eslint-*'
@@ -99,7 +97,7 @@ updates:
- package-ecosystem: github-actions
directory: /
schedule:
interval: monthly
interval: weekly
groups:
github-actions:
patterns:
+1 -55
View File
@@ -15,60 +15,6 @@ The `tags` property is an array of strings that describe the icon and can be use
Validate the tags against the `icon.schema.json` to ensure they are correctly formatted and adhere to the defined structure.
Provide tag suggestions based on the name of the icon and the use cases provided in the PR description. Use the existing tags in the repository as a reference for consistency and to avoid duplicates. Don't suggest words like: 'icon' and preferably use single words. Tags should always be in lowercase, and may also contain spaces (e.g. `magnifying glass`). The name of icon should not be included in the tags, as it is already specified.
## Categories
# Categories
The `categories` property is an array of strings that specify the categories to which the icon belongs, such as "devices", "interface", "media", etc. See the `categories` property in the `icon.schema.json` for more details on the allowed values. The categories should be chosen based on the use cases provided in the PR description and the existing categories in the repository. The categories should be relevant to the icon and should help users find the icon when searching for specific types of icons. The name of icon should not be included in the categories, as it is already specified. Suggest categories based on the name of the icon and the use cases provided in the PR description. Use the existing categories in the repository as a reference for consistency and to avoid duplicates. Categories should always be in lowercase and should not contain spaces.
## Use Cases
The `use-cases` property is an array of strings that describe the specific scenarios in which the icon would be used. Each use case should be concise and clearly convey the context in which the icon is applicable. Use the existing use cases in the repository as a reference for consistency and to avoid duplicates.
### Writing icon use-cases
A use-case tells a reader **where and why an icon would be used in a real interface**. Each entry should let someone who has never seen the icon understand what it's for.
### Format
- Write each use-case as a short phrase, not a sentence. Start with a present participle verb: *Representing…*, *Indicating…*, *Marking…*, *Showing…*, *Confirming…*, *Toggling…*, *Categorizing…*, *Searching…*.
- Keep it to roughly 4–12 words. One clear idea per entry.
- No trailing period. No leading bullet, number, or dash (the surrounding format supplies that).
- Give each icon 1–4 use-cases, ordered most-common first. Prefer fewer strong entries over many weak or repetitive ones.
### Voice
- Write from the interface's perspective, describing the function: "Indicating a low battery charge level" — not the requester's story ("I need an icon that shows…").
- Name the concrete context where useful: *in smart home apps*, *in navigation apps*, *in text editors*, *on maps*. Context is what makes a use-case self-explanatory.
- Be neutral and factual. No first person, no marketing adjectives ("perfect for", "ideal", "beautiful"), no emoji.
### What to exclude
- **The requester's personal narrative.** "I'm building a SvelteKit UI and need…" → drop the framing, keep the function.
- **References to other issues, PRs, or icons by ID.** No "As provided in #1865", "complementary to git-branch-plus", "same as above", "see #2055".
- **Design/implementation chatter.** Bezier offsets, grid alignment, path cuts, "the icon works perfectly" — none of that is a use-case.
- **Restating the icon's name.** For `microchip`, "microchip" is not a use-case; describe what it represents ("Representing processors, chips, or embedded hardware").
- **Links, image tags, emoji, and markdown artifacts.**
- **Meta-commentary.** "Self-explanatory", "lots and lots of use cases", "obvious :)".
### Cross-contamination
When a request covers several icons at once, assign each use-case only to the icon it actually describes. A bullet prefixed with another icon's name belongs to that icon, not this one. Don't let `briefcase-medical`'s meanings leak into `briefcase-business`.
### Variants
Related icons should get **variant-specific** wording, not one shared blurb. `battery-low` → "Indicating a low battery charge level"; `battery-full` → "…full…". `square-arrow-right-enter` → sign in / join; `-exit` → sign out / export. Resist copying the same line across a family.
## Examples
Good:
- `ambulance` → "Directing users to nearby emergency services in navigation apps"
- `calendar-sync` → "Representing recurring events, promotions, or limited-time offers"
- `globe-x` → "Indicating a device or application is offline or unreachable"
- `heading-2` → "Applying a level-2 heading in text editors"
Poor → fixed:
- ~~"I need a firewall icon :-)"~~ → "Representing firewalls and firewall rules on cybersecurity platforms"
- ~~"As above"~~ → "Signifying a deal, agreement, or partnership"
- ~~"microchip"~~ → "Representing processors, chips, or embedded hardware"
- ~~"Same use cases as the other currency symbols, except Turkish lira"~~ → "Displaying prices or amounts in Turkish lira"
+4 -2
View File
@@ -69,7 +69,9 @@ jobs:
- uses: pnpm/action-setup@0977fd99725f1db4007ccb2928dbb4e90d06cc86 # v6.0.10
- uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0
with:
cache: 'pnpm'
# No cache restore here: this job cuts the release, and caches
# are writable from other workflow runs. The lockfile still
# guards the install.
node-version-file: 'package.json'
- name: Install dependencies
@@ -102,7 +104,7 @@ jobs:
echo '${{ steps.change-log.outputs.CHANGE_LOG }}'
- name: Create Release
uses: softprops/action-gh-release@efb35369e0ad2afab669f228072c1b0d510eae64 # v3.0.3
uses: softprops/action-gh-release@3d0d9888cb7fd7b750713d6e236d1fcb99157228 # v3.0.2
with:
tag_name: ${{ steps.new-version.outputs.NEW_VERSION }}
name: Version ${{ steps.new-version.outputs.NEW_VERSION }}
@@ -3,8 +3,6 @@ name: Close Icon Requests with Brand Terms
on:
issues:
types: [opened]
discussion:
types: [created]
permissions: {}
@@ -18,13 +16,12 @@ jobs:
permissions:
contents: read
issues: write
discussions: write
steps:
- name: Checkout repository
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
- name: Load stopwords from JSON & check issue title & body
if: github.event_name == 'issues' && contains(github.event.issue.labels.*.name, '🙌 icon request')
if: contains(github.event.issue.labels.*.name, '🙌 icon request')
run: |
ISSUE_TITLE=$(jq -r '.issue.title' "$GITHUB_EVENT_PATH")
ISSUE_BODY=$(jq -r '.issue.body // ""' "$GITHUB_EVENT_PATH")
@@ -37,8 +34,6 @@ jobs:
if echo "$ISSUE_TITLE" | grep -iqE "$SAFE_KEY|$SAFE_VALUE" || \
{ [ -n "$ICON_NAME_SECTION" ] && echo "$ICON_NAME_SECTION" | grep -iqE "$SAFE_KEY|$SAFE_VALUE"; }; then
URL_ENCODED_VALUE=$(jq -rn --arg val "$VALUE" '$val|@uri')
gh issue close ${{ github.event.issue.number }} \
--reason "not planned" \
--comment "It looks like this request is about **${VALUE}**, which is a brand logo.
@@ -47,7 +42,7 @@ jobs:
[Click here to read our official statement about brand logos in Lucide.](https://github.com/lucide-icons/lucide/blob/main/BRAND_LOGOS_STATEMENT.md)
You can [search for similar issues.](https://github.com/lucide-icons/lucide/issues?q=is%3Aissue+${URL_ENCODED_VALUE})
You can [search for similar issues.](https://github.com/lucide-icons/lucide/issues?q=is%3Aissue+${VALUE})
We’re always happy to help on [Discord](https://discord.gg/EH6nSts)."
@@ -55,56 +50,3 @@ jobs:
exit 0
fi
done
- name: Load stopwords from JSON & check discussion title & body
if: github.event_name == 'discussion' && github.event.discussion.category.slug == 'icon-design'
run: |
DISCUSSION_TITLE=$(jq -r '.discussion.title' "$GITHUB_EVENT_PATH")
DISCUSSION_BODY=$(jq -r '.discussion.body // ""' "$GITHUB_EVENT_PATH")
ICON_NAME_SECTION=$(printf '%s\n' "$DISCUSSION_BODY" | awk '/### Icon name/{flag=1; next} /^### /{flag=0} flag')
jq -r 'to_entries[] | "\(.key) \(.value)"' brand-stopwords.json | while read -r KEY VALUE; do
SAFE_KEY=$(printf '%s\n' "$KEY" | sed 's/[][\.^$*]/\\&/g')
SAFE_VALUE=$(printf '%s\n' "$VALUE" | sed 's/[][\.^$*]/\\&/g')
if echo "$DISCUSSION_TITLE" | grep -iqE "$SAFE_KEY|$SAFE_VALUE" || \
{ [ -n "$ICON_NAME_SECTION" ] && echo "$ICON_NAME_SECTION" | grep -iqE "$SAFE_KEY|$SAFE_VALUE"; }; then
URL_ENCODED_VALUE=$(jq -rn --arg val "$VALUE" '$val|@uri')
DISCUSSION_NODE_ID=$(jq -r '.discussion.node_id' "$GITHUB_EVENT_PATH")
COMMENT_BODY="It looks like this request is about **${VALUE}**, which is a brand logo.
Lucide **does not accept** brand logos, and we do not plan to add them in the future. This is due to a combination of **legal restrictions**, **design consistency concerns**, and **practical maintenance reasons**.
[Click here to read our official statement about brand logos in Lucide.](https://github.com/lucide-icons/lucide/blob/main/BRAND_LOGOS_STATEMENT.md)
You can [search for similar discussions.](https://github.com/lucide-icons/lucide/discussions/categories/icon-design?discussions_q=category%253A%22Icon+design%22+${URL_ENCODED_VALUE})
We’re always happy to help on [Discord](https://discord.gg/EH6nSts)."
# Add comment to discussion
gh api graphql -f query='
mutation($discussionId: ID!, $body: String!) {
addDiscussionComment(input: {discussionId: $discussionId, body: $body}) {
comment { id }
}
}' -f discussionId="$DISCUSSION_NODE_ID" -f body="$COMMENT_BODY"
# Close discussion
gh api graphql -f query='
mutation($discussionId: ID!) {
closeDiscussion(input: {discussionId: $discussionId}) {
discussion { closed }
}
}' -f discussionId="$DISCUSSION_NODE_ID"
# Lock discussion
gh api graphql -f query='
mutation($lockableId: ID!, $reason: LockReason) {
lockLockable(input: {lockableId: $lockableId, lockReason: $reason}) {
lockedRecord { locked }
}
}' -f lockableId="$DISCUSSION_NODE_ID" -f reason="SPAM"
exit 0
fi
done
+16
View File
@@ -22,3 +22,19 @@ jobs:
- name: Run Linter
run: pnpm lint
lint-actions:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
- name: Verify actions are pinned to commit SHAs
run: |
unpinned=$(grep -rnE "^[[:space:]]*(-[[:space:]]+)?uses:" .github/workflows/ \
| grep -vE "uses:[[:space:]]*['\"]?\./" \
| grep -vE "uses:[[:space:]]*['\"]?[^@]+@[0-9a-f]{40}([[:space:]]|$|#)" || true)
if [ -n "$unpinned" ]; then
echo "::error::GitHub Actions must be pinned to a full commit SHA, not a version tag."
echo "$unpinned"
exit 1
fi
@@ -1,82 +0,0 @@
name: Pull request missing issue
on:
pull_request_target:
types:
- opened
- edited
- synchronize
- ready_for_review
paths:
- 'icons/*.svg'
permissions: {}
# Two events landing close together (a push right after opening) would
# otherwise both find no existing comment and post one each.
concurrency:
group: missing-issue-${{ github.event.number }}
cancel-in-progress: true
jobs:
pull-request-missing-issue:
name: Pull Request Missing Issue
if: github.repository == 'lucide-icons/lucide' && github.event.pull_request.draft == false
runs-on: ubuntu-latest
permissions:
contents: read
pull-requests: write # Required to post and update the comment on the pull request
steps:
# We checkout the main branch of main repository for security reasons.
# The script never runs code from the pull request, it only reads the
# pull request's icons through the GitHub API.
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
repository: lucide-icons/lucide
- uses: pnpm/action-setup@0977fd99725f1db4007ccb2928dbb4e90d06cc86 # v6.0.10
- uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0
with:
cache: 'pnpm'
node-version-file: 'package.json'
- name: Install dependencies
run: pnpm install --frozen-lockfile
- name: Generate comment markup
id: markup
run: node ./scripts/generateMissingIssueComment.mts
env:
PULL_REQUEST_NUMBER: ${{ github.event.number }}
COMMIT_SHA: ${{ github.event.pull_request.head.sha }}
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Find comment
uses: peter-evans/find-comment@b30e6a3c0ed37e7c023ccd3f1db5c6c0b0c23aad # v4.0.0
id: pr-comment
with:
issue-number: ${{ github.event.number }}
comment-author: 'github-actions[bot]'
body-includes: lucide-missing-issue-comment
- name: Post missing issue comment
if: steps.markup.outputs.action == 'nag'
uses: peter-evans/create-or-update-comment@e8674b075228eee787fea43ef493e45ece1004c9 # v5.0.0
with:
comment-id: ${{ steps.pr-comment.outputs.comment-id }}
issue-number: ${{ github.event.number }}
body-path: missing-issue-comment.md
edit-mode: replace
# Linking an issue from the pull request's Development sidebar fires no
# event, so the comment resolves on the next edit or push instead.
- name: Resolve missing issue comment
if: steps.markup.outputs.action == 'resolve' && steps.pr-comment.outputs.comment-id != ''
uses: peter-evans/create-or-update-comment@e8674b075228eee787fea43ef493e45ece1004c9 # v5.0.0
with:
comment-id: ${{ steps.pr-comment.outputs.comment-id }}
issue-number: ${{ github.event.number }}
body: |
<!-- lucide-missing-issue-comment -->
Thanks for linking an issue for this icon design! ✅
edit-mode: replace
+5 -2
View File
@@ -15,6 +15,10 @@ on:
description: NPM tag
default: 'latest'
type: string
secrets:
BLOB_READ_WRITE_TOKEN:
description: Token used by build-font to upload the code points blob
required: false
permissions: {}
@@ -95,7 +99,6 @@ jobs:
with:
name: lucide-font
path: lucide-font
- uses: pnpm/action-setup@0977fd99725f1db4007ccb2928dbb4e90d06cc86 # v6.0.10
- uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0
with:
@@ -169,7 +172,7 @@ jobs:
zip -r lucide-icons-${{ needs.prepare.outputs.VERSION }}.zip icons
- name: Release zip and fonts
uses: softprops/action-gh-release@efb35369e0ad2afab669f228072c1b0d510eae64 # v3.0.3
uses: softprops/action-gh-release@3d0d9888cb7fd7b750713d6e236d1fcb99157228 # v3.0.2
with:
tag_name: ${{ needs.prepare.outputs.VERSION }}
+1 -1
View File
@@ -1,5 +1,5 @@
{
"cSpell.words": ["devs", "linecap", "linejoin", "preact", "Preact"],
"cSpell.words": ["devs", "preact", "Preact"],
"eslint.enable": true,
"eslint.validate": ["javascript", "svg"],
"svg.preview.background": "editor"
+1 -1
View File
@@ -1,5 +1,5 @@
{
"$schema": "../category.schema.json",
"title": "Emoji",
"icon": "face-slightly-smiling"
"icon": "smile"
}
+1 -1
View File
@@ -1,4 +1,4 @@
import React from 'react';
import React, { Fragment } from 'react';
interface BackdropProps {
src: string;
@@ -3,6 +3,7 @@ import pathToPoints from './path-to-points';
import { Path, PathProps } from './types';
export const GapViolationHighlight = ({
radius,
stroke,
strokeWidth,
strokeOpacity,
+4 -4
View File
@@ -1,4 +1,4 @@
import React from 'react';
import React, { Fragment } from 'react';
import { PathProps, Path } from './types';
import getPaths, { assert } from './utils';
import { GapViolationHighlight } from './GapViolationHighlight.tsx';
@@ -293,7 +293,7 @@ const Radii = ({
...props
}: { paths: Path[] } & PathProps<
'strokeWidth' | 'stroke' | 'strokeDasharray' | 'strokeOpacity',
never
any
>) => {
return (
<g
@@ -361,12 +361,12 @@ const Radii = ({
const Handles = ({
paths,
...props
}: { paths: Path[] } & PathProps<'strokeWidth' | 'stroke' | 'strokeOpacity', never>) => (
}: { paths: Path[] } & PathProps<'strokeWidth' | 'stroke' | 'strokeOpacity', any>) => (
<g
className="svg-preview-handles-group"
{...props}
>
{paths.map(({ prev, next, cp1, cp2 }, i) => (
{paths.map(({ c, prev, next, cp1, cp2 }, i) => (
<React.Fragment key={i}>
{cp1 && <path d={`M${prev.x} ${prev.y} ${cp1.x} ${cp1.y}`} />}
{cp1 && (
@@ -12,9 +12,7 @@ function pathToPoints({ d, prev, next }: Path, interval = 1) {
points.push(commander.getPointAtLength(i));
}
points.push(next);
} catch (err) {
console.warn(`Failed to convert path to points for d="${d}": ${err}`);
}
} catch (err) {}
return points;
}
+2 -2
View File
@@ -55,7 +55,7 @@ export const getCommands = (src: string) =>
.flatMap(({ d, name }, idx) =>
new SVGPathData(d)
.toAbs()
// @ts-expect-error `commands` is typed as a union of command types svgson does not narrow
// @ts-ignore
.commands.map((c, cIdx) => ({ ...c, id: idx, idx: cIdx, name })),
);
@@ -242,7 +242,7 @@ const getPaths = (src: string) => {
break;
}
default: {
// @ts-expect-error every command type is handled above, so `c` is not `never` here
// @ts-ignore
assertNever(c);
}
}
@@ -13,11 +13,11 @@ const getIconCodes = (): CodeExampleType => {
title: 'Vanilla',
code: `\
<script>
import { createIcons, $PascalCase } from 'lucide';
import { createIcons, $CamelCase } from 'lucide';
createIcons({
icons: {
$PascalCase
$CamelCase
}
});
</script>
+2
View File
@@ -9,9 +9,11 @@ export const hash = (string: string, seed = 5381) => {
let i = string.length;
while (i) {
// eslint-disable-next-line no-bitwise, no-plusplus
seed = (seed * 33) ^ string.charCodeAt(--i);
}
// eslint-disable-next-line no-bitwise
return (seed >>> 0).toString(36).substr(0, 6);
};
+17 -8
View File
@@ -1,6 +1,5 @@
import type MarkdownIt from 'markdown-it';
import type { RenderRule } from 'markdown-it/lib/renderer.mjs';
import type Token from 'markdown-it/lib/token.mjs';
import container from 'markdown-it-container';
import sandpackTheme from '../theme/sandpackTheme.json';
@@ -22,10 +21,14 @@ export default function sandpackPlugin(md: MarkdownIt, pluginOptions: SnackParam
throw new Error('MarkdownIt instance is required for sandpackPlugin');
}
const escapeHtml = md?.utils?.escapeHtml;
const defaultFence =
md.renderer.rules.fence ||
((tokens, idx, options, env, self) => self.renderToken(tokens, idx, options));
const renderSandbox = (tokenList: Token[], index: number) => {
const renderFunc = (tokens: Token[], idx: number) => {
const renderSandbox = (tokenList: any[], index: number) => {
const renderFunc = (tokens: any[], idx: number) => {
if (tokens[idx].nesting === 1) {
const fileAttr: string[] = [];
const attrs = Object.fromEntries(tokens[idx].attrs || []);
const files: Record<
@@ -44,7 +47,7 @@ export default function sandpackPlugin(md: MarkdownIt, pluginOptions: SnackParam
) {
if (tokens[i].type === 'fence' && tokens[i].tag === 'code') {
const info = tokens[i].info ?? '';
const [, fileName, params = ''] = info.split(' ');
const [lang, fileName, params = ''] = info.split(' ');
const active = params.includes('[active]');
const hidden = params.includes('[hidden]');
@@ -54,9 +57,15 @@ export default function sandpackPlugin(md: MarkdownIt, pluginOptions: SnackParam
if (fileName && code) {
files[fileName] = {
code,
...(active && { active: true }),
...(hidden && { hidden: true }),
};
if (active) {
(files[fileName] as any).active = true;
}
if (hidden) {
(files[fileName] as any).hidden = true;
}
}
}
}
@@ -113,7 +122,7 @@ export default function sandpackPlugin(md: MarkdownIt, pluginOptions: SnackParam
return renderFunc(tokenList, index);
};
function createCodeGroup(): ContainerArgs {
function createCodeGroup(md: MarkdownIt): ContainerArgs {
return [
container,
'sandpack',
@@ -125,5 +134,5 @@ export default function sandpackPlugin(md: MarkdownIt, pluginOptions: SnackParam
];
}
md.use(...createCodeGroup());
md.use(...createCodeGroup(md));
}
+2 -1
View File
@@ -73,6 +73,7 @@ export default function snackPlayerPlugin(md: MarkdownIt) {
'react-native-safe-area-context' + (params.dependencies ? `,${params.dependencies}` : '');
const platform = params.platform ?? 'web';
const supportedPlatforms = params.supportedPlatforms ?? 'ios,android,web';
const theme = params.theme ?? 'light';
const preview = params.preview ?? 'true';
const loading = params.loading ?? 'lazy';
const deviceAppearance = params.deviceAppearance ?? 'dark';
@@ -87,7 +88,7 @@ export default function snackPlayerPlugin(md: MarkdownIt) {
` data-snack-dependencies="${escapeHtml(dependencies)}"` +
` data-snack-platform="${escapeHtml(platform)}"` +
` data-snack-supported-platforms="${escapeHtml(supportedPlatforms)}"` +
// ` data-snack-theme="${escapeHtml(params.theme ?? 'light')}"` +
// ` data-snack-theme="${escapeHtml(theme)}"` +
` data-snack-preview="${escapeHtml(preview)}"` +
` data-snack-loading="${escapeHtml(loading)}"` +
` data-snack-device-appearance="${escapeHtml(deviceAppearance)}"` +
@@ -1,3 +1,4 @@
import { getAllData } from '../../../lib/icons';
import { getAllCategoryFiles, mapCategoryIconCount } from '../../../lib/categories';
import iconsMetaData from '../../../data/iconMetaData';
@@ -1,3 +1,5 @@
/* eslint-disable no-console */
import { ref, inject, Ref } from 'vue';
export const ICON_STYLE_CONTEXT = Symbol('style');
+3 -3
View File
@@ -6,13 +6,13 @@ declare module '*.vue' {
}
declare module '*.data.ts' {
const data: unknown;
const data: any;
export { data };
}
declare module '*.data' {
const data: unknown;
const data: any;
export { data };
}
@@ -75,7 +75,7 @@ declare global {
doNotShowAfterSubmit?: boolean;
customFormUrl?: string; // when you want to load the form via it's custom domain URL
hiddenFields?: {
[key: string]: unknown;
[key: string]: any;
};
onOpen?: () => void;
onClose?: () => void;
+1 -1
View File
@@ -68,6 +68,6 @@
"react": "18.2.0",
"react-dom": "18.2.0",
"sandpack-vue3": "3.1.12",
"vue": "^3.5.42"
"vue": "^3.5.40"
}
}
File diff suppressed because one or more lines are too long
+1
View File
@@ -1,3 +1,4 @@
/* eslint-disable no-restricted-syntax, no-await-in-loop */
import fs from 'fs';
import path from 'path';
import { simpleGit } from 'simple-git';
+2 -3
View File
@@ -1,3 +1,4 @@
/* eslint-disable no-restricted-syntax, no-await-in-loop */
import fs from 'fs';
import path from 'path';
import { loadEnvFile } from 'node:process';
@@ -9,9 +10,7 @@ const dataDirectory = path.resolve(currentDir, '.vitepress/data');
try {
// Load environment variables from .env file, if it exists.
loadEnvFile(`${currentDir}/.env`);
} catch {
// No .env file, so rely on the environment as-is.
}
} catch (error) {}
interface IconCollection {
/** Human readable name, used for logging. */
-154
View File
@@ -1,154 +0,0 @@
import path from 'node:path';
import js from '@eslint/js';
import { includeIgnoreFile } from '@eslint/compat';
import { defineConfig } from 'eslint/config';
import prettier from 'eslint-config-prettier';
import importX, { createNodeResolver } from 'eslint-plugin-import-x';
import htmlEslint from '@html-eslint/eslint-plugin';
import htmlParser from '@html-eslint/parser';
import defaultAttrs from './tools/build-icons/render/default-attrs.json' with { type: 'json' };
import tseslint from 'typescript-eslint';
const gitignorePath = path.join(import.meta.dirname, '.gitignore');
export default defineConfig([
tseslint.configs.recommended,
{
// `packages/angular` has its own config with its own tsconfig, so a single `eslint .` run sees
// two candidate roots and typescript-eslint refuses to guess between them.
languageOptions: {
parserOptions: {
tsconfigRootDir: import.meta.dirname,
},
},
},
// Everything git ignores (generated icon sources, build output, caches) is ignored here too.
includeIgnoreFile(gitignorePath),
{
// Ignores that are not in .gitignore, because these files are committed.
ignores: [
'lib',
'**/tests',
'packages/**/tests/*',
'docs/images',
'docs/**/examples/',
'docs/.vitepress/theme/components/editors/preact/index.js',
'packages/svelte/.svelte-kit',
// Tracked in git despite matching a .gitignore pattern, so lint it.
'!packages/lucide-react/dynamicIconImports.mjs',
],
},
{
files: ['**/*.js'],
languageOptions: {
ecmaVersion: 'latest',
sourceType: 'module',
globals: {
console: 'readonly',
process: 'readonly',
global: 'readonly',
__dirname: 'readonly',
},
},
plugins: {
'import-x': importX,
},
settings: {
'import-x/resolver-next': [createNodeResolver()],
},
rules: {
...js.configs.recommended.rules,
...prettier.rules,
'no-console': 'off',
'no-param-reassign': 'off',
'no-shadow': 'off',
'no-use-before-define': 'off',
'import-x/no-extraneous-dependencies': [
'error',
{
devDependencies: [
'**/*.test.js',
'**/*.spec.js',
'**/scripts/**',
'eslint.config.js',
'packages/**/tests/**',
],
},
],
'import-x/extensions': [
'error',
{
pattern: {
mjs: 'always',
json: 'always',
},
},
],
},
},
{
rules: {
// Omitting a property by destructuring it away (`const { key, ...attrs } = node`) leaves the
// omitted binding unused on purpose, so don't report it.
'@typescript-eslint/no-unused-vars': ['error', { ignoreRestSiblings: true }],
},
},
{
files: ['./icons/*.svg'],
languageOptions: {
parser: htmlParser,
},
plugins: {
'@html-eslint': htmlEslint,
},
rules: {
'@html-eslint/require-doctype': 'off',
'@html-eslint/no-duplicate-attrs': 'error',
'@html-eslint/no-inline-styles': 'error',
'@html-eslint/require-attrs': [
'error',
...Object.entries(defaultAttrs).map(([attr, value]) => ({
tag: 'svg',
attr,
value: String(value),
})),
],
'@html-eslint/indent': ['error', 2],
'@html-eslint/no-multiple-empty-lines': ['error', { max: 0 }],
'@html-eslint/no-extra-spacing-attrs': [
'error',
{
enforceBeforeSelfClose: true,
},
],
'@html-eslint/attrs-newline': [
'error',
{
inline: ['path', 'line', 'polyline', 'polygon', 'rect', 'circle', 'ellipse'],
},
],
'@html-eslint/require-closing-tags': [
'error',
{
selfClosing: 'always',
// Inside <svg> every tag counts as "foreign", where the rule only checks that a tag
// already written `/>` stays that way. Listing the shapes here is what actually forces
// `<path ...></path>` to become `<path ... />`.
selfClosingCustomPatterns: ['^(path|line|polyline|polygon|rect|circle|ellipse)$'],
},
],
'@html-eslint/no-restricted-attr-values': [
'error',
{
attrPatterns: ['^(fill|stroke)$'],
attrValuePatterns: ['^(?!(none|currentColor)$).*$'],
message:
'Icons must inherit their colors: `fill` and `stroke` may only be `none` or `currentColor`.',
},
],
'@html-eslint/element-newline': 'error',
'@html-eslint/no-trailing-spaces': 'error',
'@html-eslint/quotes': 'error',
},
},
]);
+1 -12
View File
@@ -2,21 +2,10 @@
"$schema": "../icon.schema.json",
"contributors": [
"mittalyashu",
"ericfennis",
"jguddas"
"ericfennis"
],
"use-cases": [],
"tags": [
"symbol",
"sterisk",
"mark",
"pointer",
"pencil",
"sign",
"alert",
"notification",
"indicator",
"symbolic",
"reference",
"times",
"multiply",
+3 -3
View File
@@ -9,7 +9,7 @@
stroke-linecap="round"
stroke-linejoin="round"
>
<path d="M12 5v14" />
<path d="m18.065 8.496-12.125 7" />
<path d="m5.94 8.504 12.125 7" />
<path d="M12 6v12" />
<path d="M17.196 9 6.804 15" />
<path d="m6.804 9 10.392 6" />
</svg>

Before

Width:  |  Height:  |  Size: 306 B

After

Width:  |  Height:  |  Size: 299 B

-55
View File
@@ -1,55 +0,0 @@
{
"$schema": "../icon.schema.json",
"contributors": [
"danielbayley",
"karsa-mistmere"
],
"use-cases": [
"indicating that audio levels, playback, or monitoring are turned off",
"showing muted sound, silenced voice activity, or disabled audio output",
"marking controls that pause waveform visualization or stop live audio analysis",
"representing inactive music, radio, broadcast, or voice signal displays",
"identifying settings that disable sound processing, hearing feedback, or media levels",
"showing a muted microphone during voice or video calls",
"indicating speaker or headphone output is disabled in system audio controls",
"marking disabled waveform or spectrum visualization in audio editors and daws",
"showing that sound notifications or alerts are silenced"
],
"tags": [
"audio",
"sound",
"noise",
"mute",
"silence",
"off",
"disabled",
"inactive",
"listen",
"hearing",
"equalizer",
"equaliser",
"hertz",
"frequency",
"wavelength",
"vibrate",
"sine",
"waveform",
"synthesizer",
"synthesiser",
"levels",
"track",
"music",
"playback",
"radio",
"broadcast",
"airwaves",
"voice",
"vocals",
"singer",
"song"
],
"categories": [
"multimedia",
"communication"
]
}
-21
View File
@@ -1,21 +0,0 @@
<svg
xmlns="http://www.w3.org/2000/svg"
width="24"
height="24"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
stroke-width="2"
stroke-linecap="round"
stroke-linejoin="round"
>
<path d="M10 10v11" />
<path d="M10 3v1.35" />
<path d="M14 14v1" />
<path d="M14 8v.35" />
<path d="M18 5v7.35" />
<path d="M2 10v3" />
<path d="m2 2 20 20" />
<path d="M22 10v3" />
<path d="M6 6v11" />
</svg>

Before

Width:  |  Height:  |  Size: 430 B

+1 -1
View File
@@ -10,5 +10,5 @@
stroke-linejoin="round"
>
<path d="M3.85 8.62a4 4 0 0 1 4.78-4.77 4 4 0 0 1 6.74 0 4 4 0 0 1 4.78 4.78 4 4 0 0 1 0 6.74 4 4 0 0 1-4.77 4.78 4 4 0 0 1-6.75 0 4 4 0 0 1-4.78-4.77 4 4 0 0 1 0-6.76Z" />
<path d="m16 9-5.5 5.5L8 12" />
<path d="m9 12 2 2 4-4" />
</svg>

Before

Width:  |  Height:  |  Size: 417 B

After

Width:  |  Height:  |  Size: 412 B

+1 -2
View File
@@ -3,8 +3,7 @@
"contributors": [
"kemie",
"ericfennis",
"karsa-mistmere",
"jguddas"
"karsa-mistmere"
],
"use-cases": [],
"tags": [
+1 -1
View File
@@ -10,6 +10,6 @@
stroke-linejoin="round"
>
<path d="M16.4 13.7A6.5 6.5 0 1 0 6.28 6.6c-1.1 3.13-.78 3.9-3.18 6.08A3 3 0 0 0 5 18c4 0 8.4-1.8 11.4-4.3" />
<path d="m18.5 6 1.754 3.5a6.48 6.48 0 0 1-1.854 8.2C15.4 20.2 11 22 7 22a3 3 0 0 1-2.68-1.66L2.4 16.5" />
<path d="m18.5 6 2.19 4.5a6.48 6.48 0 0 1-2.29 7.2C15.4 20.2 11 22 7 22a3 3 0 0 1-2.68-1.66L2.4 16.5" />
<circle cx="12.5" cy="8.5" r="2.5" />
</svg>

Before

Width:  |  Height:  |  Size: 470 B

After

Width:  |  Height:  |  Size: 468 B

+2 -7
View File
@@ -1,8 +1,7 @@
{
"$schema": "../icon.schema.json",
"contributors": [
"danielbayley",
"jguddas"
"danielbayley"
],
"use-cases": [],
"tags": [
@@ -23,11 +22,7 @@
"brightness",
"overlap",
"colors",
"colours",
"marriage",
"rings",
"couple",
"connection"
"colours"
],
"categories": [
"design",
+2 -2
View File
@@ -9,6 +9,6 @@
stroke-linecap="round"
stroke-linejoin="round"
>
<circle cx="15" cy="9" r="7" />
<circle cx="9" cy="15" r="7" />
<circle cx="9" cy="9" r="7" />
<circle cx="15" cy="15" r="7" />
</svg>

Before

Width:  |  Height:  |  Size: 276 B

After

Width:  |  Height:  |  Size: 276 B

+2 -2
View File
@@ -9,7 +9,7 @@
stroke-linecap="round"
stroke-linejoin="round"
>
<path d="m14.5 7.5-5 5" />
<path d="m14.5 7-5 5" />
<path d="M4 19.5v-15A2.5 2.5 0 0 1 6.5 2H19a1 1 0 0 1 1 1v18a1 1 0 0 1-1 1H6.5a1 1 0 0 1 0-5H20" />
<path d="m9.5 7.5 5 5" />
<path d="m9.5 7 5 5" />
</svg>

Before

Width:  |  Height:  |  Size: 367 B

After

Width:  |  Height:  |  Size: 363 B

-36
View File
@@ -1,36 +0,0 @@
{
"$schema": "../icon.schema.json",
"contributors": [
"Nykoula",
"jamiemlaw"
],
"use-cases": [
"Representing crossing infrastructure in navigation apps",
"Marking river crossings or connecting routes on maps",
"Showing clearance-limited transit zones in maritime dashboards"
],
"tags": [
"overpass",
"cross over",
"traverse",
"viaduct",
"suspension",
"infrastructure",
"transportation",
"crossing",
"road",
"river",
"gate",
"golden",
"travel",
"landmark",
"route",
"maritime",
"clearance"
],
"categories": [
"travel",
"transportation",
"buildings"
]
}
-18
View File
@@ -1,18 +0,0 @@
<svg
xmlns="http://www.w3.org/2000/svg"
width="24"
height="24"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
stroke-width="2"
stroke-linecap="round"
stroke-linejoin="round"
>
<path d="M10 9.728V16" />
<path d="M14 9.728V16" />
<path d="M18 20V4" />
<path d="m22 11-4-4A7.5 7.5 0 0 1 6 7l-4 4" />
<path d="M22 16H2" />
<path d="M6 20V4" />
</svg>

Before

Width:  |  Height:  |  Size: 384 B

-25
View File
@@ -1,25 +0,0 @@
{
"$schema": "../icon.schema.json",
"contributors": [
"karsa-mistmere",
"jaynewey"
],
"use-cases": [
"representing canned drinks like soda or beer",
"representing canned foods like soup or legumes",
"representing litter/waste"
],
"tags": [
"beverage",
"drink",
"food",
"soda",
"tin",
"beer",
"alcohol",
"waste"
],
"categories": [
"food-beverage"
]
}
-18
View File
@@ -1,18 +0,0 @@
<svg
xmlns="http://www.w3.org/2000/svg"
width="24"
height="24"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
stroke-width="2"
stroke-linecap="round"
stroke-linejoin="round"
>
<path d="m17 22 1.664-2.496a2 2 0 00.336-1.11V5.606a2 2 0 00-.336-1.11L17 2" />
<path d="M18 22H6" />
<path d="M18 2H6" />
<path d="M5 17h14" />
<path d="M5 7h14" />
<path d="m7 22-1.664-2.496A2 2 0 015 18.394V5.606a2 2 0 01.336-1.11L7 2" />
</svg>

Before

Width:  |  Height:  |  Size: 462 B

-28
View File
@@ -1,28 +0,0 @@
{
"$schema": "../icon.schema.json",
"contributors": [
"l0uisgrange",
"karsa-mistmere"
],
"use-cases": [
"Representing canned food in grocery or delivery apps",
"Labelling pantry items or nonperishable inventory",
"Indicating metal recycling or recyclable containers",
"Denoting canned ingredients in recipe or meal-planning interfaces"
],
"tags": [
"food",
"storage",
"groceries",
"tin",
"metal",
"recyclable",
"container",
"pantry",
"grocery",
"preserved"
],
"categories": [
"food-beverage"
]
}
-16
View File
@@ -1,16 +0,0 @@
<svg
xmlns="http://www.w3.org/2000/svg"
width="24"
height="24"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
stroke-width="2"
stroke-linecap="round"
stroke-linejoin="round"
>
<path d="M21 10.5a9 2.5 0 01-18 0v8a9 2.5 0 0018 0z" />
<path d="M21 10.5A9 2.5 25.32 004.59 3.47 9 2.5 25.32 0021 10.5" />
<path d="M3 10.5a9 2.5 0 016.527-2.405" />
<path d="M9 16.858a31 31 0 006 0" />
</svg>

Before

Width:  |  Height:  |  Size: 420 B

-29
View File
@@ -1,29 +0,0 @@
{
"$schema": "../icon.schema.json",
"contributors": [
"andreynaz4renko"
],
"use-cases": [
"Showing battery status, power, and charging state",
"Category icon for car batteries, jump starters, or battery testers",
"Menu or shortcut for power-related info"
],
"tags": [
"battery",
"automobile",
"powercell",
"electric",
"power",
"electricity",
"energy",
"accumulator",
"charge",
"transport",
"vehicle",
"car"
],
"categories": [
"connectivity",
"transportation"
]
}
-18
View File
@@ -1,18 +0,0 @@
<svg
xmlns="http://www.w3.org/2000/svg"
width="24"
height="24"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
stroke-width="2"
stroke-linecap="round"
stroke-linejoin="round"
>
<path d="M14 13h4" />
<path d="M16 15v-4" />
<path d="M18 5v2" />
<path d="M6 13h4" />
<path d="M6 5v2" />
<rect x="2" y="7" width="20" height="12" rx="2" />
</svg>

Before

Width:  |  Height:  |  Size: 378 B

+1 -1
View File
@@ -10,5 +10,5 @@
stroke-linejoin="round"
>
<circle cx="12" cy="12" r="10" />
<path d="m16 9-5.5 5.5L8 12" />
<path d="m9 12 2 2 4-4" />
</svg>

Before

Width:  |  Height:  |  Size: 278 B

After

Width:  |  Height:  |  Size: 273 B

+1 -19
View File
@@ -14,25 +14,7 @@
"version control",
"choices",
"multiple choice",
"choose",
"album",
"music",
"songs",
"format",
"cd",
"dvd",
"vinyl",
"sleeve",
"cover",
"platinum",
"compilation",
"ep",
"recording",
"playback",
"spin",
"rotate",
"rpm",
"dj"
"choose"
],
"categories": [
"development",
+1 -1
View File
@@ -9,6 +9,6 @@
stroke-linecap="round"
stroke-linejoin="round"
>
<circle cx="12" cy="12" r="1" />
<circle cx="12" cy="12" r="10" />
<circle cx="12" cy="12" r="1" />
</svg>

Before

Width:  |  Height:  |  Size: 279 B

After

Width:  |  Height:  |  Size: 279 B

+2 -2
View File
@@ -11,6 +11,6 @@
>
<rect width="8" height="4" x="8" y="2" rx="1" ry="1" />
<path d="M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2" />
<path d="m14.5 11.5-5 5" />
<path d="m9.5 11.5 5 5" />
<path d="m15 11-6 6" />
<path d="m9 11 6 6" />
</svg>

Before

Width:  |  Height:  |  Size: 413 B

After

Width:  |  Height:  |  Size: 405 B

+2 -2
View File
@@ -9,7 +9,7 @@
stroke-linecap="round"
stroke-linejoin="round"
>
<path d="M21.95 13a10 10 0 1 0-8.685 8.92" />
<path d="M12 6v6l4 2" />
<path d="m16 19 2 2 4-4" />
<path d="M22 12a10 10 0 1 0-11 9.95" />
<path d="m22 16-5.5 5.5L14 19" />
</svg>

Before

Width:  |  Height:  |  Size: 313 B

After

Width:  |  Height:  |  Size: 313 B

+4 -4
View File
@@ -9,8 +9,8 @@
stroke-linecap="round"
stroke-linejoin="round"
>
<path d="M4 16a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h10a2 2 0 0 1 2 2" />
<rect x="8" y="8" width="14" height="14" rx="2" />
<path d="m12.5 12.5 5 5" />
<path d="m12.5 17.5 5-5" />
<line x1="12" x2="18" y1="12" y2="18" />
<line x1="12" x2="18" y1="18" y2="12" />
<rect width="14" height="14" x="8" y="8" rx="2" ry="2" />
<path d="M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2" />
</svg>

Before

Width:  |  Height:  |  Size: 389 B

After

Width:  |  Height:  |  Size: 425 B

-41
View File
@@ -1,41 +0,0 @@
{
"$schema": "../icon.schema.json",
"contributors": [
"colebemis",
"ericfennis",
"karsa-mistmere"
],
"use-cases": [
"Confirming a saved payment card is valid",
"Indicating an approved card payment during checkout",
"Verifying a payment method in billing settings",
"Showing successful card authorization in banking apps"
],
"tags": [
"debit",
"payment",
"banking",
"finance",
"transaction",
"wallet",
"purchase",
"checkout",
"billing",
"account",
"cardholder",
"verified",
"approved",
"authorized",
"valid",
"success",
"complete",
"check",
"bank",
"cc"
],
"categories": [
"account",
"finance",
"shopping"
]
}
-15
View File
@@ -1,15 +0,0 @@
<svg
xmlns="http://www.w3.org/2000/svg"
width="24"
height="24"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
stroke-width="2"
stroke-linecap="round"
stroke-linejoin="round"
>
<path d="M12.5 19H4a2 2 0 01-2-2V7a2 2 0 012-2h16a2 2 0 012 2v4" />
<path d="m16 17 2 2 4-4" />
<path d="M2 10h20" />
</svg>

Before

Width:  |  Height:  |  Size: 332 B

-42
View File
@@ -1,42 +0,0 @@
{
"$schema": "../icon.schema.json",
"contributors": [
"colebemis",
"ericfennis",
"karsa-mistmere",
"ameniti-mx"
],
"use-cases": [
"Removing a saved payment card from an account",
"Unlinking a payment method in billing settings",
"Revoking card access in banking apps",
"Indicating a declined or canceled card payment"
],
"tags": [
"debit",
"payment",
"remove",
"delete",
"unlink",
"revoke",
"decline",
"canceled",
"banking",
"finance",
"wallet",
"transaction",
"billing",
"account",
"purchase",
"checkout",
"subtract",
"minus",
"bank",
"cc"
],
"categories": [
"account",
"finance",
"shopping"
]
}
-15
View File
@@ -1,15 +0,0 @@
<svg
xmlns="http://www.w3.org/2000/svg"
width="24"
height="24"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
stroke-width="2"
stroke-linecap="round"
stroke-linejoin="round"
>
<path d="M16 17h6" />
<path d="M22 10H2" />
<path d="M22 13V7a2 2 0 00-2-2H4a2 2 0 00-2 2v10a2 2 0 002 2h8.536" />
</svg>

Before

Width:  |  Height:  |  Size: 329 B

-41
View File
@@ -1,41 +0,0 @@
{
"$schema": "../icon.schema.json",
"contributors": [
"colebemis",
"ericfennis",
"karsa-mistmere",
"ameniti-mx"
],
"use-cases": [
"Adding a payment card during checkout",
"Saving a new payment method in billing settings",
"Linking a card to a customer account",
"Requesting an additional card in banking apps"
],
"tags": [
"debit",
"payment",
"banking",
"finance",
"transaction",
"wallet",
"purchase",
"checkout",
"billing",
"account",
"cardholder",
"add",
"new",
"link",
"save",
"method",
"plastic",
"bank",
"cc"
],
"categories": [
"account",
"finance",
"shopping"
]
}
-16
View File
@@ -1,16 +0,0 @@
<svg
xmlns="http://www.w3.org/2000/svg"
width="24"
height="24"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
stroke-width="2"
stroke-linecap="round"
stroke-linejoin="round"
>
<path d="M16 17h6" />
<path d="M19 14v6" />
<path d="M22 10H2" />
<path d="M22 11.354V7a2 2 0 00-2-2H4a2 2 0 00-2 2v10a2 2 0 002 2h8.536" />
</svg>

Before

Width:  |  Height:  |  Size: 357 B

-38
View File
@@ -1,38 +0,0 @@
{
"$schema": "../icon.schema.json",
"contributors": [
"jguddas",
"karsa-mistmere"
],
"use-cases": [
"Processing card payments at checkout terminals",
"Locating ATMs or payment kiosks on maps",
"Indicating card-present transactions in finance apps",
"Showing contactless or chip card payment options"
],
"tags": [
"bank",
"purchase",
"payment",
"cc",
"atm",
"terminal",
"checkout",
"kiosk",
"pos",
"point of sale",
"transaction",
"contactless",
"chip",
"swipe",
"tap",
"banking",
"finance",
"retail"
],
"categories": [
"finance",
"navigation",
"shopping"
]
}
-16
View File
@@ -1,16 +0,0 @@
<svg
xmlns="http://www.w3.org/2000/svg"
width="24"
height="24"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
stroke-width="2"
stroke-linecap="round"
stroke-linejoin="round"
>
<path d="M15 16v1" />
<path d="M16.963 7.734A1 1 0 0015.999 7H8.003a1 1 0 00-.964.734L4.073 18.467A2 2 0 006 21h12a2 2 0 001.927-2.532z" />
<path d="M2.678 8.5A2 2 0 012 7V5a2 2 0 012-2h16a2 2 0 012 2v2a2 2 0 01-.676 1.499" />
<path d="m9 21 2-14" />
</svg>

Before

Width:  |  Height:  |  Size: 467 B

-41
View File
@@ -1,41 +0,0 @@
{
"$schema": "../icon.schema.json",
"contributors": [
"colebemis",
"ericfennis",
"karsa-mistmere"
],
"use-cases": [
"Indicating a declined card payment during checkout",
"Marking an invalid payment card in billing settings",
"Showing failed card authorization in banking apps",
"Canceling a card payment before submission"
],
"tags": [
"debit",
"payment",
"banking",
"finance",
"transaction",
"wallet",
"purchase",
"checkout",
"billing",
"account",
"cardholder",
"declined",
"rejected",
"failed",
"invalid",
"canceled",
"error",
"cancel",
"bank",
"cc"
],
"categories": [
"account",
"finance",
"shopping"
]
}
-16
View File
@@ -1,16 +0,0 @@
<svg
xmlns="http://www.w3.org/2000/svg"
width="24"
height="24"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
stroke-width="2"
stroke-linecap="round"
stroke-linejoin="round"
>
<path d="M12.5 19H4a2 2 0 01-2-2V7a2 2 0 012-2h16a2 2 0 012 2v3.5" />
<path d="m16.5 14.5 5 5" />
<path d="M2 10h20" />
<path d="m21.5 14.5-5 5" />
</svg>

Before

Width:  |  Height:  |  Size: 364 B

+5 -5
View File
@@ -9,9 +9,9 @@
stroke-linecap="round"
stroke-linejoin="round"
>
<path d="M19 8V5a2 2 0 00-2-2H7a2 2 0 00-2 2v16" />
<path d="M2 21h8" />
<path d="M20 16v-2a2 2 0 00-4 0v2" />
<path d="M9 12h.01" />
<rect x="14" y="16" width="8" height="5" rx="1" />
<path d="M10 12h.01" />
<path d="M18 9V6a2 2 0 0 0-2-2H8a2 2 0 0 0-2 2v14" />
<path d="M2 20h8" />
<path d="M20 17v-2a2 2 0 1 0-4 0v2" />
<rect x="14" y="17" width="8" height="5" rx="1" />
</svg>

Before

Width:  |  Height:  |  Size: 403 B

After

Width:  |  Height:  |  Size: 407 B

+3 -3
View File
@@ -9,7 +9,7 @@
stroke-linecap="round"
stroke-linejoin="round"
>
<path d="M19 21V5a2 2 0 00-2-2H7a2 2 0 00-2 2v16" />
<path d="M2 21h20" />
<path d="M9 12h.01" />
<path d="M10 12h.01" />
<path d="M18 20V6a2 2 0 0 0-2-2H8a2 2 0 0 0-2 2v14" />
<path d="M2 20h20" />
</svg>

Before

Width:  |  Height:  |  Size: 312 B

After

Width:  |  Height:  |  Size: 315 B

+4 -4
View File
@@ -9,9 +9,9 @@
stroke-linecap="round"
stroke-linejoin="round"
>
<path d="M10 21H2" />
<path d="M10 4a2 2 0 012.36-1.968l5.41.992A1.5 1.5 0 0119 4.5V21l-7.876.992A1 1 0 0110 21z" />
<path d="M10.268 3H7a2 2 0 00-2 2v16" />
<path d="M11 20H2" />
<path d="M11 4.562v16.157a1 1 0 0 0 1.242.97L19 20V5.562a2 2 0 0 0-1.515-1.94l-4-1A2 2 0 0 0 11 4.561z" />
<path d="M11 4H8a2 2 0 0 0-2 2v14" />
<path d="M14 12h.01" />
<path d="M22 21h-3" />
<path d="M22 20h-3" />
</svg>

Before

Width:  |  Height:  |  Size: 423 B

After

Width:  |  Height:  |  Size: 432 B

-40
View File
@@ -1,40 +0,0 @@
{
"$schema": "../icon.schema.json",
"contributors": [
"jguddas",
"karsa-mistmere"
],
"use-cases": [
"Indicating stair access in building navigation",
"Showing floor levels in building directories",
"Marking where an item is located by floor",
"Directing users to take stairs instead of elevators"
],
"tags": [
"staircase",
"stairway",
"stairs",
"steps",
"ladder",
"transition",
"access",
"structure",
"espiral",
"building",
"vertical",
"movement",
"floor",
"level",
"entrance",
"entry",
"exit",
"egress",
"route",
"indoor",
"emergency exit"
],
"categories": [
"home",
"travel"
]
}
-17
View File
@@ -1,17 +0,0 @@
<svg
xmlns="http://www.w3.org/2000/svg"
width="24"
height="24"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
stroke-width="2"
stroke-linecap="round"
stroke-linejoin="round"
>
<path d="M12 17v-3a1 1 0 011-1h6" />
<path d="M19 17h-9a1 1 0 00-1 1v3" />
<path d="M19 21V5a2 2 0 00-2-2H7a2 2 0 00-2 2v16" />
<path d="M19 9h-3a1 1 0 00-1 1v3" />
<path d="M22 21H2" />
</svg>

Before

Width:  |  Height:  |  Size: 405 B

-35
View File
@@ -1,35 +0,0 @@
{
"$schema": "../icon.schema.json",
"contributors": [
"BorisDelchambre",
"ThibautMarechal",
"karsa-mistmere"
],
"use-cases": [
"eject removable media",
"unmount external storage",
"optical disc drive",
"media player controls",
"hardware controls"
],
"tags": [
"disc",
"drive",
"dvd",
"blu-ray",
"cd",
"media",
"optical",
"optical drive",
"removable media",
"storage",
"tray",
"unmount",
"usb"
],
"categories": [
"devices",
"files",
"multimedia"
]
}
-14
View File
@@ -1,14 +0,0 @@
<svg
xmlns="http://www.w3.org/2000/svg"
width="24"
height="24"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
stroke-width="2"
stroke-linecap="round"
stroke-linejoin="round"
>
<path d="M4 13a1 1 0 0 1-.72-1.695l7.257-7.668a2 2 0 0 1 2.926 0l7.256 7.668A1 1 0 0 1 20 13z" />
<rect x="3" y="17" width="18" height="4" rx="1" />
</svg>

Before

Width:  |  Height:  |  Size: 361 B

-34
View File
@@ -1,34 +0,0 @@
{
"$schema": "../icon.schema.json",
"contributors": [
"benhaube",
"jamiemlaw"
],
"use-cases": [
"Indicating engine health or need of repair",
"Representing the engine category in a parts list",
"Representing automotive repair",
"showing a check engine warning on a dashboard",
"marking scheduled vehicle maintenance",
"filtering vehicle parts in an online catalog",
"labeling automotive diagnostic reports"
],
"tags": [
"vehicle",
"power",
"energy",
"drive",
"repair",
"car",
"motor",
"mechanical",
"diagnostics",
"maintenance",
"warning",
"dashboard",
"parts"
],
"categories": [
"transportation"
]
}
-17
View File
@@ -1,17 +0,0 @@
<svg
xmlns="http://www.w3.org/2000/svg"
width="24"
height="24"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
stroke-width="2"
stroke-linecap="round"
stroke-linejoin="round"
>
<path d="M10 3h6" />
<path d="M13 3v4" />
<path d="M2 10v6" />
<path d="M2 13h4" />
<path d="M6 16a2 2 0 002 2h1a2 2 0 011.6.8l.3.4a2 2 0 001.6.8h2.264a2 2 0 001.789-1.106l1.67-3.341a1 1 0 01.895-.553H21a1 1 0 001-1v-4a1 1 0 00-1-1h-3.5a1 1 0 01-.8-.4l-.9-1.2A1 1 0 0015 7h-4a1 1 0 00-.8.4l-.9 1.2a1 1 0 01-.8.4H7a1 1 0 00-1 1z" />
</svg>

Before

Width:  |  Height:  |  Size: 550 B

+1 -1
View File
@@ -8,7 +8,7 @@
"about",
"calculate",
"math",
"operator"
"operater"
],
"categories": [
"math"
+5 -5
View File
@@ -9,10 +9,10 @@
stroke-linecap="round"
stroke-linejoin="round"
>
<path d="M15 12v-1.584" />
<path d="M17 10a5 5 0 00-3 1" />
<path d="M7 10a5 5 0 013 1" />
<path d="M9 12v-1.584" />
<path d="M9 17a5 5 0 016.001 0" />
<path d="M15 11V9.416" />
<path d="M17 9a5 5 0 00-3 1" />
<path d="M7 9a5 5 0 013 1" />
<path d="M9 11V9.416" />
<path d="M9 16a5 5 0 016.001 0" />
<circle cx="12" cy="12" r="10" />
</svg>

Before

Width:  |  Height:  |  Size: 406 B

After

Width:  |  Height:  |  Size: 402 B

-35
View File
@@ -1,35 +0,0 @@
{
"$schema": "../icon.schema.json",
"contributors": [
"karsa-mistmere"
],
"use-cases": [
"representing galaxies, stars, or deep space in astronomy content",
"visualizing the universe or cosmos in science education",
"marking space exploration, stargazing, or observatory features",
"identifying star chart or constellation map features",
"signifying interstellar or sci-fi travel sections in apps",
"branding planetarium events or astronomy clubs",
"decorative element in space-themed user interfaces or games",
"marking cosmic discoveries or research in science publications"
],
"tags": [
"astronomy",
"space",
"stars",
"cosmos",
"universe",
"spiral",
"milky way",
"nebula",
"cosmology",
"interstellar",
"celestial",
"constellation",
"stargazing",
"spaceflight"
],
"categories": [
"science"
]
}
-17
View File
@@ -1,17 +0,0 @@
<svg
xmlns="http://www.w3.org/2000/svg"
width="24"
height="24"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
stroke-width="2"
stroke-linecap="round"
stroke-linejoin="round"
>
<path d="M16.005 15.108a5.041 6.52 28.25 00-8.008-6.217 5.041 6.52 28.25 008.008 6.217A11.884 7.288-60.76 014.029 7.001" />
<path d="M17 21h.01" />
<path d="M7 3h.01" />
<path d="M7.997 8.891a11.885 7.288-60.756 0111.977 8.107" />
<circle cx="12" cy="12" r="1" fill="currentColor" />
</svg>

Before

Width:  |  Height:  |  Size: 502 B

-49
View File
@@ -1,49 +0,0 @@
{
"$schema": "../icon.schema.json",
"contributors": [
"rrod497",
"karsa-mistmere"
],
"use-cases": [
"Indicating sanitized or disinfected surfaces",
"Marking bacteria-free products or environments",
"Showing infection prevention or contamination control",
"Representing antimicrobial treatment in medical interfaces"
],
"tags": [
"virus",
"microbe",
"bacterium",
"bacteria",
"germ",
"organism",
"cilia",
"pathogen",
"infection",
"disease",
"contagion",
"contamination",
"microbiology",
"health",
"medicine",
"biology",
"science",
"microorganism",
"pandemic",
"epidemic",
"outbreak",
"amoeba",
"flu",
"security",
"single cell",
"unicellular",
"vaccine",
"immunity",
"quarantine"
],
"categories": [
"medical",
"science",
"security"
]
}
-25
View File
@@ -1,25 +0,0 @@
<svg
xmlns="http://www.w3.org/2000/svg"
width="24"
height="24"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
stroke-width="2"
stroke-linecap="round"
stroke-linejoin="round"
>
<path d="m11 2 .925 1.848" />
<path d="M13 15h.01" />
<path d="M13.424 7.768a2 2 0 112.808 2.808" />
<path d="m16 21-1-2.472" />
<path d="M16.988 16.988A12 12 0 019 20a5 5 0 01-2.759-9.171 8.8 8.8 0 002.307-2.28" />
<path d="m19 2-1 1.804" />
<path d="m2 19 2.746-1.373" />
<path d="m2 2 20 20" />
<path d="m22 16-2.474-2.13a12 12 0 001.376-3.786 6 6 0 00-10.313-5.151" />
<path d="m22 5-1.804 1" />
<path d="m3 10 2 2" />
<path d="M9 16h.01" />
<path d="M9 20v2" />
</svg>

Before

Width:  |  Height:  |  Size: 701 B

-49
View File
@@ -1,49 +0,0 @@
{
"$schema": "../icon.schema.json",
"contributors": [
"rrod497",
"karsa-mistmere"
],
"use-cases": [
"Representing bacteria or single-celled organisms",
"Indicating contamination or infectious disease",
"Marking microbiology research or laboratory samples",
"Showing microbes in hygiene and sanitation interfaces"
],
"tags": [
"virus",
"microbe",
"bacterium",
"bacteria",
"germ",
"organism",
"cilia",
"pathogen",
"infection",
"disease",
"contagion",
"contamination",
"microbiology",
"health",
"medicine",
"biology",
"science",
"microorganism",
"pandemic",
"epidemic",
"outbreak",
"amoeba",
"flu",
"security",
"single cell",
"unicellular",
"vaccine",
"immunity",
"quarantine"
],
"categories": [
"medical",
"science",
"security"
]
}
-24
View File
@@ -1,24 +0,0 @@
<svg
xmlns="http://www.w3.org/2000/svg"
width="24"
height="24"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
stroke-width="2"
stroke-linecap="round"
stroke-linejoin="round"
>
<path d="m11 2 .925 1.848" />
<path d="M13 15h.01" />
<path d="m16 21-1-2.472" />
<path d="m19 2-1 1.804" />
<path d="m2 19 2.746-1.373" />
<path d="m22 16-2.474-2.13" />
<path d="m22 5-1.804 1" />
<path d="m3 10 2 2" />
<path d="M9 16h.01" />
<path d="M9 20v2" />
<path d="M9.33 7.035c-.51 1.478-1.786 2.93-3.09 3.794A5 5 0 009 20a12.1 12.1 0 0011.902-9.916A6 6 0 009.33 7.035" />
<circle cx="15" cy="9" r="2" />
</svg>

Before

Width:  |  Height:  |  Size: 646 B

+3 -28
View File
@@ -2,37 +2,12 @@
"$schema": "../icon.schema.json",
"contributors": [
"mittalyashu",
"ericfennis",
"jguddas"
],
"use-cases": [
"Representing Halloween themes in seasonal content",
"Indicating spooky or haunted themes",
"Marking invisible or hidden states in playful UIs",
"Indicating dead links or obsolete content",
"Showing ghosts or spirits in arcade-style games"
"ericfennis"
],
"use-cases": [],
"tags": [
"spirit",
"haunt",
"specter",
"apparition",
"wraith",
"shade",
"phantom",
"entity",
"shadow",
"silhouette",
"pac-man",
"spooky",
"halloween",
"haunted",
"invisible",
"hidden",
"empty",
"dead",
"obsolete",
"outdated"
"spooky"
],
"categories": [
"gaming"
+3 -3
View File
@@ -9,7 +9,7 @@
stroke-linecap="round"
stroke-linejoin="round"
>
<path d="M15 10v1" />
<path d="M7.528 20.472a1.6 1.6 0 012.277 0l1.057 1.056a1.6 1.6 0 002.276 0l1.057-1.056a1.6 1.6 0 012.277 0l1.114 1.114a1.4 1.4 0 002.414-1V10a8 8 0 00-16 0v10.586a1.4 1.4 0 002.414 1z" />
<path d="M9 10v1" />
<path d="M9 10h.01" />
<path d="M15 10h.01" />
<path d="M12 2a8 8 0 0 0-8 8v12l3-3 2.5 2.5L12 19l2.5 2.5L17 19l3 3V10a8 8 0 0 0-8-8z" />
</svg>

Before

Width:  |  Height:  |  Size: 445 B

After

Width:  |  Height:  |  Size: 351 B

+2 -2
View File
@@ -11,7 +11,7 @@
>
<path d="M12 6h4a2 2 0 0 1 2 2v7" />
<path d="M6 12v9" />
<path d="m8.5 3.5-5 5" />
<path d="m8.5 8.5-5-5" />
<path d="M9 3 3 9" />
<path d="M9 9 3 3" />
<circle cx="18" cy="18" r="3" />
</svg>

Before

Width:  |  Height:  |  Size: 361 B

After

Width:  |  Height:  |  Size: 353 B

+5 -5
View File
@@ -9,10 +9,10 @@
stroke-linecap="round"
stroke-linejoin="round"
>
<path d="m15.5 3.5 5 5" />
<path d="m15.5 8.5 5-5" />
<path d="M18 11.62V15" />
<path d="M6 9v12" />
<circle cx="18" cy="18" r="3" />
<circle cx="6" cy="6" r="3" />
<path d="M6 9v12" />
<path d="m21 3-6 6" />
<path d="m21 9-6-6" />
<path d="M18 11.5V15" />
<circle cx="18" cy="18" r="3" />
</svg>

Before

Width:  |  Height:  |  Size: 385 B

After

Width:  |  Height:  |  Size: 376 B

+2 -2
View File
@@ -10,6 +10,6 @@
stroke-linejoin="round"
>
<path d="M12 3v17a1 1 0 0 1-1 1H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2v6a1 1 0 0 1-1 1H3" />
<path d="m16.5 16.5 5 5" />
<path d="m16.5 21.5 5-5" />
<path d="m16 16 5 5" />
<path d="m16 21 5-5" />
</svg>

Before

Width:  |  Height:  |  Size: 373 B

After

Width:  |  Height:  |  Size: 365 B

+3 -3
View File
@@ -9,7 +9,7 @@
stroke-linecap="round"
stroke-linejoin="round"
>
<path d="m2 21 9.6-9.6" />
<path d="m7.5 15.5 2.3 2.3a1 1 0 0 1 0 1.4l-2.1 2.1a1 1 0 0 1-1.4 0L4 19" />
<circle cx="15.5" cy="7.5" r="5.5" />
<path d="m15.5 7.5 2.3 2.3a1 1 0 0 0 1.4 0l2.1-2.1a1 1 0 0 0 0-1.4L19 4" />
<path d="m21 2-9.6 9.6" />
<circle cx="7.5" cy="15.5" r="5.5" />
</svg>

Before

Width:  |  Height:  |  Size: 356 B

After

Width:  |  Height:  |  Size: 355 B

-45
View File
@@ -1,45 +0,0 @@
{
"$schema": "../icon.schema.json",
"contributors": [
"xougui",
"karsa-mistmere"
],
"use-cases": [
"Marking coastal landmarks or harbor entrances on maps",
"Indicating navigation beacons in maritime dashboards",
"Flagging maritime safety or beacon maintenance tasks",
"Representing guidance or guiding light in onboarding or help interfaces"
],
"tags": [
"lighthouse",
"beacon",
"coast",
"navigation",
"tower",
"sea",
"ocean",
"maritime",
"guide",
"safety",
"light",
"shine",
"port",
"marine",
"faro",
"signal",
"nautical",
"harbor",
"shore",
"lightbeam",
"wayfinding",
"guidance",
"onboarding",
"help",
"landmark"
],
"categories": [
"buildings",
"navigation",
"travel"
]
}
-24
View File
@@ -1,24 +0,0 @@
<svg
xmlns="http://www.w3.org/2000/svg"
width="24"
height="24"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
stroke-width="2"
stroke-linecap="round"
stroke-linejoin="round"
>
<path d="M12 3V2" />
<path d="M16.066 16.865 7 22l2-11V6a3 3 0 016 0v5l2 11" />
<path d="m19.792 4.5.866-.5" />
<path d="m19.797 13.5.866.5" />
<path d="M21 9h1" />
<path d="M3 9H2" />
<path d="m4.203 13.5-.866.5" />
<path d="M4.208 4.5 3.342 4" />
<path d="M5.5 22h13" />
<path d="m7.932 16.875 7.377-4.178" />
<path d="M8 11h8" />
<path d="M8 7h8" />
</svg>

Before

Width:  |  Height:  |  Size: 585 B

-33
View File
@@ -1,33 +0,0 @@
{
"$schema": "../icon.schema.json",
"contributors": [
"karsa-mistmere",
"jamiemlaw",
"kemie"
],
"use-cases": [
"showing the edit or revision history of a list item",
"indicating recently viewed list entries",
"displaying a list of recently changed tasks",
"representing an activity or audit log for list-based content",
"marking last-updated or timestamped list rows"
],
"tags": [
"history",
"log",
"clock",
"time",
"recent",
"updated",
"revision",
"activity",
"timestamp",
"audit",
"list"
],
"categories": [
"text",
"time",
"notifications"
]
}
-17
View File
@@ -1,17 +0,0 @@
<svg
xmlns="http://www.w3.org/2000/svg"
width="24"
height="24"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
stroke-width="2"
stroke-linecap="round"
stroke-linejoin="round"
>
<path d="M16 13v2.2l1.6 1" />
<path d="M3 12h3.458" />
<path d="M3 19h3.832" />
<path d="M3 5h18" />
<circle cx="16" cy="15" r="6" />
</svg>

Before

Width:  |  Height:  |  Size: 352 B

-36
View File
@@ -1,36 +0,0 @@
{
"$schema": "../icon.schema.json",
"contributors": [
"colebemis",
"karsa-mistmere",
"ericfennis"
],
"use-cases": [
"Represents scheduled communication",
"Represents send later icons",
"Indication scheduled mail",
"Indication delayed delivery features in messaging, email, and productivity tools"
],
"tags": [
"email",
"message",
"letter",
"unread",
"scheduled",
"delayed",
"sendlater",
"delivery",
"reminder",
"pending",
"outgoing",
"timer"
],
"categories": [
"text",
"account",
"mail",
"time",
"notifications",
"communication"
]
}
-17
View File
@@ -1,17 +0,0 @@
<svg
xmlns="http://www.w3.org/2000/svg"
width="24"
height="24"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
stroke-width="2"
stroke-linecap="round"
stroke-linejoin="round"
>
<path d="M16 14v2.2l1.6 1" />
<path d="m22 7-.759.484" />
<path d="M6.835 20H4a2 2 0 01-2-2V6a2 2 0 012-2h16a2 2 0 012 2v2" />
<path d="M7.605 10.567 2 7" />
<circle cx="16" cy="16" r="6" />
</svg>

Before

Width:  |  Height:  |  Size: 409 B

-31
View File
@@ -1,31 +0,0 @@
{
"$schema": "../icon.schema.json",
"contributors": [
"colebemis",
"karsa-mistmere",
"ericfennis",
"jguddas",
"jennieboops"
],
"use-cases": [
"Composing or editing email messages",
"Drafting letters in mail interfaces",
"Editing email addresses on settings pages"
],
"tags": [
"email",
"message",
"letter",
"pen",
"edit",
"compose",
"draft",
"write",
"writing",
"create",
"reply"
],
"categories": [
"mail"
]
}
-15
View File
@@ -1,15 +0,0 @@
<svg
xmlns="http://www.w3.org/2000/svg"
width="24"
height="24"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
stroke-width="2"
stroke-linecap="round"
stroke-linejoin="round"
>
<path d="M15.506 17.646A2 2 0 0015 18.5l-.837 2.87a.5.5 0 00.62.62l2.87-.837a2 2 0 00.854-.506l3.013-3.009a1 1 0 00-3.004-3.004z" />
<path d="M22 10.346V6a2 2 0 00-2-2H4a2 2 0 00-2 2v12a2 2 0 002 2h6.396" />
<path d="m22 7-8.991 5.727a2 2 0 01-2.009 0L2 7" />
</svg>

Before

Width:  |  Height:  |  Size: 474 B

+4 -4
View File
@@ -9,8 +9,8 @@
stroke-linecap="round"
stroke-linejoin="round"
>
<path d="M22 12.532V6a2 2 0 0 0-2-2H4a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h8.792" />
<path d="m22 7-8.991 5.727a2 2 0 0 1-2.009 0L2 7" />
<path d="m16.5 16.5 5 5" />
<path d="m21.5 16.5-5 5" />
<path d="M22 13V6a2 2 0 0 0-2-2H4a2 2 0 0 0-2 2v12c0 1.1.9 2 2 2h9" />
<path d="m22 7-8.97 5.7a1.94 1.94 0 0 1-2.06 0L2 7" />
<path d="m17 17 4 4" />
<path d="m21 17-4 4" />
</svg>

Before

Width:  |  Height:  |  Size: 404 B

After

Width:  |  Height:  |  Size: 390 B

+1 -1
View File
@@ -10,5 +10,5 @@
stroke-linejoin="round"
>
<path d="M2.992 16.342a2 2 0 0 1 .094 1.167l-1.065 3.29a1 1 0 0 0 1.236 1.168l3.413-.998a2 2 0 0 1 1.099.092 10 10 0 1 0-4.777-4.719" />
<path d="m16 9-5.5 5.5L8 12" />
<path d="m9 12 2 2 4-4" />
</svg>

Before

Width:  |  Height:  |  Size: 381 B

After

Width:  |  Height:  |  Size: 376 B

-42
View File
@@ -1,42 +0,0 @@
{
"$schema": "../icon.schema.json",
"contributors": [
"colebemis",
"csandman",
"ericfennis",
"jguddas",
"karsa-mistmere",
"aliyasirnac"
],
"use-cases": [
"Confirming a draft message is ready",
"Marking pending feedback as resolved",
"Indicating provisional approval in conversation threads",
"Showing completed review status for comments"
],
"tags": [
"comment",
"chat",
"conversation",
"dialog",
"feedback",
"speech bubble",
"draft",
"pending",
"provisional",
"verification",
"confirmation",
"success",
"status",
"check",
"approval",
"moderate",
"resolved",
"done",
"complete"
],
"categories": [
"social",
"account"
]
}
-21
View File
@@ -1,21 +0,0 @@
<svg
xmlns="http://www.w3.org/2000/svg"
width="24"
height="24"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
stroke-width="2"
stroke-linecap="round"
stroke-linejoin="round"
>
<path d="M10.1 2.182a10 10 0 013.8 0" />
<path d="M13.9 21.818a10 10 0 01-3.8 0" />
<path d="M17.609 3.72a10 10 0 012.69 2.7" />
<path d="M2.182 13.9a10 10 0 010-3.8" />
<path d="M20.28 17.61a10 10 0 01-2.7 2.69" />
<path d="M21.818 10.1a10 10 0 010 3.8" />
<path d="M3.721 6.391a10 10 0 012.7-2.69" />
<path d="m6.163 21.117-2.906.85a1 1 0 01-1.236-1.169l.965-2.98" />
<path d="m16 9-5.5 5.5L8 12" />
</svg>

Before

Width:  |  Height:  |  Size: 628 B

-37
View File
@@ -1,37 +0,0 @@
{
"$schema": "../icon.schema.json",
"contributors": [
"simoncoudeville",
"karsa-mistmere"
],
"use-cases": [
"Representing MIDI connections and ports in music production software",
"Indicating MIDI input and output on synthesizers, keyboards, and controllers",
"Showing MIDI device connectivity in audio and hardware configuration interfaces",
"Representing MIDI routing, patching, and signal flow",
"Identifying 5-pin DIN MIDI connectors in technical diagrams and device documentation"
],
"tags": [
"musical instrument digital interface",
"port",
"connector",
"socket",
"jack",
"din",
"5-pin",
"audio",
"music",
"synthesizer",
"keyboard",
"controller",
"interface",
"input",
"output",
"io"
],
"categories": [
"multimedia",
"connectivity",
"devices"
]
}
-19
View File
@@ -1,19 +0,0 @@
<svg
xmlns="http://www.w3.org/2000/svg"
width="24"
height="24"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
stroke-width="2"
stroke-linecap="round"
stroke-linejoin="round"
>
<path d="M12 18h.01" />
<path d="M15 2.458V5a1 1 0 01-1 1h-4a1 1 0 01-1-1V2.458" />
<path d="M16 16h.01" />
<path d="M18 12h.01" />
<path d="M6 12h.01" />
<path d="M8 16h.01" />
<circle cx="12" cy="12" r="10" />
</svg>

Before

Width:  |  Height:  |  Size: 434 B

Some files were not shown because too many files have changed in this diff Show More