3 hours ago
ionic-framework

v9.0.2

9.0.2 (2026-09-02)

Bug Fixes

4 hours ago
rari
6 hours ago
ui

shadcn@4.20.1

Patch Changes

6 hours ago
quasar

quasar-v2.29.0

[!IMPORTANT] One behavior change worth checking before you upgrade:

  • A @click listener on QItem or QChip now implies clickable. The clickable prop became tri-state (default null): when you do not set it, the presence of a click listener decides. An explicit value still wins, so :clickable="cond" and clickable="false" are untouched. Markup that carried a previously dead click listener now gains the hover styling, focusability, the derived button/menuitem role and starts firing its handler.

New

  • feat(QItem/QChip): a click listener implies clickable when the prop is not set -> both components only emitted click from the handler they bind while clickable, so a @click on an item or chip without that prop was dead code. See the note at the top (#16731)
  • feat(Lang): getClosestIsoName() maps a locale to the nearest language pack -> language packs carry a region subtag only when a language ships more than one translation, so a browser locale like es-MX or sr-Cyrl-RS has no pack of its own and every app hand-maintained a locale-to-pack map. Lang.getClosestIsoName(locale, isoNames) (also on $q.lang) picks the closest of the packs your app ships: exact match, then the RFC 4647 lookup chain with the script outranking the region (sr-Cyrl-RS reads sr-Cyrl, zh-Hant-TW reads zh-TW), then the CLDR likely subtags (zh reads zh-CN, pt reads pt-BR, de-AT reads de-DE over de-CH). Malformed entries are skipped, so a lang/*.js glob's deprecated files do no harm, and getLocale() can be passed straight in. The docs' dynamic boot-file recipe now uses it (#12174)

Fixes

  • fix(QMenu/QTooltip): keep the natural width when flipped away from the far viewport edge -> since v2.28.0 a popup whose anchor sits near the right viewport edge collapsed to its min-content width (one or two words per line) while flipping to the roomier side, because both engines measured it with the intended placement's inset already live and then froze that squeezed width as the cap. Firefox and Safari were affected too, contrary to the report. A popup that fits its mirrored side is also no longer capped at its own rounded-down width, which used to wrap the last word after a flip (#18533)
  • fix(QMenu/QTooltip): keep the popup's scroll position when the placement is re-checked -> the boundary pass lifts the popup's max-height/max-width to measure its natural size, which makes it briefly non-scrollable and lets the browser clamp its scroll offset to 0, with nothing putting it back. QSelect re-checks the placement on every re-render, so a flipped and capped options list jumped back to the top on pointer move. A v2.28.0 regression, on both engines (#18534)
  • fix(QMenu/QTooltip): flip towards the side with more room, and keep the requested side on a tie -> the boundary pass compared the requested placement's anchor line against the viewport middle, so a popup taller than the available space could flip to the SMALLER side, and a trigger centered on the screen always flipped away from the requested placement. Each of the axis' two placements is now measured from its own anchor line; both axes and both engines are covered (#16443)
  • fix(QField): keep the field focused while a menu or dialog opened from inside it is showing -> a QMenu or QDialog rendered inside a field's control (the QDate/QTime/QColor in a QPopupProxy pattern, an autocomplete menu, ...) blurred the active element on open, so the field dropped its focused state, emitted blur and ran lazy validation (an empty date input went red just for opening the picker). QMenu and QDialog dispatch bubbling popup-show/popup-hide DOM events again, the way Quasar v1 did, and QField holds its focused state, styling and lazy validation until the popup hides. Hover-shown menus and tooltips take no focus and stay silent (#9779)
  • fix(QDialog): keep the dialog inside the visual viewport while the iOS soft keyboard is open -> iOS never shrinks the layout viewport a position: fixed dialog is attached to, and it reveals the focused field only for a user-initiated focus, so a field focused programmatically (autofocus or a .focus() call) opened the keyboard with a bottom-anchored dialog left entirely underneath it. QDialog now tracks the visual viewport while shown on iOS and insets its inner element to it. Verified on the iPhone 17 Pro simulator (#17594)
  • fix(QDialog): size dialogs by the dynamic viewport instead of guessing the mobile toolbar height -> a flat 108px was subtracted from the card's max-height on iOS and web Android to keep it inside the toolbar-visible viewport, wasting 60px whenever the toolbar was already collapsed and always in native iOS apps, which have no toolbar at all. The card sizes itself by 100dvh now and the platform override is gone
  • fix(QDialog): let top/bottom anchored dialogs reach the screen edge under safe-area padding -> in native mode the safe-area rule padded the dialog on both ends and beat the position modifier, so a bottom (or top) anchored dialog, QBottomSheet included, stopped one inset short of the edge with the backdrop showing through the gap; the same appeared in edge-to-edge Android apps. The inset moves onto the dialog's child, so its background runs under the home indicator while the content stays clear of it (#17977)
  • fix(QTabs): keep the justify stretch when fractional tabs fill the container -> the tabs were summed through offsetWidth, which rounds each one up, so three justified tabs in a 440px container summed to 441, scrollable flipped on, the tabs collapsed to their natural width and nothing re-measured. It repeated at every third pixel of width, which is the on/off alternation of the report. Tabs are now measured with getBoundingClientRect() and an overflow of a pixel or less is never treated as scrollable (#18532)
  • fix(QVirtualScroll): measure the items without rounding so fractional sizes don't shift the content -> a dense QTable row lays out at 28.5px but was measured through offsetHeight as 29, so the paddings standing in for the items outside the slice put the content half a pixel per item off on every re-slice and the rows visibly jittered while scrolling, worse the deeper into the list. Both directions measure through getBoundingClientRect() now (#15754)
  • fix(QDrawer): measure a standard layout by the window width so the breakpoint ignores the page scrollbar -> QLayout's total width added the native scrollbar width unconditionally, which is right only while a page scrollbar is showing, so on Windows and Linux desktops the drawer switched to mobile mode at 1006px instead of 1023px and disagreed with $q.screen and the CSS breakpoints. A standard layout now reports $q.screen.width; containerized layouts are unchanged (#15506)
  • fix(QDrawer): release the body scroll lock when a mobile-opened drawer turns desktop -> a drawer opened below the breakpoint and then pushed above it rendered as a standard desktop drawer while the page stayed locked (#16651)
  • fix(QChip/QPullToRefresh/QIntersection): don't remount the content when disable is toggled -> all three baked !disable into the root vnode key, so flipping the prop destroyed and rebuilt the whole subtree instead of leaving the content as it was. Disabling now travels through the directive value. One related change: with QIntersection's once, an observer that has already fired is no longer re-armed by toggling disable off and on, which was a side effect of the remount and contradicted once (#12668, #18531)
  • fix(ui): stop WebKit from scrolling the panel wrapper when a field is focused mid-transition -> an autofocused QInput inside an animated QStepper/QTabPanels/QCarousel panel made WebKit reveal the caret and scroll the panel wrapper, so both panels slid displaced and snapped back when the transform ended. The wrapper uses overflow: clip, which is not a scroll container; layout is unchanged (#17464)
  • fix(ui): throw an actionable error when the SSR server build is installed without an ssrContext -> Node (and Vitest) resolve quasar through the node export condition to the SSR build, so a test setup that does not go through @quasar/vite-plugin installed it and crashed with "Cannot convert undefined or null to object". The error now explains what happened and how to fix it, and the Vite plugin docs gained a "Testing with Vitest" section (#15469)

Donations

Quasar Framework is an open-source MIT-licensed project made possible due to the generous contributions by sponsors and backers. If Quasar is useful in your workflow and you want to support ongoing maintenance, please consider the following:

8 hours ago
hls.js

v1.7.2

Summary

HLS.js v1.7.2 includes bug fixes and improvements over the last release.

Changes Since The Last Release

https://github.com/video-dev/hls.js/compare/v1.7.1...v1.7.2

  • Bundle externals in TypeScript type definitions (#8019) @robwalch
  • Fix capLevelToPlayerSize with stable player size (#8011)
  • Prevent duration collapse on seek to gap at end-of-stream (#8027)
  • Fix blocking reload for MSN 0 (#8013) @darfink
  • Process empty WebVTT parts with MAP segments (#8012)
  • Fix IMSC1 millisecond parsing (#8003) @luantaraschi
  • Fix default the TTML tick rate for IMSC1 subtitles (#8024)
  • Fix HLS Variable Substitution after a Media Playlist parsing error (#7992) @luantaraschi
  • Docs: add inspect.software health badge (#7989) @Nayjest

Demo Page

https://e06ac3e1.hls-js-dev.pages.dev/demo/

Feedback

Please provide feedback via Issues in GitHub. For more details on how to contribute to HLS.js, see our CONTRIBUTING guide.

10 hours ago
ui

shadcn@4.20.0

Minor Changes