diff --git a/.cspell/custom-words.txt b/.cspell/custom-words.txt
index 206b4c999..f2517f0a6 100644
--- a/.cspell/custom-words.txt
+++ b/.cspell/custom-words.txt
@@ -8,9 +8,5 @@ squircle
strikethrough
touchpad
ungroup
-pilcrow
-
-# Brands
-codepen
-codesandbox
-dribbble
+toc
+sunlounger
diff --git a/.eslintignore b/.eslintignore
deleted file mode 100644
index ffae92223..000000000
--- a/.eslintignore
+++ /dev/null
@@ -1,10 +0,0 @@
-dist
-build
-coverage
-lib
-tests
-node_modules
-.eslintrc.js
-docs/images
-docs/**/examples/
-packages/lucide-react/dynamicIconImports.js
diff --git a/.eslintrc.js b/.eslintrc.js
deleted file mode 100644
index ae2e17576..000000000
--- a/.eslintrc.js
+++ /dev/null
@@ -1,75 +0,0 @@
-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',
- },
- },
- ],
-};
diff --git a/.github/DISCUSSION_TEMPLATE/icon-design.yml b/.github/DISCUSSION_TEMPLATE/icon-design.yml
new file mode 100644
index 000000000..2b753e3b9
--- /dev/null
+++ b/.github/DISCUSSION_TEMPLATE/icon-design.yml
@@ -0,0 +1,49 @@
+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
diff --git a/.github/ISSUE_TEMPLATE/01_icon_request.yml b/.github/ISSUE_TEMPLATE/01_icon_request.yml
index a3c4bfca1..a7f2daa73 100644
--- a/.github/ISSUE_TEMPLATE/01_icon_request.yml
+++ b/.github/ISSUE_TEMPLATE/01_icon_request.yml
@@ -7,8 +7,10 @@ body:
value: |
Before submitting an icon request check if it has already been requested. If there is an open request, please add a 👍.
- **Important note**: No new brand logos are allowed, see https://github.com/lucide-icons/lucide/issues/670.
- Existing brand icons will also be phased out. For brand icons, consider using https://simpleicons.org, which offers purpose-built SVGs that are also on a 24×24px grid.
+ > [!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 are being 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:
@@ -41,9 +43,9 @@ body:
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.
+ - 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, political imagery or hate symbols.
+ - 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
diff --git a/.github/ISSUE_TEMPLATE/02_bug_report.yml b/.github/ISSUE_TEMPLATE/02_bug_report.yml
index 21dd4e1f2..f5d8918bb 100644
--- a/.github/ISSUE_TEMPLATE/02_bug_report.yml
+++ b/.github/ISSUE_TEMPLATE/02_bug_report.yml
@@ -13,15 +13,19 @@ body:
description: Which Lucide packages are affected? You may select more than one.
options:
- label: lucide
- - label: lucide-angular
- - label: lucide-flutter
- - label: lucide-preact
- label: lucide-react
+ - label: '@lucide/vue'
+ - label: '@lucide/svelte'
+ - label: '@lucide/angular'
+ - label: '@lucide/astro'
- label: lucide-react-native
+ - label: lucide-preact
- label: lucide-solid
- - label: lucide-svelte
- - label: lucide-vue
- - label: lucide-vue-next
+ - label: lucide-static
+ - label: '@lucide/icons'
+ - label: lucide-vue-next (deprecated)
+ - label: lucide-svelte (deprecated)
+ - label: lucide-angular (deprecated)
- label: Figma plugin
- label: source/main
- label: other/not relevant
@@ -32,7 +36,7 @@ body:
attributes:
label: Version
description: What version of Lucide are you running?
- placeholder: e.g. 0.289.1
+ placeholder: e.g. 1.1.0
validations:
required: true
- type: checkboxes
diff --git a/.github/ISSUE_TEMPLATE/04_feature_request.yml b/.github/ISSUE_TEMPLATE/04_feature_request.yml
index 9b07f3645..73d354ac8 100644
--- a/.github/ISSUE_TEMPLATE/04_feature_request.yml
+++ b/.github/ISSUE_TEMPLATE/04_feature_request.yml
@@ -13,18 +13,23 @@ body:
description: Which Lucide project do you wish this feature were added to? You may select more than one.
options:
- label: lucide
- - label: lucide-angular
- - label: lucide-flutter
- - label: lucide-preact
- label: lucide-react
+ - label: '@lucide/vue'
+ - label: '@lucide/svelte'
+ - label: '@lucide/angular'
+ - label: '@lucide/astro'
- label: lucide-react-native
+ - label: lucide-preact
- label: lucide-solid
- - label: lucide-svelte
- - label: lucide-vue
- - label: lucide-vue-next
+ - label: lucide-static
+ - label: '@lucide/icons'
+ - label: lucide-vue-next (deprecated)
+ - label: lucide-svelte (deprecated)
+ - label: lucide-angular (deprecated)
- label: Figma plugin
- label: all JS packages
- label: site
+ - label: other/not relevant
validations:
required: true
- type: textarea
diff --git a/.github/actions/build-and-test.yml b/.github/actions/build-and-test.yml
deleted file mode 100644
index 5b5a4675f..000000000
--- a/.github/actions/build-and-test.yml
+++ /dev/null
@@ -1,44 +0,0 @@
-name: 'Build and Test'
-description: 'Builds and test a package'
-
-inputs:
- name:
- description: “Name of the package”
- required: true
-
-runs:
- using: 'composite'
- steps:
- - uses: actions/checkout@v4
- - uses: actions/setup-node@v4
- with:
- node-version: 16
-
- - uses: pnpm/action-setup@v2
- name: Install pnpm
- id: pnpm-install
- with:
- version: 8
- run_install: false
-
- - name: Get pnpm store directory
- id: pnpm-cache
- run: |
- echo "STORE_PATH=$(pnpm store path)" >> $GITHUB_OUTPUT
-
- - uses: actions/cache@v3
- name: Setup pnpm cache
- with:
- path: ${{ steps.pnpm-cache.outputs.STORE_PATH }}
- key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }}
- restore-keys: |
- ${{ runner.os }}-pnpm-store-
-
- - name: Install dependencies
- run: pnpm install --filter lucide-preact
-
- - name: Build
- run: pnpm --filter lucide-preact build
-
- - name: Test
- run: pnpm --filter lucide-preact test
diff --git a/.github/actions/check-icons.yml b/.github/actions/check-icons.yml
deleted file mode 100644
index 0850a17ac..000000000
--- a/.github/actions/check-icons.yml
+++ /dev/null
@@ -1,41 +0,0 @@
-name: 'Check icons'
-description: 'Cross-checks icon and category references in JSON descriptors'
-
-inputs:
- name:
- description: “Name of the package”
- required: true
-
-runs:
- using: 'composite'
- steps:
- - uses: actions/checkout@v4
- - uses: actions/setup-node@v4
- with:
- node-version: 16
-
- - uses: pnpm/action-setup@v2
- name: Install pnpm
- id: pnpm-install
- with:
- version: 8
- run_install: false
-
- - name: Get pnpm store directory
- id: pnpm-cache
- run: |
- echo "STORE_PATH=$(pnpm store path)" >> $GITHUB_OUTPUT
-
- - uses: actions/cache@v3
- name: Setup pnpm cache
- with:
- path: ${{ steps.pnpm-cache.outputs.STORE_PATH }}
- key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }}
- restore-keys: |
- ${{ runner.os }}-pnpm-store-
-
- - name: Install dependencies
- run: pnpm install --filter .
-
- - name: Check icons and categories
- run: pnpm checkIcons
diff --git a/.github/copilot-instructions.md b/.github/copilot-instructions.md
new file mode 100644
index 000000000..055190392
--- /dev/null
+++ b/.github/copilot-instructions.md
@@ -0,0 +1,8 @@
+## Reviewing PRs
+
+When reviewing PRs, please respond in a friendly and constructive manner.
+
+- First, thank the contributor for their contribution in an enthusiastic way.
+- If you have any suggestions for improvement, provide them clearly and concisely.
+- If you have any questions about the PR, ask them respectfully.
+- Let the contributor know that we have many PRs to review and that we appreciate their patience while we review their contribution.
diff --git a/.github/dependabot.yml b/.github/dependabot.yml
new file mode 100644
index 000000000..a26b1f2f5
--- /dev/null
+++ b/.github/dependabot.yml
@@ -0,0 +1,106 @@
+version: 2
+
+updates:
+ - package-ecosystem: npm
+ directory: /
+ schedule:
+ interval: weekly
+ groups:
+ react-deps:
+ patterns:
+ - '@testing-library/react'
+ - '@types/prop-types'
+ - '@types/react'
+ - '@vitejs/plugin-react'
+ - 'react'
+ - 'react-dom'
+ vue-deps:
+ patterns:
+ - '@testing-library/vue'
+ - '@vitejs/plugin-vue'
+ - '@vue/test-utils'
+ - 'vue'
+ svelte-deps:
+ patterns:
+ - '@sveltejs/*'
+ - '@testing-library/svelte'
+ - '@tsconfig/svelte'
+ - 'svelte'
+ - 'svelte-check'
+ - 'svelte-preprocess'
+ solid-deps:
+ patterns:
+ - '@babel/*'
+ - '@rollup/plugin-babel'
+ - '@solidjs/testing-library'
+ - 'babel-preset-solid'
+ - 'solid-js'
+ - 'vite-plugin-solid'
+ react-native-deps:
+ patterns:
+ - 'react-native'
+ - 'react-native-svg'
+ angular-deps:
+ patterns:
+ - '@angular/*'
+ - '@angular-eslint/*'
+ - '@vitest/browser-playwright'
+ - 'angular-eslint'
+ - 'ng-packagr'
+ - 'rxjs'
+ - 'tslib'
+ preact-deps:
+ patterns:
+ - '@preact/preset-vite'
+ - '@testing-library/preact'
+ - 'preact'
+ astro-deps:
+ patterns:
+ - '@astrojs/*'
+ - 'astro'
+ testing-deps:
+ patterns:
+ - '@testing-library/*'
+ - '@vitest/*'
+ - 'jest-serializer-html'
+ - 'jsdom'
+ - 'linkedom'
+ - 'vitest'
+ build-deps:
+ patterns:
+ - '@rollup/*'
+ - '@vitejs/*'
+ - 'esbuild'
+ - 'rollup'
+ - 'rollup-plugin-*'
+ - 'typescript'
+ - 'vite'
+ - 'vite-plugin-*'
+ linting-deps:
+ patterns:
+ - '@eslint/*'
+ - '@html-eslint/*'
+ - '@typescript-eslint/*'
+ - 'angular-eslint'
+ - 'cspell'
+ - 'eslint'
+ - 'eslint-*'
+ - 'husky'
+ - 'lint-staged'
+ - 'prettier'
+ - 'prettier-plugin-*'
+ types-deps:
+ patterns:
+ - '@types/*'
+ remaining-deps:
+ patterns:
+ - '*'
+
+ - package-ecosystem: github-actions
+ directory: /
+ schedule:
+ interval: monthly
+ groups:
+ github-actions:
+ patterns:
+ - '*'
diff --git a/.github/instructions/metadata.instructions.md b/.github/instructions/metadata.instructions.md
new file mode 100644
index 000000000..05aacbae1
--- /dev/null
+++ b/.github/instructions/metadata.instructions.md
@@ -0,0 +1,20 @@
+---
+applyTo: "icons/*.json"
+---
+# JSON Metadata Descriptor
+
+The schema for the JSON metadata descriptor can be found in `icon.schema.json`. It defines the required and optional properties for the JSON files that accompany each icon. The JSON metadata descriptor should be placed in the same directory as the SVG file of the icon and should have the same name as the SVG file, but with a `.json` extension. For example, if the SVG file is named `home.svg`, the JSON metadata descriptor should be named `home.json`.
+
+## Contributors
+
+The `contributors` property is a required array of GitHub usernames for the people who created or contributed to the icon. It is used to give credit to contributors and to track the icon's history. Add the PR author to the `contributors` array if they are not already listed and they have made a significant contribution to the icon's SVG.
+
+## Tags
+
+The `tags` property is an array of strings that describe the icon and can be used for searching.
+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
+
+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.
diff --git a/.github/labeler.yml b/.github/labeler.yml
index 2023caf3d..aeb274b50 100644
--- a/.github/labeler.yml
+++ b/.github/labeler.yml
@@ -36,57 +36,62 @@
- any-glob-to-any-file:
- 'packages/lucide/*'
-# For changes in the lucide React package
+# For changes in the Lucide React package
⚛️ react package:
- changed-files:
- any-glob-to-any-file:
- 'packages/lucide-react/*'
-# For changes in the lucide React Native package
+# For changes in the Lucide React Native package
⚛️ react native package:
- changed-files:
- any-glob-to-any-file:
- 'packages/lucide-react-native/*'
-# For changes in the lucide vue packages
+# For changes in the Lucide vue packages
💎 vue package:
- changed-files:
- any-glob-to-any-file:
- - 'packages/lucide-vue/*'
- - 'packages/lucide-vue-next/*'
+ - 'packages/vue/*'
-# For changes in the lucide angular package
+# For changes in the Lucide angular package
🅰️ angular package:
- changed-files:
- any-glob-to-any-file:
- - 'packages/lucide-angular/*'
+ - 'packages/angular/*'
-# For changes in the lucide preact package
+# For changes in the Lucide preact package
⚛️ preact package:
- changed-files:
- any-glob-to-any-file:
- 'packages/lucide-preact/*'
-# For changes in the lucide svelte package
+# For changes in the Lucide svelte package
🧣 svelte package:
- changed-files:
- any-glob-to-any-file:
- - 'packages/lucide-svelte/*'
+ - 'packages/svelte/*'
-# For changes in the lucide solid package
+# For changes in the Lucide solid package
🪝 solid package:
- changed-files:
- any-glob-to-any-file:
- 'packages/lucide-solid/*'
-# For changes in the lucide static package
+# For changes in the Lucide astro package
+🚀 astro package:
+ - changed-files:
+ - any-glob-to-any-file:
+ - 'packages/astro/*'
+
+# For changes in the @lucide/icons package
+❇️ lucide-icons:
+ - changed-files:
+ - any-glob-to-any-file:
+ - 'packages/lucide-icons/*'
+
+# For changes in the Lucide static package
🪨 static package:
- changed-files:
- any-glob-to-any-file:
- 'packages/lucide-static/*'
-
-# For changes in the lucide flutter package
-🏹 flutter package:
- - changed-files:
- - any-glob-to-any-file:
- - 'packages/lucide-flutter/*'
diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md
index 2403cee42..3bf6bfff1 100644
--- a/.github/pull_request_template.md
+++ b/.github/pull_request_template.md
@@ -1,16 +1,18 @@
+
+
-
-## What is the purpose of this pull request?
-
-- [ ] New Icon
-- [ ] Bug fix
-- [ ] New Feature
-- [ ] Documentation update
-- [ ] Other:
-
-### Description
+## Description
### Icon use case
@@ -23,10 +25,12 @@
### Concept
+
+
- [ ] I have provided valid use cases for each icon.
-- [ ] I have not added any a brand or logo icon.
+- [ ] I have [not added any brand or logo icon](https://github.com/lucide-icons/lucide/blob/main/BRAND_LOGOS_STATEMENT.md).
- [ ] I have not used any hate symbols.
-- [ ] I have not included any religious or political imagery.
+- [ ] I have not included any religious, war/violence related or political imagery.
### Author, credits & license
@@ -37,13 +41,15 @@
### Naming
-- [ ] I've read and followed the [naming conventions](https://lucide.dev/guide/design/icon-design-guide#naming-conventions)
+- [ ] I've read and followed the [naming conventions](https://lucide.dev/contribute/icon-design-guide#naming-conventions)
- [ ] I've named icons by what they are rather than their use case.
- [ ] I've provided meta JSON files in `icons/[iconName].json`.
### Design
-- [ ] I've read and followed the [icon design guidelines](https://lucide.dev/guide/design/icon-design-guide)
+
+- [ ] I've read and followed the [icon design guidelines](https://lucide.dev/contribute/icon-design-guide)
+- [ ] I've made sure that the icons don't [already exist](https://lucide.dev/icons), including the [Lab directory](https://github.com/lucide-icons/lucide/tree/main/lab).
- [ ] I've made sure that the icons look sharp on low DPI displays.
- [ ] I've made sure that the icons look consistent with the icon set in size, optical volume and density.
- [ ] I've made sure that the icons are visually centered.
diff --git a/.github/workflows/angular.yml b/.github/workflows/angular.yml
new file mode 100644
index 000000000..764d077ec
--- /dev/null
+++ b/.github/workflows/angular.yml
@@ -0,0 +1,44 @@
+name: Lucide Angular checks
+
+on:
+ pull_request:
+ paths:
+ - packages/angular/**
+ - tools/build-icons/**
+ - pnpm-lock.yaml
+
+permissions:
+ contents: read
+
+jobs:
+ build:
+ runs-on: ubuntu-latest
+ 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: Build
+ run: pnpm --filter @lucide/angular build
+
+ test:
+ runs-on: ubuntu-latest
+ 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: Test
+ run: pnpm --filter @lucide/angular test
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index 7b6f6fed5..c410bd739 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -7,22 +7,70 @@ on:
paths:
- icons/**/*.svg
+ workflow_dispatch:
+ inputs:
+ version:
+ description: Version
+ required: true
+ tag:
+ required: true
+ description: NPM tag
+ default: 'latest'
+ type: choice
+ options:
+ - latest
+ - next
+ - beta
+ - alpha
+
+permissions: {}
+
jobs:
+ check-dispatch-gate:
+ if: github.repository == 'lucide-icons/lucide' &&
+ startsWith(github.event.head_commit.message, 'feat(icons)') &&
+ github.event_name != 'workflow_dispatch'
+ runs-on: ubuntu-latest
+ permissions:
+ contents: read
+ outputs:
+ RELEASE_ENVIRONMENT: ${{ steps.environment.outputs.RELEASE_ENVIRONMENT }}
+ steps:
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
+
+ - name: Fetch tags
+ run: git fetch --all --tags
+
+ - name: Check if latest tag was created today
+ id: environment
+ run: |
+ LATEST_TAG=$(git tag --sort=-v:refname | grep -E '^[0-9]+\.[0-9]+\.[0-9]+$' | head -n 1)
+ TAG_DATE=$(git log -1 --format=%cs "$LATEST_TAG")
+ TODAY=$(date +%Y-%m-%d)
+
+ if [ "$TAG_DATE" == "$TODAY" ]; then
+ echo "::warning::A release tag already exists for today ($TODAY): $LATEST_TAG. Manual approval will be required to proceed."
+ echo "RELEASE_ENVIRONMENT=Icon Release Gated" >> $GITHUB_OUTPUT
+ else
+ echo "RELEASE_ENVIRONMENT=Icon Release" >> $GITHUB_OUTPUT
+ fi
+
create-release:
if: github.repository == 'lucide-icons/lucide'
+ needs: check-dispatch-gate
+ environment: ${{ needs.check-dispatch-gate.outputs.RELEASE_ENVIRONMENT }}
runs-on: ubuntu-latest
+ permissions:
+ contents: write # Required to create the release and tag
outputs:
VERSION: ${{ steps.new-version.outputs.NEW_VERSION }}
-
steps:
- - uses: actions/checkout@v4
- - uses: pnpm/action-setup@v2
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
+ - uses: pnpm/action-setup@0977fd99725f1db4007ccb2928dbb4e90d06cc86 # v6.0.10
+ - uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0
with:
- version: 8
- - uses: actions/setup-node@v4
- with:
- node-version: 18
cache: 'pnpm'
+ node-version-file: 'package.json'
- name: Install dependencies
run: pnpm install --frozen-lockfile
@@ -32,27 +80,21 @@ jobs:
- name: Get latest tag
id: latest-tag
- run: echo "LATEST_TAG=$(git describe --tags `git rev-list --tags --max-count=1`)" >> $GITHUB_OUTPUT
+ run: echo "LATEST_TAG=$(git tag --sort=-v:refname | grep -E '^[0-9]+\.[0-9]+\.[0-9]+$' | head -n 1)" >> $GITHUB_OUTPUT
+
+ - name: Log latest tag
+ run: echo '${{ steps.latest-tag.outputs.LATEST_TAG }}'
- name: Check if we can patch
- run: .github/workflows/version-up.sh --minor
+ run: pnpm semver $LATEST_TAG -i minor
+ env:
+ LATEST_TAG: ${{ steps.latest-tag.outputs.LATEST_TAG }}
- name: Create new version
id: new-version
- run: echo "NEW_VERSION=$(.github/workflows/version-up.sh --minor)" >> $GITHUB_OUTPUT
-
- - name: Create change log
- id: change-log
- run: |
- CHANGE_LOG=$(pnpm run generate:changelog --old-tag=${{ steps.latest-tag.outputs.LATEST_TAG }})
- CHANGE_LOG=$(tail -n +5 <<< $CHANGE_LOG)
- echo $CHANGE_LOG
- EOF=$(dd if=/dev/urandom bs=15 count=1 status=none | base64)
- echo "CHANGE_LOG<<$EOF" >> $GITHUB_OUTPUT
- echo "$CHANGE_LOG" >> $GITHUB_OUTPUT
- echo "$EOF" >> $GITHUB_OUTPUT
+ run: echo "NEW_VERSION=$(pnpm semver $LATEST_TAG -i minor)" >> $GITHUB_OUTPUT
env:
- GITHUB_API_KEY: ${{ secrets.GITHUB_TOKEN }}
+ LATEST_TAG: ${{ steps.latest-tag.outputs.LATEST_TAG }}
- name: Check output
run: |
@@ -60,16 +102,30 @@ jobs:
echo '${{ steps.change-log.outputs.CHANGE_LOG }}'
- name: Create Release
- uses: softprops/action-gh-release@v1
+ uses: softprops/action-gh-release@3d0d9888cb7fd7b750713d6e236d1fcb99157228 # v3.0.2
with:
tag_name: ${{ steps.new-version.outputs.NEW_VERSION }}
- name: New icons ${{ steps.new-version.outputs.NEW_VERSION }}
- body: ${{ steps.change-log.outputs.CHANGE_LOG }}
+ name: Version ${{ steps.new-version.outputs.NEW_VERSION }}
+ generate_release_notes: true
start-release:
if: github.repository == 'lucide-icons/lucide'
needs: create-release
uses: './.github/workflows/release.yml'
secrets: inherit
+ permissions:
+ id-token: write # Required for OIDC (npm provenance)
+ contents: write # Required to upload release assets
with:
version: ${{ needs.create-release.outputs.VERSION }}
+
+ dispatch-release:
+ if: github.repository == 'lucide-icons/lucide' && github.event_name == 'workflow_dispatch'
+ uses: './.github/workflows/release.yml'
+ secrets: inherit
+ permissions:
+ id-token: write # Required for OIDC (npm provenance)
+ contents: write # Required to upload release assets
+ with:
+ version: ${{ inputs.version }}
+ tag: ${{ inputs.tag }}
diff --git a/.github/workflows/close-issue-with-banned-phrases.yml b/.github/workflows/close-issue-with-banned-phrases.yml
new file mode 100644
index 000000000..de14b3000
--- /dev/null
+++ b/.github/workflows/close-issue-with-banned-phrases.yml
@@ -0,0 +1,110 @@
+name: Close Icon Requests with Brand Terms
+
+on:
+ issues:
+ types: [opened]
+ discussion:
+ types: [created]
+
+permissions: {}
+
+env:
+ GH_TOKEN: ${{ github.token }}
+
+jobs:
+ block_phrases:
+ if: github.repository == 'lucide-icons/lucide'
+ runs-on: ubuntu-latest
+ 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')
+ run: |
+ ISSUE_TITLE=$(jq -r '.issue.title' "$GITHUB_EVENT_PATH")
+ ISSUE_BODY=$(jq -r '.issue.body // ""' "$GITHUB_EVENT_PATH")
+ ICON_NAME_SECTION=$(printf '%s\n' "$ISSUE_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 "$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.
+
+ 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 issues.](https://github.com/lucide-icons/lucide/issues?q=is%3Aissue+${URL_ENCODED_VALUE})
+
+ We’re always happy to help on [Discord](https://discord.gg/EH6nSts)."
+
+ gh issue lock ${{ github.event.issue.number }} --reason spam
+ 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
diff --git a/.github/workflows/close-stale-prs.yml b/.github/workflows/close-stale-prs.yml
index 0b47315f4..7704f341c 100644
--- a/.github/workflows/close-stale-prs.yml
+++ b/.github/workflows/close-stale-prs.yml
@@ -3,13 +3,16 @@ on:
schedule:
- cron: '45 1 * * *'
+permissions: {}
+
jobs:
stale:
+ if: github.repository == 'lucide-icons/lucide'
runs-on: ubuntu-latest
permissions:
pull-requests: write
steps:
- - uses: actions/stale@v9
+ - uses: actions/stale@4391f3da665fdf50b6810c1a66712fb9ba21aa93 # v11.0.0
with:
repo-token: ${{ secrets.GITHUB_TOKEN }}
stale-pr-message: This PR is stale because it has been open 45 days with no activity. Remove stale label or comment or this will be closed in 5 days.
diff --git a/.github/workflows/comment-icon-preview.yml b/.github/workflows/comment-icon-preview.yml
new file mode 100644
index 000000000..b9f813e64
--- /dev/null
+++ b/.github/workflows/comment-icon-preview.yml
@@ -0,0 +1,65 @@
+name: Icon preview comment
+
+on:
+ workflow_run:
+ workflows: ['Pull request icon preview']
+ types:
+ - completed
+
+permissions: {}
+
+jobs:
+ upload:
+ runs-on: ubuntu-latest
+ permissions:
+ contents: read
+ actions: read # Required to download the artifact from the triggering run
+ pull-requests: write
+ if: >
+ github.repository == 'lucide-icons/lucide' &&
+ github.event.workflow_run.event == 'pull_request' &&
+ github.event.workflow_run.conclusion == 'success'
+ steps:
+ - name: 'Download artifact'
+ uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0
+ with:
+ script: |
+ let allArtifacts = await github.rest.actions.listWorkflowRunArtifacts({
+ owner: context.repo.owner,
+ repo: context.repo.repo,
+ run_id: context.payload.workflow_run.id,
+ });
+ let matchArtifact = allArtifacts.data.artifacts.filter((artifact) => {
+ return artifact.name == "pr_number"
+ })[0];
+ let download = await github.rest.actions.downloadArtifact({
+ owner: context.repo.owner,
+ repo: context.repo.repo,
+ artifact_id: matchArtifact.id,
+ archive_format: 'zip',
+ });
+ const fs = require('fs');
+ fs.writeFileSync('${{github.workspace}}/pr_number.zip', Buffer.from(download.data));
+
+ - name: 'Unzip artifact'
+ run: unzip pr_number.zip
+
+ - name: 'Get PR number'
+ run: echo "number=$(cat NR)" >> $GITHUB_OUTPUT
+ id: pr-number
+
+ - name: Find Comment
+ uses: peter-evans/find-comment@b30e6a3c0ed37e7c023ccd3f1db5c6c0b0c23aad # v4.0.0
+ id: pr-comment
+ with:
+ issue-number: ${{ steps.pr-number.outputs.number }}
+ comment-author: 'github-actions[bot]'
+ body-includes: Added or changed icons
+
+ - name: Create or update comment
+ uses: peter-evans/create-or-update-comment@e8674b075228eee787fea43ef493e45ece1004c9 # v5.0.0
+ with:
+ comment-id: ${{ steps.pr-comment.outputs.comment-id }}
+ issue-number: ${{ steps.pr-number.outputs.number }}
+ body-path: comment-markup.md
+ edit-mode: replace
diff --git a/.github/workflows/icons.yml b/.github/workflows/icons.yml
new file mode 100644
index 000000000..e4d53a6f9
--- /dev/null
+++ b/.github/workflows/icons.yml
@@ -0,0 +1,46 @@
+name: Lucide Icons Checks
+
+on:
+ pull_request:
+ paths:
+ - packages/icons/**
+ - packages/shared/**
+ - tools/build-icons/**
+ - tools/rollup-plugins/**
+ - pnpm-lock.yaml
+
+permissions:
+ contents: read
+
+jobs:
+ build:
+ runs-on: ubuntu-latest
+ 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: Build
+ run: pnpm --filter @lucide/icons build
+
+ test:
+ runs-on: ubuntu-latest
+ 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: Test
+ run: pnpm --filter @lucide/icons test
diff --git a/.github/workflows/labeler.yml b/.github/workflows/labeler.yml
index bf474c478..75de3b3bb 100644
--- a/.github/workflows/labeler.yml
+++ b/.github/workflows/labeler.yml
@@ -2,11 +2,15 @@ name: 'Pull Request Labeler'
on:
- pull_request_target
+permissions: {}
+
jobs:
triage:
+ if: github.repository == 'lucide-icons/lucide'
permissions:
contents: read
pull-requests: write
runs-on: ubuntu-latest
steps:
- - uses: actions/labeler@v5
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
+ - uses: actions/labeler@bf12e9b00b37c5c0ca2b87b79b2daf7891dbda13 # v7.0.0
diff --git a/.github/workflows/lint-code.yml b/.github/workflows/lint-code.yml
new file mode 100644
index 000000000..edaec6611
--- /dev/null
+++ b/.github/workflows/lint-code.yml
@@ -0,0 +1,24 @@
+name: Linting PR code
+
+on:
+ pull_request:
+
+permissions:
+ contents: read
+
+jobs:
+ lint-code:
+ runs-on: ubuntu-latest
+ 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: Run Linter
+ run: pnpm lint
diff --git a/.github/workflows/lint-pr-title.yml b/.github/workflows/lint-pr-title.yml
new file mode 100644
index 000000000..ef9abcf61
--- /dev/null
+++ b/.github/workflows/lint-pr-title.yml
@@ -0,0 +1,36 @@
+name: Linting PR title
+
+on:
+ pull_request:
+ types:
+ - opened
+ - edited
+ - reopened
+
+permissions:
+ contents: read
+ pull-requests: read # Required to read the PR title
+
+jobs:
+ lint-pr-title:
+ name: PR Title Lint
+ runs-on: ubuntu-latest
+ steps:
+ - uses: amannn/action-semantic-pull-request@48f256284bd46cdaab1048c3721360e808335d50 # v6.1.1
+ env:
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+ with:
+ types: |
+ fix
+ feat
+ perf
+ refactor
+ test
+ style
+ docs
+ ci
+ build
+ chore
+ requireScope: true
+ ignoreLabels: |
+ bot
diff --git a/.github/workflows/linting-icons.yml b/.github/workflows/linting-icons.yml
new file mode 100644
index 000000000..0f69ba490
--- /dev/null
+++ b/.github/workflows/linting-icons.yml
@@ -0,0 +1,72 @@
+name: Linting Icons
+
+on:
+ push:
+ branches:
+ - next
+ pull_request:
+ paths:
+ - 'icons/*'
+ - 'lab/*'
+
+permissions: {}
+
+jobs:
+ lint-filenames:
+ name: Lint Filenames
+ if: github.repository == 'lucide-icons/lucide'
+ runs-on: ubuntu-latest
+ permissions:
+ 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: Get changed files
+ id: changed-files
+ uses: tj-actions/changed-files@9426d40962ed5378910ee2e21d5f8c6fcbf2dd96 # v47.0.6
+ with:
+ files: |
+ icons/*
+ lab/*
+
+ - name: Generate annotations
+ run: node ./scripts/lintFilenames.mts
+ env:
+ CHANGED_FILES: ${{ steps.changed-files.outputs.all_changed_files }}
+
+ check-lab-icons:
+ name: Check Lab Icons
+ runs-on: ubuntu-latest
+ permissions:
+ 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: Check lab icons do not already exist in icons
+ run: node ./scripts/checkLabIcons.mts
+
+ lint-aliases:
+ name: Check Uniqueness of Aliases
+ runs-on: ubuntu-latest
+ permissions:
+ contents: read
+ steps:
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
+ - name: Check Uniqueness of Aliases
+ run: "! cat <(printf \"%s\\n\" icons/*.json | while read -r name; do basename \"$name\" .json; done) <(jq -cr 'select(.aliases) | .aliases[] | if type==\"string\" then . else .name end' icons/*.json) | sort | uniq -c | grep -ve '^\\s*1 '"
diff --git a/.github/workflows/linting.yml b/.github/workflows/linting.yml
deleted file mode 100644
index cdc76ea5a..000000000
--- a/.github/workflows/linting.yml
+++ /dev/null
@@ -1,25 +0,0 @@
-name: Linting
-
-on:
- pull_request:
- branches:
- - '**'
-
-jobs:
- linting:
- runs-on: ubuntu-latest
- steps:
- - uses: actions/checkout@v4
- - uses: pnpm/action-setup@v2
- with:
- version: 8
- - uses: actions/setup-node@v4
- with:
- node-version: 18
- cache: 'pnpm'
-
- - name: Install Dependencies
- run: pnpm install --frozen-lockfile
-
- - name: Run Linter
- run: pnpm lint
diff --git a/.github/workflows/lucide-angular.yml b/.github/workflows/lucide-angular.yml
deleted file mode 100644
index 46c9a6e58..000000000
--- a/.github/workflows/lucide-angular.yml
+++ /dev/null
@@ -1,45 +0,0 @@
-name: Lucide Angular checks
-
-on:
- pull_request:
- paths:
- - packages/lucide-angular/**
- - tools/build-icons/**
- - pnpm-lock.yaml
-
-jobs:
- build:
- runs-on: ubuntu-latest
- steps:
- - uses: actions/checkout@v4
- - uses: pnpm/action-setup@v2
- with:
- version: 8
- - uses: actions/setup-node@v4
- with:
- node-version: 18
- cache: 'pnpm'
-
- - name: Install dependencies
- run: pnpm install --frozen-lockfile
-
- - name: Build
- run: pnpm --filter lucide-angular build
-
- test:
- runs-on: ubuntu-latest
- steps:
- - uses: actions/checkout@v3
- - uses: pnpm/action-setup@v2
- with:
- version: 8
- - uses: actions/setup-node@v3.8.1
- with:
- node-version: 18
- cache: 'pnpm'
-
- - name: Install dependencies
- run: pnpm install --frozen-lockfile
-
- - name: Test
- run: pnpm --filter lucide-angular test
diff --git a/.github/workflows/lucide-astro.yml b/.github/workflows/lucide-astro.yml
new file mode 100644
index 000000000..47a1fc8dd
--- /dev/null
+++ b/.github/workflows/lucide-astro.yml
@@ -0,0 +1,48 @@
+name: Lucide Astro Checks
+
+on:
+ push:
+ branches:
+ - next
+ pull_request:
+ paths:
+ - packages/astro/**
+ - packages/shared/**
+ - tools/build-icons/**
+ - pnpm-lock.yaml
+
+permissions:
+ contents: read
+
+jobs:
+ build:
+ runs-on: ubuntu-latest
+ 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:
+ node-version-file: 'package.json'
+ cache: 'pnpm'
+
+ - name: Install dependencies
+ run: pnpm install --frozen-lockfile
+
+ - name: Build
+ run: pnpm --filter @lucide/astro build
+
+ test:
+ runs-on: ubuntu-latest
+ 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:
+ node-version-file: 'package.json'
+ cache: 'pnpm'
+
+ - name: Install dependencies
+ run: pnpm install --frozen-lockfile
+
+ - name: Test
+ run: pnpm --filter @lucide/astro test
diff --git a/.github/workflows/lucide-font.yml b/.github/workflows/lucide-font.yml
index 5f183f813..7548723cb 100644
--- a/.github/workflows/lucide-font.yml
+++ b/.github/workflows/lucide-font.yml
@@ -1,36 +1,39 @@
name: Lucide font checks
on:
+ push:
+ branches:
+ - next
pull_request:
paths:
- - icons/**
- tools/build-font/**
- pnpm-lock.yaml
+permissions:
+ contents: read
+
jobs:
lucide-font:
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@v4
- - uses: pnpm/action-setup@v2
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
+ - uses: pnpm/action-setup@0977fd99725f1db4007ccb2928dbb4e90d06cc86 # v6.0.10
+ - uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0
with:
- version: 8
- - uses: actions/setup-node@v4
- with:
- node-version: 18
cache: 'pnpm'
+ node-version-file: 'package.json'
- name: Install dependencies
run: pnpm install --frozen-lockfile
- - name: Outline svg Icons
- run: pnpm build:outline-icons
+ - name: Execute unit tests for build-font
+ run: pnpm test:font
- name: Create font in ./lucide-font
run: pnpm build:font
- name: 'Upload to Artifacts'
- uses: actions/upload-artifact@v3
+ uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with:
name: lucide-font
path: lucide-font
diff --git a/.github/workflows/lucide-lab.yml b/.github/workflows/lucide-lab.yml
new file mode 100644
index 000000000..323cb3595
--- /dev/null
+++ b/.github/workflows/lucide-lab.yml
@@ -0,0 +1,30 @@
+name: Lucide Lab checks
+
+on:
+ pull_request:
+ paths:
+ - packages/lab/**
+ - packages/shared/**
+ - tools/build-icons/**
+ - tools/rollup-plugins/**
+ - pnpm-lock.yaml
+
+permissions:
+ contents: read
+
+jobs:
+ build:
+ runs-on: ubuntu-latest
+ 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: Build
+ run: pnpm --filter @lucide/lab build
diff --git a/.github/workflows/lucide-preact.yml b/.github/workflows/lucide-preact.yml
index c6c598d7a..f842c1b47 100644
--- a/.github/workflows/lucide-preact.yml
+++ b/.github/workflows/lucide-preact.yml
@@ -1,25 +1,30 @@
name: Lucide Preact Checks
on:
+ push:
+ branches:
+ - next
pull_request:
paths:
- packages/lucide-preact/**
+ - packages/shared/**
- tools/build-icons/**
- tools/rollup-plugins/**
- pnpm-lock.yaml
+permissions:
+ contents: read
+
jobs:
lucide-preact:
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@v4
- - uses: pnpm/action-setup@v2
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
+ - uses: pnpm/action-setup@0977fd99725f1db4007ccb2928dbb4e90d06cc86 # v6.0.10
+ - uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0
with:
- version: 8
- - uses: actions/setup-node@v4
- with:
- node-version: 18
cache: 'pnpm'
+ node-version-file: 'package.json'
- name: Install dependencies
run: pnpm install --frozen-lockfile
diff --git a/.github/workflows/lucide-react-native.yml b/.github/workflows/lucide-react-native.yml
index c68341303..6f8d83079 100644
--- a/.github/workflows/lucide-react-native.yml
+++ b/.github/workflows/lucide-react-native.yml
@@ -1,25 +1,46 @@
name: Lucide React Native checks
on:
+ push:
+ branches:
+ - next
pull_request:
paths:
- packages/lucide-react-native/**
+ - packages/shared/**
- tools/build-icons/**
- tools/rollup-plugins/**
- pnpm-lock.yaml
+permissions:
+ contents: read
+
jobs:
- lucide-react-native:
+ build:
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@v4
- - uses: pnpm/action-setup@v2
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
+ - uses: pnpm/action-setup@0977fd99725f1db4007ccb2928dbb4e90d06cc86 # v6.0.10
+ - uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0
with:
- version: 8
- - uses: actions/setup-node@v4
- with:
- node-version: 18
cache: 'pnpm'
+ node-version-file: 'package.json'
+
+ - name: Install dependencies
+ run: pnpm install --frozen-lockfile
+
+ - name: Build
+ run: pnpm --filter lucide-react-native build
+
+ test:
+ runs-on: ubuntu-latest
+ 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
diff --git a/.github/workflows/lucide-react.yml b/.github/workflows/lucide-react.yml
index b5b2b92e2..7d00a1ba5 100644
--- a/.github/workflows/lucide-react.yml
+++ b/.github/workflows/lucide-react.yml
@@ -1,26 +1,31 @@
name: Lucide React Checks
on:
+ push:
+ branches:
+ - next
pull_request:
paths:
- packages/lucide-react/**
+ - packages/shared/**
- tools/build-icons/**
- tools/rollup-plugins/**
- scripts/generateNextJSAliases.mjs
- pnpm-lock.yaml
+permissions:
+ contents: read
+
jobs:
build:
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@v4
- - uses: pnpm/action-setup@v2
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
+ - uses: pnpm/action-setup@0977fd99725f1db4007ccb2928dbb4e90d06cc86 # v6.0.10
+ - uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0
with:
- version: 8
- - uses: actions/setup-node@v4
- with:
- node-version: 18
cache: 'pnpm'
+ node-version-file: 'package.json'
- name: Install dependencies
run: pnpm install --frozen-lockfile
@@ -31,14 +36,12 @@ jobs:
test:
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@v3
- - uses: pnpm/action-setup@v2
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
+ - uses: pnpm/action-setup@0977fd99725f1db4007ccb2928dbb4e90d06cc86 # v6.0.10
+ - uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0
with:
- version: 8
- - uses: actions/setup-node@v3.8.1
- with:
- node-version: 18
cache: 'pnpm'
+ node-version-file: 'package.json'
- name: Install dependencies
run: pnpm install --frozen-lockfile
diff --git a/.github/workflows/lucide-shared.yml b/.github/workflows/lucide-shared.yml
new file mode 100644
index 000000000..efea0dc77
--- /dev/null
+++ b/.github/workflows/lucide-shared.yml
@@ -0,0 +1,30 @@
+name: Lucide Shared Checks
+
+on:
+ push:
+ branches:
+ - next
+ pull_request:
+ paths:
+ - packages/shared/**
+ - pnpm-lock.yaml
+
+permissions:
+ contents: read
+
+jobs:
+ test:
+ runs-on: ubuntu-latest
+ 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: Test
+ run: pnpm --filter lucide-react test
diff --git a/.github/workflows/lucide-solid.yml b/.github/workflows/lucide-solid.yml
index 6f67075f3..d78602a35 100644
--- a/.github/workflows/lucide-solid.yml
+++ b/.github/workflows/lucide-solid.yml
@@ -1,25 +1,30 @@
name: Lucide Solid Checks
on:
+ push:
+ branches:
+ - next
pull_request:
paths:
- packages/lucide-solid/**
+ - packages/shared/**
- tools/build-icons/**
- tools/rollup-plugins/**
- pnpm-lock.yaml
+permissions:
+ contents: read
+
jobs:
build:
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@v4
- - uses: pnpm/action-setup@v2
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
+ - uses: pnpm/action-setup@0977fd99725f1db4007ccb2928dbb4e90d06cc86 # v6.0.10
+ - uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0
with:
- version: 8
- - uses: actions/setup-node@v4
- with:
- node-version: 18
cache: 'pnpm'
+ node-version-file: 'package.json'
- name: Install dependencies
run: pnpm install --frozen-lockfile
@@ -30,14 +35,12 @@ jobs:
test:
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@v3
- - uses: pnpm/action-setup@v2
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
+ - uses: pnpm/action-setup@0977fd99725f1db4007ccb2928dbb4e90d06cc86 # v6.0.10
+ - uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0
with:
- version: 8
- - uses: actions/setup-node@v3.8.1
- with:
- node-version: 18
cache: 'pnpm'
+ node-version-file: 'package.json'
- name: Install dependencies
run: pnpm install --frozen-lockfile
diff --git a/.github/workflows/lucide-static.yml b/.github/workflows/lucide-static.yml
index fc0fc4b99..fee24bf72 100644
--- a/.github/workflows/lucide-static.yml
+++ b/.github/workflows/lucide-static.yml
@@ -7,18 +7,19 @@ on:
- tools/build-icons/**
- pnpm-lock.yaml
+permissions:
+ contents: read
+
jobs:
lucide-static:
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@v4
- - uses: pnpm/action-setup@v2
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
+ - uses: pnpm/action-setup@0977fd99725f1db4007ccb2928dbb4e90d06cc86 # v6.0.10
+ - uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0
with:
- version: 8
- - uses: actions/setup-node@v4
- with:
- node-version: 18
cache: 'pnpm'
+ node-version-file: 'package.json'
- name: Install dependencies
run: pnpm install --frozen-lockfile
diff --git a/.github/workflows/lucide-svelte-5.yml b/.github/workflows/lucide-svelte-5.yml
new file mode 100644
index 000000000..4f48fcf19
--- /dev/null
+++ b/.github/workflows/lucide-svelte-5.yml
@@ -0,0 +1,65 @@
+name: Lucide Svelte 5 checks
+
+on:
+ push:
+ branches:
+ - next
+ pull_request:
+ paths:
+ - packages/svelte/**
+ - packages/shared/**
+ - tools/build-icons/**
+ - tools/rollup-plugins/**
+ - pnpm-lock.yaml
+
+permissions:
+ contents: read
+
+jobs:
+ build:
+ runs-on: ubuntu-latest
+ 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: Build
+ run: pnpm --filter @lucide/svelte build
+
+ test:
+ runs-on: ubuntu-latest
+ 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: Test
+ run: pnpm --filter @lucide/svelte test
+
+ typecheck:
+ runs-on: ubuntu-latest
+ 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: Test
+ run: pnpm --filter @lucide/svelte typecheck
diff --git a/.github/workflows/lucide-svelte.yml b/.github/workflows/lucide-svelte.yml
deleted file mode 100644
index 4fa768db2..000000000
--- a/.github/workflows/lucide-svelte.yml
+++ /dev/null
@@ -1,46 +0,0 @@
-name: Lucide Svelte checks
-
-on:
- pull_request:
- paths:
- - packages/lucide-svelte/**
- - tools/build-icons/**
- - tools/rollup-plugins/**
- - pnpm-lock.yaml
-
-jobs:
- build:
- runs-on: ubuntu-latest
- steps:
- - uses: actions/checkout@v4
- - uses: pnpm/action-setup@v2
- with:
- version: 8
- - uses: actions/setup-node@v4
- with:
- node-version: 18
- cache: 'pnpm'
-
- - name: Install dependencies
- run: pnpm install --frozen-lockfile
-
- - name: Build
- run: pnpm --filter lucide-svelte build
-
- test:
- runs-on: ubuntu-latest
- steps:
- - uses: actions/checkout@v3
- - uses: pnpm/action-setup@v2
- with:
- version: 8
- - uses: actions/setup-node@v3.8.1
- with:
- node-version: 18
- cache: 'pnpm'
-
- - name: Install dependencies
- run: pnpm install --frozen-lockfile
-
- - name: Test
- run: pnpm --filter lucide-svelte test
diff --git a/.github/workflows/lucide-vue-next.yml b/.github/workflows/lucide-vue-next.yml
deleted file mode 100644
index 07310b8e9..000000000
--- a/.github/workflows/lucide-vue-next.yml
+++ /dev/null
@@ -1,46 +0,0 @@
-name: Lucide Vue Next checks
-
-on:
- pull_request:
- paths:
- - packages/lucide-vue-next/**
- - tools/build-icons/**
- - tools/rollup-plugins/**
- - pnpm-lock.yaml
-
-jobs:
- build:
- runs-on: ubuntu-latest
- steps:
- - uses: actions/checkout@v4
- - uses: pnpm/action-setup@v2
- with:
- version: 8
- - uses: actions/setup-node@v4
- with:
- node-version: 18
- cache: 'pnpm'
-
- - name: Install dependencies
- run: pnpm install --frozen-lockfile
-
- - name: Build
- run: pnpm --filter lucide-vue-next build
-
- test:
- runs-on: ubuntu-latest
- steps:
- - uses: actions/checkout@v3
- - uses: pnpm/action-setup@v2
- with:
- version: 8
- - uses: actions/setup-node@v3.8.1
- with:
- node-version: 18
- cache: 'pnpm'
-
- - name: Install dependencies
- run: pnpm install --frozen-lockfile
-
- - name: Test
- run: pnpm --filter lucide-vue-next test
diff --git a/.github/workflows/lucide-vue.yml b/.github/workflows/lucide-vue.yml
index c409956dc..e4e4ee9b6 100644
--- a/.github/workflows/lucide-vue.yml
+++ b/.github/workflows/lucide-vue.yml
@@ -1,46 +1,49 @@
name: Lucide Vue checks
on:
+ push:
+ branches:
+ - next
pull_request:
paths:
- - packages/lucide-vue/**
+ - packages/vue/**
+ - packages/shared/**
- tools/build-icons/**
- tools/rollup-plugins/**
- pnpm-lock.yaml
+permissions:
+ contents: read
+
jobs:
build:
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@v4
- - uses: pnpm/action-setup@v2
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
+ - uses: pnpm/action-setup@0977fd99725f1db4007ccb2928dbb4e90d06cc86 # v6.0.10
+ - uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0
with:
- version: 8
- - uses: actions/setup-node@v4
- with:
- node-version: 18
cache: 'pnpm'
+ node-version-file: 'package.json'
- name: Install dependencies
run: pnpm install --frozen-lockfile
- name: Build
- run: pnpm --filter lucide-vue build
+ run: pnpm --filter @lucide/vue build
test:
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@v3
- - uses: pnpm/action-setup@v2
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
+ - uses: pnpm/action-setup@0977fd99725f1db4007ccb2928dbb4e90d06cc86 # v6.0.10
+ - uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0
with:
- version: 8
- - uses: actions/setup-node@v3.8.1
- with:
- node-version: 18
cache: 'pnpm'
+ node-version-file: 'package.json'
- name: Install dependencies
run: pnpm install --frozen-lockfile
- name: Test
- run: pnpm --filter lucide-vue test
+ run: pnpm --filter @lucide/vue test
diff --git a/.github/workflows/lucide.yml b/.github/workflows/lucide.yml
index 9f8083cdf..844d2647f 100644
--- a/.github/workflows/lucide.yml
+++ b/.github/workflows/lucide.yml
@@ -1,6 +1,9 @@
name: Lucide checks
on:
+ push:
+ branches:
+ - next
pull_request:
paths:
- packages/lucide/**
@@ -8,18 +11,19 @@ on:
- tools/rollup-plugins/**
- pnpm-lock.yaml
+permissions:
+ contents: read
+
jobs:
build:
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@v4
- - uses: pnpm/action-setup@v2
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
+ - uses: pnpm/action-setup@0977fd99725f1db4007ccb2928dbb4e90d06cc86 # v6.0.10
+ - uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0
with:
- version: 8
- - uses: actions/setup-node@v4
- with:
- node-version: 18
cache: 'pnpm'
+ node-version-file: 'package.json'
- name: Install dependencies
run: pnpm install --frozen-lockfile
@@ -30,14 +34,12 @@ jobs:
test:
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@v3
- - uses: pnpm/action-setup@v2
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
+ - uses: pnpm/action-setup@0977fd99725f1db4007ccb2928dbb4e90d06cc86 # v6.0.10
+ - uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0
with:
- version: 8
- - uses: actions/setup-node@v3.8.1
- with:
- node-version: 18
cache: 'pnpm'
+ node-version-file: 'package.json'
- name: Install dependencies
run: pnpm install --frozen-lockfile
diff --git a/.github/workflows/pull-request-icon-preview.yml b/.github/workflows/pull-request-icon-preview.yml
new file mode 100644
index 000000000..62112e892
--- /dev/null
+++ b/.github/workflows/pull-request-icon-preview.yml
@@ -0,0 +1,49 @@
+name: Pull request icon preview
+
+on:
+ pull_request:
+ paths:
+ - 'icons/*.svg'
+
+permissions: {}
+
+jobs:
+ generate-changed-icons-comment:
+ name: Generate Changed Icons Comment
+ if: github.repository == 'lucide-icons/lucide'
+ runs-on: ubuntu-latest
+ permissions:
+ contents: read
+ pull-requests: write
+
+ steps:
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
+ - uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0
+ with:
+ node-version-file: 'package.json'
+
+ - name: Get changed files
+ id: changed-files
+ uses: tj-actions/changed-files@9426d40962ed5378910ee2e21d5f8c6fcbf2dd96 # v47.0.6
+ with:
+ files: icons/*.svg
+
+ - uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0
+ - name: Install svgson for code preview (safer and faster than installing all deps)
+ run: npm install svgson@5.3.1 --force
+
+ - name: Save PR number
+ run: |
+ mkdir -p ./pr
+ echo ${{ github.event.number }} > ./pr/NR
+
+ - name: Generate comment markup
+ run: node ./scripts/generateChangedIconsCommentMarkup.mts >> ./pr/comment-markup.md
+ id: comment-markup
+ env:
+ CHANGED_FILES: ${{ steps.changed-files.outputs.all_changed_files }}
+
+ - uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
+ with:
+ name: pr_number
+ path: pr/
diff --git a/.github/workflows/pull-request-metadata-suggestions.yml b/.github/workflows/pull-request-metadata-suggestions.yml
new file mode 100644
index 000000000..cc1586da7
--- /dev/null
+++ b/.github/workflows/pull-request-metadata-suggestions.yml
@@ -0,0 +1,40 @@
+name: Pull request metadata suggestions
+
+on:
+ pull_request_target:
+ paths:
+ - 'icons/*.json'
+
+permissions: {}
+
+jobs:
+ pull-request-metadata-suggestions:
+ name: Pull Request Metadata Suggestions
+ if: github.repository == 'lucide-icons/lucide'
+ runs-on: ubuntu-latest
+ permissions:
+ contents: read
+ pull-requests: write
+
+ steps:
+ # We checkout the main branch of main repository for security reasons.
+ # This is to prevent the workflow from running on a forked repository.
+ - 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
+ run: node ./scripts/suggestMetaData.mts
+ env:
+ OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
+ PULL_REQUEST_NUMBER: ${{ github.event.number }}
+ COMMIT_SHA: ${{ github.event.pull_request.head.sha }}
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
diff --git a/.github/workflows/pull-request.yml b/.github/workflows/pull-request.yml
deleted file mode 100644
index a20441278..000000000
--- a/.github/workflows/pull-request.yml
+++ /dev/null
@@ -1,123 +0,0 @@
-name: Add Changed Icons comment
-
-on:
- pull_request_target:
- paths:
- - 'icons/*'
- branches:
- - main
- - fix-icon-preview
-
-jobs:
- lint-filenames:
- if: github.repository == 'lucide-icons/lucide'
- runs-on: ubuntu-latest
- permissions:
- contents: read
- steps:
- - uses: actions/checkout@v4
- with:
- fetch-depth: 0
- ref: refs/pull/${{ github.event.pull_request.number }}/merge
- - name: Get changed files
- id: changed-files
- uses: tj-actions/changed-files@v41
- with:
- files: icons/*
- - name: Generate annotations
- run: node ./scripts/lintFilenames.mjs
- env:
- CHANGED_FILES: ${{ steps.changed-files.outputs.all_changed_files }}
-
- lint-contributors:
- if: github.repository == 'lucide-icons/lucide'
- runs-on: ubuntu-latest
- permissions:
- contents: read
- steps:
- - uses: actions/checkout@v4
- with:
- fetch-depth: 0
- ref: refs/pull/${{ github.event.pull_request.number }}/merge
- - name: Get changed files
- id: changed-files
- uses: tj-actions/changed-files@v41
- with:
- files: icons/*
- - uses: actions/setup-node@v4
- - name: Install simple-git (safer and faster than installing all deps)
- run: npm install simple-git
- - name: Generate annotations
- run: node ./scripts/updateContributors.mjs
- env:
- GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- FETCH_DEPTH: ${{ github.event.pull_request.commits }}
- CHANGED_FILES: ${{ steps.changed-files.outputs.all_changed_files }}
- - name: Generate annotations
- env:
- ANNOTATION_SEVERITY: notice
- ANNOTATION_TITLE: Contributors have changed!
- ANNOTATION_DESCRIPTION: Don't add people who have only performed automatic optimizations.
- run: |
- git diff --unified=0 -- icons/*.json | # diff icon metadata (unified=0 gives the correct chunk line number)
- perl -ne '/^(\+|- |@)/ && print' | # get chunks (lines that start with "+++", "@@", "+ ", "- ")
- perl -pe 's/\n/%0A/' | # url encode line breaks (\n -> %0A)
- perl -pe 's/%0A(\+\+\+ b\/)/\n\1/g' | # split chunks(one chunk per line)
- perl -pe "s/\+\+\+ b\/([^@]*)%0A@@ -(\d+)[^\s]* \+(\d+)[^@]*@@(.*)/::$ANNOTATION_SEVERITY file=\1,line=\2,endLine=\3,title=$ANNOTATION_TITLE::$ANNOTATION_DESCRIPTION%0A\4/"
- # Example for the previous substitution
- # input: +++ b/icons/accessibility.json%0A@@ -2,0 +3 @@%0A+ "contributors": ["hi"],%0A@@ -13 +14 @@%0A+}%0A
- # output: ::$ANNOTATION_SEVERITY file=icons/accessibility.json,line=2,endLine=3,title=$ANNOTATION_TITLE::$ANNOTATION_DESCRIPTION%0A%0A+ "contributors": ["hi"],%0A@@ -13 +14 @@%0A+}%0A
-
- lint-aliases:
- name: Check Uniqueness of Aliases
- runs-on: ubuntu-latest
- permissions:
- contents: read
- steps:
- - uses: actions/checkout@v4
- - name: Check Uniqueness of Aliases
- run: "! cat <(printf \"%s\\n\" icons/*.json | while read -r name; do basename \"$name\" .json; done) <(jq -cr 'select(.aliases) | .aliases[] | if type==\"string\" then . else .name end' icons/*.json) | sort | uniq -c | grep -ve '^\\s*1 '"
-
- generate-changed-icons-comment:
- runs-on: ubuntu-latest
- permissions:
- contents: read
- pull-requests: write
-
- steps:
- - uses: actions/checkout@v4
- with:
- fetch-depth: 0
- ref: refs/pull/${{ github.event.pull_request.number }}/merge
-
- - name: Get changed files
- id: changed-files
- uses: tj-actions/changed-files@v41
- with:
- files: icons/*.svg
-
- - name: Find Comment
- uses: peter-evans/find-comment@v2
- id: pr-comment
- with:
- issue-number: ${{ github.event.pull_request.number }}
- comment-author: 'github-actions[bot]'
- body-includes: Added or changed icons
-
- - uses: actions/setup-node@v4
- - name: Install svgson for code preview (safer and faster than installing all deps)
- run: npm install svgson
-
- - name: Generate comment markup
- run: node ./scripts/generateChangedIconsCommentMarkup.mjs >> comment-markup.md
- id: comment-markup
- env:
- CHANGED_FILES: ${{ steps.changed-files.outputs.all_changed_files }}
-
- - name: Create or update comment
- uses: peter-evans/create-or-update-comment@v3
- with:
- comment-id: ${{ steps.pr-comment.outputs.comment-id }}
- issue-number: ${{ github.event.pull_request.number }}
- body-path: ./comment-markup.md
- edit-mode: replace
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
index bfefa436e..e200da21f 100644
--- a/.github/workflows/release.yml
+++ b/.github/workflows/release.yml
@@ -11,20 +11,19 @@ on:
required: true
description: Version
type: string
+ tag:
+ description: NPM tag
+ default: 'latest'
+ type: string
- workflow_dispatch:
- inputs:
- version:
- description: Version
- required: true
+permissions: {}
jobs:
- pre-release:
- if: github.repository == 'lucide-icons/lucide' && contains('["ericfennis", "karsa-mistmere"]', github.actor)
+ prepare:
+ if: github.repository == 'lucide-icons/lucide' && contains('["ericfennis", "karsa-mistmere", "jguddas"]', github.actor)
runs-on: ubuntu-latest
outputs:
VERSION: ${{ steps.get_version.outputs.VERSION }}
-
steps:
- name: Get the version
id: get_version
@@ -37,7 +36,10 @@ jobs:
release:
if: github.repository == 'lucide-icons/lucide'
runs-on: ubuntu-latest
- needs: pre-release
+ needs: prepare
+ permissions:
+ id-token: write # Required for OIDC
+ contents: read
strategy:
fail-fast: false
matrix:
@@ -46,31 +48,27 @@ jobs:
'lucide',
'lucide-react',
'lucide-react-native',
- 'lucide-vue',
- 'lucide-vue-next',
- 'lucide-angular',
'lucide-preact',
'lucide-solid',
- 'lucide-svelte',
+ '@lucide/angular',
+ '@lucide/astro',
+ '@lucide/icons',
+ '@lucide/svelte',
+ '@lucide/vue',
]
steps:
- - uses: actions/checkout@v4
- - uses: pnpm/action-setup@v2
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
+ - uses: pnpm/action-setup@0977fd99725f1db4007ccb2928dbb4e90d06cc86 # v6.0.10
+ - uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0
with:
- version: 8
- - uses: actions/setup-node@v4
- with:
- node-version: 18
cache: 'pnpm'
+ node-version-file: 'package.json'
- name: Install dependencies
run: pnpm install --frozen-lockfile
- - name: Set Auth Token
- run: npm config set //registry.npmjs.org/:_authToken ${{ inputs.NPM_TOKEN || secrets.NPM_TOKEN }}
-
- name: Set new version
- run: pnpm --filter ${{ matrix.package }} version --new-version ${{ needs.pre-release.outputs.VERSION }} --no-git-tag-version
+ run: pnpm version ${{ needs.prepare.outputs.VERSION }} --filter ${{ matrix.package }} --fail-if-no-match --no-git-tag-version
- name: Build
run: pnpm --filter ${{ matrix.package }} build
@@ -79,31 +77,36 @@ jobs:
run: pnpm --filter ${{ matrix.package }} test
- name: Publish
- run: pnpm --filter ${{ matrix.package }} publish --no-git-checks --ignore-scripts
+ run: pnpm --filter ${{ matrix.package }} publish --access public --no-git-checks --ignore-scripts --tag ${{ inputs.tag }}
+ env:
+ NPM_CONFIG_PROVENANCE: true
lucide-static:
if: github.repository == 'lucide-icons/lucide'
runs-on: ubuntu-latest
- needs: [pre-release, lucide-font]
+ needs: [prepare, lucide-font]
+ permissions:
+ id-token: write # Required for OIDC
+ contents: read
+
steps:
- - uses: actions/checkout@v4
- - uses: actions/download-artifact@v3
- - uses: pnpm/action-setup@v2
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
+ - uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
with:
- version: 8
- - uses: actions/setup-node@v4
+ name: lucide-font
+ path: lucide-font
+
+ - uses: pnpm/action-setup@0977fd99725f1db4007ccb2928dbb4e90d06cc86 # v6.0.10
+ - uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0
with:
- node-version: 18
cache: 'pnpm'
+ node-version-file: 'package.json'
- name: Install dependencies
run: pnpm install --frozen-lockfile
- - name: Set Auth Token
- run: npm config set //registry.npmjs.org/:_authToken ${{ secrets.NPM_TOKEN }}
-
- name: Set new version
- run: pnpm --filter lucide-static version --new-version ${{ needs.pre-release.outputs.VERSION }} --no-git-tag-version
+ run: pnpm version ${{ needs.prepare.outputs.VERSION }} --filter lucide-static --no-git-tag-version
- name: Move Font
run: cp -r lucide-font packages/lucide-static/font
@@ -112,54 +115,64 @@ jobs:
run: pnpm --filter lucide-static build
- name: Publish
- run: pnpm --filter lucide-static publish --no-git-checks
+ run: pnpm --filter lucide-static publish --no-git-checks --ignore-scripts --tag ${{ inputs.tag }} --access public
+ env:
+ NPM_CONFIG_PROVENANCE: true
lucide-font:
if: github.repository == 'lucide-icons/lucide'
runs-on: ubuntu-latest
- needs: pre-release
+ needs: prepare
+ permissions:
+ contents: read
steps:
- - uses: actions/checkout@v4
- - uses: pnpm/action-setup@v2
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
+ - uses: pnpm/action-setup@0977fd99725f1db4007ccb2928dbb4e90d06cc86 # v6.0.10
+ - uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0
with:
- version: 8
- - uses: actions/setup-node@v4
- with:
- node-version: 18
cache: 'pnpm'
+ node-version-file: 'package.json'
- name: Install dependencies
run: pnpm install --frozen-lockfile
- - name: Outline svg Icons
- run: pnpm build:outline-icons
+ - name: Execute unit tests for build-font
+ run: pnpm test:font
- name: Create font in ./lucide-font
- run: pnpm build:font
+ run: pnpm build:font --saveCodePoints
+ env:
+ BLOB_READ_WRITE_TOKEN: ${{ secrets.BLOB_READ_WRITE_TOKEN }}
- name: 'Upload to Artifacts'
- uses: actions/upload-artifact@v3
+ uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with:
name: lucide-font
path: lucide-font
post-release:
- if: github.repository == 'lucide-icons/lucide'
+ if: github.repository == 'lucide-icons/lucide' && github.event_name != 'workflow_call'
runs-on: ubuntu-latest
- needs: [pre-release, lucide-font]
-
+ needs: [prepare, lucide-font]
+ permissions:
+ contents: write # Required to upload the release assets
steps:
- - uses: actions/checkout@v4
- - uses: actions/download-artifact@v3
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
+ - uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
+ with:
+ name: lucide-font
+ path: lucide-font
+
- name: Zip font and icons
run: |
- zip -r lucide-font-${{ needs.pre-release.outputs.VERSION }}.zip lucide-font
- zip -r lucide-icons-${{ needs.pre-release.outputs.VERSION }}.zip icons
+ zip -r lucide-font-${{ needs.prepare.outputs.VERSION }}.zip lucide-font
+ zip -r lucide-icons-${{ needs.prepare.outputs.VERSION }}.zip icons
- name: Release zip and fonts
- uses: softprops/action-gh-release@v1
+ uses: softprops/action-gh-release@3d0d9888cb7fd7b750713d6e236d1fcb99157228 # v3.0.2
with:
- tag_name: ${{ needs.pre-release.outputs.VERSION }}
+ tag_name: ${{ needs.prepare.outputs.VERSION }}
+
files: |
- lucide-font-${{ needs.pre-release.outputs.VERSION }}.zip
- lucide-icons-${{ needs.pre-release.outputs.VERSION }}.zip
+ lucide-font-${{ needs.prepare.outputs.VERSION }}.zip
+ lucide-icons-${{ needs.prepare.outputs.VERSION }}.zip
diff --git a/.github/workflows/repo-journal.yml b/.github/workflows/repo-journal.yml
new file mode 100644
index 000000000..b457fe47f
--- /dev/null
+++ b/.github/workflows/repo-journal.yml
@@ -0,0 +1,45 @@
+name: Weekly Repo Report
+on:
+ workflow_dispatch:
+ # Run this workflow every Monday at 07:00 UTC
+ schedule:
+ - cron: '0 7 * * 1'
+
+permissions:
+ contents: read
+
+jobs:
+ weekly-summary:
+ if: github.repository == 'lucide-icons/lucide'
+ runs-on: ubuntu-latest
+ steps:
+ - name: Set up Node.js environment
+ uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0
+ with:
+ node-version: 24
+
+ - name: Install Copilot CLI
+ run: npm install -g @github/copilot
+
+ - name: Run the prompt
+ env:
+ COPILOT_GITHUB_TOKEN: ${{ secrets.COPILOT_GITHUB_TOKEN }}
+ run: |
+ copilot -p "${{ vars.REPO_REPORT_PROMPT }} Write the details to summary.md" --allow-tool='shell(git:*)' --allow-tool=write --no-ask-user
+ cat summary.md >> "$GITHUB_STEP_SUMMARY"
+
+ - name: Post report to Discord (private channel)
+ env:
+ DISCORD_WEBHOOK_URL: ${{ secrets.LUCIDE_DISCORD_WEBHOOK }}
+ run: |
+ jq -Rs '{
+ embeds: [{
+ title: "📊 Weekly Repo Report",
+ description: (.[0:4096]),
+ color: 5814783
+ }]
+ }' summary.md > payload.json
+ curl -sS --fail -X POST \
+ -H "Content-Type: application/json" \
+ -d @payload.json \
+ "$DISCORD_WEBHOOK_URL"
diff --git a/.github/workflows/request-review.yml b/.github/workflows/request-review.yml
new file mode 100644
index 000000000..3139435f8
--- /dev/null
+++ b/.github/workflows/request-review.yml
@@ -0,0 +1,35 @@
+name: Request Review
+on:
+ pull_request:
+ types: [opened]
+ paths:
+ - icons/*.svg
+
+permissions: {}
+
+jobs:
+ request-review:
+ if: github.repository == 'lucide-icons/lucide' && github.event.pull_request.draft == false
+ runs-on: ubuntu-latest
+ permissions:
+ contents: read
+ pull-requests: write
+ steps:
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
+ with:
+ fetch-depth: 0
+ ref: refs/pull/${{ github.event.pull_request.number }}/merge
+ - name: Get changed files
+ id: changed-files
+ uses: tj-actions/changed-files@9426d40962ed5378910ee2e21d5f8c6fcbf2dd96 # v47.0.6
+ with:
+ files: icons/*.svg
+ - run: |
+ while IFS= read -r file; do
+ jq -r '.contributors[]' "${file%.svg}.json"
+ done <<< "$CHANGED_FILES" | while read -r contributor; do
+ gh pr edit "${{ github.event.pull_request.number }}" --add-reviewer "$contributor" || true
+ done
+ env:
+ GH_TOKEN: ${{ github.token }}
+ CHANGED_FILES: ${{ steps.changed-files.outputs.all_changed_files }}
diff --git a/.github/workflows/version-up.sh b/.github/workflows/version-up.sh
deleted file mode 100755
index 32892478e..000000000
--- a/.github/workflows/version-up.sh
+++ /dev/null
@@ -1,284 +0,0 @@
-#!/usr/bin/env bash
-## Copyright (C) 2017, Oleksandr Kucherenko
-## Last revisit: 2017-09-29
-
-## get highest version tag for all branches
-function highest_tag(){
- local TAG=$(git describe --tags `git rev-list --tags --max-count=1`)
- echo "$TAG"
-}
-
-## extract current branch name
-function current_branch(){
- ## expected: heads/{branch_name}
- ## expected: {branch_name}
- local BRANCH=$(git rev-parse --abbrev-ref HEAD | cut -d"/" -f2)
- echo "$BRANCH"
-}
-
-## get latest/head commit hash number
-function head_hash(){
- local COMMIT_HASH=$(git rev-parse --verify HEAD)
- echo "$COMMIT_HASH"
-}
-
-## extract tag commit hash code, tag name provided by argument
-function tag_hash(){
- local TAG_HASH=$(git log -1 --format=format:"%H" $1 2>/dev/null | tail -n1)
- echo "$TAG_HASH"
-}
-
-## get latest revision number
-function latest_revision(){
- local REV=$(git rev-list --count HEAD 2>/dev/null)
- echo "$REV"
-}
-
-## parse last found tag, extract it PARTS
-function parse_last(){
- local position=$(($1-1))
-
- # two parts found only
- local SUBS=( ${PARTS[$position]//-/ } )
- #echo ${SUBS[@]}, size: ${#SUBS}
-
- # found NUMBER
- PARTS[$position]=${SUBS[0]}
- #echo ${PARTS[@]}
-
- # found SUFFIX
- if [[ ${#SUBS} -ge 1 ]]; then
- PARTS[4]=${SUBS[1],,} #lowercase
- #echo ${PARTS[@]}, ${SUBS[@]}
- fi
-}
-
-## increment REVISION part, don't touch STAGE
-function increment_revision(){
- PARTS[3]=$(( PARTS[3] + 1 ))
- IS_DIRTY=1
-}
-
-## increment PATCH part, reset all other lower PARTS, don't touch STAGE
-function increment_patch(){
- PARTS[2]=$(( PARTS[2] + 1 ))
- PARTS[3]=0
- IS_DIRTY=1
-}
-
-## increment MINOR part, reset all other lower PARTS, don't touch STAGE
-function increment_minor(){
- PARTS[1]=$(( PARTS[1] + 1 ))
- PARTS[2]=0
- PARTS[3]=0
- IS_DIRTY=1
-}
-
-## increment MAJOR part, reset all other lower PARTS, don't touch STAGE
-function incremet_major(){
- PARTS[0]="v$(( PARTS[0] + 1 ))"
- PARTS[1]=0
- PARTS[2]=0
- PARTS[3]=0
- IS_DIRTY=1
-}
-
-## increment the number only of last found PART: REVISION --> PATCH --> MINOR. don't touch STAGE
-function increment_last_found(){
- if [[ "${#PARTS[3]}" == 0 || "${PARTS[3]}" == "0" ]]; then
- if [[ "${#PARTS[2]}" == 0 || "${PARTS[2]}" == "0" ]]; then
- increment_minor
- else
- increment_patch
- fi
- else
- increment_revision
- fi
-
- # stage part is not EMPTY
- if [[ "${#PARTS[4]}" != 0 ]]; then
- IS_SHIFT=1
- fi
-}
-
-## compose version from PARTS
-function compose(){
- MAJOR="${PARTS[0]}"
- MINOR=".${PARTS[1]}"
- PATCH=".${PARTS[2]}"
- REVISION=".${PARTS[3]}"
- SUFFIX="-${PARTS[4]}"
-
- if [[ "${#PATCH}" == 1 ]]; then # if empty {PATCH}
- PATCH=""
- fi
-
- if [[ "${#REVISION}" == 1 ]]; then # if empty {REVISION}
- REVISION=""
- fi
-
- if [[ "${PARTS[3]}" == "0" ]]; then # if revision is ZERO
- REVISION=""
- fi
-
- # shrink patch and revision
- if [[ -z "${REVISION// }" ]]; then
- if [[ "${PARTS[2]}" == "0" ]]; then
- PATCH=".0"
- fi
- else # revision is not EMPTY
- if [[ "${#PATCH}" == 0 ]]; then
- PATCH=".0"
- fi
- fi
-
- # remove suffix if we don't have a alpha/beta/rc
- if [[ "${#SUFFIX}" == 1 ]]; then
- SUFFIX=""
- fi
-
-
- echo "${MAJOR}${MINOR}${PATCH}${REVISION}${SUFFIX}" #full format
-}
-
-# initial version used for repository without tags
-INIT_VERSION=0.0.0.0-alpha
-
-# do GIT data extracting
-TAG=$(highest_tag)
-REVISION=$(latest_revision)
-BRANCH=$(current_branch)
-TAG_HASH=$(tag_hash $TAG)
-HEAD_HASH=$(head_hash)
-
-# if tag and branch commit hashes are different, than print info about that
-#echo $HEAD_HASH vs $TAG_HASH
-if [[ "$@" == "" ]]; then
- if [[ "$TAG_HASH" == "$HEAD_HASH" ]]; then
- echo "Tag $TAG and HEAD are aligned. We will stay on the TAG version."
- echo ""
- NO_ARGS_VALUE='--stay'
- else
- PATTERN="^[0-9]+.[0-9]+(.[0-9]+)*(-(alpha|beta|rc))*$"
-
- if [[ "$BRANCH" =~ $PATTERN ]]; then
- echo "Detected version branch '$BRANCH'. We will auto-increment the last version PART."
- echo ""
- NO_ARGS_VALUE='--default'
- else
- echo "Detected branch name '$BRANCH' than does not match version pattern. We will increase MINOR."
- echo ""
- NO_ARGS_VALUE='--minor'
- fi
- fi
-fi
-
-#
-# {MAJOR}.{MINOR}[.{PATCH}[.{REVISION}][-(.*)]
-#
-# Suffix: alpha, beta, rc
-# No Suffix --> {NEW_VERSION}-alpha
-# alpha --> beta
-# beta --> rc
-# rc --> {VERSION}
-#
-PARTS=( ${TAG//./ } )
-parse_last ${#PARTS[@]} # array size as argument
-#echo ${PARTS[@]}
-
-# if no parameters than emulate --default parameter
-if [[ "$@" == "" ]]; then
- set -- $NO_ARGS_VALUE
-fi
-
-# parse input parameters
-for i in "$@"
-do
- key="$i"
-
- case $key in
- -a|--alpha) # switched to ALPHA
- PARTS[4]="alpha"
- IS_SHIFT=1
- ;;
- -b|--beta) # switched to BETA
- PARTS[4]="beta"
- IS_SHIFT=1
- ;;
- -c|--release-candidate) # switched to RC
- PARTS[4]="rc"
- IS_SHIFT=1
- ;;
- -r|--release) # switched to RELEASE
- PARTS[4]=""
- IS_SHIFT=1
- ;;
- -p|--patch) # increment of PATCH
- increment_patch
- ;;
- -e|--revision) # increment of REVISION
- increment_revision
- ;;
- -g|--git-revision) # use git revision number as a revision part§
- PARTS[3]=$(( REVISION ))
- IS_DIRTY=1
- ;;
- -i|--minor) # increment of MINOR by default
- increment_minor
- ;;
- --default) # stay on the same stage, but increment only last found PART of version code
- increment_last_found
- ;;
- -m|--major) # increment of MAJOR
- incremet_major
- ;;
- -s|--stay) # extract version info
- IS_DIRTY=1
- NO_APPLY_MSG=1
- ;;
- -t|--tag-only) # extract version info
- TAG_ONLY=1
- ;;
- --apply)
- DO_APPLY=1
- ;;
- -h|--help)
- help
- ;;
- esac
- shift
-done
-
-# detected shift, but no increment
-if [[ "$IS_SHIFT" == "1" ]]; then
- # temporary disable stage shift
- stage=${PARTS[4]}
- PARTS[4]=''
-
- # detect first run on repository, INIT_VERSION was used
- if [[ "$(compose)" == "0.0" ]]; then
- increment_minor
- fi
-
- PARTS[4]=$stage
-fi
-
-# no increment applied yet and no shift of state, do minor increase
-if [[ "$IS_DIRTY$IS_SHIFT" == "" ]]; then
- increment_minor
-fi
-
-compose
-
-# is proposed tag in conflict with any other TAG
-PROPOSED_HASH=$(tag_hash $(compose))
-if [[ "${#PROPOSED_HASH}" -gt 0 && "$NO_APPLY_MSG" == "" ]]; then
- echo -e "\033[31mERROR:\033[0m "
- echo -e "\033[31mERROR:\033[0m Found conflict with existing tag \033[32m$(compose)\033[0m / $PROPOSED_HASH"
- echo -e "\033[31mERROR:\033[0m Only manual resolving is possible now."
- echo -e "\033[31mERROR:\033[0m "
- echo -e "\033[31mERROR:\033[0m To Resolve try to add --revision or --patch modifier."
- echo -e "\033[31mERROR:\033[0m "
- echo ""
- exit 1
-fi
diff --git a/.gitignore b/.gitignore
index a8a38a895..0ad3cb108 100644
--- a/.gitignore
+++ b/.gitignore
@@ -4,6 +4,7 @@
.obsidian
.now
.idea
+.env
node_modules
dist
build
@@ -13,18 +14,32 @@ coverage
stats
*.log
outlined
+lucide-font
packages/**/src/icons/*.js
packages/**/src/icons/*.ts
packages/**/src/icons/*.tsx
+packages/**/src/aliases/*.ts
packages/**/src/aliases.ts
+!packages/**/src/aliases/index.ts
+packages/**/src/utils/*.ts
+!packages/shared/src/utils/*.ts
packages/**/src/dynamicIconImports.ts
+packages/**/DynamicIcon.d.ts
packages/**/dynamicIconImports.js
+packages/**/dynamicIconImports.mjs
packages/**/dynamicIconImports.d.ts
+packages/**/dynamicIconImports.d.mts
packages/**/dynamicIconImports.js.map
+packages/**/dynamicIconImports.mjs.map
+packages/**/dynamic.d.ts
+packages/**/dynamic.d.mts
+packages/**/dynamic.mjs.map
+packages/**/dynamic.mjs
packages/**/LICENSE
categories.json
tags.json
.vercel
+package-lock.json
# docs
docs/.vitepress/cache
@@ -33,9 +48,16 @@ docs/.vitepress/.temp
docs/.vitepress/data/iconNodes
docs/.vitepress/data/iconMetaData.ts
docs/.vitepress/data/releaseMetaData.json
-docs/.vitepress/data/releaseMetaData
+docs/.vitepress/data/releaseMetadata
docs/.vitepress/data/categoriesData.json
docs/.vitepress/data/iconDetails
docs/.vitepress/data/relatedIcons.json
+docs/.vitepress/data/brandStopwords.json
+docs/.vitepress/data/iconPopularity
+docs/.vitepress/data/lab/iconNodes
+docs/.vitepress/data/lab/iconMetaData.ts
+docs/.vitepress/data/lab/iconPopularity
docs/.vercel
docs/.nitro
+docs/public/og/**
+!docs/public/og/general.png
diff --git a/.npmrc b/.npmrc
deleted file mode 100644
index 3e775efb0..000000000
--- a/.npmrc
+++ /dev/null
@@ -1 +0,0 @@
-auto-install-peers=true
diff --git a/.prettierignore b/.prettierignore
index c150f271b..435726b81 100644
--- a/.prettierignore
+++ b/.prettierignore
@@ -7,8 +7,8 @@ docs/.vitepress/cache
docs/.vitepress/data
docs/.nitro
-# lucide-angular
-packages/lucide-angular/.angular/cache
+# @lucide/angular
+packages/angular/.angular
# lucide-static
packages/lucide-static/icons
@@ -17,7 +17,8 @@ packages/lucide-static/sprite.svg
packages/lucide-static/tags.json
packages/lucide-static/icon-nodes.json
packages/lucide-static/font
+packages/svelte/.svelte-kit
# lucide-svelte
-packages/lucide-svelte/src/icons/*.svelte
-packages/lucide-svelte/.svelte-kit
+packages/svelte/src/icons/*.svelte
+packages/svelte/.svelte-kit
diff --git a/.vscode/settings.json b/.vscode/settings.json
index f179cbc07..9c7cfd29c 100644
--- a/.vscode/settings.json
+++ b/.vscode/settings.json
@@ -1,6 +1,6 @@
{
- "cSpell.words": ["devs", "preact", "Preact"],
+ "cSpell.words": ["devs", "linecap", "linejoin", "preact", "Preact"],
"eslint.enable": true,
"eslint.validate": ["javascript", "svg"],
- "svg.preview.background": "transparent"
+ "svg.preview.background": "editor"
}
diff --git a/.vscode/svg.code-snippets b/.vscode/svg.code-snippets
index 52cbb23c1..dbf726e6b 100644
--- a/.vscode/svg.code-snippets
+++ b/.vscode/svg.code-snippets
@@ -1,4 +1,5 @@
{
+ "$schema": "https://raw.githubusercontent.com/Yash-Singh1/vscode-snippets-json-schema/main/schema.json",
"Lucide SVG": {
"scope": "xml",
"description": "Base SVG with Lucide attributes.",
@@ -51,6 +52,16 @@
],
"body": "
+
diff --git a/LICENSE b/LICENSE
index 325e8ff0a..718bb3f0e 100644
--- a/LICENSE
+++ b/LICENSE
@@ -1,6 +1,6 @@
ISC License
-Copyright (c) for portions of Lucide are held by Cole Bemis 2013-2022 as part of Feather (MIT). All other copyright (c) for Lucide are held by Lucide Contributors 2022.
+Copyright (c) 2026 Lucide Icons and Contributors
Permission to use, copy, modify, and/or distribute this software for any
purpose with or without fee is hereby granted, provided that the above
@@ -13,3 +13,31 @@ ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+---
+
+The following Lucide icons are derived from the Feather project:
+
+airplay, alert-circle, alert-octagon, alert-triangle, aperture, arrow-down-circle, arrow-down-left, arrow-down-right, arrow-down, arrow-left-circle, arrow-left, arrow-right-circle, arrow-right, arrow-up-circle, arrow-up-left, arrow-up-right, arrow-up, at-sign, calendar, cast, check, chevron-down, chevron-left, chevron-right, chevron-up, chevrons-down, chevrons-left, chevrons-right, chevrons-up, circle, clipboard, clock, code, columns, command, compass, corner-down-left, corner-down-right, corner-left-down, corner-left-up, corner-right-down, corner-right-up, corner-up-left, corner-up-right, crosshair, database, divide-circle, divide-square, dollar-sign, download, external-link, feather, frown, hash, headphones, help-circle, info, italic, key, layout, life-buoy, link-2, link, loader, lock, log-in, log-out, maximize, meh, minimize, minimize-2, minus-circle, minus-square, minus, monitor, moon, more-horizontal, more-vertical, move, music, navigation-2, navigation, octagon, pause-circle, percent, plus-circle, plus-square, plus, power, radio, rss, search, server, share, shopping-bag, sidebar, smartphone, smile, square, table-2, tablet, target, terminal, trash-2, trash, triangle, tv, type, upload, x-circle, x-octagon, x-square, x, zoom-in, zoom-out
+
+The MIT License (MIT) (for the icons listed above)
+
+Copyright (c) 2013-present Cole Bemis
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/README.md b/README.md
index 6076562c3..a33e9026d 100644
--- a/README.md
+++ b/README.md
@@ -7,277 +7,80 @@
+ Icons + · + Guide + · + Packages + · + License + · + Showcase +
# Lucide -Community-run fork of [Feather Icons](https://github.com/feathericons/feather), open for anyone to contribute icons. +Lucide is an open-source icon library that provides 1600+ vector (svg) files for displaying icons and symbols in digital and non-digital projects. The library aims to make it easier for designers and developers to incorporate icons into their projects by providing several official [packages](https://lucide.dev/packages) to make it easier to use these icons in your project. -It began after growing dissatisfaction with the [Feather Icons](https://github.com/feathericons/feather) project moderation. With over 300+ open issues and over 100+ open PRs, the Feather Icons project has been abandoned. This unfortunately means that hundreds of developers and designers wasted their time contributing to Feather Icons with no chance of PRs being accepted. +## Packages -Lucide is trying to expand the icon set as much as possible while staying faithful to the original simplistic design language. We do this as a community of devs and designers and hope that you'll join us! - -### Why choose Lucide over Feather Icons - -- More icons to work with: Lucide already has hundreds of icons more than Feather does. -- Official libraries and integrations with popular frameworks and design tools. -- Well maintained code base. -- Active community, regularly growing and improving the set. - -## Table of Contents - -- [Usage](#usage) - - [Web](#web) - - [React](#react) - - [React Native](#react-native) - - [Vue 2](#vue-2) - - [Vue 3](#vue-3) - - [Angular](#angular) - - [Preact](#preact) - - [Static (svg sprite, font, icons ..)](#static-svg-sprite-font-icons-) - - [Figma](#figma) - - [Laravel](#laravel) - - [Svelte](#svelte) - - [Solid](#solid) - - [Hyva](#hyva) - - [Eleventy](#eleventy) -- [Contributing](#contributing) -- [Community](#community) -- [License](#license) -- [Credits](#credits) -- [Sponsors](#sponsors) - -## Usage - -At its core, Lucide is a collection of [SVG](https://svgontheweb.com/#svg) files. This means that you can use Lucide icons in all the same ways you can use SVGs (e.g. `img`, `background-image`, `inline`, `object`, `embed`, `iframe`). Here's a helpful article detailing the many ways SVGs can be used on the web: [SVG on the Web – Implementation Options](https://svgontheweb.com/#implementation) - -The following are additional ways you can use Lucide. -With the Javascript library you can easily incorporate the icon you want in your webpage. - -### Web - -Implementation of the lucide icon library for web applications. - -```sh -npm install lucide -``` - -or - -```sh -yarn add lucide -``` - -For more details, see the [documentation](https://github.com/lucide-icons/lucide/tree/main/packages/lucide#lucide). - -### React - -Implementation of the lucide icon library for react applications. - -```sh -yarn add lucide-react -``` - -or - -```sh -npm install lucide-react -``` - -For more details, see the [documentation](https://github.com/lucide-icons/lucide/tree/main/packages/lucide-react#lucide-react). - -### React Native - -Implementation of the lucide icon library for React Native applications. - -```sh -yarn add lucide-react-native -``` - -or - -```sh -npm install lucide-react-native -``` - -For more details, see the [documentation](https://github.com/lucide-icons/lucide/tree/main/packages/lucide-react-native#lucide-react-native). - -### Vue 2 - -Implementation of the lucide icon library for vue applications. - -```sh -yarn add lucide-vue -``` - -or - -```sh -npm install lucide-vue -``` - -For more details, see the [documentation](https://github.com/lucide-icons/lucide/tree/main/packages/lucide-vue#lucide-vue). - -### Vue 3 - -Implementation of the lucide icon library for vue applications. - -```sh -yarn add lucide-vue-next -``` - -or - -```sh -npm install lucide-vue-next -``` - -For more details, see the [documentation](https://github.com/lucide-icons/lucide/tree/main/packages/lucide-vue-next#lucide-vue-next). - -### Angular - -```sh -yarn add lucide-angular -``` - -or - -```sh -npm install lucide-angular -``` - -For more details, see the [documentation](https://github.com/lucide-icons/lucide/tree/main/packages/lucide-angular#lucide-angular). - -### Preact - -Implementation of the lucide icon library for preact applications. - -```sh -yarn add lucide-preact -``` - -or - -```sh -npm install lucide-preact -``` - -For more details, see the [documentation](https://github.com/lucide-icons/lucide/tree/main/packages/lucide-preact#lucide-preact). - -### Static (svg sprite, font, icons ..) - -Assets: -[Font Files](https://github.com/lucide-icons/lucide/releases/latest) -[SVG Files](https://github.com/lucide-icons/lucide/releases/latest) -[SVG Sprite](https://cdn.jsdelivr.net/npm/lucide-static@latest/sprite.svg) - -NPM package - -```sh -yarn add lucide-static -``` - -or - -```sh -npm install lucide-static -``` +| Logo | Package | Version | Downloads | Links | +| ---- | ------- | ------- | --------- | ----- | +|
+
+### Other contributors 💸
+
+You can find all our past and non-recurring financial contributors at [our Open Collective page](https://opencollective.com/lucide-icons).
diff --git a/brand-stopwords.json b/brand-stopwords.json
new file mode 100644
index 000000000..04816fa5c
--- /dev/null
+++ b/brand-stopwords.json
@@ -0,0 +1,148 @@
+{
+ "adobe": "Adobe",
+ "airplay": "AirPlay",
+ "amazon": "Amazon",
+ "android": "Android",
+ "angular": "Angular",
+ "aws": "AWS",
+ "azure": "Azure",
+ "bandcamp": "Bandcamp",
+ "behance": "Behance",
+ "bitbucket": "Bitbucket",
+ "blender": "Blender",
+ "bluesky": "BlueSky",
+ "bootstrap": "Bootstrap",
+ "brave": "Brave",
+ "chakra": "Chakra UI",
+ "chrome": "Chrome",
+ "codepen": "Codepen",
+ "codesandbox": "CodeSandbox",
+ "csharp": "C#",
+ "cypress": "Cypress",
+ "dart": "Dart",
+ "deezer": "Deezer",
+ "deno": "Deno",
+ "discord": "Discord",
+ "docker": "Docker",
+ "dribbble": "Dribbble",
+ "dropbox": "Dropbox",
+ "edge": "Edge",
+ "ember": "Ember",
+ "epic": "Epic Games",
+ "erlang": "Erlang",
+ "esbuild": "esbuild",
+ "eslint": "ESLint",
+ "facebook": "Facebook",
+ "figjam": "FigJam",
+ "figma": "Figma",
+ "firebase": "Firebase",
+ "firefox": "Firefox",
+ "framer": "Framer",
+ "gatsby": "Gatsby",
+ "gcp": "Google Cloud",
+ "github": "GitHub",
+ "gitlab": "GitLab",
+ "golang": "GoLang",
+ "google": "Google",
+ "gmail": "Gmail",
+ "gravatar": "Gravatar",
+ "haskell": "Haskell",
+ "instagram": "Instagram",
+ "java": "Java",
+ "javascript": "JavaScript",
+ "jest": "Jest",
+ "jira": "Jira",
+ "kotlin": "Kotlin",
+ "kubernetes": "Kubernetes",
+ "leetcode": "LeetCode",
+ "leet-code": "LeetCode",
+ "linkedin": "LinkedIn",
+ "lua": "Lua",
+ "mariadb": "MariaDB",
+ "mcp": "MCP",
+ "messenger": "Messenger",
+ "microsoft": "Microsoft",
+ "mongodb": "MongoDB",
+ "mui": "Material UI",
+ "mysql": "MySQL",
+ "nestjs": "NestJS",
+ "netflix": "Netflix",
+ "netlify": "Netlify",
+ "nextjs": "Next.js",
+ "nodejs": "Node.js",
+ "notion": "Notion",
+ "nostr": "Nostr",
+ "npm": "npm",
+ "nuxt": "Nuxt",
+ "opera": "Opera",
+ "oracle": "Oracle",
+ "patreon": "Patreon",
+ "paypal": "PayPal",
+ "perl": "Perl",
+ "php": "PHP",
+ "pinterest": "Pinterest",
+ "pix": "PiX",
+ "playstation": "PlayStation",
+ "playwright": "Playwright",
+ "pnpm": "pnpm",
+ "postcss": "PostCSS",
+ "postgresql": "PostgreSQL",
+ "prettier": "Prettier",
+ "prisma": "Prisma",
+ "python": "Python",
+ "qwik": "Qwik",
+ "react": "React",
+ "reddit": "Reddit",
+ "redis": "Redis",
+ "rollup": "Rollup",
+ "rust": "Rust",
+ "safari": "Safari",
+ "sass": "Sass",
+ "scala": "Scala",
+ "scss": "Sass",
+ "semantic": "Semantic UI",
+ "shopify": "Shopify",
+ "skype": "Skype",
+ "slack": "Slack",
+ "snapchat": "Snapchat",
+ "solidjs": "SolidJS",
+ "soundcloud": "SoundCloud",
+ "spotify": "Spotify",
+ "sqlite": "SQLite",
+ "squarespace": "Squarespace",
+ "steam": "Steam",
+ "stripe": "Stripe",
+ "substack": "Substack",
+ "supabase": "Supabase",
+ "surge": "Surge",
+ "svelte": "Svelte",
+ "swift": "Swift",
+ "tailwind": "Tailwind CSS",
+ "telegram": "Telegram",
+ "terraform": "Terraform",
+ "tesla": "Tesla",
+ "tidal": "Tidal",
+ "tiktok": "TikTok",
+ "trello": "Trello",
+ "twitch": "Twitch",
+ "twitter": "Twitter",
+ "typescript": "TypeScript",
+ "unity": "Unity",
+ "unreal": "Unreal Engine",
+ "vercel": "Vercel",
+ "vimeo": "Vimeo",
+ "vite": "Vite",
+ "vitest": "Vitest",
+ "vue": "Vue",
+ "webpack": "Webpack",
+ "wechat": "WeChat",
+ "whatsapp": "WhatsApp",
+ "windows": "Windows",
+ "wix": "Wix",
+ "x.com": "X.com",
+ "x-social": "X.com",
+ "xbox": "Xbox",
+ "yarn": "Yarn",
+ "youtube": "YouTube",
+ "zig": "Zig"
+}
diff --git a/categories/brands.json b/categories/brands.json
deleted file mode 100644
index c48c4b3b0..000000000
--- a/categories/brands.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
- "$schema": "../category.schema.json",
- "title": "Brands",
- "icon": "facebook"
-}
diff --git a/categories/charts.json b/categories/charts.json
index 22beb849e..e9bdc1882 100644
--- a/categories/charts.json
+++ b/categories/charts.json
@@ -1,5 +1,5 @@
{
"$schema": "../category.schema.json",
"title": "Charts",
- "icon": "pie-chart"
+ "icon": "chart-pie"
}
diff --git a/categories/currency.json b/categories/currency.json
deleted file mode 100644
index 0879774d1..000000000
--- a/categories/currency.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
- "$schema": "../category.schema.json",
- "title": "Currency",
- "icon": "dollar-sign"
-}
diff --git a/categories/emoji.json b/categories/emoji.json
index 78442db1d..2bd590877 100644
--- a/categories/emoji.json
+++ b/categories/emoji.json
@@ -1,5 +1,5 @@
{
"$schema": "../category.schema.json",
"title": "Emoji",
- "icon": "smile"
+ "icon": "face-slightly-smiling"
}
diff --git a/categories/money.json b/categories/finance.json
similarity index 75%
rename from categories/money.json
rename to categories/finance.json
index fd706dee5..267643671 100644
--- a/categories/money.json
+++ b/categories/finance.json
@@ -1,5 +1,5 @@
{
"$schema": "../category.schema.json",
- "title": "Money",
+ "title": "Finance",
"icon": "piggy-bank"
}
diff --git a/categories/furniture.json b/categories/furniture.json
deleted file mode 100644
index 56cf3fa30..000000000
--- a/categories/furniture.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
- "$schema": "../category.schema.json",
- "title": "Furniture",
- "icon": "rocking-chair"
-}
diff --git a/categories/maps.json b/categories/maps.json
deleted file mode 100644
index 1a948f119..000000000
--- a/categories/maps.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
- "$schema": "../category.schema.json",
- "title": "Maps",
- "icon": "map"
-}
diff --git a/categories/maths.json b/categories/math.json
similarity index 70%
rename from categories/maths.json
rename to categories/math.json
index f80691908..1ae72ad9e 100644
--- a/categories/maths.json
+++ b/categories/math.json
@@ -1,5 +1,5 @@
{
"$schema": "../category.schema.json",
- "title": "Maths",
+ "title": "Mathematics",
"icon": "divide"
}
diff --git a/categories/navigation.json b/categories/navigation.json
index 0cb9e209d..0c46693cb 100644
--- a/categories/navigation.json
+++ b/categories/navigation.json
@@ -1,5 +1,5 @@
{
"$schema": "../category.schema.json",
- "title": "Navigation",
+ "title": "Navigation & Places",
"icon": "compass"
}
diff --git a/categories/notifications.json b/categories/notifications.json
index 8ef569fd0..c2a729bec 100644
--- a/categories/notifications.json
+++ b/categories/notifications.json
@@ -1,5 +1,5 @@
{
"$schema": "../category.schema.json",
- "title": "Notifications",
+ "title": "Notification",
"icon": "triangle-alert"
}
diff --git a/tools/build-font/styles/.gitkeep b/comment-markup.md
similarity index 100%
rename from tools/build-font/styles/.gitkeep
rename to comment-markup.md
diff --git a/docs/.vitepress/api/categories/index.get.ts b/docs/.vitepress/api/categories/index.get.ts
index 76e1f95de..0ac20a3e5 100644
--- a/docs/.vitepress/api/categories/index.get.ts
+++ b/docs/.vitepress/api/categories/index.get.ts
@@ -1,3 +1,4 @@
+import { eventHandler, setResponseHeader } from 'h3';
import iconMetaData from '../../data/iconMetaData';
export default eventHandler((event) => {
diff --git a/docs/.vitepress/api/figma/data.ts b/docs/.vitepress/api/figma/data.ts
index 1c938c998..cde37f140 100644
--- a/docs/.vitepress/api/figma/data.ts
+++ b/docs/.vitepress/api/figma/data.ts
@@ -1,3 +1,4 @@
+import { eventHandler, setResponseHeader } from 'h3';
import iconNodes from '../../data/iconNodes/index.ts';
import { IconNodeWithKeys } from '../../theme/types';
import iconMetaData from '../../data/iconMetaData';
diff --git a/docs/.vitepress/api/gh-icon/[...data].get.ts b/docs/.vitepress/api/gh-icon/[...data].get.tsx
similarity index 62%
rename from docs/.vitepress/api/gh-icon/[...data].get.ts
rename to docs/.vitepress/api/gh-icon/[...data].get.tsx
index 346901712..b74ce7dc3 100644
--- a/docs/.vitepress/api/gh-icon/[...data].get.ts
+++ b/docs/.vitepress/api/gh-icon/[...data].get.tsx
@@ -1,6 +1,6 @@
import { eventHandler, setResponseHeader, defaultContentType } from 'h3';
import { renderToString, renderToStaticMarkup } from 'react-dom/server';
-import { createElement } from 'react';
+import React from 'react';
import SvgPreview from '../../lib/SvgPreview/index.tsx';
import iconNodes from '../../data/iconNodes';
import createLucideIcon from 'lucide-react/src/createLucideIcon';
@@ -13,10 +13,12 @@ export default eventHandler((event) => {
const data = pathData.at(-1).slice(0, -4);
const [name] = pathData;
- const src = Buffer.from(data, 'base64')
- .toString('utf8')
- .replaceAll('\n', '')
- .replace(/