diff --git a/README.md b/README.md
index e48301793ee..0d43b0f8b65 100644
--- a/README.md
+++ b/README.md
@@ -35,7 +35,6 @@ Lucide is trying to expand the icon set as much as possible while staying faithf
- [Static (svg sprite, font, icons ..)](#static-svg-sprite-font-icons-)
- [Figma](#figma)
- [Laravel](#laravel)
- - [Flutter](#flutter)
- [Svelte](#svelte)
- [Solid](#solid)
- [Hyva](#hyva)
@@ -200,16 +199,6 @@ composer require mallardduck/blade-lucide-icons
For more details, see the [documentation](https://github.com/mallardduck/blade-lucide-icons/blob/main/README.md).
-### Flutter
-
-Implementation of Lucide icon library for Flutter applications.
-
-```sh
-flutter pub add lucide_icons
-```
-
-For more details, see the [pub.dev](https://pub.dev/packages/lucide_icons).
-
### Svelte
Implementation of the lucide icon library for Svelte applications.
diff --git a/docs/.vitepress/api/gh-icon/[...data].get.ts b/docs/.vitepress/api/gh-icon/[...data].get.ts
index f688c57ab67..8b4abb4c786 100644
--- a/docs/.vitepress/api/gh-icon/[...data].get.ts
+++ b/docs/.vitepress/api/gh-icon/[...data].get.ts
@@ -1,41 +1,44 @@
-import { eventHandler, setResponseHeader, defaultContentType } from 'h3'
-import { renderToString, renderToStaticMarkup } from 'react-dom/server'
-import { createElement } from 'react'
+import { eventHandler, setResponseHeader, defaultContentType } from 'h3';
+import { renderToString, renderToStaticMarkup } from 'react-dom/server';
+import { createElement } from 'react';
import SvgPreview from '../../lib/SvgPreview/index.tsx';
-import iconNodes from '../../data/iconNodes'
-import createLucideIcon from 'lucide-react/src/createLucideIcon'
+import iconNodes from '../../data/iconNodes';
+import createLucideIcon from 'lucide-react/src/createLucideIcon';
import Backdrop from '../../lib/SvgPreview/Backdrop.tsx';
export default eventHandler((event) => {
- const { params } = event.context
+ const { params } = event.context;
- const [name, svgData] = params.data.split('/');
- const data = svgData.slice(0, -4);
+ const pathData = params.data.split('/');
+ const data = pathData.at(-1).slice(0, -4);
+ const [name] = pathData;
const src = Buffer.from(data, 'base64').toString('utf8');
- const children = []
+ const children = [];
- if (name in iconNodes) {
- const iconNode = iconNodes[name]
+ // If the icon already exists, it uses the existing icon as the backdrop.
+ // If the icon does not exist but an icon exists that starts with the same group name, that icon
+ // is used as the backdrop
+ const backdropName =
+ name in iconNodes ? name : name.split('-')[0] in iconNodes ? name.split('-')[0] : null;
+ if (backdropName) {
+ const iconNode = iconNodes[backdropName];
- const LucideIcon = createLucideIcon(name, iconNode)
- const svg = renderToStaticMarkup(createElement(LucideIcon))
+ const LucideIcon = createLucideIcon(backdropName, iconNode);
+ const svg = renderToStaticMarkup(createElement(LucideIcon));
const backdropString = svg.replace(/
diff --git a/icons/copyleft.svg b/icons/copyleft.svg
index 8705046e811..0940c524afb 100644
--- a/icons/copyleft.svg
+++ b/icons/copyleft.svg
@@ -10,5 +10,5 @@
stroke-linejoin="round"
>
-
+
diff --git a/icons/copyright.svg b/icons/copyright.svg
index 849af8718df..30f1ff6085d 100644
--- a/icons/copyright.svg
+++ b/icons/copyright.svg
@@ -10,5 +10,5 @@
stroke-linejoin="round"
>
-
+
diff --git a/icons/map-pinned.json b/icons/map-pinned.json
new file mode 100644
index 00000000000..7d0be2ed9be
--- /dev/null
+++ b/icons/map-pinned.json
@@ -0,0 +1,18 @@
+{
+ "$schema": "../icon.schema.json",
+ "contributors": [
+ "danielbayley"
+ ],
+ "tags": [
+ "location",
+ "waypoint",
+ "marker",
+ "drop"
+ ],
+ "categories": [
+ "maps",
+ "navigation",
+ "travel",
+ "account"
+ ]
+}
\ No newline at end of file
diff --git a/icons/map-pinned.svg b/icons/map-pinned.svg
new file mode 100644
index 00000000000..fd672242600
--- /dev/null
+++ b/icons/map-pinned.svg
@@ -0,0 +1,15 @@
+
diff --git a/icons/milestone.json b/icons/milestone.json
index f11b34eebad..7faacff02da 100644
--- a/icons/milestone.json
+++ b/icons/milestone.json
@@ -4,9 +4,11 @@
"karsa-mistmere"
],
"tags": [
- "sign",
"signpost",
"direction",
+ "right",
+ "east",
+ "forward",
"version control"
],
"categories": [
diff --git a/icons/route-off.json b/icons/route-off.json
new file mode 100644
index 00000000000..f6ad2a1801e
--- /dev/null
+++ b/icons/route-off.json
@@ -0,0 +1,23 @@
+{
+ "$schema": "../icon.schema.json",
+ "contributors": [
+ "danielbayley"
+ ],
+ "tags": [
+ "path",
+ "journey",
+ "planner",
+ "points",
+ "stops",
+ "stations",
+ "reset",
+ "clear",
+ "cancelled",
+ "closed",
+ "blocked"
+ ],
+ "categories": [
+ "maps",
+ "navigation"
+ ]
+}
\ No newline at end of file
diff --git a/icons/route-off.svg b/icons/route-off.svg
new file mode 100644
index 00000000000..6b998107dcc
--- /dev/null
+++ b/icons/route-off.svg
@@ -0,0 +1,19 @@
+
diff --git a/icons/route.json b/icons/route.json
new file mode 100644
index 00000000000..9bb5f709034
--- /dev/null
+++ b/icons/route.json
@@ -0,0 +1,18 @@
+{
+ "$schema": "../icon.schema.json",
+ "contributors": [
+ "danielbayley"
+ ],
+ "tags": [
+ "path",
+ "journey",
+ "planner",
+ "points",
+ "stops",
+ "stations"
+ ],
+ "categories": [
+ "maps",
+ "navigation"
+ ]
+}
\ No newline at end of file
diff --git a/icons/route.svg b/icons/route.svg
new file mode 100644
index 00000000000..12f7088149e
--- /dev/null
+++ b/icons/route.svg
@@ -0,0 +1,15 @@
+
diff --git a/icons/signpost-big.json b/icons/signpost-big.json
new file mode 100644
index 00000000000..17f39a33631
--- /dev/null
+++ b/icons/signpost-big.json
@@ -0,0 +1,19 @@
+{
+ "$schema": "../icon.schema.json",
+ "contributors": [
+ "danielbayley"
+ ],
+ "tags": [
+ "bidirectional",
+ "left",
+ "right",
+ "east",
+ "west"
+ ],
+ "categories": [
+ "arrows",
+ "navigation",
+ "development",
+ "gaming"
+ ]
+}
\ No newline at end of file
diff --git a/icons/signpost-big.svg b/icons/signpost-big.svg
new file mode 100644
index 00000000000..144495f83e9
--- /dev/null
+++ b/icons/signpost-big.svg
@@ -0,0 +1,16 @@
+
diff --git a/icons/signpost.json b/icons/signpost.json
new file mode 100644
index 00000000000..17f39a33631
--- /dev/null
+++ b/icons/signpost.json
@@ -0,0 +1,19 @@
+{
+ "$schema": "../icon.schema.json",
+ "contributors": [
+ "danielbayley"
+ ],
+ "tags": [
+ "bidirectional",
+ "left",
+ "right",
+ "east",
+ "west"
+ ],
+ "categories": [
+ "arrows",
+ "navigation",
+ "development",
+ "gaming"
+ ]
+}
\ No newline at end of file
diff --git a/icons/signpost.svg b/icons/signpost.svg
new file mode 100644
index 00000000000..cea53aeb3e0
--- /dev/null
+++ b/icons/signpost.svg
@@ -0,0 +1,15 @@
+
diff --git a/icons/umbrella-off.json b/icons/umbrella-off.json
new file mode 100644
index 00000000000..bd4d441df0c
--- /dev/null
+++ b/icons/umbrella-off.json
@@ -0,0 +1,23 @@
+{
+ "$schema": "../icon.schema.json",
+ "contributors": [
+ "colebemis",
+ "csandman",
+ "ericfennis",
+ "karsa-mistmere",
+ "jguddas",
+ "jguddas"
+ ],
+ "tags": [
+ "rain",
+ "weather",
+ "uncovered",
+ "uninsured",
+ "antivirus",
+ "unprotected",
+ "risky"
+ ],
+ "categories": [
+ "weather"
+ ]
+}
diff --git a/icons/umbrella-off.svg b/icons/umbrella-off.svg
new file mode 100644
index 00000000000..2541ba1febb
--- /dev/null
+++ b/icons/umbrella-off.svg
@@ -0,0 +1,16 @@
+
diff --git a/icons/waypoints.json b/icons/waypoints.json
new file mode 100644
index 00000000000..e133c9f3c84
--- /dev/null
+++ b/icons/waypoints.json
@@ -0,0 +1,31 @@
+{
+ "$schema": "../icon.schema.json",
+ "contributors": [
+ "danielbayley"
+ ],
+ "tags": [
+ "indirection",
+ "vpn",
+ "virtual private network",
+ "proxy",
+ "connections",
+ "bounce",
+ "reroute",
+ "path",
+ "journey",
+ "planner",
+ "stops",
+ "stations",
+ "shared",
+ "spread",
+ "viral"
+ ],
+ "categories": [
+ "security",
+ "account",
+ "maps",
+ "navigation",
+ "development",
+ "social"
+ ]
+}
\ No newline at end of file
diff --git a/icons/waypoints.svg b/icons/waypoints.svg
new file mode 100644
index 00000000000..c8d788034d1
--- /dev/null
+++ b/icons/waypoints.svg
@@ -0,0 +1,19 @@
+
diff --git a/packages/lucide-flutter/.gitignore b/packages/lucide-flutter/.gitignore
deleted file mode 100644
index 1ffed3525c9..00000000000
--- a/packages/lucide-flutter/.gitignore
+++ /dev/null
@@ -1,76 +0,0 @@
-# Miscellaneous
-*.class
-*.log
-*.pyc
-*.swp
-.DS_Store
-.atom/
-.buildlog/
-.history
-.svn/
-
-# IntelliJ related
-*.iml
-*.ipr
-*.iws
-.idea/
-
-# The .vscode folder contains launch configuration and tasks you configure in
-# VS Code which you may wish to be included in version control, so this line
-# is commented out by default.
-#.vscode/
-
-# Flutter/Dart/Pub related
-**/doc/api/
-.dart_tool/
-.flutter-plugins
-.flutter-plugins-dependencies
-.packages
-.pub-cache/
-.pub/
-build/
-pubspec.lock
-
-# Android related
-**/android/**/gradle-wrapper.jar
-**/android/.gradle
-**/android/captures/
-**/android/gradlew
-**/android/gradlew.bat
-**/android/local.properties
-**/android/**/GeneratedPluginRegistrant.java
-
-# iOS/XCode related
-**/ios/**/*.mode1v3
-**/ios/**/*.mode2v3
-**/ios/**/*.moved-aside
-**/ios/**/*.pbxuser
-**/ios/**/*.perspectivev3
-**/ios/**/*sync/
-**/ios/**/.sconsign.dblite
-**/ios/**/.tags*
-**/ios/**/.vagrant/
-**/ios/**/DerivedData/
-**/ios/**/Icon?
-**/ios/**/Pods/
-**/ios/**/.symlinks/
-**/ios/**/profile
-**/ios/**/xcuserdata
-**/ios/.generated/
-**/ios/Flutter/App.framework
-**/ios/Flutter/Flutter.framework
-**/ios/Flutter/Flutter.podspec
-**/ios/Flutter/Generated.xcconfig
-**/ios/Flutter/ephemeral
-**/ios/Flutter/app.flx
-**/ios/Flutter/app.zip
-**/ios/Flutter/flutter_assets/
-**/ios/Flutter/flutter_export_environment.sh
-**/ios/ServiceDefinitions.json
-**/ios/Runner/GeneratedPluginRegistrant.*
-
-# Exceptions to above rules.
-!**/ios/**/default.mode1v3
-!**/ios/**/default.mode2v3
-!**/ios/**/default.pbxuser
-!**/ios/**/default.perspectivev3
diff --git a/packages/lucide-flutter/CHANGELOG.md b/packages/lucide-flutter/CHANGELOG.md
deleted file mode 100644
index b6824e78326..00000000000
--- a/packages/lucide-flutter/CHANGELOG.md
+++ /dev/null
@@ -1,3 +0,0 @@
-## 0.15.30
-
-* Initial release
diff --git a/packages/lucide-flutter/README.md b/packages/lucide-flutter/README.md
deleted file mode 100644
index 228758ba4be..00000000000
--- a/packages/lucide-flutter/README.md
+++ /dev/null
@@ -1,8 +0,0 @@
-# lucide_icons
-
-Lucide Icons ([lucide.dev](https://lucide.dev)) for Flutter. Visit the website for the full list of icons
-
-## Example
-```dart
-Icon(LucideIcons.activity);
-```
diff --git a/packages/lucide-flutter/analysis_option.yaml b/packages/lucide-flutter/analysis_option.yaml
deleted file mode 100644
index 2d010597ced..00000000000
--- a/packages/lucide-flutter/analysis_option.yaml
+++ /dev/null
@@ -1,18 +0,0 @@
-include: package:lint/analysis_options.yaml
-
-linter:
- rules:
- omit_local_variable_types: true
- avoid_classes_with_only_static_members: false
- prefer_single_quotes: true
-
- file_names: false
-
- avoid_setters_without_getters: false
-
- sort_pub_dependencies: false
-
- prefer_relative_imports: true
-
- # only for debug
- avoid_print: false
diff --git a/packages/lucide-flutter/example/README.md b/packages/lucide-flutter/example/README.md
deleted file mode 100644
index ec110182a0c..00000000000
--- a/packages/lucide-flutter/example/README.md
+++ /dev/null
@@ -1,9 +0,0 @@
-```dart
-
-Icon(LucideIcons.activity);
-Icon(LucideIcons.airplay);
-// ...
-// for full list see
-// https://lucide.dev
-
-```
\ No newline at end of file
diff --git a/packages/lucide-flutter/lib/lucide_icons.dart b/packages/lucide-flutter/lib/lucide_icons.dart
deleted file mode 100644
index cd5c186c748..00000000000
--- a/packages/lucide-flutter/lib/lucide_icons.dart
+++ /dev/null
@@ -1,12 +0,0 @@
-library lucide_icons;
-
-import "package:flutter/widgets.dart";
-import "src/icon_data.dart";
-
-// THIS FILE IS AUTOMATICALLY GENERATED!
-
-class LucideIcons {
- // Icons will be generated here..
- // static const IconData {icon_name} = const LucideIconData({icon_hex});
- // ...
-}
diff --git a/packages/lucide-flutter/lib/src/icon_data.dart b/packages/lucide-flutter/lib/src/icon_data.dart
deleted file mode 100644
index 5ddfcb9e764..00000000000
--- a/packages/lucide-flutter/lib/src/icon_data.dart
+++ /dev/null
@@ -1,10 +0,0 @@
-import 'package:flutter/widgets.dart';
-
-class LucideIconData extends IconData {
- const LucideIconData(int codePoint)
- : super(
- codePoint,
- fontFamily: 'Lucide',
- fontPackage: 'lucide_icons',
- );
-}
diff --git a/packages/lucide-flutter/pubspec.yaml b/packages/lucide-flutter/pubspec.yaml
deleted file mode 100644
index 171b0ec1168..00000000000
--- a/packages/lucide-flutter/pubspec.yaml
+++ /dev/null
@@ -1,26 +0,0 @@
-name: lucide_icons
-description: A Lucide icon library package for Flutter applications. Fork of Feather Icons, open for anyone to contribute icons.
-version: 0.0.1
-homepage: https://lucide.dev
-repository: https://github.com/lucide-icons/lucide
-
-environment:
- sdk: ">=2.12.0 <3.0.0"
- flutter: ">=1.17.0"
-
-dependencies:
- flutter:
- sdk: flutter
-
-dev_dependencies:
- flutter_test:
- sdk: flutter
- html: ^0.15.0
- recase: ^4.0.0
- lint: ^1.5.3
-
-flutter:
- fonts:
- - family: Lucide
- fonts:
- - asset: assets/lucide.ttf
diff --git a/packages/lucide-flutter/test/icon_test.dart b/packages/lucide-flutter/test/icon_test.dart
deleted file mode 100644
index 3428ccd1233..00000000000
--- a/packages/lucide-flutter/test/icon_test.dart
+++ /dev/null
@@ -1,147 +0,0 @@
-// Tests adapted from https://github.com/fluttercommunity/font_awesome_flutter/blob/master/test/fa_icon_test.dart
-// Copyright 2014 The Flutter Authors. All rights reserved.
-
-import 'package:flutter/material.dart';
-import 'package:flutter_test/flutter_test.dart';
-import 'package:flutter/widgets.dart';
-import 'package:lucide_icons/lucide_icons.dart';
-
-void main() {
- testWidgets('Can set opacity for an Icon', (WidgetTester tester) async {
- await tester.pumpWidget(
- const Directionality(
- textDirection: TextDirection.ltr,
- child: IconTheme(
- data: IconThemeData(
- color: Color(0xFF666666),
- opacity: 0.5,
- ),
- child: Icon(LucideIcons.bot),
- ),
- ),
- );
- final RichText text = tester.widget(find.byType(RichText));
- expect(text.text.style!.color, const Color(0xFF666666).withOpacity(0.5));
- });
-
- testWidgets('Icon sizing - no theme, default size',
- (WidgetTester tester) async {
- await tester.pumpWidget(
- const Directionality(
- textDirection: TextDirection.ltr,
- child: Center(
- child: Icon(LucideIcons.bot),
- ),
- ),
- );
-
- final RenderBox renderObject = tester.renderObject(find.byType(Icon));
- expect(renderObject.size, equals(const Size.square(24.0)));
- });
-
- testWidgets('Icon sizing - no theme, explicit size',
- (WidgetTester tester) async {
- await tester.pumpWidget(
- const Directionality(
- textDirection: TextDirection.ltr,
- child: Center(
- child: Icon(
- LucideIcons.bot,
- size: 96.0,
- ),
- ),
- ),
- );
-
- final RenderBox renderObject = tester.renderObject(find.byType(Icon));
- expect(renderObject.size, equals(const Size.square(96.0)));
- });
-
- testWidgets('Icon sizing - sized theme', (WidgetTester tester) async {
- await tester.pumpWidget(
- const Directionality(
- textDirection: TextDirection.ltr,
- child: Center(
- child: IconTheme(
- data: IconThemeData(size: 36.0),
- child: Icon(LucideIcons.bot),
- ),
- ),
- ),
- );
-
- final RenderBox renderObject = tester.renderObject(find.byType(Icon));
- expect(renderObject.size, equals(const Size.square(36.0)));
- });
-
- testWidgets('Icon sizing - sized theme, explicit size',
- (WidgetTester tester) async {
- await tester.pumpWidget(
- const Directionality(
- textDirection: TextDirection.ltr,
- child: Center(
- child: IconTheme(
- data: IconThemeData(size: 36.0),
- child: Icon(
- LucideIcons.bot,
- size: 48.0,
- ),
- ),
- ),
- ),
- );
-
- final RenderBox renderObject = tester.renderObject(find.byType(Icon));
- expect(renderObject.size, equals(const Size.square(48.0)));
- });
-
- testWidgets('Icon sizing - sizeless theme, default size',
- (WidgetTester tester) async {
- await tester.pumpWidget(
- const Directionality(
- textDirection: TextDirection.ltr,
- child: Center(
- child: IconTheme(
- data: IconThemeData(),
- child: Icon(LucideIcons.bot),
- ),
- ),
- ),
- );
-
- final RenderBox renderObject = tester.renderObject(find.byType(Icon));
- expect(renderObject.size, equals(const Size.square(24.0)));
- });
-
- testWidgets("Changing semantic label from null doesn't rebuild tree ",
- (WidgetTester tester) async {
- await tester.pumpWidget(
- const Directionality(
- textDirection: TextDirection.ltr,
- child: Center(
- child: Icon(LucideIcons.bot),
- ),
- ),
- );
-
- final Element richText1 = tester.element(find.byType(RichText));
-
- await tester.pumpWidget(
- const Directionality(
- textDirection: TextDirection.ltr,
- child: Center(
- child: Icon(
- LucideIcons.bot,
- semanticLabel: 'a label',
- ),
- ),
- ),
- );
-
- final Element richText2 = tester.element(find.byType(RichText));
-
- // Compare a leaf Element in the Icon subtree before and after changing the
- // semanticLabel to make sure the subtree was not rebuilt.
- expect(richText2, same(richText1));
- });
-}
diff --git a/packages/lucide-flutter/tool/generate_fonts.dart b/packages/lucide-flutter/tool/generate_fonts.dart
deleted file mode 100644
index f30d437d752..00000000000
--- a/packages/lucide-flutter/tool/generate_fonts.dart
+++ /dev/null
@@ -1,49 +0,0 @@
-import "dart:io";
-
-import 'package:html/parser.dart' show parse;
-import 'package:recase/recase.dart';
-
-void main(List args) {
- File fontsPreviewFile = File(args[0]);
-
- if (!fontsPreviewFile.existsSync()) {
- print('lucide preview file not found');
- exit(0);
- }
-
- String content = fontsPreviewFile.readAsStringSync();
- final c = parse(content);
- final list = c.getElementsByClassName('glyph');
-
- List generatedOutput = [
- "library lucide_icons;\n",
- "import \"package:flutter/widgets.dart\";\n",
- "import \"src/icon_data.dart\";\n\n",
- "// THIS FILE IS AUTOMATICALLY GENERATED!\n\n",
- "class LucideIcons {\n"
- ];
-
- for (final icon in list) {
- final name = icon
- .getElementsByClassName('class')
- .first
- .attributes['value']!
- .replaceFirst('.icon-', '');
- final val = icon
- .getElementsByClassName('point')
- .first
- .attributes['value']!
- .replaceFirst('', '')
- .replaceFirst(';', '');
-
- generatedOutput.add(
- "static const IconData ${ReCase(name).camelCase} = const LucideIconData(0x$val);\n");
-
- print('$val $name');
- }
-
- generatedOutput.add("}\n");
-
- File output = File('./lib/lucide_icons.dart');
- output.writeAsStringSync(generatedOutput.join());
-}