[number];
diff --git a/docs/.vitepress/lib/SvgPreview/utils.ts b/docs/.vitepress/lib/SvgPreview/utils.ts
index 0ddbc9c82..22216de90 100644
--- a/docs/.vitepress/lib/SvgPreview/utils.ts
+++ b/docs/.vitepress/lib/SvgPreview/utils.ts
@@ -1,10 +1,8 @@
import { INode, parseSync } from 'svgson';
-// @ts-ignore
import toPath from 'element-to-path';
-// @ts-ignore
import { SVGPathData, encodeSVGPath } from 'svg-pathdata';
import { Path, Point } from './types';
-import memoize from 'lodash/memoize';
+import { memoize } from 'lodash-es';
function assertNever(x: never): never {
throw new Error('Unknown type: ' + x['type']);
diff --git a/docs/.vitepress/lib/codeExamples/createCodeExamples.ts b/docs/.vitepress/lib/codeExamples/createCodeExamples.ts
index a2edebef5..abfa8de53 100644
--- a/docs/.vitepress/lib/codeExamples/createCodeExamples.ts
+++ b/docs/.vitepress/lib/codeExamples/createCodeExamples.ts
@@ -113,16 +113,16 @@ import { LucideAngularModule, $PascalCase } from 'lucide-angular';
];
};
+const highlighter = await createHighlighter({
+ themes: ['github-light', 'github-dark'],
+ langs: Object.keys(bundledLanguages),
+});
+
export type ThemeOptions =
| ThemeRegistration
| { light: ThemeRegistration; dark: ThemeRegistration };
-const highLightCode = async (code: string, lang: string, active?: boolean) => {
- const highlighter = await createHighlighter({
- themes: ['github-light', 'github-dark'],
- langs: Object.keys(bundledLanguages),
- });
-
+export const highLightCode = async (code: string, lang: string, active?: boolean) => {
const highlightedCode = highlighter
.codeToHtml(code, {
lang,
diff --git a/docs/.vitepress/lib/codeExamples/createLabCodeExamples.ts b/docs/.vitepress/lib/codeExamples/createLabCodeExamples.ts
index a38772523..24d1a41d8 100644
--- a/docs/.vitepress/lib/codeExamples/createLabCodeExamples.ts
+++ b/docs/.vitepress/lib/codeExamples/createLabCodeExamples.ts
@@ -1,5 +1,4 @@
-import { bundledLanguages, type ThemeRegistration } from 'shiki';
-import { createHighlighter } from 'shiki';
+import { highLightCode } from './createCodeExamples';
type CodeExampleType = {
title: string;
@@ -116,34 +115,6 @@ import { $CamelCase } from '@lucide/lab';
];
};
-export type ThemeOptions =
- | ThemeRegistration
- | { light: ThemeRegistration; dark: ThemeRegistration };
-
-const highLightCode = async (code: string, lang: string, active?: boolean) => {
- const highlighter = await createHighlighter({
- themes: ['github-light', 'github-dark'],
- langs: Object.keys(bundledLanguages),
- });
-
- const highlightedCode = highlighter
- .codeToHtml(code, {
- lang,
- themes: {
- light: 'github-light',
- dark: 'github-dark',
- },
- defaultColor: false,
- })
- .replace('shiki-themes', 'shiki-themes vp-code');
-
- return `
-
- ${lang}
- ${highlightedCode}
-
`;
-};
-
export default async function createCodeExamples() {
const codes = getIconCodes();
diff --git a/docs/nitro.config.ts b/docs/nitro.config.ts
index 1d21e93a8..5b950f004 100644
--- a/docs/nitro.config.ts
+++ b/docs/nitro.config.ts
@@ -1,32 +1,10 @@
-import copy from 'rollup-plugin-copy';
-import replace from '@rollup/plugin-replace';
-
export default defineNitroConfig({
- compatibilityDate: '2025-07-30',
- preset: 'vercel_edge',
+ compatibilityDate: '2026-02-26',
+ preset: 'vercel',
srcDir: '.vitepress',
routeRules: {
'/api/**': { cors: false },
},
- rollupConfig: {
- external: ['@resvg/resvg-wasm/index_bg.wasm', './index_bg.wasm?module'],
- plugins: [
- copy({
- targets: [
- {
- src: './node_modules/@resvg/resvg-wasm/index_bg.wasm',
- dest: './.vercel/output/functions/__nitro.func',
- },
- ],
- }),
- replace({
- include: ['./**/*.ts'],
- '/* WASM_IMPORT */': 'import resvg_wasm from "./index_bg.wasm?module";',
- delimiters: ['', ''],
- preventAssignment: false,
- }),
- ],
- },
esbuild: {
options: {
jsxFactory: 'React.createElement',
diff --git a/docs/package.json b/docs/package.json
index 57f2714dd..94728ecc7 100644
--- a/docs/package.json
+++ b/docs/package.json
@@ -20,7 +20,7 @@
"dev": "npx nitropack dev",
"prebuild:api": "npx nitropack prepare",
"build:api": "npx nitropack build",
- "build": "pnpm run /^prebuild:.*/ && pnpm run /^build:.*/ && pnpm postbuild:vercelJson",
+ "build": "pnpm run /^prebuild:.*/ && pnpm run build:api && pnpm run build:docs && pnpm postbuild:vercelJson",
"preview": "node .output/server/index.mjs"
},
"author": "Eric Fennis",
@@ -31,7 +31,8 @@
"@lucide/shared": "workspace:*",
"@rollup/plugin-replace": "^6.0.3",
"@types/semver": "^7.7.1",
- "nitropack": "2.8.1",
+ "h3": "^1.15.4",
+ "nitropack": "^2.12.4",
"rollup-plugin-copy": "^3.5.0",
"svg-path-commander": "^2.1.11",
"vitepress": "^1.6.4"
@@ -39,20 +40,19 @@
"dependencies": {
"@floating-ui/vue": "^1.1.9",
"@headlessui/vue": "^1.7.23",
- "@resvg/resvg-wasm": "^2.6.2",
"@vueuse/components": "^14.0.0",
"@vueuse/core": "^14.0.0",
"element-to-path": "^1.2.1",
"fuse.js": "^7.1.0",
"jszip": "^3.10.1",
- "lodash": "^4.17.23",
"lodash-es": "^4.17.23",
"lucide-react": "workspace:*",
"lucide-vue-next": "workspace:*",
- "react": "^18.3.1",
- "react-dom": "^18.3.1",
+ "react": "18.2.0",
+ "react-dom": "18.2.0",
"sandpack-vue3": "3.1.11",
"semver": "^7.7.3",
+ "sharp": "^0.34.5",
"shiki": "^3.15.0",
"simple-git": "^3.30.0",
"sitemap": "^7.1.2",
diff --git a/docs/scripts/writeVercelOutput.mjs b/docs/scripts/writeVercelOutput.mjs
index 3f4e04d67..a8880181d 100644
--- a/docs/scripts/writeVercelOutput.mjs
+++ b/docs/scripts/writeVercelOutput.mjs
@@ -22,24 +22,30 @@ const iconAliasesRedirectRoutes = Object.entries(iconMetaData)
};
});
-const vercelRouteConfig = {
- version: 3,
- overrides: {},
- cleanUrls: true,
- routes: [
- {
- handle: 'filesystem',
- },
- {
- src: '(?/api/.*)',
- dest: '/__nitro?url=$url',
- },
- ...iconAliasesRedirectRoutes,
- ],
-};
+const vercelOutputJSON = path.resolve(currentDir, '.vercel/output/config.json');
+
+const vercelConfig = await fs.promises.readFile(vercelOutputJSON, 'utf-8');
+
+const vercelRouteConfig = JSON.parse(vercelConfig);
+
+vercelRouteConfig.routes = [...iconAliasesRedirectRoutes, ...vercelRouteConfig.routes];
+
+// Adjust the existing catch-all route to only catch API routes, so that we can add a new catch-all route for 404s
+const allCatchRoute = '/(.*)';
+const fallBackIndex = vercelRouteConfig.routes.findIndex((route) => route.src === allCatchRoute);
+
+if (fallBackIndex === -1) {
+ throw new Error(
+ `Could not find the expected catch-all route with src "${allCatchRoute}" in the existing Vercel config. Please make sure that the existing config has a catch-all route and that its src is "${allCatchRoute}".`,
+ );
+}
+
+vercelRouteConfig.routes[fallBackIndex].src = '/api/(.*)';
+vercelRouteConfig.routes.push({
+ src: allCatchRoute,
+ dest: '/404.html',
+});
const output = JSON.stringify(vercelRouteConfig, null, 2);
-const vercelOutputJSON = path.resolve(currentDir, '.vercel/output/config.json');
-
await fs.promises.writeFile(vercelOutputJSON, output, 'utf-8');
diff --git a/docs/tsconfig.json b/docs/tsconfig.json
index 3402131d1..f786c0c16 100644
--- a/docs/tsconfig.json
+++ b/docs/tsconfig.json
@@ -2,6 +2,8 @@
"extends": "./.nitro/types/tsconfig.json",
"compilerOptions": {
"jsx": "react",
+ "jsxFactory": "React.createElement",
+ "jsxFragmentFactory": "React.Fragment",
"allowImportingTsExtensions": true,
"allowSyntheticDefaultImports": true,
"noEmit": true,
diff --git a/docs/vercel.json b/docs/vercel.json
index 504592742..5e49cebc7 100644
--- a/docs/vercel.json
+++ b/docs/vercel.json
@@ -1,4 +1,6 @@
{
+ "$schema": "https://openapi.vercel.sh/vercel.json",
+ "fluid": true,
"cleanUrls": true,
"github": {
"silent": true
diff --git a/icons/bitcoin.json b/icons/bitcoin.json
index f263084d5..f89fef89d 100644
--- a/icons/bitcoin.json
+++ b/icons/bitcoin.json
@@ -5,6 +5,15 @@
"mittalyashu"
],
"tags": [
+ "cryptocurrency",
+ "digital",
+ "blockchain",
+ "finance",
+ "coin",
+ "market",
+ "decentralized",
+ "investment",
+ "crypto",
"currency",
"money",
"payment"
diff --git a/icons/cuboid.json b/icons/cuboid.json
index 6d7b48935..abcaf9999 100644
--- a/icons/cuboid.json
+++ b/icons/cuboid.json
@@ -1,20 +1,34 @@
{
"$schema": "../icon.schema.json",
"contributors": [
- "danielbayley"
+ "danielbayley",
+ "karsa-mistmere"
],
"tags": [
"brick",
"block",
+ "box",
+ "3d",
+ "solid",
+ "volume",
"container",
"storage",
+ "shipping",
+ "carton",
"geometry",
"rectangular",
- "hexahedron"
+ "hexahedron",
+ "butter",
+ "tofu",
+ "soap",
+ "cheese",
+ "package",
+ "parcel",
+ "crate"
],
"categories": [
"shapes",
"math",
- "buildings"
+ "food-beverage"
]
}
diff --git a/icons/cuboid.svg b/icons/cuboid.svg
index 23338e5fa..a3243afbe 100644
--- a/icons/cuboid.svg
+++ b/icons/cuboid.svg
@@ -9,7 +9,7 @@
stroke-linecap="round"
stroke-linejoin="round"
>
-
-
-
+
+
+