Compare commits

..
Author SHA1 Message Date
Eric Fennis c99099ea1c Adding use-cases from prs 2026-06-13 10:40:41 +02:00
710 changed files with 3957 additions and 5794 deletions
@@ -1,4 +1,4 @@
name: Pull request metadata suggestions
name: Pull request tags suggestions
on:
pull_request_target:
@@ -6,8 +6,8 @@ on:
- 'icons/*.json'
jobs:
pull-request-metadata-suggestions:
name: Pull Request Metadata Suggestions
pull-request-tags-suggestions:
name: Pull Request Tags Suggestions
runs-on: ubuntu-latest
permissions:
contents: read
@@ -29,7 +29,7 @@ jobs:
run: pnpm install --frozen-lockfile
- name: Generate comment markup
run: node ./scripts/suggestMetaData.mts
run: node ./scripts/suggestTags.mts
env:
OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
PULL_REQUEST_NUMBER: ${{ github.event.number }}
+5 -2
View File
@@ -20,6 +20,9 @@ permissions:
id-token: write # Required for OIDC
contents: write
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
jobs:
prepare:
if: github.repository == 'lucide-icons/lucide' && contains('["ericfennis", "karsa-mistmere", "jguddas"]', github.actor)
@@ -71,7 +74,7 @@ jobs:
run: pnpm install --frozen-lockfile
- name: Set new version
run: pnpm version ${{ needs.prepare.outputs.VERSION }} --filter ${{ matrix.package }} --fail-if-no-match --no-git-tag-version
run: pnpm --fail-if-no-match --filter ${{ matrix.package }} version --new-version ${{ needs.prepare.outputs.VERSION }} --no-git-tag-version
- name: Build
run: pnpm --filter ${{ matrix.package }} build
@@ -105,7 +108,7 @@ jobs:
run: pnpm install --frozen-lockfile
- name: Set new version
run: pnpm version ${{ needs.prepare.outputs.VERSION }} --filter lucide-static --no-git-tag-version
run: pnpm --filter lucide-static version --new-version ${{ needs.prepare.outputs.VERSION }} --no-git-tag-version
- name: Move Font
run: cp -r lucide-font packages/lucide-static/font
-42
View File
@@ -1,42 +0,0 @@
name: Weekly Repo Report
on:
workflow_dispatch:
# Run this workflow every Monday at 07:00 UTC
schedule:
- cron: '0 7 * * 1'
permissions:
contents: read
jobs:
weekly-summary:
runs-on: ubuntu-latest
steps:
- name: Set up Node.js environment
uses: actions/setup-node@v4
with:
node-version: 24
- name: Install Copilot CLI
run: npm install -g @github/copilot
- name: Run the prompt
env:
COPILOT_GITHUB_TOKEN: ${{ secrets.COPILOT_GITHUB_TOKEN }}
run: |
copilot -p "${{ vars.REPO_REPORT_PROMPT }} Write the details to summary.md" --allow-tool='shell(git:*)' --allow-tool=write --no-ask-user
cat summary.md >> "$GITHUB_STEP_SUMMARY"
- name: Post report to Discord (private channel)
env:
DISCORD_WEBHOOK_URL: ${{ secrets.LUCIDE_DISCORD_WEBHOOK }}
run: |
jq -Rs '{
embeds: [{
title: "📊 Weekly Repo Report",
description: (.[0:4096]),
color: 5814783
}]
}' summary.md > payload.json
curl -sS --fail -X POST \
-H "Content-Type: application/json" \
-d @payload.json \
"$DISCORD_WEBHOOK_URL"
-1
View File
@@ -53,7 +53,6 @@ docs/.vitepress/data/categoriesData.json
docs/.vitepress/data/iconDetails
docs/.vitepress/data/relatedIcons.json
docs/.vitepress/data/brandStopwords.json
docs/.vitepress/data/iconPopularity
docs/.vercel
docs/.nitro
docs/public/og/**
+1 -1
View File
@@ -35,7 +35,7 @@ Lucide is an open-source icon library that provides 1600+ vector (svg) files for
| <img src="https://lucide.dev/framework-logos/js.svg" alt="JS logo" width="48"> | **`lucide`** | [![npm](https://img.shields.io/npm/v/lucide)](https://www.npmjs.com/package/lucide) | ![NPM Downloads](https://img.shields.io/npm/dw/lucide) | [Docs](https://lucide.dev/guide/lucide) · [Source](./packages/lucide) |
| <img src="https://lucide.dev/framework-logos/react.svg" alt="React logo" width="48"> | **`lucide-react`** | [![npm](https://img.shields.io/npm/v/lucide-react)](https://www.npmjs.com/package/lucide-react) | ![NPM Downloads](https://img.shields.io/npm/dw/lucide-react) | [Docs](https://lucide.dev/guide/react) · [Source](./packages/lucide-react) |
| <img src="https://lucide.dev/framework-logos/vue.svg" alt="Vue logo" width="48"> | **`@lucide/vue`** | [![npm](https://img.shields.io/npm/v/@lucide/vue)](https://www.npmjs.com/package/@lucide/vue) | ![NPM Downloads](https://img.shields.io/npm/dw/@lucide/vue) | [Docs](https://lucide.dev/guide/vue) · [Source](./packages/vue) |
| <img src="https://lucide.dev/framework-logos/svelte.svg" alt="Svelte logo" width="48"> | **`@lucide/svelte`** | [![npm](https://img.shields.io/npm/v/@lucide/svelte)](https://www.npmjs.com/package/@lucide/svelte) | ![NPM Downloads](https://img.shields.io/npm/dw/@lucide/svelte) | [Docs](https://lucide.dev/guide/svelte) · [Source](./packages/svelte) |
| <img src="https://lucide.dev/framework-logos/svelte.svg" alt="Svelte logo" width="48"> | **`@lucide/svelte`** | [![npm](https://img.shields.io/npm/v/@lucide/svelte)](https://www.npmjs.com/package/@lucide/svelte) | ![NPM Downloads](https://img.shields.io/npm/dw/@lucide/svelte) | [Docs](https://lucide.dev/guide/svelte) · [Source](./packages/@lucide/svelte) |
| <img src="https://lucide.dev/framework-logos/solid.svg" alt="Solid logo" width="48"> | **`lucide-solid`** | [![npm](https://img.shields.io/npm/v/lucide-solid)](https://www.npmjs.com/package/lucide-solid) | ![NPM Downloads](https://img.shields.io/npm/dw/lucide-solid) | [Docs](https://lucide.dev/guide/solid) · [Source](./packages/lucide-solid) |
| <img src="https://lucide.dev/framework-logos/preact.svg" alt="Preact logo" width="48"> | **`lucide-preact`** | [![npm](https://img.shields.io/npm/v/lucide-preact)](https://www.npmjs.com/package/lucide-preact) | ![NPM Downloads](https://img.shields.io/npm/dw/lucide-preact) | [Docs](https://lucide.dev/guide/preact) · [Source](./packages/lucide-preact) |
| <img src="https://lucide.dev/framework-logos/react-native.svg" alt="React Native logo" width="48"> | **`lucide-react-native`** | [![npm](https://img.shields.io/npm/v/lucide-react-native)](https://www.npmjs.com/package/lucide-react-native) | ![NPM Downloads](https://img.shields.io/npm/dw/lucide-react-native) | [Docs](https://lucide.dev/guide/react-native) · [Source](./packages/lucide-react-native) |
+1 -1
View File
@@ -1,5 +1,5 @@
{
"$schema": "../category.schema.json",
"title": "Navigation & Places",
"title": "Navigation, Maps, and POIs",
"icon": "compass"
}
+1 -2
View File
@@ -101,7 +101,6 @@ export default defineConfig({
},
{ text: 'Packages', link: '/packages' },
{ text: 'Showcase', link: '/showcase' },
{ text: 'Merch', link: 'https://merch.lucide.dev/' },
],
sidebar,
socialLinks: [
@@ -110,7 +109,7 @@ export default defineConfig({
],
footer: {
message: 'Released under the ISC License.',
copyright: `Copyright © ${new Date().getFullYear()} Lucide Icons`,
copyright: `Copyright © ${new Date().getFullYear()} Lucide Contributors`,
},
editLink: {
pattern: 'https://github.com/lucide-icons/lucide/edit/main/docs/:path',
+1 -1
View File
@@ -97,7 +97,7 @@
},
{
"name": "navigation",
"title": "Navigation & Places"
"title": "Navigation, Maps, and POIs"
},
{
"name": "notifications",
@@ -209,24 +209,5 @@
],
"source": "https://github.com/shx08/strapi-lucide-icons",
"documentation": "https://github.com/shx08/strapi-lucide-icons/blob/main/README.md"
},
{
"name": "lucide-lit",
"description": "Implementation of Lucide icons as Lit web components.",
"icon": "/framework-logos/lit.svg",
"shields": [
{
"alt": "Latest Stable Version",
"src": "https://img.shields.io/npm/v/@gyeonghokim/lucide-lit",
"href": "https://www.npmjs.com/package/@gyeonghokim/lucide-lit"
},
{
"alt": "Total Downloads",
"src": "https://img.shields.io/npm/dw/@gyeonghokim/lucide-lit",
"href": "https://www.npmjs.com/package/@gyeonghokim/lucide-lit"
}
],
"source": "https://github.com/GyeongHoKim/lucide-lit",
"documentation": "https://github.com/GyeongHoKim/lucide-lit/blob/main/README.md"
}
]
+7
View File
@@ -24,6 +24,13 @@ const getHeadConfig = ({
defer: '',
},
],
[
'script',
{
src: 'https://media.bitterbrains.com/main.js?from=LUCIDE&type=top',
async: 'true',
},
],
[
'meta',
{
-5
View File
@@ -72,11 +72,6 @@ export const reactNativeSidebar = [
link: '/guide/react-native/advanced/combining-icons',
desc: 'Combine multiple icons into one',
},
{
text: 'Optimizations',
link: '/guide/react-native/advanced/optimizations',
desc: 'Optimizing your app for performance',
},
],
},
{
@@ -11,14 +11,6 @@ const { isDark } = useData();
const emit = defineEmits(['update:modelValue']);
function limitHexInput(val: string) {
if (val.startsWith('#')) {
return val.slice(0, 9);
}
return val.slice(0, 8);
}
const value = computed({
get: () => {
if (props.modelValue == null || props.modelValue === 'currentColor') {
@@ -27,7 +19,7 @@ const value = computed({
return props.modelValue;
},
set: (val) => emit('update:modelValue', limitHexInput(val)),
set: (val) => emit('update:modelValue', val),
});
</script>
@@ -49,7 +41,6 @@ const value = computed({
class="color-input-text"
aria-label="Color picker input"
v-model="value"
maxlength="9"
placeholder="[default]"
/>
</div>
@@ -100,7 +91,6 @@ const value = computed({
background: transparent;
color: var(--vp-c-text-1);
font-size: 13px;
font-family: var(--vp-font-family-mono);
text-align: left;
border-radius: 8px;
cursor: text;
@@ -6,10 +6,10 @@ import SelectIcon from './SelectIcon.vue';
defineProps<{
id?: string;
items?: { name: string; value: string; icon?: string; iconDark?: string }[];
items?: { name: string; route: string; icon: string; iconDark?: string }[];
}>();
const selected = defineModel<{ name: string; value: string; icon?: string; iconDark?: string }>();
const selected = defineModel<{ name: string; icon: string; iconDark?: string }>();
</script>
<template>
@@ -19,18 +19,14 @@ const selected = defineModel<{ name: string; value: string; icon?: string; iconD
class="select-button"
:id="id"
>
<slot name="start-icon">
<SelectIcon v-if="selected.icon" :item="selected" />
</slot>
<SelectIcon :item="selected" />
<span class="select-text">{{ selected.name }}</span>
<span class="select-icon">
<slot name="end-icon">
<Icon
:iconNode="chevronsUpDown"
class="chevron-icon"
aria-hidden="true"
/>
</slot>
<Icon
:iconNode="chevronsUpDown"
class="chevron-icon"
aria-hidden="true"
/>
</span>
</ListboxButton>
@@ -47,9 +43,8 @@ const selected = defineModel<{ name: string; value: string; icon?: string; iconD
:value="item"
as="template"
>
<li :class="['select-option', { active, selected }]">
<SelectIcon v-if="item.icon" :item="item" />
<SelectIcon :item="item" />
<span :class="['option-text', { selected }]">{{ item.name }}</span>
<span
v-if="selected"
@@ -2,28 +2,25 @@
const { item } = defineProps<{
item: {
name: string;
icon?: string;
icon: string;
iconDark?: string;
};
}>();
</script>
<template>
<div v-if="item.icon || item.iconDark">
<img
v-if="item.icon"
:src="item.icon"
:class="{ 'select-item-icon': true, light: item.iconDark }"
:alt="`${item.name} logo`"
loading="lazy"
/>
<img
v-if="item.iconDark"
:src="item.iconDark"
:alt="`${item.name} logo`"
class="select-item-icon dark"
/>
</div>
<img
:src="item.icon"
:class="{ 'select-item-icon': true, light: item.iconDark }"
:alt="`${item.name} logo`"
loading="lazy"
/>
<img
v-if="item.iconDark"
:src="item.iconDark"
:alt="`${item.name} logo`"
class="select-item-icon dark"
/>
</template>
<style scoped>
@@ -0,0 +1,90 @@
<script setup lang="ts">
import { useRouter } from 'vitepress';
import { computed } from 'vue';
const router = useRouter();
const frameworks = [
{
ariaLabel: 'Get JavaScript certificates from certificates.dev',
image: '/certificates-dev/js-certificates-dev.jpg',
href: 'https://certificates.dev/javascript?friend=LUCIDE',
routes: [
'/guide/lucide/',
'/guide/svelte/',
'/guide/solid/',
'/guide/astro/',
'/guide/static/'
],
},
{
ariaLabel: 'Get React certificates from certificates.dev',
image: '/certificates-dev/react-certificates-dev.jpg',
href: 'https://certificates.dev/react?friend=LUCIDE',
routes: [
'/guide/react/',
'/guide/react-native/',
'/guide/preact/',
],
},
{
ariaLabel: 'Get Vue certificates from certificates.dev',
href: 'https://certificates.dev/vuejs?friend=LUCIDE',
image: '/certificates-dev/vue-certificates-dev.jpg',
routes: [
'/guide/vue/',
],
},
{
ariaLabel: 'Get Angular certificates from certificates.dev',
href: 'https://certificates.dev/angular?friend=LUCIDE',
image: '/certificates-dev/angular-certificates-dev.jpg',
routes: [
'/guide/angular/',
],
}
];
const selected = computed(() => {
const current = frameworks.find(({ routes }) => {
return routes.some(route => router.route.path.startsWith(route));
});
return current || frameworks[0];
});
</script>
<template>
<a class="certificates-link" :href="selected.href" :aria-label="selected.ariaLabel" target="_blank" rel="noopener noreferrer">
<img :src="selected.image" :alt="selected.ariaLabel" />
</a>
</template>
<style scoped>
.certificates-link {
/* padding: 20px; */
border-radius: 12px;
min-height: 100px;
text-align: center;
line-height: 18px;
font-size: 12px;
font-weight: 500;
background-color: var(--vp-carbon-ads-bg-color);
margin-bottom: 20px;
overflow: hidden;
}
.certificates-link img {
width: 100%;
height: 100%;
max-width: 100%;
border-radius: 6px;
transition: transform 0.3s ease, opacity 0.3s ease;
}
.certificates-link:hover img {
transform: scale(1.05);
opacity: 0.9;
}
</style>
@@ -11,49 +11,49 @@ const { page } = useData();
const router = useRouter();
const frameworks = [
{ name: 'Vanilla', icon: '/framework-logos/js.svg', value: '/guide/lucide/' },
{ name: 'React', icon: '/framework-logos/react.svg', value: '/guide/react/' },
{ name: 'Vue', icon: '/framework-logos/vue.svg', value: '/guide/vue/' },
{ name: 'Svelte', icon: '/framework-logos/svelte.svg', value: '/guide/svelte/' },
{ name: 'Solid', icon: '/framework-logos/solid.svg', value: '/guide/solid/' },
{ name: 'Angular', icon: '/framework-logos/angular.svg', value: '/guide/angular/' },
{ name: 'Preact', icon: '/framework-logos/preact.svg', value: '/guide/preact/' },
{ name: 'Vanilla', icon: '/framework-logos/js.svg', route: '/guide/lucide/' },
{ name: 'React', icon: '/framework-logos/react.svg', route: '/guide/react/' },
{ name: 'Vue', icon: '/framework-logos/vue.svg', route: '/guide/vue/' },
{ name: 'Svelte', icon: '/framework-logos/svelte.svg', route: '/guide/svelte/' },
{ name: 'Solid', icon: '/framework-logos/solid.svg', route: '/guide/solid/' },
{ name: 'Angular', icon: '/framework-logos/angular.svg', route: '/guide/angular/' },
{ name: 'Preact', icon: '/framework-logos/preact.svg', route: '/guide/preact/' },
{
name: 'React Native',
icon: '/framework-logos/react-native.svg',
value: '/guide/react-native/',
route: '/guide/react-native/',
},
{
name: 'Astro',
icon: '/framework-logos/astro.svg',
iconDark: '/framework-logos/astro-dark.svg',
value: '/guide/astro/',
route: '/guide/astro/',
},
{ name: 'Static', icon: '/framework-logos/svg.svg', value: '/guide/static/' },
{ name: 'Static', icon: '/framework-logos/svg.svg', route: '/guide/static/' },
];
const fallbackFramework = useLocalStorage('lucide-docs-fallback-framework', frameworks[1]);
const selected = computed(() => {
const current = frameworks.find(({ value }) => {
const current = frameworks.find(({ route }) => {
if (router.route.path?.startsWith?.('/guide')) {
const [, , framework] = router.route.path.split('/');
const [, frameWorkRoute] = value.split('/').filter(Boolean);
const [, frameWorkRoute] = route.split('/').filter(Boolean);
return framework === frameWorkRoute;
}
return router.route.path.split('/').slice(0, 3).join('/') === value;
return router.route.path.split('/').slice(0, 3).join('/') === route;
});
return current || (fallbackFramework.value?.value ? fallbackFramework.value : frameworks[0]);
return current || fallbackFramework.value;
});
function onSelectFramework(item: { name: string; icon: string; iconDark?: string; value: string }) {
function onSelectFramework(item: { name: string; icon: string; iconDark?: string; route: string }) {
fallbackFramework.value = item;
if (item.value !== router.route.path) {
const likeRoute = router.route.path.replace(selected.value.value, item.value);
if (item.route !== router.route.path) {
const likeRoute = router.route.path.replace(selected.value.route, item.route);
const hasRoute = sidebar[item.value]?.some((section) =>
const hasRoute = sidebar[item.route]?.some((section) =>
section?.items?.some(({ link }) => link === likeRoute),
);
@@ -62,7 +62,7 @@ function onSelectFramework(item: { name: string; icon: string; iconDark?: string
return;
}
router.go(item.value);
router.go(item.route);
}
}
</script>
@@ -85,12 +85,12 @@ function onSelectFramework(item: { name: string; icon: string; iconDark?: string
/>
</div>
<VPSidebarGroup
:key="selected.value"
:key="selected.route"
v-if="
page?.relativePath?.startsWith?.('guide') &&
!page?.relativePath?.startsWith?.(selected.value.substring(1))
!page?.relativePath?.startsWith?.(selected.route.substring(1))
"
:items="sidebar[selected.value]"
:items="sidebar[selected.route]"
/>
</template>
@@ -188,7 +188,7 @@ const deprecatedTitle = computed(() => {
-ms-overflow-style: none;
scrollbar-width: none;
scrollbar-width: thin; /* can also be normal, or none, to not render scrollbar */
scrollbar-color: var(--vp-c-text-4) transparent; /* foreground background */
scrollbar-color: currentColor transparent; /* foreground background */
}
.horizontal-scroller::-webkit-scrollbar {
width: 0;
@@ -156,11 +156,11 @@ function handleCloseDrawer() {
if (searchQueryDebounced.value) {
url.searchParams.set('search', searchQueryDebounced.value);
}
if (selectedCategory.value) {
url.hash = selectedCategory.value;
}
window.history.pushState({}, '', url);
}
</script>
@@ -169,7 +169,6 @@ function handleCloseDrawer() {
<div
ref="overviewEl"
class="overview-container"
:class="{ 'icon-drawer-open': activeIconName }"
>
<StickyBar class="category-search">
<InputSearch
@@ -4,7 +4,6 @@ import type { IconEntity } from '../../types';
import { useElementSize, useEventListener, useVirtualList } from '@vueuse/core';
import { useRoute } from 'vitepress';
import IconGrid from './IconGrid.vue';
import Select from '../base/Select.vue';
import InputSearch from '../base/InputSearch.vue';
import useSearch from '../../composables/useSearch';
import useSearchInput from '../../composables/useSearchInput';
@@ -15,26 +14,9 @@ import useFetchCategories from '../../composables/useFetchCategories';
import chunkArray from '../../utils/chunkArray';
import CarbonAdOverlay from './CarbonAdOverlay.vue';
import useSearchPlaceholder from '../../utils/useSearchPlaceholder.ts';
import Icon from '@lucide/vue/src/Icon';
import { listSortDescending } from '~/.vitepress/data/iconNodes';
const ICON_SIZE = 56;
const ICON_GRID_GAP = 8;
const SORTING = [
{
name: 'Popularity',
value: 'popularity',
},
{
name: 'Release date',
value: 'release-date',
},
{
name: 'Name',
value: 'name',
},
]
const initialGridItems = computed(() => {
if (containerWidth.value === 0) return 120;
@@ -50,7 +32,6 @@ const props = defineProps<{
}>();
const activeIconName = ref(null);
const selectedSort = ref(SORTING[0])
const { execute: fetchTags, data: tags } = useFetchTags();
const { execute: fetchCategories, data: categories } = useFetchCategories();
@@ -62,29 +43,12 @@ const columnSize = computed(() => {
return Math.floor(containerWidth.value / (ICON_SIZE + ICON_GRID_GAP));
});
const sortedIcons = computed(() => {
switch (selectedSort.value.value) {
case 'popularity':
return [...props.icons].sort((a, b) => (b.popularity || 0) - (a.popularity || 0));
case 'release-date':
return [...props.icons].sort((a, b) => {
const aDate = a.createdRelease?.date ? new Date(a.createdRelease.date).getTime() : 0;
const bDate = b.createdRelease?.date ? new Date(b.createdRelease.date).getTime() : 0;
return bDate - aDate;
});
case 'name':
return [...props.icons].sort((a, b) => a.name.localeCompare(b.name));
default:
return props.icons;
}
});
const mappedIcons = computed(() => {
if (tags.value == null) {
return sortedIcons.value;
return props.icons;
}
return sortedIcons.value.map((icon) => {
return props.icons.map((icon) => {
const iconTags = tags.value[icon.name];
const iconCategories = categories.value?.[icon.name] ?? [];
@@ -104,11 +68,10 @@ const { shortcutText: kbdSearchShortcut } = useSearchShortcut(() => {
const searchResults = useSearch(searchQueryDebounced, mappedIcons, [
{ name: 'name', weight: 3 },
{ name: 'aliases', weight: 8 },
{ name: 'aliases', weight: 3 },
{ name: 'tags', weight: 2 },
{ name: 'categories', weight: 1 },
]);
const searchPlaceholder = useSearchPlaceholder(searchQuery, searchResults);
const chunkedIcons = computed(() => {
@@ -161,7 +124,7 @@ function handleCloseDrawer() {
if (searchQueryDebounced.value) {
url.searchParams.set('search', searchQueryDebounced.value);
}
window.history.pushState({}, '', url);
}
</script>
@@ -170,7 +133,6 @@ function handleCloseDrawer() {
<div
ref="overviewEl"
class="overview-container"
:class="{ 'icon-drawer-open': activeIconName }"
>
<StickyBar>
<InputSearch
@@ -181,20 +143,6 @@ function handleCloseDrawer() {
class="input-wrapper"
@focus="onFocusSearchInput"
/>
<Select
id="sort-select"
:items="SORTING"
v-model="selectedSort"
>
<template #start-icon>
<Icon
:iconNode="listSortDescending"
class="chevron-icon"
aria-hidden="true"
/>
</template>
</Select>
</StickyBar>
<NoResults
v-if="searchPlaceholder.isNoResults"
@@ -73,11 +73,13 @@ const customizingActive = computed(() => {
id="icon-color"
label="Color"
>
<ColorPicker
v-model="color"
id="icon-color"
class="color-picker"
/>
<template #display>
<ColorPicker
v-model="color"
id="icon-color"
class="color-picker"
/>
</template>
</InputField>
<InputField
@@ -159,6 +161,6 @@ const customizingActive = computed(() => {
}
.color-picker {
width: 100%;
margin-left: auto;
}
</style>
@@ -15,50 +15,6 @@
margin-bottom: 32px;
background: var(--vp-c-bg);
box-shadow: 0 16px 24px var(--vp-c-bg);
gap: 16px;
}
.search-bar :deep(.select-button) {
padding: 11px 14px;
background-color: var(--vp-c-bg-alt);
color: var(--vp-c-text-2);
flex-shrink: 0;
flex: 1;
font-weight: 500;
cursor: pointer;
}
.search-bar :deep(.select-button):hover,
.search-bar :deep(.select-button):focus {
border-color: var(--vp-c-brand);
background: var(--vp-c-bg-alt);
}
.search-bar :deep(.select-options) {
min-width: 160px;
}
.search-bar :deep(.select-option) {
padding-right: 36px;
padding-left: 8px;
}
.search-bar :deep(.select-icon) {
display: none;
}
.search-bar :deep(.select-button) .select-text {
display: none;
}
@media (min-width: 640px) {
.search-bar :deep(.select-button) {
padding: 11px 16px 11px 16px;
}
.search-bar :deep(.select-button) .select-text {
display: block;
}
}
@media (min-width: 960px) {
@@ -20,6 +20,16 @@ const useSearch = <T>(
return index.value.search(query.value).map((result) => result.item);
}
if (keys.length !== 0) {
const mainKey = keys[0].name;
return collection.value.sort((a, b) => {
const aString = a[mainKey as keyof T] as string;
const bString = b[mainKey as keyof T] as string;
return aString.localeCompare(bString);
});
}
return collection.value;
});
+2
View File
@@ -12,6 +12,7 @@ import { CATEGORY_VIEW_CONTEXT, categoryViewContext } from './composables/useCat
import { EXTERNAL_LIBS_CONTEXT, externalLibContext } from './composables/useExternalLibs';
import FrameworkSelect from './components/guide/FrameworkSelect.vue';
import SnackPlayer from './components/editors/SnackPlayer.vue';
import CertificatesLink from './components/guide/CertificatesLink.vue';
const theme: Partial<Theme> = {
extends: DefaultTheme,
@@ -22,6 +23,7 @@ const theme: Partial<Theme> = {
'sidebar-nav-after': () => h(IconsSidebarNavAfter),
'home-hero-image': () => h(HomeHeroIconsCard),
'home-hero-actions-after': () => h(HomeHeroAfter),
'aside-ads-before': () => h(CertificatesLink),
// Keep this here for now, we might want to add more things to the top bar in the future
// 'layout-top': () => h(LayoutTop),
});
+12 -27
View File
@@ -67,10 +67,6 @@
animation: .3s transition 0s ease;
} */
html {
scrollbar-gutter: stable;
}
.VPHome {
overflow-x: hidden;
}
@@ -121,10 +117,6 @@ html {
padding-left: 0;
}
.overview-container.icon-drawer-open {
padding-bottom: 288px;
}
.VPHomeHero .container {
flex-direction: column-reverse;
}
@@ -152,6 +144,14 @@ html {
.VPHomeHero .container {
flex-direction: row;
}
html.has-bb-banner {
--vp-layout-top-height: 72px;
}
html.has-bb-banner {
--Dark-Background: #161618;
}
}
.VPNavBarHamburger .container > span {
@@ -163,23 +163,8 @@ html {
max-width: 480px;
}
.VPSidebar {
/* Hide Scrollbar */
-ms-overflow-style: none;
scrollbar-width: none;
scrollbar-width: thin; /* can also be normal, or none, to not render scrollbar */
scrollbar-color: var(--vp-c-text-4) transparent; /* foreground background */
}
.VPSidebar::-webkit-scrollbar {
width: 0;
display: none;
}
.VPSidebar::-webkit-scrollbar-track {
background: transparent;
}
.VPSidebar::-webkit-scrollbar-thumb {
background: transparent;
border: none;
html:not(.has-bb-banner) #bb-banner {
display: none !important;
visibility: hidden !important;
pointer-events: none !important;
}
-1
View File
@@ -18,7 +18,6 @@ export interface IconEntity extends IconMetaData {
externalLibrary?: ExternalLibs;
createdRelease?: Release;
changedRelease?: Release;
popularity?: number;
}
export interface Category {
+1 -1
View File
@@ -1,4 +1,4 @@
import { type PageData } from 'vitepress';
import { PageData } from 'vitepress';
import getStructuredData from './getStructuredData';
import { createGeneralOGImage, createIconOGImage } from './createOGImage';
+28 -64
View File
@@ -12,23 +12,19 @@ Implementation of the Lucide icon library for web applications.
::: code-group
```sh [pnpm]
pnpm add lucide
pnpm add lucide@next
```
```sh [yarn]
yarn add lucide
yarn add lucide@next
```
```sh [npm]
npm install lucide
npm install lucide@next
```
```sh [bun]
bun add lucide
```
```sh [deno]
deno add lucide
bun add lucide@next
```
:::
@@ -42,23 +38,19 @@ Implementation of the Lucide icon library for React applications.
::: code-group
```sh [pnpm]
pnpm add lucide-react
pnpm add lucide-react@next
```
```sh [yarn]
yarn add lucide-react
yarn add lucide-react@next
```
```sh [npm]
npm install lucide-react
npm install lucide-react@next
```
```sh [bun]
bun add lucide-react
```
```sh [deno]
deno add lucide-react
bun add lucide-react@next
```
:::
@@ -88,10 +80,6 @@ npm install @lucide/vue
bun add @lucide/vue
```
```sh [deno]
deno add @lucide/vue
```
:::
For more details, see the [documentation](./vue/index.md).
@@ -103,23 +91,19 @@ Implementation of the Lucide icon library for Svelte applications.
::: code-group
```sh [pnpm]
pnpm add @lucide/svelte
pnpm add @lucide/svelte@next
```
```sh [yarn]
yarn add @lucide/svelte
yarn add @lucide/svelte@next
```
```sh [npm]
npm install @lucide/svelte
npm install @lucide/svelte@next
```
```sh [bun]
bun add @lucide/svelte
```
```sh [deno]
deno add @lucide/svelte
bun add @lucide/svelte@next
```
:::
> `@lucide/svelte` is only for Svelte 5, for Svelte 4 use the `lucide-svelte` package.
@@ -133,23 +117,19 @@ Implementation of the Lucide icon library for Solid applications.
::: code-group
```sh [pnpm]
pnpm add lucide-solid
pnpm add lucide-solid@next
```
```sh [yarn]
yarn add lucide-solid
yarn add lucide-solid@next
```
```sh [npm]
npm install lucide-solid
npm install lucide-solid@next
```
```sh [bun]
bun add lucide-solid
```
```sh [deno]
deno add lucide-solid
bun add lucide-solid@next
```
:::
@@ -178,10 +158,6 @@ npm install @lucide/angular
bun add @lucide/angular
```
```sh [deno]
deno add @lucide/angular
```
:::
For more details, see the [documentation](./angular/index.md).
@@ -193,23 +169,19 @@ Implementation of the Lucide icon library for preact applications.
::: code-group
```sh [pnpm]
pnpm add lucide-preact
pnpm add lucide-preact@next
```
```sh [yarn]
yarn add lucide-preact
yarn add lucide-preact@next
```
```sh [npm]
npm install lucide-preact
npm install lucide-preact@next
```
```sh [bun]
bun add lucide-preact
```
```sh [deno]
deno add lucide-preact
bun add lucide-preact@next
```
@@ -224,23 +196,19 @@ Implementation of the Lucide icon library for Astro applications.
::: code-group
```sh [pnpm]
pnpm add @lucide/astro
pnpm add @lucide/astro@next
```
```sh [yarn]
yarn add @lucide/astro
yarn add @lucide/astro@next
```
```sh [npm]
npm install @lucide/astro
npm install @lucide/astro@next
```
```sh [bun]
bun add @lucide/astro
```
```sh [deno]
deno add @lucide/astro
bun add @lucide/astro@next
```
:::
@@ -254,23 +222,19 @@ Implementation of the Lucide icon library for multiple usages that like to use:
::: code-group
```sh [pnpm]
pnpm add lucide-static
pnpm add lucide-static@next
```
```sh [yarn]
yarn add lucide-static
yarn add lucide-static@next
```
```sh [npm]
npm install lucide-static
npm install lucide-static@next
```
```sh [bun]
bun add lucide-static
```
```sh [deno]
deno add lucide-static
bun add lucide-static@next
```
:::
@@ -1,56 +0,0 @@
---
title: Optimizations - React Native
description: Learn how to optimize the bundle size of your React Native and Expo web exports by tree-shaking Lucide icons.
---
# Optimizations
By default you import icons from the `lucide-react-native` entry point:
```jsx
import { Camera } from 'lucide-react-native';
```
This is convenient, but it relies on the bundler to _tree-shake_ the entry point (a "barrel" file that re-exports every icon) so that only the icons you actually use end up in your bundle.
On native platforms this is usually fine. On **web exports** it can be a problem, because the Metro bundler is currently not very good at tree-shaking barrel imports and may include **all** icons in your final bundle.
## The Metro tree-shaking limitation
When you build for web with Expo (`expo export --platform web`), Metro is used to bundle your JavaScript. Metro bundles modules on-demand and, by default, does not remove unused exports from a barrel file.
This means an import like the one below can pull in the entire icon set, even though only a single icon is rendered:
```jsx
// May bundle every Lucide icon on web exports
import { Camera } from 'lucide-react-native';
```
Expo documents an experimental optimization for [React Native web imports](https://docs.expo.dev/guides/tree-shaking/#react-native-web-imports) and for [removing unused imports and exports](https://docs.expo.dev/guides/tree-shaking/#remove-unused-imports-and-exports). In practice this tree-shaking does **not** currently work reliably for `lucide-react-native` barrel imports, so the unused icons are not removed from web exports.
## Recommended: import icons individually
To guarantee that only the icons you use are bundled — regardless of the bundler's tree-shaking capabilities — import each icon directly from its own module:
```jsx
import Camera from 'lucide-react-native/icons/camera';
// Usage
const App = () => {
return <Camera />;
};
export default App;
```
Because each icon lives in its own file, the bundler only ever includes the icons you explicitly import. This keeps your web export small without depending on Metro's experimental tree-shaking.
The icon module name is the [kebab-case](https://developer.mozilla.org/en-US/docs/Glossary/Kebab_case) version of the icon name. For example, the `ArrowRight` icon is imported from `lucide-react-native/icons/arrow-right`:
```jsx
import ArrowRight from 'lucide-react-native/icons/arrow-right';
```
::: tip
Individual icon imports work identically on native and web, so you can safely use this style across your whole project to keep bundles as small as possible on every platform.
:::
+2 -12
View File
@@ -1,19 +1,9 @@
import * as iconDetails from '../.vitepress/data/iconDetails';
import iconNodes from '../.vitepress/data/iconNodes';
export default {
async load() {
return {
icons: Object.entries(iconDetails).map(
([, { name, iconNode, popularity, createdRelease, aliases = [] }]) => ({
name,
iconNode,
popularity: popularity?.count ?? 0,
aliases: aliases
.map((alias) => (typeof alias === 'string' ? alias : alias?.name))
.filter((alias): alias is string => Boolean(alias)),
createdRelease,
}),
),
icons: Object.entries(iconNodes).map(([name, iconNode]) => ({ name, iconNode })),
};
},
};
+9 -10
View File
@@ -9,15 +9,14 @@
"docs:build": "pnpm run /^prebuild:.*/ && vitepress build",
"docs:preview": "vitepress preview",
"build:docs": "vitepress build",
"prebuild:iconNodes": "node ./scripts/writeIconNodes.mts",
"prebuild:metaJson": "node ./scripts/writeIconMetaIndex.mts",
"prebuild:releaseJson": "node ./scripts/writeReleaseMetadata.mts",
"prebuild:categoriesJson": "node ./scripts/writeCategoriesMetadata.mts",
"prebuild:relatedIcons": "node ./scripts/writeIconRelatedIcons.mts",
"prebuild:iconDetails": "node ./scripts/writeIconDetails.mts",
"prebuild:iconPopularity": "node ./scripts/writeiconPopularity.mts",
"prebuild:brandStopwords": "node ./scripts/writeBrandStopwords.mts",
"postbuild:vercelJson": "node ./scripts/writeVercelOutput.mts",
"prebuild:iconNodes": "node ./scripts/writeIconNodes.mjs",
"prebuild:metaJson": "node ./scripts/writeIconMetaIndex.mjs",
"prebuild:releaseJson": "node ./scripts/writeReleaseMetadata.mjs",
"prebuild:categoriesJson": "node ./scripts/writeCategoriesMetadata.mjs",
"prebuild:relatedIcons": "node ./scripts/writeIconRelatedIcons.mjs",
"prebuild:iconDetails": "node ./scripts/writeIconDetails.mjs",
"prebuild:brandStopwords": "node ./scripts/writeBrandStopwords.mjs",
"postbuild:vercelJson": "node ./scripts/writeVercelOutput.mjs",
"dev": "npx nitropack dev",
"prebuild:api": "npx nitropack prepare",
"build:api": "npx nitropack build",
@@ -39,7 +38,7 @@
"vitepress": "^1.6.4",
"vitepress-plugin-group-icons": "^1.6.5",
"vitepress-plugin-llms": "^1.11.1",
"markdown-it": "^14.2.0",
"markdown-it": "^14.1.0",
"markdown-it-container": "^4.0.0",
"semver": "^7.7.3",
"sharp": "^0.34.5",
Binary file not shown.

After

Width:  |  Height:  |  Size: 86 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 83 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 88 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 79 KiB

-6
View File
@@ -1,6 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 160 200" fill="none">
<path fill="#00e8ff" d="M40 120l20-60l90 90l-30 50l-40-40h-20" />
<path fill="#283198" d="M80 160 L80 80 L120 40 L 120 120 M0 160 L40 200 L40 120 L20 120" />
<path fill="#324fff" d="M40 120v-80l40-40v80M120 200v-80l40-40v80M0 160v-80l40 40" />
<path fill="#0ff" d="M40 200v-80l40 40" />
</svg>

Before

Width:  |  Height:  |  Size: 377 B

@@ -26,7 +26,6 @@ const writeIconFiles = icons.map(async (iconFileName) => {
import iconNode from '../iconNodes/${iconName}.node.json'
import metaData from '../../../../icons/${iconName}.json'
import releaseData from '../releaseMetadata/${iconName}.json'
import popularity from '../iconPopularity/${iconName}.json'
const { tags, categories, contributors, aliases, deprecated, deprecationReason, toBeRemovedInVersion } = metaData
@@ -38,7 +37,6 @@ const iconDetails = {
categories,
aliases,
deprecated,
popularity,
deprecationReason,
toBeRemovedInVersion,
...releaseData,
@@ -42,7 +42,7 @@ const getRelatedIcons = (currentIcon, icons) => {
};
const iconsMetaDataPromises = svgFiles.map(async (iconName) => {
const metaDataFileContent = await fs.promises.readFile(`../icons/${iconName}`, 'utf-8');
const metaDataFileContent = await fs.promises.readFile(`../icons/${iconName}`);
const metaData = JSON.parse(metaDataFileContent);
const name = iconName.replace('.json', '');
@@ -70,10 +70,10 @@ const comparisonsPromises = tags.map(async (tag, index) => {
};
});
const comparisons = (await Promise.all(comparisonsPromises)).filter((comparison) => comparison != null && Object.keys(comparison.iconFiles).length > 0);
const comparisons = await Promise.all(comparisonsPromises);
const newReleaseMetaData = {};
comparisons.forEach(({ tag, iconFiles, date }) => {
comparisons.forEach(({ tag, iconFiles, date } = {}) => {
if (tag == null) return;
iconFiles.forEach(({ status, file, renamedFile }) => {
@@ -11,7 +11,7 @@ const iconMetaData = await getIconMetaData(path.resolve(scriptDir, '../../icons'
const iconAliasesRedirectRoutes = Object.entries(iconMetaData)
.filter(([, { aliases }]) => aliases?.length)
.map(([iconName, { aliases }]) => {
const aliasRouteMatches = aliases.map((alias) => typeof alias === 'string' ? alias : alias?.name).join('|');
const aliasRouteMatches = aliases.map((alias) => alias.name).join('|');
return {
src: `^/icons/(${aliasRouteMatches})$`,
-104
View File
@@ -1,104 +0,0 @@
/* eslint-disable no-restricted-syntax, no-await-in-loop */
import fs from 'fs';
import path from 'path';
import { loadEnvFile } from 'node:process';
import { readSvgDirectory } from '@lucide/helpers';
const currentDir = process.cwd();
const ICONS_DIR = path.resolve(currentDir, '../icons');
const iconPopularityDirectory = path.resolve(currentDir, '.vitepress/data', 'iconPopularity');
try {
// Load environment variables from .env file, if it exists.
loadEnvFile(`${currentDir}/.env`);
} catch (error) {}
if (fs.existsSync(iconPopularityDirectory)) {
fs.rmSync(iconPopularityDirectory, { recursive: true, force: true });
}
if (!fs.existsSync(iconPopularityDirectory)) {
fs.mkdirSync(iconPopularityDirectory);
}
const iconJsonFiles = await readSvgDirectory(ICONS_DIR, '.json');
const iconNames = iconJsonFiles.map((file) => path.basename(file, '.json'));
const defaultIconNamePopularity: Record<string, number> = Object.fromEntries(
iconNames.map((iconName) => [iconName, 0])
);
interface AnalyticsResponse {
results: {
dimensions: [route: string];
metrics: [count: number];
}[];
}
const writeIconPopularity = async (iconVisitCounts: Record<string, number>) => {
const writePopularityPromises = Object.entries(iconVisitCounts).map(([iconName, count]) => {
const location = path.resolve(iconPopularityDirectory, `${iconName}.json`);
return fs.promises.writeFile(location, JSON.stringify({ count }, null, 2), 'utf-8');
});
await Promise.all(writePopularityPromises);
console.log('Successfully written icon popularity data for', writePopularityPromises.length, 'icons.');
};
if (process.env.LUCIDE_ANALYTICS_TOKEN === undefined) {
console.warn('LUCIDE_ANALYTICS_TOKEN environment variable is not set. Writing default icon popularity data.');
await writeIconPopularity(defaultIconNamePopularity);
process.exit(0);
}
try {
const response = await fetch('https://analytics.lucide.dev/api/v2/query', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
Authorization: `Bearer ${process.env.LUCIDE_ANALYTICS_TOKEN}`,
},
body: JSON.stringify({
"site_id": "lucide.dev",
"metrics": [
"visitors"
],
"dimensions": [
"visit:entry_page"
],
"date_range": "12mo"
}),
})
if (!response.ok) {
throw new Error(`Network response was not ok: ${response.statusText}`);
}
const analyticsData: AnalyticsResponse = await response.json();
const iconVisitCounts = analyticsData.results.reduce((acc, { dimensions, metrics }) => {
const [route] = dimensions;
const [count] = metrics;
if (!route.startsWith('/icons')) {
return acc
}
// Only match routes that start with /icons/ and end with an icon name, e.g. /icons/activity, /icons/activity/ or /icons/activity?ref=homepage
const match = route.match(/^\/icons\/([^\/\?]+)(?:[\/\?]|$)/);
if (match) {
const iconName = match[1];
if (iconNames.includes(iconName)) {
acc[iconName] = (acc[iconName] || 0) + count;
}
}
return acc;
}, defaultIconNamePopularity);
await writeIconPopularity(iconVisitCounts);
} catch (error) {
console.error('Error fetching analytics data:', error);
await writeIconPopularity(defaultIconNamePopularity);
}
+2 -2
View File
@@ -40,7 +40,7 @@
}
},
"dependentRequired": {
"deprecated": ["deprecationReason"],
"deprecated": ["deprecationReason", "toBeRemovedInVersion"],
"deprecationReason": ["deprecated"],
"toBeRemovedInVersion": ["deprecated"]
}
@@ -134,7 +134,7 @@
}
},
"dependentRequired": {
"deprecated": ["deprecationReason"],
"deprecated": ["deprecationReason", "toBeRemovedInVersion"],
"deprecationReason": ["deprecated"],
"toBeRemovedInVersion": ["deprecated"]
},
+4 -1
View File
@@ -4,7 +4,10 @@
"karsa-mistmere",
"jguddas"
],
"use-cases": [],
"use-cases": [
"Representing physical disability or accessibility assistance",
"Marking wheelchair-accessible facilities or routes"
],
"tags": [
"disability",
"disabled",
-30
View File
@@ -1,30 +0,0 @@
{
"$schema": "../icon.schema.json",
"contributors": [
"ahtohbi4",
"jamiemlaw",
"karsa-mistmere",
"jguddas"
],
"use-cases": [
"marking content as sponsored",
"linking to an advertise with us page"
],
"tags": [
"advert",
"affiliate",
"brand",
"campaign",
"commercial",
"marketing",
"monetize",
"paid",
"partner",
"promo",
"sponsor"
],
"categories": [
"multimedia",
"notifications"
]
}
-16
View File
@@ -1,16 +0,0 @@
<svg
xmlns="http://www.w3.org/2000/svg"
width="24"
height="24"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
stroke-width="2"
stroke-linecap="round"
stroke-linejoin="round"
>
<path d="M10 13H6" />
<path d="M10 15v-4a2 2 0 0 0-4 0v4" />
<path d="M14 14.5a.5.5 0 0 0 .5.5h1a2.5 2.5 0 0 0 2.5-2.5v-1A2.5 2.5 0 0 0 15.5 9h-1a.5.5 0 0 0-.5.5z" />
<rect x="2" y="5" width="20" height="14" rx="2" />
</svg>

Before

Width:  |  Height:  |  Size: 434 B

+4 -1
View File
@@ -4,7 +4,10 @@
"karsa-mistmere",
"jguddas"
],
"use-cases": [],
"use-cases": [
"Representing air conditioning or ventilation in smart home apps",
"Indicating climate control amenities on hotel and booking platforms"
],
"tags": [
"air conditioner",
"ac",
+2 -1
View File
@@ -23,7 +23,8 @@
{
"name": "alarm-check",
"deprecationReason": "alias.name",
"deprecated": true
"deprecated": true,
"toBeRemovedInVersion": "v1.0"
}
]
}
+2 -1
View File
@@ -19,7 +19,8 @@
{
"name": "alarm-minus",
"deprecationReason": "alias.name",
"deprecated": true
"deprecated": true,
"toBeRemovedInVersion": "v1.0"
}
]
}
+2 -1
View File
@@ -19,7 +19,8 @@
{
"name": "alarm-plus",
"deprecationReason": "alias.name",
"deprecated": true
"deprecated": true,
"toBeRemovedInVersion": "v1.0"
}
]
}
+4 -1
View File
@@ -11,7 +11,10 @@
"karsa-mistmere",
"danielbayley"
],
"use-cases": [],
"use-cases": [
"Directing users to nearby emergency services in navigation apps",
"Marking emergency contacts or medical transport services"
],
"tags": [
"ambulance",
"emergency",
+6 -1
View File
@@ -3,7 +3,12 @@
"contributors": [
"karsa-mistmere"
],
"use-cases": [],
"use-cases": [
"Representing museological or archaeological artefacts",
"Indicating pottery or ceramics",
"Symbolizing Greek culture or antiquity",
"Denoting amphora-aged wines"
],
"tags": [
"pottery",
"artifact",
+4 -1
View File
@@ -4,7 +4,10 @@
"karsa-mistmere",
"ericfennis"
],
"use-cases": [],
"use-cases": [
"Expressing strong dissatisfaction in feedback or rating scales",
"Marking the lowest score on a contentment scale (very unhappy to very happy)"
],
"tags": [
"emoji",
"anger",
+4 -1
View File
@@ -3,7 +3,10 @@
"contributors": [
"karsa-mistmere"
],
"use-cases": [],
"use-cases": [
"Expressing mild dissatisfaction in feedback or rating scales",
"Marking an unhappy step on a contentment scale (very unhappy to very happy)"
],
"tags": [
"emoji",
"nuisance",
+3 -1
View File
@@ -5,7 +5,9 @@
"ericfennis",
"danielbayley"
],
"use-cases": [],
"use-cases": [
"Restoring an item from the archive, reversing an archive action"
],
"tags": [
"unarchive",
"index",
+4 -1
View File
@@ -4,7 +4,10 @@
"karsa-mistmere",
"jguddas"
],
"use-cases": [],
"use-cases": [
"Indicating a lounge or seating area in hotel and booking apps",
"Representing living room furniture in smart home applications"
],
"tags": [
"sofa",
"furniture",
+2 -1
View File
@@ -25,7 +25,8 @@
{
"name": "arrow-down-01",
"deprecationReason": "alias.name",
"deprecated": true
"deprecated": true,
"toBeRemovedInVersion": "v1.0"
}
]
}
+2 -1
View File
@@ -25,7 +25,8 @@
{
"name": "arrow-down-10",
"deprecationReason": "alias.name",
"deprecated": true
"deprecated": true,
"toBeRemovedInVersion": "v1.0"
}
]
}
+2 -1
View File
@@ -25,7 +25,8 @@
{
"name": "arrow-down-az",
"deprecationReason": "alias.name",
"deprecated": true
"deprecated": true,
"toBeRemovedInVersion": "v1.0"
}
]
}
+2 -1
View File
@@ -25,7 +25,8 @@
{
"name": "sort-desc",
"deprecationReason": "alias.name",
"deprecated": true
"deprecated": true,
"toBeRemovedInVersion": "v1.0"
}
]
}
+2 -1
View File
@@ -26,7 +26,8 @@
{
"name": "arrow-down-za",
"deprecationReason": "alias.name",
"deprecated": true
"deprecated": true,
"toBeRemovedInVersion": "v1.0"
}
]
}
+2 -1
View File
@@ -25,7 +25,8 @@
{
"name": "arrow-up-01",
"deprecationReason": "alias.name",
"deprecated": true
"deprecated": true,
"toBeRemovedInVersion": "v1.0"
}
]
}
+2 -1
View File
@@ -25,7 +25,8 @@
{
"name": "arrow-up-10",
"deprecationReason": "alias.name",
"deprecated": true
"deprecated": true,
"toBeRemovedInVersion": "v1.0"
}
]
}
+2 -1
View File
@@ -25,7 +25,8 @@
{
"name": "arrow-up-az",
"deprecationReason": "alias.name",
"deprecated": true
"deprecated": true,
"toBeRemovedInVersion": "v1.0"
}
]
}
+2 -1
View File
@@ -26,7 +26,8 @@
{
"name": "sort-asc",
"deprecationReason": "alias.name",
"deprecated": true
"deprecated": true,
"toBeRemovedInVersion": "v1.0"
}
]
}
+2 -1
View File
@@ -26,7 +26,8 @@
{
"name": "arrow-up-za",
"deprecationReason": "alias.name",
"deprecated": true
"deprecated": true,
"toBeRemovedInVersion": "v1.0"
}
]
}
+4 -1
View File
@@ -3,7 +3,10 @@
"contributors": [
"whoisBugsbunny"
],
"use-cases": [],
"use-cases": [
"Indicating AI-assisted features or smart actions, as a sharper alternative to a sparkle",
"Representing hypocycloid curves or vector anchor points in math and vector tools"
],
"tags": [
"star",
"math",
+2 -1
View File
@@ -16,7 +16,8 @@
{
"name": "axis-3-d",
"deprecationReason": "alias.name",
"deprecated": true
"deprecated": true,
"toBeRemovedInVersion": "v1.0"
}
]
}
+4 -1
View File
@@ -4,7 +4,10 @@
"karsa-mistmere",
"jguddas"
],
"use-cases": [],
"use-cases": [
"Representing hand luggage or carry-on baggage in airport and hotel apps",
"Indicating hiking or travel gear"
],
"tags": [
"bag",
"hiking",
+2 -1
View File
@@ -8,7 +8,8 @@
{
"name": "verified",
"deprecationReason": "alias.name",
"deprecated": true
"deprecated": true,
"toBeRemovedInVersion": "v1.0"
}
],
"use-cases": [],
+2 -1
View File
@@ -19,7 +19,8 @@
{
"name": "badge-help",
"deprecationReason": "alias.name",
"deprecated": true
"deprecated": true,
"toBeRemovedInVersion": "v1.0"
}
]
}
+5 -1
View File
@@ -4,7 +4,11 @@
"danielbayley",
"jamiemlaw"
],
"use-cases": [],
"use-cases": [
"Displaying prices or amounts in Turkish lira",
"Currency selection lists, pricing tables, and discounts",
"Receipts or statements sections of banking apps"
],
"tags": [
"discount",
"offer",
+4 -1
View File
@@ -4,7 +4,10 @@
"karsa-mistmere",
"ericfennis"
],
"use-cases": [],
"use-cases": [
"Directing to baggage claim areas in airport applications",
"Representing luggage services in travel and hotel apps"
],
"tags": [
"baggage",
"luggage",
+3 -1
View File
@@ -3,7 +3,9 @@
"contributors": [
"peteruithoven"
],
"use-cases": [],
"use-cases": [
"Indicating something festive, such as parties or celebrations"
],
"tags": [
"party",
"festival",
+6 -1
View File
@@ -5,7 +5,12 @@
"jamiemlaw",
"jguddas"
],
"use-cases": [],
"use-cases": [
"Indicating first aid supplies or first aid stations",
"Representing wound care or injury tracking in medical apps",
"Marking injury treatment and emergency care sections on healthcare sites",
"Highlighting first aid services at pharmacies, hospitals, or sports facilities"
],
"tags": [
"plaster",
"band-aid",
+4 -1
View File
@@ -6,7 +6,10 @@
"ericfennis",
"mittalyashu"
],
"use-cases": [],
"use-cases": [
"Indicating a decrease in money, balance, or income in financial apps",
"Signifying withdrawals, payments made, losses, or deductions"
],
"tags": [
"bill",
"currency",
+4 -1
View File
@@ -6,7 +6,10 @@
"ericfennis",
"mittalyashu"
],
"use-cases": [],
"use-cases": [
"Indicating an increase in money, balance, or income in financial apps",
"Signifying deposits, received payments, or monetary growth"
],
"tags": [
"bill",
"currency",
-33
View File
@@ -1,33 +0,0 @@
{
"$schema": "../icon.schema.json",
"contributors": [
"mfjramirezf"
],
"use-cases": [
"confirm a paid product",
"confirm a payment method was added successfully"
],
"tags": [
"banknote",
"bill",
"currency",
"payment",
"money",
"finance",
"document",
"verification",
"tick",
"verified",
"accepted",
"done",
"complete",
"found",
"paid",
"task",
"check",
"success"
],
"categories": [
"finance"
]
}
-17
View File
@@ -1,17 +0,0 @@
<svg
xmlns="http://www.w3.org/2000/svg"
width="24"
height="24"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
stroke-width="2"
stroke-linecap="round"
stroke-linejoin="round"
>
<path d="M11.748 18H4a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h16a2 2 0 0 1 2 2v4.875" />
<path d="m16 19 2 2 4-4" />
<path d="M18 12h.01" />
<path d="M6 12h.01" />
<circle cx="12" cy="12" r="2" />
</svg>

Before

Width:  |  Height:  |  Size: 405 B

+4 -1
View File
@@ -6,7 +6,10 @@
"ericfennis",
"mittalyashu"
],
"use-cases": [],
"use-cases": [
"Indicating a failed, rejected, or canceled payment",
"Signifying insufficient funds, transaction errors, or declined payments"
],
"tags": [
"bill",
"currency",
+4 -1
View File
@@ -4,7 +4,10 @@
"karsa-mistmere",
"jamiemlaw"
],
"use-cases": [],
"use-cases": [
"Indicating barrel-aged drinks such as wine, beer, or whiskey",
"Marking breweries or distilleries on maps"
],
"tags": [
"keg",
"drum",
+4 -1
View File
@@ -7,7 +7,10 @@
"johnletey",
"Footagesus"
],
"use-cases": [],
"use-cases": [
"Representing energy saving or battery charge optimization",
"Indicating fast charging or battery health features"
],
"tags": [
"power",
"electricity",
+4 -1
View File
@@ -4,7 +4,10 @@
"karsa-mistmere",
"ericfennis"
],
"use-cases": [],
"use-cases": [
"Indicating rooms with a double bed in hotel and booking apps",
"Representing a master bedroom in smart home applications"
],
"tags": [
"sleep",
"hotel",
+4 -1
View File
@@ -4,7 +4,10 @@
"karsa-mistmere",
"ericfennis"
],
"use-cases": [],
"use-cases": [
"Indicating rooms with a single bed in hotel and booking apps",
"Representing a single bedroom in smart home applications"
],
"tags": [
"sleep",
"hotel",
+4 -1
View File
@@ -4,7 +4,10 @@
"karsa-mistmere",
"ericfennis"
],
"use-cases": [],
"use-cases": [
"Indicating sleeping areas or bedrooms in hotel and booking apps",
"Representing bedroom controls in smart home applications"
],
"tags": [
"sleep",
"hotel",
+4 -1
View File
@@ -6,7 +6,10 @@
"karsa-mistmere",
"jguddas"
],
"use-cases": [],
"use-cases": [
"Marking vegetarian or vegan recipes and menu options",
"Indicating meat-free dietary filters"
],
"tags": [
"food",
"dish",
+4 -1
View File
@@ -7,7 +7,10 @@
"danielbayley",
"pettelau"
],
"use-cases": [],
"use-cases": [
"Confirming a successful subscription to event notifications",
"Indicating that alerts for a followed item are active"
],
"tags": [
"alarm",
"notification",
+2 -1
View File
@@ -36,7 +36,8 @@
{
"name": "between-horizonal-end",
"deprecated": true,
"deprecationReason": "alias.typo"
"deprecationReason": "alias.typo",
"toBeRemovedInVersion": "v1.0"
}
]
}
+2 -1
View File
@@ -36,7 +36,8 @@
{
"name": "between-horizonal-start",
"deprecated": true,
"deprecationReason": "alias.typo"
"deprecationReason": "alias.typo",
"toBeRemovedInVersion": "v1.0"
}
]
}
+7 -1
View File
@@ -3,7 +3,13 @@
"contributors": [
"karsa-mistmere"
],
"use-cases": [],
"use-cases": [
"Marking sightseeing spots, viewpoints, or scenic lookouts on maps",
"Representing search, discovery, or exploration features",
"Indicating birdwatching, wildlife watching, or nature tours",
"Representing surveillance or monitoring capabilities",
"Denoting scouting or exploration modes in games"
],
"tags": [
"field glasses",
"lorgnette",
+4 -1
View File
@@ -4,7 +4,10 @@
"hieu-onefold",
"karsa-mistmere"
],
"use-cases": [],
"use-cases": [
"Serving as a playful alternative to the standard home icon in nature, wellness, or learning apps",
"Representing actual birdhouses in birdwatching, DIY, or eco-education apps"
],
"tags": [
"birdhouse",
"bird",
+4 -1
View File
@@ -3,7 +3,10 @@
"contributors": [
"rrod497"
],
"use-cases": [],
"use-cases": [
"Indicating a blender is required in recipe instructions",
"Showing kitchen appliance availability in hotel or homestay listings"
],
"tags": [
"mixer",
"appliances",
+4 -1
View File
@@ -4,7 +4,10 @@
"karsa-mistmere",
"ericfennis"
],
"use-cases": [],
"use-cases": [
"Indicating a fatal error or crash",
"Representing something explosive or a blockbuster"
],
"tags": [
"fatal",
"error",
-32
View File
@@ -1,32 +0,0 @@
{
"$schema": "../icon.schema.json",
"contributors": [
"Patolord"
],
"use-cases": [
"indicate injury or fracture status in health/fitness tracking",
"show an error or failed state in healthcare UI flows"
],
"tags": [
"bone",
"fracture",
"injury",
"orthopedic",
"medical",
"anatomy",
"skeletal",
"broken",
"xray",
"trauma",
"health",
"vet",
"veterinary",
"crack",
"break",
"damage"
],
"categories": [
"medical",
"animals"
]
}
-18
View File
@@ -1,18 +0,0 @@
<svg
xmlns="http://www.w3.org/2000/svg"
width="24"
height="24"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
stroke-width="2"
stroke-linecap="round"
stroke-linejoin="round"
>
<path d="M14 4.5a1 1 0 0 1 5 0 .5.5 0 0 0 .5.5 1 1 0 0 1 0 5c-.81 0-1.8-.7-2.5 0l-1.958 1.957a.15.15 0 0 1-.252-.072l-.493-2.07a.15.15 0 0 0-.111-.112l-2.072-.494a.15.15 0 0 1-.072-.252L14 7c.7-.7 0-1.69 0-2.5" />
<path d="m16 20-1-2" />
<path d="m20 16-2-1" />
<path d="m4 8 2 1" />
<path d="m8 4 1 2" />
<path d="M9.698 14.19a.15.15 0 0 0 .112.112l2.074.489a.15.15 0 0 1 .072.252L10 17c-.7.7 0 1.69 0 2.5a1 1 0 0 1-5 0 .495.495 0 0 0-.5-.5 1 1 0 0 1 0-5c.81 0 1.8.7 2.5 0l1.956-1.957a.15.15 0 0 1 .252.072z" />
</svg>

Before

Width:  |  Height:  |  Size: 732 B

+5 -1
View File
@@ -4,7 +4,11 @@
"karsa-mistmere",
"jguddas"
],
"use-cases": [],
"use-cases": [
"Representing bones in medical and health contexts",
"Indicating dog treats or pet supplies",
"Symbolizing skeletal anatomy"
],
"tags": [
"health",
"skeleton",
+4 -1
View File
@@ -8,7 +8,10 @@
"lscheibel",
"domasmark"
],
"use-cases": [],
"use-cases": [
"Marking reading assignments or books that need attention or review",
"Indicating an issue or pending action related to a book or publication"
],
"tags": [
"reading",
"paperback",
+2 -1
View File
@@ -29,7 +29,8 @@
{
"name": "book-template",
"deprecationReason": "alias.name",
"deprecated": true
"deprecated": true,
"toBeRemovedInVersion": "v1.0.0"
}
]
}

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