---
title: "Top Navigation Prototype"
output: rmarkdown::html_vignette
vignette: >
  %\VignetteIndexEntry{Top Navigation Prototype}
  %\VignetteEngine{knitr::rmarkdown}
  %\VignetteEncoding{UTF-8}
---

```{r, include = FALSE}
knitr::opts_chunk$set(
  collapse = TRUE,
  comment  = "#>",
  eval     = FALSE
)
```

```{r setup}
library(bs4Dashkit)
```

`use_dash_topnav()` is a prototype layout helper for `{bs4Dash}` apps that
should feel more like a top-navigation app than a sidebar app.

The app still defines a regular `bs4DashSidebar()` with a `bs4SidebarMenu()`.
bs4Dashkit hides that sidebar, mirrors the menu into the navbar, and delegates
clicks back to the original sidebar links. That keeps native `{bs4Dash}` tab
switching, `input$sidebar`, `updateTabItems()`, and bookmarking behavior intact.

## Recommended setup

Use the core helper when you are already using `dash_titles()`:

```{r}
ttl <- dash_titles(
  brand_text = "Topnav Lab",
  icon = icon("compass"),
  collapsed = "icon-only",
  expanded = "icon-text"
)

body <- bs4DashBody(
  use_bs4Dashkit_core(
    ttl,
    preset = "professional",
    layout = "topnav",
    topnav = dash_topnav_options(
      align = "left",
      gap = 6,
      mobile = "collapse",
      style = "compact",
      title = "auto"
    )
  ),
  bs4TabItems(
    bs4TabItem(tabName = "overview", "Overview"),
    bs4TabItem(tabName = "reports", "Reports")
  )
)
```

`dash_topnav_options()` bundles the top-nav settings in one object. You can
still use the individual `topnav_*` arguments in `use_bs4Dashkit_core()` for
small one-off overrides, but the object form keeps production setup easier to
scan.

`align` controls where the mirrored tabs sit in the navbar:

- `"left"` keeps tabs close to the brand and is usually the safest choice when
  the navbar also has a centered `dash_nav_title()`.
- `"center"` centers the tab group and works best when there is no centered
  title or when there are only a few short tabs.
- `"right"` moves the tab group toward the right controls, useful when the brand
  is visually heavy or the left side needs more space.

`gap` controls the space between top-nav items. Use a small value such
as `4` or `6` for subtle breathing room, or `0` for a compact AdminLTE-style
tab strip.

## Mobile, style, and overflow

By default, mobile top-nav mode uses a hamburger button for tabs:

```{r}
use_bs4Dashkit_core(
  ttl,
  layout = "topnav",
  topnav = dash_topnav_options(mobile = "collapse")
)
```

Use `mobile = "scroll"` if you prefer a single horizontally scrollable
row on small screens. Mobile top-nav modes work best without a centered navbar
title once the viewport starts to tighten; keep `title = "auto"` so bs4Dashkit
hides `dash_nav_title()` early when the tab row needs room, or set
`title = "hide"` for a permanently tab-first navbar.

`topnav_style` controls the tab treatment:

```{r}
use_bs4Dashkit_core(
  ttl,
  layout = "topnav",
  topnav = dash_topnav_options(style = "underline")
)
use_bs4Dashkit_core(
  ttl,
  layout = "topnav",
  topnav = dash_topnav_options(style = "pill")
)
use_bs4Dashkit_core(
  ttl,
  layout = "topnav",
  topnav = dash_topnav_options(style = "compact")
)
```

The underline style uses a small animated indicator that moves when the active
tab changes.

For crowded desktop navbars, move later tabs into a `More` dropdown:

```{r}
use_bs4Dashkit_core(
  ttl,
  layout = "topnav",
  topnav = dash_topnav_options(
    overflow = "more",
    more_after = 4
  )
)
```

`title = "auto"` compacts a centered `dash_nav_title()` when tabs need
room, then hides it if there still is not enough space. Use `"show"`,
`"compact"`, or `"hide"` when you want explicit behavior.

Top-nav clicks also emit a Shiny event:

```{r}
observeEvent(input$bs4dashkit_topnav, {
  str(input$bs4dashkit_topnav)
})
```

If the page body needs a simple title synced from the active tab, enable:

```{r}
use_bs4Dashkit_core(
  ttl,
  layout = "topnav",
  topnav = dash_topnav_options(page_title = "tab")
)
```

You can also call `use_dash_topnav()` directly if you assemble the other
dependencies yourself:

```{r}
bs4DashBody(
  use_bs4Dashkit(),
  ttl$deps,
  use_dash_theme_preset("professional"),
  use_dash_topnav(topbar_h = "56px", align = "left", gap = 6, mobile = "collapse")
)
```

## Dropdown menu items

Sidebar menu items with sub-items are rendered as navbar dropdowns:

```{r}
bs4SidebarMenu(
  id = "sidebar",
  bs4SidebarMenuItem("Overview", tabName = "overview", icon = icon("gauge-high")),
  bs4SidebarMenuItem(
    "Reports",
    icon = icon("chart-line"),
    bs4SidebarMenuSubItem("Monthly", tabName = "monthly"),
    bs4SidebarMenuSubItem("Quality", tabName = "quality")
  )
)
```

## Runnable example

The package ships a prototype app that exercises flat menu items, dropdown
sub-items, navbar utilities, footer styling, theme presets, and server-side tab
updates:

```{r}
shiny::runApp(system.file("examples", "topnav-prototype", package = "bs4Dashkit"))
```

This feature is intentionally conservative: the hidden sidebar remains the
source of truth, and the top-nav layer mirrors it rather than replacing
`{bs4Dash}` internals.
