Changelog
Source:NEWS.md
shinyglass 0.4.0
CRAN release: 2026-09-21
New features
-
glass_theme(plot_surface = "opaque")densifies plot, plotly, gt, and DT hosts (~94% panel fill, readable ink) while chrome stays Liquid Glass. Default"clear"keeps wallpaper show-through. Toggle live withglass_plot_surface_input(),update_glass_theme(plot_surface = ),window.shinyglass.setPlotSurface(), or.glass-plot-surface-opaque.theme_glass(),plotly_glass(), andgt_theme_glass()acceptsurface = "opaque".dt_options_glass()is an optional DT helper. - Named wallpaper scenes
aurora,harbor, andgrovejointahoe/dusk/mesh.glass_scenes()/glass_scene_input()list and switch them. Userwallpaper=photos are blurred and washed (--glass-wallpaper-wash) so body ink stays above the contrast floor (4.5:1 text / 3:1 large chrome). - Flatten mode for print, PDF, chromote, and screenshots:
glass_flatten(),glass_theme(flatten = ),update_glass_theme(),window.shinyglass.setFlatten()/.enterFlatten()/.exitFlatten(), and?glass_flatten=1.@media printdoes the same automatically. - Public
--glass-*tokens:glass_css_tokens(),glass_token_pack(),glass_add_tokens(),glass_theme(tokens = ), andupdate_glass_theme(tokens = )/window.shinyglass.setTokens().
Improvements
- Closer to shipping iOS 27 Liquid Glass: darker outer lip / side stroke and a slightly stronger border, brighter rim and specular, unchanged fill alphas and default intensity (
0.45). Dark bslib sidebars keep rim/lip/side-stroke edges instead of a shadow-only look. - Stronger scroll-edge toolbar (
body.glass-scroll-edge) when content sits under floating nav. Contrast-only: stays on underprefers-reduced-motion;prefers-reduced-transparencystill forces Tinted. - Deeper bslib Liquid Glass for
page_navbar/ navsets, nested cards and value boxes, sidebars, accordion, tooltips/popovers, and modals. Focus-visible rings and overlay stacking (tooltip 1090, popover 1085, menus 1080) apply to everyglass_theme()app. - Layout polish: page-level horizontal overflow is clipped so wide DT / gt / plotly hosts scroll inside the card; DT tables use fixed layout and wrapping headers at ~1280px; theme switches hide stale ggplot ink and snap plotly axis text to the live pack.
- Overlay menus escape glass containment: shinyWidgets Virtual Select defaults to a body portal (
zIndex = 1080) unless the app sets those options. - Narrow (≤480px) CSS for stacked controls, wrapping nav, full-width value boxes, and core demo containment.
- In-app intensity control is documented as the web stand-in for iOS 27 Settings → Appearance → Liquid Glass (browsers cannot read the OS slider).
- Experimental Python package (not in the CRAN tarball) now takes intensity,
plot_surface, scenes, flatten, persist, and JS knobs onglass_theme().
Bug fixes
-
glass_theme()no longer errors whensceneis the default name vector (R 4.4+&&length check) or a subset of scene names. - User
tokens=stay distinct from the compiled Sass pack (empty overrides no longer injectglass_bgas a public CSS token).
shinyglass 0.3.0
CRAN release: 2026-09-09
New features
- Remember glass:
glass_theme(persist = TRUE)stores preset, intensity, accent, material, and scene inlocalStorageper app path. -
theme_glass(),plotly_glass(), andgt_theme_glass()match plot and table ink to the resolved light/dark pack.glass_plot_colors()exposes the palette. - iOS-style
glass_accent_input()wells (blue / purple / pink / orange / green / teal). Named colors likeprimary = "purple"are accepted. -
glass_page()/observe_glass()assemble theme + toggle + intensity + accent in one call. Persistence defaults to on. - Named wallpaper scenes (
tahoe,dusk,mesh) and optional photowallpaper =.update_glass_theme()can changematerial,ambient_motion, andscenelive. -
glass_theme(ambient_motion = FALSE)disables decorative ambient animation independently of pointer highlights and navbar motion.
Improvements
- Golden Gate material: 90° top highlight, light top/bottom strokes with darker side edges, richer wallpaper orbs, and denser chrome when content scrolls underneath.
- High-contrast (
prefers-contrast: more) and Windows forced-colors surfaces. Reduced-motion and reduced-transparency follow the OS live. - Intensity sliders validate bounds and steps; multiple controls synchronize, including dynamically inserted and module-namespaced inputs.
- Visible focus rings and slider value announcements when the label is hidden.
- Faster client updates: inspect changed DOM subtrees, coalesce widget styling, cache unchanged image tint samples, skip unrelated text outputs, and cap pointer highlights at one per frame.
Bug fixes
- Olympics subtitle no longer shows raw HTML; favicon points at the shipped
rings.jpg. - Auto mode tracks OS theme from the first paint; dynamically inserted intensity sliders bind correctly.
-
theme_glass()uses grid-safe colors (ggplot2 cannot paint CSSrgba()).
shinyglass 0.2.0
CRAN release: 2026-08-21
Breaking changes
- Light and dark glass surfaces are now dual CSS custom-property packs on
[data-glass-preset]. Switching preset no longer requires recompiling Sass or reloading the page. Apps that overrode Sass-only$glass-*tokens should target--glass-*CSS variables (or[data-glass-preset="dark"]) instead. -
glass_theme()always builds on the Bootstrap 5 base theme (not Bootswatchdarklyfor dark). Dark appearance comes from the CSS variable pack so light↔︎dark can toggle live. Visuals should match 0.1.x closely; if you relied on darkly-specific chrome outside glass surfaces, re-check dark mode. - Private escape hatch
window.__shinyglassDisableTintstill works, but the supported API isglass_theme(tint = FALSE)/update_glass_theme(tint = …).
New features
Light / Dark / Auto is an iOS-style segmented control: theme-aware glass thumb (changes in light vs dark), body ink on every chip, and a delegated click so Auto applies even when host pages rewrite inline handlers.
Theme toggle applies the preset once (no inline handler + server echo storm), so plots no longer flicker when switching Light / Dark.
Default
actionButton()/.btn-linkink follows theme tokens (--glass-body-color/--glass-accent) instead of compiled$primary.[glass_resolved_preset()] reports the resolved light/dark appearance so plots do not stay light-inked when the user picks Auto.
Dark pack no longer re-locks default / outline / download labels to compiled
$primary. Download links and ghost focus rings follow--glass-accent. Accent<select id="accent">appliessetPrimaryimmediately.[glass_intensity_slider()] / [observe_glass_intensity()] — iOS 27-style Ultra Clear → Tinted control.
glass_theme(intensity = )sets the starting value (0–1, default0.45); [update_glass_theme()] andwindow.shinyglass.setIntensity()update it live.[glass_preset_input()] / [observe_glass_preset_input()] — client-first Light/Dark/Auto select (applies
setPresetimmediately; server sync is optional). Prefer this over a bareselectInput()+update_glass_theme()alone on hosts that rewrite custom messages.Theme delivery is dual-channel (
shinyglass+ legacyglassPreset) with a self-healingoncustommessageproxy so preset/intensity/showModal survive host message rewrites (e.g. shinyapps.io).Demo app
intensity-slider-demo.R; live shinyglass-demo and shinyglass-dashboard shipglass_intensity_slider()in the UI.iOS 27 material polish: stronger darkened edges, brighter specular highlights, intensity-scaled fill/blur for clearer layer separation and readability.
Dark-mode nav tab ink keeps WCAG UI 3:1 on glass (inactive tabs).
Closer iOS 27 Liquid Glass: defined borders (not shadow-only), chromatic edge refraction cues, lighter dark-mode glass, thicker elevated chrome, ambient specular drift + pointer override, stronger diffusion blur defaults (
blur = 36,saturation = 200).Runtime light/dark switching via
document.documentElement.dataset.glassPresetwithout a full reload.glass_theme(preset = "auto")followsprefers-color-schemeand updates when the OS theme changes.[update_glass_theme()] to change
preset,tint, andprimary(live accent via--glass-accent/--bs-primary) from the server. Recolors primary buttons, ShinycheckboxInput()/ radios / switches, ion.rangeSlider bars, value chips, and active nav/list items without a Sass recompile.[glass_theme_toggle()] / [observe_glass_theme_toggle()] drop-in Light / Dark / Auto buttons.
Behavior knobs on [glass_theme()]:
tint,specular, andnav_morph(all defaultTRUE, matching 0.1.x JS behavior).Client helpers:
window.shinyglass.setPreset()/.getPreset()/.setTint()/.setPrimary()/.getPrimary().
Improvements
Liquid Glass material fidelity (Tahoe / iOS 26 inspired): multi-layer surfaces (illumination fill, dual-edge rim/lip, ambient + pointer specular), chrome vs content hierarchy (less glass-on-glass), softer wallpaper orbs, larger concentric radii, capsule-leaning controls.
New
glass_theme(material = "regular"|"clear"). Clear is more transparent for media-rich layouts. Defaults:blur = 36,radius = "1.5rem",saturation = 200.Value boxes are tinted glass (theme-color wash + body ink), not solid
.bg-*slabs. Plots and DT/gt hosts inside cards drop the extra glass frame so page orbs show through (renderPlot(bg = "transparent")in bundled demos).DataTables / Bootstrap pagination chips: style the visible
.page-linksurface (DT uses<li.paginate_button><a.page-link>). Fixes solid black page numbers and light-grey ellipsis chips in dark mode on the dashboard demo / README screenshots.Overlay chrome (datepicker popup, Shiny notification types, generic accordion, Bootstrap tooltip/popover/toast,
.btn-close, file Browse chip) now uses the glass menu pack so dark mode is not leftover Bootstrap light hex. Datepicker is hoisted todocument.body(Shiny 1.14bsDatepicker) so card/navbarbackdrop-filterno longer clips the calendar. Navbar overflow is visible sonav_menudropdowns escape the glass bar. Kitchen-sink example:chrome-kitchen-sink.R(page_navbar,nav_menu,showModal(), all fourshowNotification()types).Visual QA harness:
inst/scripts/audit-glass-contrast.R(+.js) runs a dual-theme computed-style audit (low contrast, solid-black chips, Bootstrap light greys in dark, dark ink on accent, DT pagination structure) across demo / dashboard / inputs-gallery / chrome kitchen-sink. Opens datepicker, navbar menu, notifications, accordion, tooltip/popover, and server modal before sampling. Checklist and definition of done ininst/scripts/VISUAL-QA.md.Selectize fields: force body/menu ink on inputs and multi-select tags (selectize default near-black item text failed dark mode); opaque
--glass-menu-bgfills in dark; dropdown options use menu colors.Ecosystem chrome: plotly modebar + frame, gt tables, waiter / shinybusy overlays, shinyalert/SweetAlert2 popups, denser shinydashboardPlus controlbar/dropdowns/user menu, light rhandsontable / echarts/highcharter hosts. Examples:
plotly-gt-demo.R,shinydashboardPlus-glass-demo.R.Live demo shinyglass-plotly-gt; README light/dark screenshots for plotly+gt.
CI workflow
visual-qa(testthat + dual-theme contrast audit) and committedinst/scripts/audit-baseline.json.Navbar brand / page title ink uses
--glass-body-color(no more white brand on light glass). Plotly hosts no longer clip x-axis titles.Active-on-accent contrast: lower Bootstrap
$min-contrast-ratioto 3 socolor-contrast()picks white on brand blues/purples (white on#007AFFis ~4.02:1 and failed the old 4.5 gate). Solid.bg-*/.text-bg-*fills (includingbslib::value_box(theme=)) get luminance-based ink viaglass-on()/--glass-on-*— not body color on solid primary. Safety nets remain for checks, radios, switches, pagination, and list-group active.Accent rules target Shiny markup (
.shiny-input-checkbox) as well as Bootstrap.form-check-input.Plot / image outputs get a softer glass frame (lighter nesting inside cards).
prefers-reduced-motion: reducedisables nav morph, specular, tint sampling, and decorative transitions (JS + CSS).Demo and bslib dashboard examples: theme toggle helper; dashboard accent select calls
update_glass_theme(primary = …).Vignettes cover migration, primary updates, toggle helper, and reduced motion.
Unit tests cover dual CSS packs, head script knobs, active-color vars, and
update_glass_theme()messaging.
shinyglass 0.1.1
CRAN release: 2026-08-02
- Fix:
bslib::sidebar()/page_sidebar()layout no longer collapses to a full-width stack. Glass floating-sidebar rules now win over bslib’s laterposition/widthcascade, and open sidebars reserve space in main so value boxes and cards stay fully visible beside the chrome (not under it). - Fix: nested
layout_sidebar()no longer double-floats. Inner sidebars keep glass styling but use bslib’s in-flow grid so content is not pushed into a large empty gutter beside a second absolute panel. - Improve: AdminLTE chrome (classic
shinydashboardandbs4Dash) gets stronger glass overlay — translucent header/sidebar, soft-tinted value/info boxes, and clearer menu active states — without breaking AdminLTE layout.
shinyglass 0.1.0
CRAN release: 2026-07-28
- Initial release.
-
glass_theme()returns a bslib theme with Liquid Glass styling for shiny apps: translucent surfaces, backdrop blur, soft depth, and system typography. - Light and dark presets, with options for accent color, blur, saturation, and corner radius.
- Works with
fluidPage(),navbarPage(),bslib::page_sidebar(), and other page functions that accept a bslib theme. Pass the theme viatheme = glass_theme(), or for teal apps viaoptions(teal.bs_theme = glass_theme()). - Styles common Bootstrap and Shiny surfaces (cards, navbars, sidebars, inputs, tables, plots, modals) and holds up on denser UIs such as leaflet maps, DT, shinyWidgets, bs4Dash, and teal filter panels.