# glasstabs Cheatsheet

## One rule

Call `useGlassTabs()` once somewhere in your UI before using any widget.

    ui <- fluidPage(
      useGlassTabs(),
      # widgets go here
    )

## Tabs: basic pattern

    ui <- fluidPage(
      useGlassTabs(),
      glassTabsUI(
        "main",
        glassTabPanel("overview", "Overview", selected = TRUE, h3("Overview")),
        glassTabPanel("details", "Details", h3("Details"))
      )
    )

    server <- function(input, output, session) {
      active_tab <- glassTabsServer("main")
    }

## Tabs: server actions

    # Switch active tab
    updateGlassTabsUI(session, "main", "details")

    # Hide or show a tab
    hideGlassTab(session, "main", "admin")
    showGlassTab(session, "main", "admin")

    # Append or remove a tab at runtime
    appendGlassTab(
      session, "main",
      glassTabPanel("compare", "Compare", h3("Compare")),
      select = TRUE
    )
    removeGlassTab(session, "main", "compare")

## Tabs: common options

    glassTabsUI(
      "main",
      glassTabPanel("a", "A", selected = TRUE, p("A")),
      glassTabPanel("b", "B", p("B")),
      selected = "a",
      wrap = TRUE,
      extra_ui = tags$div("Right side UI"),
      theme = "light"
    )

## Multi-select: basic pattern

    choices <- c(Revenue = "revenue", Orders = "orders", Returns = "returns")

    ui <- fluidPage(
      useGlassTabs(),
      glassMultiSelect("metric", choices),
      glassFilterTags("metric")
    )

    server <- function(input, output, session) {
      metric <- glassMultiSelectValue(input, "metric")
    }

## Multi-select: update from server

    updateGlassMultiSelect(
      session,
      "metric",
      selected = c("revenue", "orders"),
      check_style = "filled"
    )

    # Clear selection
    updateGlassMultiSelect(session, "metric", selected = character(0))

## Multi-select: useful arguments

    glassMultiSelect(
      "metric",
      choices,
      selected = unname(choices),
      label = "Metrics",
      placeholder = "Choose metrics",
      all_label = "All metrics",
      check_style = "checkbox",
      show_style_switcher = TRUE,
      show_select_all = TRUE,
      show_clear_all = TRUE,
      theme = "dark"
    )

## Single-select: basic pattern

    regions <- c("All Regions" = "all", North = "north", South = "south")

    ui <- fluidPage(
      useGlassTabs(),
      glassSelect("region", regions, selected = "all")
    )

    server <- function(input, output, session) {
      region <- glassSelectValue(input, "region")
    }

## Single-select: update from server

    updateGlassSelect(session, "region", selected = "south")

    # Clear value
    updateGlassSelect(session, "region", selected = character(0))

## Single-select: useful arguments

    glassSelect(
      "region",
      regions,
      selected = "all",
      label = "Region",
      placeholder = "Pick a region",
      searchable = TRUE,
      clearable = TRUE,
      include_all = FALSE,
      check_style = "checkbox",
      theme = "light"
    )

## Theme helpers

    # Tabs
    glassTabsUI(
      "main",
      glassTabPanel("a", "A", selected = TRUE, p("A")),
      theme = glass_tab_theme(
        halo_bg = "rgba(251,191,36,0.15)",
        tab_active_text = "#fef3c7"
      )
    )

    # Select widgets
    glassMultiSelect(
      "metric", choices,
      theme = glass_select_theme(
        mode = "dark",
        accent_color = "#38bdf8"
      )
    )

## Input values at a glance

Widget | Server value
--- | ---
`glassTabsUI("main", ...)` | `input[["main-active_tab"]]` or `glassTabsServer("main")()`
`glassMultiSelect("metric", ...)` | `input$metric` or `glassMultiSelectValue(input, "metric")$selected()`
multi-select style | `input$metric_style` or `glassMultiSelectValue(input, "metric")$style()`
`glassSelect("region", ...)` | `input$region` or `glassSelectValue(input, "region")()`

## Common gotchas

- `useGlassTabs()` must be called once in the UI.
- `glassSelectValue()` returns a reactive function, not a list.
- `glassMultiSelectValue()` returns a list with `selected()` and `style()`.
- For `glassMultiSelect()`, `selected` should use choice values, not labels.
- If you add new JS/CSS behavior during development, reinstall or `load_all()` before retesting.