diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index cb9894f0d..10c622107 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -17,6 +17,10 @@ permissions: id-token: write # Required for OIDC contents: write +# This is added to make sure we wait until last release is done, this is needed for the font-build process +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + jobs: create-release: if: github.repository == 'lucide-icons/lucide' && startsWith(github.event.head_commit.message, 'feat(icons)') && github.event_name != 'workflow_dispatch' diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index d21e61ee3..3f4898ac2 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -16,6 +16,9 @@ permissions: id-token: write # Required for OIDC contents: write +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + jobs: pre-release: if: github.repository == 'lucide-icons/lucide' && contains('["ericfennis", "karsa-mistmere", "jguddas"]', github.actor) @@ -129,11 +132,8 @@ jobs: - name: Install dependencies run: pnpm install --frozen-lockfile - - name: Outline svg Icons - run: pnpm build:outline-icons - - name: Create font in ./lucide-font - run: pnpm build:font + run: pnpm build:font --saveCodePoints - name: 'Upload to Artifacts' uses: actions/upload-artifact@v4 diff --git a/.gitignore b/.gitignore index a4016ec89..21db74229 100644 --- a/.gitignore +++ b/.gitignore @@ -14,6 +14,7 @@ coverage stats *.log outlined +lucide-font packages/**/src/icons/*.js packages/**/src/icons/*.ts packages/**/src/icons/*.tsx diff --git a/lucide-font/lucide.svg b/lucide-font/lucide.svg deleted file mode 100644 index e69de29bb..000000000 diff --git a/package.json b/package.json index dc10fd703..adee34061 100644 --- a/package.json +++ b/package.json @@ -16,7 +16,7 @@ "lucide-svelte": "pnpm --filter lucide-svelte", "lucide-static": "pnpm --filter lucide-static", "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", "addjsons": "node ./scripts/addMissingIconJsonFiles.mts", "checkIcons": "node ./scripts/checkIconsAndCategories.mts", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d6d95462f..929cc2290 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -199,7 +199,7 @@ importers: version: 7.7.1 nitropack: specifier: 2.8.1 - version: 2.8.1(db0@0.3.4)(encoding@0.1.13)(ioredis@5.8.2)(xml2js@0.6.2) + version: 2.8.1(@vercel/blob@2.0.0)(db0@0.3.4)(encoding@0.1.13)(ioredis@5.8.2)(xml2js@0.6.2) rollup-plugin-copy: specifier: ^3.5.0 version: 3.5.0 @@ -226,7 +226,7 @@ importers: version: 6.9.1 astro: specifier: ^5.16.0 - version: 5.16.0(@types/node@24.10.1)(db0@0.3.4)(ioredis@5.8.2)(jiti@2.6.1)(less@4.2.0)(rollup@4.53.3)(sass@1.77.8)(stylus@0.56.0)(terser@5.44.1)(typescript@5.9.3)(yaml@2.8.0) + version: 5.16.0(@types/node@24.10.1)(@vercel/blob@2.0.0)(db0@0.3.4)(ioredis@5.8.2)(jiti@2.6.1)(less@4.2.0)(rollup@4.53.3)(sass@1.77.8)(stylus@0.56.0)(terser@5.44.1)(typescript@5.9.3)(yaml@2.8.0) jest-serializer-html: specifier: ^7.1.0 version: 7.1.0 @@ -816,10 +816,16 @@ importers: minimist: specifier: ^1.2.8 version: 1.2.8 + oslllo-svg-fixer: + specifier: ^5.0.0 + version: 5.0.0(encoding@0.1.13) svgtofont: specifier: ^6.5.0 version: 6.5.0(@types/svg2ttf@5.0.1)(chokidar@3.6.0) devDependencies: + '@lucide/helpers': + specifier: workspace:* + version: link:../build-helpers '@types/fs-extra': specifier: ^11.0.4 version: 11.0.4 @@ -861,15 +867,6 @@ importers: specifier: ^22 version: 22.19.1 - tools/outline-svg: - dependencies: - minimist: - specifier: ^1.2.8 - version: 1.2.8 - oslllo-svg-fixer: - specifier: ^5.0.0 - version: 5.0.0(encoding@0.1.13) - tools/rollup-plugins: dependencies: '@rollup/plugin-node-resolve': @@ -5624,6 +5621,10 @@ packages: cpu: [x64] os: [win32] + '@vercel/blob@2.0.0': + resolution: {integrity: sha512-oAj7Pdy83YKSwIaMFoM7zFeLYWRc+qUpW3PiDSblxQMnGFb43qs4bmfq7dr/+JIfwhs6PTwe1o2YBwKhyjWxXw==} + engines: {node: '>=20.0.0'} + '@vercel/nft@0.24.4': resolution: {integrity: sha512-KjYAZty7boH5fi5udp6p+lNu6nawgs++pHW+3koErMgbRkkHuToGX/FwjN5clV1FcaM3udfd4zW/sUapkMgpZw==} engines: {node: '>=16'} @@ -6179,6 +6180,9 @@ packages: async-limiter@1.0.1: resolution: {integrity: sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==} + async-retry@1.3.3: + resolution: {integrity: sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw==} + async-sema@3.1.1: resolution: {integrity: sha512-tLRNUXati5MFePdAk8dw7Qt7DpxPB60ofAgn8WRhW6a2rcimZnYBP9oxHiv0OHy+Wz7kPMG+t4LGdt31+4EmGg==} @@ -8111,10 +8115,6 @@ packages: resolution: {integrity: sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q==} engines: {node: '>=8'} - fast-glob@3.3.2: - resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} - engines: {node: '>=8.6.0'} - fast-glob@3.3.3: resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} engines: {node: '>=8.6.0'} @@ -8872,6 +8872,10 @@ packages: is-buffer@1.1.6: resolution: {integrity: sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==} + is-buffer@2.0.5: + resolution: {integrity: sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==} + engines: {node: '>=4'} + is-builtin-module@3.2.1: resolution: {integrity: sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==} engines: {node: '>=6'} @@ -8963,6 +8967,9 @@ packages: resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} engines: {node: '>= 0.4'} + is-node-process@1.2.0: + resolution: {integrity: sha512-Vg4o6/fqPxIjtxgUH5QLJhwZ7gW5diGCVlXpuUfELC62CuxM1iHcRe51f2W1FDy04Ai4KJkagKjx3XaqyfRKXw==} + is-number-object@1.1.1: resolution: {integrity: sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==} engines: {node: '>= 0.4'} @@ -12355,6 +12362,10 @@ packages: throat@5.0.0: resolution: {integrity: sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==} + throttleit@2.1.0: + resolution: {integrity: sha512-nt6AMGKW1p/70DF/hGBdJB57B8Tspmbp5gfJ8ilhLnt7kkr2ye7hzD6NVG8GGErk2HWF34igrL2CXmNIkzKqKw==} + engines: {node: '>=18'} + through2@2.0.5: resolution: {integrity: sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==} @@ -14183,7 +14194,7 @@ snapshots: '@babel/helper-builder-binary-assignment-operator-visitor@7.24.7': dependencies: '@babel/traverse': 7.28.5 - '@babel/types': 7.28.5 + '@babel/types': 7.28.6 transitivePeerDependencies: - supports-color @@ -14462,14 +14473,14 @@ snapshots: '@babel/helper-simple-access@7.24.7': dependencies: '@babel/traverse': 7.28.5 - '@babel/types': 7.28.5 + '@babel/types': 7.28.6 transitivePeerDependencies: - supports-color '@babel/helper-skip-transparent-expression-wrappers@7.24.7': dependencies: '@babel/traverse': 7.28.5 - '@babel/types': 7.28.5 + '@babel/types': 7.28.6 transitivePeerDependencies: - supports-color @@ -14492,9 +14503,9 @@ snapshots: '@babel/helper-wrap-function@7.25.0': dependencies: - '@babel/template': 7.27.2 + '@babel/template': 7.28.6 '@babel/traverse': 7.28.5 - '@babel/types': 7.28.5 + '@babel/types': 7.28.6 transitivePeerDependencies: - supports-color @@ -16713,14 +16724,14 @@ snapshots: dependencies: '@jest/fake-timers': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 24.10.1 + '@types/node': 22.19.1 jest-mock: 29.7.0 '@jest/fake-timers@29.7.0': dependencies: '@jest/types': 29.6.3 '@sinonjs/fake-timers': 10.3.0 - '@types/node': 24.10.1 + '@types/node': 22.19.1 jest-message-util: 29.7.0 jest-mock: 29.7.0 jest-util: 29.7.0 @@ -16754,7 +16765,7 @@ snapshots: '@jest/schemas': 29.6.3 '@types/istanbul-lib-coverage': 2.0.4 '@types/istanbul-reports': 3.0.1 - '@types/node': 24.10.1 + '@types/node': 22.19.1 '@types/yargs': 17.0.35 chalk: 4.1.2 @@ -18440,11 +18451,11 @@ snapshots: '@types/body-parser@1.19.5': dependencies: '@types/connect': 3.4.38 - '@types/node': 12.20.55 + '@types/node': 22.19.1 '@types/bonjour@3.5.13': dependencies: - '@types/node': 12.20.55 + '@types/node': 22.19.1 '@types/chai@5.2.2': dependencies: @@ -18453,17 +18464,17 @@ snapshots: '@types/connect-history-api-fallback@1.5.4': dependencies: '@types/express-serve-static-core': 4.19.5 - '@types/node': 12.20.55 + '@types/node': 22.19.1 '@types/connect@3.4.38': dependencies: - '@types/node': 12.20.55 + '@types/node': 22.19.1 '@types/cookie@0.4.1': {} '@types/cors@2.8.17': dependencies: - '@types/node': 12.20.55 + '@types/node': 22.19.1 '@types/debug@4.1.12': dependencies: @@ -18491,7 +18502,7 @@ snapshots: '@types/express-serve-static-core@4.19.5': dependencies: - '@types/node': 12.20.55 + '@types/node': 22.19.1 '@types/qs': 6.9.15 '@types/range-parser': 1.2.7 '@types/send': 0.17.4 @@ -18505,7 +18516,7 @@ snapshots: '@types/fontkit@2.0.8': dependencies: - '@types/node': 24.10.1 + '@types/node': 22.19.1 '@types/fs-extra@11.0.4': dependencies: @@ -18519,11 +18530,11 @@ snapshots: '@types/glob@7.2.0': dependencies: '@types/minimatch': 6.0.0 - '@types/node': 24.10.1 + '@types/node': 22.19.1 '@types/graceful-fs@4.1.9': dependencies: - '@types/node': 24.10.1 + '@types/node': 22.19.1 '@types/hast@3.0.4': dependencies: @@ -18584,7 +18595,7 @@ snapshots: '@types/node-forge@1.3.11': dependencies: - '@types/node': 12.20.55 + '@types/node': 22.19.1 '@types/node@12.20.55': {} @@ -18623,7 +18634,7 @@ snapshots: '@types/resolve@1.17.1': dependencies: - '@types/node': 12.20.55 + '@types/node': 22.19.1 '@types/resolve@1.20.2': {} @@ -18638,7 +18649,7 @@ snapshots: '@types/send@0.17.4': dependencies: '@types/mime': 1.3.5 - '@types/node': 12.20.55 + '@types/node': 22.19.1 '@types/serve-index@1.9.4': dependencies: @@ -18647,12 +18658,12 @@ snapshots: '@types/serve-static@1.15.7': dependencies: '@types/http-errors': 2.0.4 - '@types/node': 12.20.55 + '@types/node': 22.19.1 '@types/send': 0.17.4 '@types/sockjs@0.3.36': dependencies: - '@types/node': 12.20.55 + '@types/node': 22.19.1 '@types/stack-utils@2.0.1': {} @@ -18665,7 +18676,7 @@ snapshots: '@types/ws@8.5.12': dependencies: - '@types/node': 12.20.55 + '@types/node': 22.19.1 '@types/yargs-parser@21.0.3': {} @@ -18935,6 +18946,15 @@ snapshots: '@unrs/resolver-binding-win32-x64-msvc@1.6.2': optional: true + '@vercel/blob@2.0.0': + dependencies: + async-retry: 1.3.3 + is-buffer: 2.0.5 + is-node-process: 1.2.0 + throttleit: 2.1.0 + undici: 5.28.5 + optional: true + '@vercel/nft@0.24.4(encoding@0.1.13)': dependencies: '@mapbox/node-pre-gyp': 1.0.11(encoding@0.1.13) @@ -19579,7 +19599,7 @@ snapshots: dependencies: tslib: 2.8.1 - astro@5.16.0(@types/node@24.10.1)(db0@0.3.4)(ioredis@5.8.2)(jiti@2.6.1)(less@4.2.0)(rollup@4.53.3)(sass@1.77.8)(stylus@0.56.0)(terser@5.44.1)(typescript@5.9.3)(yaml@2.8.0): + astro@5.16.0(@types/node@24.10.1)(@vercel/blob@2.0.0)(db0@0.3.4)(ioredis@5.8.2)(jiti@2.6.1)(less@4.2.0)(rollup@4.53.3)(sass@1.77.8)(stylus@0.56.0)(terser@5.44.1)(typescript@5.9.3)(yaml@2.8.0): dependencies: '@astrojs/compiler': 2.13.0 '@astrojs/internal-helpers': 0.7.5 @@ -19634,7 +19654,7 @@ snapshots: ultrahtml: 1.6.0 unifont: 0.6.0 unist-util-visit: 5.0.0 - unstorage: 1.17.3(db0@0.3.4)(ioredis@5.8.2) + unstorage: 1.17.3(@vercel/blob@2.0.0)(db0@0.3.4)(ioredis@5.8.2) vfile: 6.0.3 vite: 6.4.1(@types/node@24.10.1)(jiti@2.6.1)(less@4.2.0)(sass@1.77.8)(stylus@0.56.0)(terser@5.44.1)(yaml@2.8.0) vitefu: 1.1.1(vite@6.4.1(@types/node@24.10.1)(jiti@2.6.1)(less@4.2.0)(sass@1.77.8)(stylus@0.56.0)(terser@5.44.1)(yaml@2.8.0)) @@ -19685,6 +19705,11 @@ snapshots: async-limiter@1.0.1: {} + async-retry@1.3.3: + dependencies: + retry: 0.13.1 + optional: true + async-sema@3.1.1: {} async@2.6.4: @@ -20248,7 +20273,7 @@ snapshots: chrome-launcher@0.15.2: dependencies: - '@types/node': 24.10.1 + '@types/node': 22.19.1 escape-string-regexp: 4.0.0 is-wsl: 2.2.0 lighthouse-logger: 1.4.2 @@ -20259,7 +20284,7 @@ snapshots: chromium-edge-launcher@0.2.0: dependencies: - '@types/node': 24.10.1 + '@types/node': 22.19.1 escape-string-regexp: 4.0.0 is-wsl: 2.2.0 lighthouse-logger: 1.4.2 @@ -20491,7 +20516,7 @@ snapshots: copy-webpack-plugin@10.2.1(webpack@5.76.1(@swc/core@1.7.23(@swc/helpers@0.5.17))(esbuild@0.14.22)): dependencies: - fast-glob: 3.3.2 + fast-glob: 3.3.3 glob-parent: 6.0.2 globby: 12.2.0 normalize-path: 3.0.0 @@ -21056,7 +21081,7 @@ snapshots: dependencies: '@types/cookie': 0.4.1 '@types/cors': 2.8.17 - '@types/node': 12.20.55 + '@types/node': 22.19.1 accepts: 1.3.8 base64id: 2.0.0 cookie: 0.4.2 @@ -21919,14 +21944,6 @@ snapshots: merge2: 1.4.1 micromatch: 4.0.8 - fast-glob@3.3.2: - dependencies: - '@nodelib/fs.stat': 2.0.5 - '@nodelib/fs.walk': 1.2.8 - glob-parent: 5.1.2 - merge2: 1.4.1 - micromatch: 4.0.8 - fast-glob@3.3.3: dependencies: '@nodelib/fs.stat': 2.0.5 @@ -22362,7 +22379,7 @@ snapshots: dependencies: array-union: 3.0.1 dir-glob: 3.0.1 - fast-glob: 3.3.2 + fast-glob: 3.3.3 ignore: 5.3.2 merge2: 1.4.1 slash: 4.0.0 @@ -22857,6 +22874,9 @@ snapshots: is-buffer@1.1.6: {} + is-buffer@2.0.5: + optional: true + is-builtin-module@3.2.1: dependencies: builtin-modules: 3.3.0 @@ -22927,6 +22947,9 @@ snapshots: is-negative-zero@2.0.3: {} + is-node-process@1.2.0: + optional: true + is-number-object@1.1.1: dependencies: call-bound: 1.0.4 @@ -23126,7 +23149,7 @@ snapshots: dependencies: '@jest/types': 29.6.3 '@types/graceful-fs': 4.1.9 - '@types/node': 24.10.1 + '@types/node': 22.19.1 anymatch: 3.1.3 fb-watchman: 2.0.2 graceful-fs: 4.2.11 @@ -23153,7 +23176,7 @@ snapshots: jest-mock@29.7.0: dependencies: '@jest/types': 29.6.3 - '@types/node': 24.10.1 + '@types/node': 22.19.1 jest-util: 29.7.0 jest-regex-util@29.6.3: {} @@ -23165,7 +23188,7 @@ snapshots: jest-util@29.7.0: dependencies: '@jest/types': 29.6.3 - '@types/node': 24.10.1 + '@types/node': 22.19.1 chalk: 4.1.2 ci-info: 3.8.0 graceful-fs: 4.2.11 @@ -23182,13 +23205,13 @@ snapshots: jest-worker@27.5.1: dependencies: - '@types/node': 12.20.55 + '@types/node': 22.19.1 merge-stream: 2.0.0 supports-color: 8.1.1 jest-worker@29.7.0: dependencies: - '@types/node': 24.10.1 + '@types/node': 22.19.1 jest-util: 29.7.0 merge-stream: 2.0.0 supports-color: 8.1.1 @@ -24593,7 +24616,7 @@ snapshots: node-gyp-build: 4.8.4 optional: true - nitropack@2.8.1(db0@0.3.4)(encoding@0.1.13)(ioredis@5.8.2)(xml2js@0.6.2): + nitropack@2.8.1(@vercel/blob@2.0.0)(db0@0.3.4)(encoding@0.1.13)(ioredis@5.8.2)(xml2js@0.6.2): dependencies: '@cloudflare/kv-asset-handler': 0.3.4 '@netlify/functions': 2.8.2 @@ -24658,7 +24681,7 @@ snapshots: unctx: 2.4.1 unenv: 1.10.0 unimport: 3.14.6(rollup@4.53.3) - unstorage: 1.17.3(db0@0.3.4)(ioredis@5.8.2) + unstorage: 1.17.3(@vercel/blob@2.0.0)(db0@0.3.4)(ioredis@5.8.2) optionalDependencies: xml2js: 0.6.2 transitivePeerDependencies: @@ -25105,7 +25128,7 @@ snapshots: dependencies: ansi-colors: 4.1.3 cli-progress: 3.12.0 - fast-glob: 3.3.2 + fast-glob: 3.3.3 oslllo-potrace: 3.0.0(encoding@0.1.13) oslllo-svg2: 3.0.0(encoding@0.1.13) oslllo-validator: 3.1.0 @@ -25255,7 +25278,7 @@ snapshots: parse-json@5.2.0: dependencies: - '@babel/code-frame': 7.27.1 + '@babel/code-frame': 7.28.6 error-ex: 1.3.2 json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 @@ -27243,7 +27266,7 @@ snapshots: stylus-loader@6.2.0(stylus@0.56.0)(webpack@5.76.1(@swc/core@1.7.23(@swc/helpers@0.5.17))(esbuild@0.14.22)): dependencies: - fast-glob: 3.3.2 + fast-glob: 3.3.3 klona: 2.0.6 normalize-path: 3.0.0 stylus: 0.56.0 @@ -27575,6 +27598,9 @@ snapshots: throat@5.0.0: {} + throttleit@2.1.0: + optional: true + through2@2.0.5: dependencies: readable-stream: 2.3.8 @@ -28036,7 +28062,7 @@ snapshots: '@unrs/resolver-binding-win32-ia32-msvc': 1.6.2 '@unrs/resolver-binding-win32-x64-msvc': 1.6.2 - unstorage@1.17.3(db0@0.3.4)(ioredis@5.8.2): + unstorage@1.17.3(@vercel/blob@2.0.0)(db0@0.3.4)(ioredis@5.8.2): dependencies: anymatch: 3.1.3 chokidar: 4.0.3 @@ -28047,6 +28073,7 @@ snapshots: ofetch: 1.5.1 ufo: 1.6.1 optionalDependencies: + '@vercel/blob': 2.0.0 db0: 0.3.4 ioredis: 5.8.2 diff --git a/tools/build-font/codepoints.json b/tools/build-font/codepoints.json new file mode 100644 index 000000000..f9e1efa48 --- /dev/null +++ b/tools/build-font/codepoints.json @@ -0,0 +1,1914 @@ +{ + "activity": 57400, + "airplay": 57401, + "alarm-clock": 57402, + "album": 57403, + "align-horizontal-distribute-center": 57404, + "align-horizontal-distribute-end": 57405, + "align-horizontal-distribute-start": 57406, + "anchor": 57407, + "aperture": 57408, + "archive": 57409, + "arrow-down": 57410, + "arrow-down-left": 57411, + "arrow-down-narrow-wide": 57412, + "arrow-down-right": 57413, + "arrow-down-up": 57414, + "arrow-down-wide-narrow": 57415, + "arrow-left": 57416, + "arrow-right": 57417, + "arrow-up": 57418, + "arrow-up-left": 57419, + "arrow-up-narrow-wide": 57420, + "arrow-up-right": 57421, + "at-sign": 57422, + "award": 57423, + "axe": 57424, + "ban": 57425, + "banknote": 57426, + "battery": 57427, + "battery-charging": 57428, + "battery-full": 57429, + "battery-low": 57430, + "battery-medium": 57431, + "beaker": 57432, + "bell": 57433, + "bell-off": 57434, + "bitcoin": 57435, + "bluetooth": 57436, + "bold": 57437, + "book": 57438, + "book-open": 57439, + "bookmark": 57440, + "box": 57441, + "briefcase": 57442, + "calendar": 57443, + "camera": 57444, + "camera-off": 57445, + "cast": 57446, + "chart-column-decreasing": 57447, + "chart-no-axes-column": 57448, + "chart-no-axes-column-decreasing": 57449, + "chart-no-axes-column-increasing": 57450, + "chart-pie": 57451, + "check": 57452, + "chevron-down": 57453, + "chevron-left": 57454, + "chevron-right": 57455, + "chevron-up": 57456, + "chevrons-down": 57457, + "chevrons-left": 57458, + "chevrons-right": 57459, + "chevrons-up": 57460, + "chromium": 57461, + "circle": 57462, + "circle-alert": 57463, + "circle-arrow-down": 57464, + "circle-arrow-left": 57465, + "circle-arrow-right": 57466, + "circle-arrow-up": 57467, + "circle-check-big": 57468, + "circle-divide": 57469, + "circle-minus": 57470, + "circle-pause": 57471, + "circle-play": 57472, + "circle-plus": 57473, + "circle-question-mark": 57474, + "circle-stop": 57475, + "circle-x": 57476, + "clipboard": 57477, + "clipboard-list": 57478, + "clock": 57479, + "cloud": 57480, + "cloud-download": 57481, + "cloud-drizzle": 57482, + "cloud-hail": 57483, + "cloud-lightning": 57484, + "cloud-off": 57485, + "cloud-rain": 57486, + "cloud-rain-wind": 57487, + "cloud-snow": 57488, + "cloud-upload": 57489, + "clover": 57490, + "code": 57491, + "codepen": 57492, + "codesandbox": 57493, + "coffee": 57494, + "coins": 57495, + "columns-2": 57496, + "columns-3": 57497, + "command": 57498, + "compass": 57499, + "contact": 57500, + "contrast": 57501, + "copy": 57502, + "copyleft": 57503, + "copyright": 57504, + "corner-down-left": 57505, + "corner-down-right": 57506, + "corner-left-down": 57507, + "corner-left-up": 57508, + "corner-right-down": 57509, + "corner-right-up": 57510, + "corner-up-left": 57511, + "corner-up-right": 57512, + "cpu": 57513, + "credit-card": 57514, + "crop": 57515, + "crosshair": 57516, + "database": 57517, + "delete": 57518, + "disc": 57519, + "divide": 57520, + "dollar-sign": 57521, + "download": 57522, + "dribbble": 57523, + "droplet": 57524, + "droplets": 57525, + "ellipsis": 57526, + "ellipsis-vertical": 57527, + "euro": 57528, + "external-link": 57529, + "eye": 57530, + "eye-off": 57531, + "facebook": 57532, + "fast-forward": 57533, + "feather": 57534, + "figma": 57535, + "file": 57536, + "file-check": 57537, + "file-check-corner": 57538, + "file-code": 57539, + "file-digit": 57540, + "file-input": 57541, + "file-minus": 57542, + "file-minus-corner": 57543, + "file-output": 57544, + "file-plus": 57545, + "file-plus-corner": 57546, + "file-search": 57547, + "file-text": 57548, + "file-x": 57549, + "file-x-corner": 57550, + "files": 57551, + "film": 57552, + "flag": 57553, + "flame": 57554, + "flashlight": 57555, + "flashlight-off": 57556, + "flask-conical": 57557, + "flask-round": 57558, + "folder": 57559, + "folder-minus": 57560, + "folder-plus": 57561, + "framer": 57562, + "frown": 57563, + "funnel": 57564, + "funnel-plus": 57565, + "gamepad": 57566, + "gamepad-2": 57567, + "gavel": 57568, + "gift": 57569, + "git-branch": 57570, + "git-commit-horizontal": 57571, + "git-merge": 57572, + "git-pull-request": 57573, + "github": 57574, + "gitlab": 57575, + "globe": 57576, + "grid-3x3": 57577, + "grip-horizontal": 57578, + "grip-vertical": 57579, + "hammer": 57580, + "hard-drive": 57581, + "hard-hat": 57582, + "hash": 57583, + "haze": 57584, + "headphones": 57585, + "heart": 57586, + "hexagon": 57587, + "highlighter": 57588, + "house": 57589, + "image": 57590, + "inbox": 57591, + "indian-rupee": 57592, + "info": 57593, + "instagram": 57594, + "italic": 57595, + "japanese-yen": 57596, + "key": 57597, + "languages": 57598, + "layout-grid": 57599, + "library": 57600, + "life-buoy": 57601, + "link": 57602, + "link-2": 57603, + "link-2-off": 57604, + "linkedin": 57605, + "list": 57606, + "list-indent-decrease": 57607, + "list-indent-increase": 57608, + "loader": 57609, + "loader-circle": 57610, + "lock": 57611, + "lock-open": 57612, + "log-in": 57613, + "log-out": 57614, + "mail": 57615, + "map": 57616, + "map-pin": 57617, + "maximize": 57618, + "maximize-2": 57619, + "meh": 57620, + "menu": 57621, + "message-circle": 57622, + "message-square": 57623, + "mic": 57624, + "mic-off": 57625, + "minimize": 57626, + "minimize-2": 57627, + "minus": 57628, + "monitor": 57629, + "moon": 57630, + "mouse-pointer": 57631, + "mouse-pointer-click": 57632, + "move": 57633, + "music": 57634, + "navigation": 57635, + "navigation-2": 57636, + "network": 57637, + "octagon": 57638, + "octagon-alert": 57639, + "octagon-x": 57640, + "package": 57641, + "panel-left": 57642, + "panels-left-bottom": 57643, + "panels-top-left": 57644, + "paperclip": 57645, + "pause": 57646, + "pen": 57647, + "pen-line": 57648, + "pen-tool": 57649, + "percent": 57650, + "phone": 57651, + "phone-call": 57652, + "phone-forwarded": 57653, + "phone-incoming": 57654, + "phone-missed": 57655, + "phone-off": 57656, + "phone-outgoing": 57657, + "piggy-bank": 57658, + "pipette": 57659, + "play": 57660, + "plus": 57661, + "pocket": 57662, + "pound-sterling": 57663, + "power": 57664, + "printer": 57665, + "radio": 57666, + "redo": 57667, + "refresh-ccw": 57668, + "refresh-cw": 57669, + "repeat": 57670, + "rewind": 57671, + "rotate-ccw": 57672, + "rotate-cw": 57673, + "rss": 57674, + "ruler": 57675, + "russian-ruble": 57676, + "save": 57677, + "scissors": 57678, + "screen-share": 57679, + "screen-share-off": 57680, + "search": 57681, + "send": 57682, + "server": 57683, + "settings": 57684, + "share": 57685, + "share-2": 57686, + "sheet": 57687, + "shield": 57688, + "shield-ban": 57689, + "shield-off": 57690, + "shopping-bag": 57691, + "shopping-cart": 57692, + "shovel": 57693, + "shuffle": 57694, + "skip-back": 57695, + "skip-forward": 57696, + "slack": 57697, + "sliders-vertical": 57698, + "smartphone": 57699, + "smile": 57700, + "snowflake": 57701, + "speaker": 57702, + "square": 57703, + "square-asterisk": 57704, + "square-chart-gantt": 57705, + "square-check-big": 57706, + "square-code": 57707, + "square-dashed-kanban": 57708, + "square-divide": 57709, + "square-dot": 57710, + "square-equal": 57711, + "square-kanban": 57712, + "square-minus": 57713, + "square-pen": 57714, + "square-plus": 57715, + "square-slash": 57716, + "square-x": 57717, + "star": 57718, + "strikethrough": 57719, + "sun": 57720, + "sunrise": 57721, + "sunset": 57722, + "swiss-franc": 57723, + "switch-camera": 57724, + "table": 57725, + "tablet": 57726, + "tag": 57727, + "target": 57728, + "terminal": 57729, + "text-align-center": 57730, + "text-align-end": 57731, + "text-align-justify": 57732, + "text-align-start": 57733, + "thermometer": 57734, + "thermometer-snowflake": 57735, + "thermometer-sun": 57736, + "thumbs-down": 57737, + "thumbs-up": 57738, + "toggle-left": 57739, + "toggle-right": 57740, + "trash": 57741, + "trash-2": 57742, + "trello": 57743, + "trending-down": 57744, + "trending-up": 57745, + "triangle": 57746, + "triangle-alert": 57747, + "truck": 57748, + "tv": 57749, + "twitch": 57750, + "twitter": 57751, + "type": 57752, + "umbrella": 57753, + "underline": 57754, + "undo": 57755, + "unlink": 57756, + "unlink-2": 57757, + "upload": 57758, + "user": 57759, + "user-check": 57760, + "user-minus": 57761, + "user-plus": 57762, + "user-x": 57763, + "users": 57764, + "video": 57765, + "video-off": 57766, + "view": 57767, + "voicemail": 57768, + "volume": 57769, + "volume-1": 57770, + "volume-2": 57771, + "volume-x": 57772, + "watch": 57773, + "wifi": 57774, + "wifi-off": 57775, + "wind": 57776, + "wrench": 57777, + "x": 57778, + "youtube": 57779, + "zap": 57780, + "zap-off": 57781, + "zoom-in": 57782, + "zoom-out": 57783, + "bluetooth-connected": 57784, + "bluetooth-off": 57785, + "bluetooth-searching": 57786, + "bot": 57787, + "calculator": 57788, + "equal": 57789, + "equal-not": 57790, + "gauge": 57791, + "image-off": 57792, + "layout-dashboard": 57793, + "lightbulb": 57794, + "mouse-pointer-2": 57795, + "move-diagonal": 57796, + "move-diagonal-2": 57797, + "move-horizontal": 57798, + "move-vertical": 57799, + "separator-horizontal": 57800, + "separator-vertical": 57801, + "shirt": 57802, + "square-dashed": 57803, + "building": 57804, + "laptop": 57805, + "lasso": 57806, + "lasso-select": 57807, + "list-checks": 57808, + "list-ordered": 57809, + "bike": 57810, + "brush": 57811, + "bus": 57812, + "car": 57813, + "crown": 57814, + "hand": 57815, + "laptop-minimal": 57816, + "layout-list": 57817, + "locate": 57818, + "locate-fixed": 57819, + "monitor-off": 57820, + "palette": 57821, + "plane": 57822, + "qr-code": 57823, + "timer": 57824, + "arrow-big-down": 57825, + "arrow-big-left": 57826, + "arrow-big-right": 57827, + "arrow-big-up": 57828, + "cross": 57829, + "hand-grab": 57830, + "infinity": 57831, + "pointer": 57832, + "server-crash": 57833, + "server-off": 57834, + "sprout": 57835, + "alarm-clock-check": 57836, + "alarm-clock-minus": 57837, + "alarm-clock-plus": 57838, + "asterisk": 57839, + "bell-minus": 57840, + "bell-plus": 57841, + "binary": 57842, + "earth": 57843, + "git-branch-plus": 57844, + "history": 57845, + "image-minus": 57846, + "image-plus": 57847, + "option": 57848, + "pencil": 57849, + "podcast": 57850, + "radio-receiver": 57851, + "regex": 57852, + "repeat-1": 57853, + "shield-alert": 57854, + "shield-check": 57855, + "shield-x": 57856, + "sigma": 57857, + "square-mouse-pointer": 57858, + "tv-minimal": 57859, + "wallet": 57860, + "webcam": 57861, + "code-xml": 57862, + "layout-template": 57863, + "lightbulb-off": 57864, + "power-off": 57865, + "square-terminal": 57866, + "star-half": 57867, + "bug": 57868, + "glasses": 57869, + "ghost": 57870, + "ticket": 57871, + "monitor-speaker": 57872, + "chevrons-up-down": 57873, + "scale": 57874, + "circle-slash-2": 57875, + "cloud-fog": 57876, + "cloud-moon": 57877, + "cloud-sun": 57878, + "cloudy": 57879, + "tornado": 57880, + "clipboard-check": 57881, + "expand": 57882, + "octagon-pause": 57883, + "panel-left-close": 57884, + "panel-left-open": 57885, + "person-standing": 57886, + "rectangle-ellipsis": 57887, + "shrink": 57888, + "skull": 57889, + "clipboard-x": 57890, + "vibrate": 57891, + "bell-ring": 57892, + "clipboard-copy": 57893, + "circle-check": 57894, + "tent": 57895, + "chevrons-down-up": 57896, + "forward": 57897, + "reply": 57898, + "reply-all": 57899, + "hand-metal": 57900, + "square-function": 57901, + "smartphone-charging": 57902, + "import": 57903, + "currency": 57904, + "mountain": 57905, + "mountain-snow": 57906, + "rocking-chair": 57907, + "graduation-cap": 57908, + "megaphone": 57909, + "timer-reset": 57910, + "flag-triangle-left": 57911, + "flag-triangle-right": 57912, + "quote": 57913, + "landmark": 57914, + "alarm-clock-off": 57915, + "bookmark-minus": 57916, + "bookmark-plus": 57917, + "list-minus": 57918, + "list-plus": 57919, + "list-x": 57920, + "badge-check": 57921, + "gem": 57922, + "chevron-first": 57923, + "chevron-last": 57924, + "settings-2": 57925, + "wand": 57926, + "folder-open": 57927, + "text-wrap": 57928, + "timer-off": 57929, + "arrow-left-right": 57930, + "clock-1": 57931, + "clock-10": 57932, + "clock-11": 57933, + "clock-12": 57934, + "clock-2": 57935, + "clock-3": 57936, + "clock-4": 57937, + "clock-5": 57938, + "clock-6": 57939, + "clock-7": 57940, + "clock-8": 57941, + "clock-9": 57942, + "scan": 57943, + "scan-line": 57944, + "pin": 57945, + "carrot": 57946, + "drumstick": 57947, + "subscript": 57948, + "egg": 57949, + "superscript": 57950, + "signal": 57951, + "signal-high": 57952, + "signal-low": 57953, + "signal-medium": 57954, + "signal-zero": 57955, + "text-cursor": 57956, + "text-cursor-input": 57957, + "package-check": 57958, + "package-minus": 57959, + "package-plus": 57960, + "package-search": 57961, + "package-x": 57962, + "cookie": 57963, + "align-center-horizontal": 57964, + "align-center-vertical": 57965, + "align-end-horizontal": 57966, + "align-end-vertical": 57967, + "align-start-horizontal": 57968, + "align-start-vertical": 57969, + "align-horizontal-justify-center": 57970, + "align-horizontal-justify-end": 57971, + "align-horizontal-justify-start": 57972, + "align-horizontal-space-around": 57973, + "align-horizontal-space-between": 57974, + "align-vertical-justify-center": 57975, + "align-vertical-justify-end": 57976, + "align-vertical-justify-start": 57977, + "align-vertical-space-around": 57978, + "align-vertical-space-between": 57979, + "stretch-horizontal": 57980, + "stretch-vertical": 57981, + "align-vertical-distribute-center": 57982, + "align-vertical-distribute-end": 57983, + "align-vertical-distribute-start": 57984, + "tree-palm": 57985, + "locate-off": 57986, + "waves": 57987, + "keyboard": 57988, + "baseline": 57989, + "rocket": 57990, + "dice-1": 57991, + "dice-2": 57992, + "dice-3": 57993, + "dice-4": 57994, + "dice-5": 57995, + "dice-6": 57996, + "git-fork": 57997, + "mouse": 57998, + "eraser": 57999, + "building-2": 58000, + "frame": 58001, + "flag-off": 58002, + "chevrons-left-right": 58003, + "chevrons-right-left": 58004, + "heart-off": 58005, + "hourglass": 58006, + "accessibility": 58007, + "milestone": 58008, + "sun-dim": 58009, + "sliders-horizontal": 58010, + "clapperboard": 58011, + "puzzle": 58012, + "vibrate-off": 58013, + "focus": 58014, + "factory": 58015, + "redo-2": 58016, + "undo-2": 58017, + "chart-bar": 58018, + "chart-column": 58019, + "chart-column-increasing": 58020, + "chart-line": 58021, + "map-pin-off": 58022, + "navigation-2-off": 58023, + "navigation-off": 58024, + "tram-front": 58025, + "venetian-mask": 58026, + "bath": 58027, + "chef-hat": 58028, + "component": 58029, + "croissant": 58030, + "fuel": 58031, + "star-off": 58032, + "sun-medium": 58033, + "sun-moon": 58034, + "sword": 58035, + "swords": 58036, + "magnet": 58037, + "pin-off": 58038, + "calendar-check": 58039, + "calendar-check-2": 58040, + "calendar-days": 58041, + "calendar-minus": 58042, + "calendar-off": 58043, + "calendar-plus": 58044, + "calendar-range": 58045, + "calendar-x": 58046, + "calendar-x-2": 58047, + "armchair": 58048, + "bed": 58049, + "bed-double": 58050, + "bed-single": 58051, + "sofa": 58052, + "dices": 58053, + "cigarette": 58054, + "cigarette-off": 58055, + "backpack": 58056, + "baggage-claim": 58057, + "luggage": 58058, + "fingerprint-pattern": 58059, + "package-open": 58060, + "archive-restore": 58061, + "baby": 58062, + "beer": 58063, + "boxes": 58064, + "cup-soda": 58065, + "diamond": 58066, + "flower": 58067, + "flower-2": 58068, + "glass-water": 58069, + "heart-crack": 58070, + "heart-handshake": 58071, + "lamp": 58072, + "lamp-ceiling": 58073, + "lamp-desk": 58074, + "lamp-floor": 58075, + "lamp-wall-down": 58076, + "lamp-wall-up": 58077, + "leaf": 58078, + "list-end": 58079, + "list-music": 58080, + "list-start": 58081, + "list-video": 58082, + "martini": 58083, + "microscope": 58084, + "move-3d": 58085, + "paint-bucket": 58086, + "paintbrush": 58087, + "paintbrush-vertical": 58088, + "recycle": 58089, + "rotate-3d": 58090, + "scale-3d": 58091, + "scaling": 58092, + "scroll": 58093, + "shrub": 58094, + "siren": 58095, + "slice": 58096, + "stethoscope": 58097, + "syringe": 58098, + "tree-deciduous": 58099, + "tree-pine": 58100, + "trees": 58101, + "utensils": 58102, + "utensils-crossed": 58103, + "wine": 58104, + "table-2": 58105, + "cloud-moon-rain": 58106, + "cloud-sun-rain": 58107, + "angry": 58108, + "annoyed": 58109, + "axis-3d": 58110, + "bomb": 58111, + "laugh": 58112, + "smile-plus": 58113, + "sticker": 58114, + "sticky-note": 58115, + "calendar-clock": 58116, + "calendar-heart": 58117, + "calendar-search": 58118, + "clipboard-pen": 58119, + "clipboard-pen-line": 58120, + "clipboard-type": 58121, + "cloud-cog": 58122, + "cog": 58123, + "diff": 58124, + "file-archive": 58125, + "file-axis-3d": 58126, + "file-badge": 58127, + "file-box": 58128, + "file-chart-column": 58129, + "file-chart-column-increasing": 58130, + "file-chart-line": 58131, + "file-chart-pie": 58132, + "file-clock": 58133, + "file-cog": 58134, + "file-diff": 58135, + "file-down": 58136, + "file-exclamation-point": 58137, + "file-headphone": 58138, + "file-heart": 58139, + "file-image": 58140, + "file-key": 58141, + "file-lock": 58142, + "file-pen": 58143, + "file-pen-line": 58144, + "file-play": 58145, + "file-question-mark": 58146, + "file-scan": 58147, + "file-search-corner": 58148, + "file-signal": 58149, + "file-spreadsheet": 58150, + "file-symlink": 58151, + "file-terminal": 58152, + "file-type": 58153, + "file-up": 58154, + "file-video-camera": 58155, + "file-volume": 58156, + "folder-archive": 58157, + "folder-check": 58158, + "folder-clock": 58159, + "folder-closed": 58160, + "folder-cog": 58161, + "folder-down": 58162, + "folder-heart": 58163, + "folder-input": 58164, + "folder-key": 58165, + "folder-lock": 58166, + "folder-output": 58167, + "folder-pen": 58168, + "folder-search": 58169, + "folder-search-2": 58170, + "folder-symlink": 58171, + "folder-tree": 58172, + "folder-up": 58173, + "folder-x": 58174, + "folders": 58175, + "package-2": 58176, + "server-cog": 58177, + "user-cog": 58178, + "party-popper": 58179, + "cake": 58180, + "circle-dot": 58181, + "circle-ellipsis": 58182, + "toy-brick": 58183, + "newspaper": 58184, + "mic-vocal": 58185, + "music-2": 58186, + "music-3": 58187, + "music-4": 58188, + "air-vent": 58189, + "apple": 58190, + "banana": 58191, + "cherry": 58192, + "egg-fried": 58193, + "grape": 58194, + "ice-cream-cone": 58195, + "pizza": 58196, + "joystick": 58197, + "usb": 58198, + "wand-sparkles": 58199, + "bone": 58200, + "git-compare": 58201, + "git-pull-request-closed": 58202, + "git-pull-request-draft": 58203, + "tags": 58204, + "flip-horizontal": 58205, + "flip-horizontal-2": 58206, + "flip-vertical": 58207, + "flip-vertical-2": 58208, + "mail-check": 58209, + "mail-minus": 58210, + "mail-open": 58211, + "mail-plus": 58212, + "mail-question-mark": 58213, + "mail-search": 58214, + "mail-warning": 58215, + "mail-x": 58216, + "mails": 58217, + "braces": 58218, + "file-braces": 58219, + "file-braces-corner": 58220, + "file-type-corner": 58221, + "heart-pulse": 58222, + "medal": 58223, + "megaphone-off": 58224, + "scan-face": 58225, + "sun-snow": 58226, + "trophy": 58227, + "webhook": 58228, + "citrus": 58229, + "rectangle-horizontal": 58230, + "rectangle-vertical": 58231, + "concierge-bell": 58232, + "fan": 58233, + "microwave": 58234, + "refrigerator": 58235, + "shower-head": 58236, + "arrow-up-down": 58237, + "sailboat": 58238, + "plug": 58239, + "plug-2": 58240, + "book-open-check": 58241, + "ear": 58242, + "ear-off": 58243, + "heading": 58244, + "heading-1": 58245, + "heading-2": 58246, + "heading-3": 58247, + "heading-4": 58248, + "heading-5": 58249, + "heading-6": 58250, + "spline": 58251, + "cat": 58252, + "dog": 58253, + "check-check": 58254, + "bean": 58255, + "bean-off": 58256, + "candy": 58257, + "candy-off": 58258, + "dna": 58259, + "dna-off": 58260, + "egg-off": 58261, + "flask-conical-off": 58262, + "hop": 58263, + "hop-off": 58264, + "milk": 58265, + "milk-off": 58266, + "nut": 58267, + "nut-off": 58268, + "vegan": 58269, + "wheat": 58270, + "wheat-off": 58271, + "wine-off": 58272, + "dumbbell": 58273, + "monitor-smartphone": 58274, + "pilcrow": 58275, + "captions": 58276, + "beef": 58277, + "fish": 58278, + "ice-cream-bowl": 58279, + "salad": 58280, + "sandwich": 58281, + "soup": 58282, + "database-backup": 58283, + "battery-warning": 58284, + "vote": 58285, + "picture-in-picture": 58286, + "picture-in-picture-2": 58287, + "fish-off": 58288, + "grip": 58289, + "creative-commons": 58290, + "remove-formatting": 58291, + "construction": 58292, + "funnel-x": 58293, + "square-split-horizontal": 58294, + "square-split-vertical": 58295, + "hand-helping": 58296, + "footprints": 58297, + "ship": 58298, + "stamp": 58299, + "tower-control": 58300, + "pill": 58301, + "tablets": 58302, + "router": 58303, + "blinds": 58304, + "forklift": 58305, + "utility-pole": 58306, + "nfc": 58307, + "smartphone-nfc": 58308, + "bird": 58309, + "brain": 58310, + "brain-circuit": 58311, + "brain-cog": 58312, + "circle-parking": 58313, + "circle-parking-off": 58314, + "square-parking": 58315, + "square-parking-off": 58316, + "plane-landing": 58317, + "plane-takeoff": 58318, + "square-chevron-down": 58319, + "square-chevron-left": 58320, + "square-chevron-right": 58321, + "square-chevron-up": 58322, + "receipt": 58323, + "mailbox": 58324, + "door-closed": 58325, + "door-open": 58326, + "atom": 58327, + "case-lower": 58328, + "case-sensitive": 58329, + "case-upper": 58330, + "replace": 58331, + "replace-all": 58332, + "space": 58333, + "text-select": 58334, + "whole-word": 58335, + "castle": 58336, + "church": 58337, + "hotel": 58338, + "school": 58339, + "store": 58340, + "university": 58341, + "warehouse": 58342, + "orbit": 58343, + "clipboard-paste": 58344, + "step-back": 58345, + "step-forward": 58346, + "rat": 58347, + "book-copy": 58348, + "book-dashed": 58349, + "book-down": 58350, + "book-key": 58351, + "book-lock": 58352, + "book-marked": 58353, + "book-minus": 58354, + "book-plus": 58355, + "book-up": 58356, + "book-x": 58357, + "disc-2": 58358, + "circle-arrow-out-down-left": 58359, + "circle-arrow-out-down-right": 58360, + "circle-arrow-out-up-left": 58361, + "circle-arrow-out-up-right": 58362, + "copy-check": 58363, + "copy-minus": 58364, + "copy-plus": 58365, + "copy-slash": 58366, + "copy-x": 58367, + "circle-equal": 58368, + "circle-off": 58369, + "circle-slash": 58370, + "circuit-board": 58371, + "radio-tower": 58372, + "test-tube": 58373, + "test-tube-diagonal": 58374, + "test-tubes": 58375, + "list-tree": 58376, + "folder-git": 58377, + "folder-git-2": 58378, + "message-square-dashed": 58379, + "message-square-plus": 58380, + "messages-square": 58381, + "shield-question-mark": 58382, + "save-all": 58383, + "moon-star": 58384, + "repeat-2": 58385, + "sparkles": 58386, + "arrow-down-0-1": 58387, + "arrow-down-1-0": 58388, + "arrow-down-a-z": 58389, + "arrow-down-z-a": 58390, + "arrow-right-left": 58391, + "arrow-up-0-1": 58392, + "arrow-up-1-0": 58393, + "arrow-up-a-z": 58394, + "arrow-up-wide-narrow": 58395, + "arrow-up-z-a": 58396, + "arrow-big-down-dash": 58397, + "arrow-big-left-dash": 58398, + "arrow-big-right-dash": 58399, + "arrow-big-up-dash": 58400, + "monitor-down": 58401, + "monitor-up": 58402, + "iteration-ccw": 58403, + "iteration-cw": 58404, + "workflow": 58405, + "app-window": 58406, + "square-arrow-down": 58407, + "square-arrow-left": 58408, + "square-arrow-right": 58409, + "square-arrow-up": 58410, + "bell-dot": 58411, + "panel-bottom": 58412, + "panel-bottom-close": 58413, + "panel-bottom-dashed": 58414, + "panel-bottom-open": 58415, + "panel-left-dashed": 58416, + "panel-right": 58417, + "panel-right-close": 58418, + "panel-right-dashed": 58419, + "panel-right-open": 58420, + "panel-top": 58421, + "panel-top-close": 58422, + "panel-top-dashed": 58423, + "panel-top-open": 58424, + "rows-2": 58425, + "ligature": 58426, + "fold-horizontal": 58427, + "fold-vertical": 58428, + "unfold-horizontal": 58429, + "unfold-vertical": 58430, + "merge": 58431, + "split": 58432, + "biohazard": 58433, + "radiation": 58434, + "brackets": 58435, + "parentheses": 58436, + "memory-stick": 58437, + "pc-case": 58438, + "satellite": 58439, + "satellite-dish": 58440, + "touchpad": 58441, + "touchpad-off": 58442, + "wallpaper": 58443, + "combine": 58444, + "arrow-down-to-dot": 58445, + "arrow-up-from-dot": 58446, + "dot": 58447, + "redo-dot": 58448, + "undo-dot": 58449, + "list-restart": 58450, + "square-menu": 58451, + "arrow-down-from-line": 58452, + "arrow-down-to-line": 58453, + "arrow-left-from-line": 58454, + "arrow-left-to-line": 58455, + "arrow-right-from-line": 58456, + "arrow-right-to-line": 58457, + "arrow-up-from-line": 58458, + "arrow-up-to-line": 58459, + "plug-zap": 58460, + "unplug": 58461, + "file-code-corner": 58462, + "scroll-text": 58463, + "list-filter": 58464, + "circle-user": 58465, + "circle-user-round": 58466, + "contact-round": 58467, + "group": 58468, + "square-user": 58469, + "square-user-round": 58470, + "ungroup": 58471, + "user-round": 58472, + "user-round-check": 58473, + "user-round-cog": 58474, + "user-round-minus": 58475, + "user-round-plus": 58476, + "user-round-x": 58477, + "users-round": 58478, + "leafy-green": 58479, + "layout-panel-left": 58480, + "layout-panel-top": 58481, + "pi": 58482, + "variable": 58483, + "badge": 58484, + "badge-alert": 58485, + "badge-dollar-sign": 58486, + "badge-info": 58487, + "badge-minus": 58488, + "badge-percent": 58489, + "badge-plus": 58490, + "badge-question-mark": 58491, + "badge-x": 58492, + "circle-dollar-sign": 58493, + "sparkle": 58494, + "ferris-wheel": 58495, + "roller-coaster": 58496, + "square-play": 58497, + "monitor-check": 58498, + "monitor-dot": 58499, + "monitor-pause": 58500, + "monitor-play": 58501, + "monitor-stop": 58502, + "monitor-x": 58503, + "square-pi": 58504, + "square-sigma": 58505, + "chart-scatter": 58506, + "square-pilcrow": 58507, + "move-down": 58508, + "move-down-left": 58509, + "move-down-right": 58510, + "move-left": 58511, + "move-right": 58512, + "move-up": 58513, + "move-up-left": 58514, + "move-up-right": 58515, + "disc-3": 58516, + "spray-can": 58517, + "club": 58518, + "radar": 58519, + "refresh-cw-off": 58520, + "spade": 58521, + "spell-check": 58522, + "spell-check-2": 58523, + "ampersand": 58524, + "ampersands": 58525, + "text-quote": 58526, + "squirrel": 58527, + "pocket-knife": 58528, + "file-stack": 58529, + "square-stack": 58530, + "key-round": 58531, + "key-square": 58532, + "goal": 58533, + "book-up-2": 58534, + "chart-bar-big": 58535, + "chart-candlestick": 58536, + "chart-column-big": 58537, + "search-check": 58538, + "search-code": 58539, + "search-slash": 58540, + "search-x": 58541, + "presentation": 58542, + "projector": 58543, + "circle-dashed": 58544, + "circle-dot-dashed": 58545, + "refresh-ccw-dot": 58546, + "shapes": 58547, + "square-activity": 58548, + "square-arrow-down-left": 58549, + "square-arrow-down-right": 58550, + "square-arrow-up-left": 58551, + "square-arrow-up-right": 58552, + "cake-slice": 58553, + "candy-cane": 58554, + "dessert": 58555, + "donut": 58556, + "lollipop": 58557, + "popcorn": 58558, + "popsicle": 58559, + "square-dashed-bottom": 58560, + "square-dashed-bottom-code": 58561, + "rainbow": 58562, + "list-todo": 58563, + "chart-no-axes-gantt": 58564, + "folder-dot": 58565, + "folder-kanban": 58566, + "folder-open-dot": 58567, + "folder-root": 58568, + "folder-sync": 58569, + "cassette-tape": 58570, + "videotape": 58571, + "wallet-cards": 58572, + "wallet-minimal": 58573, + "gallery-horizontal": 58574, + "gallery-horizontal-end": 58575, + "gallery-thumbnails": 58576, + "gallery-vertical": 58577, + "gallery-vertical-end": 58578, + "chart-area": 58579, + "arrows-up-from-line": 58580, + "container": 58581, + "tally-1": 58582, + "tally-2": 58583, + "tally-3": 58584, + "tally-4": 58585, + "tally-5": 58586, + "table-properties": 58587, + "kanban": 58588, + "circle-chevron-down": 58589, + "circle-chevron-left": 58590, + "circle-chevron-right": 58591, + "circle-chevron-up": 58592, + "circle-gauge": 58593, + "antenna": 58594, + "cable": 58595, + "computer": 58596, + "hard-drive-download": 58597, + "hard-drive-upload": 58598, + "hdmi-port": 58599, + "ratio": 58600, + "scissors-line-dashed": 58601, + "shopping-basket": 58602, + "square-bottom-dashed-scissors": 58603, + "square-scissors": 58604, + "triangle-right": 58605, + "boom-box": 58606, + "bring-to-front": 58607, + "pencil-line": 58608, + "pencil-ruler": 58609, + "send-horizontal": 58610, + "send-to-back": 58611, + "fish-symbol": 58612, + "paw-print": 58613, + "rabbit": 58614, + "shell": 58615, + "snail": 58616, + "turtle": 58617, + "blocks": 58618, + "bus-front": 58619, + "cable-car": 58620, + "car-front": 58621, + "car-taxi-front": 58622, + "grid-2x2": 58623, + "parking-meter": 58624, + "rail-symbol": 58625, + "ship-wheel": 58626, + "square-m": 58627, + "tractor": 58628, + "traffic-cone": 58629, + "train-front": 58630, + "train-front-tunnel": 58631, + "train-track": 58632, + "square-dashed-mouse-pointer": 58633, + "tablet-smartphone": 58634, + "database-zap": 58635, + "archive-x": 58636, + "bug-off": 58637, + "bug-play": 58638, + "badge-cent": 58639, + "badge-euro": 58640, + "badge-indian-rupee": 58641, + "badge-japanese-yen": 58642, + "badge-pound-sterling": 58643, + "badge-russian-ruble": 58644, + "badge-swiss-franc": 58645, + "shield-ellipsis": 58646, + "shield-half": 58647, + "shield-minus": 58648, + "shield-plus": 58649, + "circle-percent": 58650, + "diamond-percent": 58651, + "square-percent": 58652, + "slash": 58653, + "speech": 58654, + "bookmark-check": 58655, + "bookmark-x": 58656, + "drama": 58657, + "theater": 58658, + "cone": 58659, + "cuboid": 58660, + "cylinder": 58661, + "diameter": 58662, + "drafting-compass": 58663, + "land-plot": 58664, + "layers": 58665, + "layers-2": 58666, + "pentagon": 58667, + "pyramid": 58668, + "radius": 58669, + "tangent": 58670, + "torus": 58671, + "weight": 58672, + "lock-keyhole": 58673, + "lock-keyhole-open": 58674, + "barcode": 58675, + "fullscreen": 58676, + "scan-barcode": 58677, + "scan-eye": 58678, + "scan-search": 58679, + "scan-text": 58680, + "caravan": 58681, + "flame-kindling": 58682, + "tent-tree": 58683, + "image-down": 58684, + "map-pinned": 58685, + "route": 58686, + "route-off": 58687, + "signpost": 58688, + "signpost-big": 58689, + "waypoints": 58690, + "umbrella-off": 58691, + "book-a": 58692, + "book-audio": 58693, + "book-check": 58694, + "book-headphones": 58695, + "book-heart": 58696, + "book-image": 58697, + "book-open-text": 58698, + "book-text": 58699, + "book-type": 58700, + "book-user": 58701, + "library-big": 58702, + "square-library": 58703, + "circle-power": 58704, + "square-power": 58705, + "git-commit-vertical": 58706, + "git-compare-arrows": 58707, + "git-graph": 58708, + "git-pull-request-arrow": 58709, + "git-pull-request-create": 58710, + "git-pull-request-create-arrow": 58711, + "ribbon": 58712, + "square-check": 58713, + "audio-lines": 58714, + "audio-waveform": 58715, + "disc-album": 58716, + "drum": 58717, + "file-music": 58718, + "guitar": 58719, + "keyboard-music": 58720, + "piano": 58721, + "message-circle-code": 58722, + "message-circle-dashed": 58723, + "message-circle-heart": 58724, + "message-circle-more": 58725, + "message-circle-off": 58726, + "message-circle-plus": 58727, + "message-circle-question-mark": 58728, + "message-circle-reply": 58729, + "message-circle-warning": 58730, + "message-circle-x": 58731, + "message-square-code": 58732, + "message-square-diff": 58733, + "message-square-dot": 58734, + "message-square-heart": 58735, + "message-square-more": 58736, + "message-square-off": 58737, + "message-square-quote": 58738, + "message-square-reply": 58739, + "message-square-share": 58740, + "message-square-text": 58741, + "message-square-warning": 58742, + "message-square-x": 58743, + "user-round-search": 58744, + "user-search": 58745, + "squircle": 58746, + "alarm-smoke": 58747, + "bell-electric": 58748, + "cctv": 58749, + "fire-extinguisher": 58750, + "pointer-off": 58751, + "anvil": 58752, + "brick-wall": 58753, + "fence": 58754, + "inspection-panel": 58755, + "cooking-pot": 58756, + "a-arrow-down": 58757, + "a-arrow-up": 58758, + "a-large-small": 58759, + "panels-right-bottom": 58760, + "columns-4": 58761, + "rows-3": 58762, + "rows-4": 58763, + "bolt": 58764, + "drill": 58765, + "heater": 58766, + "vault": 58767, + "washing-machine": 58768, + "between-horizontal-end": 58769, + "between-horizontal-start": 58770, + "between-vertical-end": 58771, + "between-vertical-start": 58772, + "notebook": 58773, + "notebook-pen": 58774, + "notebook-tabs": 58775, + "notebook-text": 58776, + "notepad-text": 58777, + "notepad-text-dashed": 58778, + "list-collapse": 58779, + "blend": 58780, + "eclipse": 58781, + "paint-roller": 58782, + "swatch-book": 58783, + "file-sliders": 58784, + "square-arrow-out-down-left": 58785, + "square-arrow-out-down-right": 58786, + "square-arrow-out-up-left": 58787, + "square-arrow-out-up-right": 58788, + "receipt-cent": 58789, + "receipt-euro": 58790, + "receipt-indian-rupee": 58791, + "receipt-japanese-yen": 58792, + "receipt-pound-sterling": 58793, + "receipt-russian-ruble": 58794, + "receipt-swiss-franc": 58795, + "receipt-text": 58796, + "text-search": 58797, + "ticket-check": 58798, + "ticket-minus": 58799, + "ticket-percent": 58800, + "ticket-plus": 58801, + "ticket-slash": 58802, + "ticket-x": 58803, + "calendar-fold": 58804, + "calendar-minus-2": 58805, + "calendar-plus-2": 58806, + "webhook-off": 58807, + "hand-coins": 58808, + "hand-heart": 58809, + "hand-platter": 58810, + "ambulance": 58811, + "circle-fading-plus": 58812, + "headset": 58813, + "clipboard-minus": 58814, + "clipboard-plus": 58815, + "handshake": 58816, + "captions-off": 58817, + "radical": 58818, + "square-radical": 58819, + "images": 58820, + "telescope": 58821, + "pickaxe": 58822, + "table-cells-merge": 58823, + "table-cells-split": 58824, + "table-columns-split": 58825, + "table-rows-split": 58826, + "image-up": 58827, + "earth-lock": 58828, + "globe-lock": 58829, + "bot-message-square": 58830, + "proportions": 58831, + "rotate-ccw-square": 58832, + "rotate-cw-square": 58833, + "app-window-mac": 58834, + "dock": 58835, + "cannabis": 58836, + "briefcase-business": 58837, + "briefcase-medical": 58838, + "ham": 58839, + "hospital": 58840, + "beer-off": 58841, + "worm": 58842, + "mouse-off": 58843, + "pilcrow-left": 58844, + "pilcrow-right": 58845, + "keyboard-off": 58846, + "image-play": 58847, + "bot-off": 58848, + "diamond-minus": 58849, + "diamond-plus": 58850, + "origami": 58851, + "grid-2x2-check": 58852, + "grid-2x2-x": 58853, + "loader-pinwheel": 58854, + "mouse-pointer-ban": 58855, + "section": 58856, + "lectern": 58857, + "pill-bottle": 58858, + "biceps-flexed": 58859, + "tv-minimal-play": 58860, + "calendar-cog": 58861, + "pen-off": 58862, + "pencil-off": 58863, + "house-plug": 58864, + "house-plus": 58865, + "signature": 58866, + "save-off": 58867, + "logs": 58868, + "printer-check": 58869, + "scan-qr-code": 58870, + "wifi-high": 58871, + "wifi-low": 58872, + "wifi-zero": 58873, + "list-check": 58874, + "folder-code": 58875, + "user-pen": 58876, + "user-round-pen": 58877, + "calendar-arrow-down": 58878, + "calendar-arrow-up": 58879, + "clock-arrow-down": 58880, + "clock-arrow-up": 58881, + "type-outline": 58882, + "monitor-cog": 58883, + "philippine-peso": 58884, + "text-initial": 58885, + "dam": 58886, + "chart-bar-decreasing": 58887, + "chart-bar-increasing": 58888, + "chart-bar-stacked": 58889, + "chart-column-stacked": 58890, + "chart-network": 58891, + "chart-no-axes-combined": 58892, + "chart-spline": 58893, + "square-square": 58894, + "map-pin-check": 58895, + "map-pin-check-inside": 58896, + "map-pin-minus": 58897, + "map-pin-minus-inside": 58898, + "map-pin-plus": 58899, + "map-pin-plus-inside": 58900, + "map-pin-x": 58901, + "map-pin-x-inside": 58902, + "id-card": 58903, + "circle-fading-arrow-up": 58904, + "omega": 58905, + "microchip": 58906, + "amphora": 58907, + "map-pin-house": 58908, + "bandage": 58909, + "table-of-contents": 58910, + "chevrons-left-right-ellipsis": 58911, + "ethernet-port": 58912, + "binoculars": 58913, + "tickets": 58914, + "tickets-plane": 58915, + "chart-gantt": 58916, + "trending-up-down": 58917, + "volume-off": 58918, + "octagon-minus": 58919, + "grid-2x2-plus": 58920, + "headphone-off": 58921, + "clock-alert": 58922, + "briefcase-conveyor-belt": 58923, + "message-square-lock": 58924, + "file-user": 58925, + "eye-closed": 58926, + "volleyball": 58927, + "calendar-1": 58928, + "wind-arrow-down": 58929, + "laptop-minimal-check": 58930, + "cloud-alert": 58931, + "equal-approximately": 58932, + "toilet": 58933, + "calendar-sync": 58934, + "image-upscale": 58935, + "droplet-off": 58936, + "list-filter-plus": 58937, + "scan-heart": 58938, + "waves-ladder": 58939, + "house-wifi": 58940, + "triangle-dashed": 58941, + "battery-plus": 58942, + "map-plus": 58943, + "circle-small": 58944, + "mars": 58945, + "mars-stroke": 58946, + "non-binary": 58947, + "transgender": 58948, + "venus": 58949, + "venus-and-mars": 58950, + "shield-user": 58951, + "square-round-corner": 58952, + "shrimp": 58953, + "clock-fading": 58954, + "saudi-riyal": 58955, + "banknote-arrow-down": 58956, + "banknote-arrow-up": 58957, + "banknote-x": 58958, + "spline-pointer": 58959, + "rotate-ccw-key": 58960, + "heart-minus": 58961, + "heart-plus": 58962, + "brick-wall-fire": 58963, + "bubbles": 58964, + "map-pin-pen": 58965, + "rectangle-goggles": 58966, + "squares-exclude": 58967, + "squares-intersect": 58968, + "squares-subtract": 58969, + "squares-unite": 58970, + "shredder": 58971, + "decimals-arrow-left": 58972, + "decimals-arrow-right": 58973, + "bow-arrow": 58974, + "truck-electric": 58975, + "user-lock": 58976, + "columns-3-cog": 58977, + "ruler-dimension-line": 58978, + "wifi-pen": 58979, + "door-closed-locked": 58980, + "hamburger": 58981, + "brush-cleaning": 58982, + "clock-plus": 58983, + "panda": 58984, + "soap-dispenser-droplet": 58985, + "gpu": 58986, + "check-line": 58987, + "square-dashed-top-solid": 58988, + "circle-pound-sterling": 58989, + "cloud-check": 58990, + "grid-3x2": 58991, + "id-card-lanyard": 58992, + "card-sim": 58993, + "book-alert": 58994, + "rectangle-circle": 58995, + "wifi-cog": 58996, + "barrel": 58997, + "drone": 58998, + "spool": 58999, + "georgian-lari": 59000, + "squircle-dashed": 59001, + "line-squiggle": 59002, + "bottle-wine": 59003, + "vector-square": 59004, + "tool-case": 59005, + "badge-turkish-lira": 59006, + "receipt-turkish-lira": 59007, + "turkish-lira": 59008, + "wifi-sync": 59009, + "spotlight": 59010, + "hat-glasses": 59011, + "square-pause": 59012, + "square-stop": 59013, + "map-minus": 59014, + "user-star": 59015, + "clipboard-clock": 59016, + "handbag": 59017, + "closed-caption": 59018, + "hand-fist": 59019, + "turntable": 59020, + "circle-star": 59021, + "square-star": 59022, + "kayak": 59023, + "brick-wall-shield": 59024, + "rose": 59025, + "panel-left-right-dashed": 59026, + "panel-top-bottom-dashed": 59027, + "list-chevrons-down-up": 59028, + "house-heart": 59029, + "list-chevrons-up-down": 59030, + "ev-charger": 59031, + "motorbike": 59032, + "monitor-cloud": 59033, + "birdhouse": 59034, + "gamepad-directional": 59035, + "git-branch-minus": 59036, + "helicopter": 59037, + "clock-check": 59038, + "solar-panel": 59039, + "chess-bishop": 59040, + "chess-king": 59041, + "chess-knight": 59042, + "chess-pawn": 59043, + "chess-queen": 59044, + "chess-rook": 59045, + "mouse-pointer-2-off": 59046, + "calendars": 59047, + "form": 59048, + "waves-arrow-down": 59049, + "waves-arrow-up": 59050, + "book-search": 59051, + "scooter": 59052, + "van": 59053, + "weight-tilde": 59054, + "alarm-check": 57836, + "alarm-minus": 57837, + "alarm-plus": 57838, + "arrow-down-01": 58387, + "arrow-down-10": 58388, + "arrow-down-az": 58389, + "sort-desc": 57415, + "arrow-down-za": 58390, + "arrow-up-01": 58392, + "arrow-up-10": 58393, + "arrow-up-az": 58394, + "sort-asc": 57420, + "arrow-up-za": 58396, + "axis-3-d": 58110, + "verified": 57921, + "badge-help": 58491, + "between-horizonal-end": 58769, + "between-horizonal-start": 58770, + "book-template": 58349, + "curly-braces": 58218, + "subtitles": 58276, + "area-chart": 58579, + "bar-chart-horizontal-big": 58535, + "bar-chart-horizontal": 58018, + "candlestick-chart": 58536, + "bar-chart-big": 58537, + "bar-chart-4": 58020, + "bar-chart-3": 58019, + "line-chart": 58021, + "bar-chart": 57450, + "bar-chart-2": 57448, + "gantt-chart": 58564, + "pie-chart": 57451, + "scatter-chart": 58506, + "chrome": 57461, + "alert-circle": 57463, + "arrow-down-circle": 57464, + "arrow-left-circle": 57465, + "arrow-down-left-from-circle": 58359, + "arrow-down-right-from-circle": 58360, + "arrow-up-left-from-circle": 58361, + "arrow-up-right-from-circle": 58362, + "arrow-right-circle": 57466, + "arrow-up-circle": 57467, + "check-circle": 57468, + "check-circle-2": 57894, + "chevron-down-circle": 58589, + "chevron-left-circle": 58590, + "chevron-right-circle": 58591, + "chevron-up-circle": 58592, + "divide-circle": 57469, + "gauge-circle": 58593, + "minus-circle": 57470, + "parking-circle-off": 58314, + "parking-circle": 58313, + "pause-circle": 57471, + "percent-circle": 58650, + "play-circle": 57472, + "plus-circle": 57473, + "power-circle": 58704, + "help-circle": 57474, + "circle-help": 57474, + "circle-slashed": 57875, + "stop-circle": 57475, + "user-circle-2": 58466, + "user-circle": 58465, + "x-circle": 57476, + "clipboard-signature": 58120, + "clipboard-edit": 58119, + "download-cloud": 57481, + "upload-cloud": 57489, + "code-2": 57862, + "columns": 57496, + "columns-settings": 58977, + "table-config": 58977, + "panels-left-right": 57497, + "contact-2": 58467, + "percent-diamond": 58651, + "globe-2": 57843, + "more-vertical": 57527, + "more-horizontal": 57526, + "file-axis-3-d": 58126, + "file-badge-2": 58127, + "file-json-2": 58220, + "file-json": 58219, + "file-bar-chart": 58130, + "file-bar-chart-2": 58129, + "file-line-chart": 58131, + "file-pie-chart": 58132, + "file-check-2": 57538, + "file-code-2": 58462, + "file-cog-2": 58134, + "file-warning": 58137, + "file-audio": 58138, + "file-audio-2": 58138, + "file-key-2": 58141, + "file-lock-2": 58142, + "file-minus-2": 57543, + "file-signature": 58144, + "file-edit": 58143, + "file-video": 58145, + "file-plus-2": 57546, + "file-question": 58146, + "file-search-2": 58148, + "file-volume-2": 58149, + "file-type-2": 58221, + "file-video-2": 58155, + "file-x-2": 57550, + "fingerprint": 58059, + "folder-cog-2": 58161, + "folder-edit": 58168, + "filter-x": 58293, + "filter": 57564, + "git-commit": 57571, + "grid-2-x-2-check": 58852, + "grid-2-x-2-plus": 58920, + "grid-2-x-2-x": 58853, + "grid-2-x-2": 58623, + "grid": 57577, + "grid-3-x-3": 57577, + "grab": 57830, + "helping-hand": 58296, + "home": 57589, + "ice-cream-2": 58279, + "ice-cream": 58195, + "laptop-2": 57816, + "layers-3": 58665, + "outdent": 57607, + "indent-decrease": 57607, + "indent": 57608, + "indent-increase": 57608, + "loader-2": 57610, + "unlock-keyhole": 58674, + "unlock": 57612, + "mail-question": 58213, + "location-edit": 58965, + "message-circle-question": 58728, + "mic-2": 58185, + "move-3-d": 58085, + "alert-octagon": 57639, + "pause-octagon": 57883, + "x-octagon": 57640, + "paintbrush-2": 58088, + "panel-bottom-inactive": 58414, + "sidebar-close": 57884, + "panel-left-inactive": 58416, + "sidebar-open": 57885, + "sidebar": 57642, + "panel-right-inactive": 58419, + "panel-top-inactive": 58423, + "layout": 57644, + "edit-3": 57648, + "edit-2": 57647, + "plug-zap-2": 58460, + "form-input": 57887, + "rotate-3-d": 58090, + "rows": 58425, + "panels-top-bottom": 58762, + "scale-3-d": 58091, + "send-horizonal": 58610, + "shield-question": 58382, + "shield-close": 57856, + "sliders": 57698, + "stars": 58386, + "activity-square": 58548, + "arrow-down-left-square": 58549, + "arrow-down-right-square": 58550, + "arrow-down-square": 58407, + "arrow-left-square": 58408, + "arrow-down-left-from-square": 58785, + "arrow-down-right-from-square": 58786, + "arrow-up-left-from-square": 58787, + "arrow-up-right-from-square": 58788, + "arrow-right-square": 58409, + "arrow-up-left-square": 58551, + "arrow-up-right-square": 58552, + "arrow-up-square": 58410, + "asterisk-square": 57704, + "scissors-square-dashed-bottom": 58603, + "gantt-chart-square": 58916, + "square-gantt-chart": 57705, + "check-square": 57706, + "check-square-2": 58713, + "chevron-down-square": 58319, + "chevron-left-square": 58320, + "chevron-right-square": 58321, + "chevron-up-square": 58322, + "code-square": 57707, + "kanban-square-dashed": 57708, + "mouse-pointer-square-dashed": 58633, + "box-select": 57803, + "divide-square": 57709, + "dot-square": 57710, + "equal-square": 57711, + "function-square": 57901, + "kanban-square": 57712, + "library-square": 58703, + "m-square": 58627, + "menu-square": 58451, + "minus-square": 57713, + "inspect": 57858, + "parking-square-off": 58316, + "parking-square": 58315, + "pen-box": 57714, + "edit": 57714, + "pen-square": 57714, + "percent-square": 58652, + "pi-square": 58504, + "pilcrow-square": 58507, + "play-square": 58497, + "plus-square": 57715, + "power-square": 58705, + "scissors-square": 58604, + "sigma-square": 58505, + "slash-square": 57716, + "split-square-horizontal": 58294, + "split-square-vertical": 58295, + "terminal-square": 57866, + "user-square-2": 58470, + "user-square": 58469, + "x-square": 57717, + "test-tube-2": 58374, + "align-center": 57730, + "align-right": 57731, + "align-justify": 57732, + "text": 57733, + "align-left": 57733, + "letter-text": 58885, + "text-selection": 58334, + "wrap-text": 57928, + "train": 58025, + "palmtree": 57985, + "alert-triangle": 57747, + "tv-2": 57859, + "school-2": 58341, + "user-check-2": 58473, + "user-cog-2": 58474, + "user-minus-2": 58475, + "user-plus-2": 58476, + "user-x-2": 58477, + "user-2": 58472, + "users-2": 58478, + "fork-knife-crossed": 58103, + "fork-knife": 58102, + "wallet-2": 58573, + "wand-2": 58199, + "balloon": 59055, + "cannabis-off": 59055, + "circle-pile": 59055, + "cloud-backup": 59055, + "cloud-sync": 59055, + "fishing-hook": 59055, + "hd": 59055, + "layers-plus": 59055, + "search-alert": 59055, + "stone": 59055, + "toolbox": 59056 +} diff --git a/tools/build-font/main.ts b/tools/build-font/main.ts deleted file mode 100644 index 45a94f041..000000000 --- a/tools/build-font/main.ts +++ /dev/null @@ -1,150 +0,0 @@ -import { readJson } from 'fs-extra/esm'; -import svgtofont from 'svgtofont'; -import getArgumentOptions from 'minimist'; -import path from 'path'; - -const fontName = 'lucide'; -const classNamePrefix = 'icon'; -const startUnicode = 57400; - -const inputDir = path.join(process.cwd(), '../../', 'outlined'); -const cliArguments = getArgumentOptions(process.argv.slice(2)); -const { outputDir = 'lucide-font' } = cliArguments; -const targetDir = path.join(process.cwd(), '../../', outputDir); -const releaseMetaDataDir = path.join(process.cwd(), '../../', 'docs/.vitepress/data'); -const releaseMetaDataPath = path.resolve(releaseMetaDataDir, 'releaseMetaData.json'); - -const releaseMetaData = convertReleaseMetaData(await getReleaseMetaData()); - -async function getReleaseMetaData() { - let releaseMetaData = {}; - try { - releaseMetaData = await readJson(releaseMetaDataPath); - } catch (err) { - throw new Error('Execution stopped because no release information was found.'); - } - return releaseMetaData; -} - -type Releases = Record; - -type ReleaseMetaData = { - createdRelease: { - version: string; - date: string; - }; - changedRelease: { - version: string; - date: string; - }; -}; - -type ReleaseMetaDataWithName = ReleaseMetaData & { - name: string; -}; - -function convertReleaseMetaData(releases: Releases) { - return Object.entries(releases) - .map(([key, data]) => ({ - ...data, - name: key, - })) - .sort((a, b) => sortMultiple(a, b, [sortByCreatedReleaseDate, sortByName])) - .map((value, index) => ({ ...value, index })) - .map((value, index) => ({ - ...value, - unicode: index + startUnicode, - })); -} - -type CollatorFunction = (a: ReleaseMetaDataWithName, b: ReleaseMetaDataWithName) => number; - -function sortMultiple( - a: ReleaseMetaDataWithName, - b: ReleaseMetaDataWithName, - collators: CollatorFunction[] = [], -) { - const comparison = collators?.shift?.()?.(a, b) ?? 0; - if (comparison === 0 && collators.length > 0) return sortMultiple(a, b, collators); - return comparison; -} - -function sortByCreatedReleaseDate(a: ReleaseMetaDataWithName, b: ReleaseMetaDataWithName) { - const [dateA, dateB] = [a, b].map((value) => new Date(value.createdRelease.date).valueOf()); - return Number(dateA > dateB) - Number(dateA < dateB); -} - -function sortByName(a: ReleaseMetaDataWithName, b: ReleaseMetaDataWithName) { - return new Intl.Collator('en-US').compare(a.name, b.name); -} - -function getIconUnicode(name: string): [string, number] { - const { unicode } = releaseMetaData.find(({ name: iconName }) => iconName === name) ?? { - unicode: startUnicode, - }; - return [String.fromCharCode(unicode), startUnicode]; -} - -async function init() { - console.time('Font generation'); - try { - await svgtofont({ - src: path.resolve(process.cwd(), inputDir), - dist: path.resolve(process.cwd(), targetDir), - // styleTemplates: path.resolve(process.cwd(), 'styles'), // Add different templates if needed - fontName, - classNamePrefix, - css: { - fontSize: 'inherit', - }, - emptyDist: true, - useCSSVars: false, - outSVGReact: false, - outSVGPath: false, - addLigatures: true, - svgicons2svgfont: { - fontHeight: 1000, // At least 1000 is recommended - normalize: false, - }, - generateInfoData: true, - website: { - title: 'Lucide', - logo: undefined, - meta: { - description: 'Lucide icons as TTF/EOT/WOFF/WOFF2/SVG.', - keywords: 'Lucide,TTF,EOT,WOFF,WOFF2,SVG', - }, - corners: { - url: 'https://github.com/lucide-icons/lucide', - width: 62, // default: 60 - height: 62, // default: 60 - bgColor: '#dc3545', // default: '#151513' - }, - links: [ - { - title: 'GitHub', - url: 'https://github.com/lucide-icons/lucide', - }, - { - title: 'Feedback', - url: 'https://github.com/lucide-icons/lucide/issues', - }, - { - title: 'Font Class', - url: 'index.html', - }, - { - title: 'Unicode', - url: 'unicode.html', - }, - ], - }, - getIconUnicode, - }); - } catch (err) { - console.log(err); - } - console.timeEnd('Font generation'); -} - -init(); diff --git a/tools/outline-svg/oslllo-svg-fixer.d.ts b/tools/build-font/oslllo-svg-fixer.d.ts similarity index 100% rename from tools/outline-svg/oslllo-svg-fixer.d.ts rename to tools/build-font/oslllo-svg-fixer.d.ts diff --git a/tools/build-font/package.json b/tools/build-font/package.json index dba56db3f..9630dd82b 100644 --- a/tools/build-font/package.json +++ b/tools/build-font/package.json @@ -6,7 +6,7 @@ "main": "main.ts", "type": "module", "scripts": { - "start": "node ./main.ts" + "start": "node ./src/main.ts" }, "keywords": [], "author": "", @@ -14,9 +14,11 @@ "dependencies": { "fs-extra": "^11.2.0", "minimist": "^1.2.8", + "oslllo-svg-fixer": "^5.0.0", "svgtofont": "^6.5.0" }, "devDependencies": { + "@lucide/helpers": "workspace:*", "@types/fs-extra": "^11.0.4", "@types/minimist": "^1.2.5", "@types/node": "^22" diff --git a/tools/build-font/src/allocateCodepoints.ts b/tools/build-font/src/allocateCodepoints.ts new file mode 100644 index 000000000..59ef69d79 --- /dev/null +++ b/tools/build-font/src/allocateCodepoints.ts @@ -0,0 +1,60 @@ +import { type IconAliases } from '@lucide/helpers'; +import path from 'path'; +import { promises as fs } from 'fs'; +import { cwd } from 'process'; + +export type CodePoints = Record; + +async function getLatestCodePoints(): Promise { + // This is for the first release where no codepoints.json exists yet + const codepointsContents = await fs.readFile(path.join(cwd(), 'codepoints.json'), 'utf-8'); + + return JSON.parse(codepointsContents) as CodePoints; + + // TODO: Next releases will use the codepoints.json from latest release in lucide-static. + // const codepointsContents = await fetch('https://unpkg.com/lucide-static@latest/font/codepoints.json') + // return codepointsContents.json() as Promise +} + +interface AllocateCodePointsOptions { + saveCodePoints?: boolean; + iconsWithAliases: IconAliases; +} + +export async function allocateCodePoints({ + saveCodePoints = false, + iconsWithAliases, +}: AllocateCodePointsOptions): Promise { + const baseCodePoints = await getLatestCodePoints(); + + const endCodePoint = Math.max(...Object.values(baseCodePoints)); + + await Promise.all( + iconsWithAliases.map(async ([iconName, aliases]) => { + if (!baseCodePoints[iconName]) { + console.log('Code point not found creating new one for', iconName); + baseCodePoints[iconName] = endCodePoint + 1; + } + + aliases.forEach((alias, index) => { + if (baseCodePoints[alias]) { + return; + } + + console.log('Code point not found creating new one for', alias); + + baseCodePoints[alias] = endCodePoint + index + 1; + }); + }), + ); + + if (saveCodePoints) { + await fs.writeFile( + path.join(cwd(), 'codepoints.json'), + JSON.stringify(baseCodePoints, null, 2), + 'utf-8', + ); + } + + return baseCodePoints; +} diff --git a/tools/build-font/src/buildFont.ts b/tools/build-font/src/buildFont.ts new file mode 100644 index 000000000..d182d79eb --- /dev/null +++ b/tools/build-font/src/buildFont.ts @@ -0,0 +1,86 @@ +import svgtofont from 'svgtofont'; +import { type CodePoints } from './allocateCodepoints.ts'; + +interface BuildFontOptions { + inputDir: string; + targetDir: string; + fontName: string; + classNamePrefix: string; + codePoints: CodePoints; + startUnicode: number; +} + +export async function buildFont({ + inputDir, + targetDir, + fontName, + classNamePrefix, + codePoints, + startUnicode, +}: BuildFontOptions) { + console.time('Font generation'); + try { + await svgtofont({ + src: inputDir, + dist: targetDir, + fontName, + classNamePrefix, + css: { + fontSize: 'inherit', + }, + emptyDist: true, + useCSSVars: false, + outSVGReact: false, + outSVGPath: false, + addLigatures: true, + svgicons2svgfont: { + fontHeight: 1000, // At least 1000 is recommended + normalize: false, + }, + generateInfoData: true, + website: { + title: 'Lucide', + logo: undefined, + meta: { + description: 'Lucide icons as TTF/EOT/WOFF/WOFF2/SVG.', + keywords: 'Lucide,TTF,EOT,WOFF,WOFF2,SVG', + }, + corners: { + url: 'https://github.com/lucide-icons/lucide', + width: 62, // default: 60 + height: 62, // default: 60 + bgColor: '#dc3545', // default: '#151513' + }, + links: [ + { + title: 'GitHub', + url: 'https://github.com/lucide-icons/lucide', + }, + { + title: 'Feedback', + url: 'https://github.com/lucide-icons/lucide/issues', + }, + { + title: 'Font Class', + url: 'index.html', + }, + { + title: 'Unicode', + url: 'unicode.html', + }, + ], + }, + getIconUnicode: (name: string) => { + if (!codePoints[name]) { + throw new Error(`No codepoint found for icon: ${name}`); + } + + const unicode = codePoints[name]; + return [String.fromCharCode(unicode), startUnicode]; + }, + }); + } catch (err) { + console.log(err); + } + console.timeEnd('Font generation'); +} diff --git a/tools/build-font/src/helpers.ts b/tools/build-font/src/helpers.ts new file mode 100644 index 000000000..7ed565185 --- /dev/null +++ b/tools/build-font/src/helpers.ts @@ -0,0 +1,19 @@ +import { type IconAliases } from '@lucide/helpers'; +import { type CodePoints } from './allocateCodepoints.ts'; + +export function hasMissingCodePoints( + iconsWithAliases: IconAliases, + codePoints: CodePoints, +): boolean { + return iconsWithAliases + .map(([iconName, aliases]) => [iconName, ...aliases]) + .flat() + .some((name) => { + if (!codePoints?.[name]) { + console.log(`Missing code point for icon/alias: ${name}`); + return true; + } + + return false; + }); +} diff --git a/tools/build-font/src/main.ts b/tools/build-font/src/main.ts new file mode 100644 index 000000000..5217f29db --- /dev/null +++ b/tools/build-font/src/main.ts @@ -0,0 +1,52 @@ +import getArgumentOptions from 'minimist'; +import path from 'path'; +import { promises as fs } from 'fs'; + +import { getAllIconAliases } from '@lucide/helpers'; +import { outlineSVG } from './outlineSVGs.ts'; +import { allocateCodePoints } from './allocateCodepoints.ts'; +import { buildFont } from './buildFont.ts'; +import { hasMissingCodePoints } from './helpers.ts'; + +const fontName = 'lucide'; +const classNamePrefix = 'icon'; +const startUnicode = 57400; +const outputDir = 'lucide-font'; + +const { saveCodePoints = false } = getArgumentOptions(process.argv.slice(2)) ?? {}; + +const repoRoot = path.join(process.cwd(), '../../'); +const iconsDir = path.join(repoRoot, 'icons'); +const outlinedDir = path.join(repoRoot, 'outlined'); +const targetDir = path.join(repoRoot, outputDir); + +const iconsWithAliases = await getAllIconAliases(iconsDir); + +await outlineSVG({ + iconsDir, + outlinedDir, + iconsWithAliases, +}); + +const codePoints = await allocateCodePoints({ + saveCodePoints, + iconsWithAliases, +}); + +if (hasMissingCodePoints(iconsWithAliases, codePoints)) { + throw new Error('Some icons or aliases are missing code points. See log for details.'); +} + +await buildFont({ + inputDir: outlinedDir, + targetDir, + fontName, + classNamePrefix, + codePoints, + startUnicode, +}); + +await fs.copyFile( + path.join(process.cwd(), 'codepoints.json'), + path.join(targetDir, 'codepoints.json'), +); diff --git a/tools/build-font/src/outlineSVGs.ts b/tools/build-font/src/outlineSVGs.ts new file mode 100644 index 000000000..389145401 --- /dev/null +++ b/tools/build-font/src/outlineSVGs.ts @@ -0,0 +1,49 @@ +import { promises as fs } from 'fs'; +import SVGFixer from 'oslllo-svg-fixer'; +import { type IconAliases } from '@lucide/helpers'; +import path from 'path'; + +interface OutlineSVGOptions { + iconsDir: string; + outlinedDir: string; + iconsWithAliases: IconAliases; +} + +export async function outlineSVG({ iconsDir, outlinedDir, iconsWithAliases }: OutlineSVGOptions) { + console.time('icon outliner'); + try { + try { + await fs.mkdir(outlinedDir); + } catch (error) {} // eslint-disable-line no-empty + + await SVGFixer(iconsDir, outlinedDir, { + showProgressBar: true, + traceResolution: 800, + }).fix(); + + console.log('Duplicate icons with aliases..'); + + await Promise.all( + iconsWithAliases.map(async ([iconName, aliases]) => { + const sourcePath = path.join(outlinedDir, `${iconName}.svg`); + + await Promise.all( + aliases.map(async (aliasName) => { + const destinationPath = path.join(outlinedDir, `${aliasName}.svg`); + + try { + await fs.copyFile(sourcePath, destinationPath); + console.log(`Copied ${iconName}.svg to ${aliasName}.svg`); + } catch (err) { + console.log(`Failed to copy ${sourcePath} to ${destinationPath}:`, err); + } + }), + ); + }), + ); + + console.timeEnd('icon outliner'); + } catch (err) { + console.log(err); + } +} diff --git a/tools/build-font/styles/.gitkeep b/tools/build-font/styles/.gitkeep deleted file mode 100644 index e69de29bb..000000000 diff --git a/tools/build-helpers/helpers.ts b/tools/build-helpers/helpers.ts index 3c828f285..60f354649 100644 --- a/tools/build-helpers/helpers.ts +++ b/tools/build-helpers/helpers.ts @@ -7,6 +7,7 @@ export * from './src/appendFile.ts'; export * from './src/writeFile.ts'; export * from './src/writeFileIfNotExists.ts'; export * from './src/readAllMetadata.ts'; +export * from './src/getAllIconAliases.ts'; export * from './src/readMetadata.ts'; export * from './src/readSvgDirectory.ts'; export * from './src/readSvg.ts'; diff --git a/tools/build-helpers/src/getAllIconAliases.ts b/tools/build-helpers/src/getAllIconAliases.ts new file mode 100644 index 000000000..b94c4aa51 --- /dev/null +++ b/tools/build-helpers/src/getAllIconAliases.ts @@ -0,0 +1,17 @@ +import { readAllMetadata } from './readAllMetadata.ts'; + +export type IconAliases = [iconName: string, aliases: string[]][]; + +export const getAllIconAliases = async (iconsDir: string): Promise => { + const metaDataFiles = await readAllMetadata(iconsDir); + + return Object.entries(metaDataFiles).map(([iconName, metadata]) => { + const { aliases } = metadata; + + if (!aliases?.length) return [iconName, []]; + + const aliasesNames = aliases.map((alias) => (typeof alias === 'string' ? alias : alias.name)); + + return [iconName, aliasesNames]; + }); +}; diff --git a/tools/build-helpers/src/readAllMetadata.ts b/tools/build-helpers/src/readAllMetadata.ts index b66f588d4..175296376 100644 --- a/tools/build-helpers/src/readAllMetadata.ts +++ b/tools/build-helpers/src/readAllMetadata.ts @@ -1,6 +1,7 @@ import fs from 'fs/promises'; import path from 'path'; import { readMetadata } from './readMetadata.ts'; +import { type IconMetadata } from '../../build-icons/types.ts'; /** * Reads metadata from the icons/categories directories @@ -8,7 +9,7 @@ import { readMetadata } from './readMetadata.ts'; * @param {string} directory * @returns {object} A map of icon or category metadata */ -export const readAllMetadata = async (directory: string): Promise> => { +export const readAllMetadata = async (directory: string): Promise> => { const directoryContent = await fs.readdir(directory); const metaDataPromises = directoryContent @@ -16,6 +17,7 @@ export const readAllMetadata = async (directory: string): Promise [path.basename(file, '.json'), await readMetadata(file, directory)]); const metadata = await Promise.all(metaDataPromises); + if (metadata.length === 0) { throw new Error(`No metadata files found in directory: ${directory}`); } diff --git a/tools/outline-svg/README.md b/tools/outline-svg/README.md deleted file mode 100644 index dab688975..000000000 --- a/tools/outline-svg/README.md +++ /dev/null @@ -1,3 +0,0 @@ -# @lucide/outline-svg - -A internal used package to outline SVGs. diff --git a/tools/outline-svg/main.ts b/tools/outline-svg/main.ts deleted file mode 100644 index 36f1c5b68..000000000 --- a/tools/outline-svg/main.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { promises as fs } from 'fs'; -import SVGFixer from 'oslllo-svg-fixer'; -import getArgumentOptions from 'minimist'; -import path from 'path'; - -const inputDir = path.join(process.cwd(), '../../icons'); -const cliArguments = getArgumentOptions(process.argv.slice(2)); -const { outputDir = 'outlined' } = cliArguments; -const targetDir = path.join(process.cwd(), '../../', outputDir); - -async function init() { - console.time('icon outliner'); - try { - try { - await fs.mkdir(targetDir); - } catch (error) {} // eslint-disable-line no-empty - - await SVGFixer(inputDir, targetDir, { - showProgressBar: true, - traceResolution: 800, - }).fix(); - - console.timeEnd('icon outliner'); - } catch (err) { - console.log(err); - } -} - -init(); diff --git a/tools/outline-svg/package.json b/tools/outline-svg/package.json deleted file mode 100644 index e6c8aa997..000000000 --- a/tools/outline-svg/package.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "name": "@lucide/outline-svg", - "description": "A internal used package to outline SVGs.", - "private": true, - "version": "2.0.0", - "main": "main.ts", - "type": "module", - "scripts": { - "start": "node ./main.ts" - }, - "keywords": [], - "author": "", - "license": "ISC", - "dependencies": { - "minimist": "^1.2.8", - "oslllo-svg-fixer": "^5.0.0" - } -} diff --git a/tools/outline-svg/tsconfig.json b/tools/outline-svg/tsconfig.json deleted file mode 100644 index 6df24e8cd..000000000 --- a/tools/outline-svg/tsconfig.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "compilerOptions": { - "strict": true, - "declaration": true, - "noEmitOnError": true, - "noFallthroughCasesInSwitch": true, - "moduleResolution": "node", - "module": "ESNext", - "target": "ESNext", - "esModuleInterop": true, - "lib": ["esnext"], - "resolveJsonModule": true, - "allowImportingTsExtensions": true, - "noEmit": true, - "sourceMap": true, - "outDir": "./dist", - }, -}