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"