diff --git a/app/assets/fonts/WebLibre.ttf b/app/assets/fonts/WebLibre.ttf
new file mode 100644
index 00000000..89261e91
Binary files /dev/null and b/app/assets/fonts/WebLibre.ttf differ
diff --git a/app/lib/features/geckoview/features/browser/presentation/dialogs/open_shared_content.dart b/app/lib/features/geckoview/features/browser/presentation/dialogs/open_shared_content.dart
index de863f89..ac69c874 100644
--- a/app/lib/features/geckoview/features/browser/presentation/dialogs/open_shared_content.dart
+++ b/app/lib/features/geckoview/features/browser/presentation/dialogs/open_shared_content.dart
@@ -27,6 +27,7 @@ import 'package:weblibre/features/geckoview/domain/repositories/tab.dart';
import 'package:weblibre/features/geckoview/features/tabs/data/models/container_data.dart';
import 'package:weblibre/features/geckoview/features/tabs/domain/providers/selected_container.dart';
import 'package:weblibre/features/geckoview/features/tabs/presentation/widgets/container_chips.dart';
+import 'package:weblibre/presentation/icons/weblibre_icons.dart';
import 'package:weblibre/utils/form_validators.dart';
class OpenSharedContent extends HookConsumerWidget {
@@ -109,7 +110,7 @@ class OpenSharedContent extends HookConsumerWidget {
),
ListTile(
title: const Text('Open Private Tab'),
- leading: const Icon(MdiIcons.tabUnselected),
+ leading: const Icon(WebLibreIcons.privateTab),
onTap: () async {
await openTab(true);
},
diff --git a/app/lib/features/geckoview/features/browser/presentation/widgets/browser_modules/bottom_app_bar.dart b/app/lib/features/geckoview/features/browser/presentation/widgets/browser_modules/bottom_app_bar.dart
index 9269b2e1..6dfb4eeb 100644
--- a/app/lib/features/geckoview/features/browser/presentation/widgets/browser_modules/bottom_app_bar.dart
+++ b/app/lib/features/geckoview/features/browser/presentation/widgets/browser_modules/bottom_app_bar.dart
@@ -52,6 +52,7 @@ import 'package:weblibre/features/user/data/models/general_settings.dart';
import 'package:weblibre/features/user/domain/repositories/general_settings.dart';
import 'package:weblibre/presentation/hooks/cached_future.dart';
import 'package:weblibre/presentation/hooks/menu_controller.dart';
+import 'package:weblibre/presentation/icons/weblibre_icons.dart';
import 'package:weblibre/presentation/widgets/selectable_chips.dart';
import 'package:weblibre/presentation/widgets/url_icon.dart';
@@ -364,7 +365,7 @@ class BrowserTabBar extends HookConsumerWidget {
controller.open();
}
},
- child: const Icon(MdiIcons.dotsVertical),
+ child: const Icon(WebLibreIcons.tabOptions),
);
},
),
@@ -449,7 +450,7 @@ class ContextualToolbar extends HookConsumerWidget {
controller.open();
}
},
- child: const Icon(MdiIcons.dotsVertical),
+ child: const Icon(WebLibreIcons.tabOptions),
);
},
),
diff --git a/app/lib/features/geckoview/features/browser/presentation/widgets/tab_creation_menu.dart b/app/lib/features/geckoview/features/browser/presentation/widgets/tab_creation_menu.dart
index e36091cc..aeeff9d8 100644
--- a/app/lib/features/geckoview/features/browser/presentation/widgets/tab_creation_menu.dart
+++ b/app/lib/features/geckoview/features/browser/presentation/widgets/tab_creation_menu.dart
@@ -22,6 +22,7 @@ import 'package:flutter_material_design_icons/flutter_material_design_icons.dart
import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:weblibre/core/routing/routes.dart';
import 'package:weblibre/features/user/domain/repositories/general_settings.dart';
+import 'package:weblibre/presentation/icons/weblibre_icons.dart';
class TabCreationMenu extends HookConsumerWidget {
final Widget child;
@@ -58,7 +59,7 @@ class TabCreationMenu extends HookConsumerWidget {
onPressed: () async {
await const SearchRoute(tabType: TabType.private).push(context);
},
- leadingIcon: const Icon(MdiIcons.tabUnselected),
+ leadingIcon: const Icon(WebLibreIcons.privateTab),
child: const Text('Add Private Tab'),
),
if (createChildTabsOption)
diff --git a/app/lib/features/geckoview/features/browser/presentation/widgets/tab_menu.dart b/app/lib/features/geckoview/features/browser/presentation/widgets/tab_menu.dart
index b3b3192f..786b7e7a 100644
--- a/app/lib/features/geckoview/features/browser/presentation/widgets/tab_menu.dart
+++ b/app/lib/features/geckoview/features/browser/presentation/widgets/tab_menu.dart
@@ -44,6 +44,7 @@ import 'package:weblibre/features/geckoview/features/tabs/domain/providers.dart'
import 'package:weblibre/features/geckoview/features/tabs/domain/repositories/container.dart';
import 'package:weblibre/features/geckoview/features/tabs/domain/repositories/tab.dart';
import 'package:weblibre/presentation/hooks/menu_controller.dart';
+import 'package:weblibre/presentation/icons/weblibre_icons.dart';
import 'package:weblibre/presentation/widgets/website_feed_menu_button.dart';
import 'package:weblibre/utils/ui_helper.dart' as ui_helper;
@@ -237,7 +238,7 @@ class TabMenu extends HookConsumerWidget {
},
),
MenuItemButton(
- leadingIcon: const Icon(MdiIcons.tabUnselected),
+ leadingIcon: const Icon(WebLibreIcons.privateTab),
child: const Text('Private'),
onPressed: () async {
final tabState = ref.read(tabStateProvider(selectedTabId))!;
diff --git a/app/lib/features/geckoview/features/browser/presentation/widgets/tab_view/tab_view_header.dart b/app/lib/features/geckoview/features/browser/presentation/widgets/tab_view/tab_view_header.dart
index 5c95967d..ebd37242 100644
--- a/app/lib/features/geckoview/features/browser/presentation/widgets/tab_view/tab_view_header.dart
+++ b/app/lib/features/geckoview/features/browser/presentation/widgets/tab_view/tab_view_header.dart
@@ -46,6 +46,7 @@ import 'package:weblibre/features/geckoview/features/tabs/presentation/widgets/c
import 'package:weblibre/features/tor/presentation/controllers/start_tor_proxy.dart';
import 'package:weblibre/features/user/domain/repositories/general_settings.dart';
import 'package:weblibre/presentation/hooks/menu_controller.dart';
+import 'package:weblibre/presentation/icons/weblibre_icons.dart';
import 'package:weblibre/presentation/widgets/speech_to_text_button.dart';
import 'package:weblibre/utils/ui_helper.dart' as ui_helper;
@@ -539,7 +540,7 @@ class TabViewHeader extends HookConsumerWidget {
tabsActionMenuController.open();
}
},
- icon: const Icon(MdiIcons.dotsVertical),
+ icon: const Icon(WebLibreIcons.tabOptions),
),
),
],
diff --git a/app/lib/features/geckoview/features/search/presentation/screens/search.dart b/app/lib/features/geckoview/features/search/presentation/screens/search.dart
index 4e111e78..e77f3e36 100644
--- a/app/lib/features/geckoview/features/search/presentation/screens/search.dart
+++ b/app/lib/features/geckoview/features/search/presentation/screens/search.dart
@@ -43,6 +43,7 @@ import 'package:weblibre/features/geckoview/features/search/presentation/widgets
import 'package:weblibre/features/user/domain/repositories/general_settings.dart';
import 'package:weblibre/presentation/hooks/on_listenable_change_selector.dart';
import 'package:weblibre/presentation/hooks/sampled_value_notifier.dart';
+import 'package:weblibre/presentation/icons/weblibre_icons.dart';
import 'package:weblibre/utils/text_field_line_count.dart';
import 'package:weblibre/utils/uri_parser.dart' as uri_parser;
@@ -280,7 +281,7 @@ class SearchScreen extends HookConsumerWidget {
const ButtonSegment(
value: TabType.private,
label: Text('Private'),
- icon: Icon(MdiIcons.tabUnselected),
+ icon: Icon(WebLibreIcons.privateTab),
),
if (createChildTabsOption)
const ButtonSegment(
diff --git a/app/lib/features/settings/presentation/screens/tabs_behavior_settings.dart b/app/lib/features/settings/presentation/screens/tabs_behavior_settings.dart
index f5b05f0e..2d49fb6f 100644
--- a/app/lib/features/settings/presentation/screens/tabs_behavior_settings.dart
+++ b/app/lib/features/settings/presentation/screens/tabs_behavior_settings.dart
@@ -29,6 +29,7 @@ import 'package:weblibre/features/settings/presentation/controllers/save_setting
import 'package:weblibre/features/settings/presentation/widgets/sections.dart';
import 'package:weblibre/features/user/data/models/general_settings.dart';
import 'package:weblibre/features/user/domain/repositories/general_settings.dart';
+import 'package:weblibre/presentation/icons/weblibre_icons.dart';
class TabsBehaviorSettingsScreen extends StatelessWidget {
const TabsBehaviorSettingsScreen({super.key});
@@ -136,7 +137,7 @@ class _NewTabDefaultSection extends HookConsumerWidget {
ButtonSegment(
value: TabType.private,
label: Text('Private'),
- icon: Icon(MdiIcons.tabUnselected),
+ icon: Icon(WebLibreIcons.privateTab),
),
],
selected: {defaultCreateTabType},
@@ -202,7 +203,7 @@ class _ExternalLinkHandlingSection extends HookConsumerWidget {
ButtonSegment(
value: TabIntentOpenSetting.private,
label: Text('Private'),
- icon: Icon(MdiIcons.tabUnselected),
+ icon: Icon(WebLibreIcons.privateTab),
),
],
selected: {tabIntentOpenSetting},
diff --git a/app/lib/presentation/icons/weblibre_icons.dart b/app/lib/presentation/icons/weblibre_icons.dart
new file mode 100644
index 00000000..f41f3eba
--- /dev/null
+++ b/app/lib/presentation/icons/weblibre_icons.dart
@@ -0,0 +1,45 @@
+/*
+ * Copyright (c) 2024-2025 Fabian Freund.
+ *
+ * This file is part of WebLibre
+ * (see https://weblibre.eu).
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see .
+ */
+import 'package:flutter/widgets.dart';
+
+enum WebLibreIcons implements IconData {
+ privateTab(0xEA01),
+ tabOptions(0xEA02);
+
+ const WebLibreIcons(this.codePoint);
+
+ @override
+ final int codePoint;
+
+ @override
+ String get fontFamily => 'WebLibre';
+
+ @override
+ List? get fontFamilyFallback => null;
+
+ @override
+ String? get fontPackage => null;
+
+ @override
+ bool get matchTextDirection => false;
+
+ @override
+ String toString() => 'WebLibreIcons.$name';
+}
diff --git a/app/pubspec.yaml b/app/pubspec.yaml
index d88ce570..af104d59 100644
--- a/app/pubspec.yaml
+++ b/app/pubspec.yaml
@@ -119,6 +119,9 @@ flutter:
- family: TorIcons
fonts:
- asset: assets/fonts/tor-icons.ttf
+ - family: WebLibre
+ fonts:
+ - asset: assets/fonts/WebLibre.ttf
flutter_launcher_icons:
android: "launcher_icon"