Compare commits
18 Commits
context-pr
...
fix-stable
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
5236cc3072 | ||
|
|
3c3b25202a | ||
|
|
69bf052ee5 | ||
|
|
4efc8e07a0 | ||
|
|
5be50c241c | ||
|
|
506f3652c3 | ||
|
|
6b4075b89b | ||
|
|
7a68e10b12 | ||
|
|
a4531a9985 | ||
|
|
23b85f7834 | ||
|
|
9392a8f84f | ||
|
|
115fb243af | ||
|
|
3edcd9e0c3 | ||
|
|
0b8f99326c | ||
|
|
5408bc1d69 | ||
|
|
efa795aa4c | ||
|
|
ba46fcf4fc | ||
|
|
484984ad68 |
@@ -9,3 +9,9 @@ strikethrough
|
|||||||
touchpad
|
touchpad
|
||||||
ungroup
|
ungroup
|
||||||
toc
|
toc
|
||||||
|
|
||||||
|
# Brands
|
||||||
|
codepen
|
||||||
|
codesandbox
|
||||||
|
dribbble
|
||||||
|
x.com
|
||||||
|
|||||||
3
.github/workflows/ci.yml
vendored
@@ -11,6 +11,9 @@ permissions:
|
|||||||
id-token: write # Required for OIDC
|
id-token: write # Required for OIDC
|
||||||
contents: write
|
contents: write
|
||||||
|
|
||||||
|
concurrency:
|
||||||
|
group: ${{ github.workflow }}-${{ github.ref }}
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
create-release:
|
create-release:
|
||||||
if: github.repository == 'lucide-icons/lucide' && startsWith(github.event.head_commit.message, 'feat(icons)')
|
if: github.repository == 'lucide-icons/lucide' && startsWith(github.event.head_commit.message, 'feat(icons)')
|
||||||
|
|||||||
43
.github/workflows/lucide-vue.yml
vendored
@@ -1,43 +0,0 @@
|
|||||||
name: Lucide Vue checks
|
|
||||||
|
|
||||||
on:
|
|
||||||
pull_request:
|
|
||||||
paths:
|
|
||||||
- packages/lucide-vue/**
|
|
||||||
- packages/shared/**
|
|
||||||
- tools/build-icons/**
|
|
||||||
- tools/rollup-plugins/**
|
|
||||||
- pnpm-lock.yaml
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
build:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v4
|
|
||||||
- uses: pnpm/action-setup@v4
|
|
||||||
- uses: actions/setup-node@v4
|
|
||||||
with:
|
|
||||||
cache: 'pnpm'
|
|
||||||
node-version-file: 'package.json'
|
|
||||||
|
|
||||||
- name: Install dependencies
|
|
||||||
run: pnpm install --frozen-lockfile
|
|
||||||
|
|
||||||
- name: Build
|
|
||||||
run: pnpm --filter @lucide/vue build
|
|
||||||
|
|
||||||
test:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v4
|
|
||||||
- uses: pnpm/action-setup@v4
|
|
||||||
- uses: actions/setup-node@v4
|
|
||||||
with:
|
|
||||||
cache: 'pnpm'
|
|
||||||
node-version-file: 'package.json'
|
|
||||||
|
|
||||||
- name: Install dependencies
|
|
||||||
run: pnpm install --frozen-lockfile
|
|
||||||
|
|
||||||
- name: Test
|
|
||||||
run: pnpm --filter @lucide/vue test
|
|
||||||
9
.github/workflows/release.yml
vendored
@@ -22,6 +22,9 @@ permissions:
|
|||||||
id-token: write # Required for OIDC
|
id-token: write # Required for OIDC
|
||||||
contents: write
|
contents: write
|
||||||
|
|
||||||
|
concurrency:
|
||||||
|
group: ${{ github.workflow }}-${{ github.ref }}
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
pre-release:
|
pre-release:
|
||||||
if: github.repository == 'lucide-icons/lucide' && contains('["ericfennis", "karsa-mistmere", "jguddas"]', github.actor)
|
if: github.repository == 'lucide-icons/lucide' && contains('["ericfennis", "karsa-mistmere", "jguddas"]', github.actor)
|
||||||
@@ -60,7 +63,6 @@ jobs:
|
|||||||
'lucide-svelte',
|
'lucide-svelte',
|
||||||
'@lucide/astro',
|
'@lucide/astro',
|
||||||
'@lucide/svelte',
|
'@lucide/svelte',
|
||||||
'@lucide/vue',
|
|
||||||
]
|
]
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v6
|
- uses: actions/checkout@v6
|
||||||
@@ -136,11 +138,8 @@ jobs:
|
|||||||
- name: Install dependencies
|
- name: Install dependencies
|
||||||
run: pnpm install --frozen-lockfile
|
run: pnpm install --frozen-lockfile
|
||||||
|
|
||||||
- name: Outline svg Icons
|
|
||||||
run: pnpm build:outline-icons
|
|
||||||
|
|
||||||
- name: Create font in ./lucide-font
|
- name: Create font in ./lucide-font
|
||||||
run: pnpm build:font
|
run: pnpm build:font --saveCodePoints
|
||||||
|
|
||||||
- name: 'Upload to Artifacts'
|
- name: 'Upload to Artifacts'
|
||||||
uses: actions/upload-artifact@v4
|
uses: actions/upload-artifact@v4
|
||||||
|
|||||||
1
.gitignore
vendored
@@ -14,6 +14,7 @@ coverage
|
|||||||
stats
|
stats
|
||||||
*.log
|
*.log
|
||||||
outlined
|
outlined
|
||||||
|
lucide-font
|
||||||
packages/**/src/icons/*.js
|
packages/**/src/icons/*.js
|
||||||
packages/**/src/icons/*.ts
|
packages/**/src/icons/*.ts
|
||||||
packages/**/src/icons/*.tsx
|
packages/**/src/icons/*.tsx
|
||||||
|
|||||||
5
categories/brands.json
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
{
|
||||||
|
"$schema": "../category.schema.json",
|
||||||
|
"title": "Brands",
|
||||||
|
"icon": "facebook"
|
||||||
|
}
|
||||||
@@ -15,6 +15,10 @@
|
|||||||
"name": "arrows",
|
"name": "arrows",
|
||||||
"title": "Arrows"
|
"title": "Arrows"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"name": "brands",
|
||||||
|
"title": "Brands"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"name": "buildings",
|
"name": "buildings",
|
||||||
"title": "Buildings"
|
"title": "Buildings"
|
||||||
|
|||||||
@@ -31,12 +31,20 @@
|
|||||||
}
|
}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"@lucide/vue": {
|
"lucide-vue-next": {
|
||||||
"order": 2,
|
"order": 2,
|
||||||
"icon": "vue",
|
"icon": "vue-next",
|
||||||
"docsAlias": "lucide-vue",
|
|
||||||
"packageDirname": "vue",
|
|
||||||
"shields": [
|
"shields": [
|
||||||
|
{
|
||||||
|
"alt": "npm",
|
||||||
|
"src": "https://img.shields.io/npm/v/lucide-vue-next",
|
||||||
|
"href": "https://www.npmjs.com/package/lucide-vue-next"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"alt": "npm",
|
||||||
|
"src": "https://img.shields.io/npm/dw/lucide-vue-next",
|
||||||
|
"href": "https://www.npmjs.com/package/lucide-vue-next"
|
||||||
|
}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"lucide-svelte": {
|
"lucide-svelte": {
|
||||||
|
|||||||
@@ -43,7 +43,7 @@ export default App;
|
|||||||
language: 'vue',
|
language: 'vue',
|
||||||
title: 'Vue',
|
title: 'Vue',
|
||||||
code: `<script setup>
|
code: `<script setup>
|
||||||
import { $PascalCase } from '@lucide/vue';
|
import { $PascalCase } from 'lucide-vue-next';
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
|
|||||||
@@ -74,7 +74,7 @@ const sidebar: UserConfig<DefaultTheme.Config>['themeConfig']['sidebar'] = {
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
text: 'Lucide Vue',
|
text: 'Lucide Vue',
|
||||||
link: '/guide/packages/lucide-vue',
|
link: '/guide/packages/lucide-vue-next',
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
text: 'Lucide Svelte',
|
text: 'Lucide Svelte',
|
||||||
|
|||||||
@@ -70,7 +70,7 @@ const value = computed({
|
|||||||
color: var(--vp-c-text-2);
|
color: var(--vp-c-text-2);
|
||||||
padding: 3px 8px 3px 3px;
|
padding: 3px 8px 3px 3px;
|
||||||
height: auto;
|
height: auto;
|
||||||
font-size: 14px;
|
font-size: 13px;
|
||||||
text-align: left;
|
text-align: left;
|
||||||
border: 1px solid transparent;
|
border: 1px solid transparent;
|
||||||
cursor: text;
|
cursor: text;
|
||||||
@@ -90,7 +90,7 @@ const value = computed({
|
|||||||
border: none;
|
border: none;
|
||||||
background: transparent;
|
background: transparent;
|
||||||
color: var(--vp-c-text-1);
|
color: var(--vp-c-text-1);
|
||||||
font-size: 14px;
|
font-size: 13px;
|
||||||
text-align: left;
|
text-align: left;
|
||||||
border-radius: 8px;
|
border-radius: 8px;
|
||||||
cursor: text;
|
cursor: text;
|
||||||
|
|||||||
@@ -13,9 +13,9 @@ export default {
|
|||||||
label: 'Lucide documentation for React',
|
label: 'Lucide documentation for React',
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: 'lucide-vue',
|
name: 'lucide-vue-next',
|
||||||
logo: '/framework-logos/vue.svg',
|
logo: '/framework-logos/vue.svg',
|
||||||
label: 'Lucide documentation for Vue',
|
label: 'Lucide documentation for Vue 3',
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: 'lucide-svelte',
|
name: 'lucide-svelte',
|
||||||
|
|||||||
@@ -29,12 +29,7 @@ const props = defineProps<{
|
|||||||
|
|
||||||
const iconComponent = computed(() => {
|
const iconComponent = computed(() => {
|
||||||
if (!props.name || !props.iconNode) return null;
|
if (!props.name || !props.iconNode) return null;
|
||||||
try {
|
return createLucideIcon(props.name, props.iconNode);
|
||||||
return createLucideIcon(props.name, props.iconNode);
|
|
||||||
} catch (error) {
|
|
||||||
console.warn(`Icon ${props.name} not found, using fallback`);
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
});
|
});
|
||||||
|
|
||||||
const CalendarIcon = createLucideIcon('calendar', Calendar.iconNode);
|
const CalendarIcon = createLucideIcon('calendar', Calendar.iconNode);
|
||||||
@@ -66,7 +61,7 @@ const prettyName = props.name
|
|||||||
</script>
|
</script>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
<section class="showcase" v-if="iconComponent">
|
<section class="showcase">
|
||||||
<h2 class="title">See this icon in action</h2>
|
<h2 class="title">See this icon in action</h2>
|
||||||
<div class="showcase-grid">
|
<div class="showcase-grid">
|
||||||
<div class="showcase-item column">
|
<div class="showcase-item column">
|
||||||
|
|||||||
@@ -64,24 +64,25 @@ Implementation of the lucide icon library for Vue applications.
|
|||||||
::: code-group
|
::: code-group
|
||||||
|
|
||||||
```sh [pnpm]
|
```sh [pnpm]
|
||||||
pnpm add @lucide/vue
|
pnpm add lucide-vue-next
|
||||||
```
|
```
|
||||||
|
|
||||||
```sh [yarn]
|
```sh [yarn]
|
||||||
yarn add @lucide/vue
|
yarn add lucide-vue-next
|
||||||
```
|
```
|
||||||
|
|
||||||
```sh [npm]
|
```sh [npm]
|
||||||
npm install @lucide/vue
|
npm install lucide-vue-next
|
||||||
```
|
```
|
||||||
|
|
||||||
```sh [bun]
|
```sh [bun]
|
||||||
bun add @lucide/vue
|
bun add lucide-vue-next
|
||||||
```
|
```
|
||||||
|
|
||||||
:::
|
:::
|
||||||
|
|
||||||
For more details, see the [documentation](packages/lucide-vue.md).
|
For more details, see the [documentation](packages/lucide-vue-next.md).
|
||||||
|
For Vue 2 use the `lucide-vue` package.
|
||||||
|
|
||||||
## Svelte
|
## Svelte
|
||||||
|
|
||||||
@@ -90,22 +91,22 @@ Implementation of the lucide icon library for Svelte applications.
|
|||||||
::: code-group
|
::: code-group
|
||||||
|
|
||||||
```sh [pnpm]
|
```sh [pnpm]
|
||||||
pnpm add @lucide/svelte
|
pnpm add lucide-svelte
|
||||||
```
|
```
|
||||||
|
|
||||||
```sh [yarn]
|
```sh [yarn]
|
||||||
yarn add @lucide/svelte
|
yarn add lucide-svelte
|
||||||
```
|
```
|
||||||
|
|
||||||
```sh [npm]
|
```sh [npm]
|
||||||
npm install @lucide/svelte
|
npm install lucide-svelte
|
||||||
```
|
```
|
||||||
|
|
||||||
```sh [bun]
|
```sh [bun]
|
||||||
bun add @lucide/svelte
|
bun add lucide-svelte
|
||||||
```
|
```
|
||||||
|
|
||||||
:::
|
:::
|
||||||
> `@lucide/svelte` is only for Svelte 5, for Svelte 4 use the `lucide-svelte` package.
|
|
||||||
|
|
||||||
For more details, see the [documentation](packages/lucide-svelte.md).
|
For more details, see the [documentation](packages/lucide-svelte.md).
|
||||||
|
|
||||||
|
|||||||
@@ -102,10 +102,16 @@ The example below imports all ES Modules, so exercise caution when using it. Imp
|
|||||||
|
|
||||||
### Icon Component Example
|
### Icon Component Example
|
||||||
|
|
||||||
```jsx
|
```tsx
|
||||||
import { icons } from 'lucide-react-native';
|
import * as icons from 'lucide-react-native/icons';
|
||||||
|
|
||||||
const Icon = ({ name, color, size }) => {
|
interface IconProps {
|
||||||
|
name: keyof typeof icons;
|
||||||
|
color?: string;
|
||||||
|
size?: number;
|
||||||
|
}
|
||||||
|
|
||||||
|
const Icon = ({ name, color, size }: IconProps) => {
|
||||||
const LucideIcon = icons[name];
|
const LucideIcon = icons[name];
|
||||||
|
|
||||||
return <LucideIcon color={color} size={size} />;
|
return <LucideIcon color={color} size={size} />;
|
||||||
@@ -116,11 +122,11 @@ export default Icon;
|
|||||||
|
|
||||||
#### Using the Icon Component
|
#### Using the Icon Component
|
||||||
|
|
||||||
```jsx
|
```tsx
|
||||||
import Icon from './Icon';
|
import Icon from './Icon';
|
||||||
|
|
||||||
const App = () => {
|
const App = () => {
|
||||||
return <Icon name="house" />;
|
return <Icon name="House" />;
|
||||||
};
|
};
|
||||||
|
|
||||||
export default App;
|
export default App;
|
||||||
|
|||||||
@@ -30,7 +30,14 @@ This package includes the following implementations of Lucide icons:
|
|||||||
|
|
||||||
SVG sprites and icon fonts include **all icons**, which can significantly increase your app's bundle size and load time.
|
SVG sprites and icon fonts include **all icons**, which can significantly increase your app's bundle size and load time.
|
||||||
|
|
||||||
For production environments, we recommend using a bundler with tree-shaking support to include only the icons you actually use. Consider using one of the framework-specific [packages](../../packages).
|
For production environments, we recommend using a bundler with tree-shaking support to include only the icons you actually use. Consider using:
|
||||||
|
|
||||||
|
- [lucide](lucide)
|
||||||
|
- [lucide-react](lucide-react)
|
||||||
|
- [lucide-vue](lucide-vue)
|
||||||
|
- [lucide-vue-next](lucide-vue-next)
|
||||||
|
- [lucide-angular](lucide-angular)
|
||||||
|
- [lucide-preact](lucide-preact)
|
||||||
:::
|
:::
|
||||||
|
|
||||||
## Installation
|
## Installation
|
||||||
|
|||||||
148
docs/guide/packages/lucide-vue-next.md
Normal file
@@ -0,0 +1,148 @@
|
|||||||
|
# Lucide Vue Next
|
||||||
|
|
||||||
|
Vue 3 components for Lucide icons that leverage the Composition API and modern Vue features. Each icon is a reactive Vue component that renders as an inline SVG, providing excellent performance and developer experience in Vue 3 applications.
|
||||||
|
|
||||||
|
**What you can accomplish:**
|
||||||
|
- Use icons as Vue 3 components with full reactivity and TypeScript support
|
||||||
|
- Bind icon properties to reactive data and computed values
|
||||||
|
- Customize icons with props, slots, and Vue's powerful templating system
|
||||||
|
- Integrate seamlessly with Vue 3's Composition API and script setup syntax
|
||||||
|
- Build dynamic interfaces where icons respond to application state changes
|
||||||
|
|
||||||
|
## Installation
|
||||||
|
|
||||||
|
::: code-group
|
||||||
|
|
||||||
|
```sh [pnpm]
|
||||||
|
pnpm add lucide-vue-next
|
||||||
|
```
|
||||||
|
|
||||||
|
```sh [yarn]
|
||||||
|
yarn add lucide-vue-next
|
||||||
|
```
|
||||||
|
|
||||||
|
```sh [npm]
|
||||||
|
npm install lucide-vue-next
|
||||||
|
```
|
||||||
|
|
||||||
|
```sh [bun]
|
||||||
|
bun add lucide-vue-next
|
||||||
|
```
|
||||||
|
|
||||||
|
:::
|
||||||
|
|
||||||
|
## How to use
|
||||||
|
|
||||||
|
Lucide is built with ES Modules, so it's completely tree-shakable.
|
||||||
|
|
||||||
|
Each icon can be imported as a Vue component, which renders an inline SVG Element. This way only the icons that are imported into your project are included in the final bundle. The rest of the icons are tree-shaken away.
|
||||||
|
|
||||||
|
### Example
|
||||||
|
|
||||||
|
You can pass additional props to adjust the icon.
|
||||||
|
|
||||||
|
```vue
|
||||||
|
<script setup>
|
||||||
|
import { Camera } from 'lucide-vue-next';
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<Camera
|
||||||
|
color="red"
|
||||||
|
:size="32"
|
||||||
|
/>
|
||||||
|
</template>
|
||||||
|
```
|
||||||
|
|
||||||
|
## Props
|
||||||
|
|
||||||
|
| name | type | default |
|
||||||
|
| ----------------------- | --------- | ------------ |
|
||||||
|
| `size` | *number* | 24 |
|
||||||
|
| `color` | *string* | currentColor |
|
||||||
|
| `stroke-width` | *number* | 2 |
|
||||||
|
| `absoluteStrokeWidth` | *boolean* | false |
|
||||||
|
| `default-class` | *string* | lucide-icon |
|
||||||
|
|
||||||
|
### Applying props
|
||||||
|
|
||||||
|
To customize the appearance of an icon, you can pass custom properties as props directly to the component. The component accepts all SVG attributes as props, which allows flexible styling of the SVG elements. See the list of SVG Presentation Attributes on [MDN](https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/Presentation).
|
||||||
|
|
||||||
|
```vue
|
||||||
|
<template>
|
||||||
|
<Camera fill="red" />
|
||||||
|
</template>
|
||||||
|
```
|
||||||
|
|
||||||
|
## With Lucide lab or custom icons
|
||||||
|
|
||||||
|
[Lucide lab](https://github.com/lucide-icons/lucide-lab) is a collection of icons that are not part of the Lucide main library.
|
||||||
|
|
||||||
|
They can be used by using the `Icon` component.
|
||||||
|
All props like regular lucide icons can be passed to adjust the icon appearance.
|
||||||
|
|
||||||
|
### Using the `Icon` component
|
||||||
|
|
||||||
|
This creates a single icon based on the iconNode passed and renders a Lucide icon component.
|
||||||
|
|
||||||
|
```vue
|
||||||
|
<script setup>
|
||||||
|
import { Icon } from 'lucide-vue-next';
|
||||||
|
import { baseball } from '@lucide/lab';
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<Icon :iconNode="baseball" />
|
||||||
|
</template>
|
||||||
|
```
|
||||||
|
|
||||||
|
## One generic icon component
|
||||||
|
|
||||||
|
It is possible to create one generic icon component to load icons, but it is not recommended.
|
||||||
|
|
||||||
|
::: danger
|
||||||
|
The example below imports all ES Modules, so exercise caution when using it. Importing all icons will significantly increase the build size of the application, negatively affecting its performance. This is especially important when using bundlers like `Webpack`, `Rollup`, or `Vite`.
|
||||||
|
:::
|
||||||
|
|
||||||
|
### Icon Component Example
|
||||||
|
|
||||||
|
```vue
|
||||||
|
<script setup>
|
||||||
|
import { computed } from 'vue';
|
||||||
|
import * as icons from "lucide-vue-next";
|
||||||
|
|
||||||
|
const props = defineProps({
|
||||||
|
name: {
|
||||||
|
type: String,
|
||||||
|
required: true
|
||||||
|
},
|
||||||
|
size: Number,
|
||||||
|
color: String,
|
||||||
|
strokeWidth: Number,
|
||||||
|
defaultClass: String
|
||||||
|
})
|
||||||
|
|
||||||
|
const icon = computed(() => icons[props.name]);
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<component
|
||||||
|
:is="icon"
|
||||||
|
:size="size"
|
||||||
|
:color="color"
|
||||||
|
:stroke-width="strokeWidth" :default-class="defaultClass"
|
||||||
|
/>
|
||||||
|
</template>
|
||||||
|
```
|
||||||
|
|
||||||
|
### Using the Icon Component
|
||||||
|
|
||||||
|
All other props listed above also work on the `Icon` Component.
|
||||||
|
|
||||||
|
```vue
|
||||||
|
<template>
|
||||||
|
<div id="app">
|
||||||
|
<Icon name="Airplay" />
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
```
|
||||||
@@ -9,24 +9,28 @@ Vue 2 components for Lucide icons that integrate with Vue's Options API and temp
|
|||||||
- Build applications using Vue 2's familiar syntax and patterns
|
- Build applications using Vue 2's familiar syntax and patterns
|
||||||
- Bridge the gap while planning migration to Vue 3
|
- Bridge the gap while planning migration to Vue 3
|
||||||
|
|
||||||
|
::: danger
|
||||||
|
This package is deprecated. Vue 2 is EOF See [Announcement](https://v2.vuejs.org/eol/). Migrate to Vue 3.
|
||||||
|
:::
|
||||||
|
|
||||||
## Installation
|
## Installation
|
||||||
|
|
||||||
::: code-group
|
::: code-group
|
||||||
|
|
||||||
```sh [pnpm]
|
```sh [pnpm]
|
||||||
pnpm add @lucide/vue
|
pnpm add lucide-vue
|
||||||
```
|
```
|
||||||
|
|
||||||
```sh [yarn]
|
```sh [yarn]
|
||||||
yarn add @lucide/vue
|
yarn add lucide-vue
|
||||||
```
|
```
|
||||||
|
|
||||||
```sh [npm]
|
```sh [npm]
|
||||||
npm install @lucide/vue
|
npm install lucide-vue
|
||||||
```
|
```
|
||||||
|
|
||||||
```sh [bun]
|
```sh [bun]
|
||||||
bun add @lucide/vue
|
bun add lucide-vue
|
||||||
```
|
```
|
||||||
|
|
||||||
:::
|
:::
|
||||||
@@ -39,19 +43,21 @@ Each icon can be imported as a Vue component, which renders an inline SVG Elemen
|
|||||||
|
|
||||||
### Example
|
### Example
|
||||||
|
|
||||||
You can pass additional props to adjust the icon.
|
Additional props can be passed to adjust the icon:
|
||||||
|
|
||||||
```vue
|
```vue
|
||||||
<script setup>
|
|
||||||
import { Camera } from '@lucide/vue';
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
<Camera
|
<Camera color="red" :size="32" />
|
||||||
color="red"
|
|
||||||
:size="32"
|
|
||||||
/>
|
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
import { Camera } from 'lucide-vue';
|
||||||
|
|
||||||
|
export default {
|
||||||
|
name: 'My Component',
|
||||||
|
components: { Camera }
|
||||||
|
};
|
||||||
|
</script>
|
||||||
```
|
```
|
||||||
|
|
||||||
## Props
|
## Props
|
||||||
@@ -74,28 +80,6 @@ To customize the appearance of an icon, you can pass custom properties as props
|
|||||||
</template>
|
</template>
|
||||||
```
|
```
|
||||||
|
|
||||||
## With Lucide lab or custom icons
|
|
||||||
|
|
||||||
[Lucide lab](https://github.com/lucide-icons/lucide-lab) is a collection of icons that are not part of the Lucide main library.
|
|
||||||
|
|
||||||
They can be used by using the `Icon` component.
|
|
||||||
All props like regular lucide icons can be passed to adjust the icon appearance.
|
|
||||||
|
|
||||||
### Using the `Icon` component
|
|
||||||
|
|
||||||
This creates a single icon based on the iconNode passed and renders a Lucide icon component.
|
|
||||||
|
|
||||||
```vue
|
|
||||||
<script setup>
|
|
||||||
import { Icon } from '@lucide/vue';
|
|
||||||
import { baseball } from '@lucide/lab';
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<template>
|
|
||||||
<Icon :iconNode="baseball" />
|
|
||||||
</template>
|
|
||||||
```
|
|
||||||
|
|
||||||
## One generic icon component
|
## One generic icon component
|
||||||
|
|
||||||
It is possible to create one generic icon component to load icons, but it is not recommended.
|
It is possible to create one generic icon component to load icons, but it is not recommended.
|
||||||
@@ -107,37 +91,30 @@ The example below imports all ES Modules, so exercise caution when using it. Imp
|
|||||||
### Icon Component Example
|
### Icon Component Example
|
||||||
|
|
||||||
```vue
|
```vue
|
||||||
<script setup>
|
|
||||||
import { computed } from 'vue';
|
|
||||||
import * as icons from "@lucide/vue";
|
|
||||||
|
|
||||||
const props = defineProps({
|
|
||||||
name: {
|
|
||||||
type: String,
|
|
||||||
required: true
|
|
||||||
},
|
|
||||||
size: Number,
|
|
||||||
color: String,
|
|
||||||
strokeWidth: Number,
|
|
||||||
defaultClass: String
|
|
||||||
})
|
|
||||||
|
|
||||||
const icon = computed(() => icons[props.name]);
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
<component
|
<component :is="icon" />
|
||||||
:is="icon"
|
|
||||||
:size="size"
|
|
||||||
:color="color"
|
|
||||||
:stroke-width="strokeWidth" :default-class="defaultClass"
|
|
||||||
/>
|
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
import * as icons from 'lucide-vue';
|
||||||
|
|
||||||
|
export default {
|
||||||
|
props: {
|
||||||
|
name: {
|
||||||
|
type: String,
|
||||||
|
required: true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
computed: {
|
||||||
|
icon() {
|
||||||
|
return icons[this.name];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
</script>
|
||||||
```
|
```
|
||||||
|
|
||||||
### Using the Icon Component
|
#### Using the Icon Component
|
||||||
|
|
||||||
All other props listed above also work on the `Icon` Component.
|
|
||||||
|
|
||||||
```vue
|
```vue
|
||||||
<template>
|
<template>
|
||||||
|
|||||||
@@ -34,11 +34,6 @@
|
|||||||
],
|
],
|
||||||
"destination": "/icons",
|
"destination": "/icons",
|
||||||
"permanent": false
|
"permanent": false
|
||||||
},
|
|
||||||
{
|
|
||||||
"source": "/guide/packages/lucide-vue-next",
|
|
||||||
"destination": "/guide/packages/lucide-vue",
|
|
||||||
"permanent": false
|
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"headers": [
|
"headers": [
|
||||||
|
|||||||
@@ -56,6 +56,7 @@
|
|||||||
"account",
|
"account",
|
||||||
"animals",
|
"animals",
|
||||||
"arrows",
|
"arrows",
|
||||||
|
"brands",
|
||||||
"buildings",
|
"buildings",
|
||||||
"charts",
|
"charts",
|
||||||
"communication",
|
"communication",
|
||||||
@@ -133,7 +134,7 @@
|
|||||||
"$defs": {
|
"$defs": {
|
||||||
"iconDeprecationReasons": {
|
"iconDeprecationReasons": {
|
||||||
"type": "string",
|
"type": "string",
|
||||||
"enum": ["icon.renamed"]
|
"enum": ["icon.brand"]
|
||||||
},
|
},
|
||||||
"aliasDeprecationReasons": {
|
"aliasDeprecationReasons": {
|
||||||
"type": "string",
|
"type": "string",
|
||||||
|
|||||||
@@ -16,6 +16,8 @@
|
|||||||
],
|
],
|
||||||
"categories": [
|
"categories": [
|
||||||
"multimedia",
|
"multimedia",
|
||||||
"connectivity"
|
"connectivity",
|
||||||
|
"devices",
|
||||||
|
"brands"
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -10,6 +10,7 @@
|
|||||||
"payment"
|
"payment"
|
||||||
],
|
],
|
||||||
"categories": [
|
"categories": [
|
||||||
|
"brands",
|
||||||
"development",
|
"development",
|
||||||
"finance"
|
"finance"
|
||||||
]
|
]
|
||||||
|
|||||||
25
icons/chromium.json
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
{
|
||||||
|
"$schema": "../icon.schema.json",
|
||||||
|
"deprecated": true,
|
||||||
|
"deprecationReason": "icon.brand",
|
||||||
|
"toBeRemovedInVersion": "v1.0",
|
||||||
|
"contributors": [
|
||||||
|
"colebemis",
|
||||||
|
"ericfennis"
|
||||||
|
],
|
||||||
|
"tags": [
|
||||||
|
"browser",
|
||||||
|
"logo"
|
||||||
|
],
|
||||||
|
"categories": [
|
||||||
|
"brands"
|
||||||
|
],
|
||||||
|
"aliases": [
|
||||||
|
{
|
||||||
|
"name": "chrome",
|
||||||
|
"deprecated": true,
|
||||||
|
"deprecationReason": "alias.name",
|
||||||
|
"toBeRemovedInVersion": "v1.0"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
17
icons/chromium.svg
Normal 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="M10.88 21.94 15.46 14" />
|
||||||
|
<path d="M21.17 8H12" />
|
||||||
|
<path d="M3.95 6.06 8.54 14" />
|
||||||
|
<circle cx="12" cy="12" r="10" />
|
||||||
|
<circle cx="12" cy="12" r="4" />
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 377 B |
17
icons/codepen.json
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
{
|
||||||
|
"$schema": "../icon.schema.json",
|
||||||
|
"deprecated": true,
|
||||||
|
"deprecationReason": "icon.brand",
|
||||||
|
"toBeRemovedInVersion": "v1.0",
|
||||||
|
"contributors": [
|
||||||
|
"colebemis",
|
||||||
|
"ericfennis"
|
||||||
|
],
|
||||||
|
"tags": [
|
||||||
|
"logo"
|
||||||
|
],
|
||||||
|
"categories": [
|
||||||
|
"brands",
|
||||||
|
"development"
|
||||||
|
]
|
||||||
|
}
|
||||||
17
icons/codepen.svg
Normal 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"
|
||||||
|
>
|
||||||
|
<polygon points="12 2 22 8.5 22 15.5 12 22 2 15.5 2 8.5 12 2" />
|
||||||
|
<line x1="12" x2="12" y1="22" y2="15.5" />
|
||||||
|
<polyline points="22 8.5 12 15.5 2 8.5" />
|
||||||
|
<polyline points="2 15.5 12 8.5 22 15.5" />
|
||||||
|
<line x1="12" x2="12" y1="2" y2="8.5" />
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 454 B |
18
icons/codesandbox.json
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
{
|
||||||
|
"$schema": "../icon.schema.json",
|
||||||
|
"deprecated": true,
|
||||||
|
"deprecationReason": "icon.brand",
|
||||||
|
"toBeRemovedInVersion": "v1.0",
|
||||||
|
"contributors": [
|
||||||
|
"colebemis",
|
||||||
|
"csandman",
|
||||||
|
"ericfennis"
|
||||||
|
],
|
||||||
|
"tags": [
|
||||||
|
"logo"
|
||||||
|
],
|
||||||
|
"categories": [
|
||||||
|
"brands",
|
||||||
|
"development"
|
||||||
|
]
|
||||||
|
}
|
||||||
18
icons/codesandbox.svg
Normal 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="M21 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.73l7 4a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16z" />
|
||||||
|
<polyline points="7.5 4.21 12 6.81 16.5 4.21" />
|
||||||
|
<polyline points="7.5 19.79 7.5 14.6 3 12" />
|
||||||
|
<polyline points="21 12 16.5 14.6 16.5 19.79" />
|
||||||
|
<polyline points="3.27 6.96 12 12.01 20.73 6.96" />
|
||||||
|
<line x1="12" x2="12" y1="22.08" y2="12" />
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 595 B |
18
icons/dribbble.json
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
{
|
||||||
|
"$schema": "../icon.schema.json",
|
||||||
|
"deprecated": true,
|
||||||
|
"deprecationReason": "icon.brand",
|
||||||
|
"toBeRemovedInVersion": "v1.0",
|
||||||
|
"contributors": [
|
||||||
|
"ahtohbi4"
|
||||||
|
],
|
||||||
|
"tags": [
|
||||||
|
"design",
|
||||||
|
"social"
|
||||||
|
],
|
||||||
|
"categories": [
|
||||||
|
"brands",
|
||||||
|
"social",
|
||||||
|
"design"
|
||||||
|
]
|
||||||
|
}
|
||||||
16
icons/dribbble.svg
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
<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"
|
||||||
|
>
|
||||||
|
<circle cx="12" cy="12" r="10" />
|
||||||
|
<path d="M19.13 5.09C15.22 9.14 10 10.44 2.25 10.94" />
|
||||||
|
<path d="M21.75 12.84c-6.62-1.41-12.14 1-16.38 6.32" />
|
||||||
|
<path d="M8.56 2.75c4.37 6 6 9.42 8 17.72" />
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 408 B |
19
icons/facebook.json
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
{
|
||||||
|
"$schema": "../icon.schema.json",
|
||||||
|
"deprecated": true,
|
||||||
|
"deprecationReason": "icon.brand",
|
||||||
|
"toBeRemovedInVersion": "v1.0",
|
||||||
|
"contributors": [
|
||||||
|
"colebemis",
|
||||||
|
"csandman",
|
||||||
|
"ericfennis"
|
||||||
|
],
|
||||||
|
"tags": [
|
||||||
|
"logo",
|
||||||
|
"social"
|
||||||
|
],
|
||||||
|
"categories": [
|
||||||
|
"social",
|
||||||
|
"brands"
|
||||||
|
]
|
||||||
|
}
|
||||||
13
icons/facebook.svg
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
<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="M18 2h-3a5 5 0 0 0-5 5v3H7v4h3v8h4v-8h3l1-4h-4V7a1 1 0 0 1 1-1h3z" />
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 289 B |
21
icons/figma.json
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
{
|
||||||
|
"$schema": "../icon.schema.json",
|
||||||
|
"deprecated": true,
|
||||||
|
"deprecationReason": "icon.brand",
|
||||||
|
"toBeRemovedInVersion": "v1.0",
|
||||||
|
"contributors": [
|
||||||
|
"colebemis",
|
||||||
|
"csandman",
|
||||||
|
"mittalyashu",
|
||||||
|
"ericfennis"
|
||||||
|
],
|
||||||
|
"tags": [
|
||||||
|
"logo",
|
||||||
|
"design",
|
||||||
|
"tool"
|
||||||
|
],
|
||||||
|
"categories": [
|
||||||
|
"brands",
|
||||||
|
"design"
|
||||||
|
]
|
||||||
|
}
|
||||||
17
icons/figma.svg
Normal 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="M5 5.5A3.5 3.5 0 0 1 8.5 2H12v7H8.5A3.5 3.5 0 0 1 5 5.5z" />
|
||||||
|
<path d="M12 2h3.5a3.5 3.5 0 1 1 0 7H12V2z" />
|
||||||
|
<path d="M12 12.5a3.5 3.5 0 1 1 7 0 3.5 3.5 0 1 1-7 0z" />
|
||||||
|
<path d="M5 19.5A3.5 3.5 0 0 1 8.5 16H12v3.5a3.5 3.5 0 1 1-7 0z" />
|
||||||
|
<path d="M5 12.5A3.5 3.5 0 0 1 8.5 9H12v7H8.5A3.5 3.5 0 0 1 5 12.5z" />
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 534 B |
21
icons/framer.json
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
{
|
||||||
|
"$schema": "../icon.schema.json",
|
||||||
|
"deprecated": true,
|
||||||
|
"deprecationReason": "icon.brand",
|
||||||
|
"toBeRemovedInVersion": "v1.0",
|
||||||
|
"contributors": [
|
||||||
|
"colebemis",
|
||||||
|
"csandman",
|
||||||
|
"mittalyashu",
|
||||||
|
"ericfennis"
|
||||||
|
],
|
||||||
|
"tags": [
|
||||||
|
"logo",
|
||||||
|
"design",
|
||||||
|
"tool"
|
||||||
|
],
|
||||||
|
"categories": [
|
||||||
|
"brands",
|
||||||
|
"design"
|
||||||
|
]
|
||||||
|
}
|
||||||
13
icons/framer.svg
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
<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="M5 16V9h14V2H5l14 14h-7m-7 0 7 7v-7m-7 0h7" />
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 266 B |
20
icons/github.json
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
{
|
||||||
|
"$schema": "../icon.schema.json",
|
||||||
|
"deprecated": true,
|
||||||
|
"deprecationReason": "icon.brand",
|
||||||
|
"toBeRemovedInVersion": "v1.0",
|
||||||
|
"contributors": [
|
||||||
|
"colebemis",
|
||||||
|
"csandman",
|
||||||
|
"ericfennis",
|
||||||
|
"karsa-mistmere"
|
||||||
|
],
|
||||||
|
"tags": [
|
||||||
|
"logo",
|
||||||
|
"version control"
|
||||||
|
],
|
||||||
|
"categories": [
|
||||||
|
"brands",
|
||||||
|
"development"
|
||||||
|
]
|
||||||
|
}
|
||||||
14
icons/github.svg
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
<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 22v-4a4.8 4.8 0 0 0-1-3.5c3 0 6-2 6-5.5.08-1.25-.27-2.48-1-3.5.28-1.15.28-2.35 0-3.5 0 0-1 0-3 1.5-2.64-.5-5.36-.5-8 0C6 2 5 2 5 2c-.3 1.15-.3 2.35 0 3.5A5.403 5.403 0 0 0 4 9c0 3.5 3 5.5 6 5.5-.39.49-.68 1.05-.85 1.65-.17.6-.22 1.23-.15 1.85v4" />
|
||||||
|
<path d="M9 18c-4.51 2-5-2-7-2" />
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 509 B |
20
icons/gitlab.json
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
{
|
||||||
|
"$schema": "../icon.schema.json",
|
||||||
|
"deprecated": true,
|
||||||
|
"deprecationReason": "icon.brand",
|
||||||
|
"toBeRemovedInVersion": "v1.0",
|
||||||
|
"contributors": [
|
||||||
|
"colebemis",
|
||||||
|
"csandman",
|
||||||
|
"ericfennis",
|
||||||
|
"karsa-mistmere"
|
||||||
|
],
|
||||||
|
"tags": [
|
||||||
|
"logo",
|
||||||
|
"version control"
|
||||||
|
],
|
||||||
|
"categories": [
|
||||||
|
"brands",
|
||||||
|
"development"
|
||||||
|
]
|
||||||
|
}
|
||||||
13
icons/gitlab.svg
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
<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="m22 13.29-3.33-10a.42.42 0 0 0-.14-.18.38.38 0 0 0-.22-.11.39.39 0 0 0-.23.07.42.42 0 0 0-.14.18l-2.26 6.67H8.32L6.1 3.26a.42.42 0 0 0-.1-.18.38.38 0 0 0-.26-.08.39.39 0 0 0-.23.07.42.42 0 0 0-.14.18L2 13.29a.74.74 0 0 0 .27.83L12 21l9.69-6.88a.71.71 0 0 0 .31-.83Z" />
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 489 B |
@@ -12,6 +12,7 @@
|
|||||||
],
|
],
|
||||||
"categories": [
|
"categories": [
|
||||||
"shapes",
|
"shapes",
|
||||||
|
"brands",
|
||||||
"development"
|
"development"
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
21
icons/instagram.json
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
{
|
||||||
|
"$schema": "../icon.schema.json",
|
||||||
|
"deprecated": true,
|
||||||
|
"deprecationReason": "icon.brand",
|
||||||
|
"toBeRemovedInVersion": "v1.0",
|
||||||
|
"contributors": [
|
||||||
|
"colebemis",
|
||||||
|
"csandman",
|
||||||
|
"ericfennis"
|
||||||
|
],
|
||||||
|
"tags": [
|
||||||
|
"logo",
|
||||||
|
"camera",
|
||||||
|
"social"
|
||||||
|
],
|
||||||
|
"categories": [
|
||||||
|
"brands",
|
||||||
|
"social",
|
||||||
|
"photography"
|
||||||
|
]
|
||||||
|
}
|
||||||
15
icons/instagram.svg
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
<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"
|
||||||
|
>
|
||||||
|
<rect width="20" height="20" x="2" y="2" rx="5" ry="5" />
|
||||||
|
<path d="M16 11.37A4 4 0 1 1 12.63 8 4 4 0 0 1 16 11.37z" />
|
||||||
|
<line x1="17.5" x2="17.51" y1="6.5" y2="6.5" />
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 381 B |
20
icons/linkedin.json
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
{
|
||||||
|
"$schema": "../icon.schema.json",
|
||||||
|
"deprecated": true,
|
||||||
|
"deprecationReason": "icon.brand",
|
||||||
|
"toBeRemovedInVersion": "v1.0",
|
||||||
|
"contributors": [
|
||||||
|
"okcoker",
|
||||||
|
"csandman",
|
||||||
|
"ericfennis"
|
||||||
|
],
|
||||||
|
"tags": [
|
||||||
|
"logo",
|
||||||
|
"social media",
|
||||||
|
"social"
|
||||||
|
],
|
||||||
|
"categories": [
|
||||||
|
"social",
|
||||||
|
"brands"
|
||||||
|
]
|
||||||
|
}
|
||||||
15
icons/linkedin.svg
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
<svg
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
width="24"
|
||||||
|
height="24"
|
||||||
|
viewBox="0 0 24 24"
|
||||||
|
fill="none"
|
||||||
|
stroke="currentColor"
|
||||||
|
stroke-width="2"
|
||||||
|
stroke-linecap="round"
|
||||||
|
stroke-linejoin="round"
|
||||||
|
>
|
||||||
|
<path d="M16 8a6 6 0 0 1 6 6v7h-4v-7a2 2 0 0 0-2-2 2 2 0 0 0-2 2v7h-4v-7a6 6 0 0 1 6-6z" />
|
||||||
|
<rect width="4" height="12" x="2" y="9" />
|
||||||
|
<circle cx="4" cy="4" r="2" />
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 380 B |
@@ -9,8 +9,8 @@
|
|||||||
stroke-linecap="round"
|
stroke-linecap="round"
|
||||||
stroke-linejoin="round"
|
stroke-linejoin="round"
|
||||||
>
|
>
|
||||||
<path d="M19 12H2" />
|
<path d="M11 7 6 2" />
|
||||||
|
<path d="M18.992 12H2.041" />
|
||||||
<path d="M21.145 18.38A3.34 3.34 0 0 1 20 16.5a3.3 3.3 0 0 1-1.145 1.88c-.575.46-.855 1.02-.855 1.595A2 2 0 0 0 20 22a2 2 0 0 0 2-2.025c0-.58-.285-1.13-.855-1.595" />
|
<path d="M21.145 18.38A3.34 3.34 0 0 1 20 16.5a3.3 3.3 0 0 1-1.145 1.88c-.575.46-.855 1.02-.855 1.595A2 2 0 0 0 20 22a2 2 0 0 0 2-2.025c0-.58-.285-1.13-.855-1.595" />
|
||||||
<path d="m6 2 5 5" />
|
|
||||||
<path d="m8.5 4.5 2.148-2.148a1.205 1.205 0 0 1 1.704 0l7.296 7.296a1.205 1.205 0 0 1 0 1.704l-7.592 7.592a3.615 3.615 0 0 1-5.112 0l-3.888-3.888a3.615 3.615 0 0 1 0-5.112L5.67 7.33" />
|
<path d="m8.5 4.5 2.148-2.148a1.205 1.205 0 0 1 1.704 0l7.296 7.296a1.205 1.205 0 0 1 0 1.704l-7.592 7.592a3.615 3.615 0 0 1-5.112 0l-3.888-3.888a3.615 3.615 0 0 1 0-5.112L5.67 7.33" />
|
||||||
</svg>
|
</svg>
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 613 B After Width: | Height: | Size: 622 B |
18
icons/pocket.json
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
{
|
||||||
|
"$schema": "../icon.schema.json",
|
||||||
|
"deprecated": true,
|
||||||
|
"deprecationReason": "icon.brand",
|
||||||
|
"toBeRemovedInVersion": "v1.0",
|
||||||
|
"contributors": [
|
||||||
|
"colebemis",
|
||||||
|
"csandman",
|
||||||
|
"ericfennis"
|
||||||
|
],
|
||||||
|
"tags": [
|
||||||
|
"logo",
|
||||||
|
"save"
|
||||||
|
],
|
||||||
|
"categories": [
|
||||||
|
"brands"
|
||||||
|
]
|
||||||
|
}
|
||||||
14
icons/pocket.svg
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
<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="M20 3a2 2 0 0 1 2 2v6a1 1 0 0 1-20 0V5a2 2 0 0 1 2-2z" />
|
||||||
|
<path d="m8 10 4 4 4-4" />
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 306 B |
19
icons/rail-symbol.json
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
{
|
||||||
|
"$schema": "../icon.schema.json",
|
||||||
|
"contributors": [
|
||||||
|
"danielbayley"
|
||||||
|
],
|
||||||
|
"deprecated": true,
|
||||||
|
"deprecationReason": "icon.brand",
|
||||||
|
"toBeRemovedInVersion": "v1.0",
|
||||||
|
"tags": [
|
||||||
|
"railway",
|
||||||
|
"train",
|
||||||
|
"track",
|
||||||
|
"line"
|
||||||
|
],
|
||||||
|
"categories": [
|
||||||
|
"transportation",
|
||||||
|
"navigation"
|
||||||
|
]
|
||||||
|
}
|
||||||
15
icons/rail-symbol.svg
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
<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="M5 15h14" />
|
||||||
|
<path d="M5 9h14" />
|
||||||
|
<path d="m14 20-5-5 6-6-5-5" />
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 289 B |
22
icons/slack.json
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
{
|
||||||
|
"$schema": "../icon.schema.json",
|
||||||
|
"deprecated": true,
|
||||||
|
"deprecationReason": "icon.brand",
|
||||||
|
"toBeRemovedInVersion": "v1.0",
|
||||||
|
"contributors": [
|
||||||
|
"colebemis",
|
||||||
|
"ashygee",
|
||||||
|
"wojtekmaj",
|
||||||
|
"mittalyashu",
|
||||||
|
"ericfennis"
|
||||||
|
],
|
||||||
|
"tags": [
|
||||||
|
"logo"
|
||||||
|
],
|
||||||
|
"categories": [
|
||||||
|
"account",
|
||||||
|
"social",
|
||||||
|
"brands",
|
||||||
|
"development"
|
||||||
|
]
|
||||||
|
}
|
||||||
20
icons/slack.svg
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
<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"
|
||||||
|
>
|
||||||
|
<rect width="3" height="8" x="13" y="2" rx="1.5" />
|
||||||
|
<path d="M19 8.5V10h1.5A1.5 1.5 0 1 0 19 8.5" />
|
||||||
|
<rect width="3" height="8" x="8" y="14" rx="1.5" />
|
||||||
|
<path d="M5 15.5V14H3.5A1.5 1.5 0 1 0 5 15.5" />
|
||||||
|
<rect width="8" height="3" x="14" y="13" rx="1.5" />
|
||||||
|
<path d="M15.5 19H14v1.5a1.5 1.5 0 1 0 1.5-1.5" />
|
||||||
|
<rect width="8" height="3" x="2" y="8" rx="1.5" />
|
||||||
|
<path d="M8.5 5H10V3.5A1.5 1.5 0 1 0 8.5 5" />
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 628 B |
@@ -13,6 +13,7 @@
|
|||||||
"productivity"
|
"productivity"
|
||||||
],
|
],
|
||||||
"categories": [
|
"categories": [
|
||||||
|
"brands",
|
||||||
"gaming"
|
"gaming"
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
37
icons/toolbox.json
Normal file
@@ -0,0 +1,37 @@
|
|||||||
|
{
|
||||||
|
"$schema": "../icon.schema.json",
|
||||||
|
"contributors": [
|
||||||
|
"karsa-mistmere"
|
||||||
|
],
|
||||||
|
"tags": [
|
||||||
|
"toolkit",
|
||||||
|
"tools",
|
||||||
|
"trunk",
|
||||||
|
"chest",
|
||||||
|
"box",
|
||||||
|
"storage",
|
||||||
|
"utility",
|
||||||
|
"utilities",
|
||||||
|
"container",
|
||||||
|
"kit",
|
||||||
|
"set",
|
||||||
|
"repair",
|
||||||
|
"fix",
|
||||||
|
"service",
|
||||||
|
"maintenance",
|
||||||
|
"mechanic",
|
||||||
|
"workshop",
|
||||||
|
"construction",
|
||||||
|
"hardware",
|
||||||
|
"equipment",
|
||||||
|
"gear",
|
||||||
|
"handyman",
|
||||||
|
"engineering",
|
||||||
|
"craft",
|
||||||
|
"diy"
|
||||||
|
],
|
||||||
|
"categories": [
|
||||||
|
"tools",
|
||||||
|
"home"
|
||||||
|
]
|
||||||
|
}
|
||||||
17
icons/toolbox.svg
Normal 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="M16 12v4" />
|
||||||
|
<path d="M16 6a2 2 0 0 1 1.414.586l4 4A2 2 0 0 1 22 12v7a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2v-7a2 2 0 0 1 .586-1.414l4-4A2 2 0 0 1 8 6z" />
|
||||||
|
<path d="M16 6V4a2 2 0 0 0-2-2h-4a2 2 0 0 0-2 2v2" />
|
||||||
|
<path d="M2 14h20" />
|
||||||
|
<path d="M8 12v4" />
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 471 B |
21
icons/trello.json
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
{
|
||||||
|
"$schema": "../icon.schema.json",
|
||||||
|
"deprecated": true,
|
||||||
|
"deprecationReason": "icon.brand",
|
||||||
|
"toBeRemovedInVersion": "v1.0",
|
||||||
|
"contributors": [
|
||||||
|
"bdbch",
|
||||||
|
"csandman",
|
||||||
|
"mittalyashu",
|
||||||
|
"ericfennis"
|
||||||
|
],
|
||||||
|
"tags": [
|
||||||
|
"logo",
|
||||||
|
"brand"
|
||||||
|
],
|
||||||
|
"categories": [
|
||||||
|
"account",
|
||||||
|
"brands",
|
||||||
|
"development"
|
||||||
|
]
|
||||||
|
}
|
||||||
15
icons/trello.svg
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
<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"
|
||||||
|
>
|
||||||
|
<rect width="18" height="18" x="3" y="3" rx="2" ry="2" />
|
||||||
|
<rect width="3" height="9" x="7" y="7" />
|
||||||
|
<rect width="3" height="5" x="14" y="7" />
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 357 B |
20
icons/twitch.json
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
{
|
||||||
|
"$schema": "../icon.schema.json",
|
||||||
|
"deprecated": true,
|
||||||
|
"deprecationReason": "icon.brand",
|
||||||
|
"toBeRemovedInVersion": "v1.0",
|
||||||
|
"contributors": [
|
||||||
|
"ahtohbi4",
|
||||||
|
"johnletey"
|
||||||
|
],
|
||||||
|
"tags": [
|
||||||
|
"logo",
|
||||||
|
"social"
|
||||||
|
],
|
||||||
|
"categories": [
|
||||||
|
"brands",
|
||||||
|
"social",
|
||||||
|
"account",
|
||||||
|
"gaming"
|
||||||
|
]
|
||||||
|
}
|
||||||
13
icons/twitch.svg
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
<svg
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
width="24"
|
||||||
|
height="24"
|
||||||
|
viewBox="0 0 24 24"
|
||||||
|
fill="none"
|
||||||
|
stroke="currentColor"
|
||||||
|
stroke-width="2"
|
||||||
|
stroke-linecap="round"
|
||||||
|
stroke-linejoin="round"
|
||||||
|
>
|
||||||
|
<path d="M21 2H3v16h5v4l4-4h5l4-4V2zm-10 9V7m5 4V7" />
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 265 B |
21
icons/twitter.json
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
{
|
||||||
|
"$schema": "../icon.schema.json",
|
||||||
|
"deprecated": true,
|
||||||
|
"deprecationReason": "icon.brand",
|
||||||
|
"toBeRemovedInVersion": "v1.0",
|
||||||
|
"contributors": [
|
||||||
|
"colebemis",
|
||||||
|
"csandman",
|
||||||
|
"ericfennis",
|
||||||
|
"karsa-mistmere"
|
||||||
|
],
|
||||||
|
"tags": [
|
||||||
|
"logo",
|
||||||
|
"social"
|
||||||
|
],
|
||||||
|
"categories": [
|
||||||
|
"brands",
|
||||||
|
"social",
|
||||||
|
"account"
|
||||||
|
]
|
||||||
|
}
|
||||||
13
icons/twitter.svg
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
<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="M22 4s-.7 2.1-2 3.4c1.6 10-9.4 17.3-18 11.6 2.2.1 4.4-.6 6-2C3 15.5.5 9.6 3 5c2.2 2.6 5.6 4.1 9 4-.9-4.2 4-6.6 7-3.8 1.1 0 3-1.2 3-1.2z" />
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 359 B |
24
icons/youtube.json
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
{
|
||||||
|
"$schema": "../icon.schema.json",
|
||||||
|
"deprecated": true,
|
||||||
|
"deprecationReason": "icon.brand",
|
||||||
|
"toBeRemovedInVersion": "v1.0",
|
||||||
|
"contributors": [
|
||||||
|
"colebemis",
|
||||||
|
"csandman",
|
||||||
|
"ericfennis",
|
||||||
|
"karsa-mistmere",
|
||||||
|
"jguddas"
|
||||||
|
],
|
||||||
|
"tags": [
|
||||||
|
"logo",
|
||||||
|
"social",
|
||||||
|
"video",
|
||||||
|
"play"
|
||||||
|
],
|
||||||
|
"categories": [
|
||||||
|
"multimedia",
|
||||||
|
"social",
|
||||||
|
"brands"
|
||||||
|
]
|
||||||
|
}
|
||||||
14
icons/youtube.svg
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
<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="M2.5 17a24.12 24.12 0 0 1 0-10 2 2 0 0 1 1.4-1.4 49.56 49.56 0 0 1 16.2 0A2 2 0 0 1 21.5 7a24.12 24.12 0 0 1 0 10 2 2 0 0 1-1.4 1.4 49.55 49.55 0 0 1-16.2 0A2 2 0 0 1 2.5 17" />
|
||||||
|
<path d="m10 15 5-3-5-3z" />
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 428 B |
@@ -16,7 +16,7 @@
|
|||||||
"lucide-svelte": "pnpm --filter lucide-svelte",
|
"lucide-svelte": "pnpm --filter lucide-svelte",
|
||||||
"lucide-static": "pnpm --filter lucide-static",
|
"lucide-static": "pnpm --filter lucide-static",
|
||||||
"build:outline-icons": "pnpm --filter outline-svg start",
|
"build:outline-icons": "pnpm --filter outline-svg start",
|
||||||
"build:font": "pnpm --filter docs prebuild:releaseJson && pnpm --filter build-font start",
|
"build:font": "pnpm --filter build-font start",
|
||||||
"optimize": "node ./scripts/optimizeSvgs.mts",
|
"optimize": "node ./scripts/optimizeSvgs.mts",
|
||||||
"addjsons": "node ./scripts/addMissingIconJsonFiles.mts",
|
"addjsons": "node ./scripts/addMissingIconJsonFiles.mts",
|
||||||
"checkIcons": "node ./scripts/checkIconsAndCategories.mts",
|
"checkIcons": "node ./scripts/checkIconsAndCategories.mts",
|
||||||
|
|||||||
@@ -24,7 +24,9 @@
|
|||||||
"author": "Eric Fennis",
|
"author": "Eric Fennis",
|
||||||
"amdName": "lucide-preact",
|
"amdName": "lucide-preact",
|
||||||
"main": "dist/cjs/lucide-preact.js",
|
"main": "dist/cjs/lucide-preact.js",
|
||||||
|
"main:umd": "dist/umd/lucide-preact.js",
|
||||||
"module": "dist/esm/lucide-preact.js",
|
"module": "dist/esm/lucide-preact.js",
|
||||||
|
"unpkg": "dist/umd/lucide-preact.min.js",
|
||||||
"typings": "dist/lucide-preact.d.ts",
|
"typings": "dist/lucide-preact.d.ts",
|
||||||
"files": [
|
"files": [
|
||||||
"dist"
|
"dist"
|
||||||
@@ -37,7 +39,6 @@
|
|||||||
"build:icons": "build-icons --output=./src --templateSrc=./scripts/exportTemplate.mts --renderUniqueKey --withAliases --aliasesFileExtension=.ts --iconFileExtension=.ts --exportFileName=index.ts",
|
"build:icons": "build-icons --output=./src --templateSrc=./scripts/exportTemplate.mts --renderUniqueKey --withAliases --aliasesFileExtension=.ts --iconFileExtension=.ts --exportFileName=index.ts",
|
||||||
"build:bundles": "rollup -c ./rollup.config.mjs",
|
"build:bundles": "rollup -c ./rollup.config.mjs",
|
||||||
"test": "pnpm build:icons && vitest run",
|
"test": "pnpm build:icons && vitest run",
|
||||||
"test:watch": "vitest watch",
|
|
||||||
"version": "pnpm version --git-tag-version=false"
|
"version": "pnpm version --git-tag-version=false"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
@@ -45,10 +46,10 @@
|
|||||||
"@lucide/rollup-plugins": "workspace:*",
|
"@lucide/rollup-plugins": "workspace:*",
|
||||||
"@lucide/shared": "workspace:*",
|
"@lucide/shared": "workspace:*",
|
||||||
"@preact/preset-vite": "^2.10.2",
|
"@preact/preset-vite": "^2.10.2",
|
||||||
"@testing-library/jest-dom": "^6.6.3",
|
"@testing-library/jest-dom": "^6.1.4",
|
||||||
"@testing-library/preact": "^3.2.3",
|
"@testing-library/preact": "^3.2.3",
|
||||||
"jest-serializer-html": "^7.1.0",
|
"jest-serializer-html": "^7.1.0",
|
||||||
"preact": "^10.26.9",
|
"preact": "^10.19.2",
|
||||||
"rollup": "^4.53.3",
|
"rollup": "^4.53.3",
|
||||||
"rollup-plugin-dts": "^6.2.3",
|
"rollup-plugin-dts": "^6.2.3",
|
||||||
"typescript": "^5.8.3",
|
"typescript": "^5.8.3",
|
||||||
|
|||||||
@@ -7,6 +7,17 @@ const outputFileName = 'lucide-preact';
|
|||||||
const outputDir = 'dist';
|
const outputDir = 'dist';
|
||||||
const inputs = [`src/lucide-preact.ts`];
|
const inputs = [`src/lucide-preact.ts`];
|
||||||
const bundles = [
|
const bundles = [
|
||||||
|
{
|
||||||
|
format: 'umd',
|
||||||
|
inputs,
|
||||||
|
outputDir,
|
||||||
|
minify: true,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
format: 'umd',
|
||||||
|
inputs,
|
||||||
|
outputDir,
|
||||||
|
},
|
||||||
{
|
{
|
||||||
format: 'cjs',
|
format: 'cjs',
|
||||||
inputs,
|
inputs,
|
||||||
@@ -21,7 +32,7 @@ const bundles = [
|
|||||||
];
|
];
|
||||||
|
|
||||||
const configs = bundles
|
const configs = bundles
|
||||||
.map(({ inputs, outputDir, format, preserveModules }) =>
|
.map(({ inputs, outputDir, format, minify, preserveModules }) =>
|
||||||
inputs.map((input) => ({
|
inputs.map((input) => ({
|
||||||
input,
|
input,
|
||||||
plugins: plugins({ pkg, minify }),
|
plugins: plugins({ pkg, minify }),
|
||||||
@@ -33,7 +44,7 @@ const configs = bundles
|
|||||||
dir: `${outputDir}/${format}`,
|
dir: `${outputDir}/${format}`,
|
||||||
}
|
}
|
||||||
: {
|
: {
|
||||||
file: `${outputDir}/${format}/${outputFileName}.js`,
|
file: `${outputDir}/${format}/${outputFileName}${minify ? '.min' : ''}.js`,
|
||||||
}),
|
}),
|
||||||
preserveModules,
|
preserveModules,
|
||||||
format,
|
format,
|
||||||
|
|||||||
@@ -1,8 +1,6 @@
|
|||||||
import { h, toChildArray } from 'preact';
|
import { h, toChildArray } from 'preact';
|
||||||
import defaultAttributes from './defaultAttributes';
|
import defaultAttributes from './defaultAttributes';
|
||||||
import type { IconNode, LucideProps } from './types';
|
import type { IconNode, LucideProps } from './types';
|
||||||
import { useLucideContext } from './context';
|
|
||||||
import { mergeClasses } from '@lucide/shared';
|
|
||||||
|
|
||||||
interface IconComponentProps extends LucideProps {
|
interface IconComponentProps extends LucideProps {
|
||||||
iconNode: IconNode;
|
iconNode: IconNode;
|
||||||
@@ -24,41 +22,29 @@ interface IconComponentProps extends LucideProps {
|
|||||||
* @returns {ForwardRefExoticComponent} LucideIcon
|
* @returns {ForwardRefExoticComponent} LucideIcon
|
||||||
*/
|
*/
|
||||||
const Icon = ({
|
const Icon = ({
|
||||||
color,
|
color = 'currentColor',
|
||||||
size,
|
size = 24,
|
||||||
strokeWidth,
|
strokeWidth = 2,
|
||||||
absoluteStrokeWidth,
|
absoluteStrokeWidth,
|
||||||
children,
|
children,
|
||||||
iconNode,
|
iconNode,
|
||||||
class: classes = '',
|
class: classes = '',
|
||||||
...rest
|
...rest
|
||||||
}: IconComponentProps) => {
|
}: IconComponentProps) =>
|
||||||
const {
|
h(
|
||||||
size: contextSize = 24,
|
|
||||||
strokeWidth: contextStrokeWidth = 2,
|
|
||||||
absoluteStrokeWidth: contextAbsoluteStrokeWidth = false,
|
|
||||||
color: contextColor = 'currentColor',
|
|
||||||
class: contextClass = '',
|
|
||||||
} = useLucideContext() ?? {};
|
|
||||||
|
|
||||||
const calculatedStrokeWidth =
|
|
||||||
absoluteStrokeWidth ?? contextAbsoluteStrokeWidth
|
|
||||||
? (Number(strokeWidth ?? contextStrokeWidth) * 24) / Number(size ?? contextSize)
|
|
||||||
: strokeWidth ?? contextStrokeWidth;
|
|
||||||
|
|
||||||
return h(
|
|
||||||
'svg',
|
'svg',
|
||||||
{
|
{
|
||||||
...defaultAttributes,
|
...defaultAttributes,
|
||||||
width: size ?? contextSize ?? 24,
|
width: String(size),
|
||||||
height: size ?? contextSize ?? 24,
|
height: size,
|
||||||
stroke: color ?? contextColor,
|
stroke: color,
|
||||||
['stroke-width' as 'strokeWidth']: calculatedStrokeWidth,
|
['stroke-width' as 'strokeWidth']: absoluteStrokeWidth
|
||||||
class: mergeClasses('lucide', contextClass, classes),
|
? (Number(strokeWidth) * 24) / Number(size)
|
||||||
|
: strokeWidth,
|
||||||
|
class: ['lucide', classes].join(' '),
|
||||||
...rest,
|
...rest,
|
||||||
},
|
},
|
||||||
[...iconNode.map(([tag, attrs]) => h(tag, attrs)), ...toChildArray(children)],
|
[...iconNode.map(([tag, attrs]) => h(tag, attrs)), ...toChildArray(children)],
|
||||||
);
|
);
|
||||||
};
|
|
||||||
|
|
||||||
export default Icon;
|
export default Icon;
|
||||||
|
|||||||
@@ -1,49 +0,0 @@
|
|||||||
import { createContext, type ComponentChildren } from 'preact';
|
|
||||||
import { useContext, useMemo } from 'preact/hooks';
|
|
||||||
|
|
||||||
const LucideContext = createContext<{
|
|
||||||
size?: number;
|
|
||||||
color?: string;
|
|
||||||
strokeWidth?: number;
|
|
||||||
absoluteStrokeWidth?: boolean;
|
|
||||||
class?: string;
|
|
||||||
}>({
|
|
||||||
size: 24,
|
|
||||||
color: 'currentColor',
|
|
||||||
strokeWidth: 2,
|
|
||||||
absoluteStrokeWidth: false,
|
|
||||||
class: '',
|
|
||||||
});
|
|
||||||
|
|
||||||
interface LucideProviderProps {
|
|
||||||
children: ComponentChildren;
|
|
||||||
size?: number;
|
|
||||||
color?: string;
|
|
||||||
strokeWidth?: number;
|
|
||||||
absoluteStrokeWidth?: boolean;
|
|
||||||
class?: string;
|
|
||||||
}
|
|
||||||
|
|
||||||
export function LucideProvider({
|
|
||||||
children,
|
|
||||||
size,
|
|
||||||
color,
|
|
||||||
strokeWidth,
|
|
||||||
absoluteStrokeWidth,
|
|
||||||
class: className,
|
|
||||||
}: LucideProviderProps) {
|
|
||||||
const value = useMemo(
|
|
||||||
() => ({
|
|
||||||
size,
|
|
||||||
color,
|
|
||||||
strokeWidth,
|
|
||||||
absoluteStrokeWidth,
|
|
||||||
class: className,
|
|
||||||
}),
|
|
||||||
[size, color, strokeWidth, absoluteStrokeWidth, className],
|
|
||||||
);
|
|
||||||
|
|
||||||
return <LucideContext.Provider value={value}>{children}</LucideContext.Provider>;
|
|
||||||
}
|
|
||||||
|
|
||||||
export const useLucideContext = () => useContext(LucideContext);
|
|
||||||
@@ -2,7 +2,6 @@ export * from './icons';
|
|||||||
export * as icons from './icons';
|
export * as icons from './icons';
|
||||||
export * from './aliases';
|
export * from './aliases';
|
||||||
export * from './types';
|
export * from './types';
|
||||||
export * from './context';
|
|
||||||
|
|
||||||
export { default as createLucideIcon } from './createLucideIcon';
|
export { default as createLucideIcon } from './createLucideIcon';
|
||||||
export { default as Icon } from './Icon';
|
export { default as Icon } from './Icon';
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
exports[`Using Icon Component > should render icon and match snapshot 1`] = `
|
exports[`Using Icon Component > should render icon and match snapshot 1`] = `
|
||||||
<svg
|
<svg
|
||||||
class="lucide"
|
class="lucide "
|
||||||
fill="none"
|
fill="none"
|
||||||
height="48"
|
height="48"
|
||||||
stroke="red"
|
stroke="red"
|
||||||
|
|||||||
@@ -1,23 +0,0 @@
|
|||||||
// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
|
|
||||||
|
|
||||||
exports[`Using LucideProvider > should render the icon with LucideProvider 1`] = `
|
|
||||||
<svg
|
|
||||||
class="lucide lucide-house"
|
|
||||||
fill="none"
|
|
||||||
height="48"
|
|
||||||
stroke="red"
|
|
||||||
stroke-linecap="round"
|
|
||||||
stroke-linejoin="round"
|
|
||||||
stroke-width="2"
|
|
||||||
viewBox="0 0 24 24"
|
|
||||||
width="48"
|
|
||||||
xmlns="http://www.w3.org/2000/svg"
|
|
||||||
>
|
|
||||||
<path
|
|
||||||
d="M15 21v-8a1 1 0 0 0-1-1h-4a1 1 0 0 0-1 1v8"
|
|
||||||
/>
|
|
||||||
<path
|
|
||||||
d="M3 10a2 2 0 0 1 .709-1.528l7-6a2 2 0 0 1 2.582 0l7 6A2 2 0 0 1 21 10v9a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z"
|
|
||||||
/>
|
|
||||||
</svg>
|
|
||||||
`;
|
|
||||||
@@ -1,88 +0,0 @@
|
|||||||
import { render } from '@testing-library/preact';
|
|
||||||
import { describe, expect, it } from 'vitest';
|
|
||||||
import { House, LucideProvider } from '../src/lucide-preact';
|
|
||||||
|
|
||||||
describe('Using LucideProvider', () => {
|
|
||||||
it('should render the icon with LucideProvider', () => {
|
|
||||||
const { container } = render(
|
|
||||||
<LucideProvider
|
|
||||||
size={48}
|
|
||||||
color="red"
|
|
||||||
>
|
|
||||||
<House />
|
|
||||||
</LucideProvider>,
|
|
||||||
);
|
|
||||||
|
|
||||||
expect(container.firstChild).toMatchSnapshot();
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should render the icon with LucideProvider and custom strokeWidth', () => {
|
|
||||||
const { container } = render(
|
|
||||||
<LucideProvider
|
|
||||||
size={48}
|
|
||||||
color="red"
|
|
||||||
strokeWidth={4}
|
|
||||||
>
|
|
||||||
<House />
|
|
||||||
</LucideProvider>,
|
|
||||||
);
|
|
||||||
|
|
||||||
const IconComponent = container.firstElementChild;
|
|
||||||
|
|
||||||
expect(IconComponent).toHaveAttribute('width', '48');
|
|
||||||
expect(IconComponent).toHaveAttribute('height', '48');
|
|
||||||
expect(IconComponent).toHaveAttribute('stroke', 'red');
|
|
||||||
expect(IconComponent).toHaveAttribute('stroke-width', '4');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should render the icon with LucideProvider and custom absoluteStrokeWidth', () => {
|
|
||||||
const { container } = render(
|
|
||||||
<LucideProvider
|
|
||||||
size={48}
|
|
||||||
color="red"
|
|
||||||
absoluteStrokeWidth
|
|
||||||
>
|
|
||||||
<House />
|
|
||||||
</LucideProvider>,
|
|
||||||
);
|
|
||||||
|
|
||||||
const IconComponent = container.firstElementChild;
|
|
||||||
|
|
||||||
expect(IconComponent).toHaveAttribute('stroke-width', '1');
|
|
||||||
});
|
|
||||||
|
|
||||||
it("should override the provider's global props when passing props to the icon", () => {
|
|
||||||
const { container } = render(
|
|
||||||
<LucideProvider
|
|
||||||
size={48}
|
|
||||||
color="red"
|
|
||||||
strokeWidth={4}
|
|
||||||
>
|
|
||||||
<House
|
|
||||||
size={24}
|
|
||||||
color="blue"
|
|
||||||
strokeWidth={2}
|
|
||||||
/>
|
|
||||||
</LucideProvider>,
|
|
||||||
);
|
|
||||||
|
|
||||||
const IconComponent = container.firstElementChild;
|
|
||||||
|
|
||||||
expect(IconComponent).toHaveAttribute('width', '24');
|
|
||||||
expect(IconComponent).toHaveAttribute('height', '24');
|
|
||||||
expect(IconComponent).toHaveAttribute('stroke', 'blue');
|
|
||||||
expect(IconComponent).toHaveAttribute('stroke-width', '2');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should merge class names from LucideProvider and icon props', () => {
|
|
||||||
const { container } = render(
|
|
||||||
<LucideProvider class="provider-class">
|
|
||||||
<House class="icon-class" />
|
|
||||||
</LucideProvider>,
|
|
||||||
);
|
|
||||||
|
|
||||||
const IconComponent = container.firstElementChild;
|
|
||||||
|
|
||||||
expect(IconComponent).toHaveAttribute('class', 'lucide provider-class lucide-house icon-class');
|
|
||||||
});
|
|
||||||
});
|
|
||||||
@@ -27,6 +27,20 @@
|
|||||||
"module": "dist/esm/lucide-react-native.js",
|
"module": "dist/esm/lucide-react-native.js",
|
||||||
"typings": "dist/lucide-react-native.d.ts",
|
"typings": "dist/lucide-react-native.d.ts",
|
||||||
"react-native": "dist/esm/lucide-react-native.js",
|
"react-native": "dist/esm/lucide-react-native.js",
|
||||||
|
"exports": {
|
||||||
|
".": {
|
||||||
|
"types": "./dist/lucide-react-native.d.ts",
|
||||||
|
"import": "./dist/esm/lucide-react-native.js",
|
||||||
|
"browser": "./dist/esm/lucide-react-native.js",
|
||||||
|
"require": "./dist/cjs/lucide-react-native.js"
|
||||||
|
},
|
||||||
|
"./icons": {
|
||||||
|
"types": "./dist/icons.d.ts",
|
||||||
|
"import": "./dist/esm/icons/index.js",
|
||||||
|
"browser": "./dist/esm/icons/index.js",
|
||||||
|
"require": "./dist/cjs/icons/index.js"
|
||||||
|
}
|
||||||
|
},
|
||||||
"sideEffects": false,
|
"sideEffects": false,
|
||||||
"files": [
|
"files": [
|
||||||
"dist"
|
"dist"
|
||||||
@@ -38,14 +52,13 @@
|
|||||||
"build:icons": "build-icons --output=./src --templateSrc=./scripts/exportTemplate.mts --renderUniqueKey --iconFileExtension=.ts --exportFileName=index.ts --withAliases --aliasesFileExtension=.ts",
|
"build:icons": "build-icons --output=./src --templateSrc=./scripts/exportTemplate.mts --renderUniqueKey --iconFileExtension=.ts --exportFileName=index.ts --withAliases --aliasesFileExtension=.ts",
|
||||||
"build:bundles": "rollup -c ./rollup.config.mjs",
|
"build:bundles": "rollup -c ./rollup.config.mjs",
|
||||||
"test": "pnpm build:icons && vitest run",
|
"test": "pnpm build:icons && vitest run",
|
||||||
"test:watch": "vitest watch",
|
|
||||||
"version": "pnpm version --git-tag-version=false"
|
"version": "pnpm version --git-tag-version=false"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@lucide/rollup-plugins": "workspace:*",
|
"@lucide/rollup-plugins": "workspace:*",
|
||||||
"@lucide/build-icons": "workspace:*",
|
"@lucide/build-icons": "workspace:*",
|
||||||
"@lucide/shared": "workspace:*",
|
"@lucide/shared": "workspace:*",
|
||||||
"@testing-library/jest-dom": "^6.6.3",
|
"@testing-library/jest-dom": "^6.1.6",
|
||||||
"@testing-library/react": "^14.1.2",
|
"@testing-library/react": "^14.1.2",
|
||||||
"@types/prop-types": "^15.7.5",
|
"@types/prop-types": "^15.7.5",
|
||||||
"@types/react": "^18.0.21",
|
"@types/react": "^18.0.21",
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ import pkg from './package.json' with { type: 'json' };
|
|||||||
const packageName = 'LucideReact';
|
const packageName = 'LucideReact';
|
||||||
const outputFileName = 'lucide-react-native';
|
const outputFileName = 'lucide-react-native';
|
||||||
const outputDir = 'dist';
|
const outputDir = 'dist';
|
||||||
const inputs = ['src/lucide-react-native.ts'];
|
const inputs = ['src/lucide-react-native.ts', 'src/icons/index.ts'];
|
||||||
const bundles = [
|
const bundles = [
|
||||||
{
|
{
|
||||||
format: 'cjs',
|
format: 'cjs',
|
||||||
@@ -22,10 +22,10 @@ const bundles = [
|
|||||||
];
|
];
|
||||||
|
|
||||||
const configs = bundles
|
const configs = bundles
|
||||||
.map(({ inputs, outputDir, format, preserveModules }) =>
|
.map(({ inputs, outputDir, format, minify, preserveModules }) =>
|
||||||
inputs.map((input) => ({
|
inputs.map((input) => ({
|
||||||
input,
|
input,
|
||||||
plugins: plugins({ pkg }),
|
plugins: plugins({ pkg, minify }),
|
||||||
external: ['react', 'react-native-svg'],
|
external: ['react', 'react-native-svg'],
|
||||||
output: {
|
output: {
|
||||||
name: packageName,
|
name: packageName,
|
||||||
@@ -35,7 +35,7 @@ const configs = bundles
|
|||||||
exports: 'auto',
|
exports: 'auto',
|
||||||
}
|
}
|
||||||
: {
|
: {
|
||||||
file: `${outputDir}/${format}/${outputFileName}.js`,
|
file: `${outputDir}/${format}/${outputFileName}${minify ? '.min' : ''}.js`,
|
||||||
}),
|
}),
|
||||||
format,
|
format,
|
||||||
preserveModules,
|
preserveModules,
|
||||||
@@ -60,6 +60,16 @@ export default [
|
|||||||
],
|
],
|
||||||
plugins: [dts()],
|
plugins: [dts()],
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
input: inputs[1],
|
||||||
|
output: [
|
||||||
|
{
|
||||||
|
file: `dist/icons.d.ts`,
|
||||||
|
format: 'es',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
plugins: [dts()],
|
||||||
|
},
|
||||||
{
|
{
|
||||||
input: `src/${outputFileName}.suffixed.ts`,
|
input: `src/${outputFileName}.suffixed.ts`,
|
||||||
output: [
|
output: [
|
||||||
|
|||||||
@@ -2,11 +2,9 @@ import { createElement, forwardRef, type FunctionComponent } from 'react';
|
|||||||
import * as NativeSvg from 'react-native-svg';
|
import * as NativeSvg from 'react-native-svg';
|
||||||
import defaultAttributes, { childDefaultAttributes } from './defaultAttributes';
|
import defaultAttributes, { childDefaultAttributes } from './defaultAttributes';
|
||||||
import { IconNode, LucideProps } from './types';
|
import { IconNode, LucideProps } from './types';
|
||||||
import { useLucideContext } from './context';
|
|
||||||
|
|
||||||
interface IconComponentProps extends LucideProps {
|
interface IconComponentProps extends LucideProps {
|
||||||
iconNode: IconNode;
|
iconNode: IconNode;
|
||||||
testID?: string;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -25,22 +23,22 @@ interface IconComponentProps extends LucideProps {
|
|||||||
* @returns {ForwardRefExoticComponent} LucideIcon
|
* @returns {ForwardRefExoticComponent} LucideIcon
|
||||||
*/
|
*/
|
||||||
const Icon = forwardRef<SVGSVGElement, IconComponentProps>(
|
const Icon = forwardRef<SVGSVGElement, IconComponentProps>(
|
||||||
({ color, size, strokeWidth, absoluteStrokeWidth, children, iconNode, testID, ...rest }, ref) => {
|
(
|
||||||
const {
|
{
|
||||||
size: contextSize = 24,
|
color = 'currentColor',
|
||||||
strokeWidth: contextStrokeWidth = 2,
|
size = 24,
|
||||||
absoluteStrokeWidth: contextAbsoluteStrokeWidth = false,
|
strokeWidth = 2,
|
||||||
color: contextColor = 'currentColor',
|
absoluteStrokeWidth,
|
||||||
} = useLucideContext() ?? {};
|
children,
|
||||||
|
iconNode,
|
||||||
const calculatedStrokeWidth =
|
className,
|
||||||
absoluteStrokeWidth ?? contextAbsoluteStrokeWidth
|
...rest
|
||||||
? (Number(strokeWidth ?? contextStrokeWidth) * 24) / Number(size ?? contextSize)
|
},
|
||||||
: strokeWidth ?? contextStrokeWidth;
|
ref,
|
||||||
|
) => {
|
||||||
const customAttrs = {
|
const customAttrs = {
|
||||||
stroke: color ?? contextColor ?? defaultAttributes.stroke,
|
stroke: color,
|
||||||
strokeWidth: calculatedStrokeWidth,
|
strokeWidth: absoluteStrokeWidth ? (Number(strokeWidth) * 24) / Number(size) : strokeWidth,
|
||||||
...rest,
|
...rest,
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -49,9 +47,9 @@ const Icon = forwardRef<SVGSVGElement, IconComponentProps>(
|
|||||||
{
|
{
|
||||||
ref,
|
ref,
|
||||||
...defaultAttributes,
|
...defaultAttributes,
|
||||||
width: size ?? contextSize ?? defaultAttributes.width,
|
className,
|
||||||
height: size ?? contextSize ?? defaultAttributes.height,
|
width: size,
|
||||||
'data-testid': testID,
|
height: size,
|
||||||
...customAttrs,
|
...customAttrs,
|
||||||
},
|
},
|
||||||
[
|
[
|
||||||
|
|||||||
@@ -1,43 +0,0 @@
|
|||||||
import { createContext, type ReactNode, useContext, useMemo } from 'react';
|
|
||||||
|
|
||||||
const LucideContext = createContext<{
|
|
||||||
size?: number;
|
|
||||||
color?: string;
|
|
||||||
strokeWidth?: number;
|
|
||||||
absoluteStrokeWidth?: boolean;
|
|
||||||
}>({
|
|
||||||
size: 24,
|
|
||||||
color: 'currentColor',
|
|
||||||
strokeWidth: 2,
|
|
||||||
absoluteStrokeWidth: false,
|
|
||||||
});
|
|
||||||
|
|
||||||
interface LucideProviderProps {
|
|
||||||
children: ReactNode;
|
|
||||||
size?: number;
|
|
||||||
color?: string;
|
|
||||||
strokeWidth?: number;
|
|
||||||
absoluteStrokeWidth?: boolean;
|
|
||||||
}
|
|
||||||
|
|
||||||
export function LucideProvider({
|
|
||||||
children,
|
|
||||||
size,
|
|
||||||
color,
|
|
||||||
strokeWidth,
|
|
||||||
absoluteStrokeWidth,
|
|
||||||
}: LucideProviderProps) {
|
|
||||||
const value = useMemo(
|
|
||||||
() => ({
|
|
||||||
size,
|
|
||||||
color,
|
|
||||||
strokeWidth,
|
|
||||||
absoluteStrokeWidth,
|
|
||||||
}),
|
|
||||||
[size, color, strokeWidth, absoluteStrokeWidth],
|
|
||||||
);
|
|
||||||
|
|
||||||
return <LucideContext.Provider value={value}>{children}</LucideContext.Provider>;
|
|
||||||
}
|
|
||||||
|
|
||||||
export const useLucideContext = () => useContext(LucideContext);
|
|
||||||
@@ -1,24 +1,55 @@
|
|||||||
import { forwardRef, createElement } from 'react';
|
import { forwardRef, createElement, FunctionComponent } from 'react';
|
||||||
import { IconNode, LucideProps } from './types';
|
import * as NativeSvg from 'react-native-svg';
|
||||||
import { toPascalCase } from '@lucide/shared';
|
import defaultAttributes, { childDefaultAttributes } from './defaultAttributes';
|
||||||
import Icon from './Icon';
|
import { IconNode, LucideIcon, LucideProps } from './types';
|
||||||
|
|
||||||
/**
|
const createLucideIcon = (iconName: string, iconNode: IconNode): LucideIcon => {
|
||||||
* Create a Lucide icon component
|
const Component = forwardRef(
|
||||||
* @param {string} iconName
|
(
|
||||||
* @param {array} iconNode
|
{
|
||||||
* @returns {ForwardRefExoticComponent} LucideIcon
|
color = 'currentColor',
|
||||||
*/
|
size = 24,
|
||||||
const createLucideIcon = (iconName: string, iconNode: IconNode) => {
|
strokeWidth = 2,
|
||||||
const Component = forwardRef<SVGSVGElement, LucideProps>((props, ref) =>
|
absoluteStrokeWidth,
|
||||||
createElement(Icon, {
|
children,
|
||||||
|
'data-testid': dataTestId,
|
||||||
|
...rest
|
||||||
|
}: LucideProps,
|
||||||
ref,
|
ref,
|
||||||
iconNode,
|
) => {
|
||||||
...props,
|
const customAttrs = {
|
||||||
}),
|
stroke: color,
|
||||||
|
strokeWidth: absoluteStrokeWidth ? (Number(strokeWidth) * 24) / Number(size) : strokeWidth,
|
||||||
|
...rest,
|
||||||
|
};
|
||||||
|
|
||||||
|
return createElement(
|
||||||
|
NativeSvg.Svg as unknown as string,
|
||||||
|
{
|
||||||
|
ref,
|
||||||
|
...defaultAttributes,
|
||||||
|
width: size,
|
||||||
|
height: size,
|
||||||
|
'data-testid': dataTestId,
|
||||||
|
...customAttrs,
|
||||||
|
},
|
||||||
|
[
|
||||||
|
...iconNode.map(([tag, attrs]) => {
|
||||||
|
const upperCasedTag = (tag.charAt(0).toUpperCase() +
|
||||||
|
tag.slice(1)) as keyof typeof NativeSvg;
|
||||||
|
// duplicating the attributes here because generating the OTA update bundles don't inherit the SVG properties from parent (codepush, expo-updates)
|
||||||
|
return createElement(
|
||||||
|
NativeSvg[upperCasedTag] as FunctionComponent<LucideProps>,
|
||||||
|
{ ...childDefaultAttributes, ...customAttrs, ...attrs } as LucideProps,
|
||||||
|
);
|
||||||
|
}),
|
||||||
|
...((Array.isArray(children) ? children : [children]) || []),
|
||||||
|
],
|
||||||
|
);
|
||||||
|
},
|
||||||
);
|
);
|
||||||
|
|
||||||
Component.displayName = toPascalCase(iconName);
|
Component.displayName = `${iconName}`;
|
||||||
|
|
||||||
return Component;
|
return Component;
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
export * from './icons';
|
export * from './icons';
|
||||||
export * as icons from './icons';
|
|
||||||
export * from './aliases/prefixed';
|
export * from './aliases/prefixed';
|
||||||
export * from './types';
|
export * from './types';
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
export * from './icons';
|
export * from './icons';
|
||||||
export * as icons from './icons';
|
|
||||||
export * from './aliases/suffixed';
|
export * from './aliases/suffixed';
|
||||||
export * from './types';
|
export * from './types';
|
||||||
|
|
||||||
|
|||||||
@@ -1,8 +1,6 @@
|
|||||||
export * from './icons';
|
export * from './icons';
|
||||||
export * as icons from './icons';
|
|
||||||
export * from './aliases';
|
export * from './aliases';
|
||||||
export * from './types';
|
export * from './types';
|
||||||
export * from './context';
|
|
||||||
|
|
||||||
export { default as createLucideIcon } from './createLucideIcon';
|
export { default as createLucideIcon } from './createLucideIcon';
|
||||||
export { default as Icon } from './Icon';
|
export { default as Icon } from './Icon';
|
||||||
|
|||||||
@@ -1,32 +0,0 @@
|
|||||||
// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
|
|
||||||
|
|
||||||
exports[`Using LucideProvider > should render the icon with LucideProvider 1`] = `
|
|
||||||
<svg
|
|
||||||
fill="none"
|
|
||||||
height="24"
|
|
||||||
stroke="currentColor"
|
|
||||||
stroke-linecap="round"
|
|
||||||
stroke-linejoin="round"
|
|
||||||
stroke-width="2"
|
|
||||||
viewBox="0 0 24 24"
|
|
||||||
width="24"
|
|
||||||
xmlns="http://www.w3.org/2000/svg"
|
|
||||||
>
|
|
||||||
<path
|
|
||||||
d="M15 21v-8a1 1 0 0 0-1-1h-4a1 1 0 0 0-1 1v8"
|
|
||||||
fill="none"
|
|
||||||
stroke="currentColor"
|
|
||||||
stroke-linecap="round"
|
|
||||||
stroke-linejoin="round"
|
|
||||||
stroke-width="2"
|
|
||||||
/>
|
|
||||||
<path
|
|
||||||
d="M3 10a2 2 0 0 1 .709-1.528l7-6a2 2 0 0 1 2.582 0l7 6A2 2 0 0 1 21 10v9a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z"
|
|
||||||
fill="none"
|
|
||||||
stroke="currentColor"
|
|
||||||
stroke-linecap="round"
|
|
||||||
stroke-linejoin="round"
|
|
||||||
stroke-width="2"
|
|
||||||
/>
|
|
||||||
</svg>
|
|
||||||
`;
|
|
||||||
@@ -1,62 +1,60 @@
|
|||||||
// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
|
// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
|
||||||
|
|
||||||
exports[`Using lucide icon components > should adjust the size, stroke color and stroke width 1`] = `
|
exports[`Using lucide icon components > should adjust the size, stroke color and stroke width 1`] = `
|
||||||
<svg
|
<svg xmlns="http://www.w3.org/2000/svg"
|
||||||
data-testid="grid-icon"
|
width="48"
|
||||||
fill="none"
|
height="48"
|
||||||
height="48"
|
viewbox="0 0 24 24"
|
||||||
stroke="red"
|
fill="none"
|
||||||
stroke-linecap="round"
|
stroke="red"
|
||||||
stroke-linejoin="round"
|
stroke-width="4"
|
||||||
stroke-width="4"
|
stroke-linecap="round"
|
||||||
viewBox="0 0 24 24"
|
stroke-linejoin="round"
|
||||||
width="48"
|
|
||||||
xmlns="http://www.w3.org/2000/svg"
|
|
||||||
>
|
>
|
||||||
<rect
|
<rect fill="none"
|
||||||
fill="none"
|
stroke="red"
|
||||||
height="18"
|
stroke-width="4"
|
||||||
rx="2"
|
stroke-linecap="round"
|
||||||
stroke="red"
|
stroke-linejoin="round"
|
||||||
stroke-linecap="round"
|
width="18"
|
||||||
stroke-linejoin="round"
|
height="18"
|
||||||
stroke-width="4"
|
x="3"
|
||||||
width="18"
|
y="3"
|
||||||
x="3"
|
rx="2"
|
||||||
y="3"
|
>
|
||||||
/>
|
</rect>
|
||||||
<path
|
<path fill="none"
|
||||||
d="M3 9h18"
|
stroke="red"
|
||||||
fill="none"
|
stroke-width="4"
|
||||||
stroke="red"
|
stroke-linecap="round"
|
||||||
stroke-linecap="round"
|
stroke-linejoin="round"
|
||||||
stroke-linejoin="round"
|
d="M3 9h18"
|
||||||
stroke-width="4"
|
>
|
||||||
/>
|
</path>
|
||||||
<path
|
<path fill="none"
|
||||||
d="M3 15h18"
|
stroke="red"
|
||||||
fill="none"
|
stroke-width="4"
|
||||||
stroke="red"
|
stroke-linecap="round"
|
||||||
stroke-linecap="round"
|
stroke-linejoin="round"
|
||||||
stroke-linejoin="round"
|
d="M3 15h18"
|
||||||
stroke-width="4"
|
>
|
||||||
/>
|
</path>
|
||||||
<path
|
<path fill="none"
|
||||||
d="M9 3v18"
|
stroke="red"
|
||||||
fill="none"
|
stroke-width="4"
|
||||||
stroke="red"
|
stroke-linecap="round"
|
||||||
stroke-linecap="round"
|
stroke-linejoin="round"
|
||||||
stroke-linejoin="round"
|
d="M9 3v18"
|
||||||
stroke-width="4"
|
>
|
||||||
/>
|
</path>
|
||||||
<path
|
<path fill="none"
|
||||||
d="M15 3v18"
|
stroke="red"
|
||||||
fill="none"
|
stroke-width="4"
|
||||||
stroke="red"
|
stroke-linecap="round"
|
||||||
stroke-linecap="round"
|
stroke-linejoin="round"
|
||||||
stroke-linejoin="round"
|
d="M15 3v18"
|
||||||
stroke-width="4"
|
>
|
||||||
/>
|
</path>
|
||||||
</svg>
|
</svg>
|
||||||
`;
|
`;
|
||||||
|
|
||||||
|
|||||||
@@ -1,80 +0,0 @@
|
|||||||
import { cleanup, render } from '@testing-library/react';
|
|
||||||
import { describe, expect, it, vi } from 'vitest';
|
|
||||||
import { House, LucideProvider } from '../src/lucide-react-native';
|
|
||||||
|
|
||||||
vi.mock('react-native-svg');
|
|
||||||
|
|
||||||
describe('Using LucideProvider', () => {
|
|
||||||
it('should render the icon with LucideProvider', () => {
|
|
||||||
cleanup();
|
|
||||||
const { container } = render(
|
|
||||||
<LucideProvider>
|
|
||||||
<House />
|
|
||||||
</LucideProvider>,
|
|
||||||
);
|
|
||||||
|
|
||||||
expect(container.firstChild).toMatchSnapshot();
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should render the icon with LucideProvider and custom strokeWidth', () => {
|
|
||||||
cleanup();
|
|
||||||
const testId = 'house-icon';
|
|
||||||
const { getByTestId } = render(
|
|
||||||
<LucideProvider
|
|
||||||
size={48}
|
|
||||||
color="red"
|
|
||||||
strokeWidth={4}
|
|
||||||
>
|
|
||||||
<House testID={testId} />
|
|
||||||
</LucideProvider>,
|
|
||||||
);
|
|
||||||
|
|
||||||
const IconComponent = getByTestId(testId);
|
|
||||||
|
|
||||||
expect(IconComponent).toHaveAttribute('width', '48');
|
|
||||||
expect(IconComponent).toHaveAttribute('height', '48');
|
|
||||||
expect(IconComponent).toHaveAttribute('stroke', 'red');
|
|
||||||
expect(IconComponent).toHaveAttribute('stroke-width', '4');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should render the icon with LucideProvider and custom absoluteStrokeWidth', () => {
|
|
||||||
cleanup();
|
|
||||||
const { container } = render(
|
|
||||||
<LucideProvider
|
|
||||||
size={48}
|
|
||||||
color="red"
|
|
||||||
absoluteStrokeWidth
|
|
||||||
>
|
|
||||||
<House />
|
|
||||||
</LucideProvider>,
|
|
||||||
);
|
|
||||||
|
|
||||||
const IconComponent = container.firstElementChild;
|
|
||||||
|
|
||||||
expect(IconComponent).toHaveAttribute('stroke-width', '1');
|
|
||||||
});
|
|
||||||
|
|
||||||
it("should override the provider's global props when passing props to the icon", () => {
|
|
||||||
cleanup();
|
|
||||||
const { container } = render(
|
|
||||||
<LucideProvider
|
|
||||||
size={48}
|
|
||||||
color="red"
|
|
||||||
strokeWidth={4}
|
|
||||||
>
|
|
||||||
<House
|
|
||||||
size={32}
|
|
||||||
color="blue"
|
|
||||||
strokeWidth={3}
|
|
||||||
/>
|
|
||||||
</LucideProvider>,
|
|
||||||
);
|
|
||||||
|
|
||||||
const IconComponent = container.firstElementChild;
|
|
||||||
|
|
||||||
expect(IconComponent).toHaveAttribute('width', '32');
|
|
||||||
expect(IconComponent).toHaveAttribute('height', '32');
|
|
||||||
expect(IconComponent).toHaveAttribute('stroke', 'blue');
|
|
||||||
expect(IconComponent).toHaveAttribute('stroke-width', '3');
|
|
||||||
});
|
|
||||||
});
|
|
||||||
@@ -14,53 +14,49 @@ describe('Using lucide icon components', () => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
it('should adjust the size, stroke color and stroke width', () => {
|
it('should adjust the size, stroke color and stroke width', () => {
|
||||||
const testId = 'grid-icon';
|
const { container } = render(
|
||||||
const { getByTestId } = render(
|
|
||||||
<Grid
|
<Grid
|
||||||
size={48}
|
size={48}
|
||||||
stroke="red"
|
stroke="red"
|
||||||
strokeWidth={4}
|
strokeWidth={4}
|
||||||
testID={testId}
|
|
||||||
/>,
|
/>,
|
||||||
);
|
);
|
||||||
|
|
||||||
const GridIcon = getByTestId(testId);
|
const SVGElement = container.firstElementChild;
|
||||||
|
|
||||||
expect(GridIcon).toHaveAttribute('stroke', 'red');
|
expect(SVGElement).toHaveAttribute('stroke', 'red');
|
||||||
expect(GridIcon).toHaveAttribute('width', '48');
|
expect(SVGElement).toHaveAttribute('width', '48');
|
||||||
expect(GridIcon).toHaveAttribute('height', '48');
|
expect(SVGElement).toHaveAttribute('height', '48');
|
||||||
expect(GridIcon).toHaveAttribute('stroke-width', '4');
|
expect(SVGElement).toHaveAttribute('stroke-width', '4');
|
||||||
|
|
||||||
expect(GridIcon).toMatchSnapshot();
|
expect(container.innerHTML).toMatchSnapshot();
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should render the alias icon', () => {
|
it('should render the alias icon', () => {
|
||||||
const penTestId = 'pen-icon';
|
const testId = 'pen-icon';
|
||||||
const { getByTestId: getByTestId1 } = render(
|
const { container } = render(
|
||||||
<Pen
|
<Pen
|
||||||
testID={penTestId}
|
data-testid={testId}
|
||||||
size={48}
|
size={48}
|
||||||
stroke="red"
|
stroke="red"
|
||||||
strokeWidth={4}
|
strokeWidth={4}
|
||||||
/>,
|
/>,
|
||||||
);
|
);
|
||||||
|
|
||||||
const penIcon = getByTestId1(penTestId);
|
const PenIconRenderedHTML = container.innerHTML;
|
||||||
|
|
||||||
cleanup();
|
cleanup();
|
||||||
|
|
||||||
const { getByTestId: getByTestId2 } = render(
|
const { container: Edit2Container } = render(
|
||||||
<Edit2
|
<Edit2
|
||||||
testID={penTestId}
|
data-testid={testId}
|
||||||
size={48}
|
size={48}
|
||||||
stroke="red"
|
stroke="red"
|
||||||
strokeWidth={4}
|
strokeWidth={4}
|
||||||
/>,
|
/>,
|
||||||
);
|
);
|
||||||
|
|
||||||
const edit2Icon = getByTestId2(penTestId);
|
expect(PenIconRenderedHTML).toBe(Edit2Container.innerHTML);
|
||||||
|
|
||||||
expect(penIcon).toStrictEqual(edit2Icon);
|
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should not scale the strokeWidth when absoluteStrokeWidth is set', () => {
|
it('should not scale the strokeWidth when absoluteStrokeWidth is set', () => {
|
||||||
@@ -87,8 +83,8 @@ describe('Using lucide icon components', () => {
|
|||||||
const childId = 'child';
|
const childId = 'child';
|
||||||
|
|
||||||
const { container, getByTestId } = render(
|
const { container, getByTestId } = render(
|
||||||
<Grid testID={testId}>
|
<Grid data-testid={testId}>
|
||||||
<Grid testID={childId} />
|
<Grid data-testid={childId} />
|
||||||
</Grid>,
|
</Grid>,
|
||||||
);
|
);
|
||||||
const { children } = container.firstElementChild ?? {};
|
const { children } = container.firstElementChild ?? {};
|
||||||
@@ -104,9 +100,9 @@ describe('Using lucide icon components', () => {
|
|||||||
const childId2 = 'child2';
|
const childId2 = 'child2';
|
||||||
|
|
||||||
const { container, getByTestId } = render(
|
const { container, getByTestId } = render(
|
||||||
<Grid testID={testId}>
|
<Grid data-testid={testId}>
|
||||||
<Grid testID={childId1} />
|
<Grid data-testid={childId1} />
|
||||||
<Grid testID={childId2} />
|
<Grid data-testid={childId2} />
|
||||||
</Grid>,
|
</Grid>,
|
||||||
);
|
);
|
||||||
const { children } = getByTestId(testId) as unknown as { children: HTMLCollection };
|
const { children } = getByTestId(testId) as unknown as { children: HTMLCollection };
|
||||||
@@ -127,7 +123,7 @@ describe('Using lucide icon components', () => {
|
|||||||
|
|
||||||
const { container, getByTestId } = render(
|
const { container, getByTestId } = render(
|
||||||
<Grid
|
<Grid
|
||||||
testID={testId}
|
data-testid={testId}
|
||||||
fill={fill}
|
fill={fill}
|
||||||
color={color}
|
color={color}
|
||||||
strokeWidth={strokeWidth}
|
strokeWidth={strokeWidth}
|
||||||
|
|||||||
@@ -24,7 +24,9 @@
|
|||||||
"author": "Eric Fennis",
|
"author": "Eric Fennis",
|
||||||
"amdName": "lucide-react",
|
"amdName": "lucide-react",
|
||||||
"main": "dist/cjs/lucide-react.js",
|
"main": "dist/cjs/lucide-react.js",
|
||||||
|
"main:umd": "dist/umd/lucide-react.js",
|
||||||
"module": "dist/esm/lucide-react.js",
|
"module": "dist/esm/lucide-react.js",
|
||||||
|
"unpkg": "dist/umd/lucide-react.min.js",
|
||||||
"typings": "dist/lucide-react.d.ts",
|
"typings": "dist/lucide-react.d.ts",
|
||||||
"sideEffects": false,
|
"sideEffects": false,
|
||||||
"files": [
|
"files": [
|
||||||
@@ -52,10 +54,10 @@
|
|||||||
"@lucide/build-icons": "workspace:*",
|
"@lucide/build-icons": "workspace:*",
|
||||||
"@lucide/rollup-plugins": "workspace:*",
|
"@lucide/rollup-plugins": "workspace:*",
|
||||||
"@lucide/shared": "workspace:*",
|
"@lucide/shared": "workspace:*",
|
||||||
"@testing-library/jest-dom": "^6.6.3",
|
"@testing-library/jest-dom": "^6.1.6",
|
||||||
"@testing-library/react": "^14.1.2",
|
"@testing-library/react": "^14.1.2",
|
||||||
"@types/react": "^18.2.37",
|
"@types/react": "^18.2.37",
|
||||||
"@vitejs/plugin-react": "^4.6.0",
|
"@vitejs/plugin-react": "^4.4.1",
|
||||||
"jest-serializer-html": "^7.1.0",
|
"jest-serializer-html": "^7.1.0",
|
||||||
"react": "18.2.0",
|
"react": "18.2.0",
|
||||||
"react-dom": "18.2.0",
|
"react-dom": "18.2.0",
|
||||||
|
|||||||
@@ -10,6 +10,17 @@ const packageName = 'LucideReact';
|
|||||||
const outputFileName = 'lucide-react';
|
const outputFileName = 'lucide-react';
|
||||||
const inputs = [`src/lucide-react.ts`];
|
const inputs = [`src/lucide-react.ts`];
|
||||||
const bundles = [
|
const bundles = [
|
||||||
|
{
|
||||||
|
format: 'umd',
|
||||||
|
inputs,
|
||||||
|
outputDir: 'dist/umd',
|
||||||
|
minify: true,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
format: 'umd',
|
||||||
|
inputs,
|
||||||
|
outputDir: 'dist/umd',
|
||||||
|
},
|
||||||
{
|
{
|
||||||
format: 'cjs',
|
format: 'cjs',
|
||||||
inputs,
|
inputs,
|
||||||
@@ -67,7 +78,7 @@ const configs = bundles
|
|||||||
dir: outputDir,
|
dir: outputDir,
|
||||||
}
|
}
|
||||||
: {
|
: {
|
||||||
file: outputFile ?? `${outputDir}/${outputFileName}.js`,
|
file: outputFile ?? `${outputDir}/${outputFileName}${minify ? '.min' : ''}.js`,
|
||||||
}),
|
}),
|
||||||
paths,
|
paths,
|
||||||
entryFileNames,
|
entryFileNames,
|
||||||
|
|||||||
@@ -2,7 +2,6 @@ import { createElement, forwardRef } from 'react';
|
|||||||
import defaultAttributes from './defaultAttributes';
|
import defaultAttributes from './defaultAttributes';
|
||||||
import { IconNode, LucideProps } from './types';
|
import { IconNode, LucideProps } from './types';
|
||||||
import { mergeClasses, hasA11yProp } from '@lucide/shared';
|
import { mergeClasses, hasA11yProp } from '@lucide/shared';
|
||||||
import { useLucideContext } from './context';
|
|
||||||
|
|
||||||
interface IconComponentProps extends LucideProps {
|
interface IconComponentProps extends LucideProps {
|
||||||
iconNode: IconNode;
|
iconNode: IconNode;
|
||||||
@@ -25,32 +24,28 @@ interface IconComponentProps extends LucideProps {
|
|||||||
*/
|
*/
|
||||||
const Icon = forwardRef<SVGSVGElement, IconComponentProps>(
|
const Icon = forwardRef<SVGSVGElement, IconComponentProps>(
|
||||||
(
|
(
|
||||||
{ color, size, strokeWidth, absoluteStrokeWidth, className = '', children, iconNode, ...rest },
|
{
|
||||||
|
color = 'currentColor',
|
||||||
|
size = 24,
|
||||||
|
strokeWidth = 2,
|
||||||
|
absoluteStrokeWidth,
|
||||||
|
className = '',
|
||||||
|
children,
|
||||||
|
iconNode,
|
||||||
|
...rest
|
||||||
|
},
|
||||||
ref,
|
ref,
|
||||||
) => {
|
) =>
|
||||||
const {
|
createElement(
|
||||||
size: contextSize = 24,
|
|
||||||
strokeWidth: contextStrokeWidth = 2,
|
|
||||||
absoluteStrokeWidth: contextAbsoluteStrokeWidth = false,
|
|
||||||
color: contextColor = 'currentColor',
|
|
||||||
className: contextClass = '',
|
|
||||||
} = useLucideContext() ?? {};
|
|
||||||
|
|
||||||
const calculatedStrokeWidth =
|
|
||||||
absoluteStrokeWidth ?? contextAbsoluteStrokeWidth
|
|
||||||
? (Number(strokeWidth ?? contextStrokeWidth) * 24) / Number(size ?? contextSize)
|
|
||||||
: strokeWidth ?? contextStrokeWidth;
|
|
||||||
|
|
||||||
return createElement(
|
|
||||||
'svg',
|
'svg',
|
||||||
{
|
{
|
||||||
ref,
|
ref,
|
||||||
...defaultAttributes,
|
...defaultAttributes,
|
||||||
width: size ?? contextSize ?? defaultAttributes.width,
|
width: size,
|
||||||
height: size ?? contextSize ?? defaultAttributes.height,
|
height: size,
|
||||||
stroke: color ?? contextColor,
|
stroke: color,
|
||||||
strokeWidth: calculatedStrokeWidth,
|
strokeWidth: absoluteStrokeWidth ? (Number(strokeWidth) * 24) / Number(size) : strokeWidth,
|
||||||
className: mergeClasses('lucide', contextClass, className),
|
className: mergeClasses('lucide', className),
|
||||||
...(!children && !hasA11yProp(rest) && { 'aria-hidden': 'true' }),
|
...(!children && !hasA11yProp(rest) && { 'aria-hidden': 'true' }),
|
||||||
...rest,
|
...rest,
|
||||||
},
|
},
|
||||||
@@ -58,8 +53,7 @@ const Icon = forwardRef<SVGSVGElement, IconComponentProps>(
|
|||||||
...iconNode.map(([tag, attrs]) => createElement(tag, attrs)),
|
...iconNode.map(([tag, attrs]) => createElement(tag, attrs)),
|
||||||
...(Array.isArray(children) ? children : [children]),
|
...(Array.isArray(children) ? children : [children]),
|
||||||
],
|
],
|
||||||
);
|
),
|
||||||
},
|
|
||||||
);
|
);
|
||||||
|
|
||||||
export default Icon;
|
export default Icon;
|
||||||
@@ -1,40 +0,0 @@
|
|||||||
import { createContext, type ReactNode, useContext, useMemo } from 'react';
|
|
||||||
import { LucideProps } from './types';
|
|
||||||
|
|
||||||
type LucideConfig = {
|
|
||||||
size: number;
|
|
||||||
color: string;
|
|
||||||
strokeWidth: number;
|
|
||||||
absoluteStrokeWidth: boolean;
|
|
||||||
className: string;
|
|
||||||
};
|
|
||||||
|
|
||||||
const LucideContext = createContext<LucideProps>({});
|
|
||||||
|
|
||||||
type LucideProviderProps = {
|
|
||||||
children: ReactNode;
|
|
||||||
} & Partial<LucideConfig>;
|
|
||||||
|
|
||||||
export function LucideProvider({
|
|
||||||
children,
|
|
||||||
size,
|
|
||||||
color,
|
|
||||||
strokeWidth,
|
|
||||||
absoluteStrokeWidth,
|
|
||||||
className,
|
|
||||||
}: LucideProviderProps) {
|
|
||||||
const value = useMemo(
|
|
||||||
() => ({
|
|
||||||
size,
|
|
||||||
color,
|
|
||||||
strokeWidth,
|
|
||||||
absoluteStrokeWidth,
|
|
||||||
className,
|
|
||||||
}),
|
|
||||||
[size, color, strokeWidth, absoluteStrokeWidth, className],
|
|
||||||
);
|
|
||||||
|
|
||||||
return <LucideContext.Provider value={value}>{children}</LucideContext.Provider>;
|
|
||||||
}
|
|
||||||
|
|
||||||
export const useLucideContext = () => useContext(LucideContext);
|
|
||||||
@@ -2,7 +2,6 @@ export * from './icons';
|
|||||||
export * as icons from './icons';
|
export * as icons from './icons';
|
||||||
export * from './aliases';
|
export * from './aliases';
|
||||||
export * from './types';
|
export * from './types';
|
||||||
export * from './context';
|
|
||||||
|
|
||||||
export { default as createLucideIcon } from './createLucideIcon';
|
export { default as createLucideIcon } from './createLucideIcon';
|
||||||
export { default as Icon } from './Icon';
|
export { default as Icon } from './Icon';
|
||||||
|
|||||||
@@ -1,24 +0,0 @@
|
|||||||
// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
|
|
||||||
|
|
||||||
exports[`Using LucideProvider > should render the icon with LucideProvider 1`] = `
|
|
||||||
<svg
|
|
||||||
aria-hidden="true"
|
|
||||||
class="lucide lucide-house"
|
|
||||||
fill="none"
|
|
||||||
height="48"
|
|
||||||
stroke="red"
|
|
||||||
stroke-linecap="round"
|
|
||||||
stroke-linejoin="round"
|
|
||||||
stroke-width="2"
|
|
||||||
viewBox="0 0 24 24"
|
|
||||||
width="48"
|
|
||||||
xmlns="http://www.w3.org/2000/svg"
|
|
||||||
>
|
|
||||||
<path
|
|
||||||
d="M15 21v-8a1 1 0 0 0-1-1h-4a1 1 0 0 0-1 1v8"
|
|
||||||
/>
|
|
||||||
<path
|
|
||||||
d="M3 10a2 2 0 0 1 .709-1.528l7-6a2 2 0 0 1 2.582 0l7 6A2 2 0 0 1 21 10v9a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z"
|
|
||||||
/>
|
|
||||||
</svg>
|
|
||||||
`;
|
|
||||||
@@ -1,99 +0,0 @@
|
|||||||
import { render } from '@testing-library/react';
|
|
||||||
import { describe, expect, it } from 'vitest';
|
|
||||||
import { House, LucideProvider } from '../src/lucide-react';
|
|
||||||
|
|
||||||
describe('Using LucideProvider', () => {
|
|
||||||
it('should render the icon with LucideProvider', () => {
|
|
||||||
const { container } = render(
|
|
||||||
<LucideProvider
|
|
||||||
size={48}
|
|
||||||
color="red"
|
|
||||||
>
|
|
||||||
<House />
|
|
||||||
</LucideProvider>,
|
|
||||||
);
|
|
||||||
|
|
||||||
expect(container.firstChild).toMatchSnapshot();
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should render the icon with default props when no provider is used', () => {
|
|
||||||
const { container } = render(<House />);
|
|
||||||
|
|
||||||
const IconComponent = container.firstElementChild;
|
|
||||||
|
|
||||||
expect(IconComponent).toHaveAttribute('width', '24');
|
|
||||||
expect(IconComponent).toHaveAttribute('height', '24');
|
|
||||||
expect(IconComponent).toHaveAttribute('stroke', 'currentColor');
|
|
||||||
expect(IconComponent).toHaveAttribute('stroke-width', '2');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should render the icon with LucideProvider and custom strokeWidth', () => {
|
|
||||||
const { container } = render(
|
|
||||||
<LucideProvider
|
|
||||||
size={48}
|
|
||||||
color="red"
|
|
||||||
strokeWidth={4}
|
|
||||||
>
|
|
||||||
<House />
|
|
||||||
</LucideProvider>,
|
|
||||||
);
|
|
||||||
|
|
||||||
const IconComponent = container.firstElementChild;
|
|
||||||
|
|
||||||
expect(IconComponent).toHaveAttribute('width', '48');
|
|
||||||
expect(IconComponent).toHaveAttribute('height', '48');
|
|
||||||
expect(IconComponent).toHaveAttribute('stroke', 'red');
|
|
||||||
expect(IconComponent).toHaveAttribute('stroke-width', '4');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should render the icon with LucideProvider and custom absoluteStrokeWidth', () => {
|
|
||||||
const { container } = render(
|
|
||||||
<LucideProvider
|
|
||||||
size={48}
|
|
||||||
color="red"
|
|
||||||
absoluteStrokeWidth
|
|
||||||
>
|
|
||||||
<House />
|
|
||||||
</LucideProvider>,
|
|
||||||
);
|
|
||||||
|
|
||||||
const IconComponent = container.firstElementChild;
|
|
||||||
|
|
||||||
expect(IconComponent).toHaveAttribute('stroke-width', '1');
|
|
||||||
});
|
|
||||||
|
|
||||||
it("should override the provider's global props when passing props to the icon", () => {
|
|
||||||
const { container } = render(
|
|
||||||
<LucideProvider
|
|
||||||
size={48}
|
|
||||||
color="red"
|
|
||||||
strokeWidth={4}
|
|
||||||
>
|
|
||||||
<House
|
|
||||||
size={24}
|
|
||||||
color="blue"
|
|
||||||
strokeWidth={2}
|
|
||||||
/>
|
|
||||||
</LucideProvider>,
|
|
||||||
);
|
|
||||||
|
|
||||||
const IconComponent = container.firstElementChild;
|
|
||||||
|
|
||||||
expect(IconComponent).toHaveAttribute('width', '24');
|
|
||||||
expect(IconComponent).toHaveAttribute('height', '24');
|
|
||||||
expect(IconComponent).toHaveAttribute('stroke', 'blue');
|
|
||||||
expect(IconComponent).toHaveAttribute('stroke-width', '2');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should merge className from provider and icon', () => {
|
|
||||||
const { container } = render(
|
|
||||||
<LucideProvider className="provider-class">
|
|
||||||
<House className="icon-class" />
|
|
||||||
</LucideProvider>,
|
|
||||||
);
|
|
||||||
|
|
||||||
const IconComponent = container.firstElementChild;
|
|
||||||
|
|
||||||
expect(IconComponent).toHaveAttribute('class', 'lucide provider-class lucide-house icon-class');
|
|
||||||
});
|
|
||||||
});
|
|
||||||
@@ -62,10 +62,7 @@
|
|||||||
"build:version": "node ./scripts/replaceVersion.mjs",
|
"build:version": "node ./scripts/replaceVersion.mjs",
|
||||||
"build:bundle": "rollup -c rollup.config.mjs",
|
"build:bundle": "rollup -c rollup.config.mjs",
|
||||||
"build:icons": "build-icons --output=./src --templateSrc=./scripts/exportTemplate.mts --renderUniqueKey --withAliases --separateAliasesFile --separateAliasesFileIgnore=fingerprint --aliasesFileExtension=.ts --iconFileExtension=.tsx --exportFileName=index.ts",
|
"build:icons": "build-icons --output=./src --templateSrc=./scripts/exportTemplate.mts --renderUniqueKey --withAliases --separateAliasesFile --separateAliasesFileIgnore=fingerprint --aliasesFileExtension=.ts --iconFileExtension=.tsx --exportFileName=index.ts",
|
||||||
"typecheck": "tsc",
|
|
||||||
"typecheck:watch": "tsc -w",
|
|
||||||
"test": "pnpm build:icons && vitest run",
|
"test": "pnpm build:icons && vitest run",
|
||||||
"test:watch": "vitest watch",
|
|
||||||
"version": "pnpm version --git-tag-version=false"
|
"version": "pnpm version --git-tag-version=false"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
@@ -77,7 +74,7 @@
|
|||||||
"@lucide/shared": "workspace:*",
|
"@lucide/shared": "workspace:*",
|
||||||
"@rollup/plugin-babel": "^6.0.4",
|
"@rollup/plugin-babel": "^6.0.4",
|
||||||
"@solidjs/testing-library": "^0.8.10",
|
"@solidjs/testing-library": "^0.8.10",
|
||||||
"@testing-library/jest-dom": "^6.6.3",
|
"@testing-library/jest-dom": "^6.4.2",
|
||||||
"babel-preset-solid": "^1.8.12",
|
"babel-preset-solid": "^1.8.12",
|
||||||
"jest-serializer-html": "^7.1.0",
|
"jest-serializer-html": "^7.1.0",
|
||||||
"rollup": "^4.53.3",
|
"rollup": "^4.53.3",
|
||||||
|
|||||||
@@ -1,9 +1,8 @@
|
|||||||
import { For, splitProps, useContext } from 'solid-js';
|
import { For, splitProps } from 'solid-js';
|
||||||
import { Dynamic } from 'solid-js/web';
|
import { Dynamic } from 'solid-js/web';
|
||||||
import defaultAttributes from './defaultAttributes';
|
import defaultAttributes from './defaultAttributes';
|
||||||
import { IconNode, LucideProps } from './types';
|
import { IconNode, LucideProps } from './types';
|
||||||
import { mergeClasses, toKebabCase, toPascalCase } from '@lucide/shared';
|
import { mergeClasses, toKebabCase, toPascalCase } from '@lucide/shared';
|
||||||
import { LucideContext } from './context';
|
|
||||||
|
|
||||||
interface IconProps {
|
interface IconProps {
|
||||||
name?: string;
|
name?: string;
|
||||||
@@ -22,40 +21,28 @@ const Icon = (props: LucideProps & IconProps) => {
|
|||||||
'absoluteStrokeWidth',
|
'absoluteStrokeWidth',
|
||||||
]);
|
]);
|
||||||
|
|
||||||
const globalProps = useContext(LucideContext);
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<svg
|
<svg
|
||||||
{...defaultAttributes}
|
{...defaultAttributes}
|
||||||
width={localProps.size ?? globalProps.size ?? defaultAttributes.width}
|
width={localProps.size ?? defaultAttributes.width}
|
||||||
height={localProps.size ?? globalProps.size ?? defaultAttributes.height}
|
height={localProps.size ?? defaultAttributes.height}
|
||||||
stroke={localProps.color ?? globalProps.color ?? defaultAttributes.stroke}
|
stroke={localProps.color ?? defaultAttributes.stroke}
|
||||||
stroke-width={
|
stroke-width={
|
||||||
(localProps.absoluteStrokeWidth ?? globalProps.absoluteStrokeWidth) === true
|
localProps.absoluteStrokeWidth
|
||||||
? (Number(
|
? (Number(localProps.strokeWidth ?? defaultAttributes['stroke-width']) * 24) /
|
||||||
localProps.strokeWidth ??
|
Number(localProps.size)
|
||||||
globalProps.strokeWidth ??
|
: Number(localProps.strokeWidth ?? defaultAttributes['stroke-width'])
|
||||||
defaultAttributes['stroke-width'],
|
|
||||||
) *
|
|
||||||
24) /
|
|
||||||
Number(localProps.size ?? globalProps.size)
|
|
||||||
: Number(
|
|
||||||
localProps.strokeWidth ??
|
|
||||||
globalProps.strokeWidth ??
|
|
||||||
defaultAttributes['stroke-width'],
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
class={mergeClasses(
|
class={mergeClasses(
|
||||||
'lucide',
|
'lucide',
|
||||||
'lucide-icon',
|
'lucide-icon',
|
||||||
globalProps.class,
|
|
||||||
...(localProps.name != null
|
...(localProps.name != null
|
||||||
? [
|
? [
|
||||||
`lucide-${toKebabCase(toPascalCase(localProps.name))}`,
|
`lucide-${toKebabCase(toPascalCase(localProps.name))}`,
|
||||||
`lucide-${toKebabCase(localProps.name)}`,
|
`lucide-${toKebabCase(localProps.name)}`,
|
||||||
]
|
]
|
||||||
: []),
|
: []),
|
||||||
localProps.class,
|
localProps.class != null ? localProps.class : '',
|
||||||
)}
|
)}
|
||||||
{...rest}
|
{...rest}
|
||||||
>
|
>
|
||||||
|
|||||||
@@ -1,36 +0,0 @@
|
|||||||
import { createContext, splitProps, type JSXElement } from 'solid-js';
|
|
||||||
|
|
||||||
export const LucideContext = createContext<{
|
|
||||||
size?: number;
|
|
||||||
color?: string;
|
|
||||||
strokeWidth?: number;
|
|
||||||
absoluteStrokeWidth?: boolean;
|
|
||||||
class?: string;
|
|
||||||
}>({
|
|
||||||
size: 24,
|
|
||||||
color: 'currentColor',
|
|
||||||
strokeWidth: 2,
|
|
||||||
absoluteStrokeWidth: false,
|
|
||||||
class: '',
|
|
||||||
});
|
|
||||||
|
|
||||||
interface LucideProviderProps {
|
|
||||||
children: JSXElement;
|
|
||||||
size?: number;
|
|
||||||
color?: string;
|
|
||||||
strokeWidth?: number;
|
|
||||||
absoluteStrokeWidth?: boolean;
|
|
||||||
class?: string;
|
|
||||||
}
|
|
||||||
|
|
||||||
export function LucideProvider(props: LucideProviderProps) {
|
|
||||||
const [value, rest] = splitProps(props, [
|
|
||||||
'size',
|
|
||||||
'color',
|
|
||||||
'strokeWidth',
|
|
||||||
'absoluteStrokeWidth',
|
|
||||||
'class',
|
|
||||||
]);
|
|
||||||
|
|
||||||
return <LucideContext.Provider value={value}>{rest.children}</LucideContext.Provider>;
|
|
||||||
}
|
|
||||||
@@ -2,6 +2,5 @@ export * from './icons';
|
|||||||
export * as icons from './icons';
|
export * as icons from './icons';
|
||||||
export * from './aliases';
|
export * from './aliases';
|
||||||
export * from './types';
|
export * from './types';
|
||||||
export * from './context';
|
|
||||||
|
|
||||||
export { default as Icon } from './Icon';
|
export { default as Icon } from './Icon';
|
||||||
|
|||||||
@@ -1,25 +0,0 @@
|
|||||||
// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
|
|
||||||
|
|
||||||
exports[`Using LucideProvider > should render the icon with LucideProvider 1`] = `
|
|
||||||
<svg
|
|
||||||
class="lucide lucide-icon lucide-house"
|
|
||||||
fill="none"
|
|
||||||
height="48"
|
|
||||||
stroke="red"
|
|
||||||
stroke-linecap="round"
|
|
||||||
stroke-linejoin="round"
|
|
||||||
stroke-width="2"
|
|
||||||
viewBox="0 0 24 24"
|
|
||||||
width="48"
|
|
||||||
xmlns="http://www.w3.org/2000/svg"
|
|
||||||
>
|
|
||||||
<path
|
|
||||||
d="M15 21v-8a1 1 0 0 0-1-1h-4a1 1 0 0 0-1 1v8"
|
|
||||||
key="5wwlr5"
|
|
||||||
/>
|
|
||||||
<path
|
|
||||||
d="M3 10a2 2 0 0 1 .709-1.528l7-6a2 2 0 0 1 2.582 0l7 6A2 2 0 0 1 21 10v9a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z"
|
|
||||||
key="r6nss1"
|
|
||||||
/>
|
|
||||||
</svg>
|
|
||||||
`;
|
|
||||||
@@ -1,102 +0,0 @@
|
|||||||
import { render } from '@solidjs/testing-library';
|
|
||||||
import { describe, expect, it } from 'vitest';
|
|
||||||
import { House, LucideProvider } from '../src/lucide-solid';
|
|
||||||
|
|
||||||
describe('Using LucideProvider', () => {
|
|
||||||
it('should render the icon with LucideProvider', () => {
|
|
||||||
const { container } = render(() => (
|
|
||||||
<LucideProvider
|
|
||||||
size={48}
|
|
||||||
color="red"
|
|
||||||
>
|
|
||||||
<House />
|
|
||||||
</LucideProvider>
|
|
||||||
));
|
|
||||||
|
|
||||||
expect(container.firstChild).toMatchSnapshot();
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should render the icon with default props when no provider is used', () => {
|
|
||||||
const { container } = render(() => <House />);
|
|
||||||
|
|
||||||
const IconComponent = container.firstElementChild;
|
|
||||||
|
|
||||||
expect(IconComponent).toHaveAttribute('width', '24');
|
|
||||||
expect(IconComponent).toHaveAttribute('height', '24');
|
|
||||||
expect(IconComponent).toHaveAttribute('stroke', 'currentColor');
|
|
||||||
expect(IconComponent).toHaveAttribute('stroke-width', '2');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should render the icon with LucideProvider and custom strokeWidth', () => {
|
|
||||||
const { container } = render(() => (
|
|
||||||
<LucideProvider
|
|
||||||
size={48}
|
|
||||||
color="red"
|
|
||||||
strokeWidth={4}
|
|
||||||
>
|
|
||||||
<House />
|
|
||||||
</LucideProvider>
|
|
||||||
));
|
|
||||||
|
|
||||||
const IconComponent = container.firstElementChild;
|
|
||||||
|
|
||||||
expect(IconComponent).toHaveAttribute('width', '48');
|
|
||||||
expect(IconComponent).toHaveAttribute('height', '48');
|
|
||||||
expect(IconComponent).toHaveAttribute('stroke', 'red');
|
|
||||||
expect(IconComponent).toHaveAttribute('stroke-width', '4');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should render the icon with LucideProvider and custom absoluteStrokeWidth', () => {
|
|
||||||
const { container } = render(() => (
|
|
||||||
<LucideProvider
|
|
||||||
size={48}
|
|
||||||
color="red"
|
|
||||||
absoluteStrokeWidth
|
|
||||||
>
|
|
||||||
<House />
|
|
||||||
</LucideProvider>
|
|
||||||
));
|
|
||||||
|
|
||||||
const IconComponent = container.firstElementChild;
|
|
||||||
|
|
||||||
expect(IconComponent).toHaveAttribute('stroke-width', '1');
|
|
||||||
});
|
|
||||||
|
|
||||||
it("should override the provider's global props when passing props to the icon", () => {
|
|
||||||
const { container } = render(() => (
|
|
||||||
<LucideProvider
|
|
||||||
size={48}
|
|
||||||
color="red"
|
|
||||||
strokeWidth={4}
|
|
||||||
>
|
|
||||||
<House
|
|
||||||
size={24}
|
|
||||||
color="blue"
|
|
||||||
strokeWidth={2}
|
|
||||||
/>
|
|
||||||
</LucideProvider>
|
|
||||||
));
|
|
||||||
|
|
||||||
const IconComponent = container.firstElementChild;
|
|
||||||
|
|
||||||
expect(IconComponent).toHaveAttribute('width', '24');
|
|
||||||
expect(IconComponent).toHaveAttribute('height', '24');
|
|
||||||
expect(IconComponent).toHaveAttribute('stroke', 'blue');
|
|
||||||
expect(IconComponent).toHaveAttribute('stroke-width', '2');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should merge className from provider and icon', () => {
|
|
||||||
const { container } = render(() => (
|
|
||||||
<LucideProvider class="provider-class">
|
|
||||||
<House class="icon-class" />
|
|
||||||
</LucideProvider>
|
|
||||||
));
|
|
||||||
|
|
||||||
const IconComponent = container.firstElementChild;
|
|
||||||
|
|
||||||
expect(IconComponent).toHaveAttribute(
|
|
||||||
'class',
|
|
||||||
'lucide lucide-icon provider-class lucide-house icon-class',
|
|
||||||
);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
@@ -61,7 +61,7 @@
|
|||||||
"@lucide/helpers": "workspace:*",
|
"@lucide/helpers": "workspace:*",
|
||||||
"@sveltejs/package": "^2.2.3",
|
"@sveltejs/package": "^2.2.3",
|
||||||
"@sveltejs/vite-plugin-svelte": "^2.4.2",
|
"@sveltejs/vite-plugin-svelte": "^2.4.2",
|
||||||
"@testing-library/jest-dom": "^6.6.3",
|
"@testing-library/jest-dom": "^6.1.4",
|
||||||
"@testing-library/svelte": "^4.0.2",
|
"@testing-library/svelte": "^4.0.2",
|
||||||
"@tsconfig/svelte": "^5.0.0",
|
"@tsconfig/svelte": "^5.0.0",
|
||||||
"jest-serializer-html": "^7.1.0",
|
"jest-serializer-html": "^7.1.0",
|
||||||
|
|||||||
@@ -25,7 +25,9 @@
|
|||||||
"amdName": "lucide-vue-next",
|
"amdName": "lucide-vue-next",
|
||||||
"source": "build/lucide-vue-next.js",
|
"source": "build/lucide-vue-next.js",
|
||||||
"main": "dist/cjs/lucide-vue-next.js",
|
"main": "dist/cjs/lucide-vue-next.js",
|
||||||
|
"main:umd": "dist/umd/lucide-vue-next.js",
|
||||||
"module": "dist/esm/lucide-vue-next.js",
|
"module": "dist/esm/lucide-vue-next.js",
|
||||||
|
"unpkg": "dist/umd/lucide-vue-next.min.js",
|
||||||
"typings": "dist/lucide-vue-next.d.ts",
|
"typings": "dist/lucide-vue-next.d.ts",
|
||||||
"sideEffects": false,
|
"sideEffects": false,
|
||||||
"files": [
|
"files": [
|
||||||
@@ -46,7 +48,7 @@
|
|||||||
"@lucide/build-icons": "workspace:*",
|
"@lucide/build-icons": "workspace:*",
|
||||||
"@lucide/rollup-plugins": "workspace:*",
|
"@lucide/rollup-plugins": "workspace:*",
|
||||||
"@lucide/shared": "workspace:*",
|
"@lucide/shared": "workspace:*",
|
||||||
"@testing-library/jest-dom": "^6.6.3",
|
"@testing-library/jest-dom": "^6.1.6",
|
||||||
"@testing-library/vue": "^8.1.0",
|
"@testing-library/vue": "^8.1.0",
|
||||||
"@vitejs/plugin-vue": "^6.0.2",
|
"@vitejs/plugin-vue": "^6.0.2",
|
||||||
"@vue/test-utils": "2.4.6",
|
"@vue/test-utils": "2.4.6",
|
||||||
|
|||||||