MoeNav

Lightweight navigation library tailored for seamless screen transitions using URL-based navigation, nested graphs, and dynamic parameters, optimized for modern web applications.

Wasm
GitHub stars1
Open issues0
LicenseMIT License
Creation dateabout 1 year ago

Last activity8 months ago
Latest release1.1.2 (about 1 year ago)

🛠️ MoeNav - A Navigation Library for Compose Web (WASM) and JVM (Desktop)

MoeNav is a lightweight, flexible, and powerful navigation library designed exclusively for Jetpack Compose for Web (WASM). Inspired by Android's Navigation Component, it provides NavHost, NavController, and nested navigation graphs, solving issues related to URLs, browser history, and deep linking.

🚀 Optimized for Kotlin Multiplatform (WASM) and JVM not for Android.


📦 Installation

Using Maven Central (Recommended)

  1. Ensure you have Maven Central in settings.gradle.kts
dependencyResolutionManagement {
    repositories {
        mavenCentral() // ✅ Required for MoeNav
    }
}
  1. Add the dependency to your build.gradle.kts
dependencies {
    implementation("com.blank.moenav:MoeNav:<version>")
}

🚀 Features

Jetpack Compose Web (WASM) Navigation → Seamlessly navigate between screens.
URL-Based Navigation → Uses the browser's address bar for real URLs.
Nested Navigation Graphs → Organize routes into logical groups.
Browser History SupportBack/Forward buttons work as expected.
Deep Linking → Load specific pages directly via URL.
Dynamic Parameters → Pass values via URL (/user/{id}).
OnDestinationChanged Listener → Get notified when navigation changes.

📌 ⚠️ This library is WASM and JVM Desktop, it does not work for Android.


🔧 How to Use

Step 1: Setup NavController

Define a NavController and specify your routes and start destination, pass the navController as needed:

@OptIn(ExperimentalComposeUiApi::class)
fun main() {

    val navController = MoeNavController.createWithBrowserHistory(
        routes = SampleRoutes.routes,
        startDestination = SampleRoutes.Home
    )

    val body: HTMLElement = document.body ?: return

    ComposeViewport(body) {
        App(navController)
    }
}

or for JVM Desktop

fun main() = application {
    val navController = MoeNavController.createWithHistory(
        routes = SampleRoutes.routes,
        startDestination = SampleRoutes.Home
    )

    Window(
        onCloseRequest = ::exitApplication,
        title = "MoeNav Sample"
    ) {
        App(navController)
    }
}

Step 2: Setup NavHost

Define a NavHost and specify your start destination:

@Composable
fun App(navController: MoeNavController<SampleRoutes>) {
    NavHost(navController = navController) {
        composable("/") { HomeScreen(navController) }
        composable("/about") { AboutScreen(navController) }
    }
}

Step 3: Navigate Between Screens

Use navController.navigate(route) to switch between pages:

@Composable
fun HomeScreen(navController: MoeNavController<SampleRoutes>) {
    Column {
        Text("🏠 Home Screen")
        Button(onClick = { navController.navigate(SampleRoutes.Profile) }) {
            Text("Go to Profile")
        }
    }
}

Step 4: Dynamic Parameters

Routes can include path parameters:

NavHost(navController = navController) {
    composable("/user/{userId}") { params ->
        val userId = params["userId"] ?: "Unknown"
        UserScreen(navController, userId)
    }
}

📌 Navigating with Parameters:

navController.navigate("/user/123")

Step 5: Nested Navigation Graphs

Define sub-graphs for better organization:

NavHost(navController = navController) {
    composable("/loading") { LoadingScreen(navController) }

    navigation(route = "/auth", startDestination = "/auth/login") {
        composable("/auth/login") { LoginScreen(navController) }
        composable("/auth/register") { RegisterScreen(navController) }
    }
}

This lets you group related screens (/auth/login, /auth/register).


🌟 Advanced Features

🔄 Listening for Navigation Changes

Use OnDestinationChangedListener to track when the route changes:

navController.setOnDestinationChangedListener { route ->
    println("Navigated to: $route")
}

🔙 Handling Back Navigation

Enable browser back button support:

navController.enableBackNavigation()

📜 License

MoeNav is released under the MIT License.


🤝 Contributing

Contributions are welcome! Feel free to:

  • Report bugs 🐛
  • Request features 🚀
  • Submit pull requests 🎉

🔗 Links


🎉 Enjoy MoeNav!

A modern, flexible, and developer-friendly navigation solution for Compose Web (WASM).


