Compare commits

..
Author SHA1 Message Date
Karsa ec3c3906f7 feat(scripts): added icon usage script 2026-08-31 17:54:23 +02:00
76 changed files with 1724 additions and 5521 deletions
+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"
-5
View File
@@ -30,11 +30,6 @@
- any-glob-to-any-file:
- 'icons/*.svg'
🔬 Lab icon:
- changed-files:
- any-glob-to-any-file:
- 'lab/*.svg'
# For changes in the lucide package
🧳 lucide package:
- changed-files:
+1 -1
View File
@@ -102,7 +102,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 }}
-1
View File
@@ -3,7 +3,6 @@ name: Lucide Lab checks
on:
pull_request:
paths:
- lab/**
- packages/lab/**
- packages/shared/**
- tools/build-icons/**
-146
View File
@@ -1,146 +0,0 @@
name: Release @lucide/lab
on:
push:
branches:
- main
paths:
- lab/**/*.svg
workflow_dispatch:
inputs:
release-type:
description: Release type
required: true
default: 'minor'
type: choice
options:
- patch
- minor
- major
permissions: {}
jobs:
create-release:
if: github.repository == 'lucide-icons/lucide'
runs-on: ubuntu-latest
permissions:
contents: write # Required to create the release and tag
outputs:
VERSION: ${{ steps.new-version.outputs.NEW_VERSION }}
SHOULD_RELEASE: ${{ steps.release-notes.outputs.SHOULD_RELEASE }}
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
fetch-depth: 0 # Required to diff the lab icons against the previous tag
- 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: Get latest tag
id: latest-tag
run: |
LATEST_TAG=$(git tag --list '@lucide/lab@*' --sort=-v:refname | head -n 1)
if [ -z "$LATEST_TAG" ]; then
echo "::error::No @lucide/lab@* tag found to release from."
exit 1
fi
echo "Latest tag: $LATEST_TAG"
echo "LATEST_TAG=$LATEST_TAG" >> $GITHUB_OUTPUT
- name: Create new version
id: new-version
run: |
NEW_VERSION=$(pnpm semver "${LATEST_TAG#@lucide/lab@}" -i "$RELEASE_TYPE")
echo "New version: $NEW_VERSION"
echo "NEW_VERSION=$NEW_VERSION" >> $GITHUB_OUTPUT
env:
LATEST_TAG: ${{ steps.latest-tag.outputs.LATEST_TAG }}
RELEASE_TYPE: ${{ inputs.release-type || 'minor' }}
- name: Generate release notes
id: release-notes
run: |
NEW_TAG="@lucide/lab@$NEW_VERSION"
ADDED=$(git diff --name-only --diff-filter=A "$LATEST_TAG" HEAD -- 'lab/*.svg' \
| xargs -r -n1 basename | sed 's/\.svg$//' | sort)
REMOVED=$(git diff --name-only --diff-filter=D "$LATEST_TAG" HEAD -- 'lab/*.svg' \
| xargs -r -n1 basename | sed 's/\.svg$//' | sort)
if [ -z "$ADDED" ] && [ "$EVENT_NAME" != 'workflow_dispatch' ]; then
echo "::notice::No icons were added to ./lab since $LATEST_TAG, skipping release."
echo "SHOULD_RELEASE=false" >> $GITHUB_OUTPUT
exit 0
fi
{
if [ -n "$ADDED" ]; then
printf '## New icons\n\n'
printf '%s\n' "$ADDED" | sed 's|.*|- `&`|'
printf '\n'
fi
if [ -n "$REMOVED" ]; then
printf '## Removed icons\n\nThese graduated to the core icon set.\n\n'
printf '%s\n' "$REMOVED" | sed 's|.*|- `&`|'
printf '\n'
fi
printf '**Full changelog**: https://github.com/lucide-icons/lucide/compare/%s...%s\n' "$LATEST_TAG" "$NEW_TAG"
} > lab-release-notes.md
cat lab-release-notes.md
echo "SHOULD_RELEASE=true" >> $GITHUB_OUTPUT
env:
LATEST_TAG: ${{ steps.latest-tag.outputs.LATEST_TAG }}
NEW_VERSION: ${{ steps.new-version.outputs.NEW_VERSION }}
EVENT_NAME: ${{ github.event_name }}
- name: Create Release
if: steps.release-notes.outputs.SHOULD_RELEASE == 'true'
uses: softprops/action-gh-release@efb35369e0ad2afab669f228072c1b0d510eae64 # v3.0.3
with:
tag_name: '@lucide/lab@${{ steps.new-version.outputs.NEW_VERSION }}'
name: '@lucide/lab@${{ steps.new-version.outputs.NEW_VERSION }}'
body_path: lab-release-notes.md
make_latest: 'false' # Never displace the core icon release as "Latest"
publish:
if: github.repository == 'lucide-icons/lucide' && needs.create-release.outputs.SHOULD_RELEASE == 'true'
runs-on: ubuntu-latest
needs: create-release
permissions:
id-token: write # Required for OIDC (npm provenance)
contents: read
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
- 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: Set new version
run: pnpm version ${{ needs.create-release.outputs.VERSION }} --filter @lucide/lab --fail-if-no-match --no-git-tag-version
- name: Build
run: pnpm --filter @lucide/lab build
- name: Publish
run: pnpm --filter @lucide/lab publish --access public --no-git-checks --ignore-scripts --tag latest
env:
NPM_CONFIG_PROVENANCE: true
+1 -1
View File
@@ -169,7 +169,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
@@ -3,7 +3,7 @@
.next
.obsidian
.now
.idea
.cache
.env
node_modules
dist
+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.41"
}
}
File diff suppressed because one or more lines are too long
-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

-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

+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

-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

-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

+2 -2
View File
@@ -9,6 +9,6 @@
stroke-linecap="round"
stroke-linejoin="round"
>
<path d="M11 20a10 10 0 0010-10 25.9 25.9 0 00-1.04-7.281 1 1 0 00-1.755-.325C15.833 5.5 13 5.5 9.8 6.1A7 7 0 0011 20" />
<path d="M2 21a5 5 0 012.911-4.544C7.613 15.212 8.351 15.24 11 13" />
<path d="M11 20A7 7 0 0 1 9.8 6.1C15.5 5 17 4.48 19 2c1 2 2 4.18 2 8 0 5.5-4.78 10-10 10Z" />
<path d="M2 21c0-3 1.85-5.36 5.08-6C9.5 14.52 12 13 13 12" />
</svg>

Before

Width:  |  Height:  |  Size: 404 B

After

Width:  |  Height:  |  Size: 368 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

-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

