Compare commits

...

35 Commits

Author SHA1 Message Date
Eric Fennis
248d1c31eb Adds release config 2025-01-03 15:50:42 +01:00
Eric Fennis
b6a978ec6a Use latest version of semantic version 2025-01-03 15:39:45 +01:00
Eric Fennis
de454e4d98 Add version 2025-01-03 15:38:15 +01:00
Eric Fennis
13c4163843 Add permissions 2025-01-03 15:37:53 +01:00
Eric Fennis
c0d4147fe6 fix: Test Version 2025-01-03 15:33:47 +01:00
Eric Fennis
0640cd0938 Test workflow 2025-01-03 15:27:19 +01:00
Eric Fennis
7ab9b83991 fix: release workflow 2025-01-03 15:22:20 +01:00
Eric Fennis
0c08347e5e Test workflpw 2025-01-03 15:01:08 +01:00
Eric Fennis
35e9cb4b6f Test workflow 2025-01-03 15:00:13 +01:00
Eric Fennis
2095ba6aa7 ci: Add commit message check 2024-10-10 05:47:54 +02:00
Eric Fennis
ddfc5cadc1 Merge branch 'main' of https://github.com/lucide-icons/lucide into new-release-workflow 2024-10-10 05:36:21 +02:00
Eric Fennis
f3c6929c98 Remove Node version 2024-10-10 05:36:17 +02:00
Eric Fennis
9b46e0dcba Add name in package.json 2024-10-10 05:34:06 +02:00
Eric Fennis
ef449fd5c5 Try mono repo setup 2024-10-10 05:29:12 +02:00
Eric Fennis
2892be8229 Add temporary branch test 2024-10-10 05:21:06 +02:00
Eric Fennis
2b1ad320fe Add PR title linting 2024-10-10 05:16:17 +02:00
Eric Fennis
61a86a959a enable dry run 2024-10-08 11:44:49 +02:00
Eric Fennis
d92e7796e4 test worflow 2024-10-08 11:43:44 +02:00
Jakob Guddas
bde9e1cb6b Updated icons/component.svg (#2474) 2024-10-08 11:10:02 +02:00
Jakob Guddas
a5e07c28bd fix(icons): changed package icon (#2499)
* Updated icons/package.svg

* Updated icons/package.svg

* Updated icons/package.json
2024-10-08 10:44:49 +02:00
Jamie Law
2a68b12cbe fix(icons): Updated sandwich icon (#2494)
* Updated `sandwich` icon

Rounded the top-front corners, and better aligned the top-most corner of the bread, and the corner of the filling to the grid

* Update sandwich.svg

Nudge filling to the left to maintain a two-pixel gap

* Widen the sandwich
2024-10-08 10:41:30 +02:00
Jakob Guddas
493382b4fd fix(icons): changed parking-meter icon (#2505)
* Updated icons/parking-meter.svg

* Updated icons/parking-meter.json
2024-10-08 10:37:01 +02:00
Karsa
6588971ead fix(site): use the same camel/pascal same conversion as when releasing packages (#2509) 2024-10-08 10:36:35 +02:00
Jamie Law
13cea45e8b refactor(icons): optimised some move- icons (#2513)
* Update move.svg

Replace `<polyline/>`s with `<path/>`s

* Update move-vertical.svg

* Update move-horizontal.svg

* Update move-diagonal.svg

* Update move-diagonal-2.svg
2024-10-08 10:34:11 +02:00
dependabot[bot]
5dfcfc8d1a build(deps): bump rollup from 4.21.0 to 4.22.4 (#2521)
Bumps [rollup](https://github.com/rollup/rollup) from 4.21.0 to 4.22.4.
- [Release notes](https://github.com/rollup/rollup/releases)
- [Changelog](https://github.com/rollup/rollup/blob/master/CHANGELOG.md)
- [Commits](https://github.com/rollup/rollup/compare/v4.21.0...v4.22.4)

---
updated-dependencies:
- dependency-name: rollup
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-10-08 10:29:31 +02:00
Mohit Nagaraj
db24b1d517 fix(app): #2412 Fix tooltip being cut off (#2514) 2024-10-08 10:29:03 +02:00
Jakob Guddas
e1202b545e tests(shared): added mergeClasses tests (#2503) 2024-10-08 10:24:16 +02:00
Jakob Guddas
2e1a5cf6ea feat(icons): added volleyball icon (#1980)
* chore: pull `volleyball` icon from lab branch

* Updated icons/volleyball.svg

* Updated icons/volleyball.json
2024-10-08 10:19:54 +02:00
Karsa
f49ecd73a5 feat(icons): add eye-closed icon (#2349)
* feat(icons): add eye-closed icon

* feat(icons): update tags on eye-off as well

---------

Co-authored-by: Eric Fennis <eric.fennis@gmail.com>
2024-10-08 10:17:49 +02:00
Dipanshu Rawat
a72cbc2d49 add(site): Eric Fennis's twitter link (#2511)
* add: Eric Fennis's twitter link

* ref: twitter domain
2024-10-04 07:59:34 +02:00
Pedro Henrique Windisch
d4976890e5 fix: missing deprecation warning for LinkedIn logo (#2466)
Co-authored-by: Karsa <contact@karsa.org>
2024-10-02 14:49:53 +02:00
Jakob Guddas
8c8d1d3338 fix(categories): fixed charts icon name (#2504) 2024-10-02 09:36:31 +02:00
Kyle Angelo Galendez
542507f835 fix(icons): rename box-select to square-dashed (#2506)
* Rename box-select.svg to square-dashed.svg

* Update and rename box-select.json to square-dashed.json

* Add aliases
2024-10-01 22:13:41 +02:00
Isaac
c6a4908ed0 Add missing space between Svelte and Preact (#2489) 2024-09-25 07:52:27 +02:00
Eric Fennis
d237803413 Adds semantic release step in CI action 2024-07-22 11:37:06 +02:00
43 changed files with 817 additions and 204 deletions

View File

@@ -3,71 +3,67 @@ name: Continuous integration icons
on:
push:
branches:
- main
paths:
- icons/**/*.svg
# - main
- '*'
# paths:
# - icons/**/*.svg
jobs:
create-release:
if: github.repository == 'lucide-icons/lucide'
# Only create a new releases for new icons
runs-on: ubuntu-latest
permissions:
id-token: write
contents: write
packages: read
actions: write
issues: write
pull-requests: write
outputs:
VERSION: ${{ steps.new-version.outputs.NEW_VERSION }}
VERSION: ${{ steps.semantic.outputs.new_release_version }}
steps:
- uses: actions/checkout@v4
- uses: pnpm/action-setup@v2
- uses: actions/setup-node@v4
- name: Semantic Release
id: semantic
uses: cycjimmy/semantic-release-action@v4
with:
node-version: 18
cache: 'pnpm'
tag_format: ${version}
branches: |
['new-release-workflow']
extends: |
semantic-release-monorepo
extra_plugins: |
@semantic-release/github
@semantic-release/git
@semantic-release/release-notes-generator
conventional-changelog-conventionalcommits
- name: Install dependencies
run: pnpm install --frozen-lockfile
- name: Fetch tags
run: git fetch --all --tags
- name: Get latest tag
id: latest-tag
run: echo "LATEST_TAG=$(git describe --tags `git rev-list --tags --max-count=1`)" >> $GITHUB_OUTPUT
- name: Check if we can patch
run: .github/workflows/version-up.sh --minor
- 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
env:
GITHUB_API_KEY: ${{ secrets.GITHUB_TOKEN }}
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Check output
- name: Do something when a new release published
if: steps.semantic.outputs.new_release_published == 'true'
run: |
echo '${{ steps.new-version.outputs.NEW_VERSION }}'
echo '${{ steps.change-log.outputs.CHANGE_LOG }}'
echo ${{ steps.semantic.outputs.new_release_version }}
echo ${{ steps.semantic.outputs.new_release_major_version }}
echo ${{ steps.semantic.outputs.new_release_minor_version }}
echo ${{ steps.semantic.outputs.new_release_patch_version }}
# - name: Create Release
# uses: softprops/action-gh-release@v1
# with:
# tag_name: ${{ steps.semantic.outputs.new_release_version }}
# name: Version ${{ steps.semantic.outputs.new_release_version }}
# body: ${{ steps.semantic.outputs.new_release_notes }}
- name: Create Release
uses: softprops/action-gh-release@v1
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 }}
start-release:
if: github.repository == 'lucide-icons/lucide'
needs: create-release
uses: './.github/workflows/release.yml'
secrets: inherit
with:
version: ${{ needs.create-release.outputs.VERSION }}
# start-release:
# if: github.repository == 'lucide-icons/lucide'
# needs: create-release
# uses: './.github/workflows/release.yml'
# secrets: inherit
# with:
# version: ${{ needs.create-release.outputs.VERSION }}

View File

@@ -21,3 +21,24 @@ jobs:
- name: Run Linter
run: pnpm lint
pr-title:
runs-on: ubuntu-latest
steps:
- uses: amannn/action-semantic-pull-request@v5
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
types: |
fix
feat
perf
refactor
test
style
docs
ci
build
requireScope: true
ignoreLabels: |
bot

View File

@@ -1,5 +1,5 @@
{
"$schema": "../category.schema.json",
"title": "Charts",
"icon": "pie-chart"
"icon": "chart-pie"
}

View File

@@ -11,7 +11,7 @@
},
{
"icon": "x",
"link": "https://github.com/ericfennis"
"link": "https://x.com/ericfennis"
}
]
},

View File

@@ -42,7 +42,7 @@ onMounted(() => {
font-weight: 400;
background: var(--vp-c-brand-dark);
color: white;
z-index: 10;
z-index: 99;
white-space: nowrap;
padding: 2px 8px;
border-radius: 4px;

View File

@@ -1,98 +1,98 @@
<script setup lang="ts">
import { computed } from 'vue';
import { startCase, camelCase } from 'lodash-es'
import ButtonMenu from '../base/ButtonMenu.vue'
import { toPascalCase } from '@lucide/shared';
import ButtonMenu from '../base/ButtonMenu.vue';
import { useIconStyleContext } from '../../composables/useIconStyle';
import useConfetti from '../../composables/useConfetti';
const props = defineProps<{
name: string
popoverPosition?: 'top' | 'bottom'
}>()
const { size, color, strokeWidth, absoluteStrokeWidth } = useIconStyleContext()
const { animate, confetti } = useConfetti()
name: string;
popoverPosition?: 'top' | 'bottom';
}>();
const { size, color, strokeWidth, absoluteStrokeWidth } = useIconStyleContext();
const { animate, confetti } = useConfetti();
const componentName = computed(() => {
return startCase(camelCase(props.name)).replace(/\s/g, '')
})
return (toPascalCase(props.name) as string).replace(/\s/g, '');
});
function copyJSX() {
let attrs = ['']
let attrs = [''];
if (size.value && size.value !== 24) {
attrs.push(`size={${size.value}}`)
attrs.push(`size={${size.value}}`);
}
if (color.value && color.value !== 'currentColor') {
attrs.push(`color="${color.value}"`)
attrs.push(`color="${color.value}"`);
}
if (strokeWidth.value && strokeWidth.value !== 2) {
attrs.push(`strokeWidth={${strokeWidth.value}}`)
attrs.push(`strokeWidth={${strokeWidth.value}}`);
}
if (absoluteStrokeWidth.value) {
attrs.push(`absoluteStrokeWidth`)
attrs.push(`absoluteStrokeWidth`);
}
const code = `<${componentName.value}${attrs.join(' ')} />`
const code = `<${componentName.value}${attrs.join(' ')} />`;
navigator.clipboard.writeText(code)
navigator.clipboard.writeText(code);
}
function copyComponentName() {
const code = componentName.value
const code = componentName.value;
navigator.clipboard.writeText(code)
navigator.clipboard.writeText(code);
}
function copyVue() {
let attrs = ['']
let attrs = [''];
if (size.value && size.value !== 24) {
attrs.push(`:size="${size.value}"`)
attrs.push(`:size="${size.value}"`);
}
if (color.value && color.value !== 'currentColor') {
attrs.push(`color="${color.value}"`)
attrs.push(`color="${color.value}"`);
}
if (strokeWidth.value && strokeWidth.value !== 2) {
attrs.push(`:stroke-width="${strokeWidth.value}"`)
attrs.push(`:stroke-width="${strokeWidth.value}"`);
}
if (absoluteStrokeWidth.value) {
attrs.push(`absoluteStrokeWidth`)
attrs.push(`absoluteStrokeWidth`);
}
const code = `<${componentName.value}${attrs.join(' ')} />`
const code = `<${componentName.value}${attrs.join(' ')} />`;
navigator.clipboard.writeText(code)
navigator.clipboard.writeText(code);
}
function copyAngular() {
let attrs = ['']
let attrs = [''];
attrs.push(`name="${props.name}"`)
attrs.push(`name="${props.name}"`);
if (size.value && size.value !== 24) {
attrs.push(`[size]="${size.value}"`)
attrs.push(`[size]="${size.value}"`);
}
if (color.value && color.value !== 'currentColor') {
attrs.push(`color="${color.value}"`)
attrs.push(`color="${color.value}"`);
}
if (strokeWidth.value && strokeWidth.value !== 2) {
attrs.push(`[strokeWidth]="${strokeWidth.value}"`)
attrs.push(`[strokeWidth]="${strokeWidth.value}"`);
}
if (absoluteStrokeWidth.value) {
attrs.push(`[absoluteStrokeWidth]="true"`)
attrs.push(`[absoluteStrokeWidth]="true"`);
}
const code = `<lucide-icon${attrs.join(' ')}></lucide-icon>`
const code = `<lucide-icon${attrs.join(' ')}></lucide-icon>`;
navigator.clipboard.writeText(code)
navigator.clipboard.writeText(code);
}
</script>
@@ -106,11 +106,11 @@ function copyAngular() {
data-confetti-text="Copied!"
:popoverPosition="popoverPosition"
:options="[
{ text: 'Copy JSX' , onClick: copyJSX },
{ text: 'Copy Component Name' , onClick: copyComponentName },
{ text: 'Copy Vue' , onClick: copyVue },
{ text: 'Copy Svelte' , onClick: copyJSX },
{ text: 'Copy Angular' , onClick: copyAngular },
{ text: 'Copy JSX', onClick: copyJSX },
{ text: 'Copy Component Name', onClick: copyComponentName },
{ text: 'Copy Vue', onClick: copyVue },
{ text: 'Copy Svelte', onClick: copyJSX },
{ text: 'Copy Angular', onClick: copyAngular },
]"
/>
</template>

View File

@@ -28,7 +28,7 @@ However, not everyone can understand them easily. Read more about [how to use Lu
## Official Packages
Lucide's official packages are designed to work on different platforms, making it easier for users to integrate icons into their projects. The packages are available for various technologies, including [Web (Vanilla)](https://lucide.dev/guide/packages/lucide), [React](https://lucide.dev/guide/packages/lucide-react), [React Native](https://lucide.dev/guide/packages/lucide-react-native), [Vue](https://lucide.dev/guide/packages/lucide-vue), [Vue 3](https://lucide.dev/guide/packages/lucide-vue-next), [Svelte](https://lucide.dev/guide/packages/lucide-svelte),[Preact](https://lucide.dev/guide/packages/lucide-preact), [Solid](https://lucide.dev/guide/packages/lucide-solid), [Angular](https://lucide.dev/guide/packages/lucide-angular), [NodeJS](https://lucide.dev/guide/packages/lucide-static#nodejs) and [Flutter](https://lucide.dev/guide/packages/lucide-flutter).
Lucide's official packages are designed to work on different platforms, making it easier for users to integrate icons into their projects. The packages are available for various technologies, including [Web (Vanilla)](https://lucide.dev/guide/packages/lucide), [React](https://lucide.dev/guide/packages/lucide-react), [React Native](https://lucide.dev/guide/packages/lucide-react-native), [Vue](https://lucide.dev/guide/packages/lucide-vue), [Vue 3](https://lucide.dev/guide/packages/lucide-vue-next), [Svelte](https://lucide.dev/guide/packages/lucide-svelte), [Preact](https://lucide.dev/guide/packages/lucide-preact), [Solid](https://lucide.dev/guide/packages/lucide-solid), [Angular](https://lucide.dev/guide/packages/lucide-angular), [NodeJS](https://lucide.dev/guide/packages/lucide-static#nodejs) and [Flutter](https://lucide.dev/guide/packages/lucide-flutter).
## Community
If you have any questions about Lucide, feel free to reach out to the community. You can find them on [GitHub](https://github.com/lucide-icons/lucide) and [Discord](https://discord.gg/EH6nSts).

View File

@@ -18,9 +18,8 @@ import RelatedIcons from '~/.vitepress/theme/components/icons/RelatedIcons.vue'
import CodeGroup from '~/.vitepress/theme/components/base/CodeGroup.vue'
import Badge from '~/.vitepress/theme/components/base/Badge.vue'
import Label from '~/.vitepress/theme/components/base/Label.vue'
import VPButton from 'vitepress/dist/client/theme-default/components/VPButton.vue';
import { data } from './codeExamples.data'
import { camelCase, startCase } from 'lodash-es'
import { toCamelCase, toPascalCase } from '@lucide/shared'
import { satisfies } from 'semver'
const { params } = useData()
@@ -31,8 +30,8 @@ const tabs = computed(() => data.codeExamples?.map(
const codeExample = computed(() => data.codeExamples?.map(
(codeExample) => {
const pascalCaseName = startCase(camelCase( params.value.name)).replace(/\s/g, '')
const camelCaseName = camelCase(params.value.name)
const pascalCaseName = toPascalCase( params.value.name)
const camelCaseName = toCamelCase(params.value.name)
return codeExample.code
.replace(/\$(?:<[^>]+>)*PascalCase/g, pascalCaseName)

View File

@@ -9,8 +9,8 @@
stroke-linecap="round"
stroke-linejoin="round"
>
<path d="M5.5 8.5 9 12l-3.5 3.5L2 12l3.5-3.5Z" />
<path d="m12 2 3.5 3.5L12 9 8.5 5.5 12 2Z" />
<path d="M18.5 8.5 22 12l-3.5 3.5L15 12l3.5-3.5Z" />
<path d="m12 15 3.5 3.5L12 22l-3.5-3.5L12 15Z" />
<path d="M15.536 11.293a1 1 0 0 0 0 1.414l2.376 2.377a1 1 0 0 0 1.414 0l2.377-2.377a1 1 0 0 0 0-1.414l-2.377-2.377a1 1 0 0 0-1.414 0z" />
<path d="M2.297 11.293a1 1 0 0 0 0 1.414l2.377 2.377a1 1 0 0 0 1.414 0l2.377-2.377a1 1 0 0 0 0-1.414L6.088 8.916a1 1 0 0 0-1.414 0z" />
<path d="M8.916 17.912a1 1 0 0 0 0 1.415l2.377 2.376a1 1 0 0 0 1.414 0l2.377-2.376a1 1 0 0 0 0-1.415l-2.377-2.376a1 1 0 0 0-1.414 0z" />
<path d="M8.916 4.674a1 1 0 0 0 0 1.414l2.377 2.376a1 1 0 0 0 1.414 0l2.377-2.376a1 1 0 0 0 0-1.414l-2.377-2.377a1 1 0 0 0-1.414 0z" />
</svg>

Before

Width:  |  Height:  |  Size: 415 B

After

Width:  |  Height:  |  Size: 763 B

23
icons/eye-closed.json Normal file
View File

@@ -0,0 +1,23 @@
{
"$schema": "../icon.schema.json",
"contributors": [
"karsa-mistmere"
],
"tags": [
"view",
"watch",
"see",
"hide",
"conceal",
"mask",
"hidden",
"visibility",
"vision"
],
"categories": [
"accessibility",
"photography",
"design",
"security"
]
}

17
icons/eye-closed.svg Normal file
View File

@@ -0,0 +1,17 @@
<svg
xmlns="http://www.w3.org/2000/svg"
width="24"
height="24"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
stroke-width="2"
stroke-linecap="round"
stroke-linejoin="round"
>
<path d="m15 18-.722-3.25" />
<path d="M2 8a10.645 10.645 0 0 0 20 0" />
<path d="m20 15-1.726-2.05" />
<path d="m4 15 1.726-2.05" />
<path d="m9 18 .722-3.25" />
</svg>

After

Width:  |  Height:  |  Size: 381 B

View File

@@ -9,11 +9,18 @@
"tags": [
"view",
"watch",
"see",
"hide",
"hidden"
"conceal",
"mask",
"hidden",
"visibility",
"vision"
],
"categories": [
"accessibility",
"photography"
"photography",
"design",
"security"
]
}

View File

@@ -7,10 +7,22 @@
],
"tags": [
"view",
"watch"
"watch",
"see",
"show",
"expose",
"reveal",
"display",
"visible",
"visibility",
"vision",
"preview",
"read"
],
"categories": [
"accessibility",
"photography"
"photography",
"design",
"security"
]
}

View File

@@ -1,5 +1,8 @@
{
"$schema": "../icon.schema.json",
"deprecated": true,
"deprecationReason": "icon.brand",
"toBeRemovedInVersion": "v1.0",
"contributors": [
"okcoker",
"csandman",

View File

@@ -9,7 +9,7 @@
stroke-linecap="round"
stroke-linejoin="round"
>
<polyline points="5 11 5 5 11 5" />
<polyline points="19 13 19 19 13 19" />
<line x1="5" x2="19" y1="5" y2="19" />
<path d="M19 13v6h-6" />
<path d="M5 11V5h6" />
<path d="m5 5 14 14" />
</svg>

Before

Width:  |  Height:  |  Size: 329 B

After

Width:  |  Height:  |  Size: 286 B

View File

@@ -9,7 +9,7 @@
stroke-linecap="round"
stroke-linejoin="round"
>
<polyline points="13 5 19 5 19 11" />
<polyline points="11 19 5 19 5 13" />
<line x1="19" x2="5" y1="5" y2="19" />
<path d="M11 19H5v-6" />
<path d="M13 5h6v6" />
<path d="M19 5 5 19" />
</svg>

Before

Width:  |  Height:  |  Size: 329 B

After

Width:  |  Height:  |  Size: 286 B

View File

@@ -9,7 +9,7 @@
stroke-linecap="round"
stroke-linejoin="round"
>
<polyline points="18 8 22 12 18 16" />
<polyline points="6 8 2 12 6 16" />
<line x1="2" x2="22" y1="12" y2="12" />
<path d="m18 8 4 4-4 4" />
<path d="M2 12h20" />
<path d="m6 8-4 4 4 4" />
</svg>

Before

Width:  |  Height:  |  Size: 329 B

After

Width:  |  Height:  |  Size: 289 B

View File

@@ -9,7 +9,7 @@
stroke-linecap="round"
stroke-linejoin="round"
>
<polyline points="8 18 12 22 16 18" />
<polyline points="8 6 12 2 16 6" />
<line x1="12" x2="12" y1="2" y2="22" />
<path d="M12 2v20" />
<path d="m8 18 4 4 4-4" />
<path d="m8 6 4-4 4 4" />
</svg>

Before

Width:  |  Height:  |  Size: 329 B

After

Width:  |  Height:  |  Size: 289 B

View File

@@ -9,10 +9,10 @@
stroke-linecap="round"
stroke-linejoin="round"
>
<polyline points="5 9 2 12 5 15" />
<polyline points="9 5 12 2 15 5" />
<polyline points="15 19 12 22 9 19" />
<polyline points="19 9 22 12 19 15" />
<line x1="2" x2="22" y1="12" y2="12" />
<line x1="12" x2="12" y1="2" y2="22" />
<path d="M12 2v20" />
<path d="m15 19-3 3-3-3" />
<path d="m19 9 3 3-3 3" />
<path d="M2 12h20" />
<path d="m5 9-3 3 3 3" />
<path d="m9 5 3-3 3 3" />
</svg>

Before

Width:  |  Height:  |  Size: 450 B

After

Width:  |  Height:  |  Size: 371 B

View File

@@ -5,7 +5,8 @@
"csandman",
"ericfennis",
"karsa-mistmere",
"danielbayley"
"danielbayley",
"jguddas"
],
"tags": [
"box",

View File

@@ -9,8 +9,8 @@
stroke-linecap="round"
stroke-linejoin="round"
>
<path d="m7.5 4.27 9 5.15" />
<path d="M21 8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73l7 4a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16Z" />
<path d="m3.3 7 8.7 5 8.7-5" />
<path d="M11 21.73a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16V8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73z" />
<path d="M12 22V12" />
<path d="m3.3 7 7.703 4.734a2 2 0 0 0 1.994 0L20.7 7" />
<path d="m7.5 4.27 9 5.15" />
</svg>

Before

Width:  |  Height:  |  Size: 433 B

After

Width:  |  Height:  |  Size: 460 B

View File

@@ -1,7 +1,8 @@
{
"$schema": "../icon.schema.json",
"contributors": [
"danielbayley"
"danielbayley",
"jguddas"
],
"tags": [
"driving",

View File

@@ -9,9 +9,9 @@
stroke-linecap="round"
stroke-linejoin="round"
>
<path d="M9 9a3 3 0 1 1 6 0" />
<path d="M12 12v3" />
<path d="M11 15h2" />
<path d="M19 9a7 7 0 1 0-13.6 2.3C6.4 14.4 8 19 8 19h8s1.6-4.6 2.6-7.7c.3-.8.4-1.5.4-2.3" />
<path d="M12 12v3" />
<path d="M12 19v3" />
<path d="M15.282 19a1 1 0 0 0 .948-.68l2.37-6.988a7 7 0 1 0-13.2 0l2.37 6.988a1 1 0 0 0 .948.68z" />
<path d="M9 9a3 3 0 1 1 6 0" />
</svg>

Before

Width:  |  Height:  |  Size: 409 B

After

Width:  |  Height:  |  Size: 417 B

View File

@@ -1,7 +1,8 @@
{
"$schema": "../icon.schema.json",
"contributors": [
"kemie"
"kemie",
"jamiemlaw"
],
"tags": [
"food",

View File

@@ -9,8 +9,9 @@
stroke-linecap="round"
stroke-linejoin="round"
>
<path d="M3 11v3a1 1 0 0 0 1 1h16a1 1 0 0 0 1-1v-3" />
<path d="M12 19H4a1 1 0 0 1-1-1v-2a1 1 0 0 1 1-1h16a1 1 0 0 1 1 1v2a1 1 0 0 1-1 1h-3.83" />
<path d="m3 11 7.77-6.04a2 2 0 0 1 2.46 0L21 11H3Z" />
<path d="M12.97 19.77 7 15h12.5l-3.75 4.5a2 2 0 0 1-2.78.27Z" />
<path d="m2.37 11.223 8.372-6.777a2 2 0 0 1 2.516 0l8.371 6.777" />
<path d="M21 15a1 1 0 0 1 1 1v2a1 1 0 0 1-1 1h-5.25" />
<path d="M3 15a1 1 0 0 0-1 1v2a1 1 0 0 0 1 1h9" />
<path d="m6.67 15 6.13 4.6a2 2 0 0 0 2.8-.4l3.15-4.2" />
<rect width="20" height="4" x="2" y="11" rx="1" />
</svg>

Before

Width:  |  Height:  |  Size: 483 B

After

Width:  |  Height:  |  Size: 501 B

View File

@@ -4,7 +4,8 @@
"llaenowyd",
"mishkaio",
"ericfennis",
"karsa-mistmere"
"karsa-mistmere",
"chessurisme"
],
"tags": [
"selection",
@@ -12,10 +13,14 @@
"rectangular",
"marquee",
"tool",
"dashed"
"dashed",
"box"
],
"categories": [
"text",
"design"
],
"aliases": [
"box-select"
]
}

View File

Before

Width:  |  Height:  |  Size: 532 B

After

Width:  |  Height:  |  Size: 532 B

37
icons/volleyball.json Normal file
View File

@@ -0,0 +1,37 @@
{
"$schema": "../icon.schema.json",
"contributors": [
"danielbayley",
"jguddas"
],
"tags": [
"beach",
"sand",
"net",
"holiday",
"vacation",
"summer",
"soccer",
"football",
"futbol",
"kick",
"pitch",
"goal",
"score",
"bounce",
"leather",
"wool",
"yarn",
"knitting",
"sewing",
"thread",
"embroidery",
"textile"
],
"categories": [
"sports",
"gaming",
"travel",
"home"
]
}

18
icons/volleyball.svg Normal file
View File

@@ -0,0 +1,18 @@
<svg
xmlns="http://www.w3.org/2000/svg"
width="24"
height="24"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
stroke-width="2"
stroke-linecap="round"
stroke-linejoin="round"
>
<path d="M11.1 7.1a16.55 16.55 0 0 1 10.9 4" />
<path d="M12 12a12.6 12.6 0 0 1-8.7 5" />
<path d="M16.8 13.6a16.55 16.55 0 0 1-9 7.5" />
<path d="M20.7 17a12.8 12.8 0 0 0-8.7-5 13.3 13.3 0 0 1 0-10" />
<path d="M6.3 3.8a16.55 16.55 0 0 0 1.9 11.5" />
<circle cx="12" cy="12" r="10" />
</svg>

After

Width:  |  Height:  |  Size: 506 B

View File

@@ -1,4 +1,5 @@
{
"name": "@lucide/monorepo",
"private": true,
"scripts": {
"build": "pnpm -r --filter './packages/**' build",

View File

@@ -50,7 +50,7 @@
"@testing-library/preact": "^3.2.3",
"jest-serializer-html": "^7.1.0",
"preact": "^10.19.2",
"rollup": "^4.9.2",
"rollup": "^4.22.4",
"rollup-plugin-dts": "^6.1.0",
"typescript": "^5.3.3",
"vite": "5.0.13",

View File

@@ -56,7 +56,7 @@
"react-dom": "^18.0.0",
"react-native": "^0.73.1",
"react-native-svg": "^15.0.0",
"rollup": "^4.9.2",
"rollup": "^4.22.4",
"rollup-plugin-dts": "^6.1.0",
"typescript": "^4.8.4",
"vite": "5.0.13",

View File

@@ -58,7 +58,7 @@
"jest-serializer-html": "^7.1.0",
"react": "18.2.0",
"react-dom": "18.2.0",
"rollup": "^4.9.2",
"rollup": "^4.22.4",
"rollup-plugin-dts": "^6.1.0",
"typescript": "^4.9.5",
"vite": "5.0.13",

View File

@@ -80,7 +80,7 @@
"@testing-library/jest-dom": "^6.4.2",
"babel-preset-solid": "^1.8.12",
"jest-serializer-html": "^7.1.0",
"rollup": "^4.9.2",
"rollup": "^4.22.4",
"solid-js": "^1.8.7",
"typescript": "^4.9.4",
"vite": "5.0.13",

View File

@@ -43,7 +43,7 @@
"@lucide/build-icons": "workspace:*",
"@lucide/rollup-plugins": "workspace:*",
"@lucide/helpers": "workspace:*",
"rollup": "^4.9.2",
"rollup": "^4.22.4",
"rollup-plugin-dts": "^6.1.0"
}
}

View File

@@ -52,7 +52,7 @@
"@testing-library/vue": "^8.0.3",
"@vitejs/plugin-vue": "^4.6.2",
"@vue/test-utils": "2.4.5",
"rollup": "^4.9.2",
"rollup": "^4.22.4",
"rollup-plugin-dts": "^6.1.0",
"vite": "5.0.13",
"vitest": "^1.4.0",

View File

@@ -47,7 +47,7 @@
"@rollup/plugin-replace": "^5.0.5",
"@testing-library/jest-dom": "^6.1.6",
"jest-serializer-html": "^7.1.0",
"rollup": "^4.9.2",
"rollup": "^4.22.4",
"rollup-plugin-dts": "^6.1.0",
"typescript": "^4.9.3",
"vite": "5.0.13",

View File

@@ -7,5 +7,12 @@
"types": "src/index.ts",
"type": "module",
"author": "",
"license": "ISC"
"license": "ISC",
"scripts": {
"test": "vitest run",
"test:watch": "vitest watch"
},
"devDependencies": {
"vitest": "^2.1.1"
}
}

View File

@@ -9,6 +9,17 @@ import { CamelToPascal } from './utility-types';
export const toKebabCase = (string: string) =>
string.replace(/([a-z0-9])([A-Z])/g, '$1-$2').toLowerCase();
/**
* Converts string to camel case
*
* @param {string} string
* @returns {string} A camelized string
*/
export const toCamelCase = <T extends string>(string: T) =>
string.replace(/^([A-Z])|[\s-_]+(\w)/g, (match, p1, p2) =>
p2 ? p2.toUpperCase() : p1.toLowerCase(),
);
/**
* Converts string to pascal case
*
@@ -16,9 +27,7 @@ export const toKebabCase = (string: string) =>
* @returns {string} A pascalized string
*/
export const toPascalCase = <T extends string>(string: T): CamelToPascal<T> => {
const camelCase = string.replace(/^([A-Z])|[\s-_]+(\w)/g, (match, p1, p2) =>
p2 ? p2.toUpperCase() : p1.toLowerCase(),
);
const camelCase = toCamelCase(string);
return (camelCase.charAt(0).toUpperCase() + camelCase.slice(1)) as CamelToPascal<T>;
};

View File

@@ -0,0 +1,21 @@
import { describe, it, expect } from 'vitest';
import { mergeClasses } from '../src/utils';
describe('mergeClasses', () => {
it('merges classes', async () => {
const classes = mergeClasses('lucide', 'lucide-circle', 'custom-class');
expect(classes).toBe('lucide lucide-circle custom-class');
});
it('ignores empty string', async () => {
const classes = mergeClasses('lucide', 'lucide-circle', '');
expect(classes).toBe('lucide lucide-circle');
});
it('ignores undefined', async () => {
const classes = mergeClasses('lucide', 'lucide-circle', undefined);
expect(classes).toBe('lucide lucide-circle');
});
it('removes duplicates', async () => {
const classes = mergeClasses('lucide', 'lucide-circle', 'lucide');
expect(classes).toBe('lucide lucide-circle');
});
});

531
pnpm-lock.yaml generated

File diff suppressed because it is too large Load Diff

6
release.config.mjs Normal file
View File

@@ -0,0 +1,6 @@
/**
* @type {import('semantic-release').GlobalConfig}
*/
export default {
branches: ['main', 'new-release-workflow'],
};

View File

@@ -12,7 +12,7 @@
"@rollup/plugin-node-resolve": "^15.2.3",
"@rollup/plugin-replace": "^5.0.5",
"esbuild": "^0.19.11",
"rollup": "^4.9.2",
"rollup": "^4.22.4",
"rollup-plugin-esbuild": "^6.1.0",
"rollup-plugin-license": "^3.2.0",
"rollup-plugin-visualizer": "^5.12.0"