├── README.md ├── music-app-swiftui-Info.plist ├── music_app_swiftui.xcodeproj ├── project.pbxproj ├── project.xcworkspace │ ├── contents.xcworkspacedata │ └── xcshareddata │ │ ├── IDEWorkspaceChecks.plist │ │ └── swiftpm │ │ └── Package.resolved └── xcuserdata │ └── CodeForAny.xcuserdatad │ ├── xcdebugger │ └── Breakpoints_v2.xcbkptlist │ └── xcschemes │ └── xcschememanagement.plist └── music_app_swiftui ├── Assets.xcassets ├── AccentColor.colorset │ └── Contents.json ├── AppIcon.appiconset │ └── Contents.json ├── Contents.json ├── add.imageset │ ├── Contents.json │ └── add.png ├── alb_1.imageset │ ├── Contents.json │ └── alb_1.png ├── alb_2.imageset │ ├── Contents.json │ └── alb_2.png ├── alb_3.imageset │ ├── Contents.json │ └── alb_3.png ├── alb_4.imageset │ ├── Contents.json │ └── alb_4.png ├── alb_5.imageset │ ├── Contents.json │ └── alb_5.png ├── alb_6.imageset │ ├── Contents.json │ └── alb_6.png ├── app_logo.imageset │ ├── Contents.json │ └── app_logo.png ├── ar_1.imageset │ ├── Contents.json │ └── ar_1.png ├── ar_2.imageset │ ├── Contents.json │ └── ar_2.png ├── ar_3.imageset │ ├── Contents.json │ └── ar_3.png ├── ar_4.imageset │ ├── Contents.json │ └── ar_4.png ├── ar_5.imageset │ ├── Contents.json │ └── ar_5.png ├── ar_6.imageset │ ├── Contents.json │ └── ar_6.png ├── ar_d_1.imageset │ ├── Contents.json │ └── ar_d_1.png ├── ar_d_2.imageset │ ├── Contents.json │ └── ar_d_2.png ├── ar_d_3.imageset │ ├── Contents.json │ └── ar_d_3.png ├── ar_d_4.imageset │ ├── Contents.json │ └── ar_d_4.png ├── artitst_detail_top.imageset │ ├── Contents.json │ └── artitst_detail_top.png ├── b_player_next.imageset │ ├── Contents.json │ └── b_player_next.png ├── b_player_previous.imageset │ ├── Contents.json │ └── b_player_previous.png ├── back.imageset │ ├── Contents.json │ └── back.png ├── close.imageset │ ├── Contents.json │ └── close.png ├── eq.imageset │ ├── Contents.json │ └── eq.png ├── eq_display.imageset │ ├── Contents.json │ └── eq_display.png ├── fav.imageset │ ├── Contents.json │ └── fav.png ├── favTemp.imageset │ ├── Contents.json │ └── fav.png ├── gen_1.imageset │ ├── Contents.json │ └── gen_1.png ├── gen_2.imageset │ ├── Contents.json │ └── gen_2.png ├── gen_3.imageset │ ├── Contents.json │ └── gen_3.png ├── gen_4.imageset │ ├── Contents.json │ └── gen_4.png ├── gen_5.imageset │ ├── Contents.json │ └── gen_5.png ├── gen_6.imageset │ ├── Contents.json │ └── gen_6.png ├── gen_7.imageset │ ├── Contents.json │ └── gen_7.png ├── gen_8.imageset │ ├── Contents.json │ └── gen_8.png ├── home_tab.imageset │ ├── Contents.json │ └── home_tab.png ├── home_tab_un.imageset │ ├── Contents.json │ └── home_tab_un.png ├── img_1.imageset │ ├── Contents.json │ └── img_1.png ├── img_2.imageset │ ├── Contents.json │ └── img_2.png ├── img_3.imageset │ ├── Contents.json │ └── img_3.png ├── img_4.imageset │ ├── Contents.json │ └── img_4.png ├── img_5.imageset │ ├── Contents.json │ └── img_5.png ├── m_driver_mode.imageset │ ├── Contents.json │ └── m_driver_mode.png ├── m_eq.imageset │ ├── Contents.json │ └── m_eq.png ├── m_hidden_folder.imageset │ ├── Contents.json │ └── m_hidden_folder.png ├── m_ring_cut.imageset │ ├── Contents.json │ └── m_ring_cut.png ├── m_scan_media.imageset │ ├── Contents.json │ └── m_scan_media.png ├── m_sleep_timer.imageset │ ├── Contents.json │ └── m_sleep_timer.png ├── m_theme.imageset │ ├── Contents.json │ └── m_theme.png ├── menu.imageset │ ├── Contents.json │ └── menu.png ├── more.imageset │ ├── Contents.json │ └── more.png ├── more_btn.imageset │ ├── Contents.json │ └── more_btn.png ├── mp_1.imageset │ ├── Contents.json │ └── mp_1.png ├── mp_2.imageset │ ├── Contents.json │ └── mp_2.png ├── mp_3.imageset │ ├── Contents.json │ └── mp_3.png ├── mp_4.imageset │ ├── Contents.json │ └── mp_4.png ├── next_song.imageset │ ├── Contents.json │ └── next_song.png ├── pause.imageset │ ├── Contents.json │ └── pause.png ├── play.imageset │ ├── Contents.json │ └── play.png ├── play_btn.imageset │ ├── Contents.json │ └── play_btn.png ├── play_eq.imageset │ ├── Contents.json │ └── play_eq.png ├── play_n.imageset │ ├── Contents.json │ └── play_n.png ├── player_image.imageset │ ├── Contents.json │ └── player_image.png ├── playlist.imageset │ ├── Contents.json │ └── playlist.png ├── playlist_1.imageset │ ├── Contents.json │ └── playlist_1.png ├── playlist_2.imageset │ ├── Contents.json │ └── playlist_2.png ├── playlist_3.imageset │ ├── Contents.json │ └── playlist_3.png ├── playlist_4.imageset │ ├── Contents.json │ └── playlist_4.png ├── previous_song.imageset │ ├── Contents.json │ └── previous_song.png ├── repeat.imageset │ ├── Contents.json │ └── repeat.png ├── s1.imageset │ ├── Contents.json │ └── s1.png ├── s10.imageset │ ├── Contents.json │ └── s10.png ├── s2.imageset │ ├── Contents.json │ └── s2.png ├── s3.imageset │ ├── Contents.json │ └── s3.png ├── s4.imageset │ ├── Contents.json │ └── s4.png ├── s5.imageset │ ├── Contents.json │ └── s5.png ├── s6.imageset │ ├── Contents.json │ └── s6.png ├── s7.imageset │ ├── Contents.json │ └── s7.png ├── s8.imageset │ ├── Contents.json │ └── s8.png ├── s9.imageset │ ├── Contents.json │ └── s9.png ├── s_audio.imageset │ ├── Contents.json │ └── s_audio.png ├── s_display.imageset │ ├── Contents.json │ └── s_display.png ├── s_headset.imageset │ ├── Contents.json │ └── s_headset.png ├── s_lock_screen.imageset │ ├── Contents.json │ └── s_lock_screen.png ├── s_menu.imageset │ ├── Contents.json │ └── s_menu.png ├── s_other.imageset │ ├── Contents.json │ └── s_other.png ├── search.imageset │ ├── Contents.json │ └── search.png ├── setting_tab.imageset │ ├── Contents.json │ └── setting_tab.png ├── setting_tab_un.imageset │ ├── Contents.json │ └── setting_tab_un.png ├── share.imageset │ ├── Contents.json │ └── share.png ├── shuffle.imageset │ ├── Contents.json │ └── shuffle.png ├── songs_tab.imageset │ ├── Contents.json │ └── songs_tab.png └── songs_tab_un.imageset │ ├── Contents.json │ └── songs_tab_un.png ├── Fonts ├── CircularStd-Black.otf ├── CircularStd-Bold.otf ├── CircularStd-Book.otf └── CircularStd-Medium.otf ├── Launch Screen.storyboard ├── Preview Content └── Preview Assets.xcassets │ └── Contents.json ├── UICommon ├── AlbumCell.swift ├── AlbumSongRow.swift ├── AllSongRow.swift ├── ArtistAlbumCell.swift ├── ArtistCell.swift ├── GenreCell.swift ├── IconTextRow.swift ├── MyPlaylistCell.swift ├── PlayerBottomButton.swift ├── PlaylistSongCell.swift ├── ProgressSliderView.swift ├── ScrollTabButton.swift ├── SettingRow.swift ├── TabButton.swift ├── UIExtension.swift ├── UIProgressSlider.swift └── ViewAllSection.swift ├── View ├── Home │ └── HomeView.swift ├── MainTab │ ├── MainTabView.swift │ └── SideMenuView.swift ├── Player │ ├── DriverModeView.swift │ ├── MainPlayerView.swift │ └── PlayPlaylistView.swift ├── Settings │ └── SettingsView.swift └── Songs │ ├── AlbumDetailsView.swift │ ├── AlbumsView.swift │ ├── AllSongsView.swift │ ├── ArtistDetailsView.swift │ ├── ArtistsView.swift │ ├── GenresView.swift │ ├── PlaylistsView.swift │ └── SongsView.swift ├── ViewModel ├── AudioPlayerViewModel.swift └── MainViewModel.swift └── music_app_swiftuiApp.swift /README.md: -------------------------------------------------------------------------------- 1 | # Best Music Player App in SwiftUI with MVVM: Complete Native iOS Step by Step 2 | 3 | # codeforany @codeforany 4 | 5 | 🎶 Embark on a journey to build a sleek and feature-rich Music Player App in SwiftUI using the MVVM architecture. In this comprehensive tutorial, we'll guide you through creating a captivating user experience with a Splash screen, a Bottom TabView, Home screen, Side Menu, Songs library, Playlists, Albums, Artist profiles, Genres, Play functionality, and Settings screen. 6 | 7 | 🚀 Key Highlights: 8 | 9 | 1) MVVM Architecture: Learn to structure your app using the Model-View-ViewModel pattern for maintainable and organized code. 10 | 2) Splash Screen: Create an engaging Splash screen to make a strong first impression. 11 | 3) Bottom TabView: Implement a sleek Bottom TabView for easy navigation across different app sections. 12 | 4) Home Screen: Design a dynamic Home screen to display featured content and quick links. 13 | 6) Side Menu: Craft an intuitive Side Menu for seamless access to app sections. 14 | 7) Songs Library: Build a comprehensive Songs library for users to explore and enjoy. 15 | 8) Playlist, Albums, Artist Details: Create interactive screens to view Playlists, Albums, and Artist details. 16 | 9) Genres and Play Songs: Allow users to explore music by Genres and play their favorite tracks. 17 | 10) Settings Screen: Design a user-friendly Settings screen for customization. 18 | 19 | 🎵 Elevate Your SwiftUI Skills: 20 | Whether you're a SwiftUI enthusiast or a beginner, this tutorial offers step-by-step instructions to create an impressive Music Player App. Enhance your SwiftUI skills and master MVVM architecture to build user-centric apps. 21 | 22 | 🔥 Let's Get Started: 23 | If you found this tutorial valuable, give it a thumbs up, share it with fellow developers, and subscribe to our channel for more exciting SwiftUI tutorials. Join our community of learners and become a SwiftUI pro! 24 | 25 | Let the music play! 🎶🎧🎤 26 | 27 | 👍 Don't forget to like the video, subscribe to the channel, and hit the notification bell to stay updated on more exciting SwiftUI tutorials. 28 | 29 | 🙏 Thank you for joining us on this creative journey! We're thrilled to have you with us as we develop an innovative Online Groceries Shop App for native iOS. 30 | 31 | 32 | - [Youtube Full Playlist: Swift UI Native iOS Music Player App Development from Scratch | MVVM Architecture | Step-by-Step Guide](https://www.youtube.com/playlist?list=PLzcRC7PA0xWTRhFuIAY6ZdUP62X0DdttE) 33 | - [Youtube Channel: @codeforany](https://www.youtube.com/channel/UCdQTp9wRK5vAOlEQZf9PHSg) 34 | - [Youtube Channel Subscribe: @codeforany](https://www.youtube.com/channel/UCdQTp9wRK5vAOlEQZf9PHSg?sub_confirmation=1) 35 | 36 | 37 | UI UX App Design by: [Akila Weerakoon](https://www.behance.net/gallery/108639283/Meal-Monkey-Food-delivery-iOS-mobile-application) 38 | 39 | #SwiftUI #MusicPlayerApp #MVVMArchitecture #SwiftUITutorial #iOSDevelopment #SplashScreen #BottomTabView #HomeScreen #SideMenu #SongsLibrary #Playlists #Albums #ArtistProfiles #Genres #PlayFunctionality #SettingsScreen #iOSAppDevelopment #SwiftUIApp #MVVMTutorial #iOSMusicApp #SwiftUILikeShareSubscribe #SwiftUIWelcomeMessage #iOSCommunity #MusicPlayerApp #SwiftUI #iOSDevelopment #MVVMArchitecture #SplashScreen #BottomTabView #HomeScreen #SideMenu #SongsList #PlaylistScreen #AlbumsCollection #AlbumDetails #ArtistList #ArtistDetails #GenresList #PlaySongs #SettingsScreen #NativeiOSApp #SwiftUITutorials #MobileAppDevelopment #UserExperience #UIDesign #MusicAppUI 40 | -------------------------------------------------------------------------------- /music-app-swiftui-Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | UIAppFonts 6 | 7 | CircularStd-Black.otf 8 | CircularStd-Bold.otf 9 | CircularStd-Book.otf 10 | CircularStd-Medium.otf 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /music_app_swiftui.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /music_app_swiftui.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /music_app_swiftui.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved: -------------------------------------------------------------------------------- 1 | { 2 | "pins" : [ 3 | { 4 | "identity" : "circularslider", 5 | "kind" : "remoteSourceControl", 6 | "location" : "https://github.com/terlan98/CircularSlider", 7 | "state" : { 8 | "revision" : "6112f54dd7fe756a4549865b66c697eab88ff9fd", 9 | "version" : "1.0.3" 10 | } 11 | }, 12 | { 13 | "identity" : "rxmusicplayer", 14 | "kind" : "remoteSourceControl", 15 | "location" : "https://github.com/yoheimuta/RxMusicPlayer", 16 | "state" : { 17 | "revision" : "27b3c6a6f6f2c0e65be5df40eeab5e462ed0190f", 18 | "version" : "2.3.3" 19 | } 20 | }, 21 | { 22 | "identity" : "rxswift", 23 | "kind" : "remoteSourceControl", 24 | "location" : "https://github.com/ReactiveX/RxSwift", 25 | "state" : { 26 | "revision" : "9dcaa4b333db437b0fbfaf453fad29069044a8b4", 27 | "version" : "6.6.0" 28 | } 29 | }, 30 | { 31 | "identity" : "sdwebimage", 32 | "kind" : "remoteSourceControl", 33 | "location" : "https://github.com/SDWebImage/SDWebImage.git", 34 | "state" : { 35 | "revision" : "36e484b317522667a4b2de9b50daaa01dfa30809", 36 | "version" : "5.18.0" 37 | } 38 | }, 39 | { 40 | "identity" : "sdwebimageswiftui", 41 | "kind" : "remoteSourceControl", 42 | "location" : "https://github.com/SDWebImage/SDWebImageSwiftUI.git", 43 | "state" : { 44 | "revision" : "e837c37d45449fbd3b4745c10c5b5274e73edead", 45 | "version" : "2.2.3" 46 | } 47 | } 48 | ], 49 | "version" : 2 50 | } 51 | -------------------------------------------------------------------------------- /music_app_swiftui.xcodeproj/xcuserdata/CodeForAny.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 9 | 21 | 22 | 23 | 24 | 25 | -------------------------------------------------------------------------------- /music_app_swiftui.xcodeproj/xcuserdata/CodeForAny.xcuserdatad/xcschemes/xcschememanagement.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SchemeUserState 6 | 7 | Rx (Playground) 1.xcscheme 8 | 9 | isShown 10 | 11 | orderHint 12 | 2 13 | 14 | Rx (Playground) 2.xcscheme 15 | 16 | isShown 17 | 18 | orderHint 19 | 3 20 | 21 | Rx (Playground).xcscheme 22 | 23 | isShown 24 | 25 | orderHint 26 | 0 27 | 28 | music_app_swiftui.xcscheme_^#shared#^_ 29 | 30 | orderHint 31 | 0 32 | 33 | 34 | 35 | 36 | -------------------------------------------------------------------------------- /music_app_swiftui/Assets.xcassets/AccentColor.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "idiom" : "universal" 5 | } 6 | ], 7 | "info" : { 8 | "author" : "xcode", 9 | "version" : 1 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /music_app_swiftui/Assets.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "platform" : "ios", 6 | "size" : "1024x1024" 7 | } 8 | ], 9 | "info" : { 10 | "author" : "xcode", 11 | "version" : 1 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /music_app_swiftui/Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /music_app_swiftui/Assets.xcassets/add.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "add.png", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /music_app_swiftui/Assets.xcassets/add.imageset/add.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforany/music_app_swiftui/2c33724b2a2914225fd261e6eaa9386676b6c74c/music_app_swiftui/Assets.xcassets/add.imageset/add.png -------------------------------------------------------------------------------- /music_app_swiftui/Assets.xcassets/alb_1.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "alb_1.png", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | }, 12 | "properties" : { 13 | "template-rendering-intent" : "original" 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /music_app_swiftui/Assets.xcassets/alb_1.imageset/alb_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforany/music_app_swiftui/2c33724b2a2914225fd261e6eaa9386676b6c74c/music_app_swiftui/Assets.xcassets/alb_1.imageset/alb_1.png -------------------------------------------------------------------------------- /music_app_swiftui/Assets.xcassets/alb_2.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "alb_2.png", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | }, 12 | "properties" : { 13 | "template-rendering-intent" : "original" 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /music_app_swiftui/Assets.xcassets/alb_2.imageset/alb_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforany/music_app_swiftui/2c33724b2a2914225fd261e6eaa9386676b6c74c/music_app_swiftui/Assets.xcassets/alb_2.imageset/alb_2.png -------------------------------------------------------------------------------- /music_app_swiftui/Assets.xcassets/alb_3.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "alb_3.png", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | }, 12 | "properties" : { 13 | "template-rendering-intent" : "original" 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /music_app_swiftui/Assets.xcassets/alb_3.imageset/alb_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforany/music_app_swiftui/2c33724b2a2914225fd261e6eaa9386676b6c74c/music_app_swiftui/Assets.xcassets/alb_3.imageset/alb_3.png -------------------------------------------------------------------------------- /music_app_swiftui/Assets.xcassets/alb_4.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "alb_4.png", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | }, 12 | "properties" : { 13 | "template-rendering-intent" : "original" 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /music_app_swiftui/Assets.xcassets/alb_4.imageset/alb_4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforany/music_app_swiftui/2c33724b2a2914225fd261e6eaa9386676b6c74c/music_app_swiftui/Assets.xcassets/alb_4.imageset/alb_4.png -------------------------------------------------------------------------------- /music_app_swiftui/Assets.xcassets/alb_5.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "alb_5.png", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | }, 12 | "properties" : { 13 | "template-rendering-intent" : "original" 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /music_app_swiftui/Assets.xcassets/alb_5.imageset/alb_5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforany/music_app_swiftui/2c33724b2a2914225fd261e6eaa9386676b6c74c/music_app_swiftui/Assets.xcassets/alb_5.imageset/alb_5.png -------------------------------------------------------------------------------- /music_app_swiftui/Assets.xcassets/alb_6.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "alb_6.png", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | }, 12 | "properties" : { 13 | "template-rendering-intent" : "original" 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /music_app_swiftui/Assets.xcassets/alb_6.imageset/alb_6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforany/music_app_swiftui/2c33724b2a2914225fd261e6eaa9386676b6c74c/music_app_swiftui/Assets.xcassets/alb_6.imageset/alb_6.png -------------------------------------------------------------------------------- /music_app_swiftui/Assets.xcassets/app_logo.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "app_logo.png", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /music_app_swiftui/Assets.xcassets/app_logo.imageset/app_logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforany/music_app_swiftui/2c33724b2a2914225fd261e6eaa9386676b6c74c/music_app_swiftui/Assets.xcassets/app_logo.imageset/app_logo.png -------------------------------------------------------------------------------- /music_app_swiftui/Assets.xcassets/ar_1.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "ar_1.png", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | }, 12 | "properties" : { 13 | "template-rendering-intent" : "original" 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /music_app_swiftui/Assets.xcassets/ar_1.imageset/ar_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforany/music_app_swiftui/2c33724b2a2914225fd261e6eaa9386676b6c74c/music_app_swiftui/Assets.xcassets/ar_1.imageset/ar_1.png -------------------------------------------------------------------------------- /music_app_swiftui/Assets.xcassets/ar_2.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "ar_2.png", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | }, 12 | "properties" : { 13 | "template-rendering-intent" : "original" 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /music_app_swiftui/Assets.xcassets/ar_2.imageset/ar_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforany/music_app_swiftui/2c33724b2a2914225fd261e6eaa9386676b6c74c/music_app_swiftui/Assets.xcassets/ar_2.imageset/ar_2.png -------------------------------------------------------------------------------- /music_app_swiftui/Assets.xcassets/ar_3.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "ar_3.png", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | }, 12 | "properties" : { 13 | "template-rendering-intent" : "original" 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /music_app_swiftui/Assets.xcassets/ar_3.imageset/ar_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforany/music_app_swiftui/2c33724b2a2914225fd261e6eaa9386676b6c74c/music_app_swiftui/Assets.xcassets/ar_3.imageset/ar_3.png -------------------------------------------------------------------------------- /music_app_swiftui/Assets.xcassets/ar_4.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "ar_4.png", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | }, 12 | "properties" : { 13 | "template-rendering-intent" : "original" 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /music_app_swiftui/Assets.xcassets/ar_4.imageset/ar_4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforany/music_app_swiftui/2c33724b2a2914225fd261e6eaa9386676b6c74c/music_app_swiftui/Assets.xcassets/ar_4.imageset/ar_4.png -------------------------------------------------------------------------------- /music_app_swiftui/Assets.xcassets/ar_5.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "ar_5.png", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | }, 12 | "properties" : { 13 | "template-rendering-intent" : "original" 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /music_app_swiftui/Assets.xcassets/ar_5.imageset/ar_5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforany/music_app_swiftui/2c33724b2a2914225fd261e6eaa9386676b6c74c/music_app_swiftui/Assets.xcassets/ar_5.imageset/ar_5.png -------------------------------------------------------------------------------- /music_app_swiftui/Assets.xcassets/ar_6.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "ar_6.png", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | }, 12 | "properties" : { 13 | "template-rendering-intent" : "original" 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /music_app_swiftui/Assets.xcassets/ar_6.imageset/ar_6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforany/music_app_swiftui/2c33724b2a2914225fd261e6eaa9386676b6c74c/music_app_swiftui/Assets.xcassets/ar_6.imageset/ar_6.png -------------------------------------------------------------------------------- /music_app_swiftui/Assets.xcassets/ar_d_1.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "ar_d_1.png", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | }, 12 | "properties" : { 13 | "template-rendering-intent" : "original" 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /music_app_swiftui/Assets.xcassets/ar_d_1.imageset/ar_d_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforany/music_app_swiftui/2c33724b2a2914225fd261e6eaa9386676b6c74c/music_app_swiftui/Assets.xcassets/ar_d_1.imageset/ar_d_1.png -------------------------------------------------------------------------------- /music_app_swiftui/Assets.xcassets/ar_d_2.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "ar_d_2.png", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | }, 12 | "properties" : { 13 | "template-rendering-intent" : "original" 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /music_app_swiftui/Assets.xcassets/ar_d_2.imageset/ar_d_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforany/music_app_swiftui/2c33724b2a2914225fd261e6eaa9386676b6c74c/music_app_swiftui/Assets.xcassets/ar_d_2.imageset/ar_d_2.png -------------------------------------------------------------------------------- /music_app_swiftui/Assets.xcassets/ar_d_3.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "ar_d_3.png", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | }, 12 | "properties" : { 13 | "template-rendering-intent" : "original" 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /music_app_swiftui/Assets.xcassets/ar_d_3.imageset/ar_d_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforany/music_app_swiftui/2c33724b2a2914225fd261e6eaa9386676b6c74c/music_app_swiftui/Assets.xcassets/ar_d_3.imageset/ar_d_3.png -------------------------------------------------------------------------------- /music_app_swiftui/Assets.xcassets/ar_d_4.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "ar_d_4.png", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | }, 12 | "properties" : { 13 | "template-rendering-intent" : "original" 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /music_app_swiftui/Assets.xcassets/ar_d_4.imageset/ar_d_4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforany/music_app_swiftui/2c33724b2a2914225fd261e6eaa9386676b6c74c/music_app_swiftui/Assets.xcassets/ar_d_4.imageset/ar_d_4.png -------------------------------------------------------------------------------- /music_app_swiftui/Assets.xcassets/artitst_detail_top.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "artitst_detail_top.png", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | }, 12 | "properties" : { 13 | "template-rendering-intent" : "original" 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /music_app_swiftui/Assets.xcassets/artitst_detail_top.imageset/artitst_detail_top.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforany/music_app_swiftui/2c33724b2a2914225fd261e6eaa9386676b6c74c/music_app_swiftui/Assets.xcassets/artitst_detail_top.imageset/artitst_detail_top.png -------------------------------------------------------------------------------- /music_app_swiftui/Assets.xcassets/b_player_next.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "b_player_next.png", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /music_app_swiftui/Assets.xcassets/b_player_next.imageset/b_player_next.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforany/music_app_swiftui/2c33724b2a2914225fd261e6eaa9386676b6c74c/music_app_swiftui/Assets.xcassets/b_player_next.imageset/b_player_next.png -------------------------------------------------------------------------------- /music_app_swiftui/Assets.xcassets/b_player_previous.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "b_player_previous.png", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /music_app_swiftui/Assets.xcassets/b_player_previous.imageset/b_player_previous.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforany/music_app_swiftui/2c33724b2a2914225fd261e6eaa9386676b6c74c/music_app_swiftui/Assets.xcassets/b_player_previous.imageset/b_player_previous.png -------------------------------------------------------------------------------- /music_app_swiftui/Assets.xcassets/back.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "back.png", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /music_app_swiftui/Assets.xcassets/back.imageset/back.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforany/music_app_swiftui/2c33724b2a2914225fd261e6eaa9386676b6c74c/music_app_swiftui/Assets.xcassets/back.imageset/back.png -------------------------------------------------------------------------------- /music_app_swiftui/Assets.xcassets/close.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "close.png", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /music_app_swiftui/Assets.xcassets/close.imageset/close.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforany/music_app_swiftui/2c33724b2a2914225fd261e6eaa9386676b6c74c/music_app_swiftui/Assets.xcassets/close.imageset/close.png -------------------------------------------------------------------------------- /music_app_swiftui/Assets.xcassets/eq.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "eq.png", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /music_app_swiftui/Assets.xcassets/eq.imageset/eq.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforany/music_app_swiftui/2c33724b2a2914225fd261e6eaa9386676b6c74c/music_app_swiftui/Assets.xcassets/eq.imageset/eq.png -------------------------------------------------------------------------------- /music_app_swiftui/Assets.xcassets/eq_display.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "eq_display.png", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /music_app_swiftui/Assets.xcassets/eq_display.imageset/eq_display.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforany/music_app_swiftui/2c33724b2a2914225fd261e6eaa9386676b6c74c/music_app_swiftui/Assets.xcassets/eq_display.imageset/eq_display.png -------------------------------------------------------------------------------- /music_app_swiftui/Assets.xcassets/fav.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "fav.png", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /music_app_swiftui/Assets.xcassets/fav.imageset/fav.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforany/music_app_swiftui/2c33724b2a2914225fd261e6eaa9386676b6c74c/music_app_swiftui/Assets.xcassets/fav.imageset/fav.png -------------------------------------------------------------------------------- /music_app_swiftui/Assets.xcassets/favTemp.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "fav.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | }, 21 | "properties" : { 22 | "template-rendering-intent" : "template" 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /music_app_swiftui/Assets.xcassets/favTemp.imageset/fav.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforany/music_app_swiftui/2c33724b2a2914225fd261e6eaa9386676b6c74c/music_app_swiftui/Assets.xcassets/favTemp.imageset/fav.png -------------------------------------------------------------------------------- /music_app_swiftui/Assets.xcassets/gen_1.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "gen_1.png", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /music_app_swiftui/Assets.xcassets/gen_1.imageset/gen_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforany/music_app_swiftui/2c33724b2a2914225fd261e6eaa9386676b6c74c/music_app_swiftui/Assets.xcassets/gen_1.imageset/gen_1.png -------------------------------------------------------------------------------- /music_app_swiftui/Assets.xcassets/gen_2.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "gen_2.png", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /music_app_swiftui/Assets.xcassets/gen_2.imageset/gen_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforany/music_app_swiftui/2c33724b2a2914225fd261e6eaa9386676b6c74c/music_app_swiftui/Assets.xcassets/gen_2.imageset/gen_2.png -------------------------------------------------------------------------------- /music_app_swiftui/Assets.xcassets/gen_3.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "gen_3.png", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /music_app_swiftui/Assets.xcassets/gen_3.imageset/gen_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforany/music_app_swiftui/2c33724b2a2914225fd261e6eaa9386676b6c74c/music_app_swiftui/Assets.xcassets/gen_3.imageset/gen_3.png -------------------------------------------------------------------------------- /music_app_swiftui/Assets.xcassets/gen_4.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "gen_4.png", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /music_app_swiftui/Assets.xcassets/gen_4.imageset/gen_4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforany/music_app_swiftui/2c33724b2a2914225fd261e6eaa9386676b6c74c/music_app_swiftui/Assets.xcassets/gen_4.imageset/gen_4.png -------------------------------------------------------------------------------- /music_app_swiftui/Assets.xcassets/gen_5.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "gen_5.png", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /music_app_swiftui/Assets.xcassets/gen_5.imageset/gen_5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforany/music_app_swiftui/2c33724b2a2914225fd261e6eaa9386676b6c74c/music_app_swiftui/Assets.xcassets/gen_5.imageset/gen_5.png -------------------------------------------------------------------------------- /music_app_swiftui/Assets.xcassets/gen_6.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "gen_6.png", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /music_app_swiftui/Assets.xcassets/gen_6.imageset/gen_6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforany/music_app_swiftui/2c33724b2a2914225fd261e6eaa9386676b6c74c/music_app_swiftui/Assets.xcassets/gen_6.imageset/gen_6.png -------------------------------------------------------------------------------- /music_app_swiftui/Assets.xcassets/gen_7.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "gen_7.png", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /music_app_swiftui/Assets.xcassets/gen_7.imageset/gen_7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforany/music_app_swiftui/2c33724b2a2914225fd261e6eaa9386676b6c74c/music_app_swiftui/Assets.xcassets/gen_7.imageset/gen_7.png -------------------------------------------------------------------------------- /music_app_swiftui/Assets.xcassets/gen_8.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "gen_8.png", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /music_app_swiftui/Assets.xcassets/gen_8.imageset/gen_8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforany/music_app_swiftui/2c33724b2a2914225fd261e6eaa9386676b6c74c/music_app_swiftui/Assets.xcassets/gen_8.imageset/gen_8.png -------------------------------------------------------------------------------- /music_app_swiftui/Assets.xcassets/home_tab.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "home_tab.png", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /music_app_swiftui/Assets.xcassets/home_tab.imageset/home_tab.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforany/music_app_swiftui/2c33724b2a2914225fd261e6eaa9386676b6c74c/music_app_swiftui/Assets.xcassets/home_tab.imageset/home_tab.png -------------------------------------------------------------------------------- /music_app_swiftui/Assets.xcassets/home_tab_un.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "home_tab_un.png", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /music_app_swiftui/Assets.xcassets/home_tab_un.imageset/home_tab_un.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforany/music_app_swiftui/2c33724b2a2914225fd261e6eaa9386676b6c74c/music_app_swiftui/Assets.xcassets/home_tab_un.imageset/home_tab_un.png -------------------------------------------------------------------------------- /music_app_swiftui/Assets.xcassets/img_1.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "img_1.png", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /music_app_swiftui/Assets.xcassets/img_1.imageset/img_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforany/music_app_swiftui/2c33724b2a2914225fd261e6eaa9386676b6c74c/music_app_swiftui/Assets.xcassets/img_1.imageset/img_1.png -------------------------------------------------------------------------------- /music_app_swiftui/Assets.xcassets/img_2.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "img_2.png", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /music_app_swiftui/Assets.xcassets/img_2.imageset/img_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforany/music_app_swiftui/2c33724b2a2914225fd261e6eaa9386676b6c74c/music_app_swiftui/Assets.xcassets/img_2.imageset/img_2.png -------------------------------------------------------------------------------- /music_app_swiftui/Assets.xcassets/img_3.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "img_3.png", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /music_app_swiftui/Assets.xcassets/img_3.imageset/img_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforany/music_app_swiftui/2c33724b2a2914225fd261e6eaa9386676b6c74c/music_app_swiftui/Assets.xcassets/img_3.imageset/img_3.png -------------------------------------------------------------------------------- /music_app_swiftui/Assets.xcassets/img_4.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "img_4.png", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /music_app_swiftui/Assets.xcassets/img_4.imageset/img_4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforany/music_app_swiftui/2c33724b2a2914225fd261e6eaa9386676b6c74c/music_app_swiftui/Assets.xcassets/img_4.imageset/img_4.png -------------------------------------------------------------------------------- /music_app_swiftui/Assets.xcassets/img_5.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "img_5.png", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /music_app_swiftui/Assets.xcassets/img_5.imageset/img_5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforany/music_app_swiftui/2c33724b2a2914225fd261e6eaa9386676b6c74c/music_app_swiftui/Assets.xcassets/img_5.imageset/img_5.png -------------------------------------------------------------------------------- /music_app_swiftui/Assets.xcassets/m_driver_mode.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "m_driver_mode.png", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /music_app_swiftui/Assets.xcassets/m_driver_mode.imageset/m_driver_mode.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforany/music_app_swiftui/2c33724b2a2914225fd261e6eaa9386676b6c74c/music_app_swiftui/Assets.xcassets/m_driver_mode.imageset/m_driver_mode.png -------------------------------------------------------------------------------- /music_app_swiftui/Assets.xcassets/m_eq.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "m_eq.png", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /music_app_swiftui/Assets.xcassets/m_eq.imageset/m_eq.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforany/music_app_swiftui/2c33724b2a2914225fd261e6eaa9386676b6c74c/music_app_swiftui/Assets.xcassets/m_eq.imageset/m_eq.png -------------------------------------------------------------------------------- /music_app_swiftui/Assets.xcassets/m_hidden_folder.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "m_hidden_folder.png", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /music_app_swiftui/Assets.xcassets/m_hidden_folder.imageset/m_hidden_folder.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforany/music_app_swiftui/2c33724b2a2914225fd261e6eaa9386676b6c74c/music_app_swiftui/Assets.xcassets/m_hidden_folder.imageset/m_hidden_folder.png -------------------------------------------------------------------------------- /music_app_swiftui/Assets.xcassets/m_ring_cut.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "m_ring_cut.png", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /music_app_swiftui/Assets.xcassets/m_ring_cut.imageset/m_ring_cut.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforany/music_app_swiftui/2c33724b2a2914225fd261e6eaa9386676b6c74c/music_app_swiftui/Assets.xcassets/m_ring_cut.imageset/m_ring_cut.png -------------------------------------------------------------------------------- /music_app_swiftui/Assets.xcassets/m_scan_media.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "m_scan_media.png", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /music_app_swiftui/Assets.xcassets/m_scan_media.imageset/m_scan_media.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforany/music_app_swiftui/2c33724b2a2914225fd261e6eaa9386676b6c74c/music_app_swiftui/Assets.xcassets/m_scan_media.imageset/m_scan_media.png -------------------------------------------------------------------------------- /music_app_swiftui/Assets.xcassets/m_sleep_timer.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "m_sleep_timer.png", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /music_app_swiftui/Assets.xcassets/m_sleep_timer.imageset/m_sleep_timer.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforany/music_app_swiftui/2c33724b2a2914225fd261e6eaa9386676b6c74c/music_app_swiftui/Assets.xcassets/m_sleep_timer.imageset/m_sleep_timer.png -------------------------------------------------------------------------------- /music_app_swiftui/Assets.xcassets/m_theme.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "m_theme.png", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /music_app_swiftui/Assets.xcassets/m_theme.imageset/m_theme.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforany/music_app_swiftui/2c33724b2a2914225fd261e6eaa9386676b6c74c/music_app_swiftui/Assets.xcassets/m_theme.imageset/m_theme.png -------------------------------------------------------------------------------- /music_app_swiftui/Assets.xcassets/menu.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "menu.png", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /music_app_swiftui/Assets.xcassets/menu.imageset/menu.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforany/music_app_swiftui/2c33724b2a2914225fd261e6eaa9386676b6c74c/music_app_swiftui/Assets.xcassets/menu.imageset/menu.png -------------------------------------------------------------------------------- /music_app_swiftui/Assets.xcassets/more.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "more.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /music_app_swiftui/Assets.xcassets/more.imageset/more.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforany/music_app_swiftui/2c33724b2a2914225fd261e6eaa9386676b6c74c/music_app_swiftui/Assets.xcassets/more.imageset/more.png -------------------------------------------------------------------------------- /music_app_swiftui/Assets.xcassets/more_btn.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "more_btn.png", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /music_app_swiftui/Assets.xcassets/more_btn.imageset/more_btn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforany/music_app_swiftui/2c33724b2a2914225fd261e6eaa9386676b6c74c/music_app_swiftui/Assets.xcassets/more_btn.imageset/more_btn.png -------------------------------------------------------------------------------- /music_app_swiftui/Assets.xcassets/mp_1.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "mp_1.png", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /music_app_swiftui/Assets.xcassets/mp_1.imageset/mp_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforany/music_app_swiftui/2c33724b2a2914225fd261e6eaa9386676b6c74c/music_app_swiftui/Assets.xcassets/mp_1.imageset/mp_1.png -------------------------------------------------------------------------------- /music_app_swiftui/Assets.xcassets/mp_2.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "mp_2.png", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /music_app_swiftui/Assets.xcassets/mp_2.imageset/mp_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforany/music_app_swiftui/2c33724b2a2914225fd261e6eaa9386676b6c74c/music_app_swiftui/Assets.xcassets/mp_2.imageset/mp_2.png -------------------------------------------------------------------------------- /music_app_swiftui/Assets.xcassets/mp_3.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "mp_3.png", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /music_app_swiftui/Assets.xcassets/mp_3.imageset/mp_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforany/music_app_swiftui/2c33724b2a2914225fd261e6eaa9386676b6c74c/music_app_swiftui/Assets.xcassets/mp_3.imageset/mp_3.png -------------------------------------------------------------------------------- /music_app_swiftui/Assets.xcassets/mp_4.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "mp_4.png", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /music_app_swiftui/Assets.xcassets/mp_4.imageset/mp_4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforany/music_app_swiftui/2c33724b2a2914225fd261e6eaa9386676b6c74c/music_app_swiftui/Assets.xcassets/mp_4.imageset/mp_4.png -------------------------------------------------------------------------------- /music_app_swiftui/Assets.xcassets/next_song.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "next_song.png", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /music_app_swiftui/Assets.xcassets/next_song.imageset/next_song.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforany/music_app_swiftui/2c33724b2a2914225fd261e6eaa9386676b6c74c/music_app_swiftui/Assets.xcassets/next_song.imageset/next_song.png -------------------------------------------------------------------------------- /music_app_swiftui/Assets.xcassets/pause.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "pause.png", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /music_app_swiftui/Assets.xcassets/pause.imageset/pause.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforany/music_app_swiftui/2c33724b2a2914225fd261e6eaa9386676b6c74c/music_app_swiftui/Assets.xcassets/pause.imageset/pause.png -------------------------------------------------------------------------------- /music_app_swiftui/Assets.xcassets/play.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "play.png", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /music_app_swiftui/Assets.xcassets/play.imageset/play.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforany/music_app_swiftui/2c33724b2a2914225fd261e6eaa9386676b6c74c/music_app_swiftui/Assets.xcassets/play.imageset/play.png -------------------------------------------------------------------------------- /music_app_swiftui/Assets.xcassets/play_btn.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "play_btn.png", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /music_app_swiftui/Assets.xcassets/play_btn.imageset/play_btn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforany/music_app_swiftui/2c33724b2a2914225fd261e6eaa9386676b6c74c/music_app_swiftui/Assets.xcassets/play_btn.imageset/play_btn.png -------------------------------------------------------------------------------- /music_app_swiftui/Assets.xcassets/play_eq.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "play_eq.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /music_app_swiftui/Assets.xcassets/play_eq.imageset/play_eq.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforany/music_app_swiftui/2c33724b2a2914225fd261e6eaa9386676b6c74c/music_app_swiftui/Assets.xcassets/play_eq.imageset/play_eq.png -------------------------------------------------------------------------------- /music_app_swiftui/Assets.xcassets/play_n.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "play_n.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /music_app_swiftui/Assets.xcassets/play_n.imageset/play_n.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforany/music_app_swiftui/2c33724b2a2914225fd261e6eaa9386676b6c74c/music_app_swiftui/Assets.xcassets/play_n.imageset/play_n.png -------------------------------------------------------------------------------- /music_app_swiftui/Assets.xcassets/player_image.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "player_image.png", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /music_app_swiftui/Assets.xcassets/player_image.imageset/player_image.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforany/music_app_swiftui/2c33724b2a2914225fd261e6eaa9386676b6c74c/music_app_swiftui/Assets.xcassets/player_image.imageset/player_image.png -------------------------------------------------------------------------------- /music_app_swiftui/Assets.xcassets/playlist.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "playlist.png", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /music_app_swiftui/Assets.xcassets/playlist.imageset/playlist.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforany/music_app_swiftui/2c33724b2a2914225fd261e6eaa9386676b6c74c/music_app_swiftui/Assets.xcassets/playlist.imageset/playlist.png -------------------------------------------------------------------------------- /music_app_swiftui/Assets.xcassets/playlist_1.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "playlist_1.png", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /music_app_swiftui/Assets.xcassets/playlist_1.imageset/playlist_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforany/music_app_swiftui/2c33724b2a2914225fd261e6eaa9386676b6c74c/music_app_swiftui/Assets.xcassets/playlist_1.imageset/playlist_1.png -------------------------------------------------------------------------------- /music_app_swiftui/Assets.xcassets/playlist_2.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "playlist_2.png", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /music_app_swiftui/Assets.xcassets/playlist_2.imageset/playlist_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforany/music_app_swiftui/2c33724b2a2914225fd261e6eaa9386676b6c74c/music_app_swiftui/Assets.xcassets/playlist_2.imageset/playlist_2.png -------------------------------------------------------------------------------- /music_app_swiftui/Assets.xcassets/playlist_3.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "playlist_3.png", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /music_app_swiftui/Assets.xcassets/playlist_3.imageset/playlist_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforany/music_app_swiftui/2c33724b2a2914225fd261e6eaa9386676b6c74c/music_app_swiftui/Assets.xcassets/playlist_3.imageset/playlist_3.png -------------------------------------------------------------------------------- /music_app_swiftui/Assets.xcassets/playlist_4.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "playlist_4.png", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /music_app_swiftui/Assets.xcassets/playlist_4.imageset/playlist_4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforany/music_app_swiftui/2c33724b2a2914225fd261e6eaa9386676b6c74c/music_app_swiftui/Assets.xcassets/playlist_4.imageset/playlist_4.png -------------------------------------------------------------------------------- /music_app_swiftui/Assets.xcassets/previous_song.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "previous_song.png", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /music_app_swiftui/Assets.xcassets/previous_song.imageset/previous_song.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforany/music_app_swiftui/2c33724b2a2914225fd261e6eaa9386676b6c74c/music_app_swiftui/Assets.xcassets/previous_song.imageset/previous_song.png -------------------------------------------------------------------------------- /music_app_swiftui/Assets.xcassets/repeat.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "repeat.png", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /music_app_swiftui/Assets.xcassets/repeat.imageset/repeat.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforany/music_app_swiftui/2c33724b2a2914225fd261e6eaa9386676b6c74c/music_app_swiftui/Assets.xcassets/repeat.imageset/repeat.png -------------------------------------------------------------------------------- /music_app_swiftui/Assets.xcassets/s1.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "s1.png", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /music_app_swiftui/Assets.xcassets/s1.imageset/s1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforany/music_app_swiftui/2c33724b2a2914225fd261e6eaa9386676b6c74c/music_app_swiftui/Assets.xcassets/s1.imageset/s1.png -------------------------------------------------------------------------------- /music_app_swiftui/Assets.xcassets/s10.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "s10.png", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /music_app_swiftui/Assets.xcassets/s10.imageset/s10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforany/music_app_swiftui/2c33724b2a2914225fd261e6eaa9386676b6c74c/music_app_swiftui/Assets.xcassets/s10.imageset/s10.png -------------------------------------------------------------------------------- /music_app_swiftui/Assets.xcassets/s2.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "s2.png", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /music_app_swiftui/Assets.xcassets/s2.imageset/s2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforany/music_app_swiftui/2c33724b2a2914225fd261e6eaa9386676b6c74c/music_app_swiftui/Assets.xcassets/s2.imageset/s2.png -------------------------------------------------------------------------------- /music_app_swiftui/Assets.xcassets/s3.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "s3.png", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /music_app_swiftui/Assets.xcassets/s3.imageset/s3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforany/music_app_swiftui/2c33724b2a2914225fd261e6eaa9386676b6c74c/music_app_swiftui/Assets.xcassets/s3.imageset/s3.png -------------------------------------------------------------------------------- /music_app_swiftui/Assets.xcassets/s4.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "s4.png", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /music_app_swiftui/Assets.xcassets/s4.imageset/s4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforany/music_app_swiftui/2c33724b2a2914225fd261e6eaa9386676b6c74c/music_app_swiftui/Assets.xcassets/s4.imageset/s4.png -------------------------------------------------------------------------------- /music_app_swiftui/Assets.xcassets/s5.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "s5.png", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /music_app_swiftui/Assets.xcassets/s5.imageset/s5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforany/music_app_swiftui/2c33724b2a2914225fd261e6eaa9386676b6c74c/music_app_swiftui/Assets.xcassets/s5.imageset/s5.png -------------------------------------------------------------------------------- /music_app_swiftui/Assets.xcassets/s6.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "s6.png", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /music_app_swiftui/Assets.xcassets/s6.imageset/s6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforany/music_app_swiftui/2c33724b2a2914225fd261e6eaa9386676b6c74c/music_app_swiftui/Assets.xcassets/s6.imageset/s6.png -------------------------------------------------------------------------------- /music_app_swiftui/Assets.xcassets/s7.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "s7.png", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /music_app_swiftui/Assets.xcassets/s7.imageset/s7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforany/music_app_swiftui/2c33724b2a2914225fd261e6eaa9386676b6c74c/music_app_swiftui/Assets.xcassets/s7.imageset/s7.png -------------------------------------------------------------------------------- /music_app_swiftui/Assets.xcassets/s8.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "s8.png", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /music_app_swiftui/Assets.xcassets/s8.imageset/s8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforany/music_app_swiftui/2c33724b2a2914225fd261e6eaa9386676b6c74c/music_app_swiftui/Assets.xcassets/s8.imageset/s8.png -------------------------------------------------------------------------------- /music_app_swiftui/Assets.xcassets/s9.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "s9.png", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /music_app_swiftui/Assets.xcassets/s9.imageset/s9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforany/music_app_swiftui/2c33724b2a2914225fd261e6eaa9386676b6c74c/music_app_swiftui/Assets.xcassets/s9.imageset/s9.png -------------------------------------------------------------------------------- /music_app_swiftui/Assets.xcassets/s_audio.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "s_audio.png", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /music_app_swiftui/Assets.xcassets/s_audio.imageset/s_audio.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforany/music_app_swiftui/2c33724b2a2914225fd261e6eaa9386676b6c74c/music_app_swiftui/Assets.xcassets/s_audio.imageset/s_audio.png -------------------------------------------------------------------------------- /music_app_swiftui/Assets.xcassets/s_display.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "s_display.png", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /music_app_swiftui/Assets.xcassets/s_display.imageset/s_display.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforany/music_app_swiftui/2c33724b2a2914225fd261e6eaa9386676b6c74c/music_app_swiftui/Assets.xcassets/s_display.imageset/s_display.png -------------------------------------------------------------------------------- /music_app_swiftui/Assets.xcassets/s_headset.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "s_headset.png", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /music_app_swiftui/Assets.xcassets/s_headset.imageset/s_headset.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforany/music_app_swiftui/2c33724b2a2914225fd261e6eaa9386676b6c74c/music_app_swiftui/Assets.xcassets/s_headset.imageset/s_headset.png -------------------------------------------------------------------------------- /music_app_swiftui/Assets.xcassets/s_lock_screen.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "s_lock_screen.png", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /music_app_swiftui/Assets.xcassets/s_lock_screen.imageset/s_lock_screen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforany/music_app_swiftui/2c33724b2a2914225fd261e6eaa9386676b6c74c/music_app_swiftui/Assets.xcassets/s_lock_screen.imageset/s_lock_screen.png -------------------------------------------------------------------------------- /music_app_swiftui/Assets.xcassets/s_menu.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "s_menu.png", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /music_app_swiftui/Assets.xcassets/s_menu.imageset/s_menu.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforany/music_app_swiftui/2c33724b2a2914225fd261e6eaa9386676b6c74c/music_app_swiftui/Assets.xcassets/s_menu.imageset/s_menu.png -------------------------------------------------------------------------------- /music_app_swiftui/Assets.xcassets/s_other.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "s_other.png", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /music_app_swiftui/Assets.xcassets/s_other.imageset/s_other.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforany/music_app_swiftui/2c33724b2a2914225fd261e6eaa9386676b6c74c/music_app_swiftui/Assets.xcassets/s_other.imageset/s_other.png -------------------------------------------------------------------------------- /music_app_swiftui/Assets.xcassets/search.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "search.png", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | }, 12 | "properties" : { 13 | "template-rendering-intent" : "template" 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /music_app_swiftui/Assets.xcassets/search.imageset/search.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforany/music_app_swiftui/2c33724b2a2914225fd261e6eaa9386676b6c74c/music_app_swiftui/Assets.xcassets/search.imageset/search.png -------------------------------------------------------------------------------- /music_app_swiftui/Assets.xcassets/setting_tab.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "setting_tab.png", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /music_app_swiftui/Assets.xcassets/setting_tab.imageset/setting_tab.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforany/music_app_swiftui/2c33724b2a2914225fd261e6eaa9386676b6c74c/music_app_swiftui/Assets.xcassets/setting_tab.imageset/setting_tab.png -------------------------------------------------------------------------------- /music_app_swiftui/Assets.xcassets/setting_tab_un.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "setting_tab_un.png", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /music_app_swiftui/Assets.xcassets/setting_tab_un.imageset/setting_tab_un.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforany/music_app_swiftui/2c33724b2a2914225fd261e6eaa9386676b6c74c/music_app_swiftui/Assets.xcassets/setting_tab_un.imageset/setting_tab_un.png -------------------------------------------------------------------------------- /music_app_swiftui/Assets.xcassets/share.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "share.png", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /music_app_swiftui/Assets.xcassets/share.imageset/share.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforany/music_app_swiftui/2c33724b2a2914225fd261e6eaa9386676b6c74c/music_app_swiftui/Assets.xcassets/share.imageset/share.png -------------------------------------------------------------------------------- /music_app_swiftui/Assets.xcassets/shuffle.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "shuffle.png", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /music_app_swiftui/Assets.xcassets/shuffle.imageset/shuffle.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforany/music_app_swiftui/2c33724b2a2914225fd261e6eaa9386676b6c74c/music_app_swiftui/Assets.xcassets/shuffle.imageset/shuffle.png -------------------------------------------------------------------------------- /music_app_swiftui/Assets.xcassets/songs_tab.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "songs_tab.png", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /music_app_swiftui/Assets.xcassets/songs_tab.imageset/songs_tab.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforany/music_app_swiftui/2c33724b2a2914225fd261e6eaa9386676b6c74c/music_app_swiftui/Assets.xcassets/songs_tab.imageset/songs_tab.png -------------------------------------------------------------------------------- /music_app_swiftui/Assets.xcassets/songs_tab_un.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "songs_tab_un.png", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /music_app_swiftui/Assets.xcassets/songs_tab_un.imageset/songs_tab_un.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforany/music_app_swiftui/2c33724b2a2914225fd261e6eaa9386676b6c74c/music_app_swiftui/Assets.xcassets/songs_tab_un.imageset/songs_tab_un.png -------------------------------------------------------------------------------- /music_app_swiftui/Fonts/CircularStd-Black.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforany/music_app_swiftui/2c33724b2a2914225fd261e6eaa9386676b6c74c/music_app_swiftui/Fonts/CircularStd-Black.otf -------------------------------------------------------------------------------- /music_app_swiftui/Fonts/CircularStd-Bold.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforany/music_app_swiftui/2c33724b2a2914225fd261e6eaa9386676b6c74c/music_app_swiftui/Fonts/CircularStd-Bold.otf -------------------------------------------------------------------------------- /music_app_swiftui/Fonts/CircularStd-Book.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforany/music_app_swiftui/2c33724b2a2914225fd261e6eaa9386676b6c74c/music_app_swiftui/Fonts/CircularStd-Book.otf -------------------------------------------------------------------------------- /music_app_swiftui/Fonts/CircularStd-Medium.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforany/music_app_swiftui/2c33724b2a2914225fd261e6eaa9386676b6c74c/music_app_swiftui/Fonts/CircularStd-Medium.otf -------------------------------------------------------------------------------- /music_app_swiftui/Launch Screen.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | -------------------------------------------------------------------------------- /music_app_swiftui/Preview Content/Preview Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /music_app_swiftui/UICommon/AlbumCell.swift: -------------------------------------------------------------------------------- 1 | // 2 | // AlbumCell.swift 3 | // music_app_swiftui 4 | // 5 | // Created by CodeForAny on 25/08/23. 6 | // 7 | 8 | import SwiftUI 9 | 10 | struct AlbumCell: View { 11 | var sObj: NSDictionary = [ 12 | "image": "alb_1", 13 | "name": "History", 14 | "artists": "Michael Jackson", 15 | "songs": "10 Songs" 16 | ] 17 | 18 | var body: some View { 19 | VStack { 20 | Image(sObj.value(forKey: "image") as? String ?? "") 21 | .resizable() 22 | .scaledToFill() 23 | .aspectRatio( CGSize(width: 1, height: 1) , contentMode: .fit) 24 | .frame(width: .infinity, height: .infinity) 25 | 26 | 27 | VStack(spacing: 4){ 28 | 29 | HStack{ 30 | Text(sObj.value(forKey: "name") as? String ?? "") 31 | .font(.customfont(.medium, fontSize: 14)) 32 | .foregroundColor(.primaryText) 33 | .frame(minWidth: 0, maxWidth: .infinity, alignment: .leading) 34 | 35 | Menu { 36 | Button { 37 | 38 | } label: { 39 | Text("Play") 40 | .foregroundColor(.primaryText) 41 | } 42 | 43 | Button { 44 | 45 | } label: { 46 | Text("Play next") 47 | .foregroundColor(.primaryText) 48 | } 49 | 50 | Button { 51 | 52 | } label: { 53 | Text("Add to playlist queue") 54 | .foregroundColor(.primaryText) 55 | } 56 | 57 | 58 | Button { 59 | 60 | } label: { 61 | Text("Add to playlist") 62 | .foregroundColor(.primaryText) 63 | } 64 | 65 | 66 | Button { 67 | 68 | } label: { 69 | Text("Rename") 70 | .foregroundColor(.primaryText) 71 | } 72 | 73 | 74 | Button { 75 | 76 | } label: { 77 | Text("Tag Editor") 78 | .foregroundColor(.primaryText) 79 | } 80 | 81 | 82 | Button { 83 | 84 | } label: { 85 | Text("Go to artist") 86 | .foregroundColor(.primaryText) 87 | } 88 | 89 | Button { 90 | 91 | } label: { 92 | Text("Delete form device") 93 | .foregroundColor(.primaryText) 94 | } 95 | 96 | Button { 97 | 98 | } label: { 99 | Text("Share") 100 | .foregroundColor(.primaryText) 101 | } 102 | 103 | 104 | } label: { 105 | Image("more_btn") 106 | .resizable() 107 | .scaledToFit() 108 | .frame(width: 12, height: 12) 109 | } 110 | .environment(\.colorScheme, .dark) 111 | 112 | } 113 | 114 | HStack{ 115 | Text(sObj.value(forKey: "artists") as? String ?? "") 116 | .font(.customfont(.regular, fontSize: 11)) 117 | .foregroundColor(Color.primaryText28) 118 | .frame(minWidth: 0, maxWidth: .infinity, alignment: .leading) 119 | 120 | Text("•") 121 | .font(.customfont(.regular, fontSize: 11)) 122 | .foregroundColor(Color.primaryText28) 123 | 124 | Text(sObj.value(forKey: "songs") as? String ?? "") 125 | .font(.customfont(.regular, fontSize: 11)) 126 | .foregroundColor(Color.primaryText28) 127 | } 128 | } 129 | .frame(minWidth: 0, maxWidth: .infinity, alignment: .leading) 130 | 131 | 132 | } 133 | } 134 | } 135 | 136 | struct AlbumCell_Previews: PreviewProvider { 137 | static var previews: some View { 138 | AlbumCell() 139 | 140 | .background(Color.bg) 141 | .frame(width: 200) 142 | } 143 | } 144 | -------------------------------------------------------------------------------- /music_app_swiftui/UICommon/AlbumSongRow.swift: -------------------------------------------------------------------------------- 1 | // 2 | // AlbumSongRow.swift 3 | // music_app_swiftui 4 | // 5 | // Created by CodeForAny on 27/08/23. 6 | // 7 | 8 | import SwiftUI 9 | 10 | struct AlbumSongRow: View { 11 | 12 | @State var sObj: NSDictionary = [:] 13 | var isPlay: Bool = false 14 | 15 | var body: some View { 16 | VStack { 17 | 18 | HStack(spacing: 15) { 19 | 20 | Button { 21 | 22 | } label: { 23 | Image( "play_btn") 24 | .resizable() 25 | .scaledToFit() 26 | .frame(width: 25, height: 25) 27 | } 28 | 29 | Text(sObj.value(forKey: "name") as? String ?? "") 30 | .font(.customfont(.medium, fontSize: 14)) 31 | .foregroundColor(.primaryText60) 32 | .frame(maxWidth: .infinity, alignment: .leading) 33 | 34 | Text(sObj.value(forKey: "duration") as? String ?? "") 35 | .font(.customfont(.medium, fontSize: 14)) 36 | .foregroundColor(.primaryText60) 37 | 38 | 39 | if(isPlay) { 40 | Image("play_eq") 41 | .resizable() 42 | .scaledToFit() 43 | .frame(width: 80, height: 40, alignment: .center) 44 | }else{ 45 | Button { 46 | 47 | } label: { 48 | Image( "more") 49 | .resizable() 50 | .scaledToFit() 51 | .frame(width: 25, height: 25) 52 | } 53 | .frame(width: 80, height: 40, alignment: .trailing) 54 | } 55 | 56 | 57 | } 58 | 59 | Divider() 60 | .padding(.leading, 50) 61 | 62 | } 63 | .frame(height: 44) 64 | } 65 | } 66 | 67 | struct AlbumSongRow_Previews: PreviewProvider { 68 | static var previews: some View { 69 | AlbumSongRow(sObj: ["duration": "3:56", "name": "Billie Jean", "artists": "Michael Jackson"]) 70 | .padding(.horizontal, 20) 71 | .background(Color.bg) 72 | 73 | } 74 | } 75 | -------------------------------------------------------------------------------- /music_app_swiftui/UICommon/AllSongRow.swift: -------------------------------------------------------------------------------- 1 | // 2 | // AllSongRow.swift 3 | // music_app_swiftui 4 | // 5 | // Created by CodeForAny on 24/08/23. 6 | // 7 | 8 | import SwiftUI 9 | 10 | struct AllSongRow: View { 11 | 12 | var sObj: NSDictionary = [ 13 | "name":"Title", 14 | "artist":"Artist Name", 15 | "image":"s1" 16 | ] 17 | var didTap: (()->())? 18 | var didTapPlay: (()->())? 19 | 20 | 21 | var body: some View { 22 | VStack { 23 | 24 | HStack(spacing: 15) { 25 | ZStack(alignment: .center) { 26 | Image( sObj.value(forKey: "image") as? String ?? "") 27 | .resizable() 28 | .scaledToFill() 29 | .overlay( 30 | RoundedRectangle(cornerRadius: 25) 31 | .stroke(Color.primaryText28, lineWidth: 1) 32 | ) 33 | .frame(width: 50, height: 50) 34 | .cornerRadius(25) 35 | 36 | Rectangle() 37 | .fill(Color.bg) 38 | .frame(width: 15, height: 15) 39 | .cornerRadius(7.5) 40 | 41 | } 42 | 43 | VStack { 44 | Text(sObj.value(forKey: "name") as? String ?? "") 45 | .font(.customfont(.medium, fontSize: 14)) 46 | .foregroundColor(.primaryText.opacity(0.9)) 47 | .frame(maxWidth: .infinity, alignment: .leading) 48 | 49 | Text(sObj.value(forKey: "artist") as? String ?? "") 50 | .font(.customfont(.regular, fontSize: 10)) 51 | .foregroundColor(.primaryText28) 52 | .frame(maxWidth: .infinity, alignment: .leading) 53 | } 54 | 55 | 56 | Button { 57 | didTapPlay?() 58 | } label: { 59 | Image( "play_btn") 60 | .resizable() 61 | .scaledToFit() 62 | .frame(width: 25, height: 25) 63 | } 64 | 65 | } 66 | 67 | Divider() 68 | .padding(.leading, 50) 69 | 70 | } 71 | } 72 | } 73 | 74 | struct AllSongRow_Previews: PreviewProvider { 75 | static var previews: some View { 76 | AllSongRow() 77 | .padding(20) 78 | .background( Color.bg) 79 | } 80 | } 81 | -------------------------------------------------------------------------------- /music_app_swiftui/UICommon/ArtistAlbumCell.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ArtistAlbumCell.swift 3 | // music_app_swiftui 4 | // 5 | // Created by CodeForAny on 27/08/23. 6 | // 7 | 8 | import SwiftUI 9 | 10 | struct ArtistAlbumCell: View { 11 | @State var sObj: NSDictionary = [:] 12 | 13 | var body: some View { 14 | VStack { 15 | Image(sObj.value(forKey: "image") as? String ?? "") 16 | .resizable() 17 | .scaledToFill() 18 | .frame(width: 90, height: 80) 19 | .padding(.bottom, 4) 20 | .clipped() 21 | 22 | Text(sObj.value(forKey: "name") as? String ?? "") 23 | .font(.customfont(.bold, fontSize: 13)) 24 | .foregroundColor(.primaryText60) 25 | .frame(minWidth: 0, maxWidth: .infinity, alignment: .leading) 26 | Text(sObj.value(forKey: "year") as? String ?? "") 27 | .font(.customfont(.bold, fontSize: 10)) 28 | .foregroundColor(Color.secondaryText) 29 | .frame(minWidth: 0, maxWidth: .infinity, alignment: .leading) 30 | } 31 | .frame(width: 90) 32 | } 33 | } 34 | 35 | struct ArtistAlbumCell_Previews: PreviewProvider { 36 | static var previews: some View { 37 | ArtistAlbumCell(sObj: [ 38 | "image":"ar_d_1", 39 | "name":"Fire Dragon", 40 | "year":"2019", 41 | ]) 42 | .padding(80) 43 | .background(Color.bg) 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /music_app_swiftui/UICommon/ArtistCell.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ArtistCell.swift 3 | // music_app_swiftui 4 | // 5 | // Created by CodeForAny on 25/08/23. 6 | // 7 | 8 | import SwiftUI 9 | 10 | struct ArtistCell: View { 11 | 12 | var aObj: NSDictionary = [ 13 | "image": "ar_1", 14 | "name": "Beyonce", 15 | "albums": "4 albums", 16 | "songs": "38 Songs" 17 | ] 18 | 19 | var body: some View { 20 | HStack(alignment: .top, spacing: 15) { 21 | Image(aObj.value(forKey: "image") as? String ?? "") 22 | .resizable() 23 | .scaledToFill() 24 | .overlay( RoundedRectangle(cornerRadius: 1) 25 | .stroke( Color.primaryText28, lineWidth: 1 )) 26 | .frame(width: 80, height: 80) 27 | 28 | 29 | VStack{ 30 | 31 | Text(aObj.value(forKey: "name") as? String ?? "") 32 | .font(.customfont(.bold, fontSize: 15)) 33 | .foregroundColor(.primaryText) 34 | .frame(minWidth: 0, maxWidth: .infinity, alignment: .leading) 35 | 36 | Text("\(aObj.value(forKey: "albums") as? String ?? "" ) • \(aObj.value(forKey: "songs") as? String ?? "")") 37 | .font(.customfont(.regular, fontSize: 11)) 38 | .foregroundColor(Color.primaryText80) 39 | .frame(minWidth: 0, maxWidth: .infinity, alignment: .leading) 40 | 41 | } 42 | .frame(minWidth: 0, maxWidth: .infinity, alignment: .leading) 43 | 44 | 45 | Menu { 46 | Button { 47 | 48 | } label: { 49 | Text("Play") 50 | .foregroundColor(.primaryText) 51 | } 52 | 53 | Button { 54 | 55 | } label: { 56 | Text("Play next") 57 | .foregroundColor(.primaryText) 58 | } 59 | 60 | Button { 61 | 62 | } label: { 63 | Text("Add to playlist queue") 64 | .foregroundColor(.primaryText) 65 | } 66 | 67 | 68 | Button { 69 | 70 | } label: { 71 | Text("Add to playlist") 72 | .foregroundColor(.primaryText) 73 | } 74 | 75 | 76 | Button { 77 | 78 | } label: { 79 | Text("Rename") 80 | .foregroundColor(.primaryText) 81 | } 82 | 83 | 84 | Button { 85 | 86 | } label: { 87 | Text("Tag Editor") 88 | .foregroundColor(.primaryText) 89 | } 90 | 91 | 92 | Button { 93 | 94 | } label: { 95 | Text("Go to artist") 96 | .foregroundColor(.primaryText) 97 | } 98 | 99 | Button { 100 | 101 | } label: { 102 | Text("Delete form device") 103 | .foregroundColor(.primaryText) 104 | } 105 | 106 | Button { 107 | 108 | } label: { 109 | Text("Share") 110 | .foregroundColor(.primaryText) 111 | } 112 | 113 | 114 | } label: { 115 | Image("more_btn") 116 | .resizable() 117 | .scaledToFit() 118 | .frame(width: 20, height: 20) 119 | } 120 | .environment(\.colorScheme, .dark) 121 | 122 | } 123 | } 124 | } 125 | 126 | struct ArtistCell_Previews: PreviewProvider { 127 | static var previews: some View { 128 | ArtistCell() 129 | .padding(20) 130 | .background(Color.bg) 131 | } 132 | } 133 | -------------------------------------------------------------------------------- /music_app_swiftui/UICommon/GenreCell.swift: -------------------------------------------------------------------------------- 1 | // 2 | // GenreCell.swift 3 | // music_app_swiftui 4 | // 5 | // Created by CodeForAny on 25/08/23. 6 | // 7 | 8 | import SwiftUI 9 | 10 | struct GenreCell: View { 11 | var pObj: NSDictionary = [:] 12 | var body: some View { 13 | ZStack(alignment: .center) { 14 | Image(pObj.value(forKey: "image") as? String ?? "" ) 15 | .resizable() 16 | .scaledToFill() 17 | 18 | Rectangle() 19 | .fill( Color.black.opacity(0.87) ) 20 | 21 | VStack{ 22 | Text(pObj.value(forKey: "name") as? String ?? "" ) 23 | .font(.customfont(.bold, fontSize: 15)) 24 | .foregroundColor(.primaryText) 25 | 26 | Text(pObj.value(forKey: "songs") as? String ?? "" ) 27 | .font(.customfont(.regular, fontSize: 10)) 28 | .foregroundColor(.primaryText80) 29 | } 30 | .padding(8) 31 | 32 | } 33 | .frame(width: ( .screenWidth - 55 ) / 2, height: ( .screenWidth - 55 ) / 2 * 0.75 ) 34 | } 35 | } 36 | 37 | struct GenreCell_Previews: PreviewProvider { 38 | static var previews: some View { 39 | GenreCell(pObj: [ 40 | "image": "gen_1", 41 | "name": "Classical", 42 | "songs": "56 Songs" 43 | ]) 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /music_app_swiftui/UICommon/IconTextRow.swift: -------------------------------------------------------------------------------- 1 | // 2 | // IconTextRow.swift 3 | // music_app_swiftui 4 | // 5 | // Created by CodeForAny on 22/08/23. 6 | // 7 | 8 | import SwiftUI 9 | 10 | struct IconTextRow: View { 11 | var title: String = "Title" 12 | var icon: String = "m_theme" 13 | var body: some View { 14 | VStack{ 15 | HStack { 16 | Image(icon) 17 | .resizable() 18 | .scaledToFit() 19 | .frame(width: 25 , height: 25) 20 | 21 | Text(title) 22 | .font(.customfont(.medium, fontSize: 14)) 23 | .foregroundColor( Color.primaryText.opacity(0.9) ) 24 | .frame(minWidth: 0, maxWidth: .infinity, alignment 25 | : .leading) 26 | } 27 | .frame(height: 40) 28 | 29 | Divider() 30 | .padding(.leading, 40) 31 | } 32 | } 33 | } 34 | 35 | struct IconTextRow_Previews: PreviewProvider { 36 | static var previews: some View { 37 | IconTextRow() 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /music_app_swiftui/UICommon/MyPlaylistCell.swift: -------------------------------------------------------------------------------- 1 | // 2 | // MyPlaylistCell.swift 3 | // music_app_swiftui 4 | // 5 | // Created by CodeForAny on 25/08/23. 6 | // 7 | 8 | import SwiftUI 9 | 10 | struct MyPlaylistCell: View { 11 | 12 | var sObj: NSDictionary = [ 13 | "image": "mp_1", 14 | "name": "Queens Collection" 15 | ] 16 | 17 | var body: some View { 18 | VStack { 19 | Image(sObj.value(forKey: "image") as? String ?? "") 20 | .resizable() 21 | .scaledToFill() 22 | .frame(width: 90, height: 80) 23 | .overlay( RoundedRectangle(cornerRadius: 5) 24 | .stroke(Color.primaryText28, lineWidth: 1) 25 | ) 26 | .padding(.bottom, 4) 27 | 28 | Text(sObj.value(forKey: "name") as? String ?? "") 29 | .font(.customfont(.medium, fontSize: 12)) 30 | .lineLimit(1) 31 | .foregroundColor(.primaryText60) 32 | .frame(minWidth: 0, maxWidth: .infinity, alignment: .leading) 33 | 34 | } 35 | .frame(width: 90) 36 | } 37 | } 38 | 39 | struct MyPlaylistCell_Previews: PreviewProvider { 40 | static var previews: some View { 41 | MyPlaylistCell() 42 | .padding(30) 43 | .background(Color.bg) 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /music_app_swiftui/UICommon/PlayerBottomButton.swift: -------------------------------------------------------------------------------- 1 | // 2 | // PlayerBottomButton.swift 3 | // music_app_swiftui 4 | // 5 | // Created by CodeForAny on 28/08/23. 6 | // 7 | 8 | import SwiftUI 9 | 10 | struct PlayerBottomButton: View { 11 | var title: String = "Playlist" 12 | var icon: String = "playlist" 13 | var body: some View { 14 | VStack { 15 | Image(icon) 16 | .resizable() 17 | .scaledToFit() 18 | .frame(width: 30, height: 30) 19 | .foregroundColor(.primaryText) 20 | 21 | Text(title) 22 | .font(.customfont(.regular, fontSize: 10)) 23 | .foregroundColor(.secondaryText) 24 | 25 | } 26 | } 27 | } 28 | 29 | struct PlayerBottomButton_Previews: PreviewProvider { 30 | static var previews: some View { 31 | PlayerBottomButton() 32 | .padding(20) 33 | .background(Color.bg) 34 | 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /music_app_swiftui/UICommon/PlaylistSongCell.swift: -------------------------------------------------------------------------------- 1 | // 2 | // PlaylistSongCell.swift 3 | // music_app_swiftui 4 | // 5 | // Created by CodeForAny on 25/08/23. 6 | // 7 | 8 | import SwiftUI 9 | 10 | struct PlaylistSongCell: View { 11 | 12 | var sObj: NSDictionary = ["image":"playlist_1", "name":"My Top Tracks","songs":"100 Songs"] 13 | 14 | var body: some View { 15 | ZStack(alignment: .bottomLeading) { 16 | Image(sObj.value(forKey: "image") as? String ?? "") 17 | .resizable() 18 | .scaledToFill() 19 | .frame(width: .infinity, height: .infinity) 20 | 21 | Rectangle() 22 | .fill( Color.black.opacity(0.45) ) 23 | 24 | HStack{ 25 | VStack{ 26 | Text(sObj.value(forKey: "name") as? String ?? "") 27 | .font(.customfont(.medium, fontSize: 14)) 28 | .foregroundColor(.primaryText) 29 | .frame(minWidth: 0, maxWidth: .infinity, alignment: .leading) 30 | 31 | Text(sObj.value(forKey: "songs") as? String ?? "") 32 | .font(.customfont(.regular, fontSize: 10)) 33 | .foregroundColor(Color.primaryText28) 34 | .frame(minWidth: 0, maxWidth: .infinity, alignment: .leading) 35 | } 36 | .frame(minWidth: 0, maxWidth: .infinity, alignment: .leading) 37 | 38 | Button { 39 | 40 | } label: { 41 | Image("play") 42 | .resizable() 43 | .scaledToFit() 44 | .frame(width: 22, height: 22) 45 | } 46 | 47 | 48 | } 49 | .padding(15) 50 | 51 | 52 | } 53 | .aspectRatio(CGSize(width: 200, height: 140), contentMode: .fit) 54 | } 55 | 56 | } 57 | 58 | struct PlaylistSongCell_Previews: PreviewProvider { 59 | static var previews: some View { 60 | PlaylistSongCell() 61 | .frame(width: 200) 62 | } 63 | } 64 | -------------------------------------------------------------------------------- /music_app_swiftui/UICommon/ProgressSliderView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ProgressSliderView.swift 3 | // music_app_swiftui 4 | // 5 | // Created by CodeForAny on 03/09/23. 6 | // 7 | 8 | import SwiftUI 9 | 10 | struct ProgressSliderView: UIViewRepresentable { 11 | @Binding var value: Double 12 | @Binding var maximumValue: Double 13 | @Binding var isUserInteractionEnabled: Bool 14 | @Binding var playableProgress: Double 15 | var updateValueHandler: (Double) -> Void 16 | 17 | @State private var touching = false 18 | 19 | init(value: Binding, 20 | maximumValue: Binding, 21 | isUserInteractionEnabled: Binding, 22 | playableProgress: Binding, 23 | updateValueHandler: @escaping (Double) -> Void) { 24 | self._value = value 25 | self._maximumValue = maximumValue 26 | self._isUserInteractionEnabled = isUserInteractionEnabled 27 | self._playableProgress = playableProgress 28 | self.updateValueHandler = updateValueHandler 29 | } 30 | 31 | func makeCoordinator() -> Coordinator { 32 | Coordinator(self) 33 | } 34 | 35 | func makeUIView(context: Context) -> UIProgressSlider { 36 | let slider = UIProgressSlider() 37 | slider.addTarget( 38 | context.coordinator, 39 | action: #selector(Coordinator.updateValue(sender:)), 40 | for: .valueChanged) 41 | 42 | slider.addTarget( 43 | context.coordinator, 44 | action: #selector(Coordinator.startTouch(sender:)), 45 | for: .touchDown) 46 | 47 | slider.addTarget( 48 | context.coordinator, 49 | action: #selector(Coordinator.endTouch(sender:)), 50 | for: .touchUpInside) 51 | 52 | return slider 53 | } 54 | 55 | func updateUIView(_ uiView: UIProgressSlider, context: Context) { 56 | if !touching { 57 | uiView.value = Float(value) 58 | } 59 | uiView.maximumValue = Float(maximumValue) 60 | uiView.isUserInteractionEnabled = isUserInteractionEnabled 61 | uiView.playableProgress = Float(playableProgress) 62 | uiView.setNeedsDisplay() 63 | } 64 | 65 | class Coordinator: NSObject { 66 | var view: ProgressSliderView 67 | 68 | init(_ view: ProgressSliderView) { 69 | self.view = view 70 | } 71 | 72 | @objc 73 | func updateValue(sender: UIProgressSlider) { 74 | view.updateValueHandler(Double(sender.value)) 75 | } 76 | 77 | @objc 78 | func startTouch(sender: UIProgressSlider) { 79 | view.touching = true 80 | } 81 | 82 | @objc 83 | func endTouch(sender: UIProgressSlider) { 84 | view.touching = false 85 | } 86 | } 87 | } 88 | 89 | struct ProgressSliderView_Previews: PreviewProvider { 90 | @State static var value = Double(50.0) 91 | @State static var maximumValue = Double(50.0) 92 | @State static var isUserInteractionEnabled = true 93 | @State static var playableProgress = Double(70.0) 94 | 95 | static var previews: some View { 96 | ProgressSliderView(value: $value, 97 | maximumValue: $maximumValue, 98 | isUserInteractionEnabled: $isUserInteractionEnabled, 99 | playableProgress: $playableProgress) { 100 | print("value changed: \($0)") 101 | } 102 | } 103 | } 104 | -------------------------------------------------------------------------------- /music_app_swiftui/UICommon/ScrollTabButton.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ScrollTabButton.swift 3 | // music_app_swiftui 4 | // 5 | // Created by CodeForAny on 24/08/23. 6 | // 7 | 8 | import SwiftUI 9 | 10 | struct ScrollTabButton: View { 11 | 12 | var title: String = "Title" 13 | var width: Double = 70 14 | var isSelect: Bool = true 15 | var didTap: (()->())? 16 | 17 | var body: some View { 18 | Button { 19 | didTap?() 20 | } label: { 21 | Text(title) 22 | .font(.customfont(.medium, fontSize: 15)) 23 | .foregroundColor(isSelect ? .focus : .primaryText28 ) 24 | 25 | } 26 | .frame(width: width) 27 | 28 | } 29 | } 30 | 31 | struct ScrollTabButton_Previews: PreviewProvider { 32 | static var previews: some View { 33 | ScrollTabButton() 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /music_app_swiftui/UICommon/SettingRow.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SettingRow.swift 3 | // music_app_swiftui 4 | // 5 | // Created by CodeForAny on 29/08/23. 6 | // 7 | 8 | import SwiftUI 9 | 10 | struct SettingRow: View { 11 | 12 | var title: String = "Title" 13 | var icon: String = "s_display" 14 | 15 | 16 | var body: some View { 17 | VStack{ 18 | 19 | HStack(spacing: 15) { 20 | Image(icon) 21 | .resizable() 22 | .scaledToFit() 23 | .frame(width: 25, height: 25) 24 | 25 | Text(title) 26 | .font(.customfont(.medium, fontSize: 14)) 27 | .foregroundColor( .primaryText.opacity(0.9) ) 28 | .frame(maxWidth: .infinity, alignment: .leading ) 29 | } 30 | 31 | Divider() 32 | .padding(.leading, 40) 33 | } 34 | .frame(height: 44) 35 | } 36 | } 37 | 38 | struct SettingRow_Previews: PreviewProvider { 39 | static var previews: some View { 40 | SettingRow() 41 | .padding(20) 42 | .background( Color.bg ) 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /music_app_swiftui/UICommon/TabButton.swift: -------------------------------------------------------------------------------- 1 | // 2 | // TabButton.swift 3 | // music_app_swiftui 4 | // 5 | // Created by CodeForAny on 21/08/23. 6 | // 7 | 8 | import SwiftUI 9 | 10 | struct TabButton: View { 11 | @State var title: String = "Home" 12 | @State var icon: String = "home_tab" 13 | @State var iconUnfocus: String = "home_tab_un" 14 | var isSelect: Bool = false 15 | var didTap: (()->())? 16 | 17 | var body: some View { 18 | Button { 19 | didTap?() 20 | } label: { 21 | VStack { 22 | Image( isSelect ? icon : iconUnfocus) 23 | .resizable() 24 | .scaledToFit() 25 | .frame(width: 20, height: 20) 26 | 27 | Text(title) 28 | .font(.customfont(.regular, fontSize: 12)) 29 | .foregroundColor(isSelect ? .focus : .unfocused ) 30 | } 31 | 32 | } 33 | } 34 | } 35 | 36 | struct TabButton_Previews: PreviewProvider { 37 | static var previews: some View { 38 | TabButton() 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /music_app_swiftui/UICommon/UIExtension.swift: -------------------------------------------------------------------------------- 1 | // 2 | // UIExtension.swift 3 | // music_app_swiftui 4 | // 5 | // Created by CodeForAny on 21/08/23. 6 | // 7 | 8 | import SwiftUI 9 | 10 | enum CircularStd: String { 11 | case regular = "CircularStd-Book" 12 | case medium = "CircularStd-Medium" 13 | case bold = "CircularStd-Bold" 14 | case black = "CircularStd-Black" 15 | } 16 | 17 | extension Font { 18 | static func customfont(_ font: CircularStd, fontSize: CGFloat) -> Font { 19 | custom(font.rawValue, size: fontSize) 20 | } 21 | } 22 | 23 | extension CGFloat { 24 | static var screenWidth: Double { 25 | return UIScreen.main.bounds.size.width 26 | } 27 | static var screenHeight: Double { 28 | return UIScreen.main.bounds.size.height 29 | } 30 | 31 | static func widthPer(per: Double) -> Double { 32 | return screenWidth * per; 33 | //375 * 0.5 34 | } 35 | 36 | static func heightPer(per: Double) -> Double { 37 | return screenHeight * per; 38 | //375 * 0.5 39 | } 40 | 41 | static var topInsets: Double { 42 | if let keyWindow = UIApplication.shared.keyWindow { 43 | return keyWindow.safeAreaInsets.top 44 | } 45 | return 0.0 46 | } 47 | 48 | static var bottomInsets: Double { 49 | if let keyWindow = UIApplication.shared.keyWindow { 50 | return keyWindow.safeAreaInsets.bottom 51 | } 52 | return 0.0 53 | } 54 | 55 | static var horizontalInsets: Double { 56 | if let keyWindow = UIApplication.shared.keyWindow { 57 | return keyWindow.safeAreaInsets.left + keyWindow.safeAreaInsets.right 58 | } 59 | return 0.0 60 | } 61 | 62 | static var verticalInsets: Double { 63 | if let keyWindow = UIApplication.shared.keyWindow { 64 | return keyWindow.safeAreaInsets.top + keyWindow.safeAreaInsets.bottom 65 | } 66 | return 0.0 67 | } 68 | } 69 | 70 | 71 | extension Color { 72 | 73 | static var primaryApp: Color { 74 | return Color(hex: "C35BD1") 75 | } 76 | 77 | static var focus: Color { 78 | return Color(hex: "D9519D") 79 | } 80 | 81 | static var unfocused: Color { 82 | return Color(hex: "63666E") 83 | } 84 | 85 | static var focusStart: Color { 86 | return Color(hex: "ED8770") 87 | } 88 | static var secondaryStart: Color { 89 | return primaryApp 90 | } 91 | static var secondaryEnd: Color { 92 | return Color(hex: "657DDF") 93 | } 94 | static var org: Color { 95 | return Color(hex: "E1914B") 96 | } 97 | 98 | static var primaryText: Color { 99 | return Color.white 100 | } 101 | 102 | static var primaryText80: Color { 103 | return Color.white.opacity(0.8) 104 | } 105 | static var primaryText60: Color { 106 | return Color.white.opacity(0.6) 107 | } 108 | static var primaryText35: Color { 109 | return Color.white.opacity(0.35) 110 | } 111 | static var primaryText28: Color { 112 | return Color.white.opacity(0.28) 113 | } 114 | 115 | static var primaryText10: Color { 116 | return Color.white.opacity(0.1) 117 | } 118 | 119 | static var secondaryText: Color { 120 | return Color(hex: "585A66") 121 | } 122 | 123 | static var primaryG: [Color] { 124 | return [focusStart, focus] 125 | } 126 | 127 | static var secondaryG: [Color] { 128 | return [secondaryStart, secondaryEnd] 129 | } 130 | static var bg: Color { 131 | return Color(hex: "181B2C") 132 | } 133 | 134 | static var darkGray: Color { 135 | return Color(hex: "383B49") 136 | } 137 | static var lightGray: Color { 138 | return Color(hex: "D0D1D4") 139 | } 140 | 141 | init(hex: String) { 142 | let hex = hex.trimmingCharacters(in: .alphanumerics.inverted) 143 | var int: UInt64 = 0 144 | Scanner(string: hex).scanHexInt64(&int) 145 | let a, r, g, b: UInt64 146 | switch hex.count { 147 | case 3: // RGB(12 -bit) 148 | (a, r, g, b) = (255, (int >> 8) * 17, (int >> 4 & 0xF) * 17, (int & 0xF) * 17) 149 | case 6: // RGB (24-bit) 150 | (a, r, g, b) = (255, int >> 16, int >> 8 & 0xFF, int & 0xFF) 151 | case 8: // ARGB (32-bit) 152 | (a, r, g, b) = (int >> 24, int >> 16 & 0xFF, int >> 8 & 0xFF, int & 0xFF) 153 | default: 154 | (a, r, g, b) = (1, 1, 1, 0) 155 | } 156 | 157 | self.init( 158 | .sRGB, 159 | red: Double(r) / 255, 160 | green: Double(g) / 255, 161 | blue: Double(b) / 255, 162 | opacity: Double(a) / 255 163 | ) 164 | } 165 | } 166 | 167 | extension View { 168 | func cornerRadius(_ radius: CGFloat, corner: UIRectCorner) -> some View { 169 | clipShape(RoundedCorner(radius: radius, corner: corner)) 170 | } 171 | 172 | } 173 | 174 | extension Color { 175 | 176 | func uiColor() -> UIColor { 177 | 178 | if #available(iOS 14.0, *) { 179 | return UIColor(self) 180 | } 181 | 182 | let components = self.components() 183 | return UIColor(red: components.r, green: components.g, blue: components.b, alpha: components.a) 184 | } 185 | 186 | private func components() -> (r: CGFloat, g: CGFloat, b: CGFloat, a: CGFloat) { 187 | 188 | let scanner = Scanner(string: self.description.trimmingCharacters(in: CharacterSet.alphanumerics.inverted)) 189 | var hexNumber: UInt64 = 0 190 | var r: CGFloat = 0.0, g: CGFloat = 0.0, b: CGFloat = 0.0, a: CGFloat = 0.0 191 | 192 | let result = scanner.scanHexInt64(&hexNumber) 193 | if result { 194 | r = CGFloat((hexNumber & 0xff000000) >> 24) / 255 195 | g = CGFloat((hexNumber & 0x00ff0000) >> 16) / 255 196 | b = CGFloat((hexNumber & 0x0000ff00) >> 8) / 255 197 | a = CGFloat(hexNumber & 0x000000ff) / 255 198 | } 199 | return (r, g, b, a) 200 | } 201 | } 202 | 203 | struct RoundedCorner: Shape { 204 | var radius: CGFloat = .infinity 205 | var corner: UIRectCorner = .allCorners 206 | 207 | func path(in rect: CGRect) -> Path { 208 | let path = UIBezierPath(roundedRect: rect, byRoundingCorners: corner, cornerRadii: CGSize(width: radius, height: radius)) 209 | return Path(path.cgPath) 210 | } 211 | } 212 | -------------------------------------------------------------------------------- /music_app_swiftui/UICommon/UIProgressSlider.swift: -------------------------------------------------------------------------------- 1 | // 2 | // UIProgressSlider.swift 3 | // music_app_swiftui 4 | // 5 | // Created by CodeForAny on 03/09/23. 6 | // 7 | import UIKit 8 | import SwiftUI 9 | 10 | class UIProgressSlider: UISlider { 11 | var playableProgress: Float = 0 12 | 13 | override init(frame: CGRect) { 14 | super.init(frame: frame) 15 | } 16 | 17 | required init?(coder aDecoder: NSCoder) { 18 | super.init(coder: aDecoder) 19 | } 20 | 21 | override func draw(_ rect: CGRect) { 22 | super.draw(rect) 23 | maximumTrackTintColor = .clear 24 | 25 | self.tintColor = Color.focus.uiColor() 26 | 27 | let c = UIGraphicsGetCurrentContext() 28 | let r = trackRect(forBounds: bounds) 29 | let path = UIBezierPath(roundedRect: r, cornerRadius: r.size.height / 2.0) 30 | c?.addPath(path.cgPath) 31 | c?.setLineWidth(0.1) 32 | 33 | UIColor.black.setStroke() 34 | c?.strokePath() 35 | 36 | c?.addPath(path.cgPath) 37 | c?.clip() 38 | 39 | UIColor.lightGray.setFill() 40 | c?.fill(CGRect(x: r.origin.x, 41 | y: r.origin.y, 42 | width: r.size.width, 43 | height: r.size.height)) 44 | 45 | UIColor.white.setFill() 46 | c?.fill(CGRect(x: r.origin.x, 47 | y: r.origin.y, 48 | width: r.size.width * CGFloat(playableProgress), 49 | height: r.size.height)) 50 | } 51 | } 52 | -------------------------------------------------------------------------------- /music_app_swiftui/UICommon/ViewAllSection.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ViewAllSection.swift 3 | // music_app_swiftui 4 | // 5 | // Created by CodeForAny on 22/08/23. 6 | // 7 | 8 | import SwiftUI 9 | 10 | struct ViewAllSection: View { 11 | 12 | @State var title: String = "Title" 13 | @State var button: String = "View All" 14 | var didTap: (()->())? 15 | 16 | var body: some View { 17 | HStack{ 18 | Text(title) 19 | .font(.customfont(.medium, fontSize: 15)) 20 | .foregroundColor(.primaryText80) 21 | .frame(minWidth: 0, maxWidth: .infinity, alignment: .leading) 22 | 23 | 24 | Button { 25 | didTap?() 26 | } label: { 27 | Text(button) 28 | .font(.customfont(.regular, fontSize: 11)) 29 | .foregroundColor(Color.org) 30 | } 31 | 32 | 33 | 34 | } 35 | } 36 | } 37 | 38 | struct ViewAllSection_Previews: PreviewProvider { 39 | static var previews: some View { 40 | ViewAllSection() 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /music_app_swiftui/View/Home/HomeView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // HomeView.swift 3 | // music_app_swiftui 4 | // 5 | // Created by CodeForAny on 22/08/23. 6 | // 7 | 8 | import SwiftUI 9 | 10 | struct HomeView: View { 11 | 12 | @StateObject var mainVM = MainViewModel.share 13 | 14 | @State var txtSearch: String = "" 15 | @State var hostRecommendedArr = [ 16 | [ 17 | "image": "img_1", 18 | "name": "Sound of Sky", 19 | "artists": "Dilon Bruce" 20 | ], 21 | [ 22 | "image": "img_2", 23 | "name": "Girl on Fire", 24 | "artists": "Alecia Keys" 25 | ] 26 | ] 27 | 28 | @State var playlistArr = [ 29 | [ 30 | "image": "img_3", 31 | "name": "Classic Playlist", 32 | "artists": "Piano Guys" 33 | ], 34 | [ 35 | "image": "img_4", 36 | "name": "Summer Playlist", 37 | "artists": "Dilon Bruce" 38 | ], 39 | [ 40 | "image": "img_5", 41 | "name": "Pop Music", 42 | "artists": "Michael Jackson" 43 | ] 44 | ] 45 | 46 | var recentlyPlayedArr: NSArray = [ 47 | [ 48 | "rate": 4, 49 | "name": "Billie Jean", 50 | "artists": "Michael Jackson" 51 | ], 52 | [ 53 | "rate": 4, 54 | "name": "Earth Song", 55 | "artists": "Michael Jackson" 56 | ], 57 | [ 58 | "rate": 4, 59 | "name": "Mirror", 60 | "artists": "Justin Timberlake" 61 | ], 62 | [ 63 | "rate": 4, 64 | "name": "Remember the Time", 65 | "artists": "Michael Jackson" 66 | ] 67 | ] 68 | 69 | var body: some View { 70 | ZStack{ 71 | 72 | ScrollView { 73 | VStack { 74 | Text("Hot Recommended") 75 | .font(.customfont(.medium, fontSize: 15)) 76 | .foregroundColor(.primaryText80) 77 | .padding(.top, .topInsets + 56) 78 | .padding(.horizontal, 20) 79 | .frame(minWidth: 0, maxWidth: .infinity, alignment: .leading) 80 | 81 | ScrollView(.horizontal, showsIndicators: false) { 82 | LazyHStack(spacing: 15) { 83 | ForEach( hostRecommendedArr.indices, id: \.self) { index in 84 | 85 | var sObj = hostRecommendedArr[index] 86 | 87 | VStack { 88 | Image(sObj["image"] ?? "") 89 | .resizable() 90 | .scaledToFill() 91 | .frame(width: 230, height: 125) 92 | .padding(.bottom, 4) 93 | 94 | Text(sObj["name"] ?? "") 95 | .font(.customfont(.bold, fontSize: 13)) 96 | .foregroundColor(.primaryText60) 97 | .frame(minWidth: 0, maxWidth: .infinity, alignment: .leading) 98 | Text(sObj["artists"] ?? "") 99 | .font(.customfont(.bold, fontSize: 10)) 100 | .foregroundColor(Color.secondaryText) 101 | .frame(minWidth: 0, maxWidth: .infinity, alignment: .leading) 102 | } 103 | 104 | } 105 | 106 | } 107 | .padding(.horizontal, 20) 108 | } 109 | 110 | 111 | } 112 | 113 | ViewAllSection(title: "Playlists") { 114 | 115 | } 116 | .padding(.horizontal, 20) 117 | .padding(.vertical, 8) 118 | 119 | ScrollView(.horizontal, showsIndicators: false) { 120 | LazyHStack(spacing: 15) { 121 | ForEach( playlistArr.indices, id: \.self) { index in 122 | 123 | var sObj = playlistArr[index] 124 | 125 | VStack { 126 | Image(sObj["image"] ?? "") 127 | .resizable() 128 | .scaledToFill() 129 | .frame(width: 110, height: 110) 130 | .padding(.bottom, 4) 131 | 132 | Text(sObj["name"] ?? "") 133 | .font(.customfont(.bold, fontSize: 13)) 134 | .foregroundColor(.primaryText60) 135 | .frame(minWidth: 0, maxWidth: .infinity, alignment: .leading) 136 | Text(sObj["artists"] ?? "") 137 | .font(.customfont(.bold, fontSize: 10)) 138 | .foregroundColor(Color.secondaryText) 139 | .frame(minWidth: 0, maxWidth: .infinity, alignment: .leading) 140 | } 141 | 142 | } 143 | 144 | } 145 | .padding(.horizontal, 20) 146 | } 147 | 148 | ViewAllSection(title: "Recently Played") { 149 | 150 | } 151 | .padding(.horizontal, 20) 152 | .padding(.vertical, 8) 153 | 154 | LazyVStack(spacing: 10) { 155 | ForEach( 0.. 12 | @State var seekbarVal: Double = 0.5 13 | 14 | 15 | 16 | var body: some View { 17 | ZStack{ 18 | VStack{ 19 | HStack{ 20 | Button { 21 | self.mode.wrappedValue.dismiss() 22 | } label: { 23 | Image("close") 24 | .resizable() 25 | .scaledToFit() 26 | .frame(width: 25, height: 25) 27 | } 28 | 29 | Text("Driver Mode") 30 | .font(.customfont(.bold, fontSize: 18)) 31 | .foregroundColor(.primaryText80) 32 | .frame(maxWidth: .infinity, alignment: .center) 33 | 34 | Button { 35 | 36 | } label: { 37 | Image("playlist") 38 | .resizable() 39 | .scaledToFit() 40 | .frame(width: 25, height: 25) 41 | } 42 | 43 | } 44 | .padding(.top, .topInsets) 45 | .padding(.horizontal,20) 46 | 47 | ScrollView{ 48 | 49 | ZStack { 50 | Image("player_image") 51 | .resizable() 52 | .scaledToFit() 53 | .frame(width: .widthPer(per: 0.4), height: .widthPer(per: 0.4)) 54 | .cornerRadius(.widthPer(per: 0.2)) 55 | .clipped() 56 | } 57 | .padding(.bottom,45) 58 | 59 | 60 | 61 | 62 | Text("Black or White") 63 | .font(.customfont(.medium, fontSize: 18)) 64 | .foregroundColor(.primaryText.opacity(0.9)) 65 | .padding(.bottom, 4) 66 | 67 | Text("Michael Jackson • Album - Dangerous") 68 | .font(.customfont(.regular, fontSize: 14)) 69 | .foregroundColor(.primaryText60) 70 | .padding(.bottom, 15) 71 | 72 | Text("237 | 335") 73 | .font(.customfont(.regular, fontSize: 14)) 74 | .foregroundColor(.primaryText60) 75 | .padding(.bottom, 40) 76 | 77 | VStack { 78 | Slider(value: $seekbarVal ) 79 | .accentColor(Color.focus) 80 | 81 | HStack{ 82 | Text("3:24") 83 | .font(.customfont(.regular, fontSize: 14)) 84 | .foregroundColor(.primaryText80) 85 | .padding(.bottom, 40) 86 | 87 | Spacer() 88 | 89 | Text("5:24") 90 | .font(.customfont(.regular, fontSize: 14)) 91 | .foregroundColor(.primaryText80) 92 | .padding(.bottom, 40) 93 | } 94 | } 95 | .padding(20) 96 | 97 | HStack(spacing: 25) { 98 | Button { 99 | 100 | } label: { 101 | Image("previous_song") 102 | .resizable() 103 | .scaledToFit() 104 | .frame(width: 50, height: 50) 105 | } 106 | 107 | Spacer() 108 | 109 | Button { 110 | 111 | } label: { 112 | Image("play") 113 | .resizable() 114 | .scaledToFit() 115 | .frame(width: 80, height: 80) 116 | } 117 | 118 | Spacer() 119 | 120 | Button { 121 | 122 | } label: { 123 | Image("next_song") 124 | .resizable() 125 | .scaledToFit() 126 | .frame(width: 50, height: 50) 127 | } 128 | 129 | } 130 | .padding(.horizontal, 25) 131 | 132 | 133 | 134 | } 135 | 136 | } 137 | 138 | } 139 | .navigationTitle("") 140 | .navigationBarHidden(true) 141 | .navigationBarBackButtonHidden() 142 | .background(Color.bg) 143 | .ignoresSafeArea() 144 | } 145 | } 146 | 147 | struct DriverModeView_Previews: PreviewProvider { 148 | static var previews: some View { 149 | DriverModeView() 150 | } 151 | } 152 | -------------------------------------------------------------------------------- /music_app_swiftui/View/Player/MainPlayerView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // MainPlayerView.swift 3 | // music_app_swiftui 4 | // 5 | // Created by CodeForAny on 28/08/23. 6 | // 7 | 8 | import SwiftUI 9 | import CircularSlider 10 | import SDWebImageSwiftUI 11 | 12 | struct MainPlayerView: View { 13 | @Environment(\.presentationMode) var mode: Binding 14 | @State var seekbarVal: Double = 0.5 15 | 16 | @StateObject var model = AudioPlayerViewModel.shared 17 | 18 | 19 | 20 | var body: some View { 21 | ZStack{ 22 | VStack{ 23 | HStack{ 24 | Button { 25 | self.mode.wrappedValue.dismiss() 26 | } label: { 27 | Image("back") 28 | .resizable() 29 | .scaledToFit() 30 | .frame(width: 25, height: 25) 31 | } 32 | 33 | Text("Now Playing") 34 | .font(.customfont(.bold, fontSize: 18)) 35 | .foregroundColor(.primaryText80) 36 | .frame(maxWidth: .infinity, alignment: .center) 37 | 38 | Menu { 39 | Button { 40 | 41 | } label: { 42 | Text("Social Share") 43 | .foregroundColor(.primaryText) 44 | } 45 | 46 | Button { 47 | 48 | } label: { 49 | Text("Playing Queue") 50 | .foregroundColor(.primaryText) 51 | } 52 | 53 | Button { 54 | 55 | } label: { 56 | Text("Add to playlist ...") 57 | .foregroundColor(.primaryText) 58 | } 59 | 60 | 61 | Button { 62 | 63 | } label: { 64 | Text("Lyrics") 65 | .foregroundColor(.primaryText) 66 | } 67 | 68 | 69 | Button { 70 | 71 | } label: { 72 | Text("Volume") 73 | .foregroundColor(.primaryText) 74 | } 75 | 76 | 77 | Button { 78 | 79 | } label: { 80 | Text("Details") 81 | .foregroundColor(.primaryText) 82 | } 83 | 84 | 85 | Button { 86 | 87 | } label: { 88 | Text("Sleep Timer") 89 | .foregroundColor(.primaryText) 90 | } 91 | 92 | NavigationLink { 93 | DriverModeView() 94 | } label: { 95 | Text("Driver Mode") 96 | .foregroundColor(.primaryText) 97 | } 98 | 99 | } label: { 100 | Image("more_btn") 101 | .resizable() 102 | .scaledToFit() 103 | .frame(width: 25, height: 25) 104 | } 105 | .environment(\.colorScheme, .dark) 106 | 107 | } 108 | .padding(.top, .topInsets) 109 | .padding(.horizontal,20) 110 | 111 | ScrollView{ 112 | 113 | ZStack { 114 | 115 | let _ = print(model.artwork) 116 | 117 | WebImage( url: URL(string: model.artwork)) 118 | .resizable() 119 | .indicator(.activity) 120 | .transition(.fade(duration: 0.5)) 121 | .scaledToFit() 122 | .frame(width: .widthPer(per: 0.6), height: .widthPer(per: 0.6)) 123 | .cornerRadius(.widthPer(per: 0.3)) 124 | .clipped() 125 | 126 | CircularSlider(currentValue: $model.sliderValue, 127 | minValue: 0.0, 128 | maxValue: model.sliderMaximumValue, 129 | knobRadius: 10, knobColor: Color.focusStart, 130 | radius: Double( CGFloat.widthPer(per: 0.3)), 131 | progressLineColor: Color.focusStart, 132 | textColor: .clear, 133 | currentValueSuffix: "") 134 | .padding(20) 135 | } 136 | .padding(.bottom, 4) 137 | 138 | ProgressSliderView(value: $model.sliderValue, 139 | maximumValue: $model.sliderMaximumValue, 140 | isUserInteractionEnabled: $model.sliderIsUserInteractionEnabled, 141 | playableProgress: $model.sliderPlayableProgress) { 142 | model.sliderValueChanged.send($0) 143 | } 144 | .padding(.horizontal) 145 | 146 | 147 | Text("\(model.duration) | -\(model.restDuration)") 148 | .font(.customfont(.regular, fontSize: 14)) 149 | .foregroundColor(.secondaryText) 150 | .padding(.bottom, 15) 151 | 152 | Text(model.title) 153 | .font(.customfont(.medium, fontSize: 18)) 154 | .foregroundColor(.primaryText.opacity(0.9)) 155 | .padding(.bottom, 4) 156 | 157 | Text("\( model.artist )") 158 | .font(.customfont(.regular, fontSize: 14)) 159 | .foregroundColor(.secondaryText) 160 | .padding(.bottom, 15) 161 | 162 | Image("eq_display") 163 | .resizable() 164 | .scaledToFit() 165 | .frame(width: 280, height: 70) 166 | 167 | Divider() 168 | .padding(20) 169 | 170 | HStack(spacing: 25) { 171 | Button { 172 | model.playPrevious() 173 | } label: { 174 | Image("previous_song") 175 | .resizable() 176 | .scaledToFit() 177 | .frame(width: 45, height: 45) 178 | } 179 | .disabled(!model.canPlayPrevious) 180 | 181 | Button { 182 | model.canPlay ? model.play() : model.pause() 183 | } label: { 184 | Image( model.canPlay ? "play" : "pause" ) 185 | .resizable() 186 | .scaledToFit() 187 | .frame(width: 60, height: 60) 188 | } 189 | 190 | Button { 191 | model.playNext() 192 | } label: { 193 | Image("next_song") 194 | .resizable() 195 | .scaledToFit() 196 | .frame(width: 45, height: 45) 197 | } 198 | .disabled(!model.canPlayNext) 199 | 200 | } 201 | 202 | HStack(spacing: 25) { 203 | NavigationLink { 204 | PlayPlaylistView() 205 | } label: { 206 | PlayerBottomButton(title: "Playlist", icon: "playlist") 207 | } 208 | 209 | Button { 210 | model.shuffle() 211 | } label: { 212 | PlayerBottomButton(title: "Shuffle", icon: "shuffle") 213 | } 214 | 215 | Button { 216 | model.doRepeat() 217 | } label: { 218 | PlayerBottomButton(title: "Repeat", icon: "repeat") 219 | } 220 | 221 | Button { 222 | 223 | } label: { 224 | PlayerBottomButton(title: "EQ", icon: "eq") 225 | } 226 | 227 | Button { 228 | 229 | } label: { 230 | PlayerBottomButton(title: "Favourites", icon: "favTemp") 231 | } 232 | } 233 | .padding(20) 234 | } 235 | 236 | } 237 | 238 | } 239 | .navigationTitle("") 240 | .navigationBarHidden(true) 241 | .navigationBarBackButtonHidden() 242 | .background(Color.bg) 243 | .ignoresSafeArea() 244 | } 245 | } 246 | 247 | struct MainPlayerView_Previews: PreviewProvider { 248 | static var previews: some View { 249 | NavigationView { 250 | MainPlayerView() 251 | } 252 | 253 | } 254 | } 255 | -------------------------------------------------------------------------------- /music_app_swiftui/View/Player/PlayPlaylistView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // PlayPlaylistView.swift 3 | // music_app_swiftui 4 | // 5 | // Created by CodeForAny on 28/08/23. 6 | // 7 | 8 | import SwiftUI 9 | import CircularSlider 10 | 11 | struct PlayPlaylistView: View { 12 | @Environment(\.presentationMode) var mode: Binding 13 | @State var seekbarVal: Double = 0.5 14 | 15 | @State var allArr: NSArray = [ 16 | [ 17 | 18 | "image": "s1", 19 | "name": "Billie Jean", 20 | "artist": "Michael Jackson" 21 | ], 22 | [ 23 | "image": "s2", 24 | "name": "Be the girl", 25 | "artist": "Bebe Rexa" 26 | ], 27 | [ 28 | "image": "s3", 29 | "name": "Countryman", 30 | "artist": "Daughtry" 31 | ], 32 | [ 33 | "image": "s4", 34 | "name": "Do you feel lonelyness", 35 | "artist": "Marc Anthony" 36 | ], 37 | [ 38 | "image": "s5", 39 | "name": "Earth song", 40 | "artist": "Michael Jackson" 41 | ], 42 | [ 43 | "image": "s6", 44 | "name": "Smooth criminal", 45 | "artist": "Michael Jackson" 46 | ], 47 | [ 48 | "image": "s7", 49 | "name": "The way you make me feel", 50 | "artist": "Michael Jackson" 51 | ], 52 | 53 | [ 54 | "image": "s9", 55 | "name": "Somebody that I used to know", 56 | "artist": "Gotye" 57 | ], 58 | [ 59 | "image": "s10", 60 | "name": "Wild Thoughts", 61 | "artist": "Michael Jackson" 62 | ] 63 | ] 64 | 65 | 66 | 67 | var body: some View { 68 | ZStack{ 69 | VStack{ 70 | HStack{ 71 | Button { 72 | self.mode.wrappedValue.dismiss() 73 | } label: { 74 | Image("back") 75 | .resizable() 76 | .scaledToFit() 77 | .frame(width: 25, height: 25) 78 | } 79 | 80 | Text("Playlist") 81 | .font(.customfont(.bold, fontSize: 18)) 82 | .foregroundColor(.primaryText80) 83 | .frame(maxWidth: .infinity, alignment: .center) 84 | 85 | Menu { 86 | Button { 87 | 88 | } label: { 89 | Text("Social Share") 90 | .foregroundColor(.primaryText) 91 | } 92 | 93 | Button { 94 | 95 | } label: { 96 | Text("Playing Queue") 97 | .foregroundColor(.primaryText) 98 | } 99 | 100 | Button { 101 | 102 | } label: { 103 | Text("Add to playlist ...") 104 | .foregroundColor(.primaryText) 105 | } 106 | 107 | 108 | Button { 109 | 110 | } label: { 111 | Text("Lyrics") 112 | .foregroundColor(.primaryText) 113 | } 114 | 115 | 116 | Button { 117 | 118 | } label: { 119 | Text("Volume") 120 | .foregroundColor(.primaryText) 121 | } 122 | 123 | 124 | Button { 125 | 126 | } label: { 127 | Text("Details") 128 | .foregroundColor(.primaryText) 129 | } 130 | 131 | 132 | Button { 133 | 134 | } label: { 135 | Text("Sleep Timer") 136 | .foregroundColor(.primaryText) 137 | } 138 | } label: { 139 | Image("more_btn") 140 | .resizable() 141 | .scaledToFit() 142 | .frame(width: 25, height: 25) 143 | } 144 | .environment(\.colorScheme, .dark) 145 | 146 | } 147 | .padding(.top, .topInsets) 148 | .padding(.horizontal,20) 149 | 150 | ScrollView{ 151 | 152 | HStack(spacing: 25) { 153 | Button { 154 | 155 | } label: { 156 | Image("previous_song") 157 | .resizable() 158 | .scaledToFit() 159 | .frame(width: 40, height: 40) 160 | } 161 | 162 | Spacer() 163 | 164 | ZStack { 165 | Image("player_image") 166 | .resizable() 167 | .scaledToFit() 168 | .frame(width: .widthPer(per: 0.4), height: .widthPer(per: 0.4)) 169 | .cornerRadius(.widthPer(per: 0.2)) 170 | .clipped() 171 | 172 | CircularSlider(currentValue: $seekbarVal, 173 | minValue: 0.0, 174 | maxValue: 1.0, 175 | knobRadius: 10, knobColor: Color.focusStart, 176 | radius: Double( CGFloat.widthPer(per: 0.2)), 177 | progressLineColor: Color.focusStart, 178 | textColor: .clear, 179 | currentValueSuffix: "") 180 | .frame(width: .widthPer(per: 0.45), height: .widthPer(per: 0.45)) 181 | } 182 | 183 | Spacer() 184 | 185 | Button { 186 | 187 | } label: { 188 | Image("next_song") 189 | .resizable() 190 | .scaledToFit() 191 | .frame(width: 40, height: 40) 192 | } 193 | 194 | } 195 | .padding(.horizontal, 20) 196 | .padding(.bottom, 4) 197 | 198 | 199 | Text("3:15 | 4.26") 200 | .font(.customfont(.regular, fontSize: 14)) 201 | .foregroundColor(.secondaryText) 202 | .padding(.bottom, 15) 203 | 204 | Text("Black or White") 205 | .font(.customfont(.medium, fontSize: 18)) 206 | .foregroundColor(.primaryText.opacity(0.9)) 207 | .padding(.bottom, 4) 208 | 209 | Text("Michael Jackson • Album - Dangerous") 210 | .font(.customfont(.regular, fontSize: 14)) 211 | .foregroundColor(.primaryText60) 212 | .padding(.bottom, 15) 213 | 214 | 215 | 216 | 217 | 218 | LazyVStack(spacing: 10) { 219 | ForEach( 0.. 13 | 14 | @State var allArr: NSArray = [ 15 | ["duration": "3:56", "name": "Billie Jean", "artists": "Michael Jackson"], 16 | ["duration": "3:56", "name": "Earth Song", "artists": "Michael Jackson"], 17 | ["duration": "3:56", "name": "Mirror", "artists": "Justin Timberlake"], 18 | ["duration": "3:56", "name": "Remember the Time","artists": "Michael Jackson" 19 | ], 20 | ["duration": "3:56", "name": "Billie Jean", "artists": "Michael Jackson"], 21 | ["duration": "3:56", "name": "Earth Song", "artists": "Michael Jackson"], 22 | ["duration": "3:56", "name": "Mirror", "artists": "Justin Timberlake"], 23 | ["duration": "3:56", "name": "Remember the Time","artists": "Michael Jackson" 24 | ], 25 | ["duration": "3:56", "name": "Billie Jean", "artists": "Michael Jackson"], 26 | ["duration": "3:56", "name": "Earth Song", "artists": "Michael Jackson"], 27 | ["duration": "3:56", "name": "Mirror", "artists": "Justin Timberlake"], 28 | ["duration": "3:56", "name": "Remember the Time","artists": "Michael Jackson" 29 | ] 30 | ] 31 | 32 | 33 | var body: some View { 34 | ZStack{ 35 | VStack{ 36 | HStack{ 37 | Button { 38 | self.mode.wrappedValue.dismiss() 39 | } label: { 40 | Image("back") 41 | .resizable() 42 | .scaledToFit() 43 | .frame(width: 25, height: 25) 44 | } 45 | 46 | Text("Album Details") 47 | .font(.customfont(.bold, fontSize: 18)) 48 | .foregroundColor(.primaryText80) 49 | .frame(maxWidth: .infinity, alignment: .center) 50 | 51 | Button { 52 | self.mode.wrappedValue.dismiss() 53 | } label: { 54 | Image("search") 55 | .resizable() 56 | .scaledToFit() 57 | .frame(width: 25, height: 25) 58 | .foregroundColor(.primaryText28) 59 | } 60 | 61 | } 62 | .padding(.top, .topInsets) 63 | .padding(.horizontal,20) 64 | 65 | ScrollView{ 66 | 67 | ZStack{ 68 | Image("alb_1") 69 | .resizable() 70 | .scaledToFill() 71 | .frame(width: .screenWidth - 40, height: .screenWidth * 0.5) 72 | .blur(radius: 5) 73 | .clipped() 74 | 75 | Rectangle() 76 | .fill( Color.black.opacity(0.54) ) 77 | 78 | VStack(){ 79 | HStack(alignment: .top,spacing: 15){ 80 | Image("alb_1") 81 | .resizable() 82 | .scaledToFill() 83 | .frame(width: 100, height: 100) 84 | .clipped() 85 | 86 | VStack(spacing: 8){ 87 | Text("History") 88 | .font(.customfont(.bold, fontSize: 18)) 89 | .foregroundColor(.primaryText.opacity(0.9)) 90 | .frame(maxWidth: .infinity, alignment: .leading) 91 | 92 | Text("by Michal Jackson") 93 | .font(.customfont(.bold, fontSize: 12)) 94 | .foregroundColor(.primaryText.opacity(0.74)) 95 | .frame(maxWidth: .infinity, alignment: .leading) 96 | 97 | Text("1996 . 18 Songs . 64 min") 98 | .font(.customfont(.bold, fontSize: 12)) 99 | .foregroundColor(.primaryText.opacity(0.74)) 100 | .frame(maxWidth: .infinity, alignment: .leading) 101 | } 102 | } 103 | 104 | HStack{ 105 | Button { 106 | 107 | } label: { 108 | Image("play_n") 109 | .resizable() 110 | .scaledToFit() 111 | .frame(width:12, height: 12) 112 | 113 | Text("Play") 114 | .font(.customfont(.medium, fontSize: 8)) 115 | .foregroundColor(.primaryText.opacity(0.74)) 116 | } 117 | .padding(8) 118 | .padding(.horizontal, 8) 119 | .background( 120 | LinearGradient(colors: Color.primaryG, startPoint: .top, endPoint: .bottom) 121 | ) 122 | .cornerRadius(15) 123 | 124 | Spacer() 125 | 126 | Button { 127 | 128 | } label: { 129 | Image("share") 130 | .resizable() 131 | .scaledToFit() 132 | .frame(width:12, height: 12) 133 | 134 | Text("Share") 135 | .font(.customfont(.medium, fontSize: 8)) 136 | .foregroundColor(.primaryText.opacity(0.74)) 137 | } 138 | .padding(8) 139 | .padding(.horizontal, 15) 140 | .overlay( 141 | RoundedRectangle(cornerRadius: 15) 142 | .stroke( Color.primaryText, lineWidth: 1 ) 143 | ) 144 | .cornerRadius(8) 145 | 146 | Spacer() 147 | 148 | Button { 149 | 150 | } label: { 151 | Image("favTemp") 152 | .resizable() 153 | .scaledToFit() 154 | .frame(width:12, height: 12) 155 | 156 | Text("Add to Favorites") 157 | .font(.customfont(.medium, fontSize: 8)) 158 | 159 | } 160 | .foregroundColor(.primaryText.opacity(0.74)) 161 | .padding(8) 162 | .padding(.horizontal, 8) 163 | .overlay( 164 | RoundedRectangle(cornerRadius: 15) 165 | .stroke( Color.primaryText, lineWidth: 1 ) 166 | ) 167 | .cornerRadius(15) 168 | 169 | } 170 | } 171 | .padding(20) 172 | } 173 | .frame(width: .screenWidth - 40) 174 | 175 | LazyVStack { 176 | ForEach( 0.. 12 | 13 | @State var albumArr: NSArray = [ 14 | [ 15 | "image":"ar_d_1", 16 | "name":"Fire Dragon", 17 | "year":"2019", 18 | ], 19 | [ 20 | "image": "ar_d_2", 21 | "name": "Sound of Life", 22 | "year": "2018", 23 | ], 24 | [ 25 | "image":"ar_d_3", 26 | "name":"Giving Heart", 27 | "year":"2017", 28 | ], 29 | [ 30 | "image": "ar_d_4", 31 | "name": "Dream of", 32 | "year": "2016", 33 | ] 34 | ] 35 | 36 | @State var allArr: NSArray = [ 37 | ["duration": "3:56", "name": "Billie Jean", "artists": "Michael Jackson"], 38 | ["duration": "3:56", "name": "Earth Song", "artists": "Michael Jackson"], 39 | ["duration": "3:56", "name": "Mirror", "artists": "Justin Timberlake"], 40 | ["duration": "3:56", "name": "Remember the Time","artists": "Michael Jackson" 41 | ], 42 | ["duration": "3:56", "name": "Billie Jean", "artists": "Michael Jackson"], 43 | ["duration": "3:56", "name": "Earth Song", "artists": "Michael Jackson"], 44 | ["duration": "3:56", "name": "Mirror", "artists": "Justin Timberlake"], 45 | ["duration": "3:56", "name": "Remember the Time","artists": "Michael Jackson" 46 | ], 47 | ["duration": "3:56", "name": "Billie Jean", "artists": "Michael Jackson"], 48 | ["duration": "3:56", "name": "Earth Song", "artists": "Michael Jackson"], 49 | ["duration": "3:56", "name": "Mirror", "artists": "Justin Timberlake"], 50 | ["duration": "3:56", "name": "Remember the Time","artists": "Michael Jackson" 51 | ] 52 | ] 53 | 54 | 55 | var body: some View { 56 | ZStack{ 57 | VStack{ 58 | HStack{ 59 | Button { 60 | self.mode.wrappedValue.dismiss() 61 | } label: { 62 | Image("back") 63 | .resizable() 64 | .scaledToFit() 65 | .frame(width: 25, height: 25) 66 | } 67 | 68 | Text("Artist Details") 69 | .font(.customfont(.bold, fontSize: 18)) 70 | .foregroundColor(.primaryText80) 71 | .frame(maxWidth: .infinity, alignment: .center) 72 | 73 | Button { 74 | self.mode.wrappedValue.dismiss() 75 | } label: { 76 | Image("search") 77 | .resizable() 78 | .scaledToFit() 79 | .frame(width: 25, height: 25) 80 | .foregroundColor(.primaryText28) 81 | } 82 | 83 | } 84 | .padding(.top, .topInsets) 85 | .padding(.horizontal,20) 86 | 87 | ScrollView{ 88 | 89 | ZStack{ 90 | Image("artitst_detail_top") 91 | .resizable() 92 | .scaledToFill() 93 | .frame(width: .screenWidth - 40, height: .screenWidth * 0.5) 94 | .blur(radius: 5) 95 | .clipped() 96 | 97 | Rectangle() 98 | .fill( Color.black.opacity(0.54) ) 99 | 100 | VStack(){ 101 | 102 | 103 | VStack(spacing: 15){ 104 | Text("Dilon Bruce") 105 | .font(.customfont(.bold, fontSize: 18)) 106 | .foregroundColor(.primaryText.opacity(0.9)) 107 | .frame(maxWidth: .infinity, alignment: .center) 108 | 109 | Text("Pop rock, Funk pop, Heavy Metal") 110 | .font(.customfont(.bold, fontSize: 12)) 111 | .foregroundColor(.primaryText.opacity(0.74)) 112 | .frame(maxWidth: .infinity, alignment: .center) 113 | 114 | } 115 | .padding(.bottom, 25) 116 | 117 | 118 | HStack{ 119 | Spacer() 120 | 121 | VStack { 122 | Text("4,357") 123 | .font(.customfont(.bold, fontSize: 18)) 124 | .foregroundColor(.primaryText.opacity(0.9)) 125 | 126 | Text("Followers") 127 | .font(.customfont(.bold, fontSize: 10)) 128 | .foregroundColor(.primaryText60) 129 | } 130 | 131 | Spacer() 132 | VStack { 133 | Text("128,980") 134 | .font(.customfont(.bold, fontSize: 18)) 135 | .foregroundColor(.primaryText.opacity(0.9)) 136 | 137 | Text("Lintners") 138 | .font(.customfont(.bold, fontSize: 10)) 139 | .foregroundColor(.primaryText60) 140 | } 141 | 142 | Spacer() 143 | 144 | Button { 145 | 146 | } label: { 147 | 148 | 149 | Text("Follow") 150 | .font(.customfont(.medium, fontSize: 8)) 151 | .foregroundColor(.primaryText.opacity(0.74)) 152 | } 153 | .padding(8) 154 | .padding(.horizontal, 8) 155 | .background( 156 | LinearGradient(colors: Color.primaryG, startPoint: .top, endPoint: .bottom) 157 | ) 158 | .cornerRadius(15) 159 | } 160 | } 161 | .padding(20) 162 | } 163 | .frame(width: .screenWidth - 40) 164 | 165 | ViewAllSection(title: "Top Albums") { 166 | 167 | } 168 | .padding(20) 169 | 170 | ScrollView(.horizontal, showsIndicators: false) { 171 | LazyHStack(spacing: 15) { 172 | ForEach( 0..