Mobile chrome and live surfaces, plus the reliability pass from the logic review. The application shell gains a bottom tab bar, drawers gain a bottom-sheet placement, and any region can now keep itself fresh from a host endpoint. On top of that, this release fixes 15 issues. Public names stay the same. Every change is additive, except the behavior notes listed at the end.
- Live surfaces keep regions fresh. A
data-smart-liveelement (or the universal surface propertylive) fetches a host endpoint on an interval and applies the response as trusted markup — the same contract asupdate({ html: true }): inserted, never sanitized, and components in the fragment re-hydrate. The endpoint must return a fragment the host trusts; for user-authored content, use agent surfaces or rich text instead. Polling is the default;data-smart-live-transport="sse"uses anEventSourceand falls back to polling if the stream fails — and becauseEventSourcecannot send custom headers, SSE endpoints authenticate with same-origin cookies or a query token rather than the poll path’sX-Requested-Withheader. Fast SSE bursts coalesce to the newest payload. Refreshing pauses while the tab is hidden, the region scrolls offscreen, or the browser is offline — and returning to view refreshes at once. Failures back off up to 8× the interval and mark the region.is-live-stale.data-smart-live-indicatorrenders a small status chip;data-smart-live-updatedcarries the ISO time of the last refresh. Events:smart:live-update,smart:live-error. Programmatic twin:SmartWebUI.observeLive(target, { url, interval, transport, indicator })returns{ refresh, stop }. The endpoint belongs to the host — the library owns only the fetch rhythm and the insertion contract. - The shell gains a mobile tab bar. An
AppShellaccepts up to sixtabs[]({ label, href, icon, current, badge }), rendered as a bottom navigation rail below 50rem with safe-area padding and an optional badge slot; the desktop shell is unchanged. Tab entries usearia-current="page". - Drawers can be bottom sheets.
Drawer placement: "sheet"(or the.smart-drawer--sheetclass) docks the dialog to the bottom edge, capped below the notch, with a drag-to-dismiss grip. The grip is a pointer-only extra — Escape and the close button remain the keyboard path. - Safe areas are tokens.
--smart-safe-area-top/right/bottom/leftwrapenv()with zero fallbacks; the tab bar and sheet consume them, and hosts can reach the same values anywhere. - Focus rings follow the keyboard. This corrects the 1.5.5 note. A mouse click no longer draws a ring on a menu item, select option, date day, or time option that stays open. The ring appears after a key press inside an open popover.
- Hydration starts on load. A script loaded after
DOMContentLoadedhas fired now hydrates its page. Before this fix, the page stayed inert until a manualSmartWebUI.hydrate()call. - Date events carry a mode.
smart:datereports{ mode: "single", value }.smart:date-rangereports{ mode: "range", start, end }. A completed range dispatchesinputandchangeon the start and end inputs, so form listeners see the whole range. - Banner close is documented.
smart:bannerclosenow has the hyphenated aliassmart:banner-close, and both are declared insmartwebui.d.ts. - Every change event says where it came from.
smart:changepayloads carrycomponent:"richtext","menu", or"agent". - Rich text removes unsafe elements with their contents.
script,style,iframe,object,embed,template, andnoscriptare dropped. Their text no longer stays visible. - Trusted HTML gets a warning.
SmartWebUI.update()with{ html: true }logs a console warning when the markup has a script, iframe, object, embed, inlineon*handler, orjavascript:URL. The content is still inserted as given, so use it for trusted markup only. - Coarse-pointer tap areas never overlap. The 44px area on menu rows, icon buttons, tree toggles, and carousel toggles is split between neighbours. The runtime writes
--smart-hit-slop-xand--smart-hit-slop-yon coarse pointers and rebalances on resize. - Busy indicators pulse under reduced motion. Spinners, load-more, pull-to-refresh, and map loading keep a slow opacity pulse instead of rotating or shimmering.
- Accessibility preferences win by layer order. Reduced transparency, higher contrast, and forced colors live in a
smart.preferenceslayer that is declared last. The!importantflags were removed from those rules. Your own unlayered CSS still overrides them. - Overlays and runtime values are tokens. Media badges, carousel captions, and the lightbox read
--smart-on-media*,--smart-media-scrim,--smart-media-fade, and--smart-lightbox-backdrop. Runtime values such as range fill, tab position, lightbox transform, and liquid highlight position have defaults in:root. - One agent namespace.
window.SmartWebUI.agentgroups the agent API. The flat names stay. - Double loads are ignored. A second copy of the core or agent script returns and listeners are no longer registered twice. A second copy of a different version also warns in the console.
- Types match the runtime.
smartwebui.d.tsdeclares the date modes, thecomponentfield, the agent namespace, and every dispatchedsmart:event, including the aliases. - Updated Figma and Blocks libraries Full sync of the new capabilities and components.