🙌 Credits

Built with ❤️ by Mohamad

Wasm
GitHub stars1
Open issues0
LicenseMIT License
Creation dateabout 1 year ago

Last activity8 months ago
Latest release1.1.2 (about 1 year ago)

🛠️ MoeNav - A Navigation Library for Compose Web (WASM) and JVM (Desktop)

MoeNav is a lightweight, flexible, and powerful navigation library designed exclusively for Jetpack Compose for Web (WASM). Inspired by Android's Navigation Component, it provides NavHost, NavController, and nested navigation graphs, solving issues related to URLs, browser history, and deep linking.

🚀 Optimized for Kotlin Multiplatform (WASM) and JVM not for Android.


📦 Installation

Using Maven Central (Recommended)

  1. Ensure you have Maven Central in settings.gradle.kts
dependencyResolutionManagement {
    repositories {
        mavenCentral() // ✅ Required for MoeNav
    }
}
  1. Add the dependency to your build.gradle.kts
dependencies {
    implementation("com.blank.moenav:MoeNav:<version>")
}

🚀 Features

Jetpack Compose Web (WASM) Navigation → Seamlessly navigate between screens.
URL-Based Navigation → Uses the browser's address bar for real URLs.
Nested Navigation Graphs → Organize routes into logical groups.
Browser History SupportBack/Forward buttons work as expected.
Deep Linking → Load specific pages directly via URL.
Dynamic Parameters → Pass values via URL (/user/{id}).
OnDestinationChanged Listener → Get notified when navigation changes.

📌 ⚠️ This library is WASM and JVM Desktop, it does not work for Android.


🔧 How to Use

Step 1: Setup NavController

Define a NavController and specify your routes and start destination, pass the navController as needed:

@OptIn(ExperimentalComposeUiApi::class)
fun main() {

    val navController = MoeNavController.createWithBrowserHistory(
        routes = SampleRoutes.routes,
        startDestination = SampleRoutes.Home
    )

    val body: HTMLElement = document.body ?: return

    ComposeViewport(body) {
        App(navController)
    }
}

or for JVM Desktop

fun main() = application {
    val navController = MoeNavController.createWithHistory(
        routes = SampleRoutes.routes,
        startDestination = SampleRoutes.Home
    )

    Window(
        onCloseRequest = ::exitApplication,
        title = "MoeNav Sample"
    ) {
        App(navController)
    }
}

Step 2: Setup NavHost

Define a NavHost and specify your start destination:

@Composable
fun App(navController: MoeNavController<SampleRoutes>) {
    NavHost(navController = navController) {
        composable("/") { HomeScreen(navController) }
        composable("/about") { AboutScreen(navController) }
    }
}

Step 3: Navigate Between Screens

Use navController.navigate(route) to switch between pages:

@Composable
fun HomeScreen(navController: MoeNavController<SampleRoutes>) {
    Column {
        Text("🏠 Home Screen")
        Button(onClick = { navController.navigate(SampleRoutes.Profile) }) {
            Text("Go to Profile")
        }
    }
}

Step 4: Dynamic Parameters

Routes can include path parameters:

NavHost(navController = navController) {
    composable("/user/{userId}") { params ->
        val userId = params["userId"] ?: "Unknown"
        UserScreen(navController, userId)
    }
}

📌 Navigating with Parameters:

navController.navigate("/user/123")

Step 5: Nested Navigation Graphs

Define sub-graphs for better organization:

NavHost(navController = navController) {
    composable("/loading") { LoadingScreen(navController) }

    navigation(route = "/auth", startDestination = "/auth/login") {
        composable("/auth/login") { LoginScreen(navController) }
        composable("/auth/register") { RegisterScreen(navController) }
    }
}

This lets you group related screens (/auth/login, /auth/register).


🌟 Advanced Features

🔄 Listening for Navigation Changes

Use OnDestinationChangedListener to track when the route changes:

navController.setOnDestinationChangedListener { route ->
    println("Navigated to: $route")
}

🔙 Handling Back Navigation

Enable browser back button support:

navController.enableBackNavigation()

📜 License

MoeNav is released under the MIT License.


🤝 Contributing

Contributions are welcome! Feel free to:

  • Report bugs 🐛
  • Request features 🚀
  • Submit pull requests 🎉

🔗 Links


🎉 Enjoy MoeNav!

A modern, flexible, and developer-friendly navigation solution for Compose Web (WASM).


🙌 Credits

Built with ❤️ by Mohamad