-6
View File
@@ -8,15 +8,9 @@
"use-cases": [],
"tags": [
"tv",
"computer",
"screen",
"display",
"desktop",
"external display",
"screen sharing",
"connected",
"success",
"verified",
"running",
"active",
"virtual machine",
+4 -7
View File
@@ -9,12 +9,6 @@
],
"use-cases": [],
"tags": [
"tv",
"computer",
"screen",
"display",
"desktop",
"external display",
"virtual machine",
"virtual desktop",
"vm",
@@ -26,7 +20,10 @@
"software as a service",
"saas",
"workstation",
"environment"
"environment",
"tv",
"screen",
"display"
],
"categories": [
"connectivity",
+1 -3
View File
@@ -8,15 +8,13 @@
"use-cases": [],
"tags": [
"tv",
"computer",
"screen",
"display",
"desktop",
"external display",
"virtual machine",
"vm",
"executable",
"settings",
"cog",
"edit",
"gear",
"configuration",
-6
View File
@@ -8,15 +8,9 @@
"use-cases": [],
"tags": [
"tv",
"computer",
"screen",
"display",
"desktop",
"external display",
"screen sharing",
"status",
"notification",
"indicator",
"running",
"active",
"virtual machine",
+1 -6
View File
@@ -8,15 +8,10 @@
"use-cases": [],
"tags": [
"tv",
"computer",
"screen",
"display",
"desktop",
"external display",
"screen sharing",
"download",
"remote",
"cast"
"download"
],
"categories": [
"connectivity",
+1 -11
View File
@@ -7,17 +7,7 @@
],
"use-cases": [],
"tags": [
"tv",
"computer",
"screen",
"display",
"desktop",
"external display",
"screen sharing",
"offline",
"disabled",
"disconnected",
"power"
"share"
],
"categories": [
"connectivity",
-4
View File
@@ -8,16 +8,12 @@
"use-cases": [],
"tags": [
"tv",
"computer",
"screen",
"display",
"desktop",
"external display",
"screen sharing",
"video",
"movie",
"film",
"pause",
"suspend",
"hibernate",
"boot",
-4
View File
@@ -8,16 +8,12 @@
"use-cases": [],
"tags": [
"tv",
"computer",
"screen",
"display",
"desktop",
"external display",
"screen sharing",
"video",
"movie",
"film",
"play",
"running",
"start",
"boot",
+4 -12
View File
@@ -6,25 +6,17 @@
"jguddas",
"ericfennis"
],
"use-cases": [
"Showing synchronization between desktop and mobile devices",
"Representing responsive previews across screen sizes",
"Indicating casting or screen sharing to a display"
],
"use-cases": [],
"tags": [
"smartphone",
"phone",
"cellphone",
"device",
"mobile",
"desktop",
"screen",
"display",
"external display",
"screen sharing",
"monitor",
"responsive",
"screens",
"sync",
"cast"
"screens"
],
"categories": [
"connectivity",
+2 -11
View File
@@ -6,18 +6,9 @@
],
"use-cases": [],
"tags": [
"tv",
"computer",
"screen",
"display",
"desktop",
"external display",
"devices",
"connect",
"cast",
"audio",
"sound",
"volume",
"presentation"
"cast"
],
"categories": [
"connectivity",
-3
View File
@@ -8,12 +8,9 @@
"use-cases": [],
"tags": [
"tv",
"computer",
"screen",
"display",
"desktop",
"external display",
"screen sharing",
"video",
"movie",
"film",
+1 -5
View File
@@ -8,16 +8,12 @@
"use-cases": [],
"tags": [
"tv",
"computer",
"screen",
"display",
"desktop",
"external display",
"upload",
"connect",
"remote",
"screen sharing",
"cast"
"screen share"
],
"categories": [
"connectivity",
-6
View File
@@ -8,18 +8,12 @@
"use-cases": [],
"tags": [
"tv",
"computer",
"screen",
"display",
"desktop",
"external display",
"screen sharing",
"virtual machine",
"vm",
"close",
"error",
"failed",
"disconnected",
"stop",
"suspend",
"remove",
+1 -9
View File
@@ -7,19 +7,11 @@
"jguddas",
"karsa-mistmere"
],
"use-cases": [
"Representing desktop displays and computer monitors",
"Showing screen-sharing or external display settings",
"Indicating virtual machines in infrastructure dashboards"
],
"use-cases": [],
"tags": [
"tv",
"computer",
"desktop",
"screen",
"display",
"external display",
"screen sharing",
"virtual machine",
"vm"
],
-35
View File
@@ -1,35 +0,0 @@
{
"$schema": "../icon.schema.json",
"contributors": [
"ajay199210",
"jguddas",
"ericfennis",
"karsa-mistmere"
],
"use-cases": [
"Removing products from a shopping cart",
"Updating order contents in ecommerce apps",
"Indicating fewer items in a purchase"
],
"tags": [
"trolley",
"cart",
"basket",
"e-commerce",
"ecommerce",
"store",
"purchase",
"products",
"items",
"checkout",
"order",
"retail",
"remove",
"decrease",
"quantity",
"subtract"
],
"categories": [
"shopping"
]
}
-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="M16 5h6" />
<path d="m2.05 2.05 1.099-.028a1 1 0 011.008.815l2.69 14.347A1 1 0 007.83 18H18" />
<path d="M4.564 5H12" />
<path d="M6.25 14h12.712a2 2 0 001.991-1.57l.514-3.113" />
<circle cx="18" cy="20" r="2" />
<circle cx="8" cy="20" r="2" />
</svg>

Before

Width:  |  Height:  |  Size: 474 B

-35
View File
@@ -1,35 +0,0 @@
{
"$schema": "../icon.schema.json",
"contributors": [
"ajay199210",
"jguddas",
"ericfennis",
"karsa-mistmere"
],
"use-cases": [
"Adding products to a shopping cart",
"Saving products for purchase in ecommerce apps",
"Confirming items were added to an order"
],
"tags": [
"trolley",
"cart",
"basket",
"e-commerce",
"ecommerce",
"store",
"purchase",
"products",
"items",
"checkout",
"order",
"retail",
"add",
"increase",
"quantity",
"buy"
],
"categories": [
"shopping"
]
}
-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="M16 5h6" />
<path d="M19 2v6" />
<path d="m2.05 2.05 1.099-.028a1 1 0 011.008.815l2.69 14.347A1 1 0 007.83 18H18" />
<path d="M4.564 5H12" />
<path d="M6.25 14h12.712a2 2 0 001.991-1.57l.172-1.041" />
<circle cx="18" cy="20" r="2" />
<circle cx="8" cy="20" r="2" />
</svg>

Before

Width:  |  Height:  |  Size: 497 B

-36
View File
@@ -1,36 +0,0 @@
{
"$schema": "../icon.schema.json",
"contributors": [
"karsa-mistmere",
"jguddas"
],
"use-cases": [
"Indicating shellfish allergen information",
"Marking seafood-free items on a menu"
],
"tags": [
"marine",
"creature",
"fisherman",
"ocean",
"fresh",
"cuisine",
"marine-life",
"seafood",
"shellfish",
"crustacean",
"prawn",
"scallop",
"whelk",
"arthropod",
"littleneck",
"quahog",
"allergy",
"intolerance",
"diet"
],
"categories": [
"animals",
"food-beverage"
]
}
-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="M10 2a3.28 3.28 0 003.227 1.798l6.17-.561A1 1 0 1119.614 8H13.5" />
<path d="M11 20c-.5.5-1.12 1-2.5 1a1 1 0 010-5H12a7 7 0 003.283-.817" />
<path d="M11 22c-.5-.5-1.12-1-2.5-1a6.5 6.5 0 01-5.63-3.25 6.44 6.44 0 015.236-9.744" />
<path d="M18.04 12.54A7 7 0 0019 9V8" />
<path d="m2 2 20 20" />
<path d="M8 16c-2 0-4.5-4-4-6" />
<path d="M9.43 9.33A8.5 8.5 0 0010 16" />
</svg>

Before

Width:  |  Height:  |  Size: 602 B

+2 -9
View File
@@ -14,16 +14,9 @@
"arthropod",
"littleneck",
"quahog",
"marine",
"creature",
"fisherman",
"ocean",
"fresh",
"cuisine",
"marine-life"
"cherrystone"
],
"categories": [
"animals",
"food-beverage"
"animals"
]
}
+5 -5
View File
@@ -9,9 +9,9 @@
stroke-linecap="round"
stroke-linejoin="round"
>
<path d="M10 2a3.28 3.28 0 003.227 1.798l6.17-.561A1 1 0 1119.614 8H8.5a6.44 6.44 0 00-5.63 9.75A6.5 6.5 0 008.5 21c1.38 0 2-.5 2.5-1" />
<path d="M10 8a8.5 8.5 0 000 8" />
<path d="M11 22c-.5-.5-1.12-1-2.5-1a1 1 0 010-5H12a7 7 0 007-7V8" />
<path d="M13 12h.01" />
<path d="M8 16c-2 0-4.5-4-4-6" />
<path d="M11 12h.01" />
<path d="M13 22c.5-.5 1.12-1 2.5-1-1.38 0-2-.5-2.5-1" />
<path d="M14 2a3.28 3.28 0 0 1-3.227 1.798l-6.17-.561A2.387 2.387 0 1 0 4.387 8H15.5a1 1 0 0 1 0 13 1 1 0 0 0 0-5H12a7 7 0 0 1-7-7V8" />
<path d="M14 8a8.5 8.5 0 0 1 0 8" />
<path d="M16 16c2 0 4.5-4 4-6" />
</svg>

Before

Width:  |  Height:  |  Size: 518 B

After

Width:  |  Height:  |  Size: 507 B

+2 -11
View File
@@ -5,21 +5,12 @@
"mittalyashu",
"ericfennis"
],
"use-cases": [
"Representing mobile phones in device settings",
"Showing mobile access or app availability",
"Indicating phone-based communication channels"
],
"use-cases": [],
"tags": [
"phone",
"cellphone",
"device",
"mobile",
"screen",
"display",
"touchscreen",
"portable",
"responsive"
"screen"
],
"categories": [
"connectivity",
-31
View File
@@ -1,31 +0,0 @@
{
"$schema": "../icon.schema.json",
"contributors": [
"viralcodex",
"colebemis",
"ericfennis"
],
"use-cases": [
"Indicating application or system warnings or alerts",
"Highlighting important notifications that require user attention",
"Representing caution states for different components or elements",
"Marking validation errors, invalid input or configuration issues",
"Displaying diagnostic or troubleshooting information"
],
"tags": [
"warning",
"alert",
"danger",
"exclamation mark",
"rectangle",
"square",
"notification",
"attention",
"important",
"caution"
],
"categories": [
"notifications",
"shapes"
]
}
+3 -14
View File
@@ -3,24 +3,13 @@
"contributors": [
"danielbayley"
],
"use-cases": [
"Previewing layouts across mobile device sizes",
"Testing responsive behavior on handheld screens",
"Representing mobile-first design workflows"
],
"use-cases": [],
"tags": [
"phone",
"cellphone",
"device",
"mobile",
"screen",
"display",
"touchscreen",
"portable",
"responsive",
"screens",
"browser",
"testing"
"testing",
"mobile"
],
"categories": [
"devices",
+2 -11
View File
@@ -4,18 +4,9 @@
"colebemis",
"ericfennis"
],
"use-cases": [
"Representing tablet devices in responsive layouts",
"Showing touch-based interfaces on larger mobile screens"
],
"use-cases": [],
"tags": [
"device",
"mobile",
"screen",
"display",
"touchscreen",
"portable",
"responsive"
"device"
],
"categories": [
"devices"
+20
View File
@@ -0,0 +1,20 @@
{
"$schema": "../icon.schema.json",
"contributors": [
"colebemis",
"csandman",
"ericfennis",
"karsa-mistmere"
],
"use-cases": [],
"tags": [
"garbage",
"delete",
"remove",
"bin"
],
"categories": [
"files",
"mail"
]
}
@@ -9,7 +9,9 @@
stroke-linecap="round"
stroke-linejoin="round"
>
<rect width="18" height="18" x="3" y="3" rx="2" />
<line x1="12" x2="12" y1="8" y2="12" />
<line x1="12" x2="12.01" y1="16" y2="16" />
<path d="M10 11v6" />
<path d="M14 11v6" />
<path d="M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6" />
<path d="M3 6h18" />
<path d="M8 6V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2" />
</svg>

Before

Width:  |  Height:  |  Size: 349 B

After

Width:  |  Height:  |  Size: 389 B

-7
View File
@@ -26,12 +26,5 @@
"categories": [
"files",
"mail"
],
"aliases": [
{
"name": "trash-2",
"deprecated": true,
"deprecationReason": "alias.duplicate"
}
]
}
-2
View File
@@ -9,8 +9,6 @@
stroke-linecap="round"
stroke-linejoin="round"
>
<path d="M10 11v6" />
<path d="M14 11v6" />
<path d="M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6" />
<path d="M3 6h18" />
<path d="M8 6V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2" />

Before

Width:  |  Height:  |  Size: 389 B

After

Width:  |  Height:  |  Size: 341 B

-45
View File
@@ -1,45 +0,0 @@
{
"$schema": "../icon.schema.json",
"contributors": [
"karsa-mistmere"
],
"use-cases": [
"Indicating no malware threats in security tools",
"Showing cleared infections in healthcare apps",
"Marking reduced infection risk in health dashboards",
"Representing blocked pathogens in science content"
],
"tags": [
"pathogen",
"infection",
"disease",
"illness",
"contagion",
"outbreak",
"pandemic",
"epidemic",
"covid",
"coronavirus",
"germ",
"microbe",
"microorganism",
"biology",
"medical",
"healthcare",
"malware",
"cybersecurity",
"threat",
"antivirus",
"blocked",
"removed",
"clean",
"safe",
"prevention",
"quarantine"
],
"categories": [
"medical",
"science",
"security"
]
}
-32
View File
@@ -1,32 +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.01 10h.01" />
<path d="M12 14.991h.01" />
<path d="M12 22v-3" />
<path d="M12 2v3" />
<path d="M13 22h-2" />
<path d="M13 2h-2" />
<path d="m16.5 19.794-1-1.733" />
<path d="m16.5 4.205-1 1.732" />
<path d="M18.891 13.235a7 7 0 00-8.126-8.126" />
<path d="m19.794 7.5-1.732 1" />
<path d="M2 12h3" />
<path d="M2 13v-2" />
<path d="m2 2 20 20" />
<path d="M22 12h-3" />
<path d="M22 13v-2" />
<path d="m4.206 16.5 1.732-1" />
<path d="m4.206 7.5 1.732 1" />
<path d="M7.05 7.05a7 7 0 009.9 9.9" />
<path d="m7.5 19.794 1-1.733" />
<path d="M9 12h.01" />
</svg>

Before

Width:  |  Height:  |  Size: 815 B

-38
View File
@@ -1,38 +0,0 @@
{
"$schema": "../icon.schema.json",
"contributors": [
"karsa-mistmere"
],
"use-cases": [
"Representing viral infections in healthcare apps",
"Indicating malware threats in security tools",
"Showing disease outbreaks in public health dashboards",
"Labeling pathogens in biology or science content"
],
"tags": [
"pathogen",
"infection",
"disease",
"illness",
"contagion",
"outbreak",
"pandemic",
"epidemic",
"covid",
"coronavirus",
"germ",
"microbe",
"microorganism",
"biology",
"medical",
"healthcare",
"malware",
"cybersecurity",
"threat"
],
"categories": [
"medical",
"science",
"security"
]
}
-32
View File
@@ -1,32 +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 14.991h.01" />
<path d="M12 22v-3" />
<path d="M12 2v3" />
<path d="M13 22h-2" />
<path d="M13 2h-2" />
<path d="M13.99 10H14" />
<path d="m16.5 19.794-1-1.733" />
<path d="m16.5 4.205-1 1.732" />
<path d="m19.794 16.5-1.732-1" />
<path d="m19.794 7.5-1.732 1" />
<path d="M2 12h3" />
<path d="M2 13v-2" />
<path d="M22 12h-3" />
<path d="M22 13v-2" />
<path d="m4.206 16.5 1.732-1" />
<path d="m4.206 7.5 1.732 1" />
<path d="m7.5 19.794 1-1.733" />
<path d="m7.5 4.205 1 1.732" />
<path d="M9 12h.01" />
<circle cx="12" cy="12" r="7" />
</svg>

Before

Width:  |  Height:  |  Size: 800 B

-41
View File
@@ -1,41 +0,0 @@
{
"$schema": "../icon.schema.json",
"contributors": [
"briz123",
"UsamaKhan",
"ajokt123",
"timmy471",
"jguddas",
"karsa-mistmere"
],
"use-cases": [
"Representing coaches or referees in sports apps",
"Signaling alerts in training interfaces",
"Indicating traffic control or public safety roles",
"Marking lifeguard equipment in safety systems"
],
"tags": [
"alert",
"signal",
"sound",
"blow",
"noise",
"coach",
"trainer",
"referee",
"gym",
"game",
"training",
"sports",
"traffic cops",
"police",
"lifeguard",
"safety",
"rescue",
"emergency"
],
"categories": [
"sports",
"notifications"
]
}
-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="M10 6v4" />
<path d="M21 6a1 1 0 0 1 1 1v2a1 1 0 0 1-1 1h-5.675A7 7 0 1 1 9 6z" />
</svg>

Before

Width:  |  Height:  |  Size: 304 B

+6 -6
View File
@@ -9,13 +9,13 @@
stroke-linecap="round"
stroke-linejoin="round"
>
<path d="M14 11h-2a2 2 0 01-1.73-3 2 2 0 010-2A2 2 0 0112 3h2" />
<path d="M14 2v9.35a4 4 0 01-.205 1.266l-.59 1.768A4 4 0 0013 15.65V22" />
<rect width="4" height="4" x="2" y="3" />
<path d="M6 7v2c0 .6.1 1.4.2 2L8 20.8v.2c0 .6-.4 1-1 1H3c-.6 0-1-.4-1-1V7" />
<path d="M14 2v7l-2 5v8" />
<rect width="4" height="6" x="10" y="3" />
<path d="M18 6h4" />
<path d="M18 10h4" />
<path d="M18 14h4" />
<path d="M18 18h4" />
<path d="M18 2h2a2 2 0 012 2v16a2 2 0 01-2 2h-2" />
<path d="M18 6h4" />
<path d="M2 3a1 1 0 011-1h2a1 1 0 011 1v6c0 .6.1 1.4.2 2L8 20.8v.2a1 1 0 01-1 1H3a1 1 0 01-1-1z" />
<path d="M2 6h4" />
<path d="M18 2h2a2 2 0 0 1 2 2v16a2 2 0 0 1-2 2h-2" />
</svg>

Before

Width:  |  Height:  |  Size: 626 B

After

Width:  |  Height:  |  Size: 559 B

+1
View File
@@ -26,6 +26,7 @@
"generate:sponsors": "node scripts/updateSponsors.mts",
"generate:contributors": "node ./scripts/updateContributors.mts icons/*.svg",
"generate:nextJSAliases": "node ./scripts/generateNextJSAliases.mts",
"icon-usage": "node ./scripts/iconUsage.mts",
"suggest:metadata": "node ./scripts/suggestMetaData.mts",
"suggest:metadata:watch": "node --env-file .env --watch ./scripts/suggestMetaData.mts",
"postinstall": "husky install",
+2 -1
View File
@@ -36,7 +36,8 @@
"build:icons": "build-icons --input=../../lab --output=./src --templateSrc=./scripts/exportTemplate.mts --iconFileExtension=.ts --exportModuleNameCasing=camel --renderUniqueKey --exportFileName=index.ts",
"build:lib": "node ./scripts/buildLib.mts",
"build:bundle": "rollup -c rollup.config.mjs",
"clean": "rm -f src/icons/*.ts && rm -rf dist && rm -rf icons && rm -f icon-nodes.json"
"clean": "rm -f src/icons/*.ts && rm -rf dist && rm -rf icons && rm -f icon-nodes.json",
"version": "pnpm version --git-tag-version=false"
},
"devDependencies": {
"@lucide/build-icons": "workspace:*",
+2 -2
View File
@@ -47,12 +47,12 @@
"@testing-library/jest-dom": "^6.9.1",
"@testing-library/vue": "^8.1.0",
"@vitejs/plugin-vue": "^6.0.8",
"@vue/test-utils": "2.5.0",
"@vue/test-utils": "2.4.11",
"rollup": "^4.62.2",
"rollup-plugin-dts": "^6.4.1",
"typescript": "^5.9.3",
"vite": "^7.3.6",
"vue": "^3.5.42"
"vue": "^3.5.41"
},
"peerDependencies": {
"vue": ">=3.0.1"
+157 -151
View File
@@ -130,22 +130,22 @@ importers:
dependencies:
'@floating-ui/vue':
specifier: ^1.1.11
version: 1.1.11(vue@3.5.42(typescript@6.0.3))
version: 1.1.11(vue@3.5.41(typescript@6.0.3))
'@headlessui/vue':
specifier: ^1.7.23
version: 1.7.23(vue@3.5.42(typescript@6.0.3))
version: 1.7.23(vue@3.5.41(typescript@6.0.3))
'@lucide/vue':
specifier: workspace:*
version: link:../packages/vue
'@vueuse/components':
specifier: ^14.3.0
version: 14.3.0(vue@3.5.42(typescript@6.0.3))
version: 14.3.0(vue@3.5.41(typescript@6.0.3))
'@vueuse/core':
specifier: ^14.3.0
version: 14.3.0(vue@3.5.42(typescript@6.0.3))
version: 14.3.0(vue@3.5.41(typescript@6.0.3))
'@vueuse/integrations':
specifier: ^14.3.0
version: 14.3.0(focus-trap@7.8.0)(fuse.js@7.5.0)(vue@3.5.42(typescript@6.0.3))
version: 14.3.0(focus-trap@7.8.0)(fuse.js@7.5.0)(vue@3.5.41(typescript@6.0.3))
element-to-path:
specifier: ^1.2.1
version: 1.2.1
@@ -166,7 +166,7 @@ importers:
version: link:../packages/lucide-react
motion-v:
specifier: 1.10.3
version: 1.10.3(@vueuse/core@14.3.0(vue@3.5.42(typescript@6.0.3)))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(vue@3.5.42(typescript@6.0.3))
version: 1.10.3(@vueuse/core@14.3.0(vue@3.5.41(typescript@6.0.3)))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(vue@3.5.41(typescript@6.0.3))
react:
specifier: 18.2.0
version: 18.2.0
@@ -175,10 +175,10 @@ importers:
version: 18.2.0(react@18.2.0)
sandpack-vue3:
specifier: 3.1.12
version: 3.1.12(vue@3.5.42(typescript@6.0.3))
version: 3.1.12(vue@3.5.41(typescript@6.0.3))
vue:
specifier: ^3.5.42
version: 3.5.42(typescript@6.0.3)
specifier: ^3.5.41
version: 3.5.41(typescript@6.0.3)
devDependencies:
'@lucide/build-icons':
specifier: workspace:*
@@ -738,13 +738,13 @@ importers:
version: 6.9.1
'@testing-library/vue':
specifier: ^8.1.0
version: 8.1.0(@vue/compiler-dom@3.5.42)(@vue/compiler-sfc@3.5.42)(@vue/server-renderer@3.5.42)(vue@3.5.42(typescript@5.9.3))
version: 8.1.0(@vue/compiler-dom@3.5.41)(@vue/compiler-sfc@3.5.41)(@vue/server-renderer@3.5.41)(vue@3.5.41(typescript@5.9.3))
'@vitejs/plugin-vue':
specifier: ^6.0.8
version: 6.0.8(vite@7.3.6(@types/node@26.1.1)(jiti@2.7.0)(less@4.6.7)(sass@1.101.0)(stylus@0.56.0(supports-color@10.2.2))(terser@5.49.0)(yaml@2.9.0))(vue@3.5.42(typescript@5.9.3))
version: 6.0.8(vite@7.3.6(@types/node@26.1.1)(jiti@2.7.0)(less@4.6.7)(sass@1.101.0)(stylus@0.56.0(supports-color@10.2.2))(terser@5.49.0)(yaml@2.9.0))(vue@3.5.41(typescript@5.9.3))
'@vue/test-utils':
specifier: 2.5.0
version: 2.5.0(@vue/compiler-dom@3.5.42)(@vue/server-renderer@3.5.42)(vue@3.5.42(typescript@5.9.3))
specifier: 2.4.11
version: 2.4.11(@vue/compiler-dom@3.5.41)(@vue/server-renderer@3.5.41)(vue@3.5.41(typescript@5.9.3))
rollup:
specifier: ^4.62.2
version: 4.62.2
@@ -758,8 +758,8 @@ importers:
specifier: ^7.3.6
version: 7.3.6(@types/node@26.1.1)(jiti@2.7.0)(less@4.6.7)(sass@1.101.0)(stylus@0.56.0(supports-color@10.2.2))(terser@5.49.0)(yaml@2.9.0)
vue:
specifier: ^3.5.42
version: 3.5.42(typescript@5.9.3)
specifier: ^3.5.41
version: 3.5.41(typescript@5.9.3)
tools/build-font:
dependencies:
@@ -3836,8 +3836,8 @@ packages:
'@octokit/types@9.3.2':
resolution: {integrity: sha512-D4iHGTdAnEEVsB8fl95m1hiz7D5YiRdQ9b/OEb3BYRVwbLsGHcRVPz+u+BgRLNk0Q0/4iZCBqDN96j2XNxfXrA==}
'@one-ini/wasm@0.2.1':
resolution: {integrity: sha512-TUqERXGNTifZ9y2g3wPxQrw3HpHv/02DsW3D90T9x0hhonrL1ZqpSmNrU2XkoIq0fP1N6gZfVQzy2Fw1ZvGBNg==}
'@one-ini/wasm@0.1.1':
resolution: {integrity: sha512-XuySG1E38YScSJoMlqovLru4KTUNSjgVTIjyh7qMX6aNN5HY5Ct5LhRJdxO79JtTzKfzV/bnWpz+zquYrISsvw==}
'@open-draft/deferred-promise@2.2.0':
resolution: {integrity: sha512-CecwLWx3rhxVQF6V4bAgPS5t+So2sTbPgAzafKkVizyi7tlwpcFpdFqq+wqF2OwNBmqFuu6tOyouTuxgpMfzmA==}
@@ -5283,17 +5283,17 @@ packages:
'@vscode/l10n@0.0.18':
resolution: {integrity: sha512-KYSIHVmslkaCDyw013pphY+d7x1qV8IZupYfeIfzNA+nsaWHbn5uPuQRvdRFsa9zFzGeudPuoGoZ1Op4jrJXIQ==}
'@vue/compiler-core@3.5.42':
resolution: {integrity: sha512-2Ye1ilMtKXxl8qZUrQ5j0CdgenFp/HFQmta6rfRyfEsTG69L6Wk+tWuNoHYHMx9E8tF2Slvdg1FuwDvAXdy1LQ==}
'@vue/compiler-core@3.5.41':
resolution: {integrity: sha512-q0Xtv/F9w2YO/7htQhtiL+Ev2WCJbe5N2hc+XfgyKkEKqWpSxknmT8QOuGdEKNdjPq0c3F7rNpFkTo3Kfrm7pg==}
'@vue/compiler-dom@3.5.42':
resolution: {integrity: sha512-qbhQZEFmycr+ni/qyuccS4sucNN7VAbDfbkvNxWOX2VfgFm90MNs3/UhRNKoPMEIVn0F8gdlYjLPvqxHwHeQOA==}
'@vue/compiler-dom@3.5.41':
resolution: {integrity: sha512-oKacVfNglLvGjnS6BXOlGL7EyG2h8X03pqXCjzotRZUaXGjbrTJUnVAQjrCqUnS+lyu31nwQjZY/d817GmCnfw==}
'@vue/compiler-sfc@3.5.42':
resolution: {integrity: sha512-fkCAFB4okcAANGMThboWnScp/gzWjU0ZSkVnjTIiplmMDq2uq0tIB3j+xVu4rhv5rvOgBySCysudmbMd6xRRqw==}
'@vue/compiler-sfc@3.5.41':
resolution: {integrity: sha512-XJhip7R2wy6vX3knCxdZN4KracFaZUef58s1KYewqluedHIJaPIVfXoYT7MF1F8nCvv6k8bWWxDC8opMkg1VTQ==}
'@vue/compiler-ssr@3.5.42':
resolution: {integrity: sha512-xmLk3wLkbizPAiLyomjgFFosf2ys9b5Ghb+oh/k2tnvipNz8OFrQOiTcWCzyK7MpBp9KkyGtfvgfLUivbmuGYA==}
'@vue/compiler-ssr@3.5.41':
resolution: {integrity: sha512-U3v5OejKEGqOI0Wy0+Sz7hGuIFZHA4LSXzrNM3IMIeDyJEBBfTpX26n3SDgToRpP2bLc9FfI2j/kSgcJ8Emq5A==}
'@vue/devtools-api@7.7.10':
resolution: {integrity: sha512-KxtEpUOOpFz/qOGRrAwA36QF7DqIA+FXgCYit9mk9wjbaZt0sXOFz81ElOZtKA4HbWHUdwNjZHBFsFFyp5BZiA==}
@@ -5304,26 +5304,26 @@ packages:
'@vue/devtools-shared@7.7.10':
resolution: {integrity: sha512-wOPslzB8vTvpxwdaOcR2qAbwmuSP0L+rhpoC6Cf56V3Jip+HWb7PQQXOUPgBNQARpXsbQX/+mvi8kKucmBGRwQ==}
'@vue/reactivity@3.5.42':
resolution: {integrity: sha512-TzNNfKpb7hDxbQltwAut8VDQA5YP+BuRlxntHUuRjyKwlMvmAPbs3unhCvieijifY6vFfVBwsS7wG/C7uq+bEQ==}
'@vue/reactivity@3.5.41':
resolution: {integrity: sha512-rznsqKM0np0x18EjzF8x88MpEhdNsffbvFbckLL5+oUKz1BxAImEmO7J1ArRYSyo6aQaVoBDp7jEkT91OOxydA==}
'@vue/runtime-core@3.5.42':
resolution: {integrity: sha512-9uACtuHs7vJGkm5Bp3xu4xRDLFTIYy5DgxpToVjqGIAhAEKwQfsaLvKINhM6nFVp6bZPRFGdDqd1g52MqKsotA==}
'@vue/runtime-core@3.5.41':
resolution: {integrity: sha512-Vcry58hiAKwGen9Z1jUZE0feFsNArPCMOImYI8el48A9Idf6DuQYD0U05zZIF2Iad1hGhPSvcbBbAOhNr55fhg==}
'@vue/runtime-dom@3.5.42':
resolution: {integrity: sha512-rsCmhiWLaRxGltLwhlCWyYkFn7WAbKRh0q17eZ1A6Dq6eqc2ACQ61IIryxz0LrsvCzHSilLA9JHovVwM8CNE2g==}
'@vue/runtime-dom@3.5.41':
resolution: {integrity: sha512-3vVBahVBS9+U6cmXBLyb8nE6/yYo4J/CGI9eVFs3KiMc0YHuudwKyShTD65jtJy/L9PUUxNAFu4cj4LiJ0UFbw==}
'@vue/server-renderer@3.5.42':
resolution: {integrity: sha512-2++5dUyYS4gvo7xQXSECUDhB7TS0aOl5SeVfC5qSq1Jgfhjvegw1zqhwTIR3imZ+QYPJQw9gfcFvXGAjGZ7ajQ==}
'@vue/server-renderer@3.5.41':
resolution: {integrity: sha512-n6hx/pNFfbD6SuyeuMVkvqox8bwf/ET9JlA/kAz/imw8sw++wkqKe2mHX5KutjPpbKE4Z56yTHszoOjGMI9igQ==}
'@vue/shared@3.5.39':
resolution: {integrity: sha512-l1rrBtBfTnmxvtsvdQDXltUUy8S1Y+ZaqdfUzmAnJkTd8Z8rv5v/ytW+TKiqEOWyHPoqtPlNFSs0lhRmYVSHVA==}
'@vue/shared@3.5.42':
resolution: {integrity: sha512-2rPxex1jQf4jvl9MOHl6YaXCPcrNqz/FstMOEh3QWY+/OME9nQTvl9WYeCwhW7AFjaR0SnngZGlp/wkR6rkI6g==}
'@vue/shared@3.5.41':
resolution: {integrity: sha512-IOnwSCma8j+9xJT6b8H0dEYidC80NsYmNMlZxRsukYcSoGaDBohog5hDxzeUXdFeGWFA++vWvxqOmrr96VlqMA==}
'@vue/test-utils@2.5.0':
resolution: {integrity: sha512-6Clu5EKR/r6cDPYrKsu+8wenciWJJ3rhS9OEGsfDlZeZIhlJeEPGIZQHxE4lHRJCzPSq3EWMsFxQUqCvrbHQuQ==}
'@vue/test-utils@2.4.11':
resolution: {integrity: sha512-GDqaqZsA6m2E5vNzej0aYiIb6BX8xV9pNSbbbXKOfEYwg7ZNblVX8suyqmUBThq8VIrgAJNxn+z72hVtUeiWHA==}
peerDependencies:
'@vue/compiler-dom': 3.x
'@vue/server-renderer': 3.x
@@ -5453,6 +5453,10 @@ packages:
a-sync-waterfall@1.0.1:
resolution: {integrity: sha512-RYTOHHdWipFUliRFMCS4X2Yn2X8M87V/OpSqWzKKOGhzqyUxzyVmhHDH9sAvG+ZuQf/TAOFsLCpMw09I1ufUnA==}
abbrev@2.0.0:
resolution: {integrity: sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==}
engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0}
abbrev@3.0.1:
resolution: {integrity: sha512-AO2ac6pjRB3SJmGJo+v5/aK6Omggp6fsLrs6wN9bd35ulu4cCwaAU9+7ZhXjeqHVkaHThLuzH0nZr0YpCDhygg==}
engines: {node: ^18.17.0 || >=20.5.0}
@@ -5461,10 +5465,6 @@ packages:
resolution: {integrity: sha512-a1wflyaL0tHtJSmLSOVybYhy22vRih4eduhhrkcjgrWGnRfrZtovJ2FRjxuTtkkj47O/baf0R86QU5OuYpz8fA==}
engines: {node: ^20.17.0 || >=22.9.0}
abbrev@5.0.0:
resolution: {integrity: sha512-/XrFJgzQQQHpti1raDJC6m4ws6aNktmjBlhk8Fdlk7LwCEuDoieEJJY9OFHjfiFJFFRM2tK+Ky/IsfbbmlMu1w==}
engines: {node: ^22.22.2 || ^24.15.0 || >=26.0.0}
abort-controller@3.0.0:
resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==}
engines: {node: '>=6.5'}
@@ -6153,6 +6153,10 @@ packages:
comma-separated-tokens@2.0.3:
resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==}
commander@10.0.1:
resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==}
engines: {node: '>=14'}
commander@11.1.0:
resolution: {integrity: sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==}
engines: {node: '>=16'}
@@ -6676,9 +6680,9 @@ packages:
eastasianwidth@0.2.0:
resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==}
editorconfig@3.0.2:
resolution: {integrity: sha512-T0ix8GhtxyKVfUFEcvdNDt3YGqlwkFHbD4/5bgFUDgFmxhI/cSRAeJ87/Sz//Cq8Eam6JX/e23RkoFO71P7aAA==}
engines: {node: '>=20'}
editorconfig@1.0.7:
resolution: {integrity: sha512-e0GOtq/aTQhVdNyDU9e02+wz9oDDM+SIOQxWME2QRjzRX5yyLAuHDE+0aE8vHb9XRC8XD37eO2u57+F09JqFhw==}
engines: {node: '>=14'}
hasBin: true
ee-first@1.1.1:
@@ -7974,8 +7978,8 @@ packages:
jpeg-js@0.4.4:
resolution: {integrity: sha512-WZzeDOEtTOBK4Mdsar0IqEU5sMr3vSV2RqkAIzUEV2BHnUfKGyswWFPFwK5EeDo93K3FohSHbLAjj0s1Wzd+dg==}
js-beautify@2.0.3:
resolution: {integrity: sha512-cyFbh3tkPhknnTD/0bLf0T0yy2ZIbqL05mttzbt4y1Zfr7NxqXQZ62dkBLKs3oHH/lpjmDRAnciJiSUyOy8XwQ==}
js-beautify@1.15.4:
resolution: {integrity: sha512-9/KXeZUKKJwqCXUdBxFJ3vPh467OCckSBmYDwSK/EtV090K+iMJ7zx2S3HLVDIWFQdqMIsZWbnaGiba18aWhaA==}
engines: {node: '>=14'}
hasBin: true
@@ -8770,9 +8774,9 @@ packages:
resolution: {integrity: sha512-wRNIrw4DmVLKQlbgOMdkMx27Wrpzes2hh5Jtbi2bjPd+4wJstWIqP5A+lscnqbm0xxmT5Bpg8Lec5ItEBwx6BQ==}
engines: {node: '>=18'}
nopt@10.0.1:
resolution: {integrity: sha512-df3sBr/6ax9hSGuC3CspvLlbnX8cP5L5nZwXF8cGN8l0zSWR6BvzmQ6jPUKjvo6+/xdpkNvEcucBNUdBeeV13g==}
engines: {node: ^22.22.2 || ^24.15.0 || >=26.0.0}
nopt@7.2.1:
resolution: {integrity: sha512-taM24ViiimT/XntxbPyJQzCG+p4EKOpgD3mxFwW38mGjVUrfERQOeY4EDHjdnptttfHuHQXFx+lTP08Q+mLa/w==}
engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0}
hasBin: true
nopt@8.1.0:
@@ -10969,8 +10973,8 @@ packages:
'@vue/composition-api':
optional: true
vue@3.5.42:
resolution: {integrity: sha512-4RyHQTbQvOPs3MfvUO1Sg0YRrKNnA0mAVtvpd12Tg1fKDN7OHBUl1IqSn8zGJjK9nI3NkNp8cgTpVrSZC5TTcA==}
vue@3.5.41:
resolution: {integrity: sha512-2laE0p+aK+/AOPG/XL/WepOs/GlK755LJ1XECi9kDUrz1FKNw8rb2Xzlw9JS1rqEV55nb0ttsKxVlTCcd+R5cg==}
peerDependencies:
typescript: '*'
peerDependenciesMeta:
@@ -13544,11 +13548,11 @@ snapshots:
'@floating-ui/utils@0.2.12': {}
'@floating-ui/vue@1.1.11(vue@3.5.42(typescript@6.0.3))':
'@floating-ui/vue@1.1.11(vue@3.5.41(typescript@6.0.3))':
dependencies:
'@floating-ui/dom': 1.8.0
'@floating-ui/utils': 0.2.12
vue-demi: 0.14.10(vue@3.5.42(typescript@6.0.3))
vue-demi: 0.14.10(vue@3.5.41(typescript@6.0.3))
transitivePeerDependencies:
- '@vue/composition-api'
- vue
@@ -13558,10 +13562,10 @@ snapshots:
'@harperfast/extended-iterable@1.0.3':
optional: true
'@headlessui/vue@1.7.23(vue@3.5.42(typescript@6.0.3))':
'@headlessui/vue@1.7.23(vue@3.5.41(typescript@6.0.3))':
dependencies:
'@tanstack/vue-virtual': 3.13.32(vue@3.5.42(typescript@6.0.3))
vue: 3.5.42(typescript@6.0.3)
'@tanstack/vue-virtual': 3.13.32(vue@3.5.41(typescript@6.0.3))
vue: 3.5.41(typescript@6.0.3)
'@hono/node-server@1.19.14(hono@4.12.30)':
dependencies:
@@ -14621,7 +14625,7 @@ snapshots:
dependencies:
'@octokit/openapi-types': 18.1.1
'@one-ini/wasm@0.2.1': {}
'@one-ini/wasm@0.1.1': {}
'@open-draft/deferred-promise@2.2.0': {}
@@ -15430,10 +15434,10 @@ snapshots:
'@tanstack/virtual-core@3.17.4': {}
'@tanstack/vue-virtual@3.13.32(vue@3.5.42(typescript@6.0.3))':
'@tanstack/vue-virtual@3.13.32(vue@3.5.41(typescript@6.0.3))':
dependencies:
'@tanstack/virtual-core': 3.17.4
vue: 3.5.42(typescript@6.0.3)
vue: 3.5.41(typescript@6.0.3)
'@testing-library/dom@10.4.1':
dependencies:
@@ -15515,14 +15519,14 @@ snapshots:
vite: 7.3.6(@types/node@26.1.1)(jiti@2.7.0)(less@4.6.7)(sass@1.101.0)(stylus@0.56.0(supports-color@10.2.2))(terser@5.49.0)(yaml@2.9.0)
vitest: 4.1.10(@types/node@26.1.1)(@vitest/browser-playwright@4.1.10)(@vitest/coverage-v8@4.1.10)(@vitest/ui@4.1.10)(jsdom@27.4.0(supports-color@10.2.2))(vite@7.3.6(@types/node@26.1.1)(jiti@2.7.0)(less@4.6.7)(sass@1.101.0)(stylus@0.56.0(supports-color@10.2.2))(terser@5.49.0)(yaml@2.9.0))
'@testing-library/vue@8.1.0(@vue/compiler-dom@3.5.42)(@vue/compiler-sfc@3.5.42)(@vue/server-renderer@3.5.42)(vue@3.5.42(typescript@5.9.3))':
'@testing-library/vue@8.1.0(@vue/compiler-dom@3.5.41)(@vue/compiler-sfc@3.5.41)(@vue/server-renderer@3.5.41)(vue@3.5.41(typescript@5.9.3))':
dependencies:
'@babel/runtime': 7.29.7
'@testing-library/dom': 9.3.4
'@vue/test-utils': 2.5.0(@vue/compiler-dom@3.5.42)(@vue/server-renderer@3.5.42)(vue@3.5.42(typescript@5.9.3))
vue: 3.5.42(typescript@5.9.3)
'@vue/test-utils': 2.4.11(@vue/compiler-dom@3.5.41)(@vue/server-renderer@3.5.41)(vue@3.5.41(typescript@5.9.3))
vue: 3.5.41(typescript@5.9.3)
optionalDependencies:
'@vue/compiler-sfc': 3.5.42
'@vue/compiler-sfc': 3.5.41
transitivePeerDependencies:
- '@vue/compiler-dom'
- '@vue/server-renderer'
@@ -16069,16 +16073,16 @@ snapshots:
transitivePeerDependencies:
- supports-color
'@vitejs/plugin-vue@5.2.4(vite@7.3.6(@types/node@26.1.1)(jiti@2.7.0)(less@4.6.7)(sass@1.101.0)(stylus@0.56.0(supports-color@10.2.2))(terser@5.49.0)(yaml@2.9.0))(vue@3.5.42(typescript@6.0.3))':
'@vitejs/plugin-vue@5.2.4(vite@7.3.6(@types/node@26.1.1)(jiti@2.7.0)(less@4.6.7)(sass@1.101.0)(stylus@0.56.0(supports-color@10.2.2))(terser@5.49.0)(yaml@2.9.0))(vue@3.5.41(typescript@6.0.3))':
dependencies:
vite: 7.3.6(@types/node@26.1.1)(jiti@2.7.0)(less@4.6.7)(sass@1.101.0)(stylus@0.56.0(supports-color@10.2.2))(terser@5.49.0)(yaml@2.9.0)
vue: 3.5.42(typescript@6.0.3)
vue: 3.5.41(typescript@6.0.3)
'@vitejs/plugin-vue@6.0.8(vite@7.3.6(@types/node@26.1.1)(jiti@2.7.0)(less@4.6.7)(sass@1.101.0)(stylus@0.56.0(supports-color@10.2.2))(terser@5.49.0)(yaml@2.9.0))(vue@3.5.42(typescript@5.9.3))':
'@vitejs/plugin-vue@6.0.8(vite@7.3.6(@types/node@26.1.1)(jiti@2.7.0)(less@4.6.7)(sass@1.101.0)(stylus@0.56.0(supports-color@10.2.2))(terser@5.49.0)(yaml@2.9.0))(vue@3.5.41(typescript@5.9.3))':
dependencies:
'@rolldown/pluginutils': 1.0.1
vite: 7.3.6(@types/node@26.1.1)(jiti@2.7.0)(less@4.6.7)(sass@1.101.0)(stylus@0.56.0(supports-color@10.2.2))(terser@5.49.0)(yaml@2.9.0)
vue: 3.5.42(typescript@5.9.3)
vue: 3.5.41(typescript@5.9.3)
'@vitest/browser-playwright@4.1.10(playwright@1.58.2)(vite@7.3.6(@types/node@26.1.1)(jiti@2.7.0)(less@4.6.7)(sass@1.101.0)(stylus@0.56.0(supports-color@10.2.2))(terser@5.49.0)(yaml@2.9.0))(vitest@4.1.10)':
dependencies:
@@ -16234,35 +16238,35 @@ snapshots:
'@vscode/l10n@0.0.18': {}
'@vue/compiler-core@3.5.42':
'@vue/compiler-core@3.5.41':
dependencies:
'@babel/parser': 7.29.8
'@vue/shared': 3.5.42
'@vue/shared': 3.5.41
entities: 7.0.1
estree-walker: 2.0.2
source-map-js: 1.2.1
'@vue/compiler-dom@3.5.42':
'@vue/compiler-dom@3.5.41':
dependencies:
'@vue/compiler-core': 3.5.42
'@vue/shared': 3.5.42
'@vue/compiler-core': 3.5.41
'@vue/shared': 3.5.41
'@vue/compiler-sfc@3.5.42':
'@vue/compiler-sfc@3.5.41':
dependencies:
'@babel/parser': 7.29.8
'@vue/compiler-core': 3.5.42
'@vue/compiler-dom': 3.5.42
'@vue/compiler-ssr': 3.5.42
'@vue/shared': 3.5.42
'@vue/compiler-core': 3.5.41
'@vue/compiler-dom': 3.5.41
'@vue/compiler-ssr': 3.5.41
'@vue/shared': 3.5.41
estree-walker: 2.0.2
magic-string: 0.30.21
postcss: 8.5.19
source-map-js: 1.2.1
'@vue/compiler-ssr@3.5.42':
'@vue/compiler-ssr@3.5.41':
dependencies:
'@vue/compiler-dom': 3.5.42
'@vue/shared': 3.5.42
'@vue/compiler-dom': 3.5.41
'@vue/shared': 3.5.41
'@vue/devtools-api@7.7.10':
dependencies:
@@ -16282,79 +16286,79 @@ snapshots:
dependencies:
rfdc: 1.4.1
'@vue/reactivity@3.5.42':
'@vue/reactivity@3.5.41':
dependencies:
'@vue/shared': 3.5.42
'@vue/shared': 3.5.41
'@vue/runtime-core@3.5.42':
'@vue/runtime-core@3.5.41':
dependencies:
'@vue/reactivity': 3.5.42
'@vue/shared': 3.5.42
'@vue/reactivity': 3.5.41
'@vue/shared': 3.5.41
'@vue/runtime-dom@3.5.42':
'@vue/runtime-dom@3.5.41':
dependencies:
'@vue/reactivity': 3.5.42
'@vue/runtime-core': 3.5.42
'@vue/shared': 3.5.42
'@vue/reactivity': 3.5.41
'@vue/runtime-core': 3.5.41
'@vue/shared': 3.5.41
csstype: 3.2.3
'@vue/server-renderer@3.5.42':
'@vue/server-renderer@3.5.41':
dependencies:
'@vue/compiler-ssr': 3.5.42
'@vue/runtime-dom': 3.5.42
'@vue/shared': 3.5.42
'@vue/compiler-ssr': 3.5.41
'@vue/runtime-dom': 3.5.41
'@vue/shared': 3.5.41
'@vue/shared@3.5.39': {}
'@vue/shared@3.5.42': {}
'@vue/shared@3.5.41': {}
'@vue/test-utils@2.5.0(@vue/compiler-dom@3.5.42)(@vue/server-renderer@3.5.42)(vue@3.5.42(typescript@5.9.3))':
'@vue/test-utils@2.4.11(@vue/compiler-dom@3.5.41)(@vue/server-renderer@3.5.41)(vue@3.5.41(typescript@5.9.3))':
dependencies:
'@vue/compiler-dom': 3.5.42
js-beautify: 2.0.3
vue: 3.5.42(typescript@5.9.3)
'@vue/compiler-dom': 3.5.41
js-beautify: 1.15.4
vue: 3.5.41(typescript@5.9.3)
vue-component-type-helpers: 3.3.9
optionalDependencies:
'@vue/server-renderer': 3.5.42
'@vue/server-renderer': 3.5.41
'@vueuse/components@14.3.0(vue@3.5.42(typescript@6.0.3))':
'@vueuse/components@14.3.0(vue@3.5.41(typescript@6.0.3))':
dependencies:
'@vueuse/core': 14.3.0(vue@3.5.42(typescript@6.0.3))
'@vueuse/shared': 14.3.0(vue@3.5.42(typescript@6.0.3))
vue: 3.5.42(typescript@6.0.3)
'@vueuse/core': 14.3.0(vue@3.5.41(typescript@6.0.3))
'@vueuse/shared': 14.3.0(vue@3.5.41(typescript@6.0.3))
vue: 3.5.41(typescript@6.0.3)
'@vueuse/core@12.8.2(typescript@6.0.3)':
dependencies:
'@types/web-bluetooth': 0.0.21
'@vueuse/metadata': 12.8.2
'@vueuse/shared': 12.8.2(typescript@6.0.3)
vue: 3.5.42(typescript@6.0.3)
vue: 3.5.41(typescript@6.0.3)
transitivePeerDependencies:
- typescript
'@vueuse/core@14.3.0(vue@3.5.42(typescript@6.0.3))':
'@vueuse/core@14.3.0(vue@3.5.41(typescript@6.0.3))':
dependencies:
'@types/web-bluetooth': 0.0.21
'@vueuse/metadata': 14.3.0
'@vueuse/shared': 14.3.0(vue@3.5.42(typescript@6.0.3))
vue: 3.5.42(typescript@6.0.3)
'@vueuse/shared': 14.3.0(vue@3.5.41(typescript@6.0.3))
vue: 3.5.41(typescript@6.0.3)
'@vueuse/integrations@12.8.2(focus-trap@7.8.0)(fuse.js@7.5.0)(typescript@6.0.3)':
dependencies:
'@vueuse/core': 12.8.2(typescript@6.0.3)
'@vueuse/shared': 12.8.2(typescript@6.0.3)
vue: 3.5.42(typescript@6.0.3)
vue: 3.5.41(typescript@6.0.3)
optionalDependencies:
focus-trap: 7.8.0
fuse.js: 7.5.0
transitivePeerDependencies:
- typescript
'@vueuse/integrations@14.3.0(focus-trap@7.8.0)(fuse.js@7.5.0)(vue@3.5.42(typescript@6.0.3))':
'@vueuse/integrations@14.3.0(focus-trap@7.8.0)(fuse.js@7.5.0)(vue@3.5.41(typescript@6.0.3))':
dependencies:
'@vueuse/core': 14.3.0(vue@3.5.42(typescript@6.0.3))
'@vueuse/shared': 14.3.0(vue@3.5.42(typescript@6.0.3))
vue: 3.5.42(typescript@6.0.3)
'@vueuse/core': 14.3.0(vue@3.5.41(typescript@6.0.3))
'@vueuse/shared': 14.3.0(vue@3.5.41(typescript@6.0.3))
vue: 3.5.41(typescript@6.0.3)
optionalDependencies:
focus-trap: 7.8.0
fuse.js: 7.5.0
@@ -16365,13 +16369,13 @@ snapshots:
'@vueuse/shared@12.8.2(typescript@6.0.3)':
dependencies:
vue: 3.5.42(typescript@6.0.3)
vue: 3.5.41(typescript@6.0.3)
transitivePeerDependencies:
- typescript
'@vueuse/shared@14.3.0(vue@3.5.42(typescript@6.0.3))':
'@vueuse/shared@14.3.0(vue@3.5.41(typescript@6.0.3))':
dependencies:
vue: 3.5.42(typescript@6.0.3)
vue: 3.5.41(typescript@6.0.3)
'@xmldom/xmldom@0.9.10': {}
@@ -16379,12 +16383,12 @@ snapshots:
a-sync-waterfall@1.0.1: {}
abbrev@2.0.0: {}
abbrev@3.0.1: {}
abbrev@4.0.0: {}
abbrev@5.0.0: {}
abort-controller@3.0.0:
dependencies:
event-target-shim: 5.0.1
@@ -16536,12 +16540,12 @@ snapshots:
ansi-styles@6.2.3: {}
ansi-to-vue3@0.1.2(vue@3.5.42(typescript@6.0.3)):
ansi-to-vue3@0.1.2(vue@3.5.41(typescript@6.0.3)):
dependencies:
anser: 2.3.5
escape-carriage: 1.3.1
optionalDependencies:
vue: 3.5.42(typescript@6.0.3)
vue: 3.5.41(typescript@6.0.3)
any-base@1.1.0: {}
@@ -17296,6 +17300,8 @@ snapshots:
comma-separated-tokens@2.0.3: {}
commander@10.0.1: {}
commander@11.1.0: {}
commander@12.1.0: {}
@@ -17829,11 +17835,11 @@ snapshots:
eastasianwidth@0.2.0: {}
editorconfig@3.0.2:
editorconfig@1.0.7:
dependencies:
'@one-ini/wasm': 0.2.1
commander: 14.0.3
minimatch: 10.2.5
'@one-ini/wasm': 0.1.1
commander: 10.0.1
minimatch: 9.0.9
semver: 7.8.5
ee-first@1.1.1: {}
@@ -19346,13 +19352,13 @@ snapshots:
jpeg-js@0.4.4: {}
js-beautify@2.0.3:
js-beautify@1.15.4:
dependencies:
config-chain: 1.1.13
editorconfig: 3.0.2
glob: 13.0.6
editorconfig: 1.0.7
glob: 10.5.0
js-cookie: 3.0.8
nopt: 10.0.1
nopt: 7.2.1
js-cookie@3.0.8: {}
@@ -20295,13 +20301,13 @@ snapshots:
motion-utils@12.39.0: {}
motion-v@1.10.3(@vueuse/core@14.3.0(vue@3.5.42(typescript@6.0.3)))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(vue@3.5.42(typescript@6.0.3)):
motion-v@1.10.3(@vueuse/core@14.3.0(vue@3.5.41(typescript@6.0.3)))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(vue@3.5.41(typescript@6.0.3)):
dependencies:
'@vueuse/core': 14.3.0(vue@3.5.42(typescript@6.0.3))
'@vueuse/core': 14.3.0(vue@3.5.41(typescript@6.0.3))
framer-motion: 12.42.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
hey-listen: 1.0.8
motion-dom: 12.42.2
vue: 3.5.42(typescript@6.0.3)
vue: 3.5.41(typescript@6.0.3)
transitivePeerDependencies:
- '@emotion/is-prop-valid'
- react
@@ -20588,9 +20594,9 @@ snapshots:
node-releases@2.0.51: {}
nopt@10.0.1:
nopt@7.2.1:
dependencies:
abbrev: 5.0.0
abbrev: 2.0.0
nopt@8.1.0:
dependencies:
@@ -21700,7 +21706,7 @@ snapshots:
safer-buffer@2.1.2: {}
sandpack-vue3@3.1.12(vue@3.5.42(typescript@6.0.3)):
sandpack-vue3@3.1.12(vue@3.5.41(typescript@6.0.3)):
dependencies:
'@codemirror/autocomplete': 6.20.3
'@codemirror/commands': 6.10.4
@@ -21713,12 +21719,12 @@ snapshots:
'@codesandbox/sandpack-client': 2.19.8
'@lezer/highlight': 1.2.3
'@stitches/core': 1.2.8
ansi-to-vue3: 0.1.2(vue@3.5.42(typescript@6.0.3))
ansi-to-vue3: 0.1.2(vue@3.5.41(typescript@6.0.3))
clean-set: 1.1.2
dequal: 2.0.3
lz-string: 1.5.0
optionalDependencies:
vue: 3.5.42(typescript@6.0.3)
vue: 3.5.41(typescript@6.0.3)
sass-formatter@0.7.9:
dependencies:
@@ -23118,7 +23124,7 @@ snapshots:
'@shikijs/transformers': 2.5.0
'@shikijs/types': 2.5.0
'@types/markdown-it': 14.1.2
'@vitejs/plugin-vue': 5.2.4(vite@7.3.6(@types/node@26.1.1)(jiti@2.7.0)(less@4.6.7)(sass@1.101.0)(stylus@0.56.0(supports-color@10.2.2))(terser@5.49.0)(yaml@2.9.0))(vue@3.5.42(typescript@6.0.3))
'@vitejs/plugin-vue': 5.2.4(vite@7.3.6(@types/node@26.1.1)(jiti@2.7.0)(less@4.6.7)(sass@1.101.0)(stylus@0.56.0(supports-color@10.2.2))(terser@5.49.0)(yaml@2.9.0))(vue@3.5.41(typescript@6.0.3))
'@vue/devtools-api': 7.7.10
'@vue/shared': 3.5.39
'@vueuse/core': 12.8.2(typescript@6.0.3)
@@ -23128,7 +23134,7 @@ snapshots:
minisearch: 7.2.0
shiki: 2.5.0
vite: 7.3.6(@types/node@26.1.1)(jiti@2.7.0)(less@4.6.7)(sass@1.101.0)(stylus@0.56.0(supports-color@10.2.2))(terser@5.49.0)(yaml@2.9.0)
vue: 3.5.42(typescript@6.0.3)
vue: 3.5.41(typescript@6.0.3)
optionalDependencies:
postcss: 8.5.19
transitivePeerDependencies:
@@ -23241,27 +23247,27 @@ snapshots:
vue-component-type-helpers@3.3.9: {}
vue-demi@0.14.10(vue@3.5.42(typescript@6.0.3)):
vue-demi@0.14.10(vue@3.5.41(typescript@6.0.3)):
dependencies:
vue: 3.5.42(typescript@6.0.3)
vue: 3.5.41(typescript@6.0.3)
vue@3.5.42(typescript@5.9.3):
vue@3.5.41(typescript@5.9.3):
dependencies:
'@vue/compiler-dom': 3.5.42
'@vue/compiler-sfc': 3.5.42
'@vue/runtime-dom': 3.5.42
'@vue/server-renderer': 3.5.42
'@vue/shared': 3.5.42
'@vue/compiler-dom': 3.5.41
'@vue/compiler-sfc': 3.5.41
'@vue/runtime-dom': 3.5.41
'@vue/server-renderer': 3.5.41
'@vue/shared': 3.5.41
optionalDependencies:
typescript: 5.9.3
vue@3.5.42(typescript@6.0.3):
vue@3.5.41(typescript@6.0.3):
dependencies:
'@vue/compiler-dom': 3.5.42
'@vue/compiler-sfc': 3.5.42
'@vue/runtime-dom': 3.5.42
'@vue/server-renderer': 3.5.42
'@vue/shared': 3.5.42
'@vue/compiler-dom': 3.5.41
'@vue/compiler-sfc': 3.5.41
'@vue/runtime-dom': 3.5.41
'@vue/server-renderer': 3.5.41
'@vue/shared': 3.5.41
optionalDependencies:
typescript: 6.0.3
+41
View File
@@ -0,0 +1,41 @@
# Lucide Icon Usage Estimator
Run with:
```sh
pnpm icon-usage trash trash-2
```
The default is a bounded first pass over `lucide-react`, with two GitHub search pages and up to 200 candidate files validated per query slice. Use `--all-packages` to include every supported package, or `--thorough` for the previous broader limits of 10 pages and 1,000 candidate files per query slice.
GitHub code search requires authentication, so set `GITHUB_TOKEN` or pass `--token-env <NAME>`.
Use `--verbose` or `-v` to print detailed progress logs to stderr, including queries, pages, cache hits, retries, content validation, and matches.
## Method
The script uses GitHub REST `GET /search/code` with package-scoped, code-extension-scoped queries, then fetches each returned file and validates common Lucide import styles before counting a repository. Counts are deduplicated by `owner/repository`.
Output includes overall repository counts and per-package statistics. Per-package statistics are computed from validated matches for that package, so a repository using `trash` via `lucide-react` and `trash-2` via another package is represented correctly in both the overall totals and each package section.
Supported packages are `lucide-react`, `@lucide/vue`, `@lucide/svelte`, `@lucide/angular`, `@lucide/astro`, `lucide-preact`, `lucide-solid`, `lucide`, and `@lucide/lab`. The default package is `lucide-react` because all packages plus file-scope slicing is slow for broad icons; use `--all-packages` when that broader sample is needed.
Searches are split across relevant implementation file scopes using REST code search qualifiers such as `language:typescript`, `language:javascript`, `extension:vue`, and `extension:svelte`. Returned paths are still filtered by expected extensions before content is fetched, so Markdown and prompt/spec files are intentionally excluded by default because they frequently contain examples or generated implementation notes rather than live package usage.
By default, queries exclude forks, archived repositories, generated files, and vendored files using GitHub code search qualifiers. Use `--include-forks`, `--include-archived`, `--include-generated`, or `--include-vendored` to include them.
## GitHub API Limits
GitHub REST code search is authenticated and rate-limited to 10 requests per minute. Each query can return at most 1,000 results, with up to 100 results per page. Search only covers default branches and files smaller than 384 KB.
`total_count` and `incomplete_results` come from GitHub search and are recorded in JSON metadata. If a query exceeds the 1,000-result cap or returns `incomplete_results: true`, the script reports a warning and the result should be treated as incomplete rather than exhaustive.
GitHub's newer code search syntax is usable for public code search queries and supports qualifiers such as `NOT is:fork`, `NOT is:archived`, `NOT is:generated`, and `NOT is:vendored`, but the documented REST code search endpoint remains capped for result retrieval.
## Practical Strategy For Broad Icons
For common icons that hit search caps, use the script output as lower-bound or sampled evidence. The most defensible follow-up is to narrow query slices and cite them separately, for example by package, language/path, or repository cohorts, while preserving the JSON metadata for every query performed.
## Known Biases
Only public GitHub repositories visible to the token are observable. Private repositories and consumers outside GitHub are absent. GitHub is not representative of every Lucide consumer. Framework/package usage can differ materially. GitHub indexing may be incomplete or delayed. Generated or vendored code can still create false positives when GitHub does not identify it. Very common icons may exceed GitHub search-result caps.
File diff suppressed because it is too large Load Diff