color-mix() usage from the shipped stylesheet. Select widget
alpha colors are now precomputed as CSS custom properties at render time for
better compatibility with older embedded browsers.glassSelect() and
glassMultiSelect(), with JavaScript keeping aria-expanded and
aria-selected in sync during interaction.glasstabs.csp_nonce option.forced-colors) CSS support and RTL layout
support for tabs and select widgets.glassTabsUI() inserted by renderUI() or
dashboard layouts after the initial page boot.glassTabCondition(id, value) — generates the correct JavaScript
condition string for [shiny::conditionalPanel()] without needing to remember
the input[["id-active_tab"]] key pattern.glasstabs_news() — prints the package changelog to the R console.ROADMAP.md tracking planned features and known limitations (not
shipped in the package).glass_tab_theme() and glass_select_theme() now have full @examples
with interactive app snippets..gt-container no longer forces max-width:960px or margin:48px auto —
the widget now behaves like a normal block element inside Shiny layouts.--gt-halo-shadow CSS variable, replacing the harsh dark drop shadow.runGlassExample() to launch any of the built-in example apps
directly from the R console (runGlassExample("smoke-test"), etc.).icon argument to glassTabPanel() — accepts any htmltools-compatible
tag (e.g. shiny::icon("table")). Renders with gt-tab-icon / gt-tab-label
spans so icon and text can be styled independently.disableGlassTab() and enableGlassTab() — gray out a tab without
hiding it. Completes the visibility/disabled/removal trio alongside
showGlassTab() / hideGlassTab().updateGlassTabBadge() — set a numeric count badge on any tab button.
Pass count = 0 or count = NA to hide the badge. Values above 99 display
as "99+".glassTabsServer() now integrates with Shiny's URL bookmarking: the active
tab is automatically saved and restored when enableBookmarking = "url" is
set on the app. Opt out per widget with bookmark = FALSE.glassTabsOutput() / renderGlassTabs() for server-driven tab
rendering. The JavaScript engine re-initialises automatically after each
render via a scoped shiny:value listener, so no manual glasstabs_reinit
calls are needed.glassTabsUI() now errors early on duplicate glassTabPanel() values,
reporting the offending value(s) by name.glassTabsUI() gains a compact = FALSE argument. Setting compact = TRUE
applies the .gt-compact CSS modifier which reduces margins, tab-link padding,
font size, and content area padding — ideal for embedding inside bs4Dash cards
or any tight dashboard layout.glassTabsServer() emits a warning() when the id argument contains "-",
which is the most common sign that ns("tabs") was passed instead of the bare
"tabs" id. The warning includes corrective guidance..gt-tab-disabled, .gt-tab-icon, .gt-tab-label, and
.gt-tab-badge rules. Badges adapt their background to the active halo colour
via the existing CSS custom property.var(--gt-xxx, fallback) instead
of being hardcoded — this was the root cause of light theme appearing invisible.
Light theme defaults were also strengthened for better contrast.shiny:value listener limits bootAll re-initialisation to outputs that
actually contain glasstabs elements, so ordinary Shiny outputs are unaffected.inst/cheatsheet/glasstabs-cheatsheet.tex — a printable four-column
LaTeX reference card covering the full API, module pattern, bs4Dash integration,
theming, and common gotchas.vignettes/cheatsheet.Rmd) extended with new sections:
"Tabs inside a Shiny module", "Dynamic tab values and selected",
"Tabs inside bs4Dash", and updated common gotchas.@examples, and cross-links.updateGlassTabsUI() for programmatic tab switching from the server.showGlassTab() and hideGlassTab() for dynamically showing and
hiding tabs at runtime.appendGlassTab() and removeGlassTab() for adding and removing tabs
at runtime.glassTabsUI() now validates selected against the available
glassTabPanel() values and errors early on invalid tab ids.glassTabsServer() is populated on first render.Opening a dropdown now closes any other open glasstabs dropdown, fixing a visual stacking issue where multiple dropdowns appeared simultaneously.
Improved widget lifecycle in dynamic UI (renderUI(), conditionalPanel()).
Widgets initialize more reliably and clean up properly when removed.
Widgets now emit their initial value to Shiny immediately after rendering,
fixing timing issues with conditionalPanel() and dynamic UI.
JavaScript engine refactored to use internal state instead of DOM scanning. No changes to the R API — all existing code works without modification.
Added scroll containers for long option lists, debounced search, and
.gt-loading / .gt-disabled CSS utility classes.
glassSelect(), an animated single-select dropdown for Shiny.updateGlassSelect() for server-side updates to choices and selection.glassSelectValue() as a convenience reactive helper for reading the selected value.updateGlassMultiSelect() for server-side updates to choices, selection, and checkbox style.glassMultiSelectValue() as a convenience reactive helper for reading selected values and active style.label support to glassMultiSelect().all_label support to control the trigger text shown when all choices are selected.glassSelect() and glassMultiSelect() more closely with standard Shiny input behavior.session$sendInputMessage() update patterns.glassMultiSelect() default behavior where selected = NULL initializes all choices as selected."filled" multi-select style.glassSelect().glassSelect().updateGlassMultiSelect() and glassMultiSelectValue().glassSelect(), updateGlassSelect(), and glassSelectValue().glassMultiSelect() server-side updates and helper utilities.Initial release.
glassTabsUI() — animated glassmorphism-style tab navigation with a sliding
glass halo and transfer trace between tabs.glassTabPanel() — defines a single tab button and its content pane.glassTabsServer() — reactive helper that tracks the active tab value.glass_tab_theme() — custom color theme for glassTabsUI() with eight
independent handles: tab_text, tab_active_text, halo_bg,
halo_border, content_bg, content_border, card_bg, card_text."dark" (default) and "light" presets for glassTabsUI().bs4Dash compatibility via wrap = FALSE.glassMultiSelect() — dropdown filter with live search,
select-all with indeterminate state, and three checkbox indicator styles:
"checkbox", "check-only", and "filled".glassFilterTags() — tag-pill display area that stays in sync with a
glassMultiSelect() automatically via JavaScript; clicking × on a pill
deselects that option.glass_select_theme() — custom color theme with four handles: bg_color,
border_color, text_color, accent_color."dark" and "light" presets for glassMultiSelect().show_style_switcher, show_select_all, show_clear_all flags to hide
UI chrome (all default TRUE)."filled" style via the hues argument
(auto-assigned if omitted).useGlassTabs() — injects CSS and JavaScript via
htmltools::htmlDependency, which is deduplicated automatically by Shiny.color-mix()), ensuring
compatibility with Shiny's embedded browser.id.