diff --git a/THIRD_PARTY.md b/THIRD_PARTY.md index e55e0dfc5..693138cb7 100644 --- a/THIRD_PARTY.md +++ b/THIRD_PARTY.md @@ -42,6 +42,7 @@ | react-native-gesture-handler | MIT | https://github.com/software-mansion/react-native-gesture-handler | | react-native-keyboard-controller | MIT | https://github.com/kirillzyusko/react-native-keyboard-controller | | react-native-markdown-renderer | MIT | https://github.com/mientjan/react-native-markdown-renderer | +| react-native-nano-icons | MIT | https://github.com/software-mansion-labs/react-native-nano-icons | | react-native-nitro-modules | MIT | https://github.com/mrousavy/nitro | | react-native-pager-view | MIT | https://github.com/callstack/react-native-pager-view | | react-native-reanimated | MIT | https://github.com/software-mansion/react-native-reanimated | diff --git a/mobile/android/app/src/main/assets/fonts/app-icons.ttf b/mobile/android/app/src/main/assets/fonts/app-icons.ttf new file mode 100644 index 000000000..fb3095349 Binary files /dev/null and b/mobile/android/app/src/main/assets/fonts/app-icons.ttf differ diff --git a/mobile/app.config.ts b/mobile/app.config.ts index 8ac739ea6..4fc03ed80 100644 --- a/mobile/app.config.ts +++ b/mobile/app.config.ts @@ -103,6 +103,17 @@ export default (): ExpoConfig => { }), navigationBarPlugin({ android: { enforceNavigationBarContrast: false } }), ["react-native-android-widget", widgetPluginConfig], + [ + "react-native-nano-icons", + { + iconSets: [ + { + inputDir: "./assets/icons/app-icons", + outputDir: "./src/resources/icons", + }, + ], + }, + ], ...optionalPlugins, ], }; diff --git a/mobile/assets/icons/README.md b/mobile/assets/icons/README.md new file mode 100644 index 000000000..c6fa2ffc6 --- /dev/null +++ b/mobile/assets/icons/README.md @@ -0,0 +1,17 @@ +# Icon Specifications + +**Material Symbols** + +- Weight: `300` +- Grade: `-25` +- Optical Size: `24px` +- Rounded + +**Ionicons** + +- We use `color-wand`, `flask-filled`, `logo-github`, `logo-google-playstore`, `repeat`, and `shuffle`. + +**Custom Icons** + +- `nothing-arrow-right` +- `repeat-one` is a custom icon based on Ionicons' `repeat` & `calendar-number` icons. diff --git a/mobile/assets/icons/app-icons/activity-zone.svg b/mobile/assets/icons/app-icons/activity-zone.svg new file mode 100644 index 000000000..54c0d99d7 --- /dev/null +++ b/mobile/assets/icons/app-icons/activity-zone.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/mobile/assets/icons/app-icons/add.svg b/mobile/assets/icons/app-icons/add.svg new file mode 100644 index 000000000..173d00de1 --- /dev/null +++ b/mobile/assets/icons/app-icons/add.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/mobile/assets/icons/app-icons/archive.svg b/mobile/assets/icons/app-icons/archive.svg new file mode 100644 index 000000000..491812a28 --- /dev/null +++ b/mobile/assets/icons/app-icons/archive.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/mobile/assets/icons/app-icons/arrow-back.svg b/mobile/assets/icons/app-icons/arrow-back.svg new file mode 100644 index 000000000..edee3a115 --- /dev/null +++ b/mobile/assets/icons/app-icons/arrow-back.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/mobile/assets/icons/app-icons/autoplay.svg b/mobile/assets/icons/app-icons/autoplay.svg new file mode 100644 index 000000000..ad10007bb --- /dev/null +++ b/mobile/assets/icons/app-icons/autoplay.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/mobile/assets/icons/app-icons/bar-chart-4-bars.svg b/mobile/assets/icons/app-icons/bar-chart-4-bars.svg new file mode 100644 index 000000000..de3156f2f --- /dev/null +++ b/mobile/assets/icons/app-icons/bar-chart-4-bars.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/mobile/assets/icons/app-icons/cached.svg b/mobile/assets/icons/app-icons/cached.svg new file mode 100644 index 000000000..fd6ea38be --- /dev/null +++ b/mobile/assets/icons/app-icons/cached.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/mobile/assets/icons/app-icons/cancel.svg b/mobile/assets/icons/app-icons/cancel.svg new file mode 100644 index 000000000..fa24b9751 --- /dev/null +++ b/mobile/assets/icons/app-icons/cancel.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/mobile/assets/icons/app-icons/check-circle.svg b/mobile/assets/icons/app-icons/check-circle.svg new file mode 100644 index 000000000..ea57c5aa0 --- /dev/null +++ b/mobile/assets/icons/app-icons/check-circle.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/mobile/assets/icons/app-icons/check.svg b/mobile/assets/icons/app-icons/check.svg new file mode 100644 index 000000000..4bb7f7276 --- /dev/null +++ b/mobile/assets/icons/app-icons/check.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/mobile/assets/icons/app-icons/close.svg b/mobile/assets/icons/app-icons/close.svg new file mode 100644 index 000000000..ecabc15c2 --- /dev/null +++ b/mobile/assets/icons/app-icons/close.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/mobile/assets/icons/app-icons/color-wand.svg b/mobile/assets/icons/app-icons/color-wand.svg new file mode 100644 index 000000000..4be45b308 --- /dev/null +++ b/mobile/assets/icons/app-icons/color-wand.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/mobile/assets/icons/app-icons/conversion-path.svg b/mobile/assets/icons/app-icons/conversion-path.svg new file mode 100644 index 000000000..c627f4193 --- /dev/null +++ b/mobile/assets/icons/app-icons/conversion-path.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/mobile/assets/icons/app-icons/create-new-folder.svg b/mobile/assets/icons/app-icons/create-new-folder.svg new file mode 100644 index 000000000..d11288302 --- /dev/null +++ b/mobile/assets/icons/app-icons/create-new-folder.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/mobile/assets/icons/app-icons/delete.svg b/mobile/assets/icons/app-icons/delete.svg new file mode 100644 index 000000000..7c3fb4ef2 --- /dev/null +++ b/mobile/assets/icons/app-icons/delete.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/mobile/assets/icons/app-icons/do-not-disturb-on.svg b/mobile/assets/icons/app-icons/do-not-disturb-on.svg new file mode 100644 index 000000000..b82c521ed --- /dev/null +++ b/mobile/assets/icons/app-icons/do-not-disturb-on.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/mobile/assets/icons/app-icons/document-search.svg b/mobile/assets/icons/app-icons/document-search.svg new file mode 100644 index 000000000..b5dcd4d23 --- /dev/null +++ b/mobile/assets/icons/app-icons/document-search.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/mobile/assets/icons/app-icons/drag-handle.svg b/mobile/assets/icons/app-icons/drag-handle.svg new file mode 100644 index 000000000..b28299ba5 --- /dev/null +++ b/mobile/assets/icons/app-icons/drag-handle.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/mobile/assets/icons/app-icons/edit.svg b/mobile/assets/icons/app-icons/edit.svg new file mode 100644 index 000000000..011271717 --- /dev/null +++ b/mobile/assets/icons/app-icons/edit.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/mobile/assets/icons/app-icons/favorite-filled.svg b/mobile/assets/icons/app-icons/favorite-filled.svg new file mode 100644 index 000000000..b045be6bd --- /dev/null +++ b/mobile/assets/icons/app-icons/favorite-filled.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/mobile/assets/icons/app-icons/favorite.svg b/mobile/assets/icons/app-icons/favorite.svg new file mode 100644 index 000000000..6da9ffed7 --- /dev/null +++ b/mobile/assets/icons/app-icons/favorite.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/mobile/assets/icons/app-icons/file-save.svg b/mobile/assets/icons/app-icons/file-save.svg new file mode 100644 index 000000000..8aa223e2e --- /dev/null +++ b/mobile/assets/icons/app-icons/file-save.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/mobile/assets/icons/app-icons/flask-filled.svg b/mobile/assets/icons/app-icons/flask-filled.svg new file mode 100644 index 000000000..6e730e436 --- /dev/null +++ b/mobile/assets/icons/app-icons/flask-filled.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/mobile/assets/icons/app-icons/folder.svg b/mobile/assets/icons/app-icons/folder.svg new file mode 100644 index 000000000..8ec47477e --- /dev/null +++ b/mobile/assets/icons/app-icons/folder.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/mobile/assets/icons/app-icons/format-paint.svg b/mobile/assets/icons/app-icons/format-paint.svg new file mode 100644 index 000000000..a76e17f1e --- /dev/null +++ b/mobile/assets/icons/app-icons/format-paint.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/mobile/assets/icons/app-icons/graph-1.svg b/mobile/assets/icons/app-icons/graph-1.svg new file mode 100644 index 000000000..aba824694 --- /dev/null +++ b/mobile/assets/icons/app-icons/graph-1.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/mobile/assets/icons/app-icons/graphic-eq.svg b/mobile/assets/icons/app-icons/graphic-eq.svg new file mode 100644 index 000000000..a9bd72a84 --- /dev/null +++ b/mobile/assets/icons/app-icons/graphic-eq.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/mobile/assets/icons/app-icons/grid-view.svg b/mobile/assets/icons/app-icons/grid-view.svg new file mode 100644 index 000000000..2c0610d82 --- /dev/null +++ b/mobile/assets/icons/app-icons/grid-view.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/mobile/assets/icons/app-icons/history.svg b/mobile/assets/icons/app-icons/history.svg new file mode 100644 index 000000000..36a8b806c --- /dev/null +++ b/mobile/assets/icons/app-icons/history.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/mobile/assets/icons/app-icons/home-filled.svg b/mobile/assets/icons/app-icons/home-filled.svg new file mode 100644 index 000000000..69303c929 --- /dev/null +++ b/mobile/assets/icons/app-icons/home-filled.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/mobile/assets/icons/app-icons/home.svg b/mobile/assets/icons/app-icons/home.svg new file mode 100644 index 000000000..48c699bac --- /dev/null +++ b/mobile/assets/icons/app-icons/home.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/mobile/assets/icons/app-icons/image.svg b/mobile/assets/icons/app-icons/image.svg new file mode 100644 index 000000000..da57fc039 --- /dev/null +++ b/mobile/assets/icons/app-icons/image.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/mobile/assets/icons/app-icons/info.svg b/mobile/assets/icons/app-icons/info.svg new file mode 100644 index 000000000..145b237ee --- /dev/null +++ b/mobile/assets/icons/app-icons/info.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/mobile/assets/icons/app-icons/keyboard-arrow-down.svg b/mobile/assets/icons/app-icons/keyboard-arrow-down.svg new file mode 100644 index 000000000..77353ee2f --- /dev/null +++ b/mobile/assets/icons/app-icons/keyboard-arrow-down.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/mobile/assets/icons/app-icons/link-off.svg b/mobile/assets/icons/app-icons/link-off.svg new file mode 100644 index 000000000..16928fbaa --- /dev/null +++ b/mobile/assets/icons/app-icons/link-off.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/mobile/assets/icons/app-icons/logo-github.svg b/mobile/assets/icons/app-icons/logo-github.svg new file mode 100644 index 000000000..92ffd5666 --- /dev/null +++ b/mobile/assets/icons/app-icons/logo-github.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/mobile/assets/icons/app-icons/logo-google-playstore.svg b/mobile/assets/icons/app-icons/logo-google-playstore.svg new file mode 100644 index 000000000..4107a4666 --- /dev/null +++ b/mobile/assets/icons/app-icons/logo-google-playstore.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/mobile/assets/icons/app-icons/low-priority.svg b/mobile/assets/icons/app-icons/low-priority.svg new file mode 100644 index 000000000..f18ad3a37 --- /dev/null +++ b/mobile/assets/icons/app-icons/low-priority.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/mobile/assets/icons/app-icons/lyrics.svg b/mobile/assets/icons/app-icons/lyrics.svg new file mode 100644 index 000000000..36bf586ab --- /dev/null +++ b/mobile/assets/icons/app-icons/lyrics.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/mobile/assets/icons/app-icons/mobile-arrow-down.svg b/mobile/assets/icons/app-icons/mobile-arrow-down.svg new file mode 100644 index 000000000..dec7cd9b6 --- /dev/null +++ b/mobile/assets/icons/app-icons/mobile-arrow-down.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/mobile/assets/icons/app-icons/more-horiz.svg b/mobile/assets/icons/app-icons/more-horiz.svg new file mode 100644 index 000000000..dd29484ef --- /dev/null +++ b/mobile/assets/icons/app-icons/more-horiz.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/mobile/assets/icons/app-icons/more-vert.svg b/mobile/assets/icons/app-icons/more-vert.svg new file mode 100644 index 000000000..5027b9344 --- /dev/null +++ b/mobile/assets/icons/app-icons/more-vert.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/mobile/assets/icons/app-icons/nothing-arrow-right.svg b/mobile/assets/icons/app-icons/nothing-arrow-right.svg new file mode 100644 index 000000000..1c4418c96 --- /dev/null +++ b/mobile/assets/icons/app-icons/nothing-arrow-right.svg @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/mobile/assets/icons/app-icons/open-in-new.svg b/mobile/assets/icons/app-icons/open-in-new.svg new file mode 100644 index 000000000..31bb26d66 --- /dev/null +++ b/mobile/assets/icons/app-icons/open-in-new.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/mobile/assets/icons/app-icons/pause-filled.svg b/mobile/assets/icons/app-icons/pause-filled.svg new file mode 100644 index 000000000..d75951eac --- /dev/null +++ b/mobile/assets/icons/app-icons/pause-filled.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/mobile/assets/icons/app-icons/play-arrow-filled.svg b/mobile/assets/icons/app-icons/play-arrow-filled.svg new file mode 100644 index 000000000..7057f908f --- /dev/null +++ b/mobile/assets/icons/app-icons/play-arrow-filled.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/mobile/assets/icons/app-icons/playlist-add.svg b/mobile/assets/icons/app-icons/playlist-add.svg new file mode 100644 index 000000000..bd82ac5f8 --- /dev/null +++ b/mobile/assets/icons/app-icons/playlist-add.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/mobile/assets/icons/app-icons/queue-music.svg b/mobile/assets/icons/app-icons/queue-music.svg new file mode 100644 index 000000000..dbb87193c --- /dev/null +++ b/mobile/assets/icons/app-icons/queue-music.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/mobile/assets/icons/app-icons/remove.svg b/mobile/assets/icons/app-icons/remove.svg new file mode 100644 index 000000000..acdb03c24 --- /dev/null +++ b/mobile/assets/icons/app-icons/remove.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/mobile/assets/icons/app-icons/repeat-one.svg b/mobile/assets/icons/app-icons/repeat-one.svg new file mode 100644 index 000000000..6821c71b5 --- /dev/null +++ b/mobile/assets/icons/app-icons/repeat-one.svg @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/mobile/assets/icons/app-icons/repeat.svg b/mobile/assets/icons/app-icons/repeat.svg new file mode 100644 index 000000000..7277d9b96 --- /dev/null +++ b/mobile/assets/icons/app-icons/repeat.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/mobile/assets/icons/app-icons/save.svg b/mobile/assets/icons/app-icons/save.svg new file mode 100644 index 000000000..26114b498 --- /dev/null +++ b/mobile/assets/icons/app-icons/save.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/mobile/assets/icons/app-icons/schedule.svg b/mobile/assets/icons/app-icons/schedule.svg new file mode 100644 index 000000000..de104f7df --- /dev/null +++ b/mobile/assets/icons/app-icons/schedule.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/mobile/assets/icons/app-icons/search.svg b/mobile/assets/icons/app-icons/search.svg new file mode 100644 index 000000000..44c8f17ec --- /dev/null +++ b/mobile/assets/icons/app-icons/search.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/mobile/assets/icons/app-icons/settings.svg b/mobile/assets/icons/app-icons/settings.svg new file mode 100644 index 000000000..4a7d57f1f --- /dev/null +++ b/mobile/assets/icons/app-icons/settings.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/mobile/assets/icons/app-icons/shuffle.svg b/mobile/assets/icons/app-icons/shuffle.svg new file mode 100644 index 000000000..f211696bd --- /dev/null +++ b/mobile/assets/icons/app-icons/shuffle.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/mobile/assets/icons/app-icons/skip-next-filled.svg b/mobile/assets/icons/app-icons/skip-next-filled.svg new file mode 100644 index 000000000..3876c9629 --- /dev/null +++ b/mobile/assets/icons/app-icons/skip-next-filled.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/mobile/assets/icons/app-icons/skip-previous-filled.svg b/mobile/assets/icons/app-icons/skip-previous-filled.svg new file mode 100644 index 000000000..c36eaa093 --- /dev/null +++ b/mobile/assets/icons/app-icons/skip-previous-filled.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/mobile/assets/icons/app-icons/slow-motion-video.svg b/mobile/assets/icons/app-icons/slow-motion-video.svg new file mode 100644 index 000000000..3c59986a9 --- /dev/null +++ b/mobile/assets/icons/app-icons/slow-motion-video.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/mobile/assets/icons/app-icons/sort.svg b/mobile/assets/icons/app-icons/sort.svg new file mode 100644 index 000000000..77e977ffa --- /dev/null +++ b/mobile/assets/icons/app-icons/sort.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/mobile/assets/icons/app-icons/timer.svg b/mobile/assets/icons/app-icons/timer.svg new file mode 100644 index 000000000..715bc76b5 --- /dev/null +++ b/mobile/assets/icons/app-icons/timer.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/mobile/assets/icons/app-icons/translate.svg b/mobile/assets/icons/app-icons/translate.svg new file mode 100644 index 000000000..bc1e590ec --- /dev/null +++ b/mobile/assets/icons/app-icons/translate.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/mobile/assets/icons/app-icons/view-agenda.svg b/mobile/assets/icons/app-icons/view-agenda.svg new file mode 100644 index 000000000..be9611fb6 --- /dev/null +++ b/mobile/assets/icons/app-icons/view-agenda.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/mobile/assets/icons/app-icons/view-module.svg b/mobile/assets/icons/app-icons/view-module.svg new file mode 100644 index 000000000..74e0cf062 --- /dev/null +++ b/mobile/assets/icons/app-icons/view-module.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/mobile/assets/icons/app-icons/visibility-off-filled.svg b/mobile/assets/icons/app-icons/visibility-off-filled.svg new file mode 100644 index 000000000..98eb56002 --- /dev/null +++ b/mobile/assets/icons/app-icons/visibility-off-filled.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/mobile/assets/icons/app-icons/voice-selection.svg b/mobile/assets/icons/app-icons/voice-selection.svg new file mode 100644 index 000000000..5d846d57c --- /dev/null +++ b/mobile/assets/icons/app-icons/voice-selection.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/mobile/assets/icons/app-icons/volume-up-filled.svg b/mobile/assets/icons/app-icons/volume-up-filled.svg new file mode 100644 index 000000000..78b41df48 --- /dev/null +++ b/mobile/assets/icons/app-icons/volume-up-filled.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/mobile/assets/icons/app-icons/warning.svg b/mobile/assets/icons/app-icons/warning.svg new file mode 100644 index 000000000..5741f6600 --- /dev/null +++ b/mobile/assets/icons/app-icons/warning.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/mobile/package.json b/mobile/package.json index 822cd2f04..9e1199b75 100644 --- a/mobile/package.json +++ b/mobile/package.json @@ -60,6 +60,7 @@ "react-native-gesture-handler": "3.0.1", "react-native-keyboard-controller": "1.21.11", "react-native-markdown-renderer": "4.1.1", + "react-native-nano-icons": "1.0.0-nightly-20260611-d07ca9613", "react-native-nitro-modules": "0.35.9", "react-native-pager-view": "8.0.2", "react-native-reanimated": "4.3.1", diff --git a/mobile/pnpm-lock.yaml b/mobile/pnpm-lock.yaml index d55cd413f..b91943e5e 100644 --- a/mobile/pnpm-lock.yaml +++ b/mobile/pnpm-lock.yaml @@ -123,6 +123,9 @@ importers: react-native-markdown-renderer: specifier: 4.1.1 version: 4.1.1(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.3))(react@19.2.3) + react-native-nano-icons: + specifier: 1.0.0-nightly-20260611-d07ca9613 + version: 1.0.0-nightly-20260611-d07ca9613(expo@56.0.11)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.3))(react@19.2.3)(typescript@6.0.3) react-native-nitro-modules: specifier: 0.35.9 version: 0.35.9(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.3))(react@19.2.3) @@ -1134,9 +1137,15 @@ packages: '@expo/config-plugins@56.0.8': resolution: {integrity: sha512-phTuyBhgVLfqUHMjQkAfRtbyoY6yTxoKja1awtpVnEkoJDxPJuXx1KX5uvq1eZtt4bJQ08OBJ6P95INqRSHpRg==} + '@expo/config-plugins@56.0.9': + resolution: {integrity: sha512-/6a/S9USwx8OC9tGjHxbviLFiBHyueN3aoNWMLvWDEJoZ1CIVW800ZBzwXq/FYNK2qzcN1LxFmQtzD1zeFQKNA==} + '@expo/config-types@56.0.5': resolution: {integrity: sha512-GsAHO/MwW9ZRdgnmyfRXqVGLCP/zejD6rWnp5OROp8mBGRObKm4HfrjlUyT1skjMwCj1OrURx9ZfIc6yeBAkIA==} + '@expo/config-types@56.0.6': + resolution: {integrity: sha512-4Y6Aum5J4Re5NnxGVofRNe1aDwUBOmWhQYkynZsqzRtX/zEA1ADUeyHXuEckv9YD9djiyT7bKtLt5gKL3mA6VQ==} + '@expo/config@56.0.9': resolution: {integrity: sha512-/lqFeWGSrhpKJVP8tTN8LjuoIe8u8q2w7FzBL0C+wHgl+WM8l1qUIEYWy/sMvsG/NbpUIUsDHJRhQvOkU58eIw==} @@ -1930,6 +1939,9 @@ packages: '@tybys/wasm-util@0.10.2': resolution: {integrity: sha512-RoBvJ2X0wuKlWFIjrwffGw1IqZHKQqzIchKaadZZfnNpsAYp2mM0h36JtPCjNDAHGgYez/15uMBpfGwchhiMgg==} + '@types/emscripten@1.41.5': + resolution: {integrity: sha512-cMQm7pxu6BxtHyqJ7mQZ2kXWV5SLmugybFdHCBbJ5eHzOo6VhBckEgAT3//rP5FwPHNPeEiq4SmQ5ucBwsOo4Q==} + '@types/estree@1.0.9': resolution: {integrity: sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==} @@ -2438,6 +2450,10 @@ packages: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} engines: {node: '>=10'} + chalk@5.6.2: + resolution: {integrity: sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + chrome-launcher@0.15.2: resolution: {integrity: sha512-zdLEwNo3aUVzIhKhTtXfxhdvZhUghrnmkvcAq2NoDd+LeOHKf03H5jwZ8T/STsAlzyALkBVK552iaG1fGf1xVQ==} engines: {node: '>=12.13.0'} @@ -2457,10 +2473,18 @@ packages: resolution: {integrity: sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw==} engines: {node: '>=4'} + cli-cursor@5.0.0: + resolution: {integrity: sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==} + engines: {node: '>=18'} + cli-spinners@2.9.2: resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==} engines: {node: '>=6'} + cli-spinners@3.4.0: + resolution: {integrity: sha512-bXfOC4QcT1tKXGorxL3wbJm6XJPDqEnij2gQ2m7ESQuE+/z9YFIWnl/5RpTiKWbMq3EVKR4fRLJGn6DVfu0mpw==} + engines: {node: '>=18.20'} + cliui@8.0.1: resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} engines: {node: '>=12'} @@ -2562,6 +2586,9 @@ packages: csstype@3.2.3: resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==} + cubic2quad@1.2.1: + resolution: {integrity: sha512-wT5Y7mO8abrV16gnssKdmIhIbA9wSkeMzhh27jAguKrV82i24wER0vL5TGhUJ9dbJNDcigoRZ0IAHFEEEI4THQ==} + culori@4.0.2: resolution: {integrity: sha512-1+BhOB8ahCn4O0cep0Sh2l9KCOfOdY+BXJnKMHFFzDEouSr/el18QwXEMRlOj9UY5nCeA8UN3a/82rUWRBeyBw==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -3228,6 +3255,9 @@ packages: flow-enums-runtime@0.0.6: resolution: {integrity: sha512-3PYnM29RFXwvAN6Pc/scUfkI7RwhQ/xqyLUyPNlXUp9S40zI8nup9tUSrTLSVnWGBN38FNiGWbwZOB6uR4OGdw==} + fonteditor-core@2.6.3: + resolution: {integrity: sha512-YUryIKjkenjZ41E7JvM3V+02Ak4mTHDDTwBWgs9KBzypzHqLZHuua1UDRevZNTKawmnq1dbBAa70Jddl2+F4FQ==} + fontfaceobserver@2.3.0: resolution: {integrity: sha512-6FPvD/IVyT4ZlNe7Wcn5Fb/4ChigpucKYSvD6a+0iMoLn2inpo711eyIcKjmDtE5XNcgAkSH9uN/nfAeZzHEfg==} @@ -3278,6 +3308,10 @@ packages: resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} engines: {node: 6.* || 8.* || >= 10.*} + get-east-asian-width@1.6.0: + resolution: {integrity: sha512-QRbvDIbx6YklUe6RxeTeleMR0yv3cYH6PsPZHcnVn7xv7zO1BHN8r0XETu8n6Ye3Q+ahtSarc3WgtNWmehIBfA==} + engines: {node: '>=18'} + get-intrinsic@1.3.0: resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} engines: {node: '>= 0.4'} @@ -3525,6 +3559,10 @@ packages: resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} engines: {node: '>=0.10.0'} + is-interactive@2.0.0: + resolution: {integrity: sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==} + engines: {node: '>=12'} + is-map@2.0.3: resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} engines: {node: '>= 0.4'} @@ -3565,6 +3603,10 @@ packages: resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==} engines: {node: '>= 0.4'} + is-unicode-supported@2.1.0: + resolution: {integrity: sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==} + engines: {node: '>=18'} + is-weakmap@2.0.2: resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==} engines: {node: '>= 0.4'} @@ -3864,10 +3906,17 @@ packages: lodash.throttle@4.1.1: resolution: {integrity: sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==} + lodash@4.18.1: + resolution: {integrity: sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==} + log-symbols@2.2.0: resolution: {integrity: sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==} engines: {node: '>=4'} + log-symbols@7.0.1: + resolution: {integrity: sha512-ja1E3yCr9i/0hmBVaM0bfwDjnGy8I/s6PP4DFp+yP+a+mrHO4Rm7DtmnqROTUkHIkqffC84YY7AeqX6oFk0WFg==} + engines: {node: '>=18'} + loose-envify@1.4.0: resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} hasBin: true @@ -3988,6 +4037,9 @@ packages: engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} hasBin: true + microbuffer@1.0.0: + resolution: {integrity: sha512-O/SUXauVN4x6RaEJFqSPcXNtLFL+QzJHKZlyDVYFwcDDRVca3Fa/37QXXC+4zAGGa4YhHrHxKXuuHvLDIQECtA==} + micromatch@4.0.8: resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} engines: {node: '>=8.6'} @@ -4017,6 +4069,10 @@ packages: resolution: {integrity: sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==} engines: {node: '>=4'} + mimic-function@5.0.1: + resolution: {integrity: sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==} + engines: {node: '>=18'} + minimatch@10.2.5: resolution: {integrity: sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==} engines: {node: 18 || 20 || >=22} @@ -4174,6 +4230,10 @@ packages: resolution: {integrity: sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ==} engines: {node: '>=4'} + onetime@7.0.0: + resolution: {integrity: sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==} + engines: {node: '>=18'} + open@7.4.2: resolution: {integrity: sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==} engines: {node: '>=8'} @@ -4190,6 +4250,10 @@ packages: resolution: {integrity: sha512-eNwHudNbO1folBP3JsZ19v9azXWtQZjICdr3Q0TDPIaeBQ3mXLrh54wM+er0+hSp+dWKf+Z8KM58CYzEyIYxYg==} engines: {node: '>=6'} + ora@9.4.0: + resolution: {integrity: sha512-84cglkRILFxdtA8hAvLNdMrtBpPNBTrQ9/ulg0FA7xLMnD6mifv+enAIeRmvtv+WgdCE+LPGOfQmtJRrVaIVhQ==} + engines: {node: '>=20'} + own-keys@1.0.1: resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==} engines: {node: '>= 0.4'} @@ -4242,6 +4306,9 @@ packages: path-to-regexp@0.1.13: resolution: {integrity: sha512-A/AGNMFN3c8bOlvV9RreMdrv7jsmF9XIfDeCd87+I8RNg6s78BhJxMu69NEMHBSJFxKidViTEdruRwEk/WIKqA==} + pathkit-wasm@1.0.0: + resolution: {integrity: sha512-oREIcGpwnBBto6PfB3C20aIw9jBPLcSNVF1AlL5tGlXsoL2zqWVuD0mi8WMJQHHNemm6aR1hHH2lz+TO551Fgw==} + picocolors@1.1.1: resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} @@ -4374,6 +4441,10 @@ packages: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} + pyodide@0.29.4: + resolution: {integrity: sha512-tCseTsqU3kSxZIjkue5zXxTMNEwrKZwOIIEQRBA/VzHxFN1hoCxe4w41phfCdHd9it9RcCNQb5K/Re0InqMgvA==} + engines: {node: '>=18.0.0'} + qs@6.15.2: resolution: {integrity: sha512-Rzq0KEyX/w/tEybncDgdkZrJgVUsUMk3xjh3t5bv3S1HTAtg+uOYt72+ZfwiQwKdysThkTBdL/rTi6HDmX9Ddw==} engines: {node: '>=0.6'} @@ -4484,6 +4555,17 @@ packages: react: '>=18.0.0' react-native: '>=0.73.0' + react-native-nano-icons@1.0.0-nightly-20260611-d07ca9613: + resolution: {integrity: sha512-Fk0v+06QLtyOlZzaDg4YG/bGfW5La5PoLgdxFU+vJYCM3G/IdwLetBwP8O5goxsknhmiDA9YLMJG4SEMAGt+Pg==} + hasBin: true + peerDependencies: + expo: '*' + react: '*' + react-native: '*' + peerDependenciesMeta: + expo: + optional: true + react-native-nitro-modules@0.35.9: resolution: {integrity: sha512-yCO6eJ85SPPUo4a4an7H5oj6wPCSIT72fbjr5WZ/20n6zswaJ2gNNpnWtg2We0AZwkAOjSqkOJ0Vjc05p6kGiA==} peerDependencies: @@ -4631,6 +4713,10 @@ packages: resolution: {integrity: sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q==} engines: {node: '>=4'} + restore-cursor@5.1.0: + resolution: {integrity: sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==} + engines: {node: '>=18'} + reusify@1.1.0: resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} @@ -4822,6 +4908,10 @@ packages: resolution: {integrity: sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==} engines: {node: '>= 0.8'} + stdin-discarder@0.3.2: + resolution: {integrity: sha512-eCPu1qRxPVkl5605OTWF8Wz40b4Mf45NY5LQmVPQ599knfs5QhASUm9GbJ5BDMDOXgrnh0wyEdvzmL//YMlw0A==} + engines: {node: '>=18'} + stop-iteration-iterator@1.1.0: resolution: {integrity: sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==} engines: {node: '>= 0.4'} @@ -4848,6 +4938,10 @@ packages: resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} engines: {node: '>=12'} + string-width@8.2.1: + resolution: {integrity: sha512-IIaP0g3iy9Cyy18w3M9YcaDudujEAVHKt3a3QJg1+sr/oX96TbaGUubG0hJyCjCBThFH+tFpcIyoUHUn1ogaLA==} + engines: {node: '>=20'} + string.prototype.matchall@4.0.12: resolution: {integrity: sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==} engines: {node: '>= 0.4'} @@ -4910,6 +5004,13 @@ packages: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} + svg2ttf@6.1.0: + resolution: {integrity: sha512-EjxgcmhKcBpx/3fR1hPwVtJAbUc/ZsDpwOTF74SI3PbzCg4pDHnxVmoSuqgEqxVJGqqkSCI6+82cucpn2D5aOw==} + hasBin: true + + svgpath@2.6.0: + resolution: {integrity: sha512-OIWR6bKzXvdXYyO4DK/UWa1VA1JeKq8E+0ug2DG98Y/vOmMpfZNj+TIG988HjfYSqtcy/hFOtZq/n/j5GSESNg==} + synckit@0.11.13: resolution: {integrity: sha512-eNRKgb3z66Yp3D2CixVujOUvXLFUTij/zVnV8KRyvFdQwpz7I5DS8UfRkTeLzb64u+dkzDSdelE24izu+zSSUg==} engines: {node: ^14.18.0 || >=16.0.0} @@ -5249,6 +5350,10 @@ packages: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} + yoctocolors@2.1.2: + resolution: {integrity: sha512-CzhO+pFNo8ajLM2d2IW/R93ipy99LWjtwblvC1RsoSUMZgyLbYFr221TnSNT7GjGdYui6P459mw9JH/g/zW2ug==} + engines: {node: '>=18'} + zod-validation-error@4.0.2: resolution: {integrity: sha512-Q6/nZLe6jxuU80qb/4uJ4t5v2VEZ44lzQjPDhYJNztRQ4wyWc6VF3D3Kb/fAuPetZQnhS3hnajCf9CsWesghLQ==} engines: {node: '>=18.0.0'} @@ -6168,8 +6273,29 @@ snapshots: - supports-color - typescript + '@expo/config-plugins@56.0.9(typescript@6.0.3)': + dependencies: + '@expo/config-types': 56.0.6 + '@expo/json-file': 10.2.0 + '@expo/plist': 0.7.0 + '@expo/require-utils': 56.1.3(typescript@6.0.3) + '@expo/sdk-runtime-versions': 1.0.0 + chalk: 4.1.2 + debug: 4.4.3 + getenv: 2.0.0 + glob: 13.0.6 + semver: 7.8.4 + slugify: 1.6.9 + xcode: 3.0.1 + xml2js: 0.6.0 + transitivePeerDependencies: + - supports-color + - typescript + '@expo/config-types@56.0.5': {} + '@expo/config-types@56.0.6': {} + '@expo/config@56.0.9(typescript@6.0.3)': dependencies: '@expo/config-plugins': 56.0.8(typescript@6.0.3) @@ -7051,6 +7177,8 @@ snapshots: tslib: 2.8.1 optional: true + '@types/emscripten@1.41.5': {} + '@types/estree@1.0.9': {} '@types/istanbul-lib-coverage@2.0.6': {} @@ -7609,6 +7737,8 @@ snapshots: ansi-styles: 4.3.0 supports-color: 7.2.0 + chalk@5.6.2: {} + chrome-launcher@0.15.2: dependencies: '@types/node': 25.9.3 @@ -7636,8 +7766,14 @@ snapshots: dependencies: restore-cursor: 2.0.0 + cli-cursor@5.0.0: + dependencies: + restore-cursor: 5.1.0 + cli-spinners@2.9.2: {} + cli-spinners@3.4.0: {} + cliui@8.0.1: dependencies: string-width: 4.2.3 @@ -7744,6 +7880,8 @@ snapshots: csstype@3.2.3: {} + cubic2quad@1.2.1: {} + culori@4.0.2: {} data-view-buffer@1.0.2: @@ -8564,6 +8702,10 @@ snapshots: flow-enums-runtime@0.0.6: {} + fonteditor-core@2.6.3: + dependencies: + '@xmldom/xmldom': 0.8.13 + fontfaceobserver@2.3.0: {} for-each@0.3.5: @@ -8606,6 +8748,8 @@ snapshots: get-caller-file@2.0.5: {} + get-east-asian-width@1.6.0: {} + get-intrinsic@1.3.0: dependencies: call-bind-apply-helpers: 1.0.2 @@ -8856,6 +9000,8 @@ snapshots: dependencies: is-extglob: 2.1.1 + is-interactive@2.0.0: {} + is-map@2.0.3: {} is-negative-zero@2.0.3: {} @@ -8895,6 +9041,8 @@ snapshots: dependencies: which-typed-array: 1.1.22 + is-unicode-supported@2.1.0: {} + is-weakmap@2.0.2: {} is-weakref@1.1.1: @@ -9146,10 +9294,17 @@ snapshots: lodash.throttle@4.1.1: {} + lodash@4.18.1: {} + log-symbols@2.2.0: dependencies: chalk: 2.4.2 + log-symbols@7.0.1: + dependencies: + is-unicode-supported: 2.1.0 + yoctocolors: 2.1.2 + loose-envify@1.4.0: dependencies: js-tokens: 4.0.0 @@ -9375,6 +9530,8 @@ snapshots: - supports-color - utf-8-validate + microbuffer@1.0.0: {} + micromatch@4.0.8: dependencies: braces: 3.0.3 @@ -9396,6 +9553,8 @@ snapshots: mimic-fn@1.2.0: {} + mimic-function@5.0.1: {} + minimatch@10.2.5: dependencies: brace-expansion: 5.0.6 @@ -9548,6 +9707,10 @@ snapshots: dependencies: mimic-fn: 1.2.0 + onetime@7.0.0: + dependencies: + mimic-function: 5.0.1 + open@7.4.2: dependencies: is-docker: 2.2.1 @@ -9577,6 +9740,17 @@ snapshots: strip-ansi: 5.2.0 wcwidth: 1.0.1 + ora@9.4.0: + dependencies: + chalk: 5.6.2 + cli-cursor: 5.0.0 + cli-spinners: 3.4.0 + is-interactive: 2.0.0 + is-unicode-supported: 2.1.0 + log-symbols: 7.0.1 + stdin-discarder: 0.3.2 + string-width: 8.2.1 + own-keys@1.0.1: dependencies: get-intrinsic: 1.3.0 @@ -9623,6 +9797,8 @@ snapshots: path-to-regexp@0.1.13: {} + pathkit-wasm@1.0.0: {} + picocolors@1.1.1: {} picomatch@2.3.2: {} @@ -9693,6 +9869,14 @@ snapshots: punycode@2.3.1: {} + pyodide@0.29.4: + dependencies: + '@types/emscripten': 1.41.5 + ws: 8.21.0 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + qs@6.15.2: dependencies: side-channel: 1.1.1 @@ -9805,6 +9989,28 @@ snapshots: react: 19.2.3 react-native: 0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.3) + react-native-nano-icons@1.0.0-nightly-20260611-d07ca9613(expo@56.0.11)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.3))(react@19.2.3)(typescript@6.0.3): + dependencies: + '@expo/config-plugins': 56.0.9(typescript@6.0.3) + '@xmldom/xmldom': 0.9.10 + chalk: 5.6.2 + fonteditor-core: 2.6.3 + ora: 9.4.0 + pathkit-wasm: 1.0.0 + plist: 3.1.1 + pyodide: 0.29.4 + react: 19.2.3 + react-native: 0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.3) + svg2ttf: 6.1.0 + xcode: 3.0.1 + optionalDependencies: + expo: 56.0.11(@babel/core@7.29.7)(@expo/dom-webview@56.0.5)(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.3))(react@19.2.3))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.3))(react@19.2.3)(typescript@6.0.3) + transitivePeerDependencies: + - bufferutil + - supports-color + - typescript + - utf-8-validate + react-native-nitro-modules@0.35.9(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.3))(react@19.2.3): dependencies: react: 19.2.3 @@ -10015,6 +10221,11 @@ snapshots: onetime: 2.0.1 signal-exit: 3.0.7 + restore-cursor@5.1.0: + dependencies: + onetime: 7.0.0 + signal-exit: 4.1.0 + reusify@1.1.0: {} run-parallel@1.2.0: @@ -10251,6 +10462,8 @@ snapshots: statuses@2.0.2: {} + stdin-discarder@0.3.2: {} + stop-iteration-iterator@1.1.0: dependencies: es-errors: 1.3.0 @@ -10278,6 +10491,11 @@ snapshots: emoji-regex: 9.2.2 strip-ansi: 7.2.0 + string-width@8.2.1: + dependencies: + get-east-asian-width: 1.6.0 + strip-ansi: 7.2.0 + string.prototype.matchall@4.0.12: dependencies: call-bind: 1.0.9 @@ -10360,6 +10578,17 @@ snapshots: supports-preserve-symlinks-flag@1.0.0: {} + svg2ttf@6.1.0: + dependencies: + '@xmldom/xmldom': 0.9.10 + argparse: 2.0.1 + cubic2quad: 1.2.1 + lodash: 4.18.1 + microbuffer: 1.0.0 + svgpath: 2.6.0 + + svgpath@2.6.0: {} + synckit@0.11.13: dependencies: '@pkgr/core': 0.3.6 @@ -10708,6 +10937,8 @@ snapshots: yocto-queue@0.1.0: {} + yoctocolors@2.1.2: {} + zod-validation-error@4.0.2(zod@4.4.3): dependencies: zod: 4.4.3 diff --git a/mobile/src/components/Base/AnimatedMaterialSymbol.tsx b/mobile/src/components/Base/AnimatedMaterialSymbol.tsx index 097c4d969..7ddabc0bc 100644 --- a/mobile/src/components/Base/AnimatedMaterialSymbol.tsx +++ b/mobile/src/components/Base/AnimatedMaterialSymbol.tsx @@ -1,12 +1,23 @@ import Animated from "react-native-reanimated"; import { Path, Svg } from "react-native-svg"; -import type { Icon } from "~/resources/icons/type"; - +import type { AppColor } from "~/modules/customization/theme/core/constants"; import { useColor } from "~/modules/customization/theme/hooks"; const AnimatedPath = Animated.createAnimatedComponent(Path); +interface Props { + /** Defaults to `24px`. */ + size?: number; + /** Defaults to theme's `onSurface` color. */ + color?: AppColor; + /** + * Use the alternative version of the icon if available (ie: filled, animated). + * Defaults to `false`. + */ + alternative?: boolean; +} + /** * Create an Icon where setting the `alternative` prop will animate the * SVG via Reanimated's CSS SVG Animations. @@ -20,7 +31,7 @@ export function createAnimatedMaterialSymbol( size = 24, color, alternative = false, - }: Icon) { + }: Props) { const usedColor = useColor(color, "onSurface"); return ( diff --git a/mobile/src/components/Form/Button/Icon.tsx b/mobile/src/components/Form/Button/Icon.tsx index d6bd8e56e..f7e2892b9 100644 --- a/mobile/src/components/Form/Button/Icon.tsx +++ b/mobile/src/components/Form/Button/Icon.tsx @@ -1,7 +1,8 @@ import { memo } from "react"; import { View } from "react-native"; -import type { Icon } from "~/resources/icons/type"; +import type { SupportedIconName } from "~/resources/icons"; +import { Icon } from "~/resources/icons"; import { cn } from "~/lib/style"; import type { AppColor } from "~/modules/customization/theme/core/constants"; @@ -19,12 +20,10 @@ const ButtonConfig = { } as const; type IconButtonProps = PressProps & { - Icon: (props: Icon) => React.JSX.Element; + icon: SupportedIconName; accessibilityLabel: string; /** Defaults to `md`. */ size?: ButtonSize; - /** Use the `alternative` variant on the icon if available. */ - alternative?: boolean; className?: string; _iconColor?: AppColor; _rippleColor?: AppColor; @@ -32,9 +31,8 @@ type IconButtonProps = PressProps & { //#region Default export const IconButton = memo(function IconButton({ - Icon, + icon, size = "sm", - alternative, _iconColor, _rippleColor, ...props @@ -56,7 +54,7 @@ export const IconButton = memo(function IconButton({ style={[pressed && { backgroundColor: `${rippleColor}80` }]} className="rounded-full p-1.5" > - + )} @@ -66,9 +64,8 @@ export const IconButton = memo(function IconButton({ //#region Filled export const FilledIconButton = memo(function FilledIconButton({ - Icon, + icon, size = "sm", - alternative, _iconColor, ...props }: IconButtonProps) { @@ -82,7 +79,7 @@ export const FilledIconButton = memo(function FilledIconButton({ props.className, )} > - + ); }); diff --git a/mobile/src/components/Form/Checkbox.tsx b/mobile/src/components/Form/Checkbox.tsx index 4b0da18d5..f167e0fc4 100644 --- a/mobile/src/components/Form/Checkbox.tsx +++ b/mobile/src/components/Form/Checkbox.tsx @@ -2,7 +2,7 @@ import type { ParseKeys } from "i18next"; import { memo } from "react"; import { View } from "react-native"; -import { Check } from "~/resources/icons/Check"; +import { Icon } from "~/resources/icons"; import { cn } from "~/lib/style"; import { Pressable } from "../Base/Pressable"; @@ -18,7 +18,7 @@ function Checkbox({ checked, size = 20 }: { checked: boolean; size?: number }) { { "border-0 bg-onSurface": checked }, )} > - {checked ? : null} + {checked ? : null} ); } diff --git a/mobile/src/components/Form/NumberStepper.tsx b/mobile/src/components/Form/NumberStepper.tsx index eb0005e2e..582ee87c2 100644 --- a/mobile/src/components/Form/NumberStepper.tsx +++ b/mobile/src/components/Form/NumberStepper.tsx @@ -2,9 +2,6 @@ import { memo, useCallback } from "react"; import { useTranslation } from "react-i18next"; import { View } from "react-native"; -import { Add } from "~/resources/icons/Add"; -import { Remove } from "~/resources/icons/Remove"; - import { FilledIconButton } from "./Button/Icon"; import { Em } from "../Typography/StyledText"; @@ -33,7 +30,7 @@ export const NumberStepper = memo(function NumberStepper({ return ( - {selected ? : null} + {selected ? : null} ); } diff --git a/mobile/src/components/Form/SegmentedPicker.tsx b/mobile/src/components/Form/SegmentedPicker.tsx index 818336a39..bda277cb9 100644 --- a/mobile/src/components/Form/SegmentedPicker.tsx +++ b/mobile/src/components/Form/SegmentedPicker.tsx @@ -5,7 +5,8 @@ import Animated, { withTiming, } from "react-native-reanimated"; -import type { Icon } from "~/resources/icons/type"; +import type { SupportedIconName } from "~/resources/icons"; +import { Icon } from "~/resources/icons"; import { OnRTLWorklet } from "~/lib/react"; import { cn } from "~/lib/style"; @@ -13,7 +14,7 @@ import { Pressable } from "../Base/Pressable"; import { Em } from "../Typography/StyledText"; export type PickerOption = { - Icon: (props: Icon) => React.JSX.Element; + icon: SupportedIconName; label: string; }; @@ -53,13 +54,14 @@ export function SegmentedPicker({ style={selectedIndicatorStyle} className="absolute top-0 left-0 h-full rounded-full bg-onSurface" /> - {options.map(({ Icon }, idx) => ( + {options.map(({ icon }, idx) => ( onOptionSelected(idx)} className="min-h-10 flex-1 items-center justify-center rounded-full active:opacity-50" > diff --git a/mobile/src/components/Form/Slider.tsx b/mobile/src/components/Form/Slider.tsx index de803d16d..e38d63bc2 100644 --- a/mobile/src/components/Form/Slider.tsx +++ b/mobile/src/components/Form/Slider.tsx @@ -20,7 +20,8 @@ import Animated, { } from "react-native-reanimated"; import { scheduleOnRN } from "react-native-worklets"; -import type { Icon } from "~/resources/icons/type"; +import type { SupportedIconName } from "~/resources/icons"; +import { Icon } from "~/resources/icons"; import { Colors } from "~/constants/Styles"; import { OnRTL } from "~/lib/react"; @@ -360,7 +361,7 @@ export const CachedSlider = memo(function CachedSlider(props: { //#region Overlay type SliderOverlayProps = { accessibilityLabelKey: ParseKeys; - Icon: (props: Icon) => React.ReactNode; + icon: SupportedIconName; formatValue: (val: number) => string; }; @@ -390,7 +391,7 @@ const SliderOverlay = memo(function SliderOverlay( { "flex-row-reverse": props.inverted }, )} > - + {formattedValue} diff --git a/mobile/src/components/List/RemovableItem.tsx b/mobile/src/components/List/RemovableItem.tsx index fdbed2558..e3d5ec638 100644 --- a/mobile/src/components/List/RemovableItem.tsx +++ b/mobile/src/components/List/RemovableItem.tsx @@ -2,8 +2,6 @@ import { memo, useMemo } from "react"; import { useTranslation } from "react-i18next"; import { View } from "react-native"; -import { DoNotDisturbOn } from "~/resources/icons/DoNotDisturbOn"; - import { cn } from "~/lib/style"; import { Pressable } from "../Base/Pressable"; import { IconButton } from "../Form/Button/Icon"; @@ -43,7 +41,7 @@ export const RemovableItem = memo(function RemovableItem( className={cn("min-h-12 flex-row items-center gap-1", props.className)} > - + ); } diff --git a/mobile/src/modules/audio/_components/AudioEffectSlider.tsx b/mobile/src/modules/audio/_components/AudioEffectSlider.tsx index e7cc515e5..71f288475 100644 --- a/mobile/src/modules/audio/_components/AudioEffectSlider.tsx +++ b/mobile/src/modules/audio/_components/AudioEffectSlider.tsx @@ -1,6 +1,7 @@ import { View } from "react-native"; -import type { Icon } from "~/resources/icons/type"; +import type { SupportedIconName } from "~/resources/icons"; +import { Icon } from "~/resources/icons"; import { CachedSlider } from "~/components/Form/Slider"; import { Em } from "~/components/Typography/StyledText"; @@ -11,10 +12,10 @@ interface Props extends Omit< > { displayedValue: string; /** Optional icon that appears before the `displayedValue`. */ - Icon?: (props: Icon) => React.JSX.Element; + icon?: SupportedIconName; } -export function AudioEffectSlider({ displayedValue, Icon, ...props }: Props) { +export function AudioEffectSlider({ displayedValue, icon, ...props }: Props) { return ( - {Icon ? : null} + {icon ? : null} {displayedValue} diff --git a/mobile/src/modules/audio/_components/PlaybackParameterSettings.tsx b/mobile/src/modules/audio/_components/PlaybackParameterSettings.tsx index 2b1b21fa4..072eee3b3 100644 --- a/mobile/src/modules/audio/_components/PlaybackParameterSettings.tsx +++ b/mobile/src/modules/audio/_components/PlaybackParameterSettings.tsx @@ -1,8 +1,5 @@ import AudioBrowser from "react-native-audio-browser"; -import { SlowMotionVideo } from "~/resources/icons/SlowMotionVideo"; -import { VoiceSelection } from "~/resources/icons/VoiceSelection"; - import { SegmentedList } from "~/components/List/Segmented"; import { PlaybackParameterSlider } from "./PlaybackParameterSlider"; @@ -12,12 +9,12 @@ export function PlaybackParameterSettings() { ); diff --git a/mobile/src/modules/audio/_components/PlaybackParameterSlider.tsx b/mobile/src/modules/audio/_components/PlaybackParameterSlider.tsx index 31d13063c..32d69b221 100644 --- a/mobile/src/modules/audio/_components/PlaybackParameterSlider.tsx +++ b/mobile/src/modules/audio/_components/PlaybackParameterSlider.tsx @@ -2,7 +2,7 @@ import { memo, useCallback, useMemo } from "react"; import { View } from "react-native"; import { useSharedValue } from "react-native-reanimated"; -import type { Icon } from "~/resources/icons/type"; +import type { SupportedIconName } from "~/resources/icons"; import { sessionStore, useSessionStore } from "~/stores/Session/store"; import { capitalize } from "~/utils/string"; @@ -17,7 +17,7 @@ export const PlaybackParameterSlider = memo( function PlaybackParameterSlider(props: { field: "pitch" | "speed"; onUpdate: (value: number) => void; - Icon: (props: Icon) => React.JSX.Element; + icon: SupportedIconName; }) { const fieldName = `playback${capitalize(props.field)}` as const; const fieldNameKey = `feat.playback.extra.${props.field}` as const; @@ -59,7 +59,7 @@ export const PlaybackParameterSlider = memo( max={2} step={0.05} onChange={setField} - Icon={props.Icon} + icon={props.icon} displayedValue={`${numberFormatter.format(storedValue)}x`} /> {PresetButtons} diff --git a/mobile/src/modules/audio/_components/VolumeSettings.tsx b/mobile/src/modules/audio/_components/VolumeSettings.tsx index a6166d45b..27af7212e 100644 --- a/mobile/src/modules/audio/_components/VolumeSettings.tsx +++ b/mobile/src/modules/audio/_components/VolumeSettings.tsx @@ -3,7 +3,6 @@ import AudioBrowser from "react-native-audio-browser"; import { useAnimatedReaction, useSharedValue } from "react-native-reanimated"; import { scheduleOnRN } from "react-native-worklets"; -import { VolumeUp } from "~/resources/icons/VolumeUp"; import { playbackStore, usePlaybackStore } from "~/stores/Playback/store"; import { SegmentedList } from "~/components/List/Segmented"; @@ -39,7 +38,7 @@ export function VolumeSettings() { step={0.01} onChange={setVolume} _debounceMultiplier={5} - Icon={VolumeUp} + icon="volume-up-filled" displayedValue={`${Math.round(_volume * 100)}%`} /> diff --git a/mobile/src/modules/customization/font/screens/CreateView.tsx b/mobile/src/modules/customization/font/screens/CreateView.tsx index aa455c070..bc7886821 100644 --- a/mobile/src/modules/customization/font/screens/CreateView.tsx +++ b/mobile/src/modules/customization/font/screens/CreateView.tsx @@ -5,8 +5,6 @@ import { useTranslation } from "react-i18next"; import { View } from "react-native"; import { z } from "zod/mini"; -import { Close } from "~/resources/icons/Close"; - import { pickFile } from "~/lib/file-system"; import { wait } from "~/utils/promise"; import { KeyboardAwareScrollView } from "~/components/Base/ScrollView"; @@ -89,7 +87,7 @@ function FontForm() { {data.uri} setFields({ uri: "" })} disabled={isSubmitting} diff --git a/mobile/src/modules/customization/font/screens/View.tsx b/mobile/src/modules/customization/font/screens/View.tsx index fd37dc83e..6bc8eba8a 100644 --- a/mobile/src/modules/customization/font/screens/View.tsx +++ b/mobile/src/modules/customization/font/screens/View.tsx @@ -5,8 +5,6 @@ import { View } from "react-native"; import type { CustomFont } from "~/db/schema"; -import { Add } from "~/resources/icons/Add"; -import { Delete } from "~/resources/icons/Delete"; import { usePreferenceStore } from "~/stores/Preference/store"; import { PreferenceSetters } from "~/stores/Preference/actions"; @@ -74,7 +72,7 @@ function FontsScreenBase(props: { ( navigation.navigate("CreateFont")} /> @@ -105,7 +103,7 @@ function FontsScreenBase(props: { {canDeleteFont(font) ? ( deleteCustomFont(font.id)} _iconColor="error" diff --git a/mobile/src/modules/customization/theme/screens/View.tsx b/mobile/src/modules/customization/theme/screens/View.tsx index d3fd669dc..db26a8c4e 100644 --- a/mobile/src/modules/customization/theme/screens/View.tsx +++ b/mobile/src/modules/customization/theme/screens/View.tsx @@ -4,10 +4,7 @@ import { useMemo } from "react"; import { useTranslation } from "react-i18next"; import { View } from "react-native"; -import { Add } from "~/resources/icons/Add"; -import { Check } from "~/resources/icons/Check"; -import { Edit } from "~/resources/icons/Edit"; -import { FileSave } from "~/resources/icons/FileSave"; +import { Icon } from "~/resources/icons"; import { usePreferenceStore } from "~/stores/Preference/store"; import { PreferenceSetters } from "~/stores/Preference/actions"; @@ -59,7 +56,7 @@ export default function Themes() { ( navigation.navigate("CreateTheme")} /> @@ -93,7 +90,9 @@ export default function Themes() { )} style={{ borderColor: themeColors.onSurface }} > - {selected ? : null} + {selected ? ( + + ) : null} navigation.navigate("ModifyTheme", { id: themeId }) @@ -115,7 +114,7 @@ export default function Themes() { _rippleColor={themeColors.surfaceContainerHigh as HexColor} /> onExportTheme(formatCustomTheme(themeMap[themeId]!)) diff --git a/mobile/src/modules/form/FormState/FormInput.tsx b/mobile/src/modules/form/FormState/FormInput.tsx index 8d132ba15..4bae21109 100644 --- a/mobile/src/modules/form/FormState/FormInput.tsx +++ b/mobile/src/modules/form/FormState/FormInput.tsx @@ -2,7 +2,6 @@ import type { ParseKeys } from "i18next"; import { useTranslation } from "react-i18next"; import { View } from "react-native"; -import { Add } from "~/resources/icons/Add"; import { useFormStateContext } from "."; import { cn } from "~/lib/style"; @@ -91,7 +90,7 @@ export function ArrayFormInputImpl>() { label={props.label} RightElement={ undefined : undefined} headerRight={() => ( navigation.navigate("ModifyLyric", { id: data.id })} className="absolute right-0 bottom-0 z-100" diff --git a/mobile/src/modules/lyric/screens/CurrentView.tsx b/mobile/src/modules/lyric/screens/CurrentView.tsx index 6e016b0cb..4ddf3d200 100644 --- a/mobile/src/modules/lyric/screens/CurrentView.tsx +++ b/mobile/src/modules/lyric/screens/CurrentView.tsx @@ -8,9 +8,6 @@ import { View } from "react-native"; import { db } from "~/db"; import { tracksToLyrics } from "~/db/schema"; -import { Add } from "~/resources/icons/Add"; -import { Edit } from "~/resources/icons/Edit"; -import { LinkOff } from "~/resources/icons/LinkOff"; import { queries as q } from "~/data/keyStore"; import { getArtistsString } from "~/data/artist/utils"; import { useLyric } from "~/data/lyric/queries"; @@ -55,7 +52,7 @@ export default function Lyric({ ( navigation.navigate("ModifyLyric", { id: lyricId })} /> @@ -72,7 +69,7 @@ export default function Lyric({ unlinkTrack({ trackId: id, lyricId })} /> diff --git a/mobile/src/modules/lyric/screens/ProviderView.tsx b/mobile/src/modules/lyric/screens/ProviderView.tsx index 4123144ea..7d3608d9b 100644 --- a/mobile/src/modules/lyric/screens/ProviderView.tsx +++ b/mobile/src/modules/lyric/screens/ProviderView.tsx @@ -4,11 +4,7 @@ import { useNavigation } from "@react-navigation/native"; import { useTranslation } from "react-i18next"; import { View } from "react-native"; -import { Add } from "~/resources/icons/Add"; -import { DragHandle } from "~/resources/icons/DragHandle"; -import { Edit } from "~/resources/icons/Edit"; -import { Info } from "~/resources/icons/Info"; -import { OpenInNew } from "~/resources/icons/OpenInNew"; +import { Icon } from "~/resources/icons"; import { useLyricStore } from "../core/store"; import { moveLyricProvider, toggleCheckEmbeddedLyrics } from "../core/actions"; import type { LyricProvider } from "../core/constants"; @@ -35,7 +31,7 @@ export default function LyricsProviders() { ( navigation.navigate("CreateLyricProvider")} /> @@ -78,7 +74,7 @@ function RenderItem({ item, index }: DragListRenderItemInfo) { RightElement={ navigation.navigate("ModifyLyricProvider", { id: item.id }) @@ -86,7 +82,7 @@ function RenderItem({ item, index }: DragListRenderItemInfo) { disabled={isDragging} /> openLink(Links.LyricsProviders)} className="flex-row items-start pl-2" > - + {t("feat.lyrics.extra.providersInstructions.line1")} {"\n\n"} {t("feat.lyrics.extra.providersInstructions.line2")} - + ( { // Clear `linkTo` param as it should get "used". @@ -50,7 +49,7 @@ export default function Lyrics({ } + RightElement={} onPress={() => navigation.navigate("Lyric", { id: item.id })} className={cn({ "mt-0.75 rounded-t-xs": index > 0, diff --git a/mobile/src/modules/media/components/MediaControls.tsx b/mobile/src/modules/media/components/MediaControls.tsx index 408479899..6254457bf 100644 --- a/mobile/src/modules/media/components/MediaControls.tsx +++ b/mobile/src/modules/media/components/MediaControls.tsx @@ -1,12 +1,5 @@ import { useTranslation } from "react-i18next"; -import { Pause } from "~/resources/icons/Pause"; -import { PlayArrow } from "~/resources/icons/PlayArrow"; -import { Repeat } from "~/resources/icons/Repeat"; -import { RepeatOne } from "~/resources/icons/RepeatOne"; -import { Shuffle } from "~/resources/icons/Shuffle"; -import { SkipNext } from "~/resources/icons/SkipNext"; -import { SkipPrevious } from "~/resources/icons/SkipPrevious"; import { usePlaybackStore } from "~/stores/Playback/store"; import { PlaybackControls, PlaybackSettings } from "~/stores/Playback/actions"; @@ -21,7 +14,7 @@ export function RepeatButton({ size = "lg" }: { size?: ButtonSize }) { return ( s.shuffle); return ( s.isPlaying); return ( PlaybackControls.playToggle()} className={cn("bg-primary px-6 py-2 active:bg-primaryDim", { @@ -70,7 +63,7 @@ export function NextButton({ size = "lg" }: { size?: ButtonSize }) { const { t } = useTranslation(); return ( PlaybackControls.next()} size={size} @@ -83,7 +76,7 @@ export function PreviousButton({ size = "lg" }: { size?: ButtonSize }) { const { t } = useTranslation(); return ( - + ); } diff --git a/mobile/src/modules/media/components/MediaListControls.tsx b/mobile/src/modules/media/components/MediaListControls.tsx index 93f78a2f3..0eea0655c 100644 --- a/mobile/src/modules/media/components/MediaListControls.tsx +++ b/mobile/src/modules/media/components/MediaListControls.tsx @@ -1,8 +1,6 @@ import { useTranslation } from "react-i18next"; import { View } from "react-native"; -import { Pause } from "~/resources/icons/Pause"; -import { PlayArrow } from "~/resources/icons/PlayArrow"; import { usePlaybackStore } from "~/stores/Playback/store"; import { PlaybackControls } from "~/stores/Playback/actions"; @@ -41,7 +39,7 @@ export function PlayMediaListButton(props: { return ( displayPause diff --git a/mobile/src/modules/media/components/Track.tsx b/mobile/src/modules/media/components/Track.tsx index 3c3f3ab5e..3806efd16 100644 --- a/mobile/src/modules/media/components/Track.tsx +++ b/mobile/src/modules/media/components/Track.tsx @@ -1,9 +1,6 @@ import { useMemo } from "react"; import { useTranslation } from "react-i18next"; -import { Favorite } from "~/resources/icons/Favorite"; -import { MoreVert } from "~/resources/icons/MoreVert"; -import { QueueMusic } from "~/resources/icons/QueueMusic"; import { useTrackFavoriteStatus, useToggleTrackInPlaylist, @@ -71,13 +68,13 @@ export function TrackAction(props: { id: string; title: string }) { {quickFavorite ? : null} {quickAddQueue ? ( Queue.add({ id: props.id, name: props.title })} /> ) : null} presentTrackSheet(props.id)} /> @@ -95,10 +92,9 @@ export function FavoriteButton(props: { id: string; size?: ButtonSize }) { return ( mutateGuard(toggleInPlaylist, FavoritesPlaylistKey)} - alternative={isFav} size={props.size} /> ); diff --git a/mobile/src/modules/scanning/components/ScanningProgressView.tsx b/mobile/src/modules/scanning/components/ScanningProgressView.tsx index b566fbb95..3f9625413 100644 --- a/mobile/src/modules/scanning/components/ScanningProgressView.tsx +++ b/mobile/src/modules/scanning/components/ScanningProgressView.tsx @@ -9,8 +9,8 @@ import Animated, { } from "react-native-reanimated"; import { useSafeAreaInsets } from "react-native-safe-area-context"; -import { Save } from "~/resources/icons/Save"; -import { Warning } from "~/resources/icons/Warning"; +import type { SupportedIconName } from "~/resources/icons"; +import { Icon } from "~/resources/icons"; import { useScanningProgressStore } from "../ScanningProgress"; import { CachedSlider } from "~/components/Form/Slider"; @@ -69,14 +69,14 @@ function TracksSavingProgress() { - + @@ -103,7 +103,7 @@ function ArtworkSavingProgress() { @@ -131,10 +131,13 @@ function ProgressLabel({ textKey }: { textKey: ParseKeys }) { ); } -function IconStatus(props: { Icon: typeof Save; value: string | number }) { +function IconStatus(props: { + icon: SupportedIconName; + value: string | number; +}) { return ( - + {props.value} diff --git a/mobile/src/modules/search/components/SearchBar.tsx b/mobile/src/modules/search/components/SearchBar.tsx index 3f6460aaa..6fa2998b7 100644 --- a/mobile/src/modules/search/components/SearchBar.tsx +++ b/mobile/src/modules/search/components/SearchBar.tsx @@ -1,8 +1,7 @@ import { useTranslation } from "react-i18next"; import { View } from "react-native"; -import { Close } from "~/resources/icons/Close"; -import { Search } from "~/resources/icons/Search"; +import { Icon } from "~/resources/icons"; import { IconButton } from "~/components/Form/Button/Icon"; import { TextInput, useInputRef } from "~/components/Form/Input"; @@ -18,7 +17,7 @@ export function SearchBar(props: { return ( - + { inputRef.current?.clear(); diff --git a/mobile/src/navigation/components/BottomActions/MiniPlayer.tsx b/mobile/src/navigation/components/BottomActions/MiniPlayer.tsx index 319b41322..058af6fd9 100644 --- a/mobile/src/navigation/components/BottomActions/MiniPlayer.tsx +++ b/mobile/src/navigation/components/BottomActions/MiniPlayer.tsx @@ -16,8 +16,6 @@ import Animated, { import { useSafeAreaInsets } from "react-native-safe-area-context"; import { scheduleOnRN } from "react-native-worklets"; -import { Pause } from "~/resources/icons/Pause"; -import { PlayArrow } from "~/resources/icons/PlayArrow"; import { getArtistsString } from "~/data/artist/utils"; import { usePlaybackStore } from "~/stores/Playback/store"; import { PlaybackControls } from "~/stores/Playback/actions"; @@ -150,7 +148,7 @@ export function MiniPlayer() { > {!gestureUI ? : null} PlaybackControls.playToggle()} size="lg" diff --git a/mobile/src/navigation/components/BottomActions/NavActions.tsx b/mobile/src/navigation/components/BottomActions/NavActions.tsx index 1403f26a2..7e55210c2 100644 --- a/mobile/src/navigation/components/BottomActions/NavActions.tsx +++ b/mobile/src/navigation/components/BottomActions/NavActions.tsx @@ -12,8 +12,6 @@ import Animated, { SlideOutRight, } from "react-native-reanimated"; -import { Search } from "~/resources/icons/Search"; -import { Settings } from "~/resources/icons/Settings"; import { usePreferenceStore } from "~/stores/Preference/store"; import { useTabsByVisibility } from "~/stores/Preference/hooks"; @@ -38,7 +36,7 @@ export function SearchButton() { exiting={OnRTL.decide(SlideOutRight, SlideOutLeft)} > navigation.navigate("Search")} size="lg" @@ -59,7 +57,7 @@ export function SettingsButton() { className="relative" > navigation.navigate("Settings")} size="lg" diff --git a/mobile/src/navigation/components/CurrentListMenu.tsx b/mobile/src/navigation/components/CurrentListMenu.tsx index b18e04887..d4440c518 100644 --- a/mobile/src/navigation/components/CurrentListMenu.tsx +++ b/mobile/src/navigation/components/CurrentListMenu.tsx @@ -2,12 +2,8 @@ import type { ParseKeys } from "i18next"; import { useMemo, useState } from "react"; import { useTranslation } from "react-i18next"; -import type { Icon } from "~/resources/icons/type"; -import { Image } from "~/resources/icons/Image"; -import { LowPriority } from "~/resources/icons/LowPriority"; -import { MoreHoriz } from "~/resources/icons/MoreHoriz"; -import { QueueMusic } from "~/resources/icons/QueueMusic"; -import { Sort } from "~/resources/icons/Sort"; +import type { SupportedIconName } from "~/resources/icons"; +import { Icon } from "~/resources/icons"; import { Queue } from "~/stores/Playback/actions"; import { IconButton } from "~/components/Form/Button/Icon"; @@ -15,7 +11,7 @@ import { ListItem } from "~/components/List"; import { Menu } from "~/components/Menu"; export type MenuAction = { - Icon?: (props: Icon) => React.ReactNode; + icon?: SupportedIconName; labelKey: ParseKeys; onPress: VoidFunction; }; @@ -34,12 +30,12 @@ export function CurrentListMenu(props: { const queueActions = useMemo( () => [ { - Icon: QueueMusic, + icon: "queue-music", labelKey: "feat.queue.extra.playNext", onPress: () => Queue.add({ id: props.trackIds, name: props.name }), }, { - Icon: LowPriority, + icon: "low-priority", labelKey: "feat.queue.extra.playLast", onPress: () => Queue.addToEnd({ id: props.trackIds, name: props.name }), }, @@ -52,7 +48,7 @@ export function CurrentListMenu(props: { if (props.presentArtworkSheet) { actions.push({ - Icon: Image, + icon: "image", labelKey: "feat.artwork.extra.change", onPress: props.presentArtworkSheet, }); @@ -60,7 +56,7 @@ export function CurrentListMenu(props: { if (props.presentSortOptionsSheet) { actions.push({ - Icon: Sort, + icon: "sort", labelKey: "feat.modalViewPreference.extra.sort", onPress: props.presentSortOptionsSheet, }); @@ -79,7 +75,7 @@ export function CurrentListMenu(props: { visible={visible} anchor={ setVisible((prev) => !prev)} /> @@ -96,7 +92,7 @@ export function CurrentListMenu(props: { item.onPress(); setVisible(false); }} - LeftElement={item.Icon ? : null} + LeftElement={item.icon ? : null} className="px-3" _labelTextClassName="text-sm" _psuedoClassName="active:bg-surfaceContainer/50" diff --git a/mobile/src/navigation/components/TopAppBar.tsx b/mobile/src/navigation/components/TopAppBar.tsx index ce92949a2..59b0a633c 100644 --- a/mobile/src/navigation/components/TopAppBar.tsx +++ b/mobile/src/navigation/components/TopAppBar.tsx @@ -5,8 +5,6 @@ import type { ParseKeys } from "i18next"; import { useTranslation } from "react-i18next"; import { View } from "react-native"; -import { ArrowBack } from "~/resources/icons/ArrowBack"; - import { OnRTL } from "~/lib/react"; import { FilledIconButton } from "~/components/Form/Button/Icon"; import { SafeContainer } from "~/components/SafeContainer"; @@ -22,7 +20,7 @@ export function TopAppBar({ options, route }: NativeStackHeaderProps) { navigation.goBack()} disabled={!!options.headerLeft} diff --git a/mobile/src/navigation/layouts/CurrentListLayout.tsx b/mobile/src/navigation/layouts/CurrentListLayout.tsx index a86aa75f8..a4d2a341b 100644 --- a/mobile/src/navigation/layouts/CurrentListLayout.tsx +++ b/mobile/src/navigation/layouts/CurrentListLayout.tsx @@ -10,7 +10,7 @@ import Animated, { } from "react-native-reanimated"; import { useSafeAreaInsets } from "react-native-safe-area-context"; -import { Schedule } from "~/resources/icons/Schedule"; +import { Icon } from "~/resources/icons"; import { useInForeground } from "~/stores/ListenerState"; import { usePlaybackStore } from "~/stores/Playback/store"; import { useDelayedReady } from "~/hooks/useDelayedReady"; @@ -174,7 +174,7 @@ function ListInfo(props: ListInfoProps) { {" • "} - + {` ${props.metadata.at(-1)!}`} diff --git a/mobile/src/navigation/layouts/NScrollLayout.tsx b/mobile/src/navigation/layouts/NScrollLayout.tsx index c9eaa77b3..4072b2126 100644 --- a/mobile/src/navigation/layouts/NScrollLayout.tsx +++ b/mobile/src/navigation/layouts/NScrollLayout.tsx @@ -22,7 +22,6 @@ import Animated, { import { useSafeAreaInsets } from "react-native-safe-area-context"; import { scheduleOnUI } from "react-native-worklets"; -import { MoreHoriz } from "~/resources/icons/MoreHoriz"; import { usePreferenceStore } from "~/stores/Preference/store"; import { @@ -182,7 +181,7 @@ export function NScrollListLayout({ <> {Actions} sheetRef.current?.present()} /> diff --git a/mobile/src/navigation/screens/HomeView.tsx b/mobile/src/navigation/screens/HomeView.tsx index 2af3e3614..4fde9462c 100644 --- a/mobile/src/navigation/screens/HomeView.tsx +++ b/mobile/src/navigation/screens/HomeView.tsx @@ -1,7 +1,6 @@ import { useNavigation } from "@react-navigation/native"; import { useTranslation } from "react-i18next"; -import { History } from "~/resources/icons/History"; import { useFavoriteListsForCards } from "~/data/favorite/queries"; import { NScrollLayout } from "~/navigation/layouts/NScrollLayout"; @@ -20,7 +19,7 @@ export default function Home() { titleKey="term.home" Actions={ navigation.navigate("RecentlyPlayed")} /> diff --git a/mobile/src/navigation/screens/albums/CurrentView.tsx b/mobile/src/navigation/screens/albums/CurrentView.tsx index 1261c02ff..4bb582f0c 100644 --- a/mobile/src/navigation/screens/albums/CurrentView.tsx +++ b/mobile/src/navigation/screens/albums/CurrentView.tsx @@ -3,7 +3,6 @@ import { useMemo } from "react"; import { useTranslation } from "react-i18next"; import { View } from "react-native"; -import { Favorite } from "~/resources/icons/Favorite"; import { useAlbumForScreen, useFavoriteAlbum } from "~/data/album/queries"; import { CurrentListLayout } from "~/navigation/layouts/CurrentListLayout"; @@ -85,10 +84,9 @@ export default function Album({ Actions: ( mutateGuard(favoriteAlbum, !data.isFavorite)} - alternative={isToggled} /> ( : undefined} RightElement={ presentTrackSheet(track.id)} size="lg" @@ -144,13 +139,13 @@ function BottomAppBar({ trackId }: { trackId: string }) { present={() => sleepTimerSheetRef.current?.present()} /> navigation.navigate("Upcoming")} size="lg" /> playbackOptionsSheetRef.current?.present()} size="lg" @@ -166,7 +161,7 @@ function SleepTimerButton(props: { present: VoidFunction }) { const sleepTimerActive = useSleepTimerStore((s) => s.endAt) !== null; return ( ; return ( navigation.goBack()} size="lg" diff --git a/mobile/src/navigation/screens/now-playing/components/TopAppBar.tsx b/mobile/src/navigation/screens/now-playing/components/TopAppBar.tsx index b870282cd..67c1b8dee 100644 --- a/mobile/src/navigation/screens/now-playing/components/TopAppBar.tsx +++ b/mobile/src/navigation/screens/now-playing/components/TopAppBar.tsx @@ -4,7 +4,6 @@ import { useMemo } from "react"; import { useTranslation } from "react-i18next"; import { View } from "react-native"; -import { ArrowBack } from "~/resources/icons/ArrowBack"; import { usePlaybackStore } from "~/stores/Playback/store"; import { usePreferenceStore } from "~/stores/Preference/store"; @@ -48,7 +47,7 @@ function AppBarContent() { return ( <> navigation.goBack()} className={OnRTL._use("rotate-180")} diff --git a/mobile/src/navigation/screens/now-playing/sheets/PlaybackOptionsSheet.tsx b/mobile/src/navigation/screens/now-playing/sheets/PlaybackOptionsSheet.tsx index 454c57a61..abd8f9586 100644 --- a/mobile/src/navigation/screens/now-playing/sheets/PlaybackOptionsSheet.tsx +++ b/mobile/src/navigation/screens/now-playing/sheets/PlaybackOptionsSheet.tsx @@ -2,9 +2,7 @@ import { useNavigation } from "@react-navigation/native"; import { useCallback, useState } from "react"; import AudioBrowser from "react-native-audio-browser"; -import { ActivityZone } from "~/resources/icons/ActivityZone"; -import { GraphicEQ } from "~/resources/icons/GraphicEQ"; -import { VolumeUp } from "~/resources/icons/VolumeUp"; +import { Icon } from "~/resources/icons"; import { playbackStore, usePlaybackStore } from "~/stores/Playback/store"; import { usePreferenceStore } from "~/stores/Preference/store"; import { @@ -133,13 +131,13 @@ export function PlaybackOptionsSheet(props: { } + LeftElement={} className="gap-4" /> } + LeftElement={} className="gap-4" /> @@ -161,8 +159,8 @@ const VolumeSliderOptions = { }, overlay: { accessibilityLabelKey: "feat.playback.extra.volume" as const, - Icon: VolumeUp, + icon: "volume-up-filled", formatValue: (val: number) => `${Math.round(val * 100)}%`, }, -}; +} as const; //#endregion diff --git a/mobile/src/navigation/screens/playlists/CurrentView.tsx b/mobile/src/navigation/screens/playlists/CurrentView.tsx index ac164e63f..ca2ce5191 100644 --- a/mobile/src/navigation/screens/playlists/CurrentView.tsx +++ b/mobile/src/navigation/screens/playlists/CurrentView.tsx @@ -4,9 +4,6 @@ import { useMemo } from "react"; import { useTranslation } from "react-i18next"; import { View } from "react-native"; -import { Edit } from "~/resources/icons/Edit"; -import { Favorite } from "~/resources/icons/Favorite"; -import { FileSave } from "~/resources/icons/FileSave"; import { useFavoritePlaylist, usePlaylistForScreen, @@ -48,12 +45,12 @@ export default function Playlist({ const menuActions = useMemo( () => [ { - Icon: Edit, + icon: "edit", labelKey: "form.edit", onPress: () => navigation.navigate("ModifyPlaylist", { id }), }, { - Icon: FileSave, + icon: "file-save", labelKey: "feat.playlist.extra.m3uExport", onPress: () => exportSheetRef.current?.present(), }, @@ -91,14 +88,13 @@ export default function Playlist({ {id !== FavoritesPlaylistKey ? ( mutateGuard(favoritePlaylist, !data.isFavorite) } - alternative={isToggled} /> ) : null} navigation.navigate("CreatePlaylist")} className="bg-primary active:bg-primaryDim" diff --git a/mobile/src/navigation/screens/playlists/components/ModifyViewBase.tsx b/mobile/src/navigation/screens/playlists/components/ModifyViewBase.tsx index cf548517b..23a031009 100644 --- a/mobile/src/navigation/screens/playlists/components/ModifyViewBase.tsx +++ b/mobile/src/navigation/screens/playlists/components/ModifyViewBase.tsx @@ -6,10 +6,7 @@ import { useTranslation } from "react-i18next"; import { View } from "react-native"; import { z } from "zod/mini"; -import { Add } from "~/resources/icons/Add"; -import { Cancel } from "~/resources/icons/Cancel"; -import { CheckCircle } from "~/resources/icons/CheckCircle"; -import { DragHandle } from "~/resources/icons/DragHandle"; +import { Icon } from "~/resources/icons"; import { getArtistsString } from "~/data/artist/utils"; import { usePlaylistsNames } from "~/data/playlist/queries"; import { sanitizePlaylistName } from "~/data/playlist/utils"; @@ -215,10 +212,6 @@ function AddTracksSheet(props: { ref: TrueSheetRef }) { function PlaylistNameField({ isFavoritesList }: { isFavoritesList?: boolean }) { const { passedConstraints } = useFormState(); - const ConstraintIcon = useMemo( - () => (passedConstraints ? CheckCircle : Cancel), - [passedConstraints], - ); const constraintColor = !passedConstraints ? "onSurfaceVariant" : undefined; return ( @@ -234,7 +227,11 @@ function PlaylistNameField({ isFavoritesList }: { isFavoritesList?: boolean }) { )} - + [ - { Icon: ConversionPath, label: t("feat.playlist.extra.absolute") }, - { Icon: Graph1, label: t("feat.playlist.extra.relative") }, + { icon: "conversion-path", label: t("feat.playlist.extra.absolute") }, + { icon: "graph-1", label: t("feat.playlist.extra.relative") }, ], [t], ); diff --git a/mobile/src/navigation/screens/settings/AppUpdateView.tsx b/mobile/src/navigation/screens/settings/AppUpdateView.tsx index 8825cbb9c..eb32d9614 100644 --- a/mobile/src/navigation/screens/settings/AppUpdateView.tsx +++ b/mobile/src/navigation/screens/settings/AppUpdateView.tsx @@ -2,9 +2,7 @@ import { useMemo } from "react"; import { Text, View } from "react-native"; import Markdown from "react-native-markdown-renderer"; -import { Info } from "~/resources/icons/Info"; -import { LogoGitHub } from "~/resources/icons/LogoGitHub"; -import { LogoPlayStore } from "~/resources/icons/LogoPlayStore"; +import { Icon } from "~/resources/icons"; import { usePreferenceStore } from "~/stores/Preference/store"; import { useHasNewUpdate } from "~/navigation/hooks/useHasNewUpdate"; @@ -83,7 +81,7 @@ export default function AppUpdate() { style={{ backgroundColor: codeBg }} className="gap-1 p-2" > - + {children} ), @@ -121,13 +119,13 @@ export default function AppUpdate() { openLink(Links.SpecificRelease(release.version))} - LeftElement={} + LeftElement={} className="gap-4" /> openLink(Links.PlayStore)} - LeftElement={} + LeftElement={} className="gap-4" /> diff --git a/mobile/src/navigation/screens/settings/ExperimentalSettingsView.tsx b/mobile/src/navigation/screens/settings/ExperimentalSettingsView.tsx index 3cc83374f..3ca50dc7d 100644 --- a/mobile/src/navigation/screens/settings/ExperimentalSettingsView.tsx +++ b/mobile/src/navigation/screens/settings/ExperimentalSettingsView.tsx @@ -5,8 +5,7 @@ import { useTranslation } from "react-i18next"; import { db } from "~/db"; import { waveformSamples } from "~/db/schema"; -import { OpenInNew } from "~/resources/icons/OpenInNew"; -import { Search } from "~/resources/icons/Search"; +import { Icon } from "~/resources/icons"; import { usePreferenceStore } from "~/stores/Preference/store"; import { PreferenceTogglers } from "~/stores/Preference/actions"; import { sessionStore } from "~/stores/Session/store"; @@ -55,13 +54,13 @@ export default function ExperimentalSettings() { openLink(Links.AndroidAuto)} - RightElement={} + RightElement={} /> navigation.navigate("LyricsProviders")} - LeftElement={} + LeftElement={} className="gap-4" /> diff --git a/mobile/src/navigation/screens/settings/HiddenTracksView.tsx b/mobile/src/navigation/screens/settings/HiddenTracksView.tsx index afff97197..e05032406 100644 --- a/mobile/src/navigation/screens/settings/HiddenTracksView.tsx +++ b/mobile/src/navigation/screens/settings/HiddenTracksView.tsx @@ -8,8 +8,6 @@ import { db } from "~/db"; import type { HiddenTrack } from "~/db/schema"; import { hiddenTracks } from "~/db/schema"; -import { VisibilityOff } from "~/resources/icons/VisibilityOff"; - import { cn } from "~/lib/style"; import { bgWait } from "~/utils/promise"; import { FlatList } from "~/components/Base/List"; @@ -147,7 +145,7 @@ function HiddenTrackList(props: { props.onShowTrack(id)} /> diff --git a/mobile/src/navigation/screens/settings/PackageLicenseView.tsx b/mobile/src/navigation/screens/settings/PackageLicenseView.tsx index 3a07ff014..5c1ba9254 100644 --- a/mobile/src/navigation/screens/settings/PackageLicenseView.tsx +++ b/mobile/src/navigation/screens/settings/PackageLicenseView.tsx @@ -1,7 +1,6 @@ import type { StaticScreenProps } from "@react-navigation/native"; import { useTranslation } from "react-i18next"; -import { OpenInNew } from "~/resources/icons/OpenInNew"; import LicensesList from "~/resources/licenses.json"; import { openLink } from "~/lib/web-browser"; @@ -27,7 +26,7 @@ export default function PackageLicense({ ( navigation.navigate("AppUpdate")} - LeftElement={} + LeftElement={} className="gap-4 rounded-full bg-secondary" _psuedoClassName="active:bg-secondaryDim" _textColor="onSecondary" @@ -58,13 +48,13 @@ export default function Settings() { navigation.navigate("AppearanceSettings")} - LeftElement={} + LeftElement={} className="gap-4" /> languageSheetRef.current?.present()} - LeftElement={} + LeftElement={} className="gap-4" /> @@ -73,13 +63,13 @@ export default function Settings() { backupSheetRef.current?.present()} - LeftElement={} + LeftElement={} className="gap-4" /> navigation.navigate("Insights")} - LeftElement={} + LeftElement={} className="gap-4" /> @@ -87,25 +77,25 @@ export default function Settings() { navigation.navigate("AudioEffects", {})} - LeftElement={} + LeftElement={} className="gap-4" /> navigation.navigate("Lyrics", {})} - LeftElement={} + LeftElement={} className="gap-4" /> navigation.navigate("PlaybackSettings")} - LeftElement={} + LeftElement={} className="gap-4" /> navigation.navigate("ScanningSettings")} - LeftElement={} + LeftElement={} className="gap-4" /> @@ -113,7 +103,7 @@ export default function Settings() { navigation.navigate("ExperimentalSettings")} - LeftElement={} + LeftElement={} className="gap-4" /> @@ -122,17 +112,17 @@ export default function Settings() { labelTextKey="feat.code.title" supportingText={t("feat.code.brief")} onPress={() => openLink(Links.GitHub)} - RightElement={} + RightElement={} /> openLink(Links.License)} - RightElement={} + RightElement={} /> openLink(Links.PrivacyPolicy)} - RightElement={} + RightElement={} /> openLink(Links.CurrentRelease)} - RightElement={} + RightElement={} className="rounded-none" /> diff --git a/mobile/src/navigation/screens/settings/sheets/LanguageSheet.tsx b/mobile/src/navigation/screens/settings/sheets/LanguageSheet.tsx index b03833f05..9f694c473 100644 --- a/mobile/src/navigation/screens/settings/sheets/LanguageSheet.tsx +++ b/mobile/src/navigation/screens/settings/sheets/LanguageSheet.tsx @@ -1,7 +1,6 @@ import { View } from "react-native"; -import { KeyboardArrowDown } from "~/resources/icons/KeyboardArrowDown"; -import { OpenInNew } from "~/resources/icons/OpenInNew"; +import { Icon } from "~/resources/icons"; import { usePreferenceStore } from "~/stores/Preference/store"; import { PreferenceSetters, @@ -46,7 +45,7 @@ export function LanguageSheet(props: { ref: TrueSheetRef }) { > {selectedLanguage?.name} - + @@ -66,7 +65,7 @@ export function LanguageSheet(props: { ref: TrueSheetRef }) { openLink(Links.Translations)} - RightElement={} + RightElement={} className="rounded-full" /> diff --git a/mobile/src/navigation/screens/settings/sheets/ScanFilterListSheet.tsx b/mobile/src/navigation/screens/settings/sheets/ScanFilterListSheet.tsx index 836f7a9f2..31af30145 100644 --- a/mobile/src/navigation/screens/settings/sheets/ScanFilterListSheet.tsx +++ b/mobile/src/navigation/screens/settings/sheets/ScanFilterListSheet.tsx @@ -5,9 +5,6 @@ import { useTranslation } from "react-i18next"; import { Keyboard, View } from "react-native"; import i18next from "~/modules/i18n"; -import { Add } from "~/resources/icons/Add"; -import { Close } from "~/resources/icons/Close"; -import { CreateNewFolder } from "~/resources/icons/CreateNewFolder"; import { preferenceStore, usePreferenceStore } from "~/stores/Preference/store"; import { pickDirectory } from "~/lib/file-system"; @@ -54,7 +51,7 @@ export function ScanFilterListSheet(props: { {item} removePath(props.listType, item)} /> @@ -115,7 +112,7 @@ function FilterForm(props: { listType: FilterList; listEntries: string[] }) { forSheet /> { Keyboard.dismiss(); diff --git a/mobile/src/navigation/screens/settings/sheets/SeparatorsSheet.tsx b/mobile/src/navigation/screens/settings/sheets/SeparatorsSheet.tsx index 52972db09..b46773e10 100644 --- a/mobile/src/navigation/screens/settings/sheets/SeparatorsSheet.tsx +++ b/mobile/src/navigation/screens/settings/sheets/SeparatorsSheet.tsx @@ -3,9 +3,7 @@ import { useTranslation } from "react-i18next"; import { Keyboard, View } from "react-native"; import i18next from "~/modules/i18n"; -import { Add } from "~/resources/icons/Add"; -import { Close } from "~/resources/icons/Close"; -import { Info } from "~/resources/icons/Info"; +import { Icon } from "~/resources/icons"; import { preferenceStore, usePreferenceStore } from "~/stores/Preference/store"; import { FlatList } from "~/components/Base/List"; @@ -46,7 +44,7 @@ export function SeparatorsSheet(props: { ref: TrueSheetRef }) { {item} removeSeparator(item)} /> @@ -59,7 +57,7 @@ export function SeparatorsSheet(props: { ref: TrueSheetRef }) { - + { Keyboard.dismiss(); diff --git a/mobile/src/navigation/screens/settings/sheets/TabOrderSheet.tsx b/mobile/src/navigation/screens/settings/sheets/TabOrderSheet.tsx index 669de8432..7c644a810 100644 --- a/mobile/src/navigation/screens/settings/sheets/TabOrderSheet.tsx +++ b/mobile/src/navigation/screens/settings/sheets/TabOrderSheet.tsx @@ -4,8 +4,6 @@ import { memo, useState } from "react"; import { useTranslation } from "react-i18next"; import { View } from "react-native"; -import { DragHandle } from "~/resources/icons/DragHandle"; -import { Home } from "~/resources/icons/Home"; import { usePreferenceStore } from "~/stores/Preference/store"; import { Tabs } from "~/stores/Preference/actions"; @@ -73,13 +71,12 @@ const RenderItem = memo( disabled={isDragging || isHomeTab} /> Tabs.setHome(item)} disabled={isDragging || !isVisible || isHomeTab} - alternative={isHomeTab} className={cn({ "disabled:opacity-100": !isDragging && isHomeTab, })} @@ -91,7 +88,7 @@ const RenderItem = memo( className="shrink grow px-2" /> - + {t("feat.trackMetadata.description.line1")} {"\n\n"} @@ -181,7 +180,7 @@ function MetadataForm({ bottomOffset }: { bottomOffset: number }) { labelKey="term.album" RightElement={ - + {formatEpoch(data.modificationTime)} @@ -149,7 +142,7 @@ function TrackMetadata({ data }: { data: Track }) { {data.format ? {data.format.toUpperCase()} : null} - {formatSeconds(data.duration)} + {formatSeconds(data.duration)} @@ -172,20 +165,19 @@ function IconActions(props: { data: Track; editArtwork: VoidFunction }) { return ( mutateGuard(toggleInPlaylist, FavoritesPlaylistKey)} - alternative={isFav} size="md" /> TrueSheet.present("TrackToPlaylistsSheet"))} size="md" /> navigation.navigate("ModifyTrack", { id: props.data.id }), @@ -193,13 +185,13 @@ function IconActions(props: { data: Track; editArtwork: VoidFunction }) { size="md" /> mutateGuard(hideTrack, { track: props.data }), @@ -217,12 +209,12 @@ function QueueActions({ id, name }: Record<"id" | "name", string>) { leftButton={{ textKey: "feat.queue.extra.playNext", onPress: sheetAction(() => Queue.add({ id, name })), - LeftElement: , + LeftElement: , }} rightButton={{ textKey: "feat.queue.extra.playLast", onPress: sheetAction(() => Queue.addToEnd({ id, name })), - LeftElement: , + LeftElement: , }} /> ); @@ -230,13 +222,10 @@ function QueueActions({ id, name }: Record<"id" | "name", string>) { //#endregion //#region Track Sheet Helpers -function Badge(props: { - Icon?: (props: Icon) => React.JSX.Element; - children: string; -}) { +function Badge(props: { icon?: SupportedIconName; children: string }) { return ( - {props.Icon ? : null} + {props.icon ? : null} {props.children} ); diff --git a/mobile/src/navigation/sheets/ViewOptionsSheet.tsx b/mobile/src/navigation/sheets/ViewOptionsSheet.tsx index b8dbf35af..6b4014a7f 100644 --- a/mobile/src/navigation/sheets/ViewOptionsSheet.tsx +++ b/mobile/src/navigation/sheets/ViewOptionsSheet.tsx @@ -1,10 +1,7 @@ import { useTranslation } from "react-i18next"; import { View } from "react-native"; -import { GridView } from "~/resources/icons/GridView"; -import { Sort } from "~/resources/icons/Sort"; -import { ViewAgenda } from "~/resources/icons/ViewAgenda"; -import { ViewModule } from "~/resources/icons/ViewModule"; +import { Icon } from "~/resources/icons"; import { usePreferenceStore } from "~/stores/Preference/store"; import { PreferenceSetters } from "~/stores/Preference/actions"; import { useViewPreferenceStore } from "~/stores/ViewPreference/store"; @@ -49,7 +46,7 @@ export function AlbumsViewOptionsSheet(props: { ref: TrueSheetRef }) { props.ref.current?.dismiss(); sortOrderSheetRef.current?.present(); }} - LeftElement={} + LeftElement={} className="gap-4" /> @@ -105,7 +102,7 @@ function ViewOptionsSheetTemplate(props: { props.ref.current?.dismiss(); sortOrderSheetRef.current?.present(); }} - LeftElement={} + LeftElement={} className="gap-4" /> @@ -117,9 +114,9 @@ function ViewOptionsSheetTemplate(props: { //#region Screen Layout const LayoutIconMap = { - list: ViewAgenda, - grid: GridView, - compactGrid: ViewModule, + list: "view-agenda", + grid: "grid-view", + compactGrid: "view-module", } as const; function ScreenLayoutSetting({ screen }: { screen: MutableViewLayout }) { @@ -134,7 +131,7 @@ function ScreenLayoutSetting({ screen }: { screen: MutableViewLayout }) { {LayoutOptions.map((layout) => ( ViewPreferenceSetters.setLayout(screen, layout)} _iconColor={layoutOption === layout ? "primary" : undefined} diff --git a/mobile/src/resources/icons/ActivityZone.tsx b/mobile/src/resources/icons/ActivityZone.tsx deleted file mode 100644 index 2b518a613..000000000 --- a/mobile/src/resources/icons/ActivityZone.tsx +++ /dev/null @@ -1,13 +0,0 @@ -import Svg, { Path } from "react-native-svg"; - -import { useColor } from "~/modules/customization/theme/hooks"; -import type { Icon } from "./type"; - -export function ActivityZone({ size = 24, color }: Icon) { - const usedColor = useColor(color, "onSurface"); - return ( - - - - ); -} diff --git a/mobile/src/resources/icons/Add.tsx b/mobile/src/resources/icons/Add.tsx deleted file mode 100644 index 7b3c549ae..000000000 --- a/mobile/src/resources/icons/Add.tsx +++ /dev/null @@ -1,13 +0,0 @@ -import Svg, { Path } from "react-native-svg"; - -import { useColor } from "~/modules/customization/theme/hooks"; -import type { Icon } from "./type"; - -export function Add({ size = 24, color }: Icon) { - const usedColor = useColor(color, "onSurface"); - return ( - - - - ); -} diff --git a/mobile/src/resources/icons/Archive.tsx b/mobile/src/resources/icons/Archive.tsx deleted file mode 100644 index 1b0b3d58f..000000000 --- a/mobile/src/resources/icons/Archive.tsx +++ /dev/null @@ -1,13 +0,0 @@ -import Svg, { Path } from "react-native-svg"; - -import { useColor } from "~/modules/customization/theme/hooks"; -import type { Icon } from "./type"; - -export function Archive({ size = 24, color }: Icon) { - const usedColor = useColor(color, "onSurface"); - return ( - - - - ); -} diff --git a/mobile/src/resources/icons/ArrowBack.tsx b/mobile/src/resources/icons/ArrowBack.tsx deleted file mode 100644 index c2653f801..000000000 --- a/mobile/src/resources/icons/ArrowBack.tsx +++ /dev/null @@ -1,13 +0,0 @@ -import Svg, { Path } from "react-native-svg"; - -import { useColor } from "~/modules/customization/theme/hooks"; -import type { Icon } from "./type"; - -export function ArrowBack({ size = 24, color }: Icon) { - const usedColor = useColor(color, "onSurface"); - return ( - - - - ); -} diff --git a/mobile/src/resources/icons/AutoPlay.tsx b/mobile/src/resources/icons/AutoPlay.tsx deleted file mode 100644 index febb340f6..000000000 --- a/mobile/src/resources/icons/AutoPlay.tsx +++ /dev/null @@ -1,13 +0,0 @@ -import Svg, { Path } from "react-native-svg"; - -import { useColor } from "~/modules/customization/theme/hooks"; -import type { Icon } from "./type"; - -export function AutoPlay({ size = 24, color }: Icon) { - const usedColor = useColor(color, "onSurface"); - return ( - - - - ); -} diff --git a/mobile/src/resources/icons/BarChart4Bars.tsx b/mobile/src/resources/icons/BarChart4Bars.tsx deleted file mode 100644 index caa092817..000000000 --- a/mobile/src/resources/icons/BarChart4Bars.tsx +++ /dev/null @@ -1,13 +0,0 @@ -import Svg, { Path } from "react-native-svg"; - -import { useColor } from "~/modules/customization/theme/hooks"; -import type { Icon } from "./type"; - -export function BarChart4Bars({ size = 24, color }: Icon) { - const usedColor = useColor(color, "onSurface"); - return ( - - - - ); -} diff --git a/mobile/src/resources/icons/Cached.tsx b/mobile/src/resources/icons/Cached.tsx deleted file mode 100644 index b4f1dc74a..000000000 --- a/mobile/src/resources/icons/Cached.tsx +++ /dev/null @@ -1,13 +0,0 @@ -import Svg, { Path } from "react-native-svg"; - -import { useColor } from "~/modules/customization/theme/hooks"; -import type { Icon } from "./type"; - -export function Cached({ size = 24, color }: Icon) { - const usedColor = useColor(color, "onSurface"); - return ( - - - - ); -} diff --git a/mobile/src/resources/icons/Cancel.tsx b/mobile/src/resources/icons/Cancel.tsx deleted file mode 100644 index b58c1931f..000000000 --- a/mobile/src/resources/icons/Cancel.tsx +++ /dev/null @@ -1,13 +0,0 @@ -import Svg, { Path } from "react-native-svg"; - -import { useColor } from "~/modules/customization/theme/hooks"; -import type { Icon } from "./type"; - -export function Cancel({ size = 24, color }: Icon) { - const usedColor = useColor(color, "onSurface"); - return ( - - - - ); -} diff --git a/mobile/src/resources/icons/Check.tsx b/mobile/src/resources/icons/Check.tsx deleted file mode 100644 index 00d6e7807..000000000 --- a/mobile/src/resources/icons/Check.tsx +++ /dev/null @@ -1,13 +0,0 @@ -import Svg, { Path } from "react-native-svg"; - -import { useColor } from "~/modules/customization/theme/hooks"; -import type { Icon } from "./type"; - -export function Check({ size = 24, color }: Icon) { - const usedColor = useColor(color, "onSurface"); - return ( - - - - ); -} diff --git a/mobile/src/resources/icons/CheckCircle.tsx b/mobile/src/resources/icons/CheckCircle.tsx deleted file mode 100644 index 71d39db0f..000000000 --- a/mobile/src/resources/icons/CheckCircle.tsx +++ /dev/null @@ -1,13 +0,0 @@ -import Svg, { Path } from "react-native-svg"; - -import { useColor } from "~/modules/customization/theme/hooks"; -import type { Icon } from "./type"; - -export function CheckCircle({ size = 24, color }: Icon) { - const usedColor = useColor(color, "onSurface"); - return ( - - - - ); -} diff --git a/mobile/src/resources/icons/Close.tsx b/mobile/src/resources/icons/Close.tsx deleted file mode 100644 index 768be0482..000000000 --- a/mobile/src/resources/icons/Close.tsx +++ /dev/null @@ -1,13 +0,0 @@ -import Svg, { Path } from "react-native-svg"; - -import { useColor } from "~/modules/customization/theme/hooks"; -import type { Icon } from "./type"; - -export function Close({ size = 24, color }: Icon) { - const usedColor = useColor(color, "onSurface"); - return ( - - - - ); -} diff --git a/mobile/src/resources/icons/ColorWand.tsx b/mobile/src/resources/icons/ColorWand.tsx deleted file mode 100644 index 35c384e03..000000000 --- a/mobile/src/resources/icons/ColorWand.tsx +++ /dev/null @@ -1,33 +0,0 @@ -import Svg, { Path, Rect } from "react-native-svg"; - -import { useColor } from "~/modules/customization/theme/hooks"; -import type { Icon } from "./type"; - -// From ionicons. -export function ColorWand({ size = 24, color }: Icon) { - const usedColor = useColor(color, "onSurface"); - return ( - - - - - - ); -} diff --git a/mobile/src/resources/icons/ConversionPath.tsx b/mobile/src/resources/icons/ConversionPath.tsx deleted file mode 100644 index 3e75e1c00..000000000 --- a/mobile/src/resources/icons/ConversionPath.tsx +++ /dev/null @@ -1,13 +0,0 @@ -import Svg, { Path } from "react-native-svg"; - -import { useColor } from "~/modules/customization/theme/hooks"; -import type { Icon } from "./type"; - -export function ConversionPath({ size = 24, color }: Icon) { - const usedColor = useColor(color, "onSurface"); - return ( - - - - ); -} diff --git a/mobile/src/resources/icons/CreateNewFolder.tsx b/mobile/src/resources/icons/CreateNewFolder.tsx deleted file mode 100644 index 8b882ede9..000000000 --- a/mobile/src/resources/icons/CreateNewFolder.tsx +++ /dev/null @@ -1,13 +0,0 @@ -import Svg, { Path } from "react-native-svg"; - -import { useColor } from "~/modules/customization/theme/hooks"; -import type { Icon } from "./type"; - -export function CreateNewFolder({ size = 24, color }: Icon) { - const usedColor = useColor(color, "onSurface"); - return ( - - - - ); -} diff --git a/mobile/src/resources/icons/Delete.tsx b/mobile/src/resources/icons/Delete.tsx deleted file mode 100644 index 75f4f6967..000000000 --- a/mobile/src/resources/icons/Delete.tsx +++ /dev/null @@ -1,13 +0,0 @@ -import Svg, { Path } from "react-native-svg"; - -import { useColor } from "~/modules/customization/theme/hooks"; -import type { Icon } from "./type"; - -export function Delete({ size = 24, color }: Icon) { - const usedColor = useColor(color, "onSurface"); - return ( - - - - ); -} diff --git a/mobile/src/resources/icons/DoNotDisturbOn.tsx b/mobile/src/resources/icons/DoNotDisturbOn.tsx deleted file mode 100644 index 8e6646a41..000000000 --- a/mobile/src/resources/icons/DoNotDisturbOn.tsx +++ /dev/null @@ -1,13 +0,0 @@ -import Svg, { Path } from "react-native-svg"; - -import { useColor } from "~/modules/customization/theme/hooks"; -import type { Icon } from "./type"; - -export function DoNotDisturbOn({ size = 24, color }: Icon) { - const usedColor = useColor(color, "onSurface"); - return ( - - - - ); -} diff --git a/mobile/src/resources/icons/DocumentSearch.tsx b/mobile/src/resources/icons/DocumentSearch.tsx deleted file mode 100644 index 4545a0321..000000000 --- a/mobile/src/resources/icons/DocumentSearch.tsx +++ /dev/null @@ -1,13 +0,0 @@ -import Svg, { Path } from "react-native-svg"; - -import { useColor } from "~/modules/customization/theme/hooks"; -import type { Icon } from "./type"; - -export function DocumentSearch({ size = 24, color }: Icon) { - const usedColor = useColor(color, "onSurface"); - return ( - - - - ); -} diff --git a/mobile/src/resources/icons/DragHandle.tsx b/mobile/src/resources/icons/DragHandle.tsx deleted file mode 100644 index 77344cac0..000000000 --- a/mobile/src/resources/icons/DragHandle.tsx +++ /dev/null @@ -1,13 +0,0 @@ -import Svg, { Path } from "react-native-svg"; - -import { useColor } from "~/modules/customization/theme/hooks"; -import type { Icon } from "./type"; - -export function DragHandle({ size = 24, color }: Icon) { - const usedColor = useColor(color, "onSurface"); - return ( - - - - ); -} diff --git a/mobile/src/resources/icons/Edit.tsx b/mobile/src/resources/icons/Edit.tsx deleted file mode 100644 index a89e7e850..000000000 --- a/mobile/src/resources/icons/Edit.tsx +++ /dev/null @@ -1,13 +0,0 @@ -import Svg, { Path } from "react-native-svg"; - -import { useColor } from "~/modules/customization/theme/hooks"; -import type { Icon } from "./type"; - -export function Edit({ size = 24, color }: Icon) { - const usedColor = useColor(color, "onSurface"); - return ( - - - - ); -} diff --git a/mobile/src/resources/icons/Favorite.tsx b/mobile/src/resources/icons/Favorite.tsx deleted file mode 100644 index 1f6077985..000000000 --- a/mobile/src/resources/icons/Favorite.tsx +++ /dev/null @@ -1,19 +0,0 @@ -import Svg, { Path } from "react-native-svg"; - -import { useColor } from "~/modules/customization/theme/hooks"; -import type { Icon } from "./type"; - -export function Favorite({ size = 24, alternative = false, color }: Icon) { - const usedColor = useColor(color, "onSurface"); - return ( - - - - ); -} diff --git a/mobile/src/resources/icons/FileSave.tsx b/mobile/src/resources/icons/FileSave.tsx deleted file mode 100644 index 7672d71ef..000000000 --- a/mobile/src/resources/icons/FileSave.tsx +++ /dev/null @@ -1,13 +0,0 @@ -import Svg, { Path } from "react-native-svg"; - -import { useColor } from "~/modules/customization/theme/hooks"; -import type { Icon } from "./type"; - -export function FileSave({ size = 24, color }: Icon) { - const usedColor = useColor(color, "onSurface"); - return ( - - - - ); -} diff --git a/mobile/src/resources/icons/Flask.tsx b/mobile/src/resources/icons/Flask.tsx deleted file mode 100644 index d491115c3..000000000 --- a/mobile/src/resources/icons/Flask.tsx +++ /dev/null @@ -1,14 +0,0 @@ -import Svg, { Path } from "react-native-svg"; - -import { useColor } from "~/modules/customization/theme/hooks"; -import type { Icon } from "./type"; - -// From ionicons. -export function Flask({ size = 24, color }: Icon) { - const usedColor = useColor(color, "onSurface"); - return ( - - - - ); -} diff --git a/mobile/src/resources/icons/Folder.tsx b/mobile/src/resources/icons/Folder.tsx deleted file mode 100644 index 61a7413e8..000000000 --- a/mobile/src/resources/icons/Folder.tsx +++ /dev/null @@ -1,13 +0,0 @@ -import Svg, { Path } from "react-native-svg"; - -import { useColor } from "~/modules/customization/theme/hooks"; -import type { Icon } from "./type"; - -export function Folder({ size = 24, color }: Icon) { - const usedColor = useColor(color, "onSurface"); - return ( - - - - ); -} diff --git a/mobile/src/resources/icons/FormatPaint.tsx b/mobile/src/resources/icons/FormatPaint.tsx deleted file mode 100644 index c132fe33b..000000000 --- a/mobile/src/resources/icons/FormatPaint.tsx +++ /dev/null @@ -1,13 +0,0 @@ -import Svg, { Path } from "react-native-svg"; - -import { useColor } from "~/modules/customization/theme/hooks"; -import type { Icon } from "./type"; - -export function FormatPaint({ size = 24, color }: Icon) { - const usedColor = useColor(color, "onSurface"); - return ( - - - - ); -} diff --git a/mobile/src/resources/icons/Graph1.tsx b/mobile/src/resources/icons/Graph1.tsx deleted file mode 100644 index 5d374f707..000000000 --- a/mobile/src/resources/icons/Graph1.tsx +++ /dev/null @@ -1,13 +0,0 @@ -import Svg, { Path } from "react-native-svg"; - -import { useColor } from "~/modules/customization/theme/hooks"; -import type { Icon } from "./type"; - -export function Graph1({ size = 24, color }: Icon) { - const usedColor = useColor(color, "onSurface"); - return ( - - - - ); -} diff --git a/mobile/src/resources/icons/GraphicEQ.tsx b/mobile/src/resources/icons/GraphicEQ.tsx deleted file mode 100644 index f4113d9ca..000000000 --- a/mobile/src/resources/icons/GraphicEQ.tsx +++ /dev/null @@ -1,13 +0,0 @@ -import Svg, { Path } from "react-native-svg"; - -import { useColor } from "~/modules/customization/theme/hooks"; -import type { Icon } from "./type"; - -export function GraphicEQ({ size = 24, color }: Icon) { - const usedColor = useColor(color, "onSurface"); - return ( - - - - ); -} diff --git a/mobile/src/resources/icons/GridView.tsx b/mobile/src/resources/icons/GridView.tsx deleted file mode 100644 index b42271302..000000000 --- a/mobile/src/resources/icons/GridView.tsx +++ /dev/null @@ -1,13 +0,0 @@ -import Svg, { Path } from "react-native-svg"; - -import { useColor } from "~/modules/customization/theme/hooks"; -import type { Icon } from "./type"; - -export function GridView({ size = 24, color }: Icon) { - const usedColor = useColor(color, "onSurface"); - return ( - - - - ); -} diff --git a/mobile/src/resources/icons/History.tsx b/mobile/src/resources/icons/History.tsx deleted file mode 100644 index 9d79937ff..000000000 --- a/mobile/src/resources/icons/History.tsx +++ /dev/null @@ -1,13 +0,0 @@ -import Svg, { Path } from "react-native-svg"; - -import { useColor } from "~/modules/customization/theme/hooks"; -import type { Icon } from "./type"; - -export function History({ size = 24, color }: Icon) { - const usedColor = useColor(color, "onSurface"); - return ( - - - - ); -} diff --git a/mobile/src/resources/icons/Home.tsx b/mobile/src/resources/icons/Home.tsx deleted file mode 100644 index da543e202..000000000 --- a/mobile/src/resources/icons/Home.tsx +++ /dev/null @@ -1,19 +0,0 @@ -import Svg, { Path } from "react-native-svg"; - -import { useColor } from "~/modules/customization/theme/hooks"; -import type { Icon } from "./type"; - -export function Home({ size = 24, alternative = false, color }: Icon) { - const usedColor = useColor(color, "onSurface"); - return ( - - - - ); -} diff --git a/mobile/src/resources/icons/Image.tsx b/mobile/src/resources/icons/Image.tsx deleted file mode 100644 index 024a81810..000000000 --- a/mobile/src/resources/icons/Image.tsx +++ /dev/null @@ -1,13 +0,0 @@ -import Svg, { Path } from "react-native-svg"; - -import { useColor } from "~/modules/customization/theme/hooks"; -import type { Icon } from "./type"; - -export function Image({ size = 24, color }: Icon) { - const usedColor = useColor(color, "onSurface"); - return ( - - - - ); -} diff --git a/mobile/src/resources/icons/Info.tsx b/mobile/src/resources/icons/Info.tsx deleted file mode 100644 index fdcc800a8..000000000 --- a/mobile/src/resources/icons/Info.tsx +++ /dev/null @@ -1,13 +0,0 @@ -import Svg, { Path } from "react-native-svg"; - -import { useColor } from "~/modules/customization/theme/hooks"; -import type { Icon } from "./type"; - -export function Info({ size = 24, color }: Icon) { - const usedColor = useColor(color, "onSurface"); - return ( - - - - ); -} diff --git a/mobile/src/resources/icons/KeyboardArrowDown.tsx b/mobile/src/resources/icons/KeyboardArrowDown.tsx deleted file mode 100644 index 14593b2f7..000000000 --- a/mobile/src/resources/icons/KeyboardArrowDown.tsx +++ /dev/null @@ -1,13 +0,0 @@ -import Svg, { Path } from "react-native-svg"; - -import { useColor } from "~/modules/customization/theme/hooks"; -import type { Icon } from "./type"; - -export function KeyboardArrowDown({ size = 24, color }: Icon) { - const usedColor = useColor(color, "onSurface"); - return ( - - - - ); -} diff --git a/mobile/src/resources/icons/LinkOff.tsx b/mobile/src/resources/icons/LinkOff.tsx deleted file mode 100644 index 20177563b..000000000 --- a/mobile/src/resources/icons/LinkOff.tsx +++ /dev/null @@ -1,13 +0,0 @@ -import Svg, { Path } from "react-native-svg"; - -import { useColor } from "~/modules/customization/theme/hooks"; -import type { Icon } from "./type"; - -export function LinkOff({ size = 24, color }: Icon) { - const usedColor = useColor(color, "onSurface"); - return ( - - - - ); -} diff --git a/mobile/src/resources/icons/LogoGitHub.tsx b/mobile/src/resources/icons/LogoGitHub.tsx deleted file mode 100644 index 155cd3289..000000000 --- a/mobile/src/resources/icons/LogoGitHub.tsx +++ /dev/null @@ -1,14 +0,0 @@ -import Svg, { Path } from "react-native-svg"; - -import { useColor } from "~/modules/customization/theme/hooks"; -import type { Icon } from "./type"; - -// From ionicons. -export function LogoGitHub({ size = 24, color }: Icon) { - const usedColor = useColor(color, "onSurface"); - return ( - - - - ); -} diff --git a/mobile/src/resources/icons/LogoPlayStore.tsx b/mobile/src/resources/icons/LogoPlayStore.tsx deleted file mode 100644 index ded158d3c..000000000 --- a/mobile/src/resources/icons/LogoPlayStore.tsx +++ /dev/null @@ -1,14 +0,0 @@ -import Svg, { Path } from "react-native-svg"; - -import { useColor } from "~/modules/customization/theme/hooks"; -import type { Icon } from "./type"; - -// From ionicons. -export function LogoPlayStore({ size = 24, color }: Icon) { - const usedColor = useColor(color, "onSurface"); - return ( - - - - ); -} diff --git a/mobile/src/resources/icons/LowPriority.tsx b/mobile/src/resources/icons/LowPriority.tsx deleted file mode 100644 index 865b1a629..000000000 --- a/mobile/src/resources/icons/LowPriority.tsx +++ /dev/null @@ -1,13 +0,0 @@ -import Svg, { Path } from "react-native-svg"; - -import { useColor } from "~/modules/customization/theme/hooks"; -import type { Icon } from "./type"; - -export function LowPriority({ size = 24, color }: Icon) { - const usedColor = useColor(color, "onSurface"); - return ( - - - - ); -} diff --git a/mobile/src/resources/icons/Lyrics.tsx b/mobile/src/resources/icons/Lyrics.tsx deleted file mode 100644 index a5ce86a55..000000000 --- a/mobile/src/resources/icons/Lyrics.tsx +++ /dev/null @@ -1,13 +0,0 @@ -import Svg, { Path } from "react-native-svg"; - -import { useColor } from "~/modules/customization/theme/hooks"; -import type { Icon } from "./type"; - -export function Lyrics({ size = 24, color }: Icon) { - const usedColor = useColor(color, "onSurface"); - return ( - - - - ); -} diff --git a/mobile/src/resources/icons/MobileArrowDown.tsx b/mobile/src/resources/icons/MobileArrowDown.tsx deleted file mode 100644 index e1a9126a4..000000000 --- a/mobile/src/resources/icons/MobileArrowDown.tsx +++ /dev/null @@ -1,13 +0,0 @@ -import Svg, { Path } from "react-native-svg"; - -import { useColor } from "~/modules/customization/theme/hooks"; -import type { Icon } from "./type"; - -export function MobileArrowDown({ size = 24, color }: Icon) { - const usedColor = useColor(color, "onSurface"); - return ( - - - - ); -} diff --git a/mobile/src/resources/icons/MoreHoriz.tsx b/mobile/src/resources/icons/MoreHoriz.tsx deleted file mode 100644 index ae02bbadb..000000000 --- a/mobile/src/resources/icons/MoreHoriz.tsx +++ /dev/null @@ -1,13 +0,0 @@ -import Svg, { Path } from "react-native-svg"; - -import { useColor } from "~/modules/customization/theme/hooks"; -import type { Icon } from "./type"; - -export function MoreHoriz({ size = 24, color }: Icon) { - const usedColor = useColor(color, "onSurface"); - return ( - - - - ); -} diff --git a/mobile/src/resources/icons/MoreVert.tsx b/mobile/src/resources/icons/MoreVert.tsx deleted file mode 100644 index fa076d1a0..000000000 --- a/mobile/src/resources/icons/MoreVert.tsx +++ /dev/null @@ -1,13 +0,0 @@ -import Svg, { Path } from "react-native-svg"; - -import { useColor } from "~/modules/customization/theme/hooks"; -import type { Icon } from "./type"; - -export function MoreVert({ size = 24, color }: Icon) { - const usedColor = useColor(color, "onSurface"); - return ( - - - - ); -} diff --git a/mobile/src/resources/icons/NothingArrowRight.tsx b/mobile/src/resources/icons/NothingArrowRight.tsx deleted file mode 100644 index 231c017ba..000000000 --- a/mobile/src/resources/icons/NothingArrowRight.tsx +++ /dev/null @@ -1,18 +0,0 @@ -import Svg, { Circle } from "react-native-svg"; - -import { useColor } from "~/modules/customization/theme/hooks"; -import type { Icon } from "./type"; - -// Custom SVG made in Figma. -export function NothingArrowRight({ size = 24, color }: Icon) { - const usedColor = useColor(color, "onSurface"); - return ( - - - - - - - - ); -} diff --git a/mobile/src/resources/icons/OpenInNew.tsx b/mobile/src/resources/icons/OpenInNew.tsx deleted file mode 100644 index 34fcf7d0a..000000000 --- a/mobile/src/resources/icons/OpenInNew.tsx +++ /dev/null @@ -1,13 +0,0 @@ -import Svg, { Path } from "react-native-svg"; - -import { useColor } from "~/modules/customization/theme/hooks"; -import type { Icon } from "./type"; - -export function OpenInNew({ size = 24, color }: Icon) { - const usedColor = useColor(color, "onSurface"); - return ( - - - - ); -} diff --git a/mobile/src/resources/icons/Pause.tsx b/mobile/src/resources/icons/Pause.tsx deleted file mode 100644 index 23ee4cf15..000000000 --- a/mobile/src/resources/icons/Pause.tsx +++ /dev/null @@ -1,14 +0,0 @@ -import Svg, { Path } from "react-native-svg"; - -import { useColor } from "~/modules/customization/theme/hooks"; -import type { Icon } from "./type"; - -// Filled -export function Pause({ size = 24, color }: Icon) { - const usedColor = useColor(color, "onSurface"); - return ( - - - - ); -} diff --git a/mobile/src/resources/icons/PlayArrow.tsx b/mobile/src/resources/icons/PlayArrow.tsx deleted file mode 100644 index bbc1c642d..000000000 --- a/mobile/src/resources/icons/PlayArrow.tsx +++ /dev/null @@ -1,14 +0,0 @@ -import Svg, { Path } from "react-native-svg"; - -import { useColor } from "~/modules/customization/theme/hooks"; -import type { Icon } from "./type"; - -// Filled -export function PlayArrow({ size = 24, color }: Icon) { - const usedColor = useColor(color, "onSurface"); - return ( - - - - ); -} diff --git a/mobile/src/resources/icons/PlaylistAdd.tsx b/mobile/src/resources/icons/PlaylistAdd.tsx deleted file mode 100644 index af49b22b0..000000000 --- a/mobile/src/resources/icons/PlaylistAdd.tsx +++ /dev/null @@ -1,13 +0,0 @@ -import Svg, { Path } from "react-native-svg"; - -import { useColor } from "~/modules/customization/theme/hooks"; -import type { Icon } from "./type"; - -export function PlaylistAdd({ size = 24, color }: Icon) { - const usedColor = useColor(color, "onSurface"); - return ( - - - - ); -} diff --git a/mobile/src/resources/icons/QueueMusic.tsx b/mobile/src/resources/icons/QueueMusic.tsx deleted file mode 100644 index 43706de67..000000000 --- a/mobile/src/resources/icons/QueueMusic.tsx +++ /dev/null @@ -1,13 +0,0 @@ -import Svg, { Path } from "react-native-svg"; - -import { useColor } from "~/modules/customization/theme/hooks"; -import type { Icon } from "./type"; - -export function QueueMusic({ size = 24, color }: Icon) { - const usedColor = useColor(color, "onSurface"); - return ( - - - - ); -} diff --git a/mobile/src/resources/icons/Remove.tsx b/mobile/src/resources/icons/Remove.tsx deleted file mode 100644 index 000c24fe7..000000000 --- a/mobile/src/resources/icons/Remove.tsx +++ /dev/null @@ -1,13 +0,0 @@ -import Svg, { Path } from "react-native-svg"; - -import { useColor } from "~/modules/customization/theme/hooks"; -import type { Icon } from "./type"; - -export function Remove({ size = 24, color }: Icon) { - const usedColor = useColor(color, "onSurface"); - return ( - - - - ); -} diff --git a/mobile/src/resources/icons/Repeat.tsx b/mobile/src/resources/icons/Repeat.tsx deleted file mode 100644 index 6dffcd7af..000000000 --- a/mobile/src/resources/icons/Repeat.tsx +++ /dev/null @@ -1,37 +0,0 @@ -import Svg, { Path } from "react-native-svg"; - -import { useColor } from "~/modules/customization/theme/hooks"; -import type { Icon } from "./type"; - -// From ionicons. -export function Repeat({ size = 24, color }: Icon) { - const usedColor = useColor(color, "onSurface"); - return ( - - - - - - ); -} diff --git a/mobile/src/resources/icons/RepeatOne.tsx b/mobile/src/resources/icons/RepeatOne.tsx deleted file mode 100644 index a40638d5a..000000000 --- a/mobile/src/resources/icons/RepeatOne.tsx +++ /dev/null @@ -1,42 +0,0 @@ -import Svg, { Path } from "react-native-svg"; - -import { useColor } from "~/modules/customization/theme/hooks"; -import type { Icon } from "./type"; - -// Custom icon based on ionicons' "Repeat" and "Calendar Number". -export function RepeatOne({ size = 24, color }: Icon) { - const usedColor = useColor(color, "onSurface"); - return ( - - - - - - - ); -} diff --git a/mobile/src/resources/icons/Save.tsx b/mobile/src/resources/icons/Save.tsx deleted file mode 100644 index 75cd58c12..000000000 --- a/mobile/src/resources/icons/Save.tsx +++ /dev/null @@ -1,13 +0,0 @@ -import Svg, { Path } from "react-native-svg"; - -import { useColor } from "~/modules/customization/theme/hooks"; -import type { Icon } from "./type"; - -export function Save({ size = 24, color }: Icon) { - const usedColor = useColor(color, "onSurface"); - return ( - - - - ); -} diff --git a/mobile/src/resources/icons/Schedule.tsx b/mobile/src/resources/icons/Schedule.tsx deleted file mode 100644 index 5b507abcb..000000000 --- a/mobile/src/resources/icons/Schedule.tsx +++ /dev/null @@ -1,13 +0,0 @@ -import Svg, { Path } from "react-native-svg"; - -import { useColor } from "~/modules/customization/theme/hooks"; -import type { Icon } from "./type"; - -export function Schedule({ size = 24, color }: Icon) { - const usedColor = useColor(color, "onSurface"); - return ( - - - - ); -} diff --git a/mobile/src/resources/icons/Search.tsx b/mobile/src/resources/icons/Search.tsx deleted file mode 100644 index 5ff2673e8..000000000 --- a/mobile/src/resources/icons/Search.tsx +++ /dev/null @@ -1,13 +0,0 @@ -import Svg, { Path } from "react-native-svg"; - -import { useColor } from "~/modules/customization/theme/hooks"; -import type { Icon } from "./type"; - -export function Search({ size = 24, color }: Icon) { - const usedColor = useColor(color, "onSurface"); - return ( - - - - ); -} diff --git a/mobile/src/resources/icons/Settings.tsx b/mobile/src/resources/icons/Settings.tsx deleted file mode 100644 index e7f7fdfb6..000000000 --- a/mobile/src/resources/icons/Settings.tsx +++ /dev/null @@ -1,13 +0,0 @@ -import Svg, { Path } from "react-native-svg"; - -import { useColor } from "~/modules/customization/theme/hooks"; -import type { Icon } from "./type"; - -export function Settings({ size = 24, color }: Icon) { - const usedColor = useColor(color, "onSurface"); - return ( - - - - ); -} diff --git a/mobile/src/resources/icons/Shuffle.tsx b/mobile/src/resources/icons/Shuffle.tsx deleted file mode 100644 index 9afe79eb1..000000000 --- a/mobile/src/resources/icons/Shuffle.tsx +++ /dev/null @@ -1,29 +0,0 @@ -import Svg, { Path } from "react-native-svg"; - -import { useColor } from "~/modules/customization/theme/hooks"; -import type { Icon } from "./type"; - -// From ionicons. -export function Shuffle({ size = 24, color }: Icon) { - const usedColor = useColor(color, "onSurface"); - return ( - - - - - ); -} diff --git a/mobile/src/resources/icons/SkipNext.tsx b/mobile/src/resources/icons/SkipNext.tsx deleted file mode 100644 index fe8362463..000000000 --- a/mobile/src/resources/icons/SkipNext.tsx +++ /dev/null @@ -1,14 +0,0 @@ -import Svg, { Path } from "react-native-svg"; - -import { useColor } from "~/modules/customization/theme/hooks"; -import type { Icon } from "./type"; - -// Filled -export function SkipNext({ size = 24, color }: Icon) { - const usedColor = useColor(color, "onSurface"); - return ( - - - - ); -} diff --git a/mobile/src/resources/icons/SkipPrevious.tsx b/mobile/src/resources/icons/SkipPrevious.tsx deleted file mode 100644 index bfa0f62d1..000000000 --- a/mobile/src/resources/icons/SkipPrevious.tsx +++ /dev/null @@ -1,14 +0,0 @@ -import Svg, { Path } from "react-native-svg"; - -import { useColor } from "~/modules/customization/theme/hooks"; -import type { Icon } from "./type"; - -// Filled -export function SkipPrevious({ size = 24, color }: Icon) { - const usedColor = useColor(color, "onSurface"); - return ( - - - - ); -} diff --git a/mobile/src/resources/icons/SlowMotionVideo.tsx b/mobile/src/resources/icons/SlowMotionVideo.tsx deleted file mode 100644 index fa63337a7..000000000 --- a/mobile/src/resources/icons/SlowMotionVideo.tsx +++ /dev/null @@ -1,13 +0,0 @@ -import Svg, { Path } from "react-native-svg"; - -import { useColor } from "~/modules/customization/theme/hooks"; -import type { Icon } from "./type"; - -export function SlowMotionVideo({ size = 24, color }: Icon) { - const usedColor = useColor(color, "onSurface"); - return ( - - - - ); -} diff --git a/mobile/src/resources/icons/Sort.tsx b/mobile/src/resources/icons/Sort.tsx deleted file mode 100644 index bbcad020d..000000000 --- a/mobile/src/resources/icons/Sort.tsx +++ /dev/null @@ -1,13 +0,0 @@ -import Svg, { Path } from "react-native-svg"; - -import { useColor } from "~/modules/customization/theme/hooks"; -import type { Icon } from "./type"; - -export function Sort({ size = 24, color }: Icon) { - const usedColor = useColor(color, "onSurface"); - return ( - - - - ); -} diff --git a/mobile/src/resources/icons/Timer.tsx b/mobile/src/resources/icons/Timer.tsx deleted file mode 100644 index 9505e9615..000000000 --- a/mobile/src/resources/icons/Timer.tsx +++ /dev/null @@ -1,13 +0,0 @@ -import Svg, { Path } from "react-native-svg"; - -import { useColor } from "~/modules/customization/theme/hooks"; -import type { Icon } from "./type"; - -export function Timer({ size = 24, color }: Icon) { - const usedColor = useColor(color, "onSurface"); - return ( - - - - ); -} diff --git a/mobile/src/resources/icons/Translate.tsx b/mobile/src/resources/icons/Translate.tsx deleted file mode 100644 index bfa0cbc05..000000000 --- a/mobile/src/resources/icons/Translate.tsx +++ /dev/null @@ -1,13 +0,0 @@ -import Svg, { Path } from "react-native-svg"; - -import { useColor } from "~/modules/customization/theme/hooks"; -import type { Icon } from "./type"; - -export function Translate({ size = 24, color }: Icon) { - const usedColor = useColor(color, "onSurface"); - return ( - - - - ); -} diff --git a/mobile/src/resources/icons/ViewAgenda.tsx b/mobile/src/resources/icons/ViewAgenda.tsx deleted file mode 100644 index 636bd6865..000000000 --- a/mobile/src/resources/icons/ViewAgenda.tsx +++ /dev/null @@ -1,13 +0,0 @@ -import Svg, { Path } from "react-native-svg"; - -import { useColor } from "~/modules/customization/theme/hooks"; -import type { Icon } from "./type"; - -export function ViewAgenda({ size = 24, color }: Icon) { - const usedColor = useColor(color, "onSurface"); - return ( - - - - ); -} diff --git a/mobile/src/resources/icons/ViewModule.tsx b/mobile/src/resources/icons/ViewModule.tsx deleted file mode 100644 index 991ddc1b5..000000000 --- a/mobile/src/resources/icons/ViewModule.tsx +++ /dev/null @@ -1,13 +0,0 @@ -import Svg, { Path } from "react-native-svg"; - -import { useColor } from "~/modules/customization/theme/hooks"; -import type { Icon } from "./type"; - -export function ViewModule({ size = 24, color }: Icon) { - const usedColor = useColor(color, "onSurface"); - return ( - - - - ); -} diff --git a/mobile/src/resources/icons/VisibilityOff.tsx b/mobile/src/resources/icons/VisibilityOff.tsx deleted file mode 100644 index ca1164df5..000000000 --- a/mobile/src/resources/icons/VisibilityOff.tsx +++ /dev/null @@ -1,14 +0,0 @@ -import Svg, { Path } from "react-native-svg"; - -import { useColor } from "~/modules/customization/theme/hooks"; -import type { Icon } from "./type"; - -// Filled -export function VisibilityOff({ size = 24, color }: Icon) { - const usedColor = useColor(color, "onSurface"); - return ( - - - - ); -} diff --git a/mobile/src/resources/icons/VoiceSelection.tsx b/mobile/src/resources/icons/VoiceSelection.tsx deleted file mode 100644 index 2c24100a3..000000000 --- a/mobile/src/resources/icons/VoiceSelection.tsx +++ /dev/null @@ -1,13 +0,0 @@ -import Svg, { Path } from "react-native-svg"; - -import { useColor } from "~/modules/customization/theme/hooks"; -import type { Icon } from "./type"; - -export function VoiceSelection({ size = 24, color }: Icon) { - const usedColor = useColor(color, "onSurface"); - return ( - - - - ); -} diff --git a/mobile/src/resources/icons/VolumeUp.tsx b/mobile/src/resources/icons/VolumeUp.tsx deleted file mode 100644 index 2fbfa15b0..000000000 --- a/mobile/src/resources/icons/VolumeUp.tsx +++ /dev/null @@ -1,14 +0,0 @@ -import Svg, { Path } from "react-native-svg"; - -import { useColor } from "~/modules/customization/theme/hooks"; -import type { Icon } from "./type"; - -// Filled -export function VolumeUp({ size = 24, color }: Icon) { - const usedColor = useColor(color, "onSurface"); - return ( - - - - ); -} diff --git a/mobile/src/resources/icons/Warning.tsx b/mobile/src/resources/icons/Warning.tsx deleted file mode 100644 index b8acc2850..000000000 --- a/mobile/src/resources/icons/Warning.tsx +++ /dev/null @@ -1,13 +0,0 @@ -import Svg, { Path } from "react-native-svg"; - -import { useColor } from "~/modules/customization/theme/hooks"; -import type { Icon } from "./type"; - -export function Warning({ size = 24, color }: Icon) { - const usedColor = useColor(color, "onSurface"); - return ( - - - - ); -} diff --git a/mobile/src/resources/icons/app-icons.glyphmap.json b/mobile/src/resources/icons/app-icons.glyphmap.json new file mode 100644 index 000000000..1abbecd54 --- /dev/null +++ b/mobile/src/resources/icons/app-icons.glyphmap.json @@ -0,0 +1 @@ +{"m":{"f":"app-icons","u":1024,"z":1020,"s":59648,"h":"f51a72f575cf96a591fdf81fd88bcad2755b2347bcd98e583f53bc562153a41e"},"i":{"activity-zone":[1024,[[59648,"currentColor"]]],"add":[1024,[[59649,"currentColor"]]],"archive":[1024,[[59650,"currentColor"]]],"arrow-back":[1024,[[59651,"currentColor"]]],"autoplay":[1024,[[59652,"currentColor"]]],"bar-chart-4-bars":[1024,[[59653,"currentColor"]]],"cached":[1024,[[59654,"currentColor"]]],"cancel":[1024,[[59655,"currentColor"]]],"check-circle":[1024,[[59656,"currentColor"]]],"check":[1024,[[59657,"currentColor"]]],"close":[1024,[[59658,"currentColor"]]],"color-wand":[1024,[[59659,"currentColor"],[59660,"black"],[59661,"currentColor"]]],"conversion-path":[1024,[[59662,"currentColor"]]],"create-new-folder":[1024,[[59663,"currentColor"]]],"delete":[1024,[[59664,"currentColor"]]],"do-not-disturb-on":[1024,[[59665,"currentColor"]]],"document-search":[1024,[[59666,"currentColor"]]],"drag-handle":[1024,[[59667,"currentColor"]]],"edit":[1024,[[59668,"currentColor"]]],"favorite-filled":[1024,[[59669,"currentColor"]]],"favorite":[1024,[[59670,"currentColor"]]],"file-save":[1024,[[59671,"currentColor"]]],"flask-filled":[1024,[[59672,"black"]]],"folder":[1024,[[59673,"currentColor"]]],"format-paint":[1024,[[59674,"currentColor"]]],"graph-1":[1024,[[59675,"currentColor"]]],"graphic-eq":[1024,[[59676,"currentColor"]]],"grid-view":[1024,[[59677,"currentColor"]]],"history":[1024,[[59678,"currentColor"]]],"home-filled":[1024,[[59679,"currentColor"]]],"home":[1024,[[59680,"currentColor"]]],"image":[1024,[[59681,"currentColor"]]],"info":[1024,[[59682,"currentColor"]]],"keyboard-arrow-down":[1024,[[59683,"currentColor"]]],"link-off":[1024,[[59684,"currentColor"]]],"logo-github":[1024,[[59685,"black"]]],"logo-google-playstore":[1024,[[59686,"black"]]],"low-priority":[1024,[[59687,"currentColor"]]],"lyrics":[1024,[[59688,"currentColor"]]],"mobile-arrow-down":[1024,[[59689,"currentColor"]]],"more-horiz":[1024,[[59690,"currentColor"]]],"more-vert":[1024,[[59691,"currentColor"]]],"nothing-arrow-right":[1024,[[59692,"black"]]],"open-in-new":[1024,[[59693,"currentColor"]]],"pause-filled":[1024,[[59694,"currentColor"]]],"play-arrow-filled":[1024,[[59695,"currentColor"]]],"playlist-add":[1024,[[59696,"currentColor"]]],"queue-music":[1024,[[59697,"currentColor"]]],"remove":[1024,[[59698,"currentColor"]]],"repeat-one":[1024,[[59699,"currentColor"]]],"repeat":[1024,[[59700,"currentColor"]]],"save":[1024,[[59701,"currentColor"]]],"schedule":[1024,[[59702,"currentColor"]]],"search":[1024,[[59703,"currentColor"]]],"settings":[1024,[[59704,"currentColor"]]],"shuffle":[1024,[[59705,"currentColor"]]],"skip-next-filled":[1024,[[59706,"currentColor"]]],"skip-previous-filled":[1024,[[59707,"currentColor"]]],"slow-motion-video":[1024,[[59708,"currentColor"]]],"sort":[1024,[[59709,"currentColor"]]],"timer":[1024,[[59710,"currentColor"]]],"translate":[1024,[[59711,"currentColor"]]],"view-agenda":[1024,[[59712,"currentColor"]]],"view-module":[1024,[[59713,"currentColor"]]],"visibility-off-filled":[1024,[[59714,"currentColor"]]],"voice-selection":[1024,[[59715,"currentColor"]]],"volume-up-filled":[1024,[[59716,"currentColor"]]],"warning":[1024,[[59717,"currentColor"]]]}} \ No newline at end of file diff --git a/mobile/src/resources/icons/app-icons.ttf b/mobile/src/resources/icons/app-icons.ttf new file mode 100644 index 000000000..fb3095349 Binary files /dev/null and b/mobile/src/resources/icons/app-icons.ttf differ diff --git a/mobile/src/resources/icons/index.tsx b/mobile/src/resources/icons/index.tsx new file mode 100644 index 000000000..dad9adbb8 --- /dev/null +++ b/mobile/src/resources/icons/index.tsx @@ -0,0 +1,29 @@ +import { createNanoIconSet } from "react-native-nano-icons"; + +import type { AppColor } from "~/modules/customization/theme/core/constants"; +import { useColor } from "~/modules/customization/theme/hooks"; +import glyphMap from "./app-icons.glyphmap.json"; + +const AppIcons = createNanoIconSet(glyphMap); + +export type SupportedIconName = React.ComponentProps["name"]; + +type Props = { + name: SupportedIconName; + /** Defaults to `24px`. */ + size?: number; + /** Defaults to theme's `onSurface` color. */ + color?: AppColor; +}; + +export function Icon({ name, size = 24, color }: Props) { + const usedColor = useColor(color, "onSurface"); + return ( + + ); +} diff --git a/mobile/src/resources/icons/type.ts b/mobile/src/resources/icons/type.ts deleted file mode 100644 index 9d5554194..000000000 --- a/mobile/src/resources/icons/type.ts +++ /dev/null @@ -1,13 +0,0 @@ -import type { AppColor } from "~/modules/customization/theme/core/constants"; - -export type Icon = { - /** Defaults to `24px`. */ - size?: number; - /** Defaults to theme's `onSurface` color. */ - color?: AppColor; - /** - * Use the alternative version of the icon if available (ie: filled, animated). - * Defaults to `false`. - */ - alternative?: boolean; -}; diff --git a/mobile/src/resources/licenses.json b/mobile/src/resources/licenses.json index ef516b49b..2b3f683f0 100644 --- a/mobile/src/resources/licenses.json +++ b/mobile/src/resources/licenses.json @@ -293,6 +293,13 @@ "license": "MIT", "licenseText": "MIT License\n\nCopyright (c) 2018 Mient-jan Stelling\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE." }, + "react-native-nano-icons": { + "name": "react-native-nano-icons", + "version": "1.0.0-nightly-20260611-d07ca9613", + "source": "https://github.com/software-mansion-labs/react-native-nano-icons", + "license": "MIT", + "licenseText": "The MIT License (MIT)\n\nCopyright (c) 2026 Software Mansion \n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE." + }, "react-native-nitro-modules": { "name": "react-native-nitro-modules", "version": "0.35.